thoughtleaders-cli 0.9.17__tar.gz → 0.9.19__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 (213) hide show
  1. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.claude-plugin/plugin.json +1 -1
  2. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/AGENTS.md +1 -1
  3. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/PKG-INFO +2 -1
  4. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/README.md +1 -0
  5. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/pyproject.toml +1 -1
  6. thoughtleaders_cli-0.9.19/skills/connector-impact/SKILL.md +367 -0
  7. thoughtleaders_cli-0.9.19/skills/connector-impact/references/help.md +122 -0
  8. thoughtleaders_cli-0.9.19/skills/connector-impact/references/impact-schema.md +173 -0
  9. thoughtleaders_cli-0.9.19/skills/connector-impact/references/impact-to-tl-mapping.md +449 -0
  10. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/__init__.py +1 -1
  11. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/uv.lock +1 -1
  12. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.claude-plugin/marketplace.json +0 -0
  13. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.github/dependabot.yml +0 -0
  14. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.github/workflows/ci.yml +0 -0
  15. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.github/workflows/cli-integration.yml +0 -0
  16. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.github/workflows/python-publish.yml +0 -0
  17. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/.gitignore +0 -0
  18. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/API.md +0 -0
  19. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/CLAUDE.md +0 -0
  20. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/LICENSE +0 -0
  21. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/cast-sheet.md +0 -0
  22. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/gem-classifier.md +0 -0
  23. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/keyword-context-classifier.md +0 -0
  24. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/keyword-entity-resolver.md +0 -0
  25. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/keyword-relevance-validator.md +0 -0
  26. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/merge-shard.md +0 -0
  27. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/tl-analyst.md +0 -0
  28. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/agents/youtube-comment-classifier.md +0 -0
  29. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/hooks/hooks.json +0 -0
  30. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/hooks/scripts/load-tl-skill.mjs +0 -0
  31. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/hooks/scripts/post-usage.sh +0 -0
  32. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/hooks/scripts/pre-check.sh +0 -0
  33. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/_shared/tl_data.py +0 -0
  34. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl/SKILL.md +0 -0
  35. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl/references/business-glossary.md +0 -0
  36. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl/references/elasticsearch-schema.md +0 -0
  37. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl/references/firebolt-schema.md +0 -0
  38. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl/references/postgres-schema.md +0 -0
  39. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/SKILL.md +0 -0
  40. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/cast-sheet.md +0 -0
  41. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/creator-brief-template.md +0 -0
  42. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/cue-phrases.txt +0 -0
  43. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/evidence-rules.md +0 -0
  44. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/extractor-rubric.md +0 -0
  45. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/identity-lane.md +0 -0
  46. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/profile-spec.md +0 -0
  47. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/references/transcript-mining.md +0 -0
  48. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/assemble_extracts.py +0 -0
  49. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/authenticate.py +0 -0
  50. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/bio_lane.py +0 -0
  51. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/brand_reads.py +0 -0
  52. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/build_html.py +0 -0
  53. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/cast_sheet.py +0 -0
  54. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/channel_context.py +0 -0
  55. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/cluster_gems.py +0 -0
  56. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/extractor_prompt.py +0 -0
  57. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/fetch_cues.py +0 -0
  58. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/identity_prompt.py +0 -0
  59. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/ledger_meta.py +0 -0
  60. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/merge_pass.py +0 -0
  61. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/page.css +0 -0
  62. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/start_run.py +0 -0
  63. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/store_io.py +0 -0
  64. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/tier_hint.py +0 -0
  65. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-brand-creator-connection/scripts/verify_quotes.py +0 -0
  66. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/.gitignore +0 -0
  67. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/SKILL.md +0 -0
  68. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/references/comment-patterns.md +0 -0
  69. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/references/peer-cohort.md +0 -0
  70. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/references/red-flags.md +0 -0
  71. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/references/scoring.md +0 -0
  72. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/_io_utf8.py +0 -0
  73. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/analyze_channel.py +0 -0
  74. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/anomaly_detector.py +0 -0
  75. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/channel_lookup.py +0 -0
  76. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/comment_analyzer.py +0 -0
  77. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/comment_scraper.py +0 -0
  78. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/engagement_ratios.py +0 -0
  79. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/peer_cohort.py +0 -0
  80. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/report.py +0 -0
  81. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/resolve_channel.py +0 -0
  82. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/score.py +0 -0
  83. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/video_integrity.py +0 -0
  84. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-channel-authenticity/scripts/view_curves.py +0 -0
  85. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-create-workflow/SKILL.md +0 -0
  86. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-create-workflow/references/creating-in-app.md +0 -0
  87. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-create-workflow/references/methodology.md +0 -0
  88. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-create-workflow/references/pitfalls.md +0 -0
  89. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-create-workflow/references/workflow-model.md +0 -0
  90. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/SKILL.md +0 -0
  91. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/references/elasticsearch-content-search.md +0 -0
  92. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/references/help.md +0 -0
  93. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/build_report.py +0 -0
  94. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/expand_entities.py +0 -0
  95. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/fetch_context.py +0 -0
  96. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/probe.py +0 -0
  97. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/search_channels.py +0 -0
  98. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/search_videos.py +0 -0
  99. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-keyword-research/scripts/select_keywords.py +0 -0
  100. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/SKILL.md +0 -0
  101. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/columns_brands.md +0 -0
  102. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/columns_channels.md +0 -0
  103. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/columns_content.md +0 -0
  104. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/columns_sponsorships.md +0 -0
  105. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/intelligence_filterset_schema.json +0 -0
  106. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/intelligence_widget_schema.json +0 -0
  107. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/report_glossary.md +0 -0
  108. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/sortable_columns.json +0 -0
  109. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/sponsorship_filterset_schema.json +0 -0
  110. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/sponsorship_widget_schema.json +0 -0
  111. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-save-report/references/widgets.md +0 -0
  112. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-top-partnerships/SKILL.md +0 -0
  113. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-top-partnerships/scripts/top_partnerships.py +0 -0
  114. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-views-guarantee/SKILL.md +0 -0
  115. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/skills/tl-views-guarantee/scripts/vg.py +0 -0
  116. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/__main__.py +0 -0
  117. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/_completions.py +0 -0
  118. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/_typer_utils.py +0 -0
  119. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/auth/__init__.py +0 -0
  120. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/auth/commands.py +0 -0
  121. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/auth/login.py +0 -0
  122. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/auth/pkce.py +0 -0
  123. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/auth/token_store.py +0 -0
  124. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/client/__init__.py +0 -0
  125. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/client/errors.py +0 -0
  126. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/client/http.py +0 -0
  127. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/__init__.py +0 -0
  128. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/_comments_common.py +0 -0
  129. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/balance.py +0 -0
  130. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/brands.py +0 -0
  131. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/bulk_import.py +0 -0
  132. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/changelog.py +0 -0
  133. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/channels.py +0 -0
  134. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/credits.py +0 -0
  135. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/db.py +0 -0
  136. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/deals.py +0 -0
  137. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/describe.py +0 -0
  138. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/doctor.py +0 -0
  139. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/matches.py +0 -0
  140. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/memory.py +0 -0
  141. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/profiles.py +0 -0
  142. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/proposals.py +0 -0
  143. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/recommender.py +0 -0
  144. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/reports.py +0 -0
  145. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/schema.py +0 -0
  146. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/setup.py +0 -0
  147. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/skills.py +0 -0
  148. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/snapshots.py +0 -0
  149. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/sponsorships.py +0 -0
  150. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/uploads.py +0 -0
  151. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/whoami.py +0 -0
  152. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/commands/workflows.py +0 -0
  153. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/config.py +0 -0
  154. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/filters.py +0 -0
  155. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/hints.py +0 -0
  156. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/main.py +0 -0
  157. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/output/__init__.py +0 -0
  158. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/output/formatter.py +0 -0
  159. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/query_history.py +0 -0
  160. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/self_update.py +0 -0
  161. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/src/tl_cli/skill_registry.py +0 -0
  162. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/__init__.py +0 -0
  163. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_assemble_extracts.py +0 -0
  164. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_auth.py +0 -0
  165. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_bio_lane.py +0 -0
  166. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_brands_winner_channels.py +0 -0
  167. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_build_report.py +0 -0
  168. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_cast_sheet.py +0 -0
  169. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_channels_lookalike.py +0 -0
  170. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_cluster_gems.py +0 -0
  171. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_creator_brief_accuracy.py +0 -0
  172. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_creator_brief_scripts.py +0 -0
  173. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_db_repeat_warning.py +0 -0
  174. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_describe.py +0 -0
  175. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_error_hints.py +0 -0
  176. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_expand_entities.py +0 -0
  177. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_extractor_prompt.py +0 -0
  178. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_fetch_cues.py +0 -0
  179. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_filters.py +0 -0
  180. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_http_auth.py +0 -0
  181. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_ledger_meta.py +0 -0
  182. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_memory.py +0 -0
  183. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_merge_pass.py +0 -0
  184. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_output.py +0 -0
  185. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_probe.py +0 -0
  186. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_profiles.py +0 -0
  187. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_quota_refusal_message.py +0 -0
  188. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_refusal_rendering.py +0 -0
  189. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_reports.py +0 -0
  190. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_scripts_executable.py +0 -0
  191. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_search_channels.py +0 -0
  192. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_search_videos.py +0 -0
  193. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_select_keywords.py +0 -0
  194. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_setup.py +0 -0
  195. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_setup_marker_respect.py +0 -0
  196. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_shared_tl_data.py +0 -0
  197. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_skill_registry.py +0 -0
  198. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_skills_command.py +0 -0
  199. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_sponsorships.py +0 -0
  200. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_start_run.py +0 -0
  201. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_whoami_newsletter.py +0 -0
  202. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests/test_workflows.py +0 -0
  203. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/AGENTS.md +0 -0
  204. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/conftest.py +0 -0
  205. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_balance.py +0 -0
  206. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_db_es.py +0 -0
  207. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_db_fb.py +0 -0
  208. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_db_pg.py +0 -0
  209. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_schema.py +0 -0
  210. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tests_cli/test_whoami.py +0 -0
  211. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tools/tl-brand-creator-connection/references/cue-phrases.trained-2026-09-15.txt +0 -0
  212. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tools/tl-brand-creator-connection/references/cue-training.md +0 -0
  213. {thoughtleaders_cli-0.9.17 → thoughtleaders_cli-0.9.19}/tools/tl-brand-creator-connection/scripts/train_cues.py +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tl-cli",
