thoughtleaders-cli 0.7.6__tar.gz → 0.7.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/.claude-plugin/plugin.json +1 -1
  2. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/PKG-INFO +6 -2
  3. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/README.md +5 -1
  4. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/pyproject.toml +1 -1
  5. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl/SKILL.md +1 -0
  6. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/__init__.py +1 -1
  7. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/auth/commands.py +1 -3
  8. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/auth/login.py +1 -1
  9. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/recommender.py +48 -0
  10. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/.claude-plugin/marketplace.json +0 -0
  11. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/.github/workflows/python-publish.yml +0 -0
  12. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/.gitignore +0 -0
  13. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/AGENTS.md +0 -0
  14. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/API.md +0 -0
  15. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/CLAUDE.md +0 -0
  16. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/LICENSE +0 -0
  17. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/agents/tl-analyst.md +0 -0
  18. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/agents/youtube-comment-classifier.md +0 -0
  19. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/hooks/hooks.json +0 -0
  20. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/hooks/scripts/load-tl-skill.mjs +0 -0
  21. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/hooks/scripts/post-usage.sh +0 -0
  22. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/hooks/scripts/pre-check.sh +0 -0
  23. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl/references/business-glossary.md +0 -0
  24. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl/references/elasticsearch-schema.md +0 -0
  25. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl/references/firebolt-schema.md +0 -0
  26. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl/references/postgres-schema.md +0 -0
  27. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/.gitignore +0 -0
  28. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/SKILL.md +0 -0
  29. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/references/comment-patterns.md +0 -0
  30. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/references/peer-cohort.md +0 -0
  31. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/references/red-flags.md +0 -0
  32. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/references/scoring.md +0 -0
  33. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/_io_utf8.py +0 -0
  34. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/analyze_channel.py +0 -0
  35. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/anomaly_detector.py +0 -0
  36. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/comment_analyzer.py +0 -0
  37. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/comment_scraper.py +0 -0
  38. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/engagement_ratios.py +0 -0
  39. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/peer_cohort.py +0 -0
  40. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/report.py +0 -0
  41. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/resolve_channel.py +0 -0
  42. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/score.py +0 -0
  43. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/tl_cli.py +0 -0
  44. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/video_integrity.py +0 -0
  45. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-channel-authenticity/scripts/view_curves.py +0 -0
  46. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-import/SKILL.md +0 -0
  47. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-keyword-research/SKILL.md +0 -0
  48. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-keyword-research/scripts/probe.py +0 -0
  49. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/SKILL.md +0 -0
  50. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/examples/e2e_findings.md +0 -0
  51. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/examples/golden_queries.md +0 -0
  52. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/columns_brands.md +0 -0
  53. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/columns_channels.md +0 -0
  54. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/columns_content.md +0 -0
  55. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/columns_sponsorships.md +0 -0
  56. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/intelligence_filterset_schema.json +0 -0
  57. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/intelligence_widget_schema.json +0 -0
  58. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/report_glossary.md +0 -0
  59. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/sortable_columns.json +0 -0
  60. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/sponsorship_filterset_schema.json +0 -0
  61. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/sponsorship_widget_schema.json +0 -0
  62. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/references/widgets.md +0 -0
  63. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/column_builder.md +0 -0
  64. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/database_query.md +0 -0
  65. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/name_resolver.md +0 -0
  66. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/sample_judge.md +0 -0
  67. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/similar_channels.md +0 -0
  68. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/topic_matcher.md +0 -0
  69. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-report-builder/tools/widget_builder.md +0 -0
  70. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/SKILL.md +0 -0
  71. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/columns_brands.md +0 -0
  72. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/columns_channels.md +0 -0
  73. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/columns_content.md +0 -0
  74. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/columns_sponsorships.md +0 -0
  75. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/intelligence_filterset_schema.json +0 -0
  76. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/intelligence_widget_schema.json +0 -0
  77. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/report_glossary.md +0 -0
  78. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/sortable_columns.json +0 -0
  79. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/sponsorship_filterset_schema.json +0 -0
  80. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/sponsorship_widget_schema.json +0 -0
  81. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-save-report/references/widgets.md +0 -0
  82. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-top-partnerships/SKILL.md +0 -0
  83. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-top-partnerships/scripts/top_partnerships.py +0 -0
  84. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-views-guarantee/SKILL.md +0 -0
  85. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/skills/tl-views-guarantee/scripts/vg.py +0 -0
  86. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/_completions.py +0 -0
  87. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/_typer_utils.py +0 -0
  88. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/auth/__init__.py +0 -0
  89. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/auth/pkce.py +0 -0
  90. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/auth/token_store.py +0 -0
  91. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/client/__init__.py +0 -0
  92. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/client/errors.py +0 -0
  93. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/client/http.py +0 -0
  94. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/__init__.py +0 -0
  95. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/_comments_common.py +0 -0
  96. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/balance.py +0 -0
  97. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/brands.py +0 -0
  98. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/bulk_import.py +0 -0
  99. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/changelog.py +0 -0
  100. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/channels.py +0 -0
  101. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/credits.py +0 -0
  102. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/db.py +0 -0
  103. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/deals.py +0 -0
  104. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/describe.py +0 -0
  105. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/doctor.py +0 -0
  106. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/matches.py +0 -0
  107. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/proposals.py +0 -0
  108. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/reports.py +0 -0
  109. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/schema.py +0 -0
  110. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/setup.py +0 -0
  111. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/snapshots.py +0 -0
  112. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/sponsorships.py +0 -0
  113. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/uploads.py +0 -0
  114. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/commands/whoami.py +0 -0
  115. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/config.py +0 -0
  116. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/filters.py +0 -0
  117. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/hints.py +0 -0
  118. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/main.py +0 -0
  119. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/output/__init__.py +0 -0
  120. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/output/formatter.py +0 -0
  121. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/src/tl_cli/self_update.py +0 -0
  122. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/__init__.py +0 -0
  123. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_auth.py +0 -0
  124. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_describe.py +0 -0
  125. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_filters.py +0 -0
  126. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_http_auth.py +0 -0
  127. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_output.py +0 -0
  128. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_reports.py +0 -0
  129. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_setup.py +0 -0
  130. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/tests/test_sponsorships.py +0 -0
  131. {thoughtleaders_cli-0.7.6 → thoughtleaders_cli-0.7.7}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tl-cli",
