thoughtleaders-cli 0.6.37__tar.gz → 0.6.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/.claude-plugin/plugin.json +1 -1
  2. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/PKG-INFO +4 -3
  3. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/README.md +2 -1
  4. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/pyproject.toml +5 -6
  5. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl/SKILL.md +2 -0
  6. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/__init__.py +1 -1
  7. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/whoami.py +1 -1
  8. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/output/formatter.py +2 -2
  9. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/self_update.py +75 -8
  10. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/.claude-plugin/marketplace.json +0 -0
  11. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/.github/workflows/python-publish.yml +0 -0
  12. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/.gitignore +0 -0
  13. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/AGENTS.md +0 -0
  14. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/CLAUDE.md +0 -0
  15. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/LICENSE +0 -0
  16. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/agents/tl-analyst.md +0 -0
  17. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/docs/architecture.md +0 -0
  18. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/hooks/hooks.json +0 -0
  19. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/hooks/scripts/load-tl-skill.mjs +0 -0
  20. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/hooks/scripts/post-usage.sh +0 -0
  21. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/hooks/scripts/pre-check.sh +0 -0
  22. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl/references/business-glossary.md +0 -0
  23. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl/references/elasticsearch-schema.md +0 -0
  24. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl/references/firebolt-schema.md +0 -0
  25. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl/references/postgres-schema.md +0 -0
  26. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-import/SKILL.md +0 -0
  27. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/SKILL.md +0 -0
  28. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/examples/e2e_findings.md +0 -0
  29. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/examples/golden_queries.md +0 -0
  30. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/columns_brands.md +0 -0
  31. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/columns_channels.md +0 -0
  32. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/columns_content.md +0 -0
  33. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/columns_sponsorships.md +0 -0
  34. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/intelligence_filterset_schema.json +0 -0
  35. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/intelligence_widget_schema.json +0 -0
  36. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/report_glossary.md +0 -0
  37. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/sortable_columns.json +0 -0
  38. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/sponsorship_filterset_schema.json +0 -0
  39. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/sponsorship_widget_schema.json +0 -0
  40. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/references/widgets.md +0 -0
  41. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/column_builder.md +0 -0
  42. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/database_query.md +0 -0
  43. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/keyword_research.md +0 -0
  44. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/name_resolver.md +0 -0
  45. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/sample_judge.md +0 -0
  46. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/similar_channels.md +0 -0
  47. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/topic_matcher.md +0 -0
  48. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/skills/tl-report-builder/tools/widget_builder.md +0 -0
  49. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/_completions.py +0 -0
  50. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/__init__.py +0 -0
  51. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/commands.py +0 -0
  52. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/finalize.py +0 -0
  53. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/login.py +0 -0
  54. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/pkce.py +0 -0
  55. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/auth/token_store.py +0 -0
  56. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/client/__init__.py +0 -0
  57. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/client/errors.py +0 -0
  58. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/client/http.py +0 -0
  59. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/__init__.py +0 -0
  60. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/_comments_common.py +0 -0
  61. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/ask.py +0 -0
  62. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/balance.py +0 -0
  63. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/brands.py +0 -0
  64. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/bulk_import.py +0 -0
  65. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/changelog.py +0 -0
  66. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/channels.py +0 -0
  67. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/credits.py +0 -0
  68. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/db.py +0 -0
  69. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/deals.py +0 -0
  70. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/describe.py +0 -0
  71. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/doctor.py +0 -0
  72. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/matches.py +0 -0
  73. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/proposals.py +0 -0
  74. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/recommender.py +0 -0
  75. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/reports.py +0 -0
  76. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/schema.py +0 -0
  77. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/setup.py +0 -0
  78. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/snapshots.py +0 -0
  79. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/sponsorships.py +0 -0
  80. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/commands/uploads.py +0 -0
  81. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/config.py +0 -0
  82. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/filters.py +0 -0
  83. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/hints.py +0 -0
  84. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/main.py +0 -0
  85. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/src/tl_cli/output/__init__.py +0 -0
  86. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/__init__.py +0 -0
  87. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/test_auth.py +0 -0
  88. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/test_filters.py +0 -0
  89. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/test_output.py +0 -0
  90. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/test_reports.py +0 -0
  91. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/tests/test_sponsorships.py +0 -0
  92. {thoughtleaders_cli-0.6.37 → thoughtleaders_cli-0.6.38}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tl-cli",
3
- "version": "0.6.37",
3
+ "version": "0.6.38",
4
4
  "description": "ThoughtLeaders CLI — query sponsorship deals, channels, brands, uploads, and intelligence from the terminal",
