thoughtleaders-cli 0.7.0__tar.gz → 0.7.1__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.7.0 → thoughtleaders_cli-0.7.1}/.claude-plugin/plugin.json +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/.gitignore +3 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/PKG-INFO +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/agents/youtube-comment-classifier.md +2 -2
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/pyproject.toml +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/SKILL.md +3 -2
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/_io_utf8.py +1 -1
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/analyze_channel.py +2 -2
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/report.py +1 -1
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/tl_cli.py +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-import/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-keyword-research/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-views-guarantee/SKILL.md +1 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/__init__.py +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/doctor.py +1 -1
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/setup.py +39 -4
- thoughtleaders_cli-0.7.1/tests/test_setup.py +41 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/.claude-plugin/marketplace.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/.github/workflows/python-publish.yml +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/AGENTS.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/API.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/CLAUDE.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/LICENSE +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/README.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/agents/tl-analyst.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/hooks/hooks.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/hooks/scripts/load-tl-skill.mjs +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/hooks/scripts/post-usage.sh +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/hooks/scripts/pre-check.sh +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/business-glossary.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/elasticsearch-schema.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/firebolt-schema.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/postgres-schema.md +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/.gitignore +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/references/comment-patterns.md +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/references/peer-cohort.md +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/references/red-flags.md +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/references/scoring.md +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/anomaly_detector.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/comment_analyzer.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/comment_scraper.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/engagement_ratios.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/peer_cohort.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/resolve_channel.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/score.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/video_integrity.py +0 -0
- {thoughtleaders_cli-0.7.0/skills/channel-authenticity → thoughtleaders_cli-0.7.1/skills/tl-channel-authenticity}/scripts/view_curves.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-keyword-research/scripts/probe.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/examples/e2e_findings.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/examples/golden_queries.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/columns_brands.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/columns_channels.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/columns_content.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/columns_sponsorships.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/intelligence_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/intelligence_widget_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/report_glossary.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/sortable_columns.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/sponsorship_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/sponsorship_widget_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/widgets.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/column_builder.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/database_query.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/name_resolver.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/sample_judge.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/similar_channels.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/topic_matcher.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/widget_builder.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/columns_brands.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/columns_channels.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/columns_content.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/columns_sponsorships.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/intelligence_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/intelligence_widget_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/report_glossary.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/sortable_columns.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/sponsorship_filterset_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/sponsorship_widget_schema.json +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/widgets.md +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-views-guarantee/scripts/vg.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/_completions.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/__init__.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/commands.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/finalize.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/login.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/pkce.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/auth/token_store.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/client/__init__.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/client/errors.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/client/http.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/__init__.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/_comments_common.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/balance.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/brands.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/bulk_import.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/changelog.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/channels.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/credits.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/db.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/deals.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/describe.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/matches.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/proposals.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/recommender.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/reports.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/schema.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/snapshots.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/sponsorships.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/uploads.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/whoami.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/config.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/filters.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/hints.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/main.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/output/__init__.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/output/formatter.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/self_update.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/__init__.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_auth.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_describe.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_filters.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_http_auth.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_output.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_reports.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/tests/test_sponsorships.py +0 -0
- {thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thoughtleaders-cli
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.1
|
|
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
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: youtube-comment-classifier
|
|
3
3
|
description: >
|
|
4
4
|
Classifies a batch of YouTube comments as organic vs bot/spam/template for
|
|
5
|
-
the channel-authenticity skill's fake-engagement detection. Use when you
|
|
5
|
+
the tl-channel-authenticity skill's fake-engagement detection. Use when you
|
|
6
6
|
have a JSON array of scraped comments and need a fast, cheap per-comment
|
|
7
7
|
authenticity judgment. Returns strict JSON only.
|
|
8
8
|
model: haiku
|
|
@@ -14,7 +14,7 @@ color: yellow
|
|
|
14
14
|
|
|
15
15
|
You judge whether YouTube comments come from a real, engaged human audience or
|
|
16
16
|
from engagement padding (bots, comment farms, generic filler). You are used by
|
|
17
|
-
the `channel-authenticity` skill to vet channels before ThoughtLeaders books a
|
|
17
|
+
the `tl-channel-authenticity` skill to vet channels before ThoughtLeaders books a
|
|
18
18
|
paid sponsorship, so false "organic" verdicts cost real money — be skeptical.
|
|
19
19
|
|
|
20
20
|
## Input
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl
|
|
3
|
+
tl-blurb: data analyst (smart query router)
|
|
3
4
|
description: |
|
|
4
5
|
Query and analyze YouTube sponsorship data using the `tl` CLI. Use this skill for finding channels, brands and sponsorships, and for data exploration, including counts, metrics, trends, time-series, distributions, single-record drill-downs, revenue / pipeline-weighting math, view-curve analysis, cross-source business questions. Examples: "How many deals did we close last quarter?", "What's the weighted pipeline by sales owner?", "Show me the view curve for video X", "Find mentions of Surfshark in transcripts", "Investigate this video", "Find channels...", "Find brands...".
|
|
5
6
|
---
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: channel-authenticity
|
|
2
|
+
name: tl-channel-authenticity
|
|
3
|
+
tl-blurb: vet a channel for fake views
|
|
3
4
|
description: >
|
|
4
5
|
Detect non-organic views / fake engagement / bot comments on a YouTube
|
|
5
6
|
channel before booking (or after delivering) a sponsorship. Use when asked
|
|
@@ -33,7 +34,7 @@ investigations.
|
|
|
33
34
|
## Setup check
|
|
34
35
|
|
|
35
36
|
```bash
|
|
36
|
-
cd .claude/skills/channel-authenticity/scripts
|
|
37
|
+
cd .claude/skills/tl-channel-authenticity/scripts
|
|
37
38
|
python3 tl_cli.py preflight # must print "OK"
|
|
38
39
|
```
|
|
39
40
|
If this errors with `cli_unavailable`, tell the user to run `tl auth login`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Shared UTF-8 I/O setup for the channel-authenticity scripts.
|
|
1
|
+
"""Shared UTF-8 I/O setup for the tl-channel-authenticity scripts.
|
|
2
2
|
|
|
3
3
|
YouTube data is full of non-ASCII: channel names, comment text, emoji.
|
|
4
4
|
On POSIX the default I/O encoding is already UTF-8, but on Windows the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""channel-authenticity orchestrator — two-phase (subagent in the middle).
|
|
2
|
+
"""tl-channel-authenticity orchestrator — two-phase (subagent in the middle).
|
|
3
3
|
|
|
4
4
|
Phase 1 (collect):
|
|
5
5
|
analyze_channel.py "<ref>"
|
|
@@ -128,7 +128,7 @@ def finalize(state_path: str, llm_paths: list[str]) -> dict:
|
|
|
128
128
|
|
|
129
129
|
|
|
130
130
|
def main() -> None:
|
|
131
|
-
ap = argparse.ArgumentParser(description="channel-authenticity orchestrator")
|
|
131
|
+
ap = argparse.ArgumentParser(description="tl-channel-authenticity orchestrator")
|
|
132
132
|
ap.add_argument("ref", nargs="?", help="channel handle/url/id or adlink:<id>")
|
|
133
133
|
ap.add_argument(
|
|
134
134
|
"--finalize",
|
|
@@ -120,7 +120,7 @@ def render(state: dict) -> str:
|
|
|
120
120
|
L.append("")
|
|
121
121
|
L.append("---")
|
|
122
122
|
L.append(
|
|
123
|
-
"_Generated by the `channel-authenticity` skill. Data via the "
|
|
123
|
+
"_Generated by the `tl-channel-authenticity` skill. Data via the "
|
|
124
124
|
"ThoughtLeaders CLI; comments scraped fresh from YouTube._"
|
|
125
125
|
)
|
|
126
126
|
return "\n".join(L)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Single data-access seam for the channel-authenticity skill.
|
|
2
|
+
"""Single data-access seam for the tl-channel-authenticity skill.
|
|
3
3
|
|
|
4
4
|
Every TL data getter shells out to the ``tl`` CLI (``tl db pg/fb/es``,
|
|
5
5
|
``tl channels similar``), so the skill works for anyone with a ThoughtLeaders
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl-import
|
|
3
|
+
tl-blurb: bulk-import lists into a report
|
|
3
4
|
description: Import a list of channels, brands, uploads (videos), or sponsorships into a ThoughtLeaders report — either an existing report (caller supplies `campaign_id` or a TL report URL) or a fresh new one (skill creates a minimal container, then populates). Superuser-only. **Trigger on explicit intent to import the listed entities into a report**, NOT on the mere presence of a list (a user can paste a list and want analysis, comparison, or similar-channel discovery — those go to `tl-cli:tl`). The deciding question is: *would the user be satisfied if those exact entities ended up as the report's contents, no transformation?* If yes, this is the skill. Phrasings: "import these channels into report 1234", "add brands to campaign 5678", "exclude these channels from report Z", "bulk-add these videos to report X", "create a new report with these channels: <list>", "make a campaign containing these brands: <list>".
|
|
4
5
|
---
|
|
5
6
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl-keyword-research
|
|
3
|
+
tl-blurb: rank content-search keywords
|
|
3
4
|
description: |
|
|
4
5
|
Broaden and rank a set of content-search keywords. Invoke when the user wants to find videos or channels by content keywords (topics, concepts, niches) — not by ID or exact name. Takes one or more seed keywords (or an NL phrase), proposes related candidates, probes Elasticsearch for each one against the `title` / `summary` / `transcript` fields, and returns a strict JSON object `{"keywords":[{"keyword","count"},...]}` sorted descending by document count. The output is meant to feed the next step (typically a `tl db es` content search with the surviving high-count keywords).
|
|
5
6
|
---
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl-report-builder
|
|
3
|
+
tl-blurb: build a TL report from scratch
|
|
3
4
|
description: |
|
|
4
5
|
**MANUAL-INVOCATION-ONLY skill — do NOT auto-trigger on natural-language report requests.** This skill is invoked explicitly by the user (via the `/tl-report-builder` slash command, by naming the skill directly, or via some other unambiguous indication). Phrases like "build me a report", "make a campaign", "find me channels with filters Y", or "save this as a report" do NOT route here automatically. Those phrases go to other skills: the `tl` skill (for analysis / exploration of channels / brands / videos / sponsorships), `tl-save-report` (for persisting an in-chat session's result set as a saved report — filter-style or list-style), or `tl-import` (for adding identifiers to an existing report). This skill itself builds a brand-new TL report config from scratch through a heavy four-phase orchestration (routing → schema + validation → columns → widgets), covering the four report types: content/videos (1), brands (2), channels (3), sponsorships/deals (8). Only fire it when the user has explicitly chosen this path — there's almost always a lighter skill that's the right answer.
|
|
5
6
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl-save-report
|
|
3
|
+
tl-blurb: save a session as a report
|
|
3
4
|
description: |
|
|
4
5
|
Save the results of an in-chat data-exploration session as a TL report. Triggers when the user wants to persist a channels / brands / videos (uploads) / sponsorships list or filtered set they've been working with — phrases like "save this as a report", "save the list", "turn this into a campaign", "persist this", "make a report from what you found", "save the result", "I want to come back to this".
|
|
5
6
|
---
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tl-views-guarantee
|
|
3
|
+
tl-blurb: size a multi-video views guarantee
|
|
3
4
|
description: Calculate the optimal views guarantee (VG) for a multi-video sponsorship buy with a YouTube creator. Given a channel ID or name, returns "video bundle size / views guarantee / likelihood to hit" based on bootstrap simulation of the channel's recent video performance (view counts measured at video age ~30 days). Use when someone asks "what VG should I push for with [creator]", "how many videos should I buy from [creator]", "calculate VG for [channel]", "what's a safe guarantee for [channel]", or anything involving setting views guarantees in a sponsorship deal. Triggers on "VG", "views guarantee", "views minimum", and any request to size a multi-video buy.
|
|
4
5
|
---
|
|
5
6
|
|
|
@@ -68,7 +68,7 @@ _RECOMMENDED_TOOLS: tuple[tuple[str, str, dict[str, str]], ...] = (
|
|
|
68
68
|
),
|
|
69
69
|
(
|
|
70
70
|
"yt-dlp",
|
|
71
|
-
"YouTube metadata/download tool — used by the channel-authenticity skill to fetch video and comment data.",
|
|
71
|
+
"YouTube metadata/download tool — used by the tl-channel-authenticity skill to fetch video and comment data.",
|
|
72
72
|
{
|
|
73
73
|
"Linux": "pipx install yt-dlp (or `pip install yt-dlp` / `apt install yt-dlp`)",
|
|
74
74
|
"Darwin": "brew install yt-dlp",
|
|
@@ -155,6 +155,41 @@ def _install_standalone_skills(plugin_root: Path) -> int:
|
|
|
155
155
|
return count
|
|
156
156
|
|
|
157
157
|
|
|
158
|
+
def _bundled_skill_blurbs(plugin_root: Path) -> list[tuple[str, str]]:
|
|
159
|
+
"""Read (name, tl-blurb) for each bundled skill, for the setup summary.
|
|
160
|
+
|
|
161
|
+
Reads the `tl-blurb` frontmatter key from skills/<name>/SKILL.md so the
|
|
162
|
+
summary stays in sync with the skills actually shipped — no hand-maintained
|
|
163
|
+
list to drift. Skills without the key are skipped. Sorted by name.
|
|
164
|
+
"""
|
|
165
|
+
skills_src = plugin_root / "skills"
|
|
166
|
+
if not skills_src.is_dir():
|
|
167
|
+
return []
|
|
168
|
+
blurbs: list[tuple[str, str]] = []
|
|
169
|
+
for skill_dir in skills_src.iterdir():
|
|
170
|
+
skill_md = skill_dir / "SKILL.md"
|
|
171
|
+
if not skill_md.is_file():
|
|
172
|
+
continue
|
|
173
|
+
name = blurb = None
|
|
174
|
+
in_frontmatter = False
|
|
175
|
+
for line in skill_md.read_text(encoding="utf-8").splitlines():
|
|
176
|
+
if line.strip() == "---":
|
|
177
|
+
if in_frontmatter:
|
|
178
|
+
break
|
|
179
|
+
in_frontmatter = True
|
|
180
|
+
continue
|
|
181
|
+
if not in_frontmatter:
|
|
182
|
+
continue
|
|
183
|
+
if line.startswith("name:"):
|
|
184
|
+
name = line[len("name:"):].strip()
|
|
185
|
+
elif line.startswith("tl-blurb:"):
|
|
186
|
+
blurb = line[len("tl-blurb:"):].strip()
|
|
187
|
+
if name and blurb:
|
|
188
|
+
blurbs.append((name, blurb))
|
|
189
|
+
blurbs.sort(key=lambda nb: nb[0])
|
|
190
|
+
return blurbs
|
|
191
|
+
|
|
192
|
+
|
|
158
193
|
def _print_manual_instructions() -> None:
|
|
159
194
|
"""Print manual install instructions when claude binary is not found."""
|
|
160
195
|
console.print()
|
|
@@ -264,10 +299,10 @@ def setup_claude(
|
|
|
264
299
|
console.print("[green]Setup complete![/green]")
|
|
265
300
|
console.print()
|
|
266
301
|
console.print("Available skills in Claude Code:")
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
302
|
+
blurbs = _bundled_skill_blurbs(plugin_root)
|
|
303
|
+
width = max((len(name) for name, _ in blurbs), default=0)
|
|
304
|
+
for name, blurb in blurbs:
|
|
305
|
+
console.print(f" [cyan]/{name}[/cyan]{' ' * (width - len(name))} — {blurb}")
|
|
271
306
|
console.print()
|
|
272
307
|
console.print("Try it:")
|
|
273
308
|
console.print(" [cyan]/tl Which channels did we sponsor in Q1?[/cyan]")
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Tests for `tl setup` helpers."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from tl_cli.commands.setup import _bundled_skill_blurbs
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _write_skill(skills_dir: Path, name: str, body: str) -> None:
|
|
9
|
+
skill_dir = skills_dir / name
|
|
10
|
+
skill_dir.mkdir(parents=True)
|
|
11
|
+
(skill_dir / "SKILL.md").write_text(body, encoding="utf-8")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestBundledSkillBlurbs:
|
|
15
|
+
def test_reads_name_and_blurb_sorted(self, tmp_path):
|
|
16
|
+
skills = tmp_path / "skills"
|
|
17
|
+
_write_skill(skills, "tl", "---\nname: tl\ntl-blurb: data analyst\ndescription: |\n Long desc.\n---\n")
|
|
18
|
+
_write_skill(skills, "alpha", "---\nname: alpha\ntl-blurb: first thing\ndescription: x\n---\n")
|
|
19
|
+
assert _bundled_skill_blurbs(tmp_path) == [
|
|
20
|
+
("alpha", "first thing"),
|
|
21
|
+
("tl", "data analyst"),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
def test_skips_skill_without_blurb(self, tmp_path):
|
|
25
|
+
skills = tmp_path / "skills"
|
|
26
|
+
_write_skill(skills, "tl", "---\nname: tl\ntl-blurb: has one\ndescription: x\n---\n")
|
|
27
|
+
_write_skill(skills, "other", "---\nname: other\ndescription: no blurb here\n---\n")
|
|
28
|
+
assert _bundled_skill_blurbs(tmp_path) == [("tl", "has one")]
|
|
29
|
+
|
|
30
|
+
def test_ignores_blurb_lookalike_in_body(self, tmp_path):
|
|
31
|
+
# A `tl-blurb:` line in the markdown body (after frontmatter) must not be picked up.
|
|
32
|
+
skills = tmp_path / "skills"
|
|
33
|
+
_write_skill(
|
|
34
|
+
skills,
|
|
35
|
+
"tl",
|
|
36
|
+
"---\nname: tl\ntl-blurb: real blurb\ndescription: x\n---\n\ntl-blurb: not this one\n",
|
|
37
|
+
)
|
|
38
|
+
assert _bundled_skill_blurbs(tmp_path) == [("tl", "real blurb")]
|
|
39
|
+
|
|
40
|
+
def test_missing_skills_dir_returns_empty(self, tmp_path):
|
|
41
|
+
assert _bundled_skill_blurbs(tmp_path) == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/business-glossary.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/elasticsearch-schema.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/firebolt-schema.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl/references/postgres-schema.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-keyword-research/scripts/probe.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/references/widgets.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-report-builder/tools/sample_judge.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-save-report/references/widgets.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/skills/tl-views-guarantee/scripts/vg.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.7.0 → thoughtleaders_cli-0.7.1}/src/tl_cli/commands/_comments_common.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|