3
- "version": "0.7.6",
3
+ "version": "0.7.7",
4
4
  "description": "ThoughtLeaders CLI — query sponsorship deals, channels, brands, uploads, and intelligence from the terminal",
5
5
  "author": {
6
6
  "name": "ThoughtLeaders",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thoughtleaders-cli
3
- Version: 0.7.6
3
+ Version: 0.7.7
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
@@ -163,6 +163,7 @@ tl recommender tags cooking # Search tag names by substring
163
163
  tl recommender top-channels "Cooking" msn:yes --limit 50 # Top channels for a tag
164
164
  tl recommender top-profiles "Cooking" mbn:yes --limit 30 # Top brand profiles (one brand → potentially multiple profiles)
165
165
  tl recommender top-brands "Cooking" --limit 30 # Top brands (deduped from profiles)
166
+ tl recommender channels-with-tag "Cooking" # ALL channel IDs loaded on a tag (--min defaults to 0.00001; paged; 1 credit/result)
166
167
  tl recommender inspect-channel 12345 # Per-tag breakdown of a channel's vector
167
168
  tl recommender inspect-brand Nike # Per-tag breakdown of a brand's ideal profile
168
169
  tl recommender channels-for-profile 842 # Channels closest to a specific brand profile
@@ -277,8 +278,11 @@ Each agent discovers the skill automatically and uses it when you ask about spon
277
278
  The plugin ships several focused skills (installed by all the `tl setup *` commands):
278
279
 
279
280
  - **`tl`** — the data-analyst skill. Defaults to raw database queries via `tl db pg|fb|es` for anything non-trivial; uses the structured `tl <resource> show` / `find` / `similar` commands for single-record lookups and similarity / ID-resolution special cases. Comes with full schema references for Postgres, Elasticsearch, and Firebolt under `references/`.
280
- - **`tl-report-builder`** — builds TL reports (channels / brands / sponsorships / videos) from natural-language requests. Produces an in-chat preview by default; saves a real campaign when the user is explicit ("save", "create the report").
281
+ - **`tl-keyword-research`** — broadens and ranks content-search keywords by Elasticsearch document count before a `tl db es` content search, so finding videos or channels by topic isn't bottlenecked on hand-guessed terms.
282
+ - **`tl-save-report`** — persists the result set from an in-chat exploration session as a saved TL report ("save this as a report", "turn this into a campaign").
283
+ - **`tl-report-builder`** — builds a brand-new TL report config from scratch (channels / brands / sponsorships / videos) through a guided multi-phase flow. Manual-invocation-only: reach it via `/tl-report-builder` or by naming it explicitly — natural-language report requests route to `tl`, `tl-save-report`, or `tl-import` instead.
281
284
  - **`tl-import`** / **`bulk-import`** — superuser-only; bulk-add or exclude lists of channels, brands, videos, or sponsorships against a report.
285
+ - **`tl-channel-authenticity`** — vets a YouTube channel for non-organic views and bot/spam comments before booking (or after delivering) a sponsorship.
282
286
  - **`tl-views-guarantee`** — sizes a multi-video sponsorship buy for a channel, returning the video bundle size, views guarantee, and likelihood to hit.
283
287
  - **`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`).