5
5
  "author": {
6
6
  "name": "ThoughtLeaders",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thoughtleaders-cli
3
- Version: 0.6.37
3
+ Version: 0.6.38
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
@@ -22,7 +22,7 @@ Requires-Dist: httpx>=0.27
22
22
  Requires-Dist: keyring>=25.0
23
23
  Requires-Dist: pyyaml>=6.0
24
24
  Requires-Dist: rich>=13.0
25
- Requires-Dist: toon-format==0.9.0b1
25
+ Requires-Dist: toon-codec>=1.0.1
26
26
  Requires-Dist: typer>=0.16
27
27
  Description-Content-Type: text/markdown
28
28
 
@@ -44,10 +44,11 @@ pip install -e .
44
44
  ### As a user
45
45
 
46
46
  ```bash
47
+ # Recommended:
47
48
  pipx install thoughtleaders-cli
48
49
  # or
49
50
  uv tool install thoughtleaders-cli
50
- # or (but try to avoid it because just "pip" will not create a new venv for the product - only "uv" and "pipx" will do that)
51
+ # or (avoid this plain `pip` will install into your current environment instead of a fresh venv)
51
52
  pip install thoughtleaders-cli
52
53
  ```
53
54
 
@@ -16,10 +16,11 @@ pip install -e .
16
16
  ### As a user
17
17
 
18
18
  ```bash
19
+ # Recommended:
19
20
  pipx install thoughtleaders-cli
20
21
  # or
21
22
  uv tool install thoughtleaders-cli
22
- # or (but try to avoid it because just "pip" will not create a new venv for the product - only "uv" and "pipx" will do that)
23
+ # or (avoid this plain `pip` will install into your current environment instead of a fresh venv)
23
24
  pip install thoughtleaders-cli
24
25
  ```
25
26
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "thoughtleaders-cli"
7
- version = "0.6.37"
7
+ version = "0.6.38"
8
8
  description = "ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -31,11 +31,10 @@ dependencies = [
31
31
  "httpx>=0.27",
32
32
  "keyring>=25.0",
33
33
  "authlib>=1.3",
34
- # `toon-format` only publishes pre-releases (0.9.0b1 is the only modern
35
- # release; 0.1.0 is the lone stable). pip/pipx accept `>=0.9.0b1` and pull
36
- # the beta, but uv refuses pre-releases under `>=` when a stable exists.
37
- # An exact pin is the one form uv will resolve without `--prerelease=allow`.
38
- "toon-format==0.9.0b1",
34
+ # toon-codec (imports as `pytoon`) is the stable-released TOON encoder.
35
+ # Replaces toon-format which only publishes pre-releases and made
36
+ # `uv tool install` / `uv pip install` fail without --prerelease=allow.
37
+ "toon-codec>=1.0.1",
39
38
  "pyyaml>=6.0",
40
39
  ]
41
40
 
@@ -147,6 +147,8 @@ Prefer writing Python code, shell code, or `jq` commands that fetche or analysis
147
147
 
148
148
  ## Available Commands
149
149
 
150
+ Note that if you're working on Windows, you need to set up UTF-8 in the console, because all of these commands return UTF-8 data.
151
+
150
152
  ### Data queries
