affinity-sdk 2.0.6__tar.gz → 2.0.7__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 (710) hide show
  1. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/CHANGELOG.md +28 -0
  2. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/PKG-INFO +1 -1
  3. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/company_cmds.py +10 -3
  4. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/list_cmds.py +13 -5
  5. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/person_cmds.py +10 -3
  6. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/entity_search.py +2 -1
  7. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/options.py +24 -0
  8. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/executor.py +10 -4
  9. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/compare.py +66 -3
  10. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/cli/commands.md +3 -3
  11. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/filtering.md +9 -1
  12. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/query-command.md +1 -1
  13. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/query-language.md +1 -1
  14. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/plugin.json +1 -1
  15. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/query-language/SKILL.md +1 -1
  16. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +1 -1
  17. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/commands.generated.json +10 -6
  18. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/CHANGELOG.md +24 -0
  19. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/COMPATIBILITY +10 -2
  20. affinity_sdk-2.0.7/mcp/VERSION +1 -0
  21. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/cli-gateway.sh +10 -0
  22. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/data-model/data-model.md +2 -2
  23. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.d/requirements.json +1 -1
  24. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.d/server.meta.json +1 -1
  25. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/execute-read-command/tool.meta.json +1 -1
  26. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/query/tool.meta.json +1 -1
  27. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
  28. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +2 -2
  29. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/hooks/session-setup.sh +1 -1
  30. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +3 -2
  31. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +5 -1
  32. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +2 -1
  33. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +1 -1
  34. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/pyproject.toml +1 -1
  35. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entity_ls_server_filter.py +100 -0
  36. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_export_server_filter.py +120 -0
  37. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_executor.py +81 -1
  38. affinity_sdk-2.0.7/tests/test_cli_repeated_filter.py +90 -0
  39. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_compare.py +2 -1
  40. affinity_sdk-2.0.7/tests/test_compare_entity_ids.py +102 -0
  41. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_must_fix.py +25 -0
  42. affinity_sdk-2.0.6/mcp/VERSION +0 -1
  43. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.claude-plugin/marketplace.json +0 -0
  44. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.cursor/rules/test-data-privacy.mdc +0 -0
  45. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.editorconfig +0 -0
  46. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.env.example +0 -0
  47. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.gitattributes +0 -0
  48. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/CODEOWNERS +0 -0
  49. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  51. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
  52. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
  53. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/dependabot.yml +0 -0
  54. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/labels.yml +0 -0
  55. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/mcp-release-install-footer.md +0 -0
  56. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/pull_request_template.md +0 -0
  57. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/release-install-footer.md +0 -0
  58. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/ci.yml +0 -0
  59. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/cowork-replay.yml +0 -0
  60. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/docs.yml +0 -0
  61. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/labels.yml +0 -0
  62. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/linkcheck.yml +0 -0
  63. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/openapi-validation.yml +0 -0
  64. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/plugin-build.yml +0 -0
  65. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/plugin-release.yml +0 -0
  66. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/release-detect.yml +0 -0
  67. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/release.yml +0 -0
  68. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.github/workflows/version-check.yml +0 -0
  69. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.gitignore +0 -0
  70. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/.pre-commit-config.yaml +0 -0
  71. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/AGENTS.md +0 -0
  72. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/CODE_OF_CONDUCT.md +0 -0
  73. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/CONTRIBUTING.md +0 -0
  74. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/LICENSE +0 -0
  75. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/README.md +0 -0
  76. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/SECURITY.md +0 -0
  77. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/VERSIONING.md +0 -0
  78. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/__init__.py +0 -0
  79. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/__init__.py +0 -0
  80. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/dates.py +0 -0
  81. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/filter_text.py +0 -0
  82. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/pushdown.py +0 -0
  83. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/search.py +0 -0
  84. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_filtering/where.py +0 -0
  85. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_internal/__init__.py +0 -0
  86. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/_internal/keyfile.py +0 -0
  87. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/api_versions.py +0 -0
  88. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/__init__.py +0 -0
  89. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/__main__.py +0 -0
  90. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/_update_worker.py +0 -0
  91. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/async_utils.py +0 -0
  92. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/click_compat.py +0 -0
  93. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/__init__.py +0 -0
  94. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_entity_field.py +0 -0
  95. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_entity_files_dump.py +0 -0
  96. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_entity_files_read.py +0 -0
  97. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_entity_files_upload.py +0 -0
  98. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_list_entry_fields.py +0 -0
  99. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_org_reads.py +0 -0
  100. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_search_common.py +0 -0
  101. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/_v1_parsing.py +0 -0
  102. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/completion_cmd.py +0 -0
  103. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/config_cmds.py +0 -0
  104. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/discovery_cmds.py +0 -0
  105. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/entry_cmds.py +0 -0
  106. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/field_cmds.py +0 -0
  107. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/file_cmds.py +0 -0
  108. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/file_url_cmd.py +0 -0
  109. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/interaction_cmds.py +0 -0
  110. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/note_cmds.py +0 -0
  111. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/opportunity_cmds.py +0 -0
  112. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/org_cmds.py +0 -0
  113. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/org_read_cmds.py +0 -0
  114. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/query_cmd.py +0 -0
  115. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
  116. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/reminder_cmds.py +0 -0
  117. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/resolve_url_cmd.py +0 -0
  118. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/session_cmds.py +0 -0
  119. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/task_cmds.py +0 -0
  120. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/transcript_cmds.py +0 -0
  121. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/version_cmd.py +0 -0
  122. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/webhook_cmds.py +0 -0
  123. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/commands/whoami_cmd.py +0 -0
  124. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/config.py +0 -0
  125. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/confirm.py +0 -0
  126. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/constants.py +0 -0
  127. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/context.py +0 -0
  128. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/csv_utils.py +0 -0
  129. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/date_utils.py +0 -0
  130. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/decorators.py +0 -0
  131. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/errors.py +0 -0
  132. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/field_utils.py +0 -0
  133. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/formatters.py +0 -0
  134. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/help_json.py +0 -0
  135. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/interaction_utils.py +0 -0
  136. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/list_search.py +0 -0
  137. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/logging.py +0 -0
  138. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/main.py +0 -0
  139. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/mcp_limits.py +0 -0
  140. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/paths.py +0 -0
  141. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/progress.py +0 -0
  142. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/__init__.py +0 -0
  143. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/aggregates.py +0 -0
  144. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/cursor.py +0 -0
  145. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/dates.py +0 -0
  146. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/exceptions.py +0 -0
  147. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/filter_text.py +0 -0
  148. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/filters.py +0 -0
  149. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/models.py +0 -0
  150. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/output.py +0 -0
  151. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/parser.py +0 -0
  152. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/planner.py +0 -0
  153. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/progress.py +0 -0
  154. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/pushdown.py +0 -0
  155. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/query/schema.py +0 -0
  156. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/render.py +0 -0
  157. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/resolve.py +0 -0
  158. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/resolvers.py +0 -0
  159. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/results.py +0 -0
  160. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/runner.py +0 -0
  161. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/serialization.py +0 -0
  162. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/session_cache.py +0 -0
  163. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/types.py +0 -0
  164. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/cli/update_check.py +0 -0
  165. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/client.py +0 -0
  166. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/clients/__init__.py +0 -0
  167. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/clients/http.py +0 -0
  168. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/clients/pipeline.py +0 -0
  169. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/criteria.py +0 -0
  170. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/downloads.py +0 -0
  171. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/exceptions.py +0 -0
  172. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/field_resolve_utils.py +0 -0
  173. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/field_resolver.py +0 -0
  174. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/filters.py +0 -0
  175. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/hooks.py +0 -0
  176. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/inbound_webhooks.py +0 -0
  177. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/__init__.py +0 -0
  178. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/discovery.py +0 -0
  179. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/entities.py +0 -0
  180. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/interactions_v2.py +0 -0
  181. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/org.py +0 -0
  182. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/pagination.py +0 -0
  183. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/rate_limit_snapshot.py +0 -0
  184. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/relationships_v2.py +0 -0
  185. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/search.py +0 -0
  186. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/secondary.py +0 -0
  187. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/transcripts.py +0 -0
  188. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/models/types.py +0 -0
  189. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/policies.py +0 -0
  190. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/progress.py +0 -0
  191. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/py.typed +0 -0
  192. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/__init__.py +0 -0
  193. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_batch_interactions.py +0 -0
  194. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_discovery.py +0 -0
  195. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_dropdown_options.py +0 -0
  196. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_field_listing.py +0 -0
  197. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_field_updates.py +0 -0
  198. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_note_html.py +0 -0
  199. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_org_reads.py +0 -0
  200. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_search.py +0 -0
  201. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_single_field.py +0 -0
  202. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/_v2_filters.py +0 -0
  203. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/companies.py +0 -0
  204. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/lists.py +0 -0
  205. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/opportunities.py +0 -0
  206. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/org.py +0 -0
  207. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/persons.py +0 -0
  208. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/rate_limits.py +0 -0
  209. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/reminders.py +0 -0
  210. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/search.py +0 -0
  211. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/tasks.py +0 -0
  212. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/transcripts.py +0 -0
  213. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/v1_only.py +0 -0
  214. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/services/webhooks.py +0 -0
  215. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/affinity/types.py +0 -0
  216. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/codecov.yml +0 -0
  217. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/cli-development-guide.md +0 -0
  218. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/ai-integrations/index.md +0 -0
  219. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/changelog.md +0 -0
  220. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/cli/index.md +0 -0
  221. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/cli/scripting.md +0 -0
  222. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/cli-reference.md +0 -0
  223. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/examples.md +0 -0
  224. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/getting-started.md +0 -0
  225. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/glossary.md +0 -0
  226. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/affinity-official-mcp-comparison.md +0 -0
  227. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/api-versions-and-routing.md +0 -0
  228. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/api-versions.md +0 -0
  229. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/authentication.md +0 -0
  230. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/claude-code-plugins.md +0 -0
  231. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/configuration.md +0 -0
  232. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/csv-export.md +0 -0
  233. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/datetime-handling.md +0 -0
  234. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/debugging-hooks.md +0 -0
  235. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/errors-and-retries.md +0 -0
  236. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/field-types-and-values.md +0 -0
  237. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/field-values.md +0 -0
  238. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/ids-and-types.md +0 -0
  239. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/migrating-to-2.md +0 -0
  240. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/models.md +0 -0
  241. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/opportunity-associations.md +0 -0
  242. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/pagination.md +0 -0
  243. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/performance.md +0 -0
  244. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/rate-limits.md +0 -0
  245. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/sync-vs-async.md +0 -0
  246. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/guides/webhooks.md +0 -0
  247. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/index.md +0 -0
  248. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/mcp/index.md +0 -0
  249. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/api-coverage.md +0 -0
  250. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/client.md +0 -0
  251. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/exceptions.md +0 -0
  252. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/filters.md +0 -0
  253. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/models.md +0 -0
  254. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/companies.md +0 -0
  255. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/lists.md +0 -0
  256. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/opportunities.md +0 -0
  257. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/persons.md +0 -0
  258. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/reminders.md +0 -0
  259. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/tasks.md +0 -0
  260. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/teams-users.md +0 -0
  261. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/transcripts.md +0 -0
  262. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/auth.md +0 -0
  263. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/field-values.md +0 -0
  264. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/fields.md +0 -0
  265. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/files.md +0 -0
  266. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/interactions.md +0 -0
  267. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/notes.md +0 -0
  268. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/v1/relationships.md +0 -0
  269. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/services/webhooks.md +0 -0
  270. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/reference/types.md +0 -0
  271. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/docs/public/troubleshooting.md +0 -0
  272. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/advanced_usage.py +0 -0
  273. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/async_lifecycle.py +0 -0
  274. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/basic_usage.py +0 -0
  275. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/filter_builder.py +0 -0
  276. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/hooks_debugging.py +0 -0
  277. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/list_management.py +0 -0
  278. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/resolve_helpers.py +0 -0
  279. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/examples/task_polling.py +0 -0
  280. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/.gitignore +0 -0
  281. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
  282. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
  283. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
  284. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
  285. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
  286. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
  287. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.gitignore +0 -0
  288. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/VERSION +0 -0
  289. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/bin/mcp-bash +0 -0
  290. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/completion.sh +0 -0
  291. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
  292. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/logging.sh +0 -0
  293. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/ping.sh +0 -0
  294. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
  295. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/resources.sh +0 -0
  296. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/roots.sh +0 -0
  297. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/handlers/tools.sh +0 -0
  298. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/auth.sh +0 -0
  299. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
  300. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
  301. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
  302. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/completion.sh +0 -0
  303. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/core.sh +0 -0
  304. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
  305. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/file_read.sh +0 -0
  306. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
  307. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/hash.sh +0 -0
  308. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/ids.sh +0 -0
  309. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/io.sh +0 -0
  310. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/json.sh +0 -0
  311. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/lock.sh +0 -0
  312. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/logging.sh +0 -0
  313. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
  314. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/paginate.sh +0 -0
  315. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/path.sh +0 -0
  316. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/policy.sh +0 -0
  317. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
  318. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/progress.sh +0 -0
  319. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/prompts.sh +0 -0
  320. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/registry.sh +0 -0
  321. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/require.sh +0 -0
  322. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
  323. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
  324. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
  325. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/resources.sh +0 -0
  326. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/roots.sh +0 -0
  327. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/rpc.sh +0 -0
  328. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/runtime.sh +0 -0
  329. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/spec.sh +0 -0
  330. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/timeout.sh +0 -0
  331. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/tools.sh +0 -0
  332. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
  333. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
  334. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/ui.sh +0 -0
  335. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/uri.sh +0 -0
  336. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/lib/validate.sh +0 -0
  337. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/providers/echo.sh +0 -0
  338. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/providers/file.sh +0 -0
  339. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/providers/git.sh +0 -0
  340. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/providers/https.sh +0 -0
  341. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/providers/ui.sh +0 -0
  342. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
  343. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
  344. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
  345. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.mcp-bash/vendor.json +0 -0
  346. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/mcp-commands.json +0 -0
  347. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/prompts.json +0 -0
  348. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/resource-templates.json +0 -0
  349. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/resources.json +0 -0
  350. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/.registry/ui-resources.json +0 -0
  351. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/Makefile +0 -0
  352. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/README.md +0 -0
  353. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/completions/entity-name.sh +0 -0
  354. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/completions/list-name.sh +0 -0
  355. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/completions/status-value.sh +0 -0
  356. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/docs/DEBUGGING.md +0 -0
  357. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/icon.svg +0 -0
  358. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/cache.sh +0 -0
  359. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/cli-detect.sh +0 -0
  360. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/common.sh +0 -0
  361. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/entity-types.sh +0 -0
  362. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/lib/field-resolution.sh +0 -0
  363. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/mcp-bash.lock +0 -0
  364. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/mcp-publisher.lock +0 -0
  365. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/mcpb.conf +0 -0
  366. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/change-status/change-status.completion.sh +0 -0
  367. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/change-status/change-status.meta.json +0 -0
  368. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/change-status/change-status.txt +0 -0
  369. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
  370. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
  371. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-call/log-call.meta.json +0 -0
  372. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-call/log-call.txt +0 -0
  373. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
  374. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
  375. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-message/log-message.meta.json +0 -0
  376. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/log-message/log-message.txt +0 -0
  377. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
  378. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
  379. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
  380. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
  381. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
  382. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
  383. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
  384. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/providers/xaffinity.sh +0 -0
  385. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/data-model/data-model.meta.json +0 -0
  386. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
  387. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
  388. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
  389. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
  390. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/me/me.meta.json +0 -0
  391. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/me/me.sh +0 -0
  392. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
  393. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/me-person-id/me-person-id.sh +0 -0
  394. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/query-guide/query-guide.meta.json +0 -0
  395. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/query-guide/query-guide.sh +0 -0
  396. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/saved-views/saved-views.meta.json +0 -0
  397. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/saved-views/saved-views.sh +0 -0
  398. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
  399. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/workflow-config/workflow-config.sh +0 -0
  400. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
  401. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
  402. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
  403. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
  404. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
  405. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.d/env.sh +0 -0
  406. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.d/health-checks.sh +0 -0
  407. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.d/policy.sh +0 -0
  408. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/server.json +0 -0
  409. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/test/README.md +0 -0
  410. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/test/run.sh +0 -0
  411. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/test/test_env_update_check.sh +0 -0
  412. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/test-progress.sh +0 -0
  413. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/discover-commands/tool.meta.json +0 -0
  414. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/discover-commands/tool.sh +0 -0
  415. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/execute-read-command/tool.sh +0 -0
  416. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/execute-write-command/tool.meta.json +0 -0
  417. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/execute-write-command/tool.sh +0 -0
  418. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
  419. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/get-entity-dossier/tool.sh +0 -0
  420. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/get-file-url/tool.meta.json +0 -0
  421. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/get-file-url/tool.sh +0 -0
  422. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/query/tool.sh +0 -0
  423. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
  424. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
  425. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/user-config.json +0 -0
  426. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/xaffinity-mcp-env.sh +0 -0
  427. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mcp/xaffinity-mcp.sh +0 -0
  428. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/mkdocs.yml +0 -0
  429. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/affinity-sdk/.claude-plugin/plugin.json +0 -0
  430. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +0 -0
  431. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +0 -0
  432. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -0
  433. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
  434. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +0 -0
  435. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
  436. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
  437. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/query/test_cursor.py +0 -0
  438. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_company_create_dedup.py +0 -0
  439. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_company_ls_filter_rejection.py +0 -0
  440. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_formatters.py +0 -0
  441. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_output_formats_integration.py +0 -0
  442. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_person_create_dedup.py +0 -0
  443. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_person_ls_filter_rejection.py +0 -0
  444. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_filter_rejection.py +0 -0
  445. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_list_entry_relationships.py +0 -0
  446. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_list_export_parity.py +0 -0
  447. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_output_flattening.py +0 -0
  448. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_output_truncation.py +0 -0
  449. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cli/test_query_unreplied.py +0 -0
  450. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/conftest.py +0 -0
  451. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/.cowork-redact.json +0 -0
  452. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/README.md +0 -0
  453. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/cassettes/company-lists-status.cassette.json +0 -0
  454. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +0 -0
  455. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -0
  456. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/cassettes/status-history.cassette.json +0 -0
  457. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
  458. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
  459. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
  460. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/image/Dockerfile +0 -0
  461. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
  462. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/image/fakeaff/fixtures.json +0 -0
  463. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/image/fakeaff/server.py +0 -0
  464. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
  465. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/privacy-allow.txt +0 -0
  466. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/record.sh +0 -0
  467. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
  468. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
  469. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
  470. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/scenarios/status-history.yaml +0 -0
  471. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/sessions/no-key.yaml +0 -0
  472. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/cowork/sessions/with-key.yaml +0 -0
  473. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/field_write_mocks.py +0 -0
  474. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/openapi/mini_openapi.json +0 -0
  475. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/field_value_updated.json +0 -0
  476. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/list_entry_created.json +0 -0
  477. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/organization_created.json +0 -0
  478. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/organization_merged.json +0 -0
  479. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/person_created.json +0 -0
  480. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/fixtures/webhooks/unknown_event.json +0 -0
  481. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/README.md +0 -0
  482. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/conftest.py +0 -0
  483. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/setup_query_parity_data.py +0 -0
  484. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/test_cli_writes.py +0 -0
  485. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/test_query_parity_integration.py +0 -0
  486. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/test_sdk_reads.py +0 -0
  487. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/test_sdk_writes.py +0 -0
  488. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/integration/test_sdk_writes_runner.py +0 -0
  489. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/mcp/__init__.py +0 -0
  490. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/mcp/test_query_cursor.py +0 -0
  491. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
  492. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/spec_guard.py +0 -0
  493. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
  494. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_api_coverage.py +0 -0
  495. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_api_key_file_formats.py +0 -0
  496. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_api_key_resolution.py +0 -0
  497. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_api_version.py +0 -0
  498. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_api_version_per_operation.py +0 -0
  499. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_async_file_download_streaming.py +0 -0
  500. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_batch_get.py +0 -0
  501. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_api_version.py +0 -0
  502. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_column_limiting.py +0 -0
  503. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_command_context.py +0 -0
  504. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_commands_must_fix.py +0 -0
  505. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_company_cmds_coverage.py +0 -0
  506. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_company_get.py +0 -0
  507. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_config_cmds.py +0 -0
  508. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_context_coverage.py +0 -0
  509. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_csv_export.py +0 -0
  510. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_date_params.py +0 -0
  511. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_date_utils.py +0 -0
  512. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_datetime_formatting.py +0 -0
  513. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_datetime_header_offsets.py +0 -0
  514. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_domain_linkification.py +0 -0
  515. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_dotenv_resolution.py +0 -0
  516. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_dropdown_field_writes.py +0 -0
  517. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_enriched_field_writes.py +0 -0
  518. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entity_field_writes.py +0 -0
  519. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entity_files_dump.py +0 -0
  520. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entry_field.py +0 -0
  521. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entry_field_batch_writes.py +0 -0
  522. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
  523. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_error_hints.py +0 -0
  524. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_error_rendering.py +0 -0
  525. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_history.py +0 -0
  526. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_history_bulk.py +0 -0
  527. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_history_deleted_options.py +0 -0
  528. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_options_and_transcripts.py +0 -0
  529. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_utils.py +0 -0
  530. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_utils_coverage.py +0 -0
  531. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_utils_set_phase.py +0 -0
  532. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_field_value_humanization.py +0 -0
  533. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_file_url.py +0 -0
  534. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_files_ls.py +0 -0
  535. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_files_read.py +0 -0
  536. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_get_interaction_dates.py +0 -0
  537. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_help_json.py +0 -0
  538. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_interaction_date_chunking.py +0 -0
  539. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_interaction_utils.py +0 -0
  540. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_json_safety.py +0 -0
  541. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_cmds_coverage.py +0 -0
  542. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_expand_interactions.py +0 -0
  543. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_export_entity_scope.py +0 -0
  544. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_export_field_refresh.py +0 -0
  545. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_export_filter_safety.py +0 -0
  546. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_list_export_truncation_meta.py +0 -0
  547. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_missing_coverage.py +0 -0
  548. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
  549. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_no_network_commands.py +0 -0
  550. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_notes_writes.py +0 -0
  551. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_opportunity_cmds.py +0 -0
  552. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
  553. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_org.py +0 -0
  554. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_page_size_validation.py +0 -0
  555. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_pager_logic.py +0 -0
  556. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_person_cmds_coverage.py +0 -0
  557. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_person_get.py +0 -0
  558. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_plugin_manifest.py +0 -0
  559. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_pre_xaffinity_hook.py +0 -0
  560. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_progress_manager.py +0 -0
  561. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_aggregates.py +0 -0
  562. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_cmd.py +0 -0
  563. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_cmd_coverage.py +0 -0
  564. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_dates.py +0 -0
  565. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_expand_interactions.py +0 -0
  566. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_filters.py +0 -0
  567. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_integration.py +0 -0
  568. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_must_fix.py +0 -0
  569. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_parser.py +0 -0
  570. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_planner.py +0 -0
  571. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_review_fixes.py +0 -0
  572. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_safety.py +0 -0
  573. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_schema.py +0 -0
  574. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_query_server_filter.py +0 -0
  575. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_rate_limit_rendering.py +0 -0
  576. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_rate_limit_throttle.py +0 -0
  577. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_reminders.py +0 -0
  578. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_render_coverage.py +0 -0
  579. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_resolve_coverage.py +0 -0
  580. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_resolve_url_parsing.py +0 -0
  581. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_result_summary.py +0 -0
  582. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_safe_field_writes.py +0 -0
  583. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_search.py +0 -0
  584. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_serialization.py +0 -0
  585. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_session_cache.py +0 -0
  586. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_session_setup_hook.py +0 -0
  587. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_set_phase_atomicity.py +0 -0
  588. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_types.py +0 -0
  589. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_unreplied.py +0 -0
  590. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_update_check.py +0 -0
  591. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_v1_only_cmds.py +0 -0
  592. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_v1_parsing.py +0 -0
  593. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_webhooks.py +0 -0
  594. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_cli_write_ops.py +0 -0
  595. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_client.py +0 -0
  596. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_companies_create_dedup.py +0 -0
  597. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_companies_filter_rejection.py +0 -0
  598. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_duplicates_connections.py +0 -0
  599. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_env_helpers.py +0 -0
  600. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_exceptions_coverage.py +0 -0
  601. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_field_resolver.py +0 -0
  602. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_field_service_caching.py +0 -0
  603. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_field_types_c4.py +0 -0
  604. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_field_value_type.py +0 -0
  605. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_field_values_get_value.py +0 -0
  606. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_file_batch_get.py +0 -0
  607. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_file_download_streaming.py +0 -0
  608. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_file_list_batch.py +0 -0
  609. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_file_upload_helpers_and_validation.py +0 -0
  610. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_files_upload_returning_files.py +0 -0
  611. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_files_v2.py +0 -0
  612. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_filters.py +0 -0
  613. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_generate_mcp_command_registry.py +0 -0
  614. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_get_fields_filter_includes.py +0 -0
  615. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_get_fields_pagination.py +0 -0
  616. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_get_first.py +0 -0
  617. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_hidden_field_values.py +0 -0
  618. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_hooks.py +0 -0
  619. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_http_client_additional_coverage.py +0 -0
  620. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_http_client_remaining_coverage.py +0 -0
  621. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_inbound_webhooks.py +0 -0
  622. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_integration_smoke.py +0 -0
  623. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_interaction_date_validation.py +0 -0
  624. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_interactions_and_files_regressions.py +0 -0
  625. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_isodatetime.py +0 -0
  626. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_list_entries_server_filter.py +0 -0
  627. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_list_entry_membership_and_opportunities.py +0 -0
  628. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_list_term.py +0 -0
  629. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_lists_v2_writes.py +0 -0
  630. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_bundle_env_and_completions.py +0 -0
  631. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_cli_version_check.py +0 -0
  632. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_entity_dossier.py +0 -0
  633. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_gateway_limits.py +0 -0
  634. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_history_bulk_gateway.py +0 -0
  635. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_limits.py +0 -0
  636. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_query_cli_error.py +0 -0
  637. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_read_truncation.py +0 -0
  638. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_mcp_resource_scripts.py +0 -0
  639. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_models.py +0 -0
  640. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_models_v2_2026_fields.py +0 -0
  641. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_multi_value_limits.py +0 -0
  642. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_new_features.py +0 -0
  643. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_notes_v2.py +0 -0
  644. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_notes_v2_writes.py +0 -0
  645. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_opportunities_filter_rejection.py +0 -0
  646. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_org_reads.py +0 -0
  647. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_pagination_iterators.py +0 -0
  648. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_persons_create_dedup.py +0 -0
  649. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_persons_filter_rejection.py +0 -0
  650. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_public_api.py +0 -0
  651. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_query_pushdown.py +0 -0
  652. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_rate_limit_v2.py +0 -0
  653. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_raw_pipeline_hook_events.py +0 -0
  654. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_readonly_factory.py +0 -0
  655. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_reminder_list_batch.py +0 -0
  656. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_reminders_v2.py +0 -0
  657. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_requirements_additional.py +0 -0
  658. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_review_fixes_sdk_cli.py +0 -0
  659. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_sdk_interaction_dates.py +0 -0
  660. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_sdk_must_fix.py +0 -0
  661. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_search.py +0 -0
  662. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_search_v2.py +0 -0
  663. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_service_get_parameter_combinations.py +0 -0
  664. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_batch_get_interaction_dates.py +0 -0
  665. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_companies_coverage_gaps.py +0 -0
  666. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_dropdown_options.py +0 -0
  667. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_entity_field_updates.py +0 -0
  668. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_entity_list_entries.py +0 -0
  669. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_field_value_changes.py +0 -0
  670. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_list_entries_filter_paths.py +0 -0
  671. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_lists_additional_coverage.py +0 -0
  672. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_lists_coverage_gaps.py +0 -0
  673. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_opportunities_additional_coverage.py +0 -0
  674. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_opportunities_coverage_gaps.py +0 -0
  675. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
  676. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_pages_cursor_guard.py +0 -0
  677. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_persons_companies_additional_coverage.py +0 -0
  678. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
  679. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_v1_only_async.py +0 -0
  680. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_services_v1_only_coverage_gaps.py +0 -0
  681. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_single_field_v2.py +0 -0
  682. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_small_modules_coverage.py +0 -0
  683. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_spec_guard.py +0 -0
  684. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_teams_users_feedback.py +0 -0
  685. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_transport_and_readonly_mode.py +0 -0
  686. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_v1_association_parsing.py +0 -0
  687. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_v1_only_services_additional_coverage.py +0 -0
  688. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_v1_only_services_more_coverage.py +0 -0
  689. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_v2_request_bodies.py +0 -0
  690. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_validate_openapi_tool.py +0 -0
  691. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/test_webhooks_v2.py +0 -0
  692. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/unit/__init__.py +0 -0
  693. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tests/unit/test_exceptions.py +0 -0
  694. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/__init__.py +0 -0
  695. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/api_coverage.json +0 -0
  696. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/api_coverage.py +0 -0
  697. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/api_coverage_v1_snapshot.json +0 -0
  698. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/check_cli_patterns.py +0 -0
  699. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/generate_mcp_command_registry.py +0 -0
  700. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/generate_release_notes.py +0 -0
  701. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/generate_requirements_mapping.py +0 -0
  702. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/openapi_snapshots/2024-01-01.json +0 -0
  703. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/openapi_snapshots/2026-07-15.json +0 -0
  704. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/openapi_snapshots/2026-09-17.json +0 -0
  705. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/search_golden.py +0 -0
  706. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/sync_mcp_bundle_env.py +0 -0
  707. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/sync_mcp_registry.py +0 -0
  708. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/sync_mcp_version.py +0 -0
  709. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/validate_mcp_registry_metadata.py +0 -0
  710. {affinity_sdk-2.0.6 → affinity_sdk-2.0.7}/tools/validate_openapi_models.py +0 -0