284
288
 
@@ -135,6 +135,7 @@ tl recommender tags cooking # Search tag names by substring
135
135
  tl recommender top-channels "Cooking" msn:yes --limit 50 # Top channels for a tag
136
136
  tl recommender top-profiles "Cooking" mbn:yes --limit 30 # Top brand profiles (one brand → potentially multiple profiles)
137
137
  tl recommender top-brands "Cooking" --limit 30 # Top brands (deduped from profiles)
138
+ tl recommender channels-with-tag "Cooking" # ALL channel IDs loaded on a tag (--min defaults to 0.00001; paged; 1 credit/result)
138
139
  tl recommender inspect-channel 12345 # Per-tag breakdown of a channel's vector
139
140
  tl recommender inspect-brand Nike # Per-tag breakdown of a brand's ideal profile
140
141
  tl recommender channels-for-profile 842 # Channels closest to a specific brand profile
@@ -249,8 +250,11 @@ Each agent discovers the skill automatically and uses it when you ask about spon
249
250
  The plugin ships several focused skills (installed by all the `tl setup *` commands):
250
251
 
251
252
  - **`tl`** — the data-analyst skill. Defaults to raw database queries via `tl db pg|fb|es` for anything non-trivial; uses the structured `tl <resource> show` / `find` / `similar` commands for single-record lookups and similarity / ID-resolution special cases. Comes with full schema references for Postgres, Elasticsearch, and Firebolt under `references/`.
252
- - **`tl-report-builder`** — builds TL reports (channels / brands / sponsorships / videos) from natural-language requests. Produces an in-chat preview by default; saves a real campaign when the user is explicit ("save", "create the report").
253
+ - **`tl-keyword-research`** — broadens and ranks content-search keywords by Elasticsearch document count before a `tl db es` content search, so finding videos or channels by topic isn't bottlenecked on hand-guessed terms.
254
+ - **`tl-save-report`** — persists the result set from an in-chat exploration session as a saved TL report ("save this as a report", "turn this into a campaign").
255
+ - **`tl-report-builder`** — builds a brand-new TL report config from scratch (channels / brands / sponsorships / videos) through a guided multi-phase flow. Manual-invocation-only: reach it via `/tl-report-builder` or by naming it explicitly — natural-language report requests route to `tl`, `tl-save-report`, or `tl-import` instead.
253
256
  - **`tl-import`** / **`bulk-import`** — superuser-only; bulk-add or exclude lists of channels, brands, videos, or sponsorships against a report.
257
+ - **`tl-channel-authenticity`** — vets a YouTube channel for non-organic views and bot/spam comments before booking (or after delivering) a sponsorship.
254
258
  - **`tl-views-guarantee`** — sizes a multi-video sponsorship buy for a channel, returning the video bundle size, views guarantee, and likelihood to hit.
255
259
  - **`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`).
256
260
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "thoughtleaders-cli"
7
- version = "0.7.6"
7
+ version = "0.7.7"
8
8
  description = "ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -204,6 +204,7 @@ tl recommender tags [query] # List similarity tag names — categorie
204
204
  tl recommender top-channels "<tag>" # Top channels loaded on a similarity tag (Intelligence)
205
205
  tl recommender top-profiles "<tag>" # Top brand profiles loaded on a similarity tag
206
206
  tl recommender top-brands "<tag>" # Top brands (deduped from profiles) loaded on a similarity tag
207
+ tl recommender channels-with-tag "<tag>" [--min <v>] # ALL channel IDs scoring >= v on a tag (--min default 0.00001 drops zero-loading channels; paged, enumerates the full set; 1 credit/result; Intelligence)
207
208
  tl recommender inspect-channel <ref> # Show a channel's similarity-profile breakdown (Intelligence)
208
209
  tl recommender inspect-brand <ref> # Show a brand profile's ideal similarity-profile breakdown (Intelligence)
209
210
  tl recommender channels-for-profile <id> # Find channels closest to a brand profile's ideal profile (Intelligence)
@@ -1,3 +1,3 @@
1
1
  """ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence."""