151
153
  ```bash
152
154
  tl sponsorships list [filters...] # Sponsorships — list curve, mult 1.0
@@ -1,3 +1,3 @@
1
1
  """ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence."""
2
2
 
3
- __version__ = "0.6.37"
3
+ __version__ = "0.6.38"
@@ -206,7 +206,7 @@ def whoami(
206
206
  if fmt == "json":
207
207
  print(json.dumps(data, indent=2, default=str))
208
208
  elif fmt == "toon":
209
- from toon_format import encode
209
+ from pytoon import encode
210
210
  print(encode(data))
211
211
  elif fmt == "md":
212
212
  _render_whoami_md(data)
@@ -332,7 +332,7 @@ def _output_markdown(results: list[dict], columns: list[str], column_types: dict
332
332
 
333
333
  def _output_toon(results: list[dict], columns: list[str]) -> None:
334
334
  """TOON (Token-Oriented Object Notation) output for LLM consumption."""
335
- from toon_format import encode
335
+ from pytoon import encode
336
336
  # Build column-filtered rows for uniform tabular encoding
337
337
  rows = [{col: row.get(col) for col in columns} for row in results]
338
338
  print(encode(rows))
@@ -340,7 +340,7 @@ def _output_toon(results: list[dict], columns: list[str]) -> None:
340
340
 
341
341
  def _output_toon_single(record: dict) -> None:
342
342
  """TOON output for a single detail record."""
343
- from toon_format import encode
343
+ from pytoon import encode
344
344
  print(encode(record))
345
345
 
346
346
 
@@ -148,10 +148,11 @@ def _run_upgrade(method: str, latest: str) -> None:
148
148
  file=sys.stderr,
149
149
  )
150
150
  return
151
- if result.returncode == 0:
151
+ binary_intact = _verify_tl_binary_intact()
152
+ if result.returncode == 0 and binary_intact:
152
153
  _resync_integrations()
153
154
  return
154
- _report_upgrade_failure(method, cmd, result)
155
+ _report_upgrade_failure(method, cmd, result, binary_intact=binary_intact, latest=latest)
155
156
 
156
157
 
157
158
  def _spawn_detached_windows_upgrade(cmd: list[str], latest: str) -> bool:
@@ -294,19 +295,85 @@ def _already_scheduled(latest: str) -> bool:
294
295
  return time.time() - scheduled_at < WIN_UPGRADE_RESCHEDULE_WINDOW
295
296
 
296
297
 
297
- def _report_upgrade_failure(method: str, cmd: list[str], result: subprocess.CompletedProcess) -> None:
298
+ def _verify_tl_binary_intact() -> bool:
299
+ """Sanity-check the upgraded install: is there still a working `tl`?
300
+
301
+ `uv tool install --force` removes the previous install BEFORE it
302
+ builds the new one. A failing build leaves the user with no `tl`
303
+ binary at all — even though the exit-code branch will already have
304
+ flagged the failure, we use this check to emphasize the now-missing
305
+ state in the recovery message. Also catches the rarer case where
306
+ the upgrader returns 0 but the resulting binary is unusable.
307
+
308
+ Cheapest signal that won't trip on harmless slowness: does
309
+ `tl --version` exit 0 within a couple of seconds?
310
+ """
311
+ tl_bin = shutil.which("tl")
312
+ if not tl_bin:
313
+ return False
314
+ try:
315
+ result = subprocess.run(
316
+ [tl_bin, "--version"],
317
+ capture_output=True,
318
+ timeout=5,
319
+ check=False,
320
+ )
321
+ except (OSError, subprocess.TimeoutExpired):
322
+ return False
323
+ return result.returncode == 0
324
+
325
+
326
+ def _report_upgrade_failure(
327
+ method: str,
328
+ cmd: list[str],
329
+ result: subprocess.CompletedProcess,
330
+ *,
331
+ binary_intact: bool,
332
+ latest: str,
333
+ ) -> None:
298
334
  """Print a user-friendly failure message after a non-zero upgrader exit.
299
335
 
300
336
  On Windows in particular, `pipx.exe` can be a broken shim that errors
301
337
  with `ModuleNotFoundError: No module named 'pipx'`. We detect that and
302
338
  give a targeted hint instead of just echoing the traceback.
339
+
340
+ If the install is now corrupted (no working `tl` on PATH), we
341
+ emphasize that in the message and surface the version-pinned
342
+ recovery command for the *previous* good version too.
303
343
  """
304
344
  combined_err = (result.stderr or '') + (result.stdout or '')
305
- print(
306
- f"[tl-cli] automatic upgrade failed (exit {result.returncode}).",
307
- file=sys.stderr,
308
- )
309
- if "No module named 'pipx'" in combined_err:
345
+ if result.returncode == 0 and not binary_intact:
346
+ # Upgrader claimed success but the binary is gone or broken — rare
347
+ # but a worse failure mode than a non-zero exit because there's no
348
+ # error text to anchor on.
349
+ print(
350
+ "[tl-cli] Upgrade reported success but the `tl` command is missing or broken.",
351
+ file=sys.stderr,
352
+ )
353
+ else:
354
+ print(
355
+ f"[tl-cli] automatic upgrade failed (exit {result.returncode}).",
356
+ file=sys.stderr,
357
+ )
358
+
359
+ if not binary_intact:
360
+ print(
361
+ f"[tl-cli] Your install was removed by `{method}` before the new build "
362
+ f"could finish, so the `tl` command is gone right now.",
363
+ file=sys.stderr,
364
+ )
365
+ print(
366
+ f"[tl-cli] Recover with the previous known-good release:\n"
367
+ f" {cmd[0]} {'tool ' if method == 'uv' else ''}install --force "
368
+ f"git+{REPO_URL}@v{__version__}",
369
+ file=sys.stderr,
370
+ )
371
+ print(
372
+ f"[tl-cli] Or retry the new version once the issue is fixed:\n"
373
+ f" {' '.join(cmd)}",
374
+ file=sys.stderr,
375
+ )
376
+ elif "No module named 'pipx'" in combined_err:
310
377
  print(
311
378
  "[tl-cli] Your pipx install appears broken (its launcher can't find the pipx module).\n"
312
379
  "[tl-cli] Reinstall pipx from your system Python, then rerun the upgrade.\n"