@@ -5,6 +5,34 @@ 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
+ ## [2.0.7] - 2026-11-03
9
+
10
+ **Exception to semantic versioning** (as 2.0.2–2.0.6): two fixes change which rows a filter
11
+ returns. Each is marked **Behavior change**.
12
+
13
+ ### Highlights
14
+
15
+ A repeated `--filter` now combines its conditions instead of keeping only the last one, and a
16
+ person or company field filtered by id (`Owner = 26229794`) matches that person instead of
17
+ nothing.
18
+
19
+ ### Changed
20
+
21
+ - **Behavior change (correctness fix). CLI: repeated `--filter` values are ANDed** on
22
+ `list export`, `company ls` and `person ls`, and so are repeated `list export --expand-filter`
23
+ values. Only the last one used to apply, and the others were dropped without a warning, so such
24
+ runs returned rows that didn't match the earlier conditions: re-run them. `--filter A --filter B`
25
+ is `(A) & (B)`; for OR, use `|` inside one value. Each repeated value must be a complete
26
+ expression on its own. (The MCP server refused a repeated `--filter`, so MCP calls weren't
27
+ affected.)
28
+ - **Behavior change (correctness fix). CLI and SDK: a person or company field compared with a
29
+ number matches the record's id.** `Owner = 26229794` (and `in`, `has_any`, `has_all`) in
30
+ `--filter`, `query` and `affinity.filters` compared the name with "26229794" and matched nothing,
31
+ without a warning (`!=` matched every row). It now matches that person's id, and names still
32
+ match as before. Other record references, such as lists, match their id too. Re-run filters that
33
+ used ids. A reference with no name (a person without a first and last name, a company with an
34
+ empty name) still can't be matched by id.
35
+
8
36
  ## [2.0.6] - 2026-10-14