2
2
 
3
- __version__ = "0.7.6"
3
+ __version__ = "0.7.7"
@@ -187,9 +187,7 @@ def logout_cmd() -> None:
187
187
  # the interactive login established. Point the user at Auth0's logout
188
188
  # URL so the next `tl auth login` doesn't silently SSO straight back in.
189
189
  logout_url = f"https://{get_config().auth0_domain}/logout"
190
- console.print(
191
- f"To end your Auth0 browser session, visit: [cyan]{logout_url}[/cyan]"
192
- )
190
+ console.print(f"To end your Auth0 browser session, visit: [cyan]{logout_url}[/cyan]")
193
191
  clear_tokens()
194
192
  console.print("[green]Logged out successfully.[/green]")
195
193
 
@@ -129,7 +129,7 @@ def login_device_code() -> StoredTokens:
129
129
  console.print()
130
130
  console.print(f"[bold]And enter the code:[/bold] [cyan bold]{user_code}[/cyan bold]")
131
131
  console.print()
132
- console.print(f"[dim]The code expires in {expires_in // 60} minutes.[/dim]")
132
+ console.print(f"[dim]The code expires in {expires_in // 60} minutes. After you have logged in successfully, please wait until the system is notified.[/dim]")
133
133
 
134
134
  # Poll for token
135
135
  deadline = time.time() + expires_in
@@ -210,6 +210,54 @@ def top_brands_cmd(
210
210
  _do_top("brands", tag, args or [], fmt, limit, TOP_BRAND_COLUMNS, f"Top brands: {tag}")
211
211
 
212
212
 
213
+ @app.command("channels-with-tag")
214
+ def channels_with_tag_cmd(
215
+ tag: str = typer.Argument(..., help='Similarity tag name (e.g. "Cooking", "Age 18-24"). Run `tl recommender tags` to discover valid names.'),
216
+ min_value: float = typer.Option(0.00001, "--min", help="Inclusive minimum tag value; only channels scoring at or above this are returned. Defaults to 0.00001, which excludes channels with no loading on the tag."),
217
+ json_output: bool = typer.Option(False, "--json", help="JSON output"),
218
+ csv_output: bool = typer.Option(False, "--csv", help="CSV output"),
219
+ md_output: bool = typer.Option(False, "--md", help="Markdown output"),
220
+ toon_output: bool = typer.Option(False, "--toon", help="TOON output (token-efficient for LLMs)"),
221
+ limit: int = typer.Option(100, "--limit", "-l", help="Max results per page (1-1000)"),
222
+ offset: int = typer.Option(0, "--offset", help="Pagination offset"),
223
+ ) -> None:
224
+ """Every channel whose value for a similarity tag is at or above a threshold.
225
+
226
+ Unlike `top-channels` (which ranks the strongest few), this walks the
227
+ *entire* match set in pages of up to 1000 — including sets larger than
228
+ the search index's 10k window — so you can enumerate every channel above
229
+ a cutoff. Returns channel IDs only; expand them with `tl channels show`
230
+ or `tl recommender inspect-channel`.
231
+
232
+ `--min` defaults to 0.00001 — just above zero — so a bare call returns
233
+ every channel with any loading on the tag and drops the zero-fill rest.
234
+ Raise it for a stricter cutoff.
235
+
236
+ Costs 1 credit per channel ID returned. Intelligence plan required.
237
+
238
+ Examples:
239
+ tl recommender channels-with-tag "Cooking"
240
+ tl recommender channels-with-tag "Age 18-24" --min 0.3 --limit 1000
241
+ tl recommender channels-with-tag "Cooking" --min 0.5 --offset 1000 --json
242
+ """
243
+ fmt = detect_format(json_output, csv_output, md_output, toon_output)
244
+ tag = _strip_quotes(tag)
245
+ params = {"tag": tag, "min": str(min_value), "limit": str(limit), "offset": str(offset)}
246
+ client = get_client()
247
+ try:
248
+ data = client.get("/recommender/channels-with-tag", params=params)
249
+ output(
250
+ data,
251
+ fmt,
252
+ columns=["channel_id"],
253
+ title=f"Channels with {tag} >= {min_value}",
254
+ )
255
+ except ApiError as e:
256
+ handle_api_error(e)
257
+ finally:
258
+ client.close()
259
+
260
+
213
261
  @app.command("inspect-channel")
214
262
  def inspect_channel_cmd(
215
263
  channel_ref: str = typer.Argument(..., help="Channel ID (numeric) or name (partial match, must be unique)"),