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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/ab-testing/CHANGELOG.md +4 -0
- package/skills/ab-testing/SKILL.md +3 -3
- package/skills/ab-testing/references/sample-size-guide.md +15 -2
- package/skills/ad-creative/CHANGELOG.md +8 -0
- package/skills/ad-creative/SKILL.md +23 -13
- package/skills/ads/CHANGELOG.md +6 -0
- package/skills/ads/SKILL.md +14 -10
- package/skills/ads/evals/evals.json +13 -0
- package/skills/ads/references/operating-check.md +75 -0
- package/skills/ai-seo/CHANGELOG.md +11 -0
- package/skills/ai-seo/SKILL.md +28 -27
- package/skills/ai-seo/references/agent-defaults.md +79 -0
- package/skills/ai-seo/references/ai-attribution.md +54 -0
- package/skills/ai-seo/references/answer-accuracy.md +84 -0
- package/skills/ai-seo/references/content-patterns.md +24 -0
- package/skills/ai-seo/references/multilingual-and-commerce.md +55 -0
- package/skills/ai-seo/references/platform-ranking-factors.md +29 -11
- package/skills/ai-seo/references/prompt-portfolio.md +83 -0
- package/skills/analytics/CHANGELOG.md +8 -0
- package/skills/analytics/SKILL.md +74 -18
- package/skills/analytics/references/event-library.md +2 -2
- package/skills/churn-prevention/CHANGELOG.md +7 -0
- package/skills/churn-prevention/SKILL.md +16 -8
- package/skills/churn-prevention/references/dunning-playbook.md +10 -7
- package/skills/co-marketing/CHANGELOG.md +3 -0
- package/skills/co-marketing/SKILL.md +9 -9
- package/skills/coder/CHANGELOG.md +19 -0
- package/skills/coder/SKILL.md +4 -3
- package/skills/coder-writing-plans/CHANGELOG.md +5 -0
- package/skills/coder-writing-plans/SKILL.md +4 -3
- package/skills/content-strategy/CHANGELOG.md +3 -0
- package/skills/content-strategy/SKILL.md +3 -3
- package/skills/content-strategy/references/headless-cms.md +4 -4
- package/skills/copy-editing/CHANGELOG.md +4 -0
- package/skills/copy-editing/SKILL.md +5 -3
- package/skills/copy-editing/evals/evals.json +13 -0
- package/skills/copy-editing/references/checklist.md +24 -0
- package/skills/copywriting/CHANGELOG.md +6 -0
- package/skills/copywriting/SKILL.md +57 -4
- package/skills/copywriting/evals/evals.json +14 -0
- package/skills/emails/CHANGELOG.md +4 -0
- package/skills/emails/SKILL.md +5 -3
- package/skills/marketing-plan/CHANGELOG.md +4 -0
- package/skills/marketing-plan/SKILL.md +8 -3
- package/skills/offers/CHANGELOG.md +4 -0
- package/skills/offers/SKILL.md +4 -4
- package/skills/onboarding/CHANGELOG.md +4 -0
- package/skills/onboarding/SKILL.md +13 -7
- package/skills/pricing/CHANGELOG.md +4 -0
- package/skills/pricing/SKILL.md +3 -3
- package/skills/pricing/references/research-methods.md +12 -2
- package/skills/product-marketing/CHANGELOG.md +5 -0
- package/skills/product-marketing/SKILL.md +76 -11
- package/skills/product-marketing/references/brand-voice.md +103 -0
- package/skills/prospecting/CHANGELOG.md +3 -0
- package/skills/prospecting/SKILL.md +22 -22
- package/skills/prospecting/references/data-sources.md +0 -18
- package/skills/prospecting/references/saas-prospecting.md +2 -2
- package/skills/referrals/CHANGELOG.md +4 -0
- package/skills/referrals/SKILL.md +3 -3
- package/skills/referrals/references/program-examples.md +9 -2
- package/skills/research/CHANGELOG.md +5 -0
- package/skills/research/SKILL.md +5 -5
- package/skills/research/references/visual-read.md +10 -4
- package/skills/revops/CHANGELOG.md +4 -0
- package/skills/revops/SKILL.md +6 -6
- package/skills/revops/references/scoring-models.md +14 -13
- package/skills/seo-audit/CHANGELOG.md +4 -0
- package/skills/seo-audit/SKILL.md +7 -7
- package/skills/seo-audit/references/international-seo.md +3 -1
- package/skills/social/CHANGELOG.md +4 -0
- package/skills/social/SKILL.md +4 -4
- package/skills/social/references/listening.md +13 -0
- package/skills/social/references/platforms.md +35 -0
- package/skills/social/references/short-form-video.md +10 -0
- package/skills/trends/CHANGELOG.md +7 -0
- package/skills/trends/SKILL.md +5 -5
- package/skills/trends/agents/openai.yaml +8 -0
- package/skills/trends/references/comparison.md +5 -2
- package/skills/trends/references/engine-contract.md +2 -2
- package/skills/trends/references/synthesis.md +2 -2
- package/skills/trends/scripts/build-skill.sh +39 -0
- package/skills/trends/scripts/compare.sh +61 -0
- package/skills/trends/scripts/evaluate_search_quality.py +584 -0
- package/skills/trends/scripts/lib/arxiv.py +10 -1
- package/skills/trends/scripts/lib/bluesky.py +22 -2
- package/skills/trends/scripts/lib/devto.py +108 -18
- package/skills/trends/scripts/lib/digg.py +79 -17
- package/skills/trends/scripts/lib/github.py +9 -4
- package/skills/trends/scripts/lib/hackernews.py +74 -2
- package/skills/trends/scripts/lib/html_render.py +15 -1
- package/skills/trends/scripts/lib/pipeline.py +1 -1
- package/skills/trends/scripts/lib/planner.py +5 -0
- package/skills/trends/scripts/lib/providers.py +1 -1
- package/skills/trends/scripts/lib/reddit_shreddit.py +4 -1
- package/skills/trends/scripts/lib/render.py +49 -45
- package/skills/trends/scripts/lib/youtube_yt.py +10 -7
- package/skills/trends/scripts/test-v1-vs-v2.sh +220 -0
- package/skills/trends/scripts/test_device_auth.py +128 -0
- package/skills/trends/scripts/verify_v3.py +200 -0
- 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
|
|
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.
|