3
- "version": "0.9.17",
3
+ "version": "0.9.19",
4
4
  "description": "ThoughtLeaders CLI — query sponsorship deals, channels, brands, uploads, and intelligence from the terminal",
5
5
  "author": {
6
6
  "name": "ThoughtLeaders",
@@ -53,7 +53,7 @@ This repo is also a Claude Code plugin, and can directly be installed as one.
53
53
 
54
54
  - **`tl`** — the main skill for querying ThoughtLeaders data. Default for any sponsorship / channel / brand / upload / report question.
55
55
  - **`tl-keyword-research`** — invoke whenever the user wants to find videos or channels by **content keywords** (topics, concepts, niches) that aren't covered by a curated recommender tag, OR to validate that a candidate channel's content actually touches a given topic. It expands the topic deeply (entity families, ES tokenization variants, a gated web lookup for post-cutoff names), probes each candidate (counts + samples), validates matches against the user's intent with cheap sub-agents, refines a boolean filter over **≥3 rounds**, and context-validates the channels the filter selects. Deliverable: a **validated keyword-group filter set + a clickable report link**, plus whichever results the user chooses (it asks when the request doesn't say): **trend data** — the matching videos/uploads sortable by date/views with prevalence numbers — and/or **channel targets** classified by topic intensity (core / recurring / occasional / one-off, so niche topics with no wholly-dedicated channels still get a real market: the recurring-coverage tier), sponsorability-flagged, with the rendered boolean expression recorded for reproducibility. **The user picks the path** — a quick single pass or a deep ≥3-round refinement: honor whichever the request names, ask when it names neither (never silently default); `autonomous` / `--auto` runs the deep path without pauses (otherwise it checkpoints after round 3). The keyword-distribution shape (`{operator, keywords:[{keyword,count}, …]}`) is an **opt-in mode**, produced only when the user explicitly asks for keyword counts / distribution. It also explains itself on request — "help" / "how does this work" / "what are my options" gets the built-in user guide, free, no queries run. **Do not compose keyword sets by hand for `tl db es` content searches — delegate to this skill first.** See `skills/tl/SKILL.md` → *Channel & video discovery* for the four-path decision tree and when to use this vs the recommender / raw SQL.
