thoughtleaders-cli 0.9.11__tar.gz → 0.9.12__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.
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.claude-plugin/plugin.json +1 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/AGENTS.md +3 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/PKG-INFO +1 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/pyproject.toml +1 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/SKILL.md +2 -3
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/elasticsearch-schema.md +1 -2
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/postgres-schema.md +11 -6
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/intelligence_filterset_schema.json +0 -12
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/sponsorship_filterset_schema.json +0 -12
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/__init__.py +1 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/output/formatter.py +1 -1
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.claude-plugin/marketplace.json +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/dependabot.yml +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/workflows/ci.yml +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/workflows/cli-integration.yml +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/workflows/python-publish.yml +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.gitignore +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/API.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/CLAUDE.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/LICENSE +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/README.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/keyword-context-classifier.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/keyword-entity-resolver.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/keyword-relevance-validator.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/tl-analyst.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/youtube-comment-classifier.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/hooks/hooks.json +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/hooks/scripts/load-tl-skill.mjs +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/hooks/scripts/post-usage.sh +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/hooks/scripts/pre-check.sh +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/business-glossary.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/firebolt-schema.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/.gitignore +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/references/comment-patterns.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/references/peer-cohort.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/references/red-flags.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/references/scoring.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/_io_utf8.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/analyze_channel.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/anomaly_detector.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/comment_analyzer.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/comment_scraper.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/engagement_ratios.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/peer_cohort.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/report.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/resolve_channel.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/score.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/tl_cli.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/video_integrity.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/scripts/view_curves.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-create-workflow/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-create-workflow/references/creating-in-app.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-create-workflow/references/methodology.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-create-workflow/references/pitfalls.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-create-workflow/references/workflow-model.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/references/elasticsearch-content-search.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/references/help.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/build_report.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/expand_entities.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/fetch_context.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/probe.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/search_channels.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/search_videos.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/select_keywords.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/columns_brands.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/columns_channels.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/columns_content.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/columns_sponsorships.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/intelligence_widget_schema.json +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/report_glossary.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/sortable_columns.json +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/sponsorship_widget_schema.json +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/widgets.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-top-partnerships/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-top-partnerships/scripts/top_partnerships.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-views-guarantee/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-views-guarantee/scripts/vg.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/__main__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/_completions.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/_typer_utils.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/auth/__init__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/auth/commands.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/auth/login.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/auth/pkce.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/auth/token_store.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/client/__init__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/client/errors.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/client/http.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/__init__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/_comments_common.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/balance.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/brands.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/bulk_import.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/changelog.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/channels.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/credits.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/db.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/deals.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/describe.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/doctor.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/matches.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/memory.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/profiles.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/proposals.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/recommender.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/reports.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/schema.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/setup.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/skills.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/snapshots.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/sponsorships.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/uploads.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/whoami.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/workflows.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/config.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/filters.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/hints.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/main.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/output/__init__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/query_history.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/self_update.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/skill_registry.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/__init__.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_auth.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_brands_winner_channels.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_build_report.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_channels_lookalike.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_db_repeat_warning.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_describe.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_error_hints.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_expand_entities.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_filters.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_http_auth.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_memory.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_output.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_probe.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_profiles.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_quota_refusal_message.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_refusal_rendering.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_reports.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_scripts_executable.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_search_channels.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_search_videos.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_select_keywords.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_setup.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_setup_marker_respect.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_skill_registry.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_skills_command.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_sponsorships.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_whoami_newsletter.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_workflows.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/AGENTS.md +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/conftest.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_balance.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_db_es.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_db_fb.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_db_pg.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_schema.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests_cli/test_whoami.py +0 -0
- {thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/uv.lock +0 -0
|
@@ -88,10 +88,12 @@ The version string is defined in three files and all three must be updated toget
|
|
|
88
88
|
|
|
89
89
|
## Creating a release
|
|
90
90
|
|
|
91
|
-
A "release" means using the `gh` command to create a release on GitHub,
|
|
91
|
+
A "release" means using the `gh` command to create a release on GitHub, tagged and titled `v<version>` (e.g. `v0.9.11`). The `v` prefix is mandatory: the PyPI publish workflow only runs for `v*` tags, and a release without it fails with an environment protection rule error.
|
|
92
92
|
|
|
93
93
|
Warn the user if they are creating a release and the latest commit didn't bump the version number, and ask for confirmation before releasing.
|
|
94
94
|
|
|
95
|
+
Release notes are written by hand for the user, never with `--generate-notes` (that yields only a compare link). Follow the style of previous releases: a `##` heading naming the change from the user's perspective, a short prose explanation of what changed and why it matters, a usage example where one helps, and a closing line on what the user has to do (e.g. `tl setup claude` to pick up skill changes, or nothing). Describe user-visible behaviour only — same rules as commit messages and skills apply, so no internal architecture or server details.
|
|
96
|
+
|
|
95
97
|
## Coding
|
|
96
98
|
|
|
97
99
|
* Do not reference internal architecture of the ThoughtLeaders app in comments or skills. Specifially: do not reference internal table names, field names, API endpoints, Python modules or functions (including the sanitizer).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thoughtleaders-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.12
|
|
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
|
|
@@ -88,11 +88,11 @@ Other key concepts:
|
|
|
88
88
|
- **Adspots** — types of ads a channel is willing to publish (e.g. mention, dedicated video, product placement). Returned by `tl channels show`; each carries price/cost.
|
|
89
89
|
- **Profiles** — actors that own sponsorship records on behalf of either side of a deal. A profile is either buyer-side or seller-side:
|
|
90
90
|
- *Buyer-side (brand) profiles* — represent a sponsoring brand. Each brand profile has an M2M link to at most one `Brand` record (which are the actual advertiser identities). On a sponsorship, `advertiser_profile` is the buyer-side profile, and `advertiser_id` is the buyer-side user who created the record — the advertiser is always the buyer/brand side, never the YouTube creator (the channel hangs off `ad_spot_id`).
|
|
91
|
-
- *Seller-side (publisher) profiles* —
|
|
91
|
+
- *Seller-side (publisher) profiles* — represent one or more `Channel` records through the `thoughtleaders_profile_channels` link. Representation is not deal ownership: each adspot names its own seller (`ad_spot.publisher`, a user), so a channel's deals belong to whoever sold them, not to everyone who represents the channel.
|
|
92
92
|
- **How to tell them apart** — three signals on the `thoughtleaders_profile` row, used in this order:
|
|
93
93
|
1. **`persona`** (canonical) — `1=Brand`, `4=Media Agency`, `3=Talent Manager` are buyer-side; `2=Creator`, `5=Creator Service` are seller-side. May be null on legacy rows.
|
|
94
94
|
2. **`is_advertiser` / `is_publisher`** booleans — feature flags; either or both can be true for staff-style profiles, but on normal user profiles they reliably mark side.
|
|
95
|
-
- Org scoping for sponsorships is profile-mediated: a sponsorship belongs to your org if **either** `advertiser_profile.organization` (brand side) **or** `ad_spot.
|
|
95
|
+
- Org scoping for sponsorships is profile-mediated: a sponsorship belongs to your org if **either** `advertiser_profile.organization` (brand side) **or** the adspot seller's organization — `ad_spot.publisher` → that user's profile → `organization` (publisher side) — matches yours. Representing the channel does not by itself surface its deals; only a `sees_all_deals` link on `thoughtleaders_profile_channels` widens the publisher side to every deal on that channel.
|
|
96
96
|
- **MSN** (Media Selling Network) — the ~12k YouTube channels that have opted in to receive sponsorship offers. A channels is in the MSN group if the `channel.media_selling_network_join_date` field is not null.
|
|
97
97
|
- **MBN** (Media Buying Network) — the brand-side counterpart to MSN: brand profiles that have opted in to receive proposed sponsorships. A profile is in the MBN group if the `profile.media_buying_network_join_date` field is not null.
|
|
98
98
|
- **TPP** (ThoughtLeaders Partner Program, a.k.a. "TL channels") — the ~170 channels TL has the closest working relationship with. A channel is in the TPP group if `channel.is_tpp` is True. **Prefer TPP channels when booking**: they respond fastest, are the easiest to close, and don't need an outreach round-trip — treat them as immediately bookable. TPP is a strict subset of MSN, so the same booking rules (one active mention adspot, etc.) apply.
|
|
@@ -521,7 +521,6 @@ If unsure about what information to find where, read the [references/postgresql-
|
|
|
521
521
|
- `Postgres channel.id` ↔ `ES channel.id` (on article docs) ↔ `Firebolt article_metrics.channel_id` / `channel_metrics.id`
|
|
522
522
|
- `Postgres adlink.article_id` is `<channel_id>:<youtube_id>` — same as ES `_id`. Strip the prefix to get `Firebolt article_metrics.id`.
|
|
523
523
|
- `Postgres brand.id` ↔ ES `sponsored_brand_mentions[]` / `organic_brand_mentions[]`.
|
|
524
|
-
- `publication_id` is **deprecated** — don't use it.
|
|
525
524
|
|
|
526
525
|
**Snapshots are sparse**, especially for older videos. Don't assume two arbitrary dates have data points. For approximations, prefer `tl snapshots` which already implements the project's interpolation logic; falling back to raw `tl db fb` means you handle gaps yourself.
|
|
527
526
|
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/elasticsearch-schema.md
RENAMED
|
@@ -59,7 +59,7 @@ Filter with `{"term": {"doc_type": "article"}}`. Coverage percentages are live `
|
|
|
59
59
|
| `content_type` | keyword | `longform` / `short` / `live` — the complete value set. ~71% of docs; older docs have none (missing ≠ longform). Podcast/RSS docs have no `content_type`. |
|
|
60
60
|
| `content_aspects` | keyword | Flags: `podcast`, `paid_promotion`, `unlisted` — the complete value set. Only ~2.6% of docs carry any. |
|
|
61
61
|
| `hashtags` | keyword | Hashtags from the video description, stored **without the leading `#`** and lowercase (e.g. `marchmadness`); non-Latin tags appear percent-encoded (`%D0%B0…`) (~32%) |
|
|
62
|
-
| `channel` | object | Embedded channel subset: `channel.id`, `channel.content_category`, `channel.format`, `channel.
|
|
62
|
+
| `channel` | object | Embedded channel subset: `channel.id`, `channel.content_category`, `channel.format`, `channel.country`, `channel.language` — no text fields, no metrics. This is where a video's language/country/format/category live (top-level `language`, `country`, `format`, `content_category` exist only on channel docs). |
|
|
63
63
|
|
|
64
64
|
⚠️ **Channel-doc fields that look like video fields but match 0 video docs:** `total_views`, `engagement`, `duration_live`/`duration_longform`/`duration_shorts`, `language`, `country`, `format`, `content_category`, `face_on_screen`. They live on channel docs (see below); on video docs use the embedded `channel.*` subset where available.
|
|
65
65
|
|
|
@@ -283,5 +283,4 @@ The `transcript` field's `_source` is **YouTube timed-text caption XML**, not pl
|
|
|
283
283
|
- `sponsored_brand_mentions` and `organic_brand_mentions` are keyword arrays — use `term` queries.
|
|
284
284
|
- For brand mention details (position, snippet, detection_tool), the data is in the `brand_mentions` nested field.
|
|
285
285
|
- **Stored-only fields** — retrievable in `_source` but invisible to `exists`/`term`/`match` (queries on them silently match 0 docs): `url`, `image_url`, `es_index_tag`, `not_sponsored_by`.
|
|
286
|
-
- **`publication_id` is deprecated** — don't use for joins.
|
|
287
286
|
- No write access. The CLI only exposes `_search` against `tl-platform-*`.
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/postgres-schema.md
RENAMED
|
@@ -353,13 +353,18 @@ LIMIT 50 OFFSET 0
|
|
|
353
353
|
|
|
354
354
|
## `thoughtleaders_profile_channels` (Profile ↔ Channel M2M)
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
|--------|------|
|
|
358
|
-
| `id` | int PK |
|
|
359
|
-
| `profile_id` | int FK |
|
|
360
|
-
| `channel_id` | int FK |
|
|
356
|
+
Which channels a seller-side profile represents. One row per profile/channel pair.
|
|
361
357
|
|
|
362
|
-
|
|
358
|
+
| Column | Type | Description |
|
|
359
|
+
|--------|------|-------------|
|
|
360
|
+
| `id` | int PK | |
|
|
361
|
+
| `profile_id` | int FK | → `thoughtleaders_profile.id` |
|
|
362
|
+
| `channel_id` | int FK | → `thoughtleaders_channel.id` |
|
|
363
|
+
| `sees_all_deals` | boolean | When true, the profile's organization sees **every** deal on the channel, not only the deals it sold itself. Absent from the sandbox views, so only a full-access context can read it. |
|
|
364
|
+
| `created_where` | varchar | What created the link. NULL on every link that predates the column. |
|
|
365
|
+
| `created_at` | timestamptz | When the link was created. NULL on every link that predates the column — filtering or ordering on it silently drops that whole population. |
|
|
366
|
+
|
|
367
|
+
⚠️ **Representation is not deal ownership.** A deal's seller is the adspot's own publisher (`thoughtleaders_adspot.publisher_id` → `auth_user`, then `thoughtleaders_profile.user_id` for the org). Joining sponsorships to an org through this table alone over-reports — only a `sees_all_deals = true` row widens the seller side to all of a channel's deals. `publisher_id` is scrubbed from the sandbox adspot view, so the seller-side hop is only queryable from a full-access role.
|
|
363
368
|
|
|
364
369
|
## Example queries
|
|
365
370
|
|
|
@@ -362,18 +362,6 @@
|
|
|
362
362
|
"uniqueItems": true,
|
|
363
363
|
"description": "Article IDs to exclude (composite `<channel_id>:<youtube_id>` form). Pairs with a predicate-style FilterSet — useful for 'videos matching X, except these specific ones'.",
|
|
364
364
|
"_tl_django_m2m": "FilterSet.exclude_articles via FiltersetExcludeArticles"
|
|
365
|
-
},
|
|
366
|
-
|
|
367
|
-
"networks": {
|
|
368
|
-
"type": ["array", "null"],
|
|
369
|
-
"items": { "type": "integer", "minimum": 1 },
|
|
370
|
-
"uniqueItems": true,
|
|
371
|
-
"_tl_django_m2m": "FilterSet.networks → thoughtleaders.Publication"
|
|
372
|
-
},
|
|
373
|
-
"exclude_networks": {
|
|
374
|
-
"type": ["array", "null"],
|
|
375
|
-
"items": { "type": "integer", "minimum": 1 },
|
|
376
|
-
"uniqueItems": true
|
|
377
365
|
}
|
|
378
366
|
},
|
|
379
367
|
|
|
@@ -58,18 +58,6 @@
|
|
|
58
58
|
"_tl_django_m2m": "FilterSet.exclude_brands via FilterSetExcludeBrand"
|
|
59
59
|
},
|
|
60
60
|
|
|
61
|
-
"networks": {
|
|
62
|
-
"type": ["array", "null"],
|
|
63
|
-
"items": { "type": "integer", "minimum": 1 },
|
|
64
|
-
"uniqueItems": true,
|
|
65
|
-
"_tl_django_m2m": "FilterSet.networks → thoughtleaders.Publication"
|
|
66
|
-
},
|
|
67
|
-
"exclude_networks": {
|
|
68
|
-
"type": ["array", "null"],
|
|
69
|
-
"items": { "type": "integer", "minimum": 1 },
|
|
70
|
-
"uniqueItems": true
|
|
71
|
-
},
|
|
72
|
-
|
|
73
61
|
"start_date": {
|
|
74
62
|
"type": ["string", "null"],
|
|
75
63
|
"format": "date",
|
|
@@ -215,7 +215,7 @@ def _detect_numeric_columns(results: list[dict], columns: list[str]) -> set[str]
|
|
|
215
215
|
numeric.discard(col)
|
|
216
216
|
# Don't treat ID-like columns as numeric
|
|
217
217
|
for col in list(numeric):
|
|
218
|
-
if col.endswith("_id") or col == "id"
|
|
218
|
+
if col.endswith("_id") or col == "id":
|
|
219
219
|
numeric.discard(col)
|
|
220
220
|
# Columns where every sampled value was None/empty aren't meaningfully numeric
|
|
221
221
|
for col in list(numeric):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/workflows/cli-integration.yml
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/.github/workflows/python-publish.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/keyword-context-classifier.md
RENAMED
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/keyword-relevance-validator.md
RENAMED
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/agents/youtube-comment-classifier.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/business-glossary.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl/references/firebolt-schema.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/.gitignore
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-channel-authenticity/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-keyword-research/scripts/probe.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-save-report/references/widgets.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/skills/tl-views-guarantee/scripts/vg.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/src/tl_cli/commands/_comments_common.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.9.11 → thoughtleaders_cli-0.9.12}/tests/test_brands_winner_channels.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|