9
37
 
10
38
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: affinity-sdk
3
- Version: 2.0.6
3
+ Version: 2.0.7
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/
@@ -29,7 +29,12 @@ from ..entity_search import COMPANY_KEYS, filtered_ls
29
29
  from ..errors import CLIError
30
30
  from ..list_search import is_filter_cursor
31
31
  from ..mcp_limits import apply_mcp_limits
32
- from ..options import csv_output_options, csv_suboption_callback, output_options
32
+ from ..options import (
33
+ csv_output_options,
34
+ csv_suboption_callback,
35
+ join_filters_callback,
36
+ output_options,
37
+ )
33
38
  from ..progress import ProgressManager, ProgressSettings
34
39
  from ..resolve import get_company_fields, resolve_list_selector
35
40
  from ..resolvers import ResolvedEntity
@@ -330,9 +335,11 @@ def _parse_field_types(values: tuple[str, ...]) -> list[FieldType] | None:
330
335
  "--filter",
331
336
  "filter_expr",
332
337
  type=str,
333
- default=None,
338
+ multiple=True,
339
+ callback=join_filters_callback,
334
340
  help="Filter on company fields, applied by Affinity's search: 'field op value'. Ops: = != "
335
- "=~ =^ =$ > < >= <= starts_word. E.g., 'Stage = \"Seed\"'. Name search: --query.",
341
+ "=~ =^ =$ > < >= <= starts_word. E.g., 'Stage = \"Seed\"'. Name search: --query. "
342
+ "Repeatable: repeated values are ANDed.",
336
343
  )