56
- - **`tl-save-report`**, **`adapt-tl-data`**, **`tl-views-guarantee`**, **`tl-top-partnerships`**, **`tl-brand-creator-connection`** — narrower workflows; the skill files document their own triggers. `tl-top-partnerships` is brand-user-facing: ranks a brand's sold sponsorships by live eCPM vs the sold-date projection and delivers a two-tab Google Sheet via `gws`. `tl-brand-creator-connection` mines a creator's transcripts, socials and the web for self-disclosure, builds a reusable creator profile, maps its connections to a named brand, and can write an optional creator brief for the creator — no booking assumed.
56
+ - **`tl-save-report`**, **`adapt-tl-data`**, **`tl-views-guarantee`**, **`tl-top-partnerships`**, **`tl-brand-creator-connection`**, **`connector-impact`** — narrower workflows; the skill files document their own triggers. `tl-top-partnerships` is brand-user-facing: ranks a brand's sold sponsorships by live eCPM vs the sold-date projection and delivers a two-tab Google Sheet via `gws`. `tl-brand-creator-connection` mines a creator's transcripts, socials and the web for self-disclosure, builds a reusable creator profile, maps its connections to a named brand, and can write an optional creator brief for the creator — no booking assumed. `connector-impact` joins a brand's Impact (impact.com) data to its TL sponsorships, matching each partner to a channel and reading performance against go-live dates, views and price.
57
57
 
58
58
  ### Skill content boundaries
59
59
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thoughtleaders-cli
3
- Version: 0.9.17
3
+ Version: 0.9.19
4
4
  Summary: ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence
5
5
  Project-URL: Homepage, https://thoughtleaders.io
6
6
  Project-URL: Repository, https://github.com/ThoughtLeaders-io/thoughtleaders-cli
