thoughtleaders-cli 0.9.18__tar.gz → 0.9.20__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.18 → thoughtleaders_cli-0.9.20}/.claude-plugin/plugin.json +1 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/PKG-INFO +1 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/pyproject.toml +1 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/_shared/tl_data.py +20 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/connector-impact/SKILL.md +23 -7
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/connector-impact/references/help.md +8 -5
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/connector-impact/references/impact-schema.md +5 -4
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/connector-impact/references/impact-to-tl-mapping.md +41 -21
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/SKILL.md +2 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/build_html.py +6 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/analyze_channel.py +8 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/SKILL.md +3 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-views-guarantee/scripts/vg.py +18 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/__init__.py +1 -1
- thoughtleaders_cli-0.9.20/src/tl_cli/commands/agent.py +57 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/main.py +12 -9
- thoughtleaders_cli-0.9.20/tests/test_agent_complete.py +81 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_shared_tl_data.py +18 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/uv.lock +1 -1
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.claude-plugin/marketplace.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.github/dependabot.yml +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.github/workflows/ci.yml +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.github/workflows/cli-integration.yml +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.github/workflows/python-publish.yml +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/.gitignore +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/AGENTS.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/API.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/CLAUDE.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/LICENSE +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/README.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/cast-sheet.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/gem-classifier.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/keyword-context-classifier.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/keyword-entity-resolver.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/keyword-relevance-validator.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/merge-shard.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/tl-analyst.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/agents/youtube-comment-classifier.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/hooks/hooks.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/hooks/scripts/load-tl-skill.mjs +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/hooks/scripts/post-usage.sh +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/hooks/scripts/pre-check.sh +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl/references/business-glossary.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl/references/elasticsearch-schema.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl/references/firebolt-schema.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl/references/postgres-schema.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/cast-sheet.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/creator-brief-template.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/cue-phrases.txt +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/evidence-rules.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/extractor-rubric.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/identity-lane.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/profile-spec.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/references/transcript-mining.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/assemble_extracts.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/authenticate.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/bio_lane.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/brand_reads.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/cast_sheet.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/channel_context.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/cluster_gems.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/extractor_prompt.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/fetch_cues.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/identity_prompt.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/ledger_meta.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/merge_pass.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/page.css +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/start_run.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/store_io.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/tier_hint.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/scripts/verify_quotes.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/.gitignore +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/references/comment-patterns.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/references/peer-cohort.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/references/red-flags.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/references/scoring.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/_io_utf8.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/anomaly_detector.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/channel_lookup.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/comment_analyzer.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/comment_scraper.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/engagement_ratios.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/peer_cohort.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/report.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/resolve_channel.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/score.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/video_integrity.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-channel-authenticity/scripts/view_curves.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-create-workflow/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-create-workflow/references/creating-in-app.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-create-workflow/references/methodology.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-create-workflow/references/pitfalls.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-create-workflow/references/workflow-model.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/references/elasticsearch-content-search.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/references/help.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/build_report.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/expand_entities.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/fetch_context.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/probe.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/search_channels.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/search_videos.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-keyword-research/scripts/select_keywords.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/columns_brands.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/columns_channels.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/columns_content.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/columns_sponsorships.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/intelligence_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/intelligence_widget_schema.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/report_glossary.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/sortable_columns.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/sponsorship_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/sponsorship_widget_schema.json +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-save-report/references/widgets.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-top-partnerships/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-top-partnerships/scripts/top_partnerships.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-views-guarantee/SKILL.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/__main__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/_completions.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/_typer_utils.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/auth/__init__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/auth/commands.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/auth/login.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/auth/pkce.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/auth/token_store.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/client/__init__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/client/errors.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/client/http.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/__init__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/_comments_common.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/balance.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/brands.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/bulk_import.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/changelog.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/channels.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/credits.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/db.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/deals.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/describe.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/doctor.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/matches.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/memory.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/profiles.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/proposals.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/recommender.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/reports.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/schema.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/setup.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/skills.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/snapshots.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/sponsorships.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/uploads.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/whoami.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/commands/workflows.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/config.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/filters.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/hints.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/output/__init__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/output/formatter.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/query_history.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/self_update.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/src/tl_cli/skill_registry.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/__init__.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_assemble_extracts.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_auth.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_bio_lane.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_brands_winner_channels.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_build_report.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_cast_sheet.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_channels_lookalike.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_cluster_gems.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_creator_brief_accuracy.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_creator_brief_scripts.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_db_repeat_warning.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_describe.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_error_hints.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_expand_entities.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_extractor_prompt.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_fetch_cues.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_filters.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_http_auth.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_ledger_meta.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_memory.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_merge_pass.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_output.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_probe.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_profiles.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_quota_refusal_message.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_refusal_rendering.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_reports.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_scripts_executable.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_search_channels.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_search_videos.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_select_keywords.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_setup.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_setup_marker_respect.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_skill_registry.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_skills_command.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_sponsorships.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_start_run.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_whoami_newsletter.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests/test_workflows.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/AGENTS.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/conftest.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_balance.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_db_es.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_db_fb.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_db_pg.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_schema.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tests_cli/test_whoami.py +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tools/tl-brand-creator-connection/references/cue-phrases.trained-2026-09-15.txt +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tools/tl-brand-creator-connection/references/cue-training.md +0 -0
- {thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/tools/tl-brand-creator-connection/scripts/train_cues.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thoughtleaders-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.20
|
|
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
|
|
@@ -235,6 +235,26 @@ def preflight() -> None:
|
|
|
235
235
|
_tl(["whoami"], timeout=60)
|
|
236
236
|
|
|
237
237
|
|
|
238
|
+
def report_run(skill: str, outcome: str = "completed") -> None:
|
|
239
|
+
"""Tell ThoughtLeaders a skill opened from one of its surfaces has finished.
|
|
240
|
+
|
|
241
|
+
Best effort, never raises: the skill's own result is already on the way
|
|
242
|
+
to the user, and a report that cannot be delivered must not change that.
|
|
243
|
+
A skill started by hand has no run to close; the CLI says so and exits 0.
|
|
244
|
+
"""
|
|
245
|
+
exe = shutil.which(TL_BIN) or TL_BIN
|
|
246
|
+
try:
|
|
247
|
+
subprocess.run(
|
|
248
|
+
[exe, "agent", "complete", skill, "--outcome", outcome],
|
|
249
|
+
capture_output=True,
|
|
250
|
+
env=_child_env(),
|
|
251
|
+
timeout=30,
|
|
252
|
+
check=False,
|
|
253
|
+
)
|
|
254
|
+
except (OSError, subprocess.SubprocessError):
|
|
255
|
+
pass
|
|
256
|
+
|
|
257
|
+
|
|
238
258
|
if __name__ == "__main__":
|
|
239
259
|
if len(sys.argv) == 2 and sys.argv[1] == "preflight":
|
|
240
260
|
preflight()
|
|
@@ -65,7 +65,11 @@ questions from `help.md` or the mapping file, then continue the run.
|
|
|
65
65
|
- ELSE ask ONE question covering every unstated item (view, brand, window), one line per view on
|
|
66
66
|
what it shows. Never default silently.
|
|
67
67
|
- IF `autonomous`, `--auto` or "don't stop to ask": all three views, default window, no questions.
|
|
68
|
-
- IF the user
|
|
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.
|
|
69
73
|
|
|
70
74
|
## Workflow
|
|
71
75
|
|
|
@@ -133,11 +137,11 @@ deliverable is per partner and per deal; nothing below that grain leaves Impact.
|
|
|
133
137
|
type differs from the one the user described, stop and tell the user.
|
|
134
138
|
6. Resolve the brand with `tl brands find "<name>"`. Never match brand names in SQL.
|
|
135
139
|
7. IF creators are named, resolve them to TL channel ids now (stage 1), before any deal read.
|
|
136
|
-
8. Record the currency the Impact figures are in and the
|
|
137
|
-
report, the figures' currency is its display-currency setting; do not change it. IF
|
|
138
|
-
|
|
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.
|
|
139
143
|
9. Quote the run's credit cost (above), then state the scope back: brand, creators, window, view,
|
|
140
|
-
states
|
|
144
|
+
the selected headline states with approved and pending labelled separately, currencies.
|
|
141
145
|
|
|
142
146
|
### 1. TL side
|
|
143
147
|
|
|
@@ -272,6 +276,9 @@ group (mapping 4.4).
|
|
|
272
276
|
platforms); ELSE list it as unresolved without asking.
|
|
273
277
|
- List actions that used the creator's promo codes but are credited to another partner (mapping
|
|
274
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.
|
|
275
282
|
- List TL deals with no Impact partner, with the likely reason.
|
|
276
283
|
|
|
277
284
|
### 4. Dates
|
|
@@ -314,6 +321,9 @@ not reach a number quoted earlier — the reader meets the figure first. Where t
|
|
|
314
321
|
repeat several times in one section, mark each figure and carry one note for the section, placed
|
|
315
322
|
where a reader meets the first of them.
|
|
316
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
|
+
|
|
317
327
|
Use business terms from the `tl` glossary, not table names. IF the user asks for a chart, render
|
|
318
328
|
it as SVG.
|
|
319
329
|
|
|
@@ -347,5 +357,11 @@ channel added from a link the user gave. IF the user wants results saved, offer
|
|
|
347
357
|
otherwise empty: a bare `0` does not say which currency it is zero of. A currency named once
|
|
348
358
|
in the table's title covers the table.
|
|
349
359
|
13. Mapping 2 holds: views from TL only; Paid to TL and commission in separate columns; all-in
|
|
350
|
-
figures only in the to-date block;
|
|
351
|
-
|
|
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).
|
{thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/connector-impact/references/help.md
RENAMED
|
@@ -17,7 +17,8 @@ the right tool for you.
|
|
|
17
17
|
- Your TL login (the `tl` CLI).
|
|
18
18
|
- One way into Impact:
|
|
19
19
|
- Impact's connector for Claude (recommended): add a custom connector with the URL
|
|
20
|
-
`https://mcp.impact.com/mcp`
|
|
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.
|
|
21
22
|
- The Impact API, with a read-only token you create in Impact (Settings → Technical → API).
|
|
22
23
|
- A CSV export from Impact's Reports (Performance by Partner or by Day), dropped into the chat.
|
|
23
24
|
- The Impact website, open and signed in in your browser. Slowest, but no setup.
|
|
@@ -75,9 +76,11 @@ TL data takes about a day to fill in.
|
|
|
75
76
|
- The TL price and the Impact commission are always shown separately. They're added together
|
|
76
77
|
only in an "All-in cost to date" box under the table, over the same videos and dates, with an
|
|
77
78
|
as-of date.
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
average rate, with the
|
|
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.
|
|
81
84
|
|
|
82
85
|
Costs and CPMs here are last-click numbers from your own Impact account: they count sales that
|
|
83
86
|
arrived through the creator's link, not sales the video may have driven some other way. They're a
|
|
@@ -92,7 +95,7 @@ floor on what a sponsorship did, not the full picture.
|
|
|
92
95
|
| Action | A conversion: sale, sign-up or install |
|
|
93
96
|
| Revenue | Your sales, not TL revenue |
|
|
94
97
|
| Action Cost | Commission paid to the creator through Impact, not the TL price |
|
|
95
|
-
| Total Cost | That commission plus Impact
|
|
98
|
+
| Total Cost | That commission plus per-click payments, bonuses, make-good and fixed payments made through Impact. No Impact platform fee |
|
|
96
99
|
| Ad | A tracking link or creative, not a TL ad spot |
|
|
97
100
|
| Contract | Commission terms, not a TL IO |
|
|
98
101
|
|
|
@@ -9,7 +9,7 @@ The user brings one route. This skill never holds a login.
|
|
|
9
9
|
|
|
10
10
|
| Route | Setup | Best for |
|
|
11
11
|
|---|---|---|
|
|
12
|
-
| Impact MCP | Custom connector `https://mcp.impact.com/mcp
|
|
12
|
+
| Impact MCP | Custom connector `https://mcp.impact.com/mcp` with OAuth client ID `mcp-impact-claude` under Advanced settings (Impact does not support dynamic client registration), signed in with the user's Impact login | Most questions; aggregates on Impact's side |
|
|
13
13
|
| Impact Brand API | `AccountSID` + a token the user creates (Settings → Technical → API) | Action-level detail, long ranges |
|
|
14
14
|
| CSV export | Reports: Performance by Partner, Performance by Day, Advanced Action Listing | No setup |
|
|
15
15
|
| Impact web app | The user's own browser, already signed in. Read report pages only: no downloads, no settings, no answers to pop-ups | When none of the above is set up. Slowest route; same report data |
|
|
@@ -42,7 +42,7 @@ Filters: `ActionDateStart` / `ActionDateEnd` (on `EventDate`; use these for wind
|
|
|
42
42
|
| `AdId` | integer | Ad or link behind the winning click |
|
|
43
43
|
| `Amount`, `DeltaAmount`, `IntendedAmount` | number | Sale value: current, last change, original |
|
|
44
44
|
| `Payout`, `DeltaPayout`, `IntendedPayout` | number | Partner commission: current, last change, original |
|
|
45
|
-
| `ClientCost` | number |
|
|
45
|
+
| `ClientCost` | number | Cost for this action: payout plus fees. Not the grouped report's Total Cost; never sum it as a substitute for all action, click and fixed payments |
|
|
46
46
|
| `Currency` | string | ISO 4217, for all money on the row |
|
|
47
47
|
| `EventDate`, `ReferringDate`, `CreationDate`, `LockingDate`, `ClearedDate` | date-time | See mapping 1.2 |
|
|
48
48
|
| `ReferringType`, `ReferringDomain` | string | Attribution method, click site |
|
|
@@ -119,8 +119,9 @@ documentation:
|
|
|
119
119
|
| `Sales`, `Leads`, `Calls`, `Mobile_Installs` | Actions split by type |
|
|
120
120
|
| `Sale_Amount` | Sale value ("Revenue" on the Brand dashboard) |
|
|
121
121
|
| `Action_Cost` | Commission on actions |
|
|
122
|
-
| `Other_Cost` |
|
|
123
|
-
| `
|
|
122
|
+
| `Other_Cost` | Bonuses, make-good and fixed payments made through Impact (e.g. a flat fee), which can be spread as equal daily amounts across the payment period |
|
|
123
|
+
| `Click_Cost` | Pay-per-click payments |
|
|
124
|
+
| `Total_Cost` | `Action_Cost` + `Click_Cost` + `Other_Cost`. Holds no Impact platform fee |
|
|
124
125
|
| `CR`, `EPC`, `AOV`, `RR` | Conversion rate, earnings per click, average order value, reversal rate |
|
|
125
126
|
|
|
126
127
|
On a Partner account the labels say "Earnings" instead of "Cost" (Action Earnings, Total
|
|
@@ -85,8 +85,8 @@ counts in Paid to TL.
|
|
|
85
85
|
| Actions | count of Actions, by state | `conversions` | Use Impact's; the TL value is hand-entered on few deals. |
|
|
86
86
|
| Action Cost | sum of `Payout` | none | Affiliate commission paid to the creator through Impact. Never the TL price (2.1). |
|
|
87
87
|
| Revenue | sum of `Amount` | `revenue` + `revenue_currency` | The brand's sales. In TL, "revenue" means sold deal price. Write "sales revenue (Impact)". |
|
|
88
|
-
| Total Cost |
|
|
89
|
-
| Conversion Rate | Actions ÷ Clicks | none | Impact actions over Impact clicks only. Suppressed per displayed ratio when the code-tracked share passes half (below). |
|
|
88
|
+
| Total Cost | Grouped report's Total Cost, mapped from its metadata (schema: *Reports*) | none | Action Cost plus Click Cost plus Other Cost, with no Impact platform fee; not the creator's cost. Never sum action-level `ClientCost` for this: it covers action payouts and fees, not all click and fixed payments. IF the route supplies neither Total Cost nor all three components for the same scope, mark Total Cost unavailable. Use only for whole-program cost. A flat fee paid through Impact sits in `Other_Cost`, inside Total Cost: IF it could be the same fee as a TL `price`, ask before adding them. |
|
|
89
|
+
| Conversion Rate | Actions ÷ Clicks | none | Impact actions over Impact clicks only. Suppressed per displayed ratio when the code-tracked share passes half (below); actions per 1,000 views is then the rate to read where TL views are available. |
|
|
90
90
|
| none | | Views: `views` on the video-index document (1.4), `projected_views_at_purchase_date` | TL only. Impact has no views. |
|
|
91
91
|
| none | | Paid to TL: `price` + `price_currency` | TL only. |
|
|
92
92
|
| none | | Sponsorship CPM: Paid to TL ÷ the video's current TL views × 1,000 | Always computed, on deals with TL views (1.4). Never from projected views (2.2). |
|
|
@@ -104,8 +104,10 @@ creator's actions — never once over the window and applied to every cell.
|
|
|
104
104
|
and never a blank cell: the column keeps its shape so the reader can tell suppression from
|
|
105
105
|
absence.
|
|
106
106
|
- ELSE print the rate.
|
|
107
|
-
- Give the reason once in the output: a sale made with a promo code
|
|
108
|
-
rate
|
|
107
|
+
- Give the reason once in the output: a sale made with a promo code can occur without a click,
|
|
108
|
+
so the rate may count conversions the tracked clicks did not produce. In the same note, point the
|
|
109
|
+
reader to actions per 1,000 views, which counts code and link sales alike. IF the row has no TL
|
|
110
|
+
views or zero views, say this alternative rate is unavailable; never invent views or divide by zero.
|
|
109
111
|
|
|
110
112
|
Event types: show approved actions per event type, plus a total labelled "all event types".
|
|
111
113
|
Sales revenue and commission sum across types.
|
|
@@ -125,13 +127,13 @@ Other cross metrics:
|
|
|
125
127
|
|---|---|---|
|
|
126
128
|
| Field | `price` (+ `price_currency`) | Action Cost (sum of `Payout`) |
|
|
127
129
|
| Timing | Fixed before the video | Grows with every sale, including after the video |
|
|
128
|
-
| Currency |
|
|
130
|
+
| Currency | USD, always | The Impact account's currency, shown in USD (2.3) |
|
|
129
131
|
|
|
130
132
|
Source of truth for what the brand paid:
|
|
131
133
|
|
|
132
134
|
| The creator was | Source of truth | Also shown |
|
|
133
135
|
|---|---|---|
|
|
134
|
-
| Booked through TL | Paid to TL, in
|
|
136
|
+
| Booked through TL | Paid to TL, in USD | Commission, as its own figure |
|
|
135
137
|
| Booked through TL and outside TL | Paid to TL, for the TL videos | Impact payments outside the TL bookings, own line, labelled "outside TL bookings" |
|
|
136
138
|
| Never booked through TL | Commission plus fixed payments through Impact (`Other_Cost`) | Nothing from TL |
|
|
137
139
|
|
|
@@ -149,6 +151,13 @@ value is 0 or blank: Impact clicks, approved actions, pending actions, conversio
|
|
|
149
151
|
revenue, commission (approved only), TL views, Paid to TL, sponsorship CPM, actions per 1,000
|
|
150
152
|
views, clicks per 1,000 views. No figure that adds commission to Paid to TL.
|
|
151
153
|
|
|
154
|
+
**Promo-code sales are sales.** A sale made with a promo code counts like a link sale in every
|
|
155
|
+
figure. In the table and opening summary, split approved actions by the recorded promo-code
|
|
156
|
+
field, e.g. "40 (12 with promo code, 28 without promo code)". This is code usage, not attribution:
|
|
157
|
+
a coded action can also have a winning click. Use "by promo code" / "by link" only when Impact
|
|
158
|
+
supplies evidence of the crediting method; never infer link attribution from a blank code. IF
|
|
159
|
+
the promo-code field is unavailable, say the split is unavailable rather than infer zero codes.
|
|
160
|
+
|
|
152
161
|
**Package pricing** — a row whose deals are priced 0 — drops that row's sponsorship CPM and
|
|
153
162
|
nothing else. Pending actions, clicks, views and both per-1,000-view columns stay, on that row
|
|
154
163
|
and on every other.
|
|
@@ -166,7 +175,7 @@ it does not satisfy this.
|
|
|
166
175
|
| Line | Definition |
|
|
167
176
|
|---|---|
|
|
168
177
|
| TL videos included | Every live sold TL deal for this brand and creator, across the creator's TL records in scope, to today |
|
|
169
|
-
| Paid to TL | Sum of those prices, in
|
|
178
|
+
| Paid to TL | Sum of those prices, in USD |
|
|
170
179
|
| Commission since the first TL video | Approved, first TL go-live to today, converted (2.3) |
|
|
171
180
|
| Commission before the first TL video | Approved, from the partner's first action to the day before the first go-live. Own line, labelled "outside TL bookings". Not added to any all-in figure |
|
|
172
181
|
| All-in cost | Paid to TL + commission since the first TL video |
|
|
@@ -189,23 +198,31 @@ it does not satisfy this.
|
|
|
189
198
|
|
|
190
199
|
### 2.3 Currency
|
|
191
200
|
|
|
201
|
+
TL prices are always in USD, and the report is in USD. The ECB rate is for one case only: Impact
|
|
202
|
+
figures in another currency, usually EUR.
|
|
203
|
+
|
|
192
204
|
Every money heading names its currency, in every case, e.g. "Paid to TL (USD)", "Sales revenue,
|
|
193
|
-
Impact (EUR)". A currency named once in the table's title covers that table. A
|
|
194
|
-
0 is still a money cell: "0" alone does not say which currency it is zero of,
|
|
195
|
-
otherwise empty — no commission before the first TL video, no sales in the period — is exactly
|
|
205
|
+
Impact (USD; EUR original)". A currency named once in the table's title covers that table. A
|
|
206
|
+
money cell reading 0 is still a money cell: "0" alone does not say which currency it is zero of,
|
|
207
|
+
and a row that is otherwise empty — no commission before the first TL video, no sales in the period — is exactly
|
|
196
208
|
where the heading is easiest to lose. Record the currency of the Impact figures from the report or
|
|
197
209
|
export; reports have a display-currency setting, so say so when Impact has already converted them.
|
|
198
210
|
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
211
|
+
- Never convert the TL price. IF a TL deal's `price_currency` is not USD, name the deal and its
|
|
212
|
+
currency to the user, since TL prices are expected in USD. Keep that price labelled in its
|
|
213
|
+
recorded currency and withhold every USD total or ratio that depends on it until its USD price
|
|
214
|
+
is confirmed. Never relabel it USD, mix it into a USD sum, or silently omit the deal from a total.
|
|
215
|
+
- IF the Impact figures are in USD (the account's own currency, or a report whose display
|
|
216
|
+
currency is USD): no conversion.
|
|
217
|
+
- ELSE (for example EUR): show every Impact money figure in USD, with the original beside it,
|
|
218
|
+
never in place of it, e.g. "Commission, Impact (USD 1,352; EUR 1,240)".
|
|
219
|
+
- Rate: the ECB euro reference rate for USD, averaged over the month of the Impact activity.
|
|
220
|
+
Convert each month at its own rate, then sum. A currency other than EUR goes through the
|
|
221
|
+
euro.
|
|
206
222
|
- Look the rate up; never use one from memory. IF the month's average is not yet published,
|
|
207
223
|
average that month's published daily rates and say so. IF no rate is found, show the original
|
|
208
|
-
currency only and say a rate is needed.
|
|
224
|
+
currency only and say a rate is needed. Withhold affected USD figures and calculations that
|
|
225
|
+
combine currencies until every required rate is available; never treat a missing rate as 1.
|
|
209
226
|
- Show the rates used in the column name or a note.
|
|
210
227
|
|
|
211
228
|
## 3. Identity join
|
|
@@ -264,6 +281,9 @@ The creator's codes are the promo codes on the creator's own actions that contai
|
|
|
264
281
|
(3.1). They are read from Impact's actions; TL holds no copy of them. Actions using them but
|
|
265
282
|
credited to another partner go on their own line under the creator, "creator's code, credited to
|
|
266
283
|
<partner>", with counts, sales revenue and commission, not added to the creator's totals.
|
|
284
|
+
Under the creator's totals, add one line labelled "including the creator's code credited to other
|
|
285
|
+
partners": approved actions and sales revenue with those actions added. The commission stays with
|
|
286
|
+
the partner that was paid it. The headline totals stay as they are.
|
|
267
287
|
|
|
268
288
|
### 3.5 Coverage count
|
|
269
289
|
|
|
@@ -355,7 +375,7 @@ Impact partner totals are lifetime and hide decay. Never judge a creator on a li
|
|
|
355
375
|
| Group | Definition | Shown |
|
|
356
376
|
|---|---|---|
|
|
357
377
|
| Booked through TL | TL channel with a sold deal for this brand | Scorecard or timeline, and the block |
|
|
358
|
-
| Not booked through TL | TL channel, no sold deal for this brand | Impact performance; what the brand paid through Impact as the source of truth, in
|
|
378
|
+
| Not booked through TL | TL channel, no sold deal for this brand | Impact performance; what the brand paid through Impact as the source of truth, in USD (2.3); cost per action = Impact payments ÷ approved actions; the TL channel's subscribers, projected views and bookability |
|
|
359
379
|
| Not a TL creator | No TL channel | Impact performance and Impact cost only |
|
|
360
380
|
|
|
361
381
|
- For the last two groups, Paid to TL reads "not booked through TL", never 0. Invent no TL figure.
|
|
@@ -364,7 +384,7 @@ Impact partner totals are lifetime and hide decay. Never judge a creator on a li
|
|
|
364
384
|
in range; syntax in the `tl` skill's Elasticsearch reference). List date, title and views, and
|
|
365
385
|
ask which ones the brand paid for; accept pasted links instead. Use only confirmed videos.
|
|
366
386
|
- CPM: Impact payments ÷ confirmed videos' TL views × 1,000, labelled "CPM on what you paid
|
|
367
|
-
through Impact", in
|
|
387
|
+
through Impact", in USD (2.3).
|
|
368
388
|
- Rebooking signal: each confirmed video's `projected_views` (frozen when TL first indexed it)
|
|
369
389
|
against the channel document's current projection, as a percent change. The channel
|
|
370
390
|
document's field is `impression`; a `projected_views` field on a channel document matches no
|
|
@@ -423,7 +443,7 @@ there; add no tenth to this block, and state no schema fact outside it.
|
|
|
423
443
|
| `adlink.media_url` | The sponsored video's own link; destination links live in `urls`. Its video id is the fallback when `article_id` is null (1.4). |
|
|
424
444
|
| `adlink.conversions` | Action count, hand-entered; set on few deals. |
|
|
425
445
|
| `adlink.revenue` + `adlink.revenue_currency` | Sales revenue and its currency, hand-entered; set on few deals. Elsewhere in TL "revenue" means the sold price. |
|
|
426
|
-
| `adlink.price_currency` | The currency of `price
|
|
446
|
+
| `adlink.price_currency` | The currency of `price`: always USD. Never converted (2.3). |
|
|
427
447
|
| `adlink.projected_views_at_purchase_date` | TL's projected views for the video, frozen at the purchase date. Never a source for CPM (2.2). |
|
|
428
448
|
| `adspot.ad_format` | The ad spot's format code: 4 YouTube, 8 TikTok, 9 Instagram, other values other placements (newsletter, podcast, stream, X). Nullable, and absent from the restricted schema. Not a source for whether a deal has TL views — that is the video-index document (1.4). |
|
|
429
449
|
| `channel.social_links` | JSON of the creator's links: platform keys (`instagram`, `tiktok`, …), an `_other` dict of the labelled links in the channel header, and an `_emails` array. ⚠️ Select named keys only. Never select the column wholesale: `_emails` is contact data and has no place in a performance report. |
|
{thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-brand-creator-connection/SKILL.md
RENAMED
|
@@ -224,6 +224,8 @@ PROFILE completion, three lines:
|
|
|
224
224
|
2. Fact count and what the socials lane did: `socials off, N linked platforms listed unread` or `socials on, N websites opened, N sources read, N facts`. Report "on" with 0 facts as such.
|
|
225
225
|
3. What was cached on the channel record this run (host name, format label, host aliases, sibling channels), from `host_name_cache` and `cache`.
|
|
226
226
|
|
|
227
|
+
A PROFILE-only run (no brand) is finished here: run `tl agent complete tl-brand-creator-connection` so a run opened from a ThoughtLeaders surface is counted (the CONNECT page reports itself). If the ledger could not be built, run it with `--outcome failed`.
|
|
228
|
+
|
|
227
229
|
**Fast run** (a run shape, not a flag): PROFILE only, primary channel only, socials OFF without asking, default selection, no corroboration round.
|
|
228
230
|
|
|
229
231
|
## 4. CONNECT pipeline
|
|
@@ -86,6 +86,10 @@ from collections import Counter, defaultdict
|
|
|
86
86
|
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent))
|
|
87
87
|
import tier_hint # sibling module # noqa: E402
|
|
88
88
|
from store_io import read_ledger # sibling module # noqa: E402
|
|
89
|
+
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[2] / "_shared"))
|
|
90
|
+
import tl_data # noqa: E402
|
|
91
|
+
|
|
92
|
+
SKILL = "tl-brand-creator-connection"
|
|
89
93
|
|
|
90
94
|
BADGES = {
|
|
91
95
|
"direct": "direct",
|
|
@@ -2092,6 +2096,8 @@ def main() -> None:
|
|
|
2092
2096
|
elapsed_s=round(time.monotonic() - t0, 1))
|
|
2093
2097
|
if problems:
|
|
2094
2098
|
print("PAGE CONTRACT: " + "; ".join(problems), file=sys.stderr)
|
|
2099
|
+
# The connections page is the deliverable; a no-fit page is still a result.
|
|
2100
|
+
tl_data.report_run(SKILL)
|
|
2095
2101
|
|
|
2096
2102
|
|
|
2097
2103
|
if __name__ == "__main__":
|
|
@@ -42,6 +42,7 @@ import tl_data
|
|
|
42
42
|
|
|
43
43
|
import channel_lookup
|
|
44
44
|
|
|
45
|
+
SKILL = "tl-channel-authenticity"
|
|
45
46
|
OUT_DIR = Path("/tmp")
|
|
46
47
|
|
|
47
48
|
|
|
@@ -147,12 +148,18 @@ def main() -> None:
|
|
|
147
148
|
if args.finalize:
|
|
148
149
|
if len(args.finalize) < 2:
|
|
149
150
|
ap.error("--finalize needs STATE and at least one LLM file")
|
|
150
|
-
|
|
151
|
+
try:
|
|
152
|
+
res = finalize(args.finalize[0], args.finalize[1:])
|
|
153
|
+
except Exception:
|
|
154
|
+
tl_data.report_run(SKILL, "failed")
|
|
155
|
+
raise
|
|
151
156
|
print(res["markdown"])
|
|
152
157
|
print(
|
|
153
158
|
f"\n<!-- final JSON: {res['final_json']} · "
|
|
154
159
|
f"report: {res['report_md']} -->"
|
|
155
160
|
)
|
|
161
|
+
# The verdict is the deliverable; the run is counted once it is printed.
|
|
162
|
+
tl_data.report_run(SKILL)
|
|
156
163
|
elif args.ref:
|
|
157
164
|
res = collect(args.ref)
|
|
158
165
|
print(json.dumps(res, indent=2))
|
|
@@ -505,9 +505,11 @@ The follow-up offer matters because **FilterSet changes (keywords, demographics,
|
|
|
505
505
|
|
|
506
506
|
If the user requests a chart, create it as a SVG graphic.
|
|
507
507
|
|
|
508
|
+
Then, as the last step, run `tl agent complete tl-save-report`. A run opened from a ThoughtLeaders surface (the Chrome extension's skill buttons) is counted as finished by it; one started by hand gets a short note and nothing else, which is fine.
|
|
509
|
+
|
|
508
510
|
### On failure
|
|
509
511
|
|
|
510
|
-
If the command exits non-zero, the CLI prints the error on stderr (shape: `Error (NNN): <detail>` for most codes; specific lines for 401/402/403). **Surface the error verbatim** — do NOT silently report success.
|
|
512
|
+
If the command exits non-zero, the CLI prints the error on stderr (shape: `Error (NNN): <detail>` for most codes; specific lines for 401/402/403). **Surface the error verbatim** — do NOT silently report success. Then run `tl agent complete tl-save-report --outcome failed`.
|
|
511
513
|
|
|
512
514
|
Map the visible code + detail to the likely cause:
|
|
513
515
|
|
{thoughtleaders_cli-0.9.18 → thoughtleaders_cli-0.9.20}/skills/tl-views-guarantee/scripts/vg.py
RENAMED
|
@@ -15,12 +15,18 @@ Usage:
|
|
|
15
15
|
import argparse
|
|
16
16
|
import datetime
|
|
17
17
|
import json
|
|
18
|
+
import pathlib as _pathlib
|
|
18
19
|
import random
|
|
19
20
|
import subprocess
|
|
20
21
|
import sys
|
|
21
22
|
from dataclasses import dataclass
|
|
22
23
|
from typing import TypedDict
|
|
23
24
|
|
|
25
|
+
sys.path.insert(0, str(_pathlib.Path(__file__).resolve().parents[2] / "_shared"))
|
|
26
|
+
import tl_data # noqa: E402
|
|
27
|
+
|
|
28
|
+
SKILL = "tl-views-guarantee"
|
|
29
|
+
|
|
24
30
|
SEED = 42 # passed to a fresh random.Random in bootstrap_sweep so each call starts from the same RNG state
|
|
25
31
|
DEFAULT_MAX_BUNDLE_SIZE = 4
|
|
26
32
|
HARD_MAX_BUNDLE_SIZE = 10
|
|
@@ -368,4 +374,15 @@ def main() -> None:
|
|
|
368
374
|
|
|
369
375
|
|
|
370
376
|
if __name__ == "__main__":
|
|
371
|
-
|
|
377
|
+
# The run is counted once the four lines are out; a data shortfall (a
|
|
378
|
+
# message exit) is a run with nothing to show, a crash is a failed one.
|
|
379
|
+
try:
|
|
380
|
+
main()
|
|
381
|
+
except SystemExit as exc:
|
|
382
|
+
if exc.code not in (None, 0):
|
|
383
|
+
tl_data.report_run(SKILL, "no_results" if isinstance(exc.code, str) else "failed")
|
|
384
|
+
raise
|
|
385
|
+
except Exception:
|
|
386
|
+
tl_data.report_run(SKILL, "failed")
|
|
387
|
+
raise
|
|
388
|
+
tl_data.report_run(SKILL)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""tl agent — the AI agent you open ThoughtLeaders skills in.
|
|
2
|
+
|
|
3
|
+
A skill handed over from a ThoughtLeaders surface (the Chrome extension's skill
|
|
4
|
+
buttons, the web app's export door) is counted as finished when it reports back
|
|
5
|
+
here with its slug and how it ended.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
|
|
11
|
+
from tl_cli._typer_utils import AlphaSortedTyperGroup
|
|
12
|
+
from tl_cli.client.errors import ApiError, handle_api_error
|
|
13
|
+
from tl_cli.client.http import get_client
|
|
14
|
+
from tl_cli.output.formatter import detect_format, output_single
|
|
15
|
+
|
|
16
|
+
app = typer.Typer(cls=AlphaSortedTyperGroup, help="Your AI agent: report a skill it ran as finished (free)")
|
|
17
|
+
|
|
18
|
+
OUTCOMES = ("completed", "no_results", "failed")
|
|
19
|
+
NO_RUN_CODE = "run_not_found"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@app.command("complete")
|
|
23
|
+
def complete_cmd(
|
|
24
|
+
skill: str = typer.Argument(..., help="The skill's slug, e.g. tl-views-guarantee"),
|
|
25
|
+
outcome: str = typer.Option("completed", "--outcome", help="How the run ended: completed, no_results or failed"),
|
|
26
|
+
json_output: bool = typer.Option(False, "--json", help="JSON output"),
|
|
27
|
+
toon_output: bool = typer.Option(False, "--toon", help="TOON output (token-efficient for LLMs)"),
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Report that a skill opened from a ThoughtLeaders surface has finished.
|
|
30
|
+
|
|
31
|
+
Skills call this as their last step. Only a skill opened from a ThoughtLeaders
|
|
32
|
+
surface has a run to close; one started by hand is simply not counted, and
|
|
33
|
+
this command says so and exits cleanly, so a skill's own result is never
|
|
34
|
+
lost over it.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
tl agent complete tl-views-guarantee
|
|
38
|
+
tl agent complete tl-channel-authenticity --outcome no_results
|
|
39
|
+
tl agent complete tl-brand-creator-connection --outcome failed
|
|
40
|
+
"""
|
|
41
|
+
fmt = detect_format(json_output, False, False, toon_output)
|
|
42
|
+
err = Console(stderr=True)
|
|
43
|
+
if outcome not in OUTCOMES:
|
|
44
|
+
err.print(f"[red]Error:[/red] --outcome must be one of: {', '.join(OUTCOMES)}.")
|
|
45
|
+
raise typer.Exit(1)
|
|
46
|
+
|
|
47
|
+
client = get_client()
|
|
48
|
+
try:
|
|
49
|
+
data = client.post("/agent/complete", json_body={"skill": skill, "outcome": outcome})
|
|
50
|
+
output_single(data, fmt)
|
|
51
|
+
except ApiError as e:
|
|
52
|
+
if e.status_code == 404 and isinstance(e.raw, dict) and e.raw.get("code") == NO_RUN_CODE:
|
|
53
|
+
err.print(f"[dim]No open run of {skill} from a ThoughtLeaders surface; nothing to report.[/dim]")
|
|
54
|
+
return
|
|
55
|
+
handle_api_error(e)
|
|
56
|
+
finally:
|
|
57
|
+
client.close()
|
|
@@ -10,33 +10,35 @@ import typer
|
|
|
10
10
|
from rich.console import Console
|
|
11
11
|
|
|
12
12
|
from tl_cli import __version__
|
|
13
|
-
from tl_cli._typer_utils import AlphaSortedTyperGroup
|
|
14
13
|
from tl_cli import config as tl_config
|
|
14
|
+
from tl_cli._typer_utils import AlphaSortedTyperGroup
|
|
15
15
|
from tl_cli.auth.commands import app as auth_app
|
|
16
|
+
from tl_cli.commands.agent import app as agent_app
|
|
16
17
|
from tl_cli.commands.balance import app as balance_app
|
|
17
|
-
from tl_cli.commands.changelog import changelog_command
|
|
18
18
|
from tl_cli.commands.brands import app as brands_app
|
|
19
19
|
from tl_cli.commands.bulk_import import bulk_import_command
|
|
20
|
-
from tl_cli.commands.
|
|
20
|
+
from tl_cli.commands.changelog import changelog_command
|
|
21
21
|
from tl_cli.commands.channels import app as channels_app
|
|
22
|
+
from tl_cli.commands.credits import app as credits_app
|
|
22
23
|
from tl_cli.commands.db import app as db_app
|
|
23
24
|
from tl_cli.commands.deals import app as deals_app
|
|
25
|
+
from tl_cli.commands.describe import app as describe_app
|
|
26
|
+
from tl_cli.commands.doctor import app as doctor_app
|
|
24
27
|
from tl_cli.commands.matches import app as matches_app
|
|
25
28
|
from tl_cli.commands.memory import app as memory_app
|
|
26
29
|
from tl_cli.commands.profiles import app as profiles_app
|
|
27
30
|
from tl_cli.commands.proposals import app as proposals_app
|
|
28
31
|
from tl_cli.commands.recommender import app as recommender_app
|
|
29
|
-
from tl_cli.commands.sponsorships import app as sponsorships_app
|
|
30
|
-
from tl_cli.commands.describe import app as describe_app
|
|
31
|
-
from tl_cli.commands.schema import app as schema_app
|
|
32
|
-
from tl_cli.commands.doctor import app as doctor_app
|
|
33
32
|
from tl_cli.commands.reports import app as reports_app
|
|
34
|
-
from tl_cli.commands.
|
|
33
|
+
from tl_cli.commands.schema import app as schema_app
|
|
35
34
|
from tl_cli.commands.setup import app as setup_app
|
|
36
|
-
from tl_cli.commands.skills import app as skills_app
|
|
35
|
+
from tl_cli.commands.skills import app as skills_app
|
|
36
|
+
from tl_cli.commands.skills import check_skill_staleness
|
|
37
37
|
from tl_cli.commands.snapshots import app as snapshots_app
|
|
38
|
+
from tl_cli.commands.sponsorships import app as sponsorships_app
|
|
38
39
|
from tl_cli.commands.uploads import app as uploads_app
|
|
39
40
|
from tl_cli.commands.whoami import app as whoami_app
|
|
41
|
+
from tl_cli.commands.workflows import app as workflows_app
|
|
40
42
|
|
|
41
43
|
app = typer.Typer(
|
|
42
44
|
name="tl",
|
|
@@ -124,6 +126,7 @@ app.add_typer(balance_app, name="balance")
|
|
|
124
126
|
app.add_typer(credits_app, name="credits")
|
|
125
127
|
app.add_typer(doctor_app, name="doctor")
|
|
126
128
|
app.add_typer(whoami_app, name="whoami")
|
|
129
|
+
app.add_typer(agent_app, name="agent")
|
|
127
130
|
|
|
128
131
|
# `changelog` is a single command (not a sub-typer) so positional version args
|
|
129
132
|
# don't get interpreted as subcommand names.
|