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