@@ -307,6 +307,7 @@ The plugin ships several focused skills (installed by all the `tl setup *` comma
307
307
  - **`tl-channel-authenticity`** — vets a YouTube channel for non-organic views and bot/spam comments before booking (or after delivering) a sponsorship.
308
308
  - **`tl-views-guarantee`** — sizes a multi-video sponsorship buy for a channel, returning the video bundle size, views guarantee, and likelihood to hit.
309
309
  - **`tl-top-partnerships`** — brand-user performance report. Ranks a brand's sold sponsorships by live eCPM vs the sold-date projection, aggregates per channel, and delivers a two-tab Google Sheet ("By Deal" / "By Channel") via `gws`. Uses only public CLI commands (`tl whoami`, `tl sponsorships list`).
310
+ - **`connector-impact`** — joins a brand's Impact (impact.com) performance data to its TL sponsorships: each Impact partner matched to a TL channel, and performance read against the creator's go-live dates, views and price. Brand-user facing.
310
311
 
311
312
  ## Distributed skills
312
313
 
@@ -279,6 +279,7 @@ The plugin ships several focused skills (installed by all the `tl setup *` comma
279
279
  - **`tl-channel-authenticity`** — vets a YouTube channel for non-organic views and bot/spam comments before booking (or after delivering) a sponsorship.
280
280
  - **`tl-views-guarantee`** — sizes a multi-video sponsorship buy for a channel, returning the video bundle size, views guarantee, and likelihood to hit.
281
281
  - **`tl-top-partnerships`** — brand-user performance report. Ranks a brand's sold sponsorships by live eCPM vs the sold-date projection, aggregates per channel, and delivers a two-tab Google Sheet ("By Deal" / "By Channel") via `gws`. Uses only public CLI commands (`tl whoami`, `tl sponsorships list`).
282
+ - **`connector-impact`** — joins a brand's Impact (impact.com) performance data to its TL sponsorships: each Impact partner matched to a TL channel, and performance read against the creator's go-live dates, views and price. Brand-user facing.
282
283
 
283
284
  ## Distributed skills
284
285
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "thoughtleaders-cli"
7
- version = "0.9.17"
7
+ version = "0.9.19"
8
8
  description = "ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,367 @@
1
+ ---
2
+ name: connector-impact
3
+ tl-blurb: join Impact performance data to TL sponsorships
4
+ description: |
5
+ Join a brand's Impact (impact.com) data to ThoughtLeaders data: each Impact partner matched to a
6
+ TL channel and, where Impact can tell videos apart, to the exact TL sponsorship; otherwise a
7
+ go-live timeline of the creator's TL videos against Impact results. TL views, price and CPM sit
8
+ beside Impact clicks, actions, sales revenue and commission. Also covers creators the brand
9
+ never booked through TL, and brands with no TL bookings. Brand side only: a media-buyer `tl`
10
+ login and a brand (advertiser) Impact account. Invoke when the user wants Impact numbers read
11
+ against TL data: "how did our sponsorships convert in Impact", "Impact performance for
12
+ [creator/brand]", "which TL creators drove the most actions", "actions per 1,000 views",
13
+ "cost per action on our sponsorships", "is [creator] declining", "match Impact partners to our
14
+ channels", "what does [Impact term] mean in TL", or any question mixing Impact terms (Partner,
15
+ Action, Action Cost, Total Cost, Program, PromoCode, SharedId) with TL data. The user supplies
16
+ the Impact connection (Impact MCP, Impact API, CSV export or the Impact web app) and a `tl` login. Asks which view
17
+ (deal scorecard, creator rollup, decay over time) when the request doesn't say. Also invoke for
18
+ help asks about this skill; answered from the guide, no queries run.
19
+ ---
20
+
21
+ # connector-impact
22
+
23
+ Impact records what happened after the click (clicks, actions, sales revenue, commission). TL
24
+ records what happened before it (creator, video, go-live date, views, price). This skill
25
+ translates Impact terms into TL terms and joins the two datasets.
26
+
27
+ Read before any analysis:
28
+ - `references/impact-to-tl-mapping.md`: vocabulary, metric rules, join keys, dates, costs, currency.
29
+ - `references/impact-schema.md`: Impact objects, fields, filters and traps.
30
+ - TL fields: the `tl` skill's `business-glossary.md` and `postgres-schema.md`;
31
+ `elasticsearch-schema.md` for video lookups.
32
+
33
+ ## When to use
34
+
35
+ Use when a question needs both Impact and TL data, or Impact terms translated into TL terms,
36
+ including for a brand with no TL bookings.
37
+
38
+ Do not use:
39
+ - Impact-only question with no TL angle: tell the user Impact's MCP answers it directly.
40
+ - TL-only question: use the `tl` skill.
41
+ - Renew / don't-renew verdict: build the join here, then apply the renewal rule in the `tl`
42
+ skill's `references/business-glossary.md` (*Performance Grade*). This skill sets no grade.
43
+
44
+ ## Help mode
45
+
46
+ IF the user asks what the skill does, how it works or what they can ask: run no queries, answer
47
+ from `references/help.md` sized to the question, then offer to start. Answer mid-run term
48
+ questions from `help.md` or the mapping file, then continue the run.
49
+
50
+ ## Scope and view
51
+
52
+ - **Scope:** brand; creators (default: all); window. IF the user states a window ("last 12
53
+ months"), use it as stated, counted back from today. ELSE default: the earliest sold deal
54
+ `publish_date` in the last 12 months, to today.
55
+ - **Views** (any combination):
56
+ - *Deal scorecard:* one row per sold sponsorship where Impact can tell the videos apart,
57
+ otherwise the go-live timeline (mapping 4).
58
+ - *Creator rollup:* one row per channel across its deals for the brand.
59
+ - *Decay over time:* the go-live timeline week by week, go-live weeks marked.
60
+ - IF the request names a view by name ("deal scorecard", "creator rollup", "decay over time"),
61
+ run only the named views, without asking. ELSE IF it uses these words, run the matching view:
62
+ - "per deal", "scorecard", "how did each sponsorship do" → deal scorecard
63
+ - "which creators", "top partners", "rank" → creator rollup
64
+ - "declining", "over time", "since it went live", "renew" → decay over time
65
+ - ELSE ask ONE question covering every unstated item (view, brand, window), one line per view on
66
+ what it shows. Never default silently.
67
+ - IF `autonomous`, `--auto` or "don't stop to ask": all three views, default window, no questions.
68
+ - IF the user explicitly asks to include pending for this run: count pending actions in the
69
+ headline numbers, label both states, and do not ask. This holds even beside a standing line
70
+ such as "keep pending separate unless I ask"; the explicit request wins. Interpret the request's
71
+ meaning: "do not include pending" or a standing "unless I ask to include pending" rule does
72
+ not enable pending by itself.
73
+
74
+ ## Workflow
75
+
76
+ At each stage transition, state one line: what you are doing and the counts so far. Report each
77
+ unmatched partner, dropped row and currency mismatch when it is found.
78
+
79
+ Aggregate at the source: `GROUP BY` in TL SQL, grouped `query_performance` in Impact. Compute
80
+ every sum and ratio with a calculation (SQL or a quick code step), never by hand.
81
+
82
+ **Open with a number, before any call at all.** The exact cost needs the row count, and the row
83
+ count needs a read — so do not wait for it. State the **ceiling** first: the balance from
84
+ `tl balance`, the rate (0.3 credits a sponsorship row), and the worst case this run could reach
85
+ against the user's ceiling if they gave one. A user who sees tool calls begin before hearing any
86
+ number has no moment to stop the run.
87
+
88
+ **One probe, named in advance, is the only charged call allowed before the exact quote.** The row
89
+ count comes from a single bounded read — `tl sponsorships list` scoped to the brand with
90
+ `--limit 1`, which returns `total` for 0.3 credits. Name that call and its cost in the opening
91
+ line, make it, then give the exact estimate before the real pull begins. Nothing else may be
92
+ charged before that estimate: no full first page, no raw SQL to resolve a creator, no
93
+ `--pricing` preview. Creator resolution happens inside the scoped pull, after the quote, not
94
+ before it.
95
+
96
+ **Then quote, then read.** Give the estimate in credits beside the balance. IF it is above the
97
+ user's stated ceiling, or above a tenth of the balance, stop and ask before reading. `tl db pg
98
+ --pricing` / `tl db es --pricing` return a per-row rate and an upper-bound cost without running
99
+ the query (1 credit each) — use them to price a raw read, after the estimate, never as a
100
+ substitute for it. Keep a running ledger from each response's `usage.credits_charged`, **failed
101
+ reads included** — a read that errors is charged like any other — and report the total with the
102
+ results. Write "credits"; never "cr".
103
+
104
+ **Page every read to the end.** Every `tl db pg` call carries both `LIMIT` and `OFFSET`, every
105
+ `tl db es` body both `size` and `from`, and every page walks the envelope's `next_offset` until
106
+ `has_more` is false. `tl sponsorships list` serves at most 500 rows a page whatever `--limit`
107
+ asks for, so page it the same way.
108
+
109
+ **Refuse loudly on truncation.** IF any read comes back short of its `total` — a page cap, a
110
+ rejected offset, an error mid-walk — stop the run, name the read and how many rows are missing,
111
+ and ask before going on. Never answer short: a creator silently dropped from the deal set is
112
+ classified "not booked through TL", and the report then quotes what the brand paid through
113
+ Impact as the source of truth — a confidently wrong cost figure with no error anywhere.
114
+
115
+ **Personal data stays out.** Never copy a partner's `Contacts[]` into output, and never carry an
116
+ action's customer-level fields — `CustomerId`, `CustomerStatus`, `CustomerCountry`,
117
+ `CustomerRegion`, `CustomerCity`, `Oid`, `Note` — into a table, a note or a calculation. The
118
+ deliverable is per partner and per deal; nothing below that grain leaves Impact.
119
+
120
+ ### 0. Setup
121
+
122
+ 1. Run `tl whoami --json` to confirm the TL login works and read the caller's side from
123
+ `profile.persona` and `profile.flags`.
124
+ 2. **Seller-side login: stop here.** IF the caller is a publisher / media seller — persona
125
+ creator or creator service, or `publisher` in `flags` without `advertiser` — refuse the run
126
+ and say why: this skill reads a brand's affiliate program against the deals that brand bought,
127
+ and a seller-side login returns the creator's own deals instead. The run would finish and
128
+ produce a complete, plausible report of the wrong org's spend with no error anywhere. A
129
+ media-buyer login is required.
130
+ 3. Confirm the user's Impact route (schema: *Access routes*). IF none: list the four routes and stop.
131
+ 4. Never ask for, accept or repeat an Impact token or password. IF the user pastes one, tell them
132
+ to revoke it.
133
+ 5. **The supported direction is brand → partners.** Identify the account from the API base or the
134
+ web app address (mapping 5). A Brand account (`/Advertisers/`, `/secure/advertiser/`) is the
135
+ only connection this skill runs. IF it is a Partner account, stop and say so: mapping 5's
136
+ Partner column is reference for reading a partner's own figures, not a flow. IF the account
137
+ type differs from the one the user described, stop and tell the user.
138
+ 6. Resolve the brand with `tl brands find "<name>"`. Never match brand names in SQL.
139
+ 7. IF creators are named, resolve them to TL channel ids now (stage 1), before any deal read.
140
+ 8. Record the currency the Impact figures are in. TL prices are always USD, and the report is in
141
+ USD. On a report, the figures' currency is its display-currency setting; do not change it. IF
142
+ the Impact figures are not in USD (usually EUR), tell the user now and apply mapping 2.3.
143
+ 9. Quote the run's credit cost (above), then state the scope back: brand, creators, window, view,
144
+ the selected headline states with approved and pending labelled separately, currencies.
145
+
146
+ ### 1. TL side
147
+
148
+ Pull the brand's sold deals with `tl sponsorships list`. No date filter: videos that went live
149
+ before the window still drive sales inside it (mapping 4.2), and sold deals with no
150
+ `publish_date` belong in the report too (4.2).
151
+
152
+ ```bash
153
+ tl sponsorships list status:sold brand:"<brand name>" --limit 500 --offset 0 --json
154
+ ```
155
+
156
+ - IF creators are named: resolve each to its TL channel ids first, then run one paged pull per
157
+ id with `channel:<channel_id>` added. Never pull the brand's whole book and filter in memory.
158
+ Resolve by exact match, `UPPER()` on both sides — the bulk form in the `tl` skill's
159
+ `references/postgres-schema.md`, under *For bulk handle/name lookups in SQL* — on the channel
160
+ name, the handle, the handle in `url`, and the creator's named platform handles, against other
161
+ records' `common_name` and `url`. IF more than one record matches, list them with their URLs
162
+ and ask which to include; "all" means one creator across platforms.
163
+ - Project **named platform keys only** out of a channel's `social_links` (`youtube`, `tiktok`,
164
+ `instagram`, …), never the whole object and never its `_emails` array, which holds creators'
165
+ personal e-mail addresses. That array is never selected, never printed and never passed into a
166
+ calculation. The Elasticsearch mirror of the field is sanitised and is the safer source.
167
+ - The rows carry `id`, `publish_date`, `price`, `projected_views_at_purchase_date`, `article_id`,
168
+ `channel_id`, `channel`, `common_name`, `brand_id`, `status`, `cpm` and `views`. TL views come
169
+ from here; the video index is only the fallback below.
170
+ - `brand:` is a partial name match. Check every row's `brand_id` against the id resolved in
171
+ setup; name any row that does not match and leave it out.
172
+ - Partition the pull: deals live on or before the window end feed the scorecard or timeline;
173
+ sold deals with no `publish_date` are not live and are listed under the table (mapping 4.2);
174
+ deals live after the window end are outside it — report their count.
175
+ - IF no rows: continue. Every partner goes to "not booked through TL" or "not a TL creator"
176
+ (mapping 4.4).
177
+
178
+ Then one adlink-only read for the Impact join keys and currency columns the list does not carry,
179
+ keyed on the deal ids already pulled:
180
+
181
+ ```sql
182
+ SELECT al.id, al.tracking_url, al.media_url, al.price_currency,
183
+ al.conversions, al.revenue, al.revenue_currency
184
+ FROM thoughtleaders_adlink al
185
+ WHERE al.id IN (<deal ids>)
186
+ LIMIT 500 OFFSET 0
187
+ ```
188
+
189
+ Join the two result sets on deal id.
190
+
191
+ - Send at most 500 ids a call and reconcile the ids returned against the ids sent. An id with no
192
+ row back is a truncated read, not a deal without join keys.
193
+ - No join to `thoughtleaders_profile_brands`, `thoughtleaders_adspot` or
194
+ `thoughtleaders_channel`: the deal rows are already brand- and org-scoped, and every table a
195
+ query touches is charged on every row it returns.
196
+ - Select from `thoughtleaders_adlink` only, and only the columns above. A caller's raw-DB access
197
+ runs against a restricted schema holding fewer columns than `tl schema pg` reports, so a column
198
+ confirmed there still fails at execution with `column does not exist`. Do not widen the select
199
+ to find a field; if the join needs one that is not here, say so and stop.
200
+ - TL stores no promo code, so a code is never a deal key: per-video evidence comes from the
201
+ tracking link, a `SharedId` or SubId carrying a TL deal id, or an Ad that names one video
202
+ (mapping 3.3). Impact's own codes still reach the creator (3.2 key 5) and drive 3.4.
203
+ - A TL deal carries no platform in scope. Lanes come from Impact's own platform split
204
+ (mapping 4.5); a deal with no TL views is listed as such whatever format it ran in (1.4).
205
+ - `publish_date` is a timestamp. In SQL bound a window end with `< <the day after the window
206
+ end>`, never `<= <window end>`, which resolves to midnight and drops the final day.
207
+ `tl sponsorships list`'s `publish-date-end` is inclusive by date and needs no adjustment.
208
+ - Run the coverage count (mapping 3.5) and tell the user which deal keys this brand's deals
209
+ have. It is brand-wide even when creators are named: label it so. Quote its cost with the rest
210
+ of the run. IF the keys are thin, the result is a go-live timeline (4.2).
211
+
212
+ The `views` on a deal row is the video-index value (mapping 1.4). Deals the list returns no
213
+ `views` for are looked up in the index once, by video id, before any of them is called "no TL
214
+ views":
215
+
216
+ > A deal's video id is its `article_id`. IF `article_id` is empty, build it as
217
+ > `<channel_id>:<youtube_id>`, where `<youtube_id>` is the `v=` value in `media_url` (the video
218
+ > link; `urls` holds destination links). The bare `v=` value alone never matches. IF `media_url`
219
+ > carries no `v=` value — it can hold a link that is not a YouTube video — the deal has no video
220
+ > id and therefore no TL views. Never guess an id from the rest of the link.
221
+
222
+ ```bash
223
+ tl db es '{"size": <number of ids>, "from": 0, "query": {"terms": {"id": ["<video id>", "..."]}},
224
+ "_source": ["id", "views", "projected_views", "publication_date"]}' --json
225
+ ```
226
+
227
+ > A deal has TL views if and only if its video id resolved to a video-index document carrying a
228
+ > `views` value. A deal whose id does not resolve, or whose document carries no `views` field, is
229
+ > listed as "no TL views" and left out of views, CPM and per-1,000-view figures; its price still
230
+ > counts in Paid to TL.
231
+
232
+ ### 2. Impact side
233
+
234
+ 1. Partners: id, name, website, property URLs (`list_partners`, `GET .../MediaPartners`, or the
235
+ Partners screen search; report partner filters are capped). IF creators are named, search
236
+ only for those creators' partners, by their aliases (mapping 3.1).
237
+ 2. Action-level data for the partners in scope (Advanced Action Listing, or `GET .../Actions`
238
+ filtered with `ActionDateStart` / `ActionDateEnd`): date, status, event type, promo code, Ad,
239
+ SubIds, SharedId, social platform, sale amount, commission. Group by partner, date, status and
240
+ event type. This is the source of actions, sales revenue and commission.
241
+ 3. Clicks per partner per day from grouped performance (`query_performance`, ReportExport, or a
242
+ Performance by Partner / by Day report).
243
+ 4. Map every column to its name in the schema's *Field names by route* table before any math.
244
+ Name any column not in it before using it.
245
+
246
+ Web app route: before reading a report, set its filters (dates, status, partner, channel) to the
247
+ run's scope and add any needed column that the view does not return, on screen only. Never save,
248
+ schedule, export or download.
249
+
250
+ IF the route returns lifetime totals only, tell the user decay over time is unavailable.
251
+
252
+ ### 3. Join
253
+
254
+ Walk each partner in scope down the creator ladder (mapping 3.2), then look for per-video
255
+ evidence (mapping 3.3). Record `partner_id, channel_id(s), key, confidence` and the partner's
256
+ group (mapping 4.4).
257
+
258
+ - Match aliases exactly, `UPPER()` on both sides, with the bulk handle/name form named in stage
259
+ 1. This lookup adds nothing to TL. Never `ILIKE` on names.
260
+ - A partner that matches no alias: group "not a TL creator".
261
+ - IF a creator named in scope has no matching partner: stop and ask the user for the creator's
262
+ partner name or promo code in Impact.
263
+ - Run `tl channels find` only on a channel TL already has or on a link the user gave. On an
264
+ unknown channel it queues the channel for indexing.
265
+ - IF a YouTube creator is not in TL: ask the user for the channel link, add it with
266
+ `tl channels find "<link>"`, tell the user TL data for it takes about a day, and report that
267
+ creator from Impact only until then.
268
+ - Medium and weak keys need a second signal (mapping 3.2), or the match is listed as "probable,
269
+ please confirm".
270
+ - A partner whose keys point to different creators is an agency. Split by tracking link or ask.
271
+ Never assign an agency's actions to one creator. Several TL records of one creator are not an
272
+ agency.
273
+ - Never open a tracking link: it registers a click in the brand's account.
274
+ - IF a partner matches more than one TL channel: IF it has approved actions in the window, show
275
+ the candidates with evidence and ask which to include ("all" means one creator across
276
+ platforms); ELSE list it as unresolved without asking.
277
+ - List actions that used the creator's promo codes but are credited to another partner (mapping
278
+ 3.4).
279
+ - Use only promo codes that appear on Impact actions. Never build a code from a creator's name to
280
+ search for, and never call a code the creator's unless it is on their own actions. IF their
281
+ actions carry no code, say so.
282
+ - List TL deals with no Impact partner, with the likely reason.
283
+
284
+ ### 4. Dates
285
+
286
+ Apply mapping 4: per-deal windows only with per-video evidence (4.1), otherwise the go-live
287
+ timeline (4.2); social platforms per 4.5; for creators not booked through TL, the user confirms
288
+ which videos they paid for (4.4). Build periods by summing each partner's daily numbers between
289
+ go-live dates.
290
+
291
+ ### 5. Metrics
292
+
293
+ Apply mapping 2. IF a TL deal already has `conversions` or `revenue` that differs from Impact,
294
+ show both, labelled; never overwrite or average.
295
+
296
+ ### 6. Deliver
297
+
298
+ In this order:
299
+ 1. Scope line: brand, window, states, currencies and conversion rates used, Impact route, and
300
+ the credits this run charged.
301
+ 2. The chosen views as tables, each followed by its breakdown table and its "All-in cost to
302
+ date" block (mapping 2.2).
303
+ Label every figure TL or Impact, and every money column with its currency.
304
+ 3. Join table: partner → channel → deal, key, confidence.
305
+ 4. Creators not booked through TL, then partners that are not TL creators, then TL deals with no
306
+ partner, then sold deals not yet live.
307
+ 5. Caveats that change the reading: pending share, rates used, shared links (periods, not
308
+ videos), deals with no TL views (mapping 1.4), the creator's codes credited to other partners,
309
+ agencies, low-confidence matches.
310
+
311
+ **Last-click caveat.** Every cost per action, return on sponsorship and all-in return carries,
312
+ beside it or directly under the block it sits in, the note that these come from last-click credit
313
+ in the brand's own affiliate account: they count only the sales that closed through the partner's
314
+ link or code, and miss every sale the video caused that did not route through it. Naming the
315
+ attribution model in the scope line does not cover the figures; the caveat travels with them.
316
+
317
+ This covers **every** such figure, not only the one in the main table: a headline or summary
318
+ figure stated above the table, an alternative or second-basis figure stated below it, and a figure
319
+ repeated in a narrative sentence each need the caveat with them. A caveat under a later table does
320
+ not reach a number quoted earlier — the reader meets the figure first. Where the same caveat would
321
+ repeat several times in one section, mark each figure and carry one note for the section, placed
322
+ where a reader meets the first of them.
323
+
324
+ Deliver final figures only. IF a figure changes while you write, replace it: no old figure,
325
+ arrow or "correction" note stays in the report.
326
+
327
+ Use business terms from the `tl` glossary, not table names. IF the user asks for a chart, render
328
+ it as SVG.
329
+
330
+ Write nothing to Impact or TL, set no performance grade, edit no sheet. The only TL write is a
331
+ channel added from a link the user gave. IF the user wants results saved, offer and wait for a yes.
332
+
333
+ ## Self-check before finishing
334
+
335
+ 1. No Impact credential passed through chat.
336
+ 2. The view came from the request or the user's answer (all three under autonomous mode). Scope
337
+ was stated back.
338
+ 3. The caller is a media buyer and the Impact account is a Brand account; a seller-side login or
339
+ a Partner account stopped the run at setup.
340
+ 4. A ceiling in credits was stated before any call; the only charge before the exact estimate was
341
+ the single named row-count probe; the estimate came before the pull; and the ledger reported
342
+ with the results counts every read, failed ones included.
343
+ 5. Every read was paged to the end against its `total`. A truncated read stopped the run and was
344
+ named; nothing was answered short.
345
+ 6. No creator e-mail address was read or printed, no `Contacts[]`, no customer-level action field.
346
+ 7. The coverage count was reported, with the scope it covers named.
347
+ 8. Every partner in scope has a key, a confidence and a group. No name `ILIKE`, no tracking link
348
+ opened, no `tl channels find` on an unknown name, agencies split or asked.
349
+ 9. Every deal's TL views came from a resolved video-index document carrying a `views` value; the
350
+ rest are listed as "no TL views" with their prices still in Paid to TL.
351
+ 10. Performance is tied to one deal only where per-video evidence exists. Otherwise it is a
352
+ go-live timeline with the period sentence above it (mapping 4.2).
353
+ 11. Every cost per action, return on sponsorship and all-in return carries the last-click caveat
354
+ beside the figure — summary figures above the table and alternative figures below it included,
355
+ not only the one in the main table.
356
+ 12. Every money cell names its currency, including a cell reading 0 and a cell in a row that is
357
+ otherwise empty: a bare `0` does not say which currency it is zero of. A currency named once
358
+ in the table's title covers the table.
359
+ 13. Mapping 2 holds: views from TL only; Paid to TL and commission in separate columns; all-in
360
+ figures only in the to-date block; Impact money not in USD is shown in USD at a shown ECB
361
+ monthly rate, with the original beside it, or flagged when conversion is unavailable; the
362
+ TL price is never converted, and unexpected price currencies follow mapping 2.3.
363
+ 14. Promo-code sales count like link sales: approved actions state the observed promo-code split
364
+ in the table and the opening summary, with attribution labels only where Impact supplies
365
+ evidence (mapping 2.2); a held-back conversion rate points to actions per 1,000 views when
366
+ available; a creator with codes credited to other partners has the "including" line
367
+ (mapping 2, 2.2, 3.4).
@@ -0,0 +1,122 @@
1
+ # Impact connector: user guide
2
+
3
+ Present this in plain language, sized to the question. Run no queries in help mode.
4
+
5
+ ## What it does
6
+
7
+ Impact shows what happened after someone clicked a creator's link: clicks, sales, revenue,
8
+ commission. ThoughtLeaders shows what happened before: which creator, which video, when it went
9
+ live, views, what the sponsorship cost. This skill lines the two up, so you can ask things like
10
+ "which of our sponsorships drove the most sales per 1,000 views?"
11
+
12
+ ## What you need
13
+
14
+ This reads your own brand's Impact account. If you're a creator rather than a brand, this isn't
15
+ the right tool for you.
16
+
17
+ - Your TL login (the `tl` CLI).
18
+ - One way into Impact:
19
+ - Impact's connector for Claude (recommended): add a custom connector with the URL
20
+ `https://mcp.impact.com/mcp`, enter `mcp-impact-claude` as the OAuth client ID under
21
+ Advanced settings, and sign in with your Impact login.
22
+ - The Impact API, with a read-only token you create in Impact (Settings → Technical → API).
23
+ - A CSV export from Impact's Reports (Performance by Partner or by Day), dropped into the chat.
24
+ - The Impact website, open and signed in in your browser. Slowest, but no setup.
25
+
26
+ Never paste an Impact password or token into the chat.
27
+
28
+ ## What you get
29
+
30
+ Always: a match list of each Impact partner to its TL channel, how it was matched and how sure
31
+ the match is. Each partner is in one group: booked through TL, a creator TL knows but you booked
32
+ elsewhere, or not a TL creator (coupon sites, blogs).
33
+
34
+ Your choice of views (you'll be asked if you don't say):
35
+ - **Deal scorecard:** one row per sponsorship, or a go-live timeline when all the creator's
36
+ videos share one link.
37
+ - **Creator rollup:** one row per creator across their sponsorships.
38
+ - **Decay over time:** week by week after each video went live, to see whether a creator is
39
+ declining. Impact's all-time totals hide this.
40
+
41
+ Every number above comes from last-click credit in your own Impact account: it counts sales that
42
+ arrived through the creator's link, not sales the video caused that reached you some other way.
43
+ Treat these figures as a floor on what a sponsorship did, not a verdict on it.
44
+
45
+ ## How matching works
46
+
47
+ In order: the tracking link, the links on the Impact partner's profile, the creator's handles on
48
+ any platform, a TL id stored in the link, a promo code containing the creator's name, and last the
49
+ partner's name. The weaker matches are double-checked, for example against the date of the first
50
+ TL video. If a partner could be more than one TL channel, you're asked which to include.
51
+
52
+ YouTube, TikTok and Instagram deals for the same creator are read together, as one creator.
53
+ TikTok and Instagram posts have no TL views, so they're listed but left out of view-based
54
+ figures. If TL doesn't have a creator's channel yet, you'll be asked for the link; their
55
+ TL data takes about a day to fill in.
56
+
57
+ ## Dates
58
+
59
+ - If each video has its own link or code, results are tied to that exact sponsorship.
60
+ - If all the videos share one link (common, but not always), you get a go-live timeline: each
61
+ date the creator went live for you, and what Impact recorded until the next go-live. Earlier
62
+ videos were still live during each period. A video that went live before your date range is
63
+ included, since it can still bring in sales.
64
+ - When some videos have their own link and others share one, the ones with their own link are
65
+ reported individually and the rest are reported as periods.
66
+ - Sales you can still cancel ("pending") are shown next to approved ones and marked "may still
67
+ change".
68
+
69
+ ## Costs and currencies
70
+
71
+ - **Booked through TL:** the TL price is the source of truth.
72
+ - **Never booked through TL:** what you paid through Impact is the source of truth. You'll be
73
+ shown the creator's videos that mention your brand and asked which ones you paid for. You then
74
+ get the CPM on what you paid, and whether the creator's projected views have risen or fallen
75
+ since.
76
+ - The TL price and the Impact commission are always shown separately. They're added together
77
+ only in an "All-in cost to date" box under the table, over the same videos and dates, with an
78
+ as-of date.
79
+ - Everything is reported in US dollars, because TL prices are always in USD. If your Impact
80
+ account shows another currency, such as euros, those figures are converted to USD at the
81
+ European Central Bank's monthly average rate, with the original amount and the rate shown.
82
+ The TL price is never converted. If a TL deal unexpectedly records another currency, you'll
83
+ see that price in its recorded currency and affected USD figures will wait for confirmation.
84
+
85
+ Costs and CPMs here are last-click numbers from your own Impact account: they count sales that
86
+ arrived through the creator's link, not sales the video may have driven some other way. They're a
87
+ floor on what a sponsorship did, not the full picture.
88
+
89
+ ## Impact terms in TL language
90
+
91
+ | Impact says | TL meaning |
92
+ |---|---|
93
+ | Partner | The creator or channel (sometimes an agency with several) |
94
+ | Program (or Campaign) | Your affiliate program, not a TL campaign |
95
+ | Action | A conversion: sale, sign-up or install |
96
+ | Revenue | Your sales, not TL revenue |
97
+ | Action Cost | Commission paid to the creator through Impact, not the TL price |
98
+ | Total Cost | That commission plus per-click payments, bonuses, make-good and fixed payments made through Impact. No Impact platform fee |
99
+ | Ad | A tracking link or creative, not a TL ad spot |
100
+ | Contract | Commission terms, not a TL IO |
101
+
102
+ Views always come from TL; Impact doesn't track them.
103
+
104
+ ## What you can say
105
+
106
+ | You say | Result |
107
+ |---|---|
108
+ | "per deal" / "scorecard" | Deal scorecard |
109
+ | "which creators" / "top partners" | Creator rollup |
110
+ | "is it declining" / "over time" / "for the renewal" | Decay over time |
111
+ | "week by week" | Timeline by week, go-lives marked |
112
+ | "all of it" / "run autonomously" | All three views, no questions |
113
+ | "since June" / "last 90 days" | Date window |
114
+ | "include pending" | Pending counted in the headline |
115
+ | "just [creator]" | Limited to named creators |
116
+
117
+ ## Example prompts
118
+
119
+ - "Match our Impact partners to TL channels for [brand]"
120
+ - "Deal scorecard for [brand] since June, approved actions only"
121
+ - "Is [creator] declining for [brand]? Show actions by week after each video"
122
+ - "What's the difference between Action Cost and Total Cost?"