affinity-sdk 2.0.2__tar.gz → 2.0.4__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 (715) hide show
  1. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/CHANGELOG.md +233 -1
  2. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/PKG-INFO +42 -37
  3. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/README.md +41 -36
  4. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/VERSIONING.md +21 -10
  5. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/__init__.py +2 -0
  6. affinity_sdk-2.0.4/affinity/_filtering/__init__.py +5 -0
  7. {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/dates.py +26 -12
  8. {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/filter_text.py +4 -4
  9. {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/pushdown.py +11 -5
  10. affinity_sdk-2.0.4/affinity/_filtering/search.py +305 -0
  11. affinity_sdk-2.0.4/affinity/_filtering/where.py +108 -0
  12. affinity_sdk-2.0.4/affinity/cli/async_utils.py +44 -0
  13. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/company_cmds.py +6 -4
  14. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/config_cmds.py +29 -4
  15. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/field_cmds.py +47 -13
  16. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/file_url_cmd.py +1 -1
  17. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/interaction_cmds.py +3 -1
  18. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/list_cmds.py +216 -45
  19. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/note_cmds.py +3 -1
  20. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/opportunity_cmds.py +4 -2
  21. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/org_cmds.py +75 -1
  22. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/person_cmds.py +6 -4
  23. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/query_cmd.py +192 -121
  24. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/reminder_cmds.py +3 -1
  25. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/confirm.py +32 -6
  26. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/context.py +57 -35
  27. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/entity_search.py +18 -13
  28. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/field_utils.py +62 -17
  29. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/help_json.py +3 -1
  30. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/interaction_utils.py +26 -13
  31. affinity_sdk-2.0.4/affinity/cli/list_search.py +90 -0
  32. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/aggregates.py +54 -15
  33. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/cursor.py +45 -13
  34. affinity_sdk-2.0.4/affinity/cli/query/dates.py +21 -0
  35. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/executor.py +522 -403
  36. affinity_sdk-2.0.4/affinity/cli/query/filter_text.py +5 -0
  37. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/filters.py +3 -2
  38. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/models.py +9 -93
  39. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/output.py +285 -37
  40. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/planner.py +35 -2
  41. affinity_sdk-2.0.4/affinity/cli/query/pushdown.py +12 -0
  42. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/render.py +1 -1
  43. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/client.py +37 -4
  44. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/http.py +50 -9
  45. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/compare.py +60 -7
  46. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/exceptions.py +9 -0
  47. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/entities.py +61 -6
  48. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/org.py +9 -3
  49. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/pagination.py +53 -47
  50. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/types.py +13 -1
  51. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_field_updates.py +12 -4
  52. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_org_reads.py +36 -0
  53. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/companies.py +44 -26
  54. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/lists.py +603 -397
  55. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/opportunities.py +47 -24
  56. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/org.py +193 -3
  57. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/persons.py +32 -18
  58. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/reminders.py +14 -1
  59. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/tasks.py +10 -8
  60. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/v1_only.py +6 -6
  61. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/webhooks.py +14 -1
  62. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/cli-development-guide.md +3 -1
  63. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/commands.md +242 -69
  64. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/index.md +16 -8
  65. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/scripting.md +2 -1
  66. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/examples.md +3 -3
  67. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/glossary.md +6 -6
  68. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/affinity-official-mcp-comparison.md +2 -3
  69. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/api-versions-and-routing.md +13 -8
  70. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/api-versions.md +18 -5
  71. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/authentication.md +16 -7
  72. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/claude-code-plugins.md +10 -4
  73. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/configuration.md +5 -3
  74. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/debugging-hooks.md +3 -0
  75. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/errors-and-retries.md +1 -1
  76. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/field-types-and-values.md +4 -1
  77. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/field-values.md +36 -0
  78. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/filtering.md +11 -6
  79. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/pagination.md +3 -0
  80. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/performance.md +1 -1
  81. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/query-command.md +6 -3
  82. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/sync-vs-async.md +4 -0
  83. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/index.md +16 -2
  84. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/api-coverage.md +3 -1
  85. affinity_sdk-2.0.4/docs/public/reference/services/transcripts.md +3 -0
  86. affinity_sdk-2.0.4/docs/public/reference/services/v1/auth.md +5 -0
  87. affinity_sdk-2.0.4/docs/public/reference/services/v1/field-values.md +8 -0
  88. affinity_sdk-2.0.4/docs/public/reference/services/v1/fields.md +6 -0
  89. affinity_sdk-2.0.4/docs/public/reference/services/v1/interactions.md +7 -0
  90. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/plugin.json +1 -1
  91. affinity_sdk-2.0.4/mcp/.mcp-bash/VERSION +1 -0
  92. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/core.sh +60 -7
  93. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/runtime.sh +4 -1
  94. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/tools.sh +16 -4
  95. affinity_sdk-2.0.4/mcp/.mcp-bash/vendor.json +1 -0
  96. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/commands.generated.json +132 -49
  97. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/mcp-commands.json +11 -7
  98. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/CHANGELOG.md +51 -1
  99. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/COMPATIBILITY +13 -2
  100. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/README.md +11 -9
  101. affinity_sdk-2.0.4/mcp/VERSION +1 -0
  102. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cache.sh +26 -4
  103. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cli-gateway.sh +7 -5
  104. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/common.sh +23 -52
  105. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcp-bash.lock +2 -2
  106. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/data-model/data-model.md +7 -7
  107. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/env.sh +3 -2
  108. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/requirements.json +1 -1
  109. affinity_sdk-2.0.4/mcp/server.d/server.meta.json +12 -0
  110. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-read-command/tool.sh +9 -8
  111. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-write-command/tool.sh +41 -22
  112. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/query/tool.meta.json +2 -2
  113. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/query/tool.sh +24 -17
  114. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/xaffinity-mcp.sh +11 -6
  115. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mkdocs.yml +8 -8
  116. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
  117. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +8 -5
  118. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
  119. affinity_sdk-2.0.4/plugins/xaffinity-cli/hooks/guard-env-read.sh +53 -0
  120. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +2 -2
  121. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/session-setup.sh +7 -2
  122. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +5 -5
  123. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +1 -1
  124. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +11 -6
  125. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/pyproject.toml +1 -1
  126. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_company_create_dedup.py +9 -9
  127. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/cassettes/company-lists-status.cassette.json +86 -86
  128. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +63 -63
  129. affinity_sdk-2.0.4/tests/cowork/cassettes/no-key-skill-path.cassette.json +417 -0
  130. affinity_sdk-2.0.4/tests/cowork/cassettes/status-history.cassette.json +492 -0
  131. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_key_resolution.py +95 -15
  132. affinity_sdk-2.0.4/tests/test_cli_commands_must_fix.py +308 -0
  133. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_company_get.py +10 -10
  134. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_context_coverage.py +6 -6
  135. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_ls_server_filter.py +84 -1
  136. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field.py +10 -10
  137. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_error_rendering.py +4 -4
  138. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils.py +29 -29
  139. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_file_url.py +30 -30
  140. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_files_ls.py +16 -16
  141. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_files_read.py +35 -35
  142. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_help_json.py +8 -0
  143. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_interaction_utils.py +29 -13
  144. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_expand_interactions.py +58 -17
  145. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_filter_safety.py +5 -3
  146. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_server_filter.py +16 -2
  147. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_org.py +32 -0
  148. affinity_sdk-2.0.4/tests/test_cli_page_size_validation.py +45 -0
  149. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_executor.py +25 -218
  150. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_expand_interactions.py +5 -3
  151. affinity_sdk-2.0.4/tests/test_cli_query_must_fix.py +1170 -0
  152. affinity_sdk-2.0.4/tests/test_cli_query_review_fixes.py +1167 -0
  153. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_server_filter.py +90 -0
  154. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_resolve_url_parsing.py +4 -4
  155. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_session_setup_hook.py +59 -0
  156. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_unreplied.py +22 -3
  157. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_write_ops.py +9 -9
  158. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_companies_create_dedup.py +18 -18
  159. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_compare.py +35 -0
  160. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_duplicates_connections.py +3 -3
  161. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_exceptions_coverage.py +18 -18
  162. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_files_upload_returning_files.py +18 -18
  163. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_filters.py +10 -0
  164. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_first.py +6 -0
  165. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_interaction_date_validation.py +6 -4
  166. affinity_sdk-2.0.4/tests/test_list_entries_server_filter.py +311 -0
  167. affinity_sdk-2.0.4/tests/test_mcp_must_fix.py +478 -0
  168. affinity_sdk-2.0.4/tests/test_review_fixes_sdk_cli.py +997 -0
  169. affinity_sdk-2.0.4/tests/test_sdk_must_fix.py +655 -0
  170. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_search_v2.py +2 -2
  171. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_lists_additional_coverage.py +6 -6
  172. affinity_sdk-2.0.4/tests/test_services_pages_cursor_guard.py +180 -0
  173. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_teams_users_feedback.py +38 -0
  174. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/unit/test_exceptions.py +8 -8
  175. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage.json +14 -0
  176. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_mcp_command_registry.py +20 -0
  177. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2024-01-01.json +2 -2
  178. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2026-07-15.json +2 -2
  179. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2026-09-17.json +112 -2
  180. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/search_golden.py +45 -5
  181. affinity_sdk-2.0.2/affinity/cli/list_search.py +0 -92
  182. affinity_sdk-2.0.2/docs/public/reference/services/v1/auth.md +0 -3
  183. affinity_sdk-2.0.2/docs/public/reference/services/v1/field-values.md +0 -3
  184. affinity_sdk-2.0.2/docs/public/reference/services/v1/fields.md +0 -3
  185. affinity_sdk-2.0.2/docs/public/reference/services/v1/interactions.md +0 -3
  186. affinity_sdk-2.0.2/mcp/.mcp-bash/VERSION +0 -1
  187. affinity_sdk-2.0.2/mcp/.mcp-bash/vendor.json +0 -1
  188. affinity_sdk-2.0.2/mcp/VERSION +0 -1
  189. affinity_sdk-2.0.2/mcp/server.d/server.meta.json +0 -12
  190. affinity_sdk-2.0.2/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -33
  191. affinity_sdk-2.0.2/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -395
  192. affinity_sdk-2.0.2/tests/cowork/cassettes/status-history.cassette.json +0 -469
  193. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.claude-plugin/marketplace.json +0 -0
  194. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.cursor/rules/test-data-privacy.mdc +0 -0
  195. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.editorconfig +0 -0
  196. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.env.example +0 -0
  197. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.gitattributes +0 -0
  198. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/CODEOWNERS +0 -0
  199. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  200. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  201. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
  202. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
  203. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/dependabot.yml +0 -0
  204. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/labels.yml +0 -0
  205. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/mcp-release-install-footer.md +0 -0
  206. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/pull_request_template.md +0 -0
  207. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/release-install-footer.md +0 -0
  208. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/ci.yml +0 -0
  209. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/cowork-replay.yml +0 -0
  210. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/docs.yml +0 -0
  211. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/labels.yml +0 -0
  212. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/linkcheck.yml +0 -0
  213. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/openapi-validation.yml +0 -0
  214. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/plugin-build.yml +0 -0
  215. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/plugin-release.yml +0 -0
  216. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/release-detect.yml +0 -0
  217. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/release.yml +0 -0
  218. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/version-check.yml +0 -0
  219. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.gitignore +0 -0
  220. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.pre-commit-config.yaml +0 -0
  221. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/AGENTS.md +0 -0
  222. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/CODE_OF_CONDUCT.md +0 -0
  223. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/CONTRIBUTING.md +0 -0
  224. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/LICENSE +0 -0
  225. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/SECURITY.md +0 -0
  226. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/_internal/__init__.py +0 -0
  227. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/_internal/keyfile.py +0 -0
  228. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/api_versions.py +0 -0
  229. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/__init__.py +0 -0
  230. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/__main__.py +0 -0
  231. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/_update_worker.py +0 -0
  232. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/click_compat.py +0 -0
  233. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/__init__.py +0 -0
  234. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_field.py +0 -0
  235. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_dump.py +0 -0
  236. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_read.py +0 -0
  237. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_upload.py +0 -0
  238. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_list_entry_fields.py +0 -0
  239. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_org_reads.py +0 -0
  240. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_search_common.py +0 -0
  241. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_v1_parsing.py +0 -0
  242. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/completion_cmd.py +0 -0
  243. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/discovery_cmds.py +0 -0
  244. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/entry_cmds.py +0 -0
  245. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/file_cmds.py +0 -0
  246. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/org_read_cmds.py +0 -0
  247. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
  248. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/resolve_url_cmd.py +0 -0
  249. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/session_cmds.py +0 -0
  250. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/task_cmds.py +0 -0
  251. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/transcript_cmds.py +0 -0
  252. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/version_cmd.py +0 -0
  253. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/webhook_cmds.py +0 -0
  254. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/whoami_cmd.py +0 -0
  255. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/config.py +0 -0
  256. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/constants.py +0 -0
  257. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/csv_utils.py +0 -0
  258. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/date_utils.py +0 -0
  259. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/decorators.py +0 -0
  260. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/errors.py +0 -0
  261. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/formatters.py +0 -0
  262. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/logging.py +0 -0
  263. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/main.py +0 -0
  264. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/mcp_limits.py +0 -0
  265. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/options.py +0 -0
  266. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/paths.py +0 -0
  267. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/progress.py +0 -0
  268. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/__init__.py +0 -0
  269. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/exceptions.py +0 -0
  270. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/parser.py +0 -0
  271. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/progress.py +0 -0
  272. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/schema.py +0 -0
  273. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/resolve.py +0 -0
  274. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/resolvers.py +0 -0
  275. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/results.py +0 -0
  276. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/runner.py +0 -0
  277. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/serialization.py +0 -0
  278. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/session_cache.py +0 -0
  279. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/types.py +0 -0
  280. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/update_check.py +0 -0
  281. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/__init__.py +0 -0
  282. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/pipeline.py +0 -0
  283. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/criteria.py +0 -0
  284. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/downloads.py +0 -0
  285. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/field_resolve_utils.py +0 -0
  286. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/field_resolver.py +0 -0
  287. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/filters.py +0 -0
  288. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/hooks.py +0 -0
  289. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/inbound_webhooks.py +0 -0
  290. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/__init__.py +0 -0
  291. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/discovery.py +0 -0
  292. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/interactions_v2.py +0 -0
  293. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/rate_limit_snapshot.py +0 -0
  294. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/relationships_v2.py +0 -0
  295. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/search.py +0 -0
  296. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/secondary.py +0 -0
  297. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/transcripts.py +0 -0
  298. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/policies.py +0 -0
  299. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/progress.py +0 -0
  300. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/py.typed +0 -0
  301. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/__init__.py +0 -0
  302. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_discovery.py +0 -0
  303. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_dropdown_options.py +0 -0
  304. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_field_listing.py +0 -0
  305. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_note_html.py +0 -0
  306. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_search.py +0 -0
  307. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_single_field.py +0 -0
  308. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_v2_filters.py +0 -0
  309. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/rate_limits.py +0 -0
  310. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/search.py +0 -0
  311. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/transcripts.py +0 -0
  312. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/types.py +0 -0
  313. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/codecov.yml +0 -0
  314. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/ai-integrations/index.md +0 -0
  315. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/changelog.md +0 -0
  316. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli-reference.md +0 -0
  317. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/getting-started.md +0 -0
  318. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/csv-export.md +0 -0
  319. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/datetime-handling.md +0 -0
  320. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/ids-and-types.md +0 -0
  321. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/migrating-to-2.md +0 -0
  322. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/models.md +0 -0
  323. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/opportunity-associations.md +0 -0
  324. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/rate-limits.md +0 -0
  325. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/webhooks.md +0 -0
  326. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/mcp/index.md +0 -0
  327. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/client.md +0 -0
  328. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/exceptions.md +0 -0
  329. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/filters.md +0 -0
  330. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/models.md +0 -0
  331. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/query-language.md +0 -0
  332. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/companies.md +0 -0
  333. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/lists.md +0 -0
  334. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/opportunities.md +0 -0
  335. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/persons.md +0 -0
  336. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/reminders.md +0 -0
  337. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/tasks.md +0 -0
  338. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/teams-users.md +0 -0
  339. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/files.md +0 -0
  340. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/notes.md +0 -0
  341. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/relationships.md +0 -0
  342. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/webhooks.md +0 -0
  343. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/types.md +0 -0
  344. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/troubleshooting.md +0 -0
  345. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/advanced_usage.py +0 -0
  346. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/async_lifecycle.py +0 -0
  347. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/basic_usage.py +0 -0
  348. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/filter_builder.py +0 -0
  349. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/hooks_debugging.py +0 -0
  350. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/list_management.py +0 -0
  351. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/resolve_helpers.py +0 -0
  352. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/task_polling.py +0 -0
  353. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/.gitignore +0 -0
  354. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
  355. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
  356. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/SKILL.md +0 -0
  357. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +0 -0
  358. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
  359. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
  360. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
  361. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
  362. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.gitignore +0 -0
  363. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/bin/mcp-bash +0 -0
  364. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/completion.sh +0 -0
  365. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
  366. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/logging.sh +0 -0
  367. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/ping.sh +0 -0
  368. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
  369. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/resources.sh +0 -0
  370. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/roots.sh +0 -0
  371. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/tools.sh +0 -0
  372. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/auth.sh +0 -0
  373. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
  374. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
  375. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
  376. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/completion.sh +0 -0
  377. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
  378. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/file_read.sh +0 -0
  379. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
  380. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/hash.sh +0 -0
  381. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ids.sh +0 -0
  382. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/io.sh +0 -0
  383. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/json.sh +0 -0
  384. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/lock.sh +0 -0
  385. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/logging.sh +0 -0
  386. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
  387. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/paginate.sh +0 -0
  388. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/path.sh +0 -0
  389. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/policy.sh +0 -0
  390. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
  391. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/progress.sh +0 -0
  392. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/prompts.sh +0 -0
  393. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/registry.sh +0 -0
  394. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/require.sh +0 -0
  395. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
  396. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
  397. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
  398. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resources.sh +0 -0
  399. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/roots.sh +0 -0
  400. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/rpc.sh +0 -0
  401. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/spec.sh +0 -0
  402. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/timeout.sh +0 -0
  403. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
  404. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
  405. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ui.sh +0 -0
  406. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/uri.sh +0 -0
  407. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/validate.sh +0 -0
  408. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/echo.sh +0 -0
  409. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/file.sh +0 -0
  410. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/git.sh +0 -0
  411. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/https.sh +0 -0
  412. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/ui.sh +0 -0
  413. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
  414. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
  415. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
  416. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/prompts.json +0 -0
  417. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/resource-templates.json +0 -0
  418. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/resources.json +0 -0
  419. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/ui-resources.json +0 -0
  420. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/Makefile +0 -0
  421. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/entity-name.sh +0 -0
  422. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/list-name.sh +0 -0
  423. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/status-value.sh +0 -0
  424. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/docs/DEBUGGING.md +0 -0
  425. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/icon.svg +0 -0
  426. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cli-detect.sh +0 -0
  427. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/entity-types.sh +0 -0
  428. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/field-resolution.sh +0 -0
  429. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcp-publisher.lock +0 -0
  430. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcpb.conf +0 -0
  431. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.completion.sh +0 -0
  432. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.meta.json +0 -0
  433. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.txt +0 -0
  434. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
  435. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
  436. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-call/log-call.meta.json +0 -0
  437. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-call/log-call.txt +0 -0
  438. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
  439. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
  440. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-message/log-message.meta.json +0 -0
  441. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-message/log-message.txt +0 -0
  442. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
  443. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
  444. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
  445. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
  446. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
  447. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
  448. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
  449. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/providers/xaffinity.sh +0 -0
  450. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/data-model/data-model.meta.json +0 -0
  451. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
  452. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
  453. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
  454. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
  455. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me/me.meta.json +0 -0
  456. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me/me.sh +0 -0
  457. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
  458. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me-person-id/me-person-id.sh +0 -0
  459. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/query-guide/query-guide.meta.json +0 -0
  460. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/query-guide/query-guide.sh +0 -0
  461. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/saved-views/saved-views.meta.json +0 -0
  462. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/saved-views/saved-views.sh +0 -0
  463. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
  464. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflow-config/workflow-config.sh +0 -0
  465. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
  466. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
  467. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
  468. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
  469. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
  470. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/health-checks.sh +0 -0
  471. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/policy.sh +0 -0
  472. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.json +0 -0
  473. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/README.md +0 -0
  474. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/run.sh +0 -0
  475. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/test_env_update_check.sh +0 -0
  476. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test-progress.sh +0 -0
  477. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/discover-commands/tool.meta.json +0 -0
  478. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/discover-commands/tool.sh +0 -0
  479. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-read-command/tool.meta.json +0 -0
  480. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-write-command/tool.meta.json +0 -0
  481. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
  482. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-entity-dossier/tool.sh +0 -0
  483. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-file-url/tool.meta.json +0 -0
  484. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-file-url/tool.sh +0 -0
  485. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
  486. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
  487. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/user-config.json +0 -0
  488. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/xaffinity-mcp-env.sh +0 -0
  489. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +0 -0
  490. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
  491. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -0
  492. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
  493. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
  494. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +0 -0
  495. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/query/test_cursor.py +0 -0
  496. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_company_ls_filter_rejection.py +0 -0
  497. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_formatters.py +0 -0
  498. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_output_formats_integration.py +0 -0
  499. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_person_create_dedup.py +0 -0
  500. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_person_ls_filter_rejection.py +0 -0
  501. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_filter_rejection.py +0 -0
  502. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_list_entry_relationships.py +0 -0
  503. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_list_export_parity.py +0 -0
  504. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_output_flattening.py +0 -0
  505. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_output_truncation.py +0 -0
  506. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_unreplied.py +0 -0
  507. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/conftest.py +0 -0
  508. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/.cowork-redact.json +0 -0
  509. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/README.md +0 -0
  510. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
  511. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
  512. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
  513. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/Dockerfile +0 -0
  514. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
  515. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/fixtures.json +0 -0
  516. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/server.py +0 -0
  517. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
  518. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/privacy-allow.txt +0 -0
  519. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/record.sh +0 -0
  520. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
  521. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
  522. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
  523. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/status-history.yaml +0 -0
  524. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/sessions/no-key.yaml +0 -0
  525. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/sessions/with-key.yaml +0 -0
  526. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/field_write_mocks.py +0 -0
  527. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/openapi/mini_openapi.json +0 -0
  528. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/field_value_updated.json +0 -0
  529. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/list_entry_created.json +0 -0
  530. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/organization_created.json +0 -0
  531. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/organization_merged.json +0 -0
  532. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/person_created.json +0 -0
  533. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/unknown_event.json +0 -0
  534. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/README.md +0 -0
  535. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/conftest.py +0 -0
  536. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/setup_query_parity_data.py +0 -0
  537. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_cli_writes.py +0 -0
  538. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_query_parity_integration.py +0 -0
  539. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_reads.py +0 -0
  540. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_writes.py +0 -0
  541. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_writes_runner.py +0 -0
  542. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/mcp/__init__.py +0 -0
  543. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/mcp/test_query_cursor.py +0 -0
  544. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
  545. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/spec_guard.py +0 -0
  546. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
  547. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_coverage.py +0 -0
  548. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_key_file_formats.py +0 -0
  549. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_version.py +0 -0
  550. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_version_per_operation.py +0 -0
  551. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_async_file_download_streaming.py +0 -0
  552. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_batch_get.py +0 -0
  553. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_api_version.py +0 -0
  554. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_column_limiting.py +0 -0
  555. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_command_context.py +0 -0
  556. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_company_cmds_coverage.py +0 -0
  557. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_config_cmds.py +0 -0
  558. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_csv_export.py +0 -0
  559. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_date_params.py +0 -0
  560. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_date_utils.py +0 -0
  561. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_datetime_formatting.py +0 -0
  562. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_datetime_header_offsets.py +0 -0
  563. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_domain_linkification.py +0 -0
  564. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_dotenv_resolution.py +0 -0
  565. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_dropdown_field_writes.py +0 -0
  566. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_enriched_field_writes.py +0 -0
  567. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_field_writes.py +0 -0
  568. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_files_dump.py +0 -0
  569. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field_batch_writes.py +0 -0
  570. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
  571. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_error_hints.py +0 -0
  572. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_history.py +0 -0
  573. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_history_bulk.py +0 -0
  574. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_options_and_transcripts.py +0 -0
  575. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils_coverage.py +0 -0
  576. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils_set_phase.py +0 -0
  577. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_value_humanization.py +0 -0
  578. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_get_interaction_dates.py +0 -0
  579. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_interaction_date_chunking.py +0 -0
  580. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_json_safety.py +0 -0
  581. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_cmds_coverage.py +0 -0
  582. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_entity_scope.py +0 -0
  583. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_field_refresh.py +0 -0
  584. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_truncation_meta.py +0 -0
  585. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_missing_coverage.py +0 -0
  586. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
  587. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_no_network_commands.py +0 -0
  588. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_notes_writes.py +0 -0
  589. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_opportunity_cmds.py +0 -0
  590. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
  591. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_pager_logic.py +0 -0
  592. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_person_cmds_coverage.py +0 -0
  593. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_person_get.py +0 -0
  594. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_plugin_manifest.py +0 -0
  595. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_pre_xaffinity_hook.py +0 -0
  596. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_progress_manager.py +0 -0
  597. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_aggregates.py +0 -0
  598. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_cmd.py +0 -0
  599. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_cmd_coverage.py +0 -0
  600. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_dates.py +0 -0
  601. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_filters.py +0 -0
  602. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_integration.py +0 -0
  603. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_parser.py +0 -0
  604. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_planner.py +0 -0
  605. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_safety.py +0 -0
  606. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_schema.py +0 -0
  607. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_rate_limit_rendering.py +0 -0
  608. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_rate_limit_throttle.py +0 -0
  609. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_reminders.py +0 -0
  610. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_render_coverage.py +0 -0
  611. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_resolve_coverage.py +0 -0
  612. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_result_summary.py +0 -0
  613. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_safe_field_writes.py +0 -0
  614. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_search.py +0 -0
  615. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_serialization.py +0 -0
  616. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_session_cache.py +0 -0
  617. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_set_phase_atomicity.py +0 -0
  618. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_types.py +0 -0
  619. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_update_check.py +0 -0
  620. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_v1_only_cmds.py +0 -0
  621. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_v1_parsing.py +0 -0
  622. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_webhooks.py +0 -0
  623. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_client.py +0 -0
  624. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_companies_filter_rejection.py +0 -0
  625. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_env_helpers.py +0 -0
  626. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_resolver.py +0 -0
  627. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_service_caching.py +0 -0
  628. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_types_c4.py +0 -0
  629. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_value_type.py +0 -0
  630. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_values_get_value.py +0 -0
  631. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_batch_get.py +0 -0
  632. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_download_streaming.py +0 -0
  633. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_list_batch.py +0 -0
  634. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_upload_helpers_and_validation.py +0 -0
  635. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_files_v2.py +0 -0
  636. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_generate_mcp_command_registry.py +0 -0
  637. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_fields_filter_includes.py +0 -0
  638. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_fields_pagination.py +0 -0
  639. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_hidden_field_values.py +0 -0
  640. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_hooks.py +0 -0
  641. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_http_client_additional_coverage.py +0 -0
  642. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_http_client_remaining_coverage.py +0 -0
  643. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_inbound_webhooks.py +0 -0
  644. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_integration_smoke.py +0 -0
  645. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_interactions_and_files_regressions.py +0 -0
  646. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_isodatetime.py +0 -0
  647. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_list_entry_membership_and_opportunities.py +0 -0
  648. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_list_term.py +0 -0
  649. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_lists_v2_writes.py +0 -0
  650. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_bundle_env_and_completions.py +0 -0
  651. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_cli_version_check.py +0 -0
  652. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_entity_dossier.py +0 -0
  653. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_gateway_limits.py +0 -0
  654. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_history_bulk_gateway.py +0 -0
  655. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_limits.py +0 -0
  656. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_query_cli_error.py +0 -0
  657. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_read_truncation.py +0 -0
  658. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_resource_scripts.py +0 -0
  659. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_models.py +0 -0
  660. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_models_v2_2026_fields.py +0 -0
  661. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_multi_value_limits.py +0 -0
  662. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_new_features.py +0 -0
  663. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_notes_v2.py +0 -0
  664. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_notes_v2_writes.py +0 -0
  665. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_opportunities_filter_rejection.py +0 -0
  666. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_org_reads.py +0 -0
  667. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_pagination_iterators.py +0 -0
  668. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_persons_create_dedup.py +0 -0
  669. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_persons_filter_rejection.py +0 -0
  670. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_public_api.py +0 -0
  671. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_query_pushdown.py +0 -0
  672. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_rate_limit_v2.py +0 -0
  673. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_raw_pipeline_hook_events.py +0 -0
  674. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_readonly_factory.py +0 -0
  675. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_reminder_list_batch.py +0 -0
  676. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_reminders_v2.py +0 -0
  677. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_requirements_additional.py +0 -0
  678. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_sdk_interaction_dates.py +0 -0
  679. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_search.py +0 -0
  680. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_service_get_parameter_combinations.py +0 -0
  681. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_companies_coverage_gaps.py +0 -0
  682. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_dropdown_options.py +0 -0
  683. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_entity_field_updates.py +0 -0
  684. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_field_value_changes.py +0 -0
  685. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_list_entries_filter_paths.py +0 -0
  686. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_lists_coverage_gaps.py +0 -0
  687. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_additional_coverage.py +0 -0
  688. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_coverage_gaps.py +0 -0
  689. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
  690. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_persons_companies_additional_coverage.py +0 -0
  691. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
  692. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_v1_only_async.py +0 -0
  693. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_v1_only_coverage_gaps.py +0 -0
  694. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_single_field_v2.py +0 -0
  695. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_small_modules_coverage.py +0 -0
  696. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_spec_guard.py +0 -0
  697. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_transport_and_readonly_mode.py +0 -0
  698. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_association_parsing.py +0 -0
  699. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_only_services_additional_coverage.py +0 -0
  700. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_only_services_more_coverage.py +0 -0
  701. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v2_request_bodies.py +0 -0
  702. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_validate_openapi_tool.py +0 -0
  703. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_webhooks_v2.py +0 -0
  704. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/unit/__init__.py +0 -0
  705. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/__init__.py +0 -0
  706. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage.py +0 -0
  707. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage_v1_snapshot.json +0 -0
  708. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/check_cli_patterns.py +0 -0
  709. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_release_notes.py +0 -0
  710. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_requirements_mapping.py +0 -0
  711. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_bundle_env.py +0 -0
  712. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_registry.py +0 -0
  713. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_version.py +0 -0
  714. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/validate_mcp_registry_metadata.py +0 -0
  715. {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/validate_openapi_models.py +0 -0
@@ -5,7 +5,239 @@ 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.4] - 2026-10-14
9
+
10
+ **Exception to semantic versioning** (the maintainer's call, as 2.0.2 and 2.0.3): which API key
11
+ the CLI uses changes when a key flag and a key environment variable are both set. The
12
+ `### Changed` entry says how. Some fixes below also change what a call returns or raises,
13
+ or a CLI exit code; each is marked **Behavior change**.
14
+
15
+ ### Changed
16
+
17
+ - **CLI: `--api-key-file` and `--api-key-stdin` win over the environment.** A key named on the
18
+ command line is used even when `AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or
19
+ `AFFINITY_API_KEY_COMMAND` is set, and the CLI warns that those are ignored (the file is not
20
+ read and the command is not run). Before, an environment key silently replaced the flag's key,
21
+ so a stale `export` could send reads and writes to another workspace. To keep using the
22
+ environment key, drop the flag. The SDK and the MCP server (which passes no key flag) are
23
+ unchanged.
24
+
25
+ ### Fixed
26
+
27
+ - `config check-key` reports `source: "flag"` (and a `pattern` repeating the flag) when
28
+ `--api-key-file` or `--api-key-stdin` is given, as commands now use that key first. It
29
+ doesn't read stdin; a missing or empty key file counts as not configured.
30
+ - The missing-API-key error no longer says `config setup-key` saves to the system keychain: it
31
+ writes a config file, or a `.env` file with `--scope project`.
32
+ - Docs: one API-key resolution order across the README, guides, CLI page, MCP README and CLI
33
+ skill (there is no `--api-key` CLI flag).
34
+ - Docs: the README coverage table, routing guide, glossary and errors guide describe 2.0's
35
+ routing (company and person field values, `notes.get`, transcripts, teams, semantic search
36
+ and connections are V2); `api-versions.md` lists every call that sends a minimum version;
37
+ beta endpoints need no opt-in.
38
+ - Docs: the CLI command page documents `files ls`/`read`/`download` on persons, companies and
39
+ opportunities (not the old `files dump`), `relationship-strength ls` (not `get`),
40
+ `opportunity field`, `list entry get`, `file-url` and `config update-check`; the CLI page says
41
+ which list commands return a bare `data` array.
42
+ - Docs: the official-MCP comparison lists this project's transcript, meeting, team, user,
43
+ duplicate and connection reads; `VERSIONING.md` describes 2.x and its patch-release
44
+ exceptions; the MCP README asks for Python 3.10+.
45
+ - Docs: the docs home page introduces the project and links configuration, migration, API
46
+ versions, the query command and webhooks; a Transcripts reference page; the reference nav no
47
+ longer files V2 services under "V1 endpoints"; the `Affinity`/`AsyncAffinity` docstrings and
48
+ the sync/async table list every service; the field-values guide starts with the V2
49
+ company/person/list-entry methods; the plugins page covers all three plugins.
50
+ - Docs and `file-url` help: examples use placeholder ids and names.
51
+ - **Behavior change. SDK: an empty id list returns an empty page.** `list(ids=[])` on companies,
52
+ persons, opportunities, webhooks, teams, users and reminders used to omit the filter and return
53
+ the whole collection; it now returns no rows without calling the API. `limit=0` (or less) raises
54
+ `ValueError` where it used to be dropped silently (companies, persons, opportunities, a
55
+ company's lists and list entries, saved-view entries).
56
+ - **Behavior change. SDK: field writes.** A `bool` value raises `TypeError` (Affinity has no
57
+ boolean field type; it was sent as malformed text). Datetimes are sent as whole-second UTC with
58
+ `Z`, like every other write; a naive datetime is taken as UTC.
59
+ - **Behavior change. SDK: delete results.** A delete whose response has no `success` key (an empty
60
+ body) returns `True`; only an explicit `"success": false` returns `False`.
61
+ - SDK: `get_all_pages` raises `AffinityError` when it stops at `max_pages` with pages left,
62
+ instead of returning (and caching) a cut-off result.
63
+ - SDK: company and person merges raise `AffinityError` when the response has no `taskUrl`,
64
+ instead of returning an empty URL.
65
+ - SDK: the sync client rejects an `async` hook with `ConfigurationError` at construction; under
66
+ `hook_error_policy="swallow"` it was logged and never ran.
67
+ - SDK: followed pagination URLs must match the exact host and port of the V1 or V2 base URL.
68
+ - SDK: the response cache key includes the per-call API version sent.
69
+ - SDK: `tasks.wait` no longer sleeps past its `timeout`.
70
+ - SDK: `lists.resolve` no longer remembers a name it didn't find, so a list created later is found.
71
+ - SDK: `lists.get_size` is shared by every list service on a client and dropped when an entry is
72
+ added or removed, an opportunity is created or deleted, or a person or company is deleted.
73
+ - SDK: paging stops when a cursor repeats, when a page says more follow but gives no cursor, or
74
+ after 1,000 empty pages in a row (with a `RuntimeWarning`), instead of looping. This covers the
75
+ page iterators (`iter()`, `all()`) and the `pages()` generators of companies, persons,
76
+ opportunities, lists, saved views and list entries (filtered reads included), sync and async.
77
+ - SDK: association paging tolerates `"pagination": null`.
78
+ - SDK filters: `in`, `has_any` and `has_all` compare values the way `=` does, so `score in [5, 6]`
79
+ matches the number 5.
80
+ - SDK models: `FieldId(True)`, `FieldValueType(True)` and fractional floats for open enums raise
81
+ `ValueError`; a fractional float no longer replaces a known enum member for the rest of the
82
+ process. `FieldValues.get` accepts bare-digit ids (`123`, `"123"`). Person and opportunity
83
+ company ids also read `companyIds` and `current_organization_ids`; `Location` reads
84
+ `streetAddress`; V2 list entries pick the entity model from `type`.
85
+ - **CLI `query`: resuming a cut-off result no longer skips rows.** The resume cursor jumped to
86
+ the next API page, losing the rest of the current page and every fetched row that didn't fit in
87
+ `--max-output-bytes`. A cut-off result, with its included records, is now cached and the
88
+ cursor resumes from it without API calls; each page's `included` holds only the records related
89
+ to that page's rows, also when `select` leaves out `id` (TOON pages hold as many rows as fit,
90
+ with matching counts; related records that can't be matched to rows are cut to the budget and
91
+ counted in `includedOmitted`). A cursor needs the same `--max-records` as the first run; a cursor from an
92
+ earlier version is refused as not matching the query (cursors expire after an hour).
93
+ - **Behavior change. CLI `query`: errors are no longer read as "no data".** A rate-limit, server or
94
+ auth error while fetching related records (for `include`, relationship filters, or an id
95
+ lookup, or `include: interactions`), an expansion (`interactionDates`, `unreplied`, person
96
+ names) or a list's field definitions (when the query uses a list field) fails the query. Before,
97
+ the record silently had no related records, an id-only stub or an empty expansion, so `none`,
98
+ `all` and `_count eq 0` filters could match wrongly. Only a deleted or merged record counts as
99
+ empty.
100
+ - **Behavior change. CLI `query`: `--max-records`.** When results are cut at it, a warning says
101
+ so and `meta.truncated` is set, on every path (before, the cut was silent); with `orderBy` or
102
+ an aggregate the cut comes after sorting and aggregating (also when the query has no `where`), so counts, sums, groups and top-N use
103
+ every match. Before, they were computed on the first 10,000.
104
+ - **Behavior change. CLI `query`: Ctrl+C exits 130** (exit 0 before). Rows that already went
105
+ through the query's filter, sort and aggregate are printed; when one of those hadn't run yet, no
106
+ rows are printed (before, unfiltered rows were) and the error type is `interrupted`. On Python
107
+ 3.10, Ctrl+C prints no rows (it still exits 130); Python 3.11+ prints them.
108
+ - **Behavior change. CLI `query`:** a `listName` that matches more than one list, or none, is a
109
+ validation error (exit 2) asking for the list id; before, the last list with that name was
110
+ used. An include's `list:` name that matches several lists fails (exit 2,
111
+ `ambiguous_resolution`) and one that matches none is not found (exit 4); before, the scope was
112
+ dropped. `min`/`max` over objects,
113
+ lists, or a mix of numbers and text is a validation error instead of a crash or a silent pick.
114
+ - CLI `query`: with `orderBy` or `limit`, `include` (and an `expand` the sort doesn't read) runs
115
+ on the rows kept after sorting, limiting and `--max-records`, not on every match, so a top-N
116
+ query makes one call per kept row.
117
+ - CLI `query`: an Affinity error exits with the CLI's documented code (3 auth, 4 not found, 5
118
+ rate limit or server error) and its usual error envelope, instead of exit 1 with "Query
119
+ execution failed".
120
+ - CLI `query`: CSV output with `--max-output-bytes` cuts on whole records (a note with a line
121
+ break could be split), has every row's columns, honors `--csv-bom` and can be resumed; JSONL
122
+ resume no longer skips rows whose data contains `"truncated"`. A row larger than
123
+ `--max-output-bytes` is printed whole (JSON too, which exited 1 partway through paging) instead
124
+ of giving an empty page whose cursor repeats.
125
+ - CLI `query`: `include` options are applied: `list`, `where`, `limit` and `days` on a
126
+ `listEntries` include, and `limit` and `days` on an `interactions` include. Before, they were
127
+ ignored, so related opportunities came from every list and interactions used the default 90-day
128
+ window and 100-record limit.
129
+ - CLI `query`: a relationship filter on `interactions` (`interactions._count`,
130
+ `exists`/`all`/`none`) no longer hangs when the query has at least as many records as the
131
+ concurrency limit (10).
132
+ - CLI `query`: when fetching related records for a `listEntries` include fails, the other fetches
133
+ are stopped instead of continuing to call the API and printing "Task exception was never
134
+ retrieved".
135
+ - CLI `query --output toon`: a cut-off page, its `cursor:` line included, stays within
136
+ `--max-output-bytes` (if the cursor alone, about 500 bytes, doesn't fit, one row is shown).
137
+ - **Behavior change. CLI `query --output csv`:** without `--max-output-bytes`, execution warnings
138
+ (the `--max-records` cut, multi-value fields cut off) go to stderr as with the other formats,
139
+ and the CSV has the same shape as with a budget: columns in `select` order (first-seen order
140
+ without `select`; they were sorted alphabetically), selected `fields.*` and expanded
141
+ `interactionDates` flattened into columns, and every record ending with CRLF.
142
+ - CLI `query`: `groupBy` on object values (such as a location) works; formula fields filter and
143
+ sort as numbers.
144
+ - **Behavior change. CLI: a delete Affinity reports as failed exits 1** (`api_error`) instead of
145
+ printing `"success": false` with exit 0.
146
+ - **Behavior change. CLI `field history-bulk`:** when every entry fails it exits with the usual
147
+ code for that error (3 auth, 4 not found, 5 rate limit or server; 1 for mixed errors), and 3 on
148
+ any auth error (all exited 0). Partial failures still exit 0 with warnings and now set
149
+ `meta.truncated` with `truncationReason: "partialFailure"`.
150
+ - **Behavior change. CLI `list export` expansions:** a failed interaction, opportunity or
151
+ unreplied-message lookup fails the export under the default `--expand-on-error raise` (it was
152
+ left empty silently), and warns under `skip`, keeping the entry's other expansions. An auth
153
+ error during any expansion fails the export; a deleted opportunity is left out. With `--csv`
154
+ these warnings, and the export's other warnings (such as "Filtering locally"), are printed to
155
+ stderr; they were dropped.
156
+ - **Behavior change. CLI `--page-size` below 1** is a usage error (exit 2) on `company`,
157
+ `person`, `opportunity`, `list`, `note`, `interaction` and `reminder ls`, `list export` and
158
+ `files download`. With the SDK's new `limit` check it was an `internal_error` (exit 1) on most
159
+ of them, and `note ls` and `interaction ls` accepted it. `--help --json` (and the MCP command
160
+ registry) reports such range-checked options, including `search --max-results` and
161
+ `files ls --max-results`, as `int`; they were `string`.
162
+ - **Behavior change. CLI field writes:** `true`/`false` anywhere in a `--set-json` value (including
163
+ list items and object values) is refused before any write (exit 2, `validation_error`);
164
+ Affinity has no boolean field type. A text field no longer stores `true` as `"true"`.
165
+ - CLI `list entry field --unset-value` exits 1 when Affinity reports the delete failed, instead of
166
+ reporting the value as deleted. When an `--unset-value` or `--append` step fails after something
167
+ was already changed, the error is `partial_write` naming every field written and value removed;
168
+ a step that timed out or lost the connection is named as "may or may not have been applied"
169
+ (`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.
170
+ - CLI: answering "n" to a confirmation under `--json` prints an error envelope (type `aborted`),
171
+ still exit 1, instead of an empty stdout.
172
+ - CLI `list ls --type`: warns when the first page has no list of that type but more pages exist.
173
+
174
+ ### Plugins
175
+
176
+ - **CLI plugin**: 2.0.2 → 2.0.3 — skill: the API-key resolution order (key flags first) and
177
+ where `config setup-key` stores the key. Installs pin the CLI version the plugin was written
178
+ for (`XAFFINITY_CLI_SPEC` overrides it); the Read hook also guards the CLI's `config.toml`;
179
+ the skill names the `partialFailure` truncation reason; the file download example uses `--out`
180
+ (there is no `--output-dir`).
181
+ - **SDK plugin**: 2.0.3 → 2.0.4 — skill: the duplicate-company example uses a placeholder name.
182
+
183
+ ## [2.0.3] - 2026-10-13
184
+
185
+ **Exception to semantic versioning** (the maintainer's call, as 2.0.2): some results change
186
+ (`list(filter=...)` pages, the local sort's order, date comparisons in filters). The
187
+ `### Changed` entries say how.
188
+
189
+ ### Changed
190
+
191
+ - **SDK list-entry filters go through Affinity's search:**
192
+ `lists.entries(id).list/pages/all/iter/get_first(filter=...)` send the part of the filter
193
+ Affinity's search can answer and check the whole filter locally, as `list export --filter`
194
+ does. Only when no part can go there (or the search is refused) is every entry read; that
195
+ case emits the new `ClientSideFilterWarning` (a `UserWarning`).
196
+ - **`list(filter=...)` returns the matches of one page read**, possibly fewer than `limit` (or
197
+ none), with a `next_cursor` that carries the filter: follow it, or use `iter()` for every
198
+ match. Before, it filtered only the first page and had no way to continue.
199
+ - **Filtered-read cursors are `xsearch2:`** (the filter travels as data, so multi-word field
200
+ names and dates round-trip) in the SDK, `list export`, and `company ls` / `person ls`;
201
+ 2.0.2's `xsearch1:` cursors still work.
202
+ - **Field values can be named by id in text filters** (`F.field("field-123")`,
203
+ `--filter 'field-123 = …'`), as `query` allows `fields.<id>`.
204
+ - **`query`'s local sort follows Affinity's order** (when Affinity can't sort, e.g. an
205
+ unsortable field or a refused search): ranked dropdowns sort by rank (not by text),
206
+ multi-value fields by their first item, and text case-insensitively ("apple" before
207
+ "Zeta"); empty values stay last in both directions. Fields named only in `orderBy` are now
208
+ fetched (a local sort used to see them empty). Grouped rows (`groupBy`) sort by their keys
209
+ as before.
210
+ - **Quantifier queries (`all`/`none`/`exists`) on companies and persons no longer always need
211
+ `--max-records`**: their `where` must test a field, which Affinity's search applies first;
212
+ when it matches at most 100 records the query runs, otherwise it stops and names the count.
213
+ `--dry-run` gives a number of API calls instead of "UNBOUNDED" (with `--max-records` too),
214
+ which also fixes the MCP query tool's timeout for these queries (it fell back to 120 s).
215
+ Validation errors found while the query runs exit 2 with `validation_error`, like those
216
+ found while planning.
217
+
218
+ ### Added
219
+
220
+ - **`server_filter=False`** on the list-entry `list/pages/all/iter/get_first` reads every entry
221
+ and filters locally (to compare or debug), and **`affinity.ClientSideFilterWarning`**.
222
+ - **More filters go to Affinity's search** (verified live): `starts_word` on single-company
223
+ fields, and `is_not_null` / `is_null` on location fields.
224
+
225
+ - **A team's members and accessible lists, every page** (V2, beta; API 2026-09-17+):
226
+ `teams.list|iter_members(team_id)` and `teams.list|iter_accessible_lists(team_id)`; CLI
227
+ `team members <id>` and `team lists <id>` (`team get` shows only the first 10).
228
+
229
+ ### Fixed
230
+
231
+ - **Dates compare as dates in `>`, `>=`, `<`, `<=` and between**, everywhere filters run
232
+ (`query`, `--filter`, `--expand-filter`, `company ls` / `person ls --filter`, and the SDK's
233
+ `affinity.filters`): relative dates (`-30d`, `today`) and ISO dates are compared with the
234
+ field's timestamp in UTC. Before, the text filter compared them as text, so
235
+ `Close > "-30d"` matched every dated entry. Equality stays textual (`= "today"` matches the
236
+ word). Timestamps with `Z` or long fractions parse on Python 3.10 too.
237
+ - **`list export --field X --filter "Y = …"`** returned no rows: the filter's fields are now
238
+ fetched even when `--field` leaves them out of the output.
239
+ - **`Team` reads `updatedAt`** (`updated_at`), and accepts the `membersPreview` /
240
+ `accessibleListsPreview` blocks under their own names too.
9
241
 
10
242
  ## [2.0.2] - 2026-10-13
11
243
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: affinity-sdk
3
- Version: 2.0.2
3
+ Version: 2.0.4
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
@@ -47,6 +47,7 @@ from .exceptions import (
47
47
  ApiVersionTooOldError,
48
48
  AuthenticationError,
49
49
  AuthorizationError,
50
+ ClientSideFilterWarning,
50
51
  CompanyMergedError,
51
52
  CompanyNotFoundError,
52
53
  ConfigurationError,
@@ -108,6 +109,7 @@ __all__ = [
108
109
  "AsyncAffinity",
109
110
  # Exceptions
110
111
  "AffinityError",
112
+ "ClientSideFilterWarning",
111
113
  "AuthenticationError",
112
114
  "AuthorizationError",
113
115
  "NotFoundError",
@@ -0,0 +1,5 @@
1
+ """The filter engine shared by the SDK and the CLI: WHERE clauses, date parsing, the split of a
2
+ filter into what Affinity's search can answer, and the ``--filter`` text conversion.
3
+
4
+ Private package: not part of the public SDK API.
5
+ """