luckiest-co 1.0.52 → 1.0.53

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 (104) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/ab-testing/CHANGELOG.md +4 -0
  5. package/skills/ab-testing/SKILL.md +3 -3
  6. package/skills/ab-testing/references/sample-size-guide.md +15 -2
  7. package/skills/ad-creative/CHANGELOG.md +8 -0
  8. package/skills/ad-creative/SKILL.md +23 -13
  9. package/skills/ads/CHANGELOG.md +6 -0
  10. package/skills/ads/SKILL.md +14 -10
  11. package/skills/ads/evals/evals.json +13 -0
  12. package/skills/ads/references/operating-check.md +75 -0
  13. package/skills/ai-seo/CHANGELOG.md +11 -0
  14. package/skills/ai-seo/SKILL.md +28 -27
  15. package/skills/ai-seo/references/agent-defaults.md +79 -0
  16. package/skills/ai-seo/references/ai-attribution.md +54 -0
  17. package/skills/ai-seo/references/answer-accuracy.md +84 -0
  18. package/skills/ai-seo/references/content-patterns.md +24 -0
  19. package/skills/ai-seo/references/multilingual-and-commerce.md +55 -0
  20. package/skills/ai-seo/references/platform-ranking-factors.md +29 -11
  21. package/skills/ai-seo/references/prompt-portfolio.md +83 -0
  22. package/skills/analytics/CHANGELOG.md +8 -0
  23. package/skills/analytics/SKILL.md +74 -18
  24. package/skills/analytics/references/event-library.md +2 -2
  25. package/skills/churn-prevention/CHANGELOG.md +7 -0
  26. package/skills/churn-prevention/SKILL.md +16 -8
  27. package/skills/churn-prevention/references/dunning-playbook.md +10 -7
  28. package/skills/co-marketing/CHANGELOG.md +3 -0
  29. package/skills/co-marketing/SKILL.md +9 -9
  30. package/skills/coder/CHANGELOG.md +19 -0
  31. package/skills/coder/SKILL.md +4 -3
  32. package/skills/coder-writing-plans/CHANGELOG.md +5 -0
  33. package/skills/coder-writing-plans/SKILL.md +4 -3
  34. package/skills/content-strategy/CHANGELOG.md +3 -0
  35. package/skills/content-strategy/SKILL.md +3 -3
  36. package/skills/content-strategy/references/headless-cms.md +4 -4
  37. package/skills/copy-editing/CHANGELOG.md +4 -0
  38. package/skills/copy-editing/SKILL.md +5 -3
  39. package/skills/copy-editing/evals/evals.json +13 -0
  40. package/skills/copy-editing/references/checklist.md +24 -0
  41. package/skills/copywriting/CHANGELOG.md +6 -0
  42. package/skills/copywriting/SKILL.md +57 -4
  43. package/skills/copywriting/evals/evals.json +14 -0
  44. package/skills/emails/CHANGELOG.md +4 -0
  45. package/skills/emails/SKILL.md +5 -3
  46. package/skills/marketing-plan/CHANGELOG.md +4 -0
  47. package/skills/marketing-plan/SKILL.md +8 -3
  48. package/skills/offers/CHANGELOG.md +4 -0
  49. package/skills/offers/SKILL.md +4 -4
  50. package/skills/onboarding/CHANGELOG.md +4 -0
  51. package/skills/onboarding/SKILL.md +13 -7
  52. package/skills/pricing/CHANGELOG.md +4 -0
  53. package/skills/pricing/SKILL.md +3 -3
  54. package/skills/pricing/references/research-methods.md +12 -2
  55. package/skills/product-marketing/CHANGELOG.md +5 -0
  56. package/skills/product-marketing/SKILL.md +76 -11
  57. package/skills/product-marketing/references/brand-voice.md +103 -0
  58. package/skills/prospecting/CHANGELOG.md +3 -0
  59. package/skills/prospecting/SKILL.md +22 -22
  60. package/skills/prospecting/references/data-sources.md +0 -18
  61. package/skills/prospecting/references/saas-prospecting.md +2 -2
  62. package/skills/referrals/CHANGELOG.md +4 -0
  63. package/skills/referrals/SKILL.md +3 -3
  64. package/skills/referrals/references/program-examples.md +9 -2
  65. package/skills/research/CHANGELOG.md +5 -0
  66. package/skills/research/SKILL.md +5 -5
  67. package/skills/research/references/visual-read.md +10 -4
  68. package/skills/revops/CHANGELOG.md +4 -0
  69. package/skills/revops/SKILL.md +6 -6
  70. package/skills/revops/references/scoring-models.md +14 -13
  71. package/skills/seo-audit/CHANGELOG.md +4 -0
  72. package/skills/seo-audit/SKILL.md +7 -7
  73. package/skills/seo-audit/references/international-seo.md +3 -1
  74. package/skills/social/CHANGELOG.md +4 -0
  75. package/skills/social/SKILL.md +4 -4
  76. package/skills/social/references/listening.md +13 -0
  77. package/skills/social/references/platforms.md +35 -0
  78. package/skills/social/references/short-form-video.md +10 -0
  79. package/skills/trends/CHANGELOG.md +7 -0
  80. package/skills/trends/SKILL.md +5 -5
  81. package/skills/trends/agents/openai.yaml +8 -0
  82. package/skills/trends/references/comparison.md +5 -2
  83. package/skills/trends/references/engine-contract.md +2 -2
  84. package/skills/trends/references/synthesis.md +2 -2
  85. package/skills/trends/scripts/build-skill.sh +39 -0
  86. package/skills/trends/scripts/compare.sh +61 -0
  87. package/skills/trends/scripts/evaluate_search_quality.py +584 -0
  88. package/skills/trends/scripts/lib/arxiv.py +10 -1
  89. package/skills/trends/scripts/lib/bluesky.py +22 -2
  90. package/skills/trends/scripts/lib/devto.py +108 -18
  91. package/skills/trends/scripts/lib/digg.py +79 -17
  92. package/skills/trends/scripts/lib/github.py +9 -4
  93. package/skills/trends/scripts/lib/hackernews.py +74 -2
  94. package/skills/trends/scripts/lib/html_render.py +15 -1
  95. package/skills/trends/scripts/lib/pipeline.py +1 -1
  96. package/skills/trends/scripts/lib/planner.py +5 -0
  97. package/skills/trends/scripts/lib/providers.py +1 -1
  98. package/skills/trends/scripts/lib/reddit_shreddit.py +4 -1
  99. package/skills/trends/scripts/lib/render.py +49 -45
  100. package/skills/trends/scripts/lib/youtube_yt.py +10 -7
  101. package/skills/trends/scripts/test-v1-vs-v2.sh +220 -0
  102. package/skills/trends/scripts/test_device_auth.py +128 -0
  103. package/skills/trends/scripts/verify_v3.py +200 -0
  104. package/skills/video/CHANGELOG.md +1 -1
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env python3
2
+ """Run the v3 verification bundle for last30days."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import os
9
+ import statistics
10
+ import subprocess
11
+ import sys
12
+ import time
13
+ from pathlib import Path
14
+
15
+
16
+ SKILL_ROOT = Path(__file__).resolve().parents[1]
17
+ REPO_ROOT = Path(__file__).resolve().parents[3]
18
+ PYTHON = sys.executable
19
+ ENGINE = SKILL_ROOT / "scripts" / "last30days.py"
20
+ EVALUATOR = SKILL_ROOT / "scripts" / "evaluate_search_quality.py"
21
+
22
+ SMOKE_TOPIC = "openclaw skills"
23
+ SMOKE_CASES = [
24
+ ("gemini", ["--quick", "--search=grounding,hackernews"]),
25
+ ("openai", ["--quick", "--search=reddit,hackernews"]),
26
+ ("xai", ["--quick", "--search=reddit,hackernews"]),
27
+ ("auto", ["--quick", "--search=reddit,grounding,hackernews"]),
28
+ ]
29
+
30
+ LATENCY_TOPICS = [
31
+ "openclaw skills",
32
+ "codex vs claude code",
33
+ "anthropic odds",
34
+ ]
35
+ LATENCY_PROFILES = [
36
+ ("quick", ["--quick", "--search=grounding,hackernews"]),
37
+ ("default", ["--search=grounding,hackernews"]),
38
+ ("deep", ["--deep", "--search=grounding,hackernews"]),
39
+ ]
40
+
41
+
42
+ def run_command(cmd: list[str], *, env: dict[str, str] | None = None, timeout: int = 600) -> subprocess.CompletedProcess[str]:
43
+ return subprocess.run(
44
+ cmd,
45
+ cwd=REPO_ROOT,
46
+ env=env,
47
+ text=True,
48
+ capture_output=True,
49
+ timeout=timeout,
50
+ check=True,
51
+ )
52
+
53
+
54
+ def verify_unit() -> dict[str, str]:
55
+ run_command([PYTHON, "-m", "pytest", "tests"], timeout=600)
56
+ run_command(
57
+ [
58
+ PYTHON,
59
+ "-m",
60
+ "py_compile",
61
+ *subprocess.run(
62
+ [
63
+ "rg",
64
+ "--files",
65
+ "skills/last30days/scripts",
66
+ "tests",
67
+ "-g",
68
+ "*.py",
69
+ "-g",
70
+ "!skills/last30days/scripts/lib/vendor/**",
71
+ ],
72
+ cwd=REPO_ROOT,
73
+ text=True,
74
+ capture_output=True,
75
+ check=True,
76
+ ).stdout.split(),
77
+ ],
78
+ timeout=600,
79
+ )
80
+ return {"status": "ok"}
81
+
82
+
83
+ def verify_diagnose() -> dict[str, object]:
84
+ result = run_command([PYTHON, str(ENGINE), "--diagnose"], timeout=120)
85
+ return json.loads(result.stdout)
86
+
87
+
88
+ def verify_smoke() -> list[dict[str, object]]:
89
+ rows: list[dict[str, object]] = []
90
+ for provider, extra in SMOKE_CASES:
91
+ env = os.environ.copy()
92
+ env["LAST30DAYS_REASONING_PROVIDER"] = provider
93
+ # This smoke exercises the engine's own planner providers on purpose.
94
+ env["LAST30DAYS_ALLOW_ENGINE_PLAN"] = "1"
95
+ start = time.time()
96
+ result = run_command(
97
+ [PYTHON, str(ENGINE), SMOKE_TOPIC, "--emit=json", "--json-profile=raw", *extra],
98
+ env=env,
99
+ timeout=240,
100
+ )
101
+ duration = round(time.time() - start, 2)
102
+ report = json.loads(result.stdout)
103
+ rows.append(
104
+ {
105
+ "provider": provider,
106
+ "duration_seconds": duration,
107
+ "reasoning_provider": (report.get("provider_runtime") or {}).get("reasoning_provider"),
108
+ "cluster_count": len(report.get("clusters") or []),
109
+ "candidate_count": len(report.get("ranked_candidates") or []),
110
+ "error_sources": sorted((report.get("errors_by_source") or {}).keys()),
111
+ }
112
+ )
113
+ return rows
114
+
115
+
116
+ def verify_latency() -> dict[str, dict[str, object]]:
117
+ results: dict[str, dict[str, object]] = {}
118
+ env = os.environ.copy()
119
+ env["LAST30DAYS_ALLOW_ENGINE_PLAN"] = "1"
120
+ for profile, extra in LATENCY_PROFILES:
121
+ timings = []
122
+ for topic in LATENCY_TOPICS:
123
+ start = time.time()
124
+ run_command(
125
+ [PYTHON, str(ENGINE), topic, "--emit=json", "--json-profile=raw", *extra],
126
+ env=env,
127
+ timeout=300,
128
+ )
129
+ timings.append(time.time() - start)
130
+ results[profile] = {
131
+ "times": [round(value, 2) for value in timings],
132
+ "median_seconds": round(statistics.median(timings), 2),
133
+ "max_seconds": round(max(timings), 2),
134
+ }
135
+ return results
136
+
137
+
138
+ def verify_eval(
139
+ *,
140
+ baseline: str,
141
+ candidate: str,
142
+ output_dir: str,
143
+ quick: bool,
144
+ limit: int,
145
+ timeout: int,
146
+ ) -> dict[str, object]:
147
+ cmd = [
148
+ PYTHON,
149
+ str(EVALUATOR),
150
+ f"--baseline={baseline}",
151
+ f"--candidate={candidate}",
152
+ f"--output-dir={output_dir}",
153
+ f"--limit={limit}",
154
+ f"--timeout={timeout}",
155
+ ]
156
+ if quick:
157
+ cmd.append("--quick")
158
+ run_command(cmd, timeout=max(timeout * 8, 600))
159
+ output = Path(output_dir)
160
+ metrics = json.loads((output / "metrics.json").read_text())
161
+ summary = (output / "summary.md").read_text()
162
+ return {"metrics": metrics, "summary": summary}
163
+
164
+
165
+ def build_parser() -> argparse.ArgumentParser:
166
+ parser = argparse.ArgumentParser(description="Run the v3 verification bundle")
167
+ parser.add_argument("--skip-eval", action="store_true", help="Skip the judged evaluator")
168
+ parser.add_argument("--skip-latency", action="store_true", help="Skip live latency sampling")
169
+ parser.add_argument("--baseline", default="HEAD~1")
170
+ parser.add_argument("--candidate", default="WORKTREE")
171
+ parser.add_argument("--output-dir", default="/tmp/last30days-v3-verify")
172
+ parser.add_argument("--quick-eval", action="store_true", help="Use evaluator quick mode")
173
+ parser.add_argument("--eval-limit", type=int, default=20)
174
+ parser.add_argument("--eval-timeout", type=int, default=240)
175
+ return parser
176
+
177
+
178
+ def main() -> int:
179
+ args = build_parser().parse_args()
180
+ summary: dict[str, object] = {}
181
+ summary["unit"] = verify_unit()
182
+ summary["diagnose"] = verify_diagnose()
183
+ summary["smoke"] = verify_smoke()
184
+ if not args.skip_latency:
185
+ summary["latency"] = verify_latency()
186
+ if not args.skip_eval:
187
+ summary["eval"] = verify_eval(
188
+ baseline=args.baseline,
189
+ candidate=args.candidate,
190
+ output_dir=args.output_dir,
191
+ quick=args.quick_eval,
192
+ limit=args.eval_limit,
193
+ timeout=args.eval_timeout,
194
+ )
195
+ print(json.dumps(summary, indent=2, sort_keys=True))
196
+ return 0
197
+
198
+
199
+ if __name__ == "__main__":
200
+ raise SystemExit(main())
@@ -31,7 +31,7 @@ Rebranded from video (marketingskills, MIT).
31
31
 
32
32
  ### Improve pass (/refract)
33
33
  - Emphasized generate-to-ratio then crop workflow and model-selection guidance across current AI video tools.
34
- - Neutralized dead `../../tools/integrations/` registry links to plain tool references.
34
+ - Neutralized dead `tools/integrations/` registry links to plain tool references.
35
35
 
36
36
  ### Network hook
37
37
  - share-with-tribe — offer-only ("Share with your tribe"), never auto-posts; never shares private scripts, unreleased footage, or a cloned likeness without explicit ask; no credentials.