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