337
344
  @click.option(
338
345
  "--query",
@@ -44,7 +44,12 @@ from ..decorators import category, destructive
44
44
  from ..errors import CLIError
45
45
  from ..list_search import ListSearch, decode_cursor, encode_cursor, plan_list_search
46
46
  from ..mcp_limits import apply_mcp_limits
47
- from ..options import csv_output_options, csv_suboption_callback, output_options
47
+ from ..options import (
48
+ csv_output_options,
49
+ csv_suboption_callback,
50
+ join_filters_callback,
51
+ output_options,
52
+ )
48
53
  from ..render import format_duration
49
54
  from ..resolve import (
50
55
  list_all_saved_views,
@@ -452,9 +457,10 @@ ExpandOnError = Literal["raise", "skip"]
452
457
  "--filter",
453
458
  "filter_expr",
454
459
  type=str,
455
- default=None,
460
+ multiple=True,
461
+ callback=join_filters_callback,
456
462
  help="Filter (field op value): Affinity's search applies what it can, the rest is checked "
457
- 'locally. Quote multi-word: Status="Intro Meeting".',
463
+ 'locally. Quote multi-word: Status="Intro Meeting". Repeatable: repeated values are ANDed.',
458
464
  )
459
465
  @click.option(
460
466
  "--page-size",
@@ -570,8 +576,10 @@ ExpandOnError = Literal["raise", "skip"]
570
576
  "--expand-filter",
571
577
  "expand_filter",
572
578
  type=str,
573
- default=None,
574
- help="Filter expanded entities (e.g., 'field=value' or 'field!=value').",
579
+ multiple=True,
580
+ callback=join_filters_callback,
581
+ help="Filter expanded entities (e.g., 'field=value' or 'field!=value'). "
582
+ "Repeatable: repeated values are ANDed.",
575
583
  )
576
584
  @click.option(
577
585
  "--expand-opportunities-list",
@@ -27,7 +27,12 @@ from ..entity_search import PERSON_KEYS, filtered_ls
27
27
  from ..errors import CLIError
28
28
  from ..list_search import is_filter_cursor
29
29
  from ..mcp_limits import apply_mcp_limits
30
- from ..options import csv_output_options, csv_suboption_callback, output_options
30
+ from ..options import (
31
+ csv_output_options,
32
+ csv_suboption_callback,
33
+ join_filters_callback,
34
+ output_options,
35
+ )
31
36
  from ..progress import ProgressManager, ProgressSettings
32
37
  from ..resolve import get_person_fields, resolve_list_selector
33
38
  from ..resolvers import ResolvedEntity
@@ -207,9 +212,11 @@ def _parse_field_types(values: tuple[str, ...]) -> list[FieldType] | None:
207
212
  "--filter",
208
213
  "filter_expr",
209
214
  type=str,
210
- default=None,
215
+ multiple=True,
216
+ callback=join_filters_callback,
211
217
  help="Filter on person fields, applied by Affinity's search: 'field op value'. Ops: = != "
212
- "=~ =^ =$ > < >= <= starts_word. E.g., 'Deals > 5'. Name/email search: --query.",
218
+ "=~ =^ =$ > < >= <= starts_word. E.g., 'Deals > 5'. Name/email search: --query. "
219
+ "Repeatable: repeated values are ANDed.",
213
220
  )
214
221
  @click.option(
215
222
  "--query",
@@ -94,7 +94,8 @@ def _paths(where: WhereClause) -> set[str]:
94
94
 
95
95
  def entity_filter_dict(entity: Any) -> dict[str, Any]:
96
96
  """What a ``--filter`` on companies or persons sees: field values by name (dropdowns as
97
- text, persons and companies as names) plus the record's own attributes."""
97
+ text, persons and companies as names that also match their id) plus the record's own
98
+ attributes."""
98
99
  result: dict[str, Any] = {}
99
100
  by_id: dict[str, Any] = {}
100
101
  for item in getattr(entity, "fields_raw", None) or []:
@@ -4,6 +4,8 @@ import functools
4
4
  from collections.abc import Callable
5
5
  from typing import Any, TypeVar, cast
6
6
 
7
+ from affinity.filters import parse
8
+
7
9
  from .click_compat import click
8
10
  from .context import CLIContext, OutputFormat
9
11
  from .errors import CLIError
@@ -143,6 +145,28 @@ def _emit_validation_error(ctx: CLIContext, err: CLIError) -> None:
143
145
  sys.stderr.write(f"Hint: {err.hint}\n")
144
146
 
145
147
 
148
+ def join_filters_callback(
149
+ _ctx: click.Context, _param: click.Parameter, value: tuple[str, ...]
150
+ ) -> str | None:
151
+ """Callback for a repeatable filter option (--filter, --expand-filter): AND the values.
152
+
153
+ One value is passed on unchanged. Repeated values are each parsed on their own first, so a
154
+ value can't close the parentheses it is wrapped in, and its error names it.
155
+ """
156
+ if not value:
157
+ return None
158
+ if len(value) == 1:
159
+ return value[0]
160
+ for i, text in enumerate(value, 1):
161
+ if not text.strip():
162
+ raise click.BadParameter(f"value {i} is empty; each repeated value needs an expression")
163
+ try:
164
+ parse(text)
165
+ except ValueError as e:
166
+ raise click.BadParameter(f"value {i} ({text!r}): {e}") from e
167
+ return " & ".join(f"({text})" for text in value)
168
+
169
+
146
170
  def csv_suboption_callback(ctx: click.Context, param: click.Parameter, value: Any) -> Any:
147
171
  """Callback for CSV-related sub-options (--csv-bom, --csv-header, --csv-mode).
148
172
 
@@ -16,6 +16,7 @@ from collections.abc import AsyncIterator, Awaitable, Callable, Mapping
16
16
  from dataclasses import dataclass, field
17
17
  from typing import TYPE_CHECKING, Any, Protocol, TypeVar
18
18
 
19
+ from ...compare import entity_name
19
20
  from ...exceptions import (
20
21
  AuthorizationError,
21
22
  MergedEntityError,
@@ -262,19 +263,24 @@ def _normalize_list_entry_fields(
262
263
  # Person reference in multi-select
263
264
  name = _extract_person_display_name(item)
264
265
  if name:
265
- extracted.append(name)
266
+ extracted.append(entity_name(name, item.get("id")))
266
267
  elif isinstance(item, dict) and "name" in item:
267
268
  # Company reference in multi-select
268
- extracted.append(item["name"])
269
+ extracted.append(entity_name(item["name"], item.get("id")))
269
270
  else:
270
271
  extracted.append(item)
271
272
  normalized_fields[field_name] = extracted
272
273
  # Handle person reference: {"firstName": "Jane", "lastName": "Doe"}
274
+ # (names carry the record id: a filter on the id matches too)
273
275
  elif isinstance(data, dict) and ("firstName" in data or "lastName" in data):
274
- normalized_fields[field_name] = _extract_person_display_name(data)
276
+ normalized_fields[field_name] = entity_name(
277
+ _extract_person_display_name(data), data.get("id")
278
+ )
275
279
  # Handle company reference: {"name": "Acme", "domain": "acme.com"}
276
280
  elif isinstance(data, dict) and "name" in data:
277
- normalized_fields[field_name] = data["name"]
281
+ normalized_fields[field_name] = entity_name(
282
+ data["name"], data.get("id")
283
+ )
278
284
  else:
279
285
  normalized_fields[field_name] = data
280
286
  else:
@@ -16,6 +16,51 @@ from typing import Any
16
16
  from ._filtering.dates import as_utc, parse_date_value, parse_iso_datetime
17
17
 
18
18
 
19
+ class EntityName(str):
20
+ """A person's or company's name (or another record reference's) that also carries the
21
+ record's id, so a filter can match either: ``Owner = "Jane Doe"`` or ``Owner = 123``.
22
+
23
+ It is a ``str`` everywhere else (output, sorting, text operators)."""
24
+
25
+ __slots__ = ("entity_id",)
26
+ entity_id: int | None
27
+
28
+ def __new__(cls, value: str, entity_id: int | None = None) -> EntityName:
29
+ self = super().__new__(cls, value)
30
+ self.entity_id = entity_id
31
+ return self
32
+
33
+ def __reduce__(self) -> tuple[Any, ...]:
34
+ # Keeps the id through copy, deepcopy and every pickle protocol
35
+ return (type(self), (str(self), self.entity_id))
36
+
37
+
38
+ def entity_name(value: Any, entity_id: Any) -> Any:
39
+ """``value`` as an :class:`EntityName` when it is a non-empty name and ``entity_id`` an
40
+ integer id; anything else (no name, no id) is returned unchanged."""
41
+ if (
42
+ isinstance(value, str)
43
+ and value
44
+ and isinstance(entity_id, int)
45
+ and not isinstance(entity_id, bool)
46
+ ):
47
+ return EntityName(value, entity_id)
48
+ return value
49
+
50
+
51
+ def _as_entity_id(value: Any) -> int | None:
52
+ """A filter value read as a record id: an int, or a string of ASCII digits."""
53
+ if isinstance(value, bool):
54
+ return None
55
+ if isinstance(value, int):
56
+ return value
57
+ if isinstance(value, str):
58
+ text = value.strip()
59
+ if text and text.isascii() and text.isdigit() and len(text) <= 20:
60
+ return int(text)
61
+ return None
62
+
63
+
19
64
  def normalize_value(value: Any) -> Any:
20
65
  """Normalize a value for comparison.
21
66
 
@@ -23,6 +68,7 @@ def normalize_value(value: Any) -> Any:
23
68
  - Dropdowns become their text: {"text": "Active"} -> "Active"
24
69
  - Persons become their name: {"firstName": "Jane", "lastName": "Doe"} -> "Jane Doe"
25
70
  - Companies become their name: {"name": "Acme", "domain": ...} -> "Acme"
71
+ (as :class:`EntityName`, carrying the record id, so a number matches the id)
26
72
  - Multi-value arrays become lists of those: [{"text": "A"}, {"text": "B"}] -> ["A", "B"]
27
73
  - Scalars pass through unchanged
28
74
 
@@ -46,9 +92,9 @@ def _normalize_item(item: dict[str, Any]) -> Any:
46
92
  parts = [
47
93
  p.strip() for p in (item.get("firstName"), item.get("lastName")) if isinstance(p, str)
48
94
  ]
49
- return " ".join(p for p in parts if p) or None
95
+ return entity_name(" ".join(p for p in parts if p) or None, item.get("id"))
50
96
  if "name" in item:
51
- return item["name"]
97
+ return entity_name(item["name"], item.get("id"))
52
98
  return item
53
99
 
54
100
 
@@ -163,6 +209,8 @@ def _eq(a: Any, b: Any) -> bool:
163
209
  if isinstance(a, list):
164
210
  # If comparing list to list, check set equality (order-insensitive)
165
211
  if isinstance(b, list):
212
+ if any(isinstance(x, EntityName) for x in a):
213
+ return _same_members(a, b)
166
214
  try:
167
215
  return set(a) == set(b)
168
216
  except TypeError:
@@ -178,7 +226,8 @@ def _eq(a: Any, b: Any) -> bool:
178
226
 
179
227
  def _scalar_eq(a: Any, b: Any) -> bool:
180
228
  """Scalar equality as ``eq`` uses it, and ``in`` / ``has_any`` / ``has_all`` per element:
181
- direct, then ``"true"``/``"false"`` against a bool, then by string (``5`` matches ``"5"``)."""
229
+ direct, then an :class:`EntityName` against its id, then ``"true"``/``"false"`` against a
230
+ bool, then by string (``5`` matches ``"5"``). ``a`` is the field value."""
182
231
  if a is None or b is None:
183
232
  return a is b
184
233
 
@@ -186,6 +235,10 @@ def _scalar_eq(a: Any, b: Any) -> bool:
186
235
  if a == b:
187
236
  return True
188
237
 
238
+ # A person or company also matches its id (Owner = 123)
239
+ if isinstance(a, EntityName) and a.entity_id is not None and _as_entity_id(b) == a.entity_id:
240
+ return True
241
+
189
242
  # Handle boolean coercion: filter string "true"/"false" should match Python bool
190
243
  # Filter parser outputs lowercase "true"/"false", Python str(True) is "True"
191
244
  if isinstance(a, bool) and isinstance(b, str):
@@ -198,6 +251,14 @@ def _scalar_eq(a: Any, b: Any) -> bool:
198
251
  return str(a) == str(b)
199
252
 
200
253
 
254
+ def _same_members(a: list[Any], b: list[Any]) -> bool:
255
+ """Set equality through :func:`_scalar_eq` (field elements first), for lists of record
256
+ references: every target matches some element and every element matches some target."""
257
+ return all(any(_scalar_eq(x, y) for x in a) for y in b) and all(
258
+ any(_scalar_eq(x, y) for y in b) for x in a
259
+ )
260
+
261
+
201
262
  def _neq(a: Any, b: Any) -> bool:
202
263
  """Not equal operator with array membership support."""
203
264
  if a is None:
@@ -205,6 +266,8 @@ def _neq(a: Any, b: Any) -> bool:
205
266
 
206
267
  if isinstance(a, list):
207
268
  if isinstance(b, list):
269
+ if any(isinstance(x, EntityName) for x in a):
270
+ return not _same_members(a, b)
208
271
  try:
209
272
  return set(a) != set(b)
210
273
  except TypeError:
@@ -273,7 +273,7 @@ Options:
273
273
  - `--query <term>` / `-q <term>`: free-text search (name or email)
274
274
  - `--field <id-or-name>` (repeatable): field ID or name to include
275
275
  - `--field-type <type>` (repeatable): field type to include (global, enriched, relationship-intelligence)
276
- - `--filter <expression>`: filter expression; must include a condition on a person field (Affinity's search applies it)
276
+ - `--filter <expression>` (repeatable, values ANDed): filter expression; must include a condition on a person field (Affinity's search applies it)
277
277
  - `--page-size`, `--cursor`, `--max-results`, `--all`: pagination options
278
278
  - `--csv`: output as CSV (to stdout)
279
279
  - `--csv-bom`: add UTF-8 BOM for Excel compatibility
@@ -456,7 +456,7 @@ Options:
456
456
  - `--query <term>` / `-q <term>`: free-text search (name or domain)
457
457
  - `--field <id-or-name>` (repeatable): field ID or name to include
458
458
  - `--field-type <type>` (repeatable): field type to include (global, enriched, relationship-intelligence)
459
- - `--filter <expression>`: filter expression; must include a condition on a company field (Affinity's search applies it)
459
+ - `--filter <expression>` (repeatable, values ANDed): filter expression; must include a condition on a company field (Affinity's search applies it)
460
460
  - `--page-size`, `--cursor`, `--max-results`, `--all`: pagination options
461
461
  - `--csv`: output as CSV (to stdout)
462
462
  - `--csv-bom`: add UTF-8 BOM for Excel compatibility
@@ -838,7 +838,7 @@ Options:
838
838
  - `--csv-bom`: add UTF-8 BOM for Excel compatibility
839
839
  - `--field <id-or-name>` (repeatable): include specific fields
840
840
  - `--saved-view <name>`: use a saved view's field selection (server-side filtering)
841
- - `--filter <expression>`: filter expression; Affinity's search applies what it can, the rest runs locally (see below)
841
+ - `--filter <expression>` (repeatable, values ANDed): filter expression; Affinity's search applies what it can, the rest runs locally (see below)
842
842
  - `--company-id <id>` (repeatable): entity-scoped export — return only rows where the entry is for this company
843
843
  - `--person-id <id>` (repeatable): entity-scoped export — return only rows where the entry is for this person
844
844
  - `--first-page-only`: fetch a single page of results; output includes `meta.truncated=true` and `meta.truncationReason="firstPageOnly"` when there are more pages
@@ -120,6 +120,10 @@ multi_region = entries.list(
120
120
  For CLI or advanced SDK use, you can use raw filter strings: the `--filter` text of
121
121
  `list export`, `company ls` and `person ls`, and `affinity.filters.parse()` in the SDK.
122
122
 
123
+ `--filter` (and `--expand-filter`) can be repeated: the values are ANDed, so
124
+ `--filter 'Status = "Active"' --filter 'Region = "US"'` is `(Status = "Active") & (Region = "US")`.
125
+ Each value must be a complete expression; for OR, use `|` inside one value.
126
+
123
127
  ### Standard Operators
124
128
 
125
129
  These operators work in every `--filter` and in `affinity.filters`:
@@ -184,7 +188,8 @@ Human/LLM-friendly aliases for official operators:
184
188
  - **`starts_word`**: a word in the value starts with the text, case-insensitive, the way
185
189
  Affinity's search matches names. `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"`
186
190
  doesn't. JSON spelling in `query`: `{"path": "fields.Owner", "op": "starts_word", "value": "Jan"}`.
187
- - **Person and company fields** are compared by name ("Jane Doe", "Acme"). In `--filter`
191
+ - **Person and company fields** are compared by name ("Jane Doe", "Acme"), or by id when the value is a number
192
+ (`Owner = 26229794`: that person's id; a value with no name can't match by id). In `--filter`
188
193
  and `query`, `contains` (and `contains_any` / `contains_all`) on a person or company
189
194
  field is refused: use `starts_word`.
190
195
  - **Empty multi-value fields**: a multi-value field with no items counts as empty.
@@ -228,6 +233,9 @@ xaffinity list export Pipeline --filter 'Region = "US" | Region = "Canada"'
228
233
  # A person field by name
229
234
  xaffinity list export Pipeline --filter 'Owner starts_word "Jan"'
230
235
 
236
+ # A person field by id
237
+ xaffinity list export Pipeline --filter 'Owner = 26229794' --all
238
+
231
239
  # Null check
232
240
  xaffinity list export Pipeline --filter 'Owner != *'
233
241
 
@@ -185,7 +185,7 @@ Example: {"from": "persons", "include": ["interactions"]}
185
185
  | `has_any` | Array contains any of the values | `["LB", "MA"]` |
186
186
  | `has_all` | Array contains all of the values | `["LB", "MA"]` |
187
187
 
188
- `starts_word` matches the way Affinity's search matches names: `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't. Person and company field values are compared by name ("Jane Doe", "Acme"), and `contains` / `contains_any` / `contains_all` on a person or company field is refused: use `starts_word`. An empty multi-value field (no items) counts as empty: `is_null` matches it, `is_not_null` doesn't.
188
+ `starts_word` matches the way Affinity's search matches names: `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't. Person and company field values are compared by name ("Jane Doe", "Acme"), or by id when the value is a number (`{"path": "fields.Owner", "op": "eq", "value": 26229794}`), and `contains` / `contains_any` / `contains_all` on a person or company field is refused: use `starts_word`. An empty multi-value field (no items) counts as empty: `is_null` matches it, `is_not_null` doesn't.
189
189
 
190
190
  The `--filter` text of `list export`, `company ls` and `person ls` is the same filter language: every condition means the same in both spellings.
191
191
 
@@ -146,7 +146,7 @@ Example: {"from": "persons", "include": ["interactions"]}
146
146
  | `starts_with` | Starts with prefix (case-insensitive) | string |
147
147
  | `starts_word` | A word in the value starts with the text (case-insensitive) | string |
148
148
 
149
- `starts_word` matches the way Affinity's search matches names: `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't. Person and company field values are compared by name ("Jane Doe", "Acme"); `contains`, `contains_any` and `contains_all` on a person or company field are refused (use `starts_word`).
149
+ `starts_word` matches the way Affinity's search matches names: `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't. Person and company field values are compared by name ("Jane Doe", "Acme"), or by id when the value is a number (`{"path": "fields.Owner", "op": "eq", "value": 26229794}`); `contains`, `contains_any` and `contains_all` on a person or company field are refused (use `starts_word`).
150
150
 
151
151
  #### Collection
152
152
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "affinity-crm-mcp-unofficial",
3
3
  "description": "Affinity CRM workflows for Claude \u2014 meeting prep, pipeline review, warm intros, interaction logging, and relationship intelligence",
4
- "version": "2.0.7",
4
+ "version": "2.0.8",
5
5
  "author": {
6
6
  "name": "Yaniv Golan",
7
7
  "email": "yaniv@golan.name"
@@ -106,7 +106,7 @@ Structured query language for the `query` MCP tool. For simple lookups, prefer `
106
106
  Common operators: `eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `contains`, `starts_with`, `starts_word`, `in`, `between`, `is_null`, `is_not_null`, `has_any`, `has_all`
107
107
 
108
108
  - `starts_word`: a word in the value starts with the text, case-insensitive, the way Affinity's search matches names (`"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't).
109
- - Person and company field values are compared by name ("Jane Doe", "Acme"). `contains` / `contains_any` / `contains_all` on them is refused: use `starts_word`.
109
+ - Person and company field values are compared by name ("Jane Doe", "Acme"), or by id when the value is a number. `contains` / `contains_any` / `contains_all` on them is refused: use `starts_word`.
110
110
  - An empty multi-value field counts as empty: `is_null` matches it, `is_not_null` doesn't.
111
111
  - Name any field by id with `fields.<field id>` (e.g. `fields.affinity-data-year-founded`). When two list fields share a name (e.g. Affinity's and Dealroom's "Year Founded"), `fields.<name>` is refused with an error listing the ids; use the id. Such fields come back keyed by id.
112
112
 
@@ -23,7 +23,7 @@ Complete reference for all filter operators in the Affinity query language.
23
23
 
24
24
  `starts_word` matches the way Affinity's search matches names: `"Jan"` matches "Jane Doe" and "Mary-Jane"; `"ane"` doesn't.
25
25
 
26
- Person and company field values are compared by name ("Jane Doe", "Acme"). `contains`, `contains_any` and `contains_all` on a person or company field are refused: use `starts_word`.
26
+ Person and company field values are compared by name ("Jane Doe", "Acme"), or by id when the value is a number. `contains`, `contains_any` and `contains_all` on a person or company field are refused: use `starts_word`.
27
27
 
28
28
  ## Collection Operators
29
29
 
@@ -2,11 +2,11 @@
2
2
  "_generated": {
3
3
  "warning": "DO NOT EDIT - This file is auto-generated",
4
4
  "generator": "tools/generate_mcp_command_registry.py",
5
- "cliVersion": "2.0.6",
5
+ "cliVersion": "2.0.7",
6
6
  "sourceConfig": "mcp/.registry/mcp-commands.json"
7
7
  },
8
8
  "version": 1,
9
- "cliVersion": "2.0.6",
9
+ "cliVersion": "2.0.7",
10
10
  "commands": [
11
11
  {
12
12
  "name": "company connections",
@@ -598,7 +598,8 @@
598
598
  "--filter": {
599
599
  "type": "string",
600
600
  "required": false,
601
- "help": "Filter on company fields, applied by Affinity's search: 'field op value'. Ops: = != =~ =^ =$ > < >= <= starts_word. E.g., 'Stage = \"Seed\"'. Name search: --query."
601
+ "help": "Filter on company fields, applied by Affinity's search: 'field op value'. Ops: = != =~ =^ =$ > < >= <= starts_word. E.g., 'Stage = \"Seed\"'. Name search: --query. Repeatable: repeated values are ANDed.",
602
+ "multiple": true
602
603
  },
603
604
  "--max-results": {
604
605
  "type": "int",
@@ -2492,7 +2493,8 @@
2492
2493
  "--expand-filter": {
2493
2494
  "type": "string",
2494
2495
  "required": false,
2495
- "help": "Filter expanded entities (e.g., 'field=value' or 'field!=value')."
2496
+ "help": "Filter expanded entities (e.g., 'field=value' or 'field!=value'). Repeatable: repeated values are ANDed.",
2497
+ "multiple": true
2496
2498
  },
2497
2499
  "--expand-max-results": {
2498
2500
  "type": "int",
@@ -2522,7 +2524,8 @@
2522
2524
  "--filter": {
2523
2525
  "type": "string",
2524
2526
  "required": false,
2525
- "help": "Filter (field op value): Affinity's search applies what it can, the rest is checked locally. Quote multi-word: Status=\"Intro Meeting\"."
2527
+ "help": "Filter (field op value): Affinity's search applies what it can, the rest is checked locally. Quote multi-word: Status=\"Intro Meeting\". Repeatable: repeated values are ANDed.",
2528
+ "multiple": true
2526
2529
  },
2527
2530
  "--first-page-only": {
2528
2531
  "type": "flag",
@@ -4206,7 +4209,8 @@
4206
4209
  "--filter": {
4207
4210
  "type": "string",
4208
4211
  "required": false,
4209
- "help": "Filter on person fields, applied by Affinity's search: 'field op value'. Ops: = != =~ =^ =$ > < >= <= starts_word. E.g., 'Deals > 5'. Name/email search: --query."
4212
+ "help": "Filter on person fields, applied by Affinity's search: 'field op value'. Ops: = != =~ =^ =$ > < >= <= starts_word. E.g., 'Deals > 5'. Name/email search: --query. Repeatable: repeated values are ANDed.",
4213
+ "multiple": true
4210
4214
  },
4211
4215
  "--max-results": {
4212
4216
  "type": "int",
@@ -5,6 +5,30 @@ All notable changes to the xaffinity MCP server 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
+ ## [2.0.8] - 2026-11-03
9
+
10
+ Requires CLI 2.0.7 for repeated `--filter` / `--expand-filter` and for person and company fields
11
+ matching by id.
12
+
13
+ ### Highlights
14
+
15
+ `--filter` can be repeated (the conditions are ANDed), and person and company fields match by id;
16
+ with an older CLI a repeated `--filter` is refused rather than silently narrowed to the last one.
17
+
18
+ ### Changed
19
+
20
+ - `list export`, `company ls` and `person ls` take a repeated `--filter` (and `list export` a
21
+ repeated `--expand-filter`); the CLI ANDs the values. With a CLI older than 2.0.7, which keeps
22
+ only the last one, a repeated `--filter` / `--expand-filter` is refused with a hint to combine the
23
+ conditions with `&` or upgrade.
24
+ - The tool descriptions, data model and query-language skill say person and company field values
25
+ match by name, or by id when the value is a number (`Owner = 26229794`).
26
+
27
+ ### Fixed
28
+
29
+ - The `execute-read-command` description gave the filtered-cursor prefix as `xsearch1:`; it is
30
+ `xsearch2:`.
31
+
8
32
  ## [2.0.7] - 2026-10-14
9
33
 
10
34
  Requires CLI 2.0.5 (no new CLI requirements).
@@ -1,8 +1,16 @@
1
1
  # mcp/COMPATIBILITY - CLI version requirements for this MCP server
2
2
  # Usage: source "${SCRIPT_DIR}/COMPATIBILITY"
3
3
 
4
- CLI_MIN_VERSION="2.0.5"
5
- CLI_MAX_VERSION="2.0.5"
4
+ CLI_MIN_VERSION="2.0.7"
5
+ CLI_MAX_VERSION="2.0.7"
6
+
7
+ # MCP 2.0.8 requires CLI 2.0.7 for:
8
+ # - Repeated `--filter` on `list export`, `company ls`, `person ls` and repeated
9
+ # `list export --expand-filter` (ANDed; the registry marks them repeatable). With an older CLI
10
+ # the gateway refuses the repeat.
11
+ # - Person and company fields matching by id in `--filter` and `query` (the tool descriptions say
12
+ # so). This one can't be gated: an older CLI silently matches names only, so `Owner = <id>`
13
+ # returns no rows there.
6
14
 
7
15
  # MCP 2.0.7: no new CLI requirements (mcp-bash 1.9.6).
8
16
 
@@ -0,0 +1 @@
1
+ 2.0.8
@@ -356,6 +356,16 @@ validate_argv() {
356
356
  --hint "Remove duplicate $flag_name from argv"
357
357
  return 1
358
358
  fi
359
+ # A CLI older than 2.0.7 keeps only the last --filter / --expand-filter. Gated on
360
+ # the requirements minimum (2.0.7 or later), so a newer minimum still lets 2.0.7+ in.
361
+ if [[ "$primary_flag" == "--filter" || "$primary_flag" == "--expand-filter" ]] \
362
+ && ! _xaffinity_cli_too_old reads \
363
+ && ! version_gte "$_XAFFINITY_CLI_VERSION" "2.0.7"; then
364
+ mcp_error "validation_error" \
365
+ "Repeating $flag_name needs xaffinity CLI 2.0.7 or newer (this CLI uses only the last one)" \
366
+ --hint "Combine the conditions with & in one $flag_name, or upgrade: $_XAFFINITY_CLI_UPGRADE"
367
+ return 1
368
+ fi
359
369
  fi
360
370
  provided_flags="$provided_flags $primary_flag"
361
371
 
@@ -82,7 +82,7 @@ opportunity get "Big Deal Q1"
82
82
  ```bash
83
83
  list export Dealflow --filter 'Status="New"'
84
84
  ```
85
- Use when you know the field name and value. Affinity's search applies the conditions on list fields it can answer, so only matching entries are downloaded; the whole filter is then checked again locally.
85
+ Use when you know the field name and value. Affinity's search applies the conditions on list fields it can answer, so only matching entries are downloaded; the whole filter is then checked again locally. Repeat `--filter` to add conditions (the values are ANDed); for OR use `|` inside one value.
86
86
 
87
87
  ### --saved-view (Pre-Configured Views)
88
88
  ```bash
@@ -519,7 +519,7 @@ CLI commands use `--filter 'field op "value"'` syntax:
519
519
  Common operators: `=` `!=` `=~` (contains) `=^` (starts) `=$` (ends) `>` `<` `>=` `<=` `starts_word`
520
520
 
521
521
  - `starts_word`: a word in the value starts with the text, case-insensitive, the way Affinity's search matches names ("Jan" matches "Jane Doe" and "Mary-Jane"; "ane" doesn't).
522
- - Person and company field values are compared by name ("Jane Doe", "Acme"); `contains` on them is refused, use `starts_word`.
522
+ - Person and company field values are compared by name ("Jane Doe", "Acme"), or by id when the value is a number (`Owner = 26229794`); `contains` on them is refused, use `starts_word`.
523
523
  - An empty multi-value field counts as empty: `is null` matches it, `is not null` doesn't.
524
524
 
525
525
  For the `query` tool, use JSON operators (`eq`, `contains`, `starts_word`, `in`, etc.) - see `xaffinity://query-guide` for complete reference. The `--filter` text and the `query` `where` are the same filter language; every condition means the same in both.
@@ -13,7 +13,7 @@
13
13
  },
14
14
  {
15
15
  "name": "xaffinity",
16
- "minVersion": "2.0.5",
16
+ "minVersion": "2.0.7",
17
17
  "check": "xaffinity --version",
18
18
  "installHint": "pip install affinity-sdk"
19
19
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "xaffinity-mcp",
3
3
  "title": "xaffinity MCP",
4
- "version": "2.0.7",
4
+ "version": "2.0.8",
5
5
  "description": "MCP server for Affinity CRM - workflow management, entity lookup, relationship intelligence using xaffinity CLI",
6
6
  "env": {
7
7
  "MCPBASH_TOOL_ENV_MODE": "allowlist",