luckiest-co 1.0.1 → 1.0.3
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 +16 -0
- package/.claude-plugin/plugin.json +1 -1
- package/LICENSE +24 -0
- package/bin/install.js +6 -4
- package/commands/{luckiest/finish.md → finish.md} +2 -0
- package/commands/go.md +53 -0
- package/commands/plan.md +66 -0
- package/package.json +3 -2
- package/skills/brainstorm/ATTRIBUTION.md +27 -0
- package/skills/brainstorm/SKILL.md +139 -0
- package/skills/luckiest-ab-testing/ATTRIBUTION.md +35 -0
- package/skills/luckiest-ab-testing/CHANGELOG.md +27 -0
- package/skills/luckiest-ab-testing/SKILL.md +379 -0
- package/skills/luckiest-ab-testing/evals/evals.json +118 -0
- package/skills/luckiest-ab-testing/references/sample-size-guide.md +290 -0
- package/skills/luckiest-ab-testing/references/test-templates.md +284 -0
- package/skills/luckiest-ad-creative/ATTRIBUTION.md +35 -0
- package/skills/luckiest-ad-creative/CHANGELOG.md +23 -0
- package/skills/luckiest-ad-creative/SKILL.md +393 -0
- package/skills/luckiest-ad-creative/evals/evals.json +90 -0
- package/skills/luckiest-ad-creative/references/generative-tools.md +637 -0
- package/skills/luckiest-ad-creative/references/platform-specs.md +213 -0
- package/skills/luckiest-ads/ATTRIBUTION.md +36 -0
- package/skills/luckiest-ads/CHANGELOG.md +24 -0
- package/skills/luckiest-ads/LICENSE +21 -0
- package/skills/luckiest-ads/SKILL.md +434 -0
- package/skills/luckiest-ads/evals/evals.json +90 -0
- package/skills/luckiest-ads/references/ad-copy-templates.md +207 -0
- package/skills/luckiest-ads/references/audience-targeting.md +243 -0
- package/skills/luckiest-ads/references/conversion-tracking.md +361 -0
- package/skills/luckiest-ads/references/platform-setup-checklists.md +277 -0
- package/skills/luckiest-advisors/ATTRIBUTION.md +16 -0
- package/skills/luckiest-advisors/CHANGELOG.md +99 -0
- package/skills/luckiest-advisors/SKILL.md +151 -0
- package/skills/luckiest-aeo-grader/ATTRIBUTION.md +19 -0
- package/skills/luckiest-aeo-grader/CHANGELOG.md +52 -0
- package/skills/luckiest-aeo-grader/SKILL.md +200 -0
- package/skills/luckiest-aeo-grader/evals/evals.json +19 -0
- package/skills/luckiest-aeo-grader/references/rubric.md +72 -0
- package/skills/luckiest-aeo-grader/scripts/scan.py +265 -0
- package/skills/luckiest-ai-seo/ATTRIBUTION.md +38 -0
- package/skills/luckiest-ai-seo/CHANGELOG.md +23 -0
- package/skills/luckiest-ai-seo/SKILL.md +510 -0
- package/skills/luckiest-ai-seo/evals/evals.json +90 -0
- package/skills/luckiest-ai-seo/references/content-patterns.md +285 -0
- package/skills/luckiest-ai-seo/references/content-types.md +71 -0
- package/skills/luckiest-ai-seo/references/okf.md +104 -0
- package/skills/luckiest-ai-seo/references/platform-ranking-factors.md +154 -0
- package/skills/luckiest-analytics/ATTRIBUTION.md +42 -0
- package/skills/luckiest-analytics/CHANGELOG.md +36 -0
- package/skills/luckiest-analytics/SKILL.md +380 -0
- package/skills/luckiest-analytics/evals/evals.json +90 -0
- package/skills/luckiest-analytics/references/event-library.md +260 -0
- package/skills/luckiest-analytics/references/ga4-implementation.md +300 -0
- package/skills/luckiest-analytics/references/gtm-implementation.md +390 -0
- package/skills/luckiest-aso/ATTRIBUTION.md +40 -0
- package/skills/luckiest-aso/CHANGELOG.md +33 -0
- package/skills/luckiest-aso/SKILL.md +327 -0
- package/skills/luckiest-aso/evals/evals.json +91 -0
- package/skills/luckiest-aso/references/apple-specs.md +107 -0
- package/skills/luckiest-aso/references/benchmarks.md +129 -0
- package/skills/luckiest-aso/references/google-play-specs.md +131 -0
- package/skills/luckiest-aso/references/report-template.md +213 -0
- package/skills/luckiest-aso/references/scoring-criteria.md +213 -0
- package/skills/luckiest-churn-prevention/ATTRIBUTION.md +41 -0
- package/skills/luckiest-churn-prevention/CHANGELOG.md +24 -0
- package/skills/luckiest-churn-prevention/SKILL.md +445 -0
- package/skills/luckiest-churn-prevention/evals/evals.json +93 -0
- package/skills/luckiest-churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/skills/luckiest-churn-prevention/references/dunning-playbook.md +408 -0
- package/skills/luckiest-co-marketing/ATTRIBUTION.md +38 -0
- package/skills/luckiest-co-marketing/CHANGELOG.md +25 -0
- package/skills/luckiest-co-marketing/SKILL.md +331 -0
- package/skills/luckiest-co-marketing/evals/evals.json +84 -0
- package/skills/luckiest-coder/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder/CHANGELOG.md +30 -0
- package/skills/luckiest-coder/SKILL.md +77 -0
- package/skills/luckiest-coder/references/antigravity-tools.md +23 -0
- package/skills/luckiest-coder/references/codex-tools.md +39 -0
- package/skills/luckiest-coder/references/pi-tools.md +16 -0
- package/skills/luckiest-coder-brainstorming/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-brainstorming/CHANGELOG.md +31 -0
- package/skills/luckiest-coder-brainstorming/SKILL.md +173 -0
- package/skills/luckiest-coder-brainstorming/scripts/frame-template.html +213 -0
- package/skills/luckiest-coder-brainstorming/scripts/helper.js +168 -0
- package/skills/luckiest-coder-brainstorming/scripts/server.cjs +721 -0
- package/skills/luckiest-coder-brainstorming/scripts/start-server.sh +209 -0
- package/skills/luckiest-coder-brainstorming/scripts/stop-server.sh +120 -0
- package/skills/luckiest-coder-brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/luckiest-coder-brainstorming/visual-companion.md +291 -0
- package/skills/luckiest-coder-consistency/ATTRIBUTION.md +30 -0
- package/skills/luckiest-coder-consistency/CHANGELOG.md +26 -0
- package/skills/luckiest-coder-consistency/SKILL.md +98 -0
- package/skills/luckiest-coder-constitution/ATTRIBUTION.md +28 -0
- package/skills/luckiest-coder-constitution/CHANGELOG.md +25 -0
- package/skills/luckiest-coder-constitution/SKILL.md +115 -0
- package/skills/luckiest-coder-debugging/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-debugging/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-debugging/CREATION-LOG.md +119 -0
- package/skills/luckiest-coder-debugging/SKILL.md +309 -0
- package/skills/luckiest-coder-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/luckiest-coder-debugging/condition-based-waiting.md +115 -0
- package/skills/luckiest-coder-debugging/defense-in-depth.md +122 -0
- package/skills/luckiest-coder-debugging/find-polluter.sh +63 -0
- package/skills/luckiest-coder-debugging/root-cause-tracing.md +169 -0
- package/skills/luckiest-coder-debugging/test-academic.md +14 -0
- package/skills/luckiest-coder-debugging/test-pressure-1.md +58 -0
- package/skills/luckiest-coder-debugging/test-pressure-2.md +68 -0
- package/skills/luckiest-coder-debugging/test-pressure-3.md +69 -0
- package/skills/luckiest-coder-dispatching-parallel-agents/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-dispatching-parallel-agents/CHANGELOG.md +23 -0
- package/skills/luckiest-coder-dispatching-parallel-agents/SKILL.md +198 -0
- package/skills/luckiest-coder-executing-plans/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-executing-plans/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-executing-plans/SKILL.md +83 -0
- package/skills/luckiest-coder-finishing-a-branch/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-finishing-a-branch/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-finishing-a-branch/SKILL.md +258 -0
- package/skills/luckiest-coder-git-worktrees/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-git-worktrees/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-git-worktrees/SKILL.md +215 -0
- package/skills/luckiest-coder-guard/ATTRIBUTION.md +29 -0
- package/skills/luckiest-coder-guard/CHANGELOG.md +48 -0
- package/skills/luckiest-coder-guard/LICENSE +21 -0
- package/skills/luckiest-coder-guard/SKILL.md +126 -0
- package/skills/luckiest-coder-guard/bin/check-careful.sh +65 -0
- package/skills/luckiest-coder-guard/bin/check-freeze.sh +48 -0
- package/skills/luckiest-coder-qa/ATTRIBUTION.md +28 -0
- package/skills/luckiest-coder-qa/CHANGELOG.md +49 -0
- package/skills/luckiest-coder-qa/LICENSE +21 -0
- package/skills/luckiest-coder-qa/SKILL.md +160 -0
- package/skills/luckiest-coder-qa/references/issue-taxonomy.md +85 -0
- package/skills/luckiest-coder-qa/references/qa-report-template.md +126 -0
- package/skills/luckiest-coder-receiving-code-review/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-receiving-code-review/CHANGELOG.md +28 -0
- package/skills/luckiest-coder-receiving-code-review/SKILL.md +226 -0
- package/skills/luckiest-coder-requesting-code-review/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-requesting-code-review/CHANGELOG.md +31 -0
- package/skills/luckiest-coder-requesting-code-review/SKILL.md +118 -0
- package/skills/luckiest-coder-requesting-code-review/code-reviewer.md +172 -0
- package/skills/luckiest-coder-shipping/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-shipping/CHANGELOG.md +48 -0
- package/skills/luckiest-coder-shipping/LICENSE +21 -0
- package/skills/luckiest-coder-shipping/SKILL.md +148 -0
- package/skills/luckiest-coder-shipping/references/canary.md +44 -0
- package/skills/luckiest-coder-shipping/references/test-and-coverage.md +91 -0
- package/skills/luckiest-coder-subagent-driven-development/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-subagent-driven-development/CHANGELOG.md +28 -0
- package/skills/luckiest-coder-subagent-driven-development/SKILL.md +439 -0
- package/skills/luckiest-coder-subagent-driven-development/implementer-prompt.md +139 -0
- package/skills/luckiest-coder-subagent-driven-development/scripts/review-package +44 -0
- package/skills/luckiest-coder-subagent-driven-development/scripts/sdd-workspace +22 -0
- package/skills/luckiest-coder-subagent-driven-development/scripts/task-brief +40 -0
- package/skills/luckiest-coder-subagent-driven-development/task-reviewer-prompt.md +188 -0
- package/skills/luckiest-coder-tdd/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-tdd/CHANGELOG.md +26 -0
- package/skills/luckiest-coder-tdd/SKILL.md +384 -0
- package/skills/luckiest-coder-tdd/testing-anti-patterns.md +299 -0
- package/skills/luckiest-coder-verification/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-verification/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-verification/SKILL.md +152 -0
- package/skills/luckiest-coder-writing-plans/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-writing-plans/CHANGELOG.md +22 -0
- package/skills/luckiest-coder-writing-plans/SKILL.md +191 -0
- package/skills/luckiest-coder-writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/luckiest-coder-writing-skills/ATTRIBUTION.md +26 -0
- package/skills/luckiest-coder-writing-skills/CHANGELOG.md +31 -0
- package/skills/luckiest-coder-writing-skills/SKILL.md +702 -0
- package/skills/luckiest-coder-writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/luckiest-coder-writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/luckiest-coder-writing-skills/graphviz-conventions.dot +172 -0
- package/skills/luckiest-coder-writing-skills/persuasion-principles.md +187 -0
- package/skills/luckiest-coder-writing-skills/render-graphs.js +168 -0
- package/skills/luckiest-coder-writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/luckiest-cold-email/ATTRIBUTION.md +36 -0
- package/skills/luckiest-cold-email/CHANGELOG.md +24 -0
- package/skills/luckiest-cold-email/SKILL.md +213 -0
- package/skills/luckiest-cold-email/evals/evals.json +94 -0
- package/skills/luckiest-cold-email/references/benchmarks.md +83 -0
- package/skills/luckiest-cold-email/references/follow-up-sequences.md +81 -0
- package/skills/luckiest-cold-email/references/frameworks.md +90 -0
- package/skills/luckiest-cold-email/references/personalization.md +79 -0
- package/skills/luckiest-cold-email/references/subject-lines.md +53 -0
- package/skills/luckiest-community-marketing/ATTRIBUTION.md +41 -0
- package/skills/luckiest-community-marketing/CHANGELOG.md +35 -0
- package/skills/luckiest-community-marketing/SKILL.md +200 -0
- package/skills/luckiest-community-marketing/evals/evals.json +89 -0
- package/skills/luckiest-competitor-profiling/ATTRIBUTION.md +36 -0
- package/skills/luckiest-competitor-profiling/CHANGELOG.md +24 -0
- package/skills/luckiest-competitor-profiling/SKILL.md +443 -0
- package/skills/luckiest-competitor-profiling/evals/evals.json +85 -0
- package/skills/luckiest-competitor-profiling/references/templates.md +167 -0
- package/skills/luckiest-competitor-profiling/references/tool-reference.md +179 -0
- package/skills/luckiest-competitors/ATTRIBUTION.md +36 -0
- package/skills/luckiest-competitors/CHANGELOG.md +25 -0
- package/skills/luckiest-competitors/SKILL.md +171 -0
- package/skills/luckiest-competitors/evals/evals.json +93 -0
- package/skills/luckiest-competitors/references/content-architecture.md +271 -0
- package/skills/luckiest-competitors/references/templates.md +223 -0
- package/skills/luckiest-content-strategy/ATTRIBUTION.md +39 -0
- package/skills/luckiest-content-strategy/CHANGELOG.md +23 -0
- package/skills/luckiest-content-strategy/SKILL.md +395 -0
- package/skills/luckiest-content-strategy/evals/evals.json +90 -0
- package/skills/luckiest-content-strategy/references/headless-cms.md +194 -0
- package/skills/luckiest-copy-editing/ATTRIBUTION.md +41 -0
- package/skills/luckiest-copy-editing/CHANGELOG.md +31 -0
- package/skills/luckiest-copy-editing/SKILL.md +491 -0
- package/skills/luckiest-copy-editing/evals/evals.json +89 -0
- package/skills/luckiest-copy-editing/references/checklist.md +66 -0
- package/skills/luckiest-copy-editing/references/content-refresh.md +38 -0
- package/skills/luckiest-copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/luckiest-copywriting/ATTRIBUTION.md +35 -0
- package/skills/luckiest-copywriting/CHANGELOG.md +23 -0
- package/skills/luckiest-copywriting/SKILL.md +296 -0
- package/skills/luckiest-copywriting/evals/evals.json +111 -0
- package/skills/luckiest-copywriting/references/copy-frameworks.md +344 -0
- package/skills/luckiest-copywriting/references/natural-transitions.md +272 -0
- package/skills/luckiest-cro/ATTRIBUTION.md +34 -0
- package/skills/luckiest-cro/CHANGELOG.md +23 -0
- package/skills/luckiest-cro/SKILL.md +215 -0
- package/skills/luckiest-cro/evals/evals.json +111 -0
- package/skills/luckiest-cro/references/experiments.md +248 -0
- package/skills/luckiest-cro/references/form.md +422 -0
- package/skills/luckiest-customer-research/ATTRIBUTION.md +40 -0
- package/skills/luckiest-customer-research/CHANGELOG.md +26 -0
- package/skills/luckiest-customer-research/SKILL.md +293 -0
- package/skills/luckiest-customer-research/evals/evals.json +162 -0
- package/skills/luckiest-customer-research/references/source-guides.md +401 -0
- package/skills/luckiest-directory-submissions/ATTRIBUTION.md +40 -0
- package/skills/luckiest-directory-submissions/CHANGELOG.md +33 -0
- package/skills/luckiest-directory-submissions/SKILL.md +419 -0
- package/skills/luckiest-directory-submissions/evals/evals.json +94 -0
- package/skills/luckiest-directory-submissions/references/directory-list.md +477 -0
- package/skills/luckiest-directory-submissions/references/positioning-variations.md +232 -0
- package/skills/luckiest-directory-submissions/references/submission-tracker-template.csv +266 -0
- package/skills/luckiest-emails/ATTRIBUTION.md +42 -0
- package/skills/luckiest-emails/CHANGELOG.md +33 -0
- package/skills/luckiest-emails/SKILL.md +220 -0
- package/skills/luckiest-emails/evals/evals.json +93 -0
- package/skills/luckiest-emails/references/copy-guidelines.md +120 -0
- package/skills/luckiest-emails/references/email-types.md +515 -0
- package/skills/luckiest-emails/references/sequence-templates.md +168 -0
- package/skills/luckiest-extract-design-system/ATTRIBUTION.md +8 -0
- package/skills/luckiest-extract-design-system/CHANGELOG.md +37 -0
- package/skills/luckiest-extract-design-system/SKILL.md +83 -0
- package/skills/luckiest-free-tools/ATTRIBUTION.md +43 -0
- package/skills/luckiest-free-tools/CHANGELOG.md +25 -0
- package/skills/luckiest-free-tools/SKILL.md +220 -0
- package/skills/luckiest-free-tools/evals/evals.json +90 -0
- package/skills/luckiest-free-tools/references/tool-types.md +217 -0
- package/skills/luckiest-image/ATTRIBUTION.md +43 -0
- package/skills/luckiest-image/CHANGELOG.md +23 -0
- package/skills/luckiest-image/SKILL.md +376 -0
- package/skills/luckiest-image/evals/evals.json +89 -0
- package/skills/luckiest-image/references/ai-image-prompting.md +229 -0
- package/skills/luckiest-launch/ATTRIBUTION.md +40 -0
- package/skills/luckiest-launch/CHANGELOG.md +43 -0
- package/skills/luckiest-launch/SKILL.md +385 -0
- package/skills/luckiest-launch/evals/evals.json +91 -0
- package/skills/luckiest-lead-magnets/ATTRIBUTION.md +35 -0
- package/skills/luckiest-lead-magnets/CHANGELOG.md +23 -0
- package/skills/luckiest-lead-magnets/SKILL.md +331 -0
- package/skills/luckiest-lead-magnets/evals/evals.json +87 -0
- package/skills/luckiest-lead-magnets/references/benchmarks.md +129 -0
- package/skills/luckiest-lead-magnets/references/format-guide.md +196 -0
- package/skills/luckiest-marketing-ideas/ATTRIBUTION.md +39 -0
- package/skills/luckiest-marketing-ideas/CHANGELOG.md +33 -0
- package/skills/luckiest-marketing-ideas/SKILL.md +191 -0
- package/skills/luckiest-marketing-ideas/evals/evals.json +90 -0
- package/skills/luckiest-marketing-ideas/references/ideas-by-category.md +366 -0
- package/skills/luckiest-marketing-plan/ATTRIBUTION.md +40 -0
- package/skills/luckiest-marketing-plan/CHANGELOG.md +23 -0
- package/skills/luckiest-marketing-plan/SKILL.md +285 -0
- package/skills/luckiest-marketing-plan/evals/evals.json +96 -0
- package/skills/luckiest-marketing-plan/references/aarrr-framework.md +180 -0
- package/skills/luckiest-marketing-plan/references/budget-planning.md +168 -0
- package/skills/luckiest-marketing-plan/references/client-types.md +373 -0
- package/skills/luckiest-marketing-plan/references/current-state-rubric.md +255 -0
- package/skills/luckiest-marketing-plan/references/example-quietude.md +972 -0
- package/skills/luckiest-marketing-plan/references/funding-stage-unlocks.md +230 -0
- package/skills/luckiest-marketing-plan/references/growth-patterns.md +148 -0
- package/skills/luckiest-marketing-plan/references/idea-cross-reference.md +265 -0
- package/skills/luckiest-marketing-plan/references/measurement-framework.md +213 -0
- package/skills/luckiest-marketing-plan/references/methodology.md +363 -0
- package/skills/luckiest-marketing-plan/references/ops-stack-mapping.md +197 -0
- package/skills/luckiest-marketing-plan/references/plan-template.md +494 -0
- package/skills/luckiest-marketing-plan/references/team-and-agency-model.md +278 -0
- package/skills/luckiest-marketing-psychology/ATTRIBUTION.md +31 -0
- package/skills/luckiest-marketing-psychology/CHANGELOG.md +32 -0
- package/skills/luckiest-marketing-psychology/SKILL.md +202 -0
- package/skills/luckiest-marketing-psychology/evals.json +88 -0
- package/skills/luckiest-model-router/ATTRIBUTION.md +11 -0
- package/skills/luckiest-model-router/CHANGELOG.md +45 -0
- package/skills/luckiest-model-router/SKILL.md +74 -0
- package/skills/luckiest-model-router/scripts/route.py +145 -0
- package/skills/luckiest-offers/ATTRIBUTION.md +39 -0
- package/skills/luckiest-offers/CHANGELOG.md +23 -0
- package/skills/luckiest-offers/SKILL.md +167 -0
- package/skills/luckiest-offers/references/bonus-stacking.md +150 -0
- package/skills/luckiest-offers/references/examples.md +215 -0
- package/skills/luckiest-offers/references/guarantee-design.md +172 -0
- package/skills/luckiest-offers/references/offer-anatomy.md +203 -0
- package/skills/luckiest-offers/references/offer-formats.md +240 -0
- package/skills/luckiest-offers/references/scarcity-urgency.md +175 -0
- package/skills/luckiest-offers/references/value-equation.md +134 -0
- package/skills/luckiest-onboarding/ATTRIBUTION.md +43 -0
- package/skills/luckiest-onboarding/CHANGELOG.md +31 -0
- package/skills/luckiest-onboarding/SKILL.md +243 -0
- package/skills/luckiest-onboarding/references/experiments.md +258 -0
- package/skills/luckiest-paywalls/ATTRIBUTION.md +39 -0
- package/skills/luckiest-paywalls/CHANGELOG.md +25 -0
- package/skills/luckiest-paywalls/SKILL.md +256 -0
- package/skills/luckiest-paywalls/evals/evals.json +93 -0
- package/skills/luckiest-paywalls/references/experiments.md +164 -0
- package/skills/luckiest-popups/ATTRIBUTION.md +35 -0
- package/skills/luckiest-popups/CHANGELOG.md +27 -0
- package/skills/luckiest-popups/SKILL.md +477 -0
- package/skills/luckiest-popups/evals/evals.json +107 -0
- package/skills/luckiest-pricing/ATTRIBUTION.md +35 -0
- package/skills/luckiest-pricing/CHANGELOG.md +31 -0
- package/skills/luckiest-pricing/SKILL.md +283 -0
- package/skills/luckiest-pricing/evals/evals.json +90 -0
- package/skills/luckiest-pricing/references/research-methods.md +152 -0
- package/skills/luckiest-pricing/references/tier-structure.md +232 -0
- package/skills/luckiest-product-marketing/ATTRIBUTION.md +38 -0
- package/skills/luckiest-product-marketing/CHANGELOG.md +23 -0
- package/skills/luckiest-product-marketing/SKILL.md +256 -0
- package/skills/luckiest-product-marketing/evals/evals.json +85 -0
- package/skills/luckiest-programmatic-seo/ATTRIBUTION.md +35 -0
- package/skills/luckiest-programmatic-seo/CHANGELOG.md +24 -0
- package/skills/luckiest-programmatic-seo/SKILL.md +286 -0
- package/skills/luckiest-programmatic-seo/evals/evals.json +95 -0
- package/skills/luckiest-programmatic-seo/references/playbooks.md +308 -0
- package/skills/luckiest-prompt-rewrite/ATTRIBUTION.md +39 -0
- package/skills/luckiest-prompt-rewrite/CHANGELOG.md +70 -0
- package/skills/luckiest-prompt-rewrite/LICENSE +21 -0
- package/skills/luckiest-prompt-rewrite/SKILL.md +494 -0
- package/skills/luckiest-prompt-rewrite/references/patterns.md +82 -0
- package/skills/luckiest-prompt-rewrite/references/templates.md +454 -0
- package/skills/luckiest-prospecting/ATTRIBUTION.md +29 -0
- package/skills/luckiest-prospecting/CHANGELOG.md +24 -0
- package/skills/luckiest-prospecting/SKILL.md +275 -0
- package/skills/luckiest-prospecting/evals/evals.json +107 -0
- package/skills/luckiest-prospecting/references/b2b-prospecting.md +106 -0
- package/skills/luckiest-prospecting/references/compliance.md +123 -0
- package/skills/luckiest-prospecting/references/data-sources.md +287 -0
- package/skills/luckiest-prospecting/references/local-prospecting.md +165 -0
- package/skills/luckiest-prospecting/references/saas-prospecting.md +123 -0
- package/skills/luckiest-public-relations/ATTRIBUTION.md +34 -0
- package/skills/luckiest-public-relations/CHANGELOG.md +23 -0
- package/skills/luckiest-public-relations/SKILL.md +154 -0
- package/skills/luckiest-public-relations/references/journalist-pitching.md +368 -0
- package/skills/luckiest-public-relations/references/media-outlets.md +207 -0
- package/skills/luckiest-public-relations/references/newsjacking.md +218 -0
- package/skills/luckiest-public-relations/references/press-platforms.md +188 -0
- package/skills/luckiest-referrals/ATTRIBUTION.md +41 -0
- package/skills/luckiest-referrals/CHANGELOG.md +23 -0
- package/skills/luckiest-referrals/SKILL.md +292 -0
- package/skills/luckiest-referrals/evals/evals.json +90 -0
- package/skills/luckiest-referrals/references/affiliate-programs.md +167 -0
- package/skills/luckiest-referrals/references/program-examples.md +143 -0
- package/skills/luckiest-revops/ATTRIBUTION.md +40 -0
- package/skills/luckiest-revops/CHANGELOG.md +24 -0
- package/skills/luckiest-revops/SKILL.md +362 -0
- package/skills/luckiest-revops/evals/evals.json +91 -0
- package/skills/luckiest-revops/references/automation-playbooks.md +290 -0
- package/skills/luckiest-revops/references/lifecycle-definitions.md +278 -0
- package/skills/luckiest-revops/references/routing-rules.md +203 -0
- package/skills/luckiest-revops/references/scoring-models.md +247 -0
- package/skills/luckiest-sales-enablement/ATTRIBUTION.md +39 -0
- package/skills/luckiest-sales-enablement/CHANGELOG.md +23 -0
- package/skills/luckiest-sales-enablement/SKILL.md +379 -0
- package/skills/luckiest-sales-enablement/evals/evals.json +91 -0
- package/skills/luckiest-sales-enablement/references/deck-frameworks.md +263 -0
- package/skills/luckiest-sales-enablement/references/demo-scripts.md +355 -0
- package/skills/luckiest-sales-enablement/references/objection-library.md +270 -0
- package/skills/luckiest-sales-enablement/references/one-pager-templates.md +208 -0
- package/skills/luckiest-schema/ATTRIBUTION.md +39 -0
- package/skills/luckiest-schema/CHANGELOG.md +25 -0
- package/skills/luckiest-schema/SKILL.md +209 -0
- package/skills/luckiest-schema/evals/evals.json +88 -0
- package/skills/luckiest-schema/references/schema-examples.md +398 -0
- package/skills/luckiest-seo-audit/ATTRIBUTION.md +39 -0
- package/skills/luckiest-seo-audit/CHANGELOG.md +23 -0
- package/skills/luckiest-seo-audit/SKILL.md +529 -0
- package/skills/luckiest-seo-audit/evals/evals.json +136 -0
- package/skills/luckiest-seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/luckiest-seo-audit/references/international-seo.md +230 -0
- package/skills/luckiest-session-handoff/ATTRIBUTION.md +14 -0
- package/skills/luckiest-session-handoff/CHANGELOG.md +30 -0
- package/skills/luckiest-session-handoff/SKILL.md +96 -0
- package/skills/luckiest-signup/ATTRIBUTION.md +48 -0
- package/skills/luckiest-signup/CHANGELOG.md +24 -0
- package/skills/luckiest-signup/SKILL.md +382 -0
- package/skills/luckiest-signup/evals/evals.json +88 -0
- package/skills/luckiest-site-architecture/ATTRIBUTION.md +38 -0
- package/skills/luckiest-site-architecture/CHANGELOG.md +23 -0
- package/skills/luckiest-site-architecture/SKILL.md +383 -0
- package/skills/luckiest-site-architecture/evals/evals.json +88 -0
- package/skills/luckiest-site-architecture/references/mermaid-templates.md +216 -0
- package/skills/luckiest-site-architecture/references/navigation-patterns.md +305 -0
- package/skills/luckiest-site-architecture/references/site-type-templates.md +293 -0
- package/skills/luckiest-sms/ATTRIBUTION.md +27 -0
- package/skills/luckiest-sms/CHANGELOG.md +24 -0
- package/skills/luckiest-sms/SKILL.md +400 -0
- package/skills/luckiest-sms/evals/evals.json +100 -0
- package/skills/luckiest-sms/references/compliance.md +202 -0
- package/skills/luckiest-sms/references/platforms.md +318 -0
- package/skills/luckiest-sms/references/sequence-templates.md +282 -0
- package/skills/luckiest-social/ATTRIBUTION.md +27 -0
- package/skills/luckiest-social/CHANGELOG.md +24 -0
- package/skills/luckiest-social/SKILL.md +430 -0
- package/skills/luckiest-social/evals/evals.json +92 -0
- package/skills/luckiest-social/references/listening-sources-template.md +123 -0
- package/skills/luckiest-social/references/listening.md +283 -0
- package/skills/luckiest-social/references/platform-limits.md +110 -0
- package/skills/luckiest-social/references/platforms.md +170 -0
- package/skills/luckiest-social/references/post-templates.md +177 -0
- package/skills/luckiest-social/references/reverse-engineering.md +195 -0
- package/skills/luckiest-social/references/short-form-video.md +237 -0
- package/skills/luckiest-thinker/ATTRIBUTION.md +16 -0
- package/skills/luckiest-thinker/CHANGELOG.md +20 -0
- package/skills/luckiest-thinker/LICENSE +21 -0
- package/skills/luckiest-thinker/SKILL.md +92 -0
- package/skills/luckiest-thinker/references/distribution-calibration.md +106 -0
- package/skills/luckiest-thinker/references/research-foundations.md +214 -0
- package/skills/luckiest-thinker/references/thinking-patterns.md +138 -0
- package/skills/luckiest-trends/.skillignore +10 -0
- package/skills/luckiest-trends/ATTRIBUTION.md +43 -0
- package/skills/luckiest-trends/CHANGELOG.md +86 -0
- package/skills/luckiest-trends/LICENSE +21 -0
- package/skills/luckiest-trends/SKILL.md +194 -0
- package/skills/luckiest-trends/agents/openai.yaml +8 -0
- package/skills/luckiest-trends/references/engine-contract.md +2041 -0
- package/skills/luckiest-trends/references/save-html-brief.md +206 -0
- package/skills/luckiest-trends/scripts/briefing.py +272 -0
- package/skills/luckiest-trends/scripts/build-skill.sh +39 -0
- package/skills/luckiest-trends/scripts/compare.sh +61 -0
- package/skills/luckiest-trends/scripts/evaluate_search_quality.py +573 -0
- package/skills/luckiest-trends/scripts/last30days.py +1467 -0
- package/skills/luckiest-trends/scripts/lib/__init__.py +1 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/arxiv.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/bird_x.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/bluesky.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/categories.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/cjk.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/cluster.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/dates.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/dedupe.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/digg.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/entity_extract.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/env.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/fusion.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/github.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/grounding.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/hackernews.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/hiring_signals.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/html_render.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/http.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/instagram.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/jobs.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/linkedin.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/log.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/normalize.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/permission_preflight.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/perplexity.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/pinterest.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/pipeline.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/planner.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/polymarket.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/preflight.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/providers.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/quality_nudge.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/query.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_arctic.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_enrich.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_keyless.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_listing.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_public.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_rss.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/reddit_shreddit.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/relevance.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/render.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/rerank.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/resolve.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/schema.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/signals.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/skill_meta.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/snippet.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/subproc.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/techmeme.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/threads.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/tiktok.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/trustpilot.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/truthsocial.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/ui.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/web_search_keyless.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/xai_x.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/xiaohongshu_api.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/xquik.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/xurl_x.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/__pycache__/youtube_yt.cpython-313.pyc +0 -0
- package/skills/luckiest-trends/scripts/lib/arxiv.py +290 -0
- package/skills/luckiest-trends/scripts/lib/bird_x.py +639 -0
- package/skills/luckiest-trends/scripts/lib/bluesky.py +323 -0
- package/skills/luckiest-trends/scripts/lib/categories.py +283 -0
- package/skills/luckiest-trends/scripts/lib/chrome_cookies.py +414 -0
- package/skills/luckiest-trends/scripts/lib/cjk.py +107 -0
- package/skills/luckiest-trends/scripts/lib/cluster.py +271 -0
- package/skills/luckiest-trends/scripts/lib/competitors.py +198 -0
- package/skills/luckiest-trends/scripts/lib/cookie_extract.py +508 -0
- package/skills/luckiest-trends/scripts/lib/dates.py +169 -0
- package/skills/luckiest-trends/scripts/lib/dedupe.py +145 -0
- package/skills/luckiest-trends/scripts/lib/digg.py +440 -0
- package/skills/luckiest-trends/scripts/lib/entity_extract.py +127 -0
- package/skills/luckiest-trends/scripts/lib/env.py +1073 -0
- package/skills/luckiest-trends/scripts/lib/fanout.py +84 -0
- package/skills/luckiest-trends/scripts/lib/fusion.py +207 -0
- package/skills/luckiest-trends/scripts/lib/github.py +996 -0
- package/skills/luckiest-trends/scripts/lib/grounding.py +331 -0
- package/skills/luckiest-trends/scripts/lib/hackernews.py +357 -0
- package/skills/luckiest-trends/scripts/lib/health.py +92 -0
- package/skills/luckiest-trends/scripts/lib/hiring_signals.py +326 -0
- package/skills/luckiest-trends/scripts/lib/html_publish.py +73 -0
- package/skills/luckiest-trends/scripts/lib/html_render.py +738 -0
- package/skills/luckiest-trends/scripts/lib/http.py +372 -0
- package/skills/luckiest-trends/scripts/lib/instagram.py +521 -0
- package/skills/luckiest-trends/scripts/lib/jobs.py +708 -0
- package/skills/luckiest-trends/scripts/lib/linkedin.py +363 -0
- package/skills/luckiest-trends/scripts/lib/log.py +35 -0
- package/skills/luckiest-trends/scripts/lib/normalize.py +759 -0
- package/skills/luckiest-trends/scripts/lib/permission_preflight.py +242 -0
- package/skills/luckiest-trends/scripts/lib/perplexity.py +745 -0
- package/skills/luckiest-trends/scripts/lib/pinterest.py +154 -0
- package/skills/luckiest-trends/scripts/lib/pipeline.py +1720 -0
- package/skills/luckiest-trends/scripts/lib/planner.py +763 -0
- package/skills/luckiest-trends/scripts/lib/polymarket.py +794 -0
- package/skills/luckiest-trends/scripts/lib/preflight.py +119 -0
- package/skills/luckiest-trends/scripts/lib/providers.py +380 -0
- package/skills/luckiest-trends/scripts/lib/quality_nudge.py +383 -0
- package/skills/luckiest-trends/scripts/lib/query.py +202 -0
- package/skills/luckiest-trends/scripts/lib/reddit.py +731 -0
- package/skills/luckiest-trends/scripts/lib/reddit_arctic.py +92 -0
- package/skills/luckiest-trends/scripts/lib/reddit_enrich.py +322 -0
- package/skills/luckiest-trends/scripts/lib/reddit_keyless.py +329 -0
- package/skills/luckiest-trends/scripts/lib/reddit_listing.py +188 -0
- package/skills/luckiest-trends/scripts/lib/reddit_public.py +275 -0
- package/skills/luckiest-trends/scripts/lib/reddit_rss.py +224 -0
- package/skills/luckiest-trends/scripts/lib/reddit_shreddit.py +184 -0
- package/skills/luckiest-trends/scripts/lib/relevance.py +200 -0
- package/skills/luckiest-trends/scripts/lib/render.py +2130 -0
- package/skills/luckiest-trends/scripts/lib/rerank.py +708 -0
- package/skills/luckiest-trends/scripts/lib/resolve.py +345 -0
- package/skills/luckiest-trends/scripts/lib/safari_cookies.py +193 -0
- package/skills/luckiest-trends/scripts/lib/schema.py +319 -0
- package/skills/luckiest-trends/scripts/lib/setup_wizard.py +843 -0
- package/skills/luckiest-trends/scripts/lib/signals.py +334 -0
- package/skills/luckiest-trends/scripts/lib/skill_meta.py +33 -0
- package/skills/luckiest-trends/scripts/lib/snippet.py +51 -0
- package/skills/luckiest-trends/scripts/lib/subproc.py +116 -0
- package/skills/luckiest-trends/scripts/lib/techmeme.py +239 -0
- package/skills/luckiest-trends/scripts/lib/threads.py +207 -0
- package/skills/luckiest-trends/scripts/lib/tiktok.py +596 -0
- package/skills/luckiest-trends/scripts/lib/transcribe.py +235 -0
- package/skills/luckiest-trends/scripts/lib/trustpilot.py +277 -0
- package/skills/luckiest-trends/scripts/lib/truthsocial.py +162 -0
- package/skills/luckiest-trends/scripts/lib/ui.py +626 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/LICENSE +21 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/bird-search.mjs +147 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/cookies.js +220 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/features.json +17 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/paginate-cursor.js +37 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/query-ids.json +20 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/runtime-features.js +151 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/runtime-query-ids.js +264 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-base.js +129 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-constants.js +50 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-features.js +347 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-search.js +157 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-types.js +2 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/lib/twitter-client-utils.js +511 -0
- package/skills/luckiest-trends/scripts/lib/vendor/bird-search/package.json +13 -0
- package/skills/luckiest-trends/scripts/lib/web_fetch_keyless.py +105 -0
- package/skills/luckiest-trends/scripts/lib/web_search_keyless.py +158 -0
- package/skills/luckiest-trends/scripts/lib/xai_x.py +236 -0
- package/skills/luckiest-trends/scripts/lib/xiaohongshu_api.py +162 -0
- package/skills/luckiest-trends/scripts/lib/xquik.py +404 -0
- package/skills/luckiest-trends/scripts/lib/xurl_x.py +171 -0
- package/skills/luckiest-trends/scripts/lib/youtube_yt.py +1365 -0
- package/skills/luckiest-trends/scripts/setup-keychain.sh +123 -0
- package/skills/luckiest-trends/scripts/setup-pass.sh +132 -0
- package/skills/luckiest-trends/scripts/store.py +1020 -0
- package/skills/luckiest-trends/scripts/test-v1-vs-v2.sh +220 -0
- package/skills/luckiest-trends/scripts/test_device_auth.py +128 -0
- package/skills/luckiest-trends/scripts/verify_v3.py +195 -0
- package/skills/luckiest-trends/scripts/watchlist.py +318 -0
- package/skills/luckiest-video/ATTRIBUTION.md +27 -0
- package/skills/luckiest-video/CHANGELOG.md +23 -0
- package/skills/luckiest-video/SKILL.md +371 -0
- package/skills/luckiest-video/evals/evals.json +88 -0
- package/skills/luckiest-video/references/ai-video-prompting.md +175 -0
- package/skills/remix/SKILL.md +32 -0
- package/commands/luckiest/go.md +0 -45
- package/commands/luckiest/plan.md +0 -55
- /package/commands/{luckiest/charms.md → charms.md} +0 -0
- /package/commands/{luckiest/helpers.md → helpers.md} +0 -0
- /package/commands/{luckiest/home.md → home.md} +0 -0
- /package/commands/{luckiest/leaderboard.md → leaderboard.md} +0 -0
- /package/commands/{luckiest/merge.md → merge.md} +0 -0
- /package/commands/{luckiest/overlaps.md → overlaps.md} +0 -0
- /package/commands/{luckiest/skills.md → skills.md} +0 -0
- /package/commands/{luckiest/start.md → start.md} +0 -0
- /package/commands/{luckiest/status.md → status.md} +0 -0
- /package/commands/{luckiest/updates.md → updates.md} +0 -0
- /package/commands/{luckiest/vouch.md → vouch.md} +0 -0
- /package/commands/{luckiest/wishes.md → wishes.md} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: luckiest-coder-git-worktrees
|
|
3
|
+
description: Use when starting feature work that needs isolation from your current workspace, or before executing an implementation plan, to guarantee an isolated workspace exists. Sets up isolation via your platform's native worktree tools or a manual git worktree fallback, verifies the directory is gitignored, runs project setup, and confirms a clean test baseline. Trigger phrases include "set up a worktree", "isolate this work", "create an isolated workspace", "work on a separate branch safely", or before starting any multi-step implementation.
|
|
4
|
+
license: See ATTRIBUTION.md
|
|
5
|
+
metadata:
|
|
6
|
+
version: "1.1.0"
|
|
7
|
+
listing_id: luckiest-coder-git-worktrees
|
|
8
|
+
author: luckiest
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Using Git Worktrees
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Ensure work happens in an isolated workspace. Prefer your platform's native worktree tools. Fall back to manual git worktrees only when no native tool is available.
|
|
16
|
+
|
|
17
|
+
**Core principle:** Detect existing isolation first. Then use native tools. Then fall back to git. Never fight the harness.
|
|
18
|
+
|
|
19
|
+
**Announce at start:** "I'm using the luckiest-coder-git-worktrees skill to set up an isolated workspace."
|
|
20
|
+
|
|
21
|
+
## Step 0: Detect Existing Isolation
|
|
22
|
+
|
|
23
|
+
**Before creating anything, check if you are already in an isolated workspace.**
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
27
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
28
|
+
BRANCH=$(git branch --show-current)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Submodule guard:** `GIT_DIR != GIT_COMMON` is also true inside git submodules. Before concluding "already in a worktree," verify you are not in a submodule:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# If this returns a path, you're in a submodule, not a worktree — treat as normal repo
|
|
35
|
+
git rev-parse --show-superproject-working-tree 2>/dev/null
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**If `GIT_DIR != GIT_COMMON` (and not a submodule):** You are already in a linked worktree. Skip to Step 2 (Project Setup). Do NOT create another worktree.
|
|
39
|
+
|
|
40
|
+
Report with branch state:
|
|
41
|
+
- On a branch: "Already in isolated workspace at `<path>` on branch `<name>`."
|
|
42
|
+
- Detached HEAD: "Already in isolated workspace at `<path>` (detached HEAD, externally managed). Branch creation needed at finish time."
|
|
43
|
+
|
|
44
|
+
**If `GIT_DIR == GIT_COMMON` (or in a submodule):** You are in a normal repo checkout.
|
|
45
|
+
|
|
46
|
+
Has the user already indicated their worktree preference in your instructions? If not, ask for consent before creating a worktree:
|
|
47
|
+
|
|
48
|
+
> "Would you like me to set up an isolated worktree? It protects your current branch from changes."
|
|
49
|
+
|
|
50
|
+
Honor any existing declared preference without asking. If the user declines consent, work in place and skip to Step 2.
|
|
51
|
+
|
|
52
|
+
## Step 1: Create Isolated Workspace
|
|
53
|
+
|
|
54
|
+
**You have two mechanisms. Try them in this order.**
|
|
55
|
+
|
|
56
|
+
### 1a. Native Worktree Tools (preferred)
|
|
57
|
+
|
|
58
|
+
The user has asked for an isolated workspace (Step 0 consent). Do you already have a way to create a worktree? It might be a tool with a name like `EnterWorktree`, `WorktreeCreate`, a `/worktree` command, or a `--worktree` flag. If you do, use it and skip to Step 2.
|
|
59
|
+
|
|
60
|
+
Native tools handle directory placement, branch creation, and cleanup automatically. Using `git worktree add` when you have a native tool creates phantom state your harness can't see or manage.
|
|
61
|
+
|
|
62
|
+
Only proceed to Step 1b if you have no native worktree tool available.
|
|
63
|
+
|
|
64
|
+
### 1b. Git Worktree Fallback
|
|
65
|
+
|
|
66
|
+
**Only use this if Step 1a does not apply** — you have no native worktree tool available. Create a worktree manually using git.
|
|
67
|
+
|
|
68
|
+
#### Directory Selection
|
|
69
|
+
|
|
70
|
+
Follow this priority order. Explicit user preference always beats observed filesystem state.
|
|
71
|
+
|
|
72
|
+
1. **Check your instructions for a declared worktree directory preference.** If the user has already specified one, use it without asking.
|
|
73
|
+
|
|
74
|
+
2. **Check for an existing project-local worktree directory:**
|
|
75
|
+
```bash
|
|
76
|
+
ls -d .worktrees 2>/dev/null # Preferred (hidden)
|
|
77
|
+
ls -d worktrees 2>/dev/null # Alternative
|
|
78
|
+
```
|
|
79
|
+
If found, use it. If both exist, `.worktrees` wins.
|
|
80
|
+
|
|
81
|
+
3. **If there is no other guidance available**, default to `.worktrees/` at the project root.
|
|
82
|
+
|
|
83
|
+
#### Safety Verification (project-local directories only)
|
|
84
|
+
|
|
85
|
+
**MUST verify directory is ignored before creating worktree:**
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**If NOT ignored:** Add to .gitignore, commit the change, then proceed.
|
|
92
|
+
|
|
93
|
+
**Why critical:** Prevents accidentally committing worktree contents to repository.
|
|
94
|
+
|
|
95
|
+
#### Create the Worktree
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Determine path based on chosen location
|
|
99
|
+
path="$LOCATION/$BRANCH_NAME"
|
|
100
|
+
|
|
101
|
+
git worktree add "$path" -b "$BRANCH_NAME"
|
|
102
|
+
cd "$path"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Sandbox fallback:** If `git worktree add` fails with a permission error (sandbox denial), tell the user the sandbox blocked worktree creation and you're working in the current directory instead. Then run setup and baseline tests in place.
|
|
106
|
+
|
|
107
|
+
## Step 2: Project Setup
|
|
108
|
+
|
|
109
|
+
Auto-detect and run appropriate setup:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Node.js
|
|
113
|
+
if [ -f package.json ]; then npm install; fi
|
|
114
|
+
|
|
115
|
+
# Rust
|
|
116
|
+
if [ -f Cargo.toml ]; then cargo build; fi
|
|
117
|
+
|
|
118
|
+
# Python
|
|
119
|
+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
120
|
+
if [ -f pyproject.toml ]; then poetry install; fi
|
|
121
|
+
|
|
122
|
+
# Go
|
|
123
|
+
if [ -f go.mod ]; then go mod download; fi
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Step 3: Verify Clean Baseline
|
|
127
|
+
|
|
128
|
+
Run tests to ensure workspace starts clean:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Use project-appropriate command
|
|
132
|
+
npm test / cargo test / pytest / go test ./...
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**If tests fail:** Report failures, ask whether to proceed or investigate.
|
|
136
|
+
|
|
137
|
+
**If tests pass:** Report ready.
|
|
138
|
+
|
|
139
|
+
### Report
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Worktree ready at <full-path>
|
|
143
|
+
Tests passing (<N> tests, 0 failures)
|
|
144
|
+
Ready to implement <feature-name>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Quick Reference
|
|
148
|
+
|
|
149
|
+
| Situation | Action |
|
|
150
|
+
|-----------|--------|
|
|
151
|
+
| Already in linked worktree | Skip creation (Step 0) |
|
|
152
|
+
| In a submodule | Treat as normal repo (Step 0 guard) |
|
|
153
|
+
| Native worktree tool available | Use it (Step 1a) |
|
|
154
|
+
| No native tool | Git worktree fallback (Step 1b) |
|
|
155
|
+
| `.worktrees/` exists | Use it (verify ignored) |
|
|
156
|
+
| `worktrees/` exists | Use it (verify ignored) |
|
|
157
|
+
| Both exist | Use `.worktrees/` |
|
|
158
|
+
| Neither exists | Check instruction file, then default `.worktrees/` |
|
|
159
|
+
| Directory not ignored | Add to .gitignore + commit |
|
|
160
|
+
| Permission error on create | Sandbox fallback, work in place |
|
|
161
|
+
| Tests fail during baseline | Report failures + ask |
|
|
162
|
+
| No package.json/Cargo.toml | Skip dependency install |
|
|
163
|
+
|
|
164
|
+
## Common Mistakes
|
|
165
|
+
|
|
166
|
+
### Fighting the harness
|
|
167
|
+
|
|
168
|
+
- **Problem:** Using `git worktree add` when the platform already provides isolation
|
|
169
|
+
- **Fix:** Step 0 detects existing isolation. Step 1a defers to native tools.
|
|
170
|
+
|
|
171
|
+
### Skipping detection
|
|
172
|
+
|
|
173
|
+
- **Problem:** Creating a nested worktree inside an existing one
|
|
174
|
+
- **Fix:** Always run Step 0 before creating anything
|
|
175
|
+
|
|
176
|
+
### Skipping ignore verification
|
|
177
|
+
|
|
178
|
+
- **Problem:** Worktree contents get tracked, pollute git status
|
|
179
|
+
- **Fix:** Always use `git check-ignore` before creating project-local worktree
|
|
180
|
+
|
|
181
|
+
### Assuming directory location
|
|
182
|
+
|
|
183
|
+
- **Problem:** Creates inconsistency, violates project conventions
|
|
184
|
+
- **Fix:** Follow priority: explicit instructions > existing project-local directory > default
|
|
185
|
+
|
|
186
|
+
### Proceeding with failing tests
|
|
187
|
+
|
|
188
|
+
- **Problem:** Can't distinguish new bugs from pre-existing issues
|
|
189
|
+
- **Fix:** Report failures, get explicit permission to proceed
|
|
190
|
+
|
|
191
|
+
## Red Flags
|
|
192
|
+
|
|
193
|
+
**Never:**
|
|
194
|
+
- Create a worktree when Step 0 detects existing isolation
|
|
195
|
+
- Use `git worktree add` when you have a native worktree tool (e.g., `EnterWorktree`). This is the #1 mistake — if you have it, use it.
|
|
196
|
+
- Skip Step 1a by jumping straight to Step 1b's git commands
|
|
197
|
+
- Create worktree without verifying it's ignored (project-local)
|
|
198
|
+
- Skip baseline test verification
|
|
199
|
+
- Proceed with failing tests without asking
|
|
200
|
+
|
|
201
|
+
**Always:**
|
|
202
|
+
- Run Step 0 detection first
|
|
203
|
+
- Prefer native tools over git fallback
|
|
204
|
+
- Follow directory priority: explicit instructions > existing project-local directory > default
|
|
205
|
+
- Verify directory is ignored for project-local
|
|
206
|
+
- Auto-detect and run project setup
|
|
207
|
+
- Verify clean test baseline
|
|
208
|
+
|
|
209
|
+
## Staying current
|
|
210
|
+
|
|
211
|
+
On activation, call the Luckiest MCP `check_updates` tool with
|
|
212
|
+
`{ listingId: "luckiest-coder-git-worktrees", installedSemver: "1.1.0" }`.
|
|
213
|
+
If it returns `upToDate: false`, surface the `notice` to the user. Do nothing if `upToDate: true`.
|
|
214
|
+
|
|
215
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-coder-git-worktrees", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Attribution
|
|
2
|
+
|
|
3
|
+
This skill is adapted from the "careful", "freeze", "guard", and "unfreeze" skills in
|
|
4
|
+
gstack (https://github.com/garrytan/gstack) by Garry Tan, used under the MIT License.
|
|
5
|
+
The `bin/check-careful.sh` and `bin/check-freeze.sh` hook scripts are derived from the
|
|
6
|
+
originals (analytics/telemetry removed, state path and messages rebranded; detection and
|
|
7
|
+
boundary-enforcement logic unchanged).
|
|
8
|
+
|
|
9
|
+
MIT License
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2026 Garry Tan
|
|
12
|
+
|
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
in the Software without restriction, including without limitation the rights
|
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
furnished to do so, subject to the following conditions:
|
|
19
|
+
|
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
copies or substantial portions of the Software.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
SOFTWARE.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Changelog — luckiest-coder-guard
|
|
2
|
+
|
|
3
|
+
## 1.1.0 — 2026-07-06
|
|
4
|
+
Skill updater pass: analytics integration.
|
|
5
|
+
|
|
6
|
+
### Analytics (report_usage)
|
|
7
|
+
- Updated `report_usage` call to `skill_version: "1.1.0"` and `check_updates`
|
|
8
|
+
`installedSemver: "1.1.0"`. The skill now reports usage to the Luckiest
|
|
9
|
+
telemetry pipeline on every run, making it visible on the admin Skill Usage
|
|
10
|
+
page (/owner/skill-usage).
|
|
11
|
+
|
|
12
|
+
## 1.0.0 — 2026-07-03
|
|
13
|
+
Rebranded and consolidated from gstack's `careful` + `freeze` + `guard` + `unfreeze` skills
|
|
14
|
+
(MIT, Copyright (c) 2026 Garry Tan) into one hook-driven safety skill. Frontmatter
|
|
15
|
+
`name`/`listing_id` set to `luckiest-coder-guard`; Staying-current `check_updates` hook added.
|
|
16
|
+
|
|
17
|
+
### Security pass
|
|
18
|
+
- PASS — the two hook scripts read stdin JSON and emit permission decisions only; no
|
|
19
|
+
credential access, no network calls, no obfuscation. The sole side effect in the originals
|
|
20
|
+
was a local-only analytics append, which was removed.
|
|
21
|
+
|
|
22
|
+
### Best-practices pass
|
|
23
|
+
- Four source skills collapsed into one. This exploits the fact that the freeze hook is a
|
|
24
|
+
no-op when no boundary file exists: "careful" is just the skill active with no boundary,
|
|
25
|
+
"freeze"/"guard" set a boundary, "unfreeze" clears it — one skill, four behaviors, no
|
|
26
|
+
cross-skill hook-path dependency (gstack's `guard` reached into sibling `../careful/bin`
|
|
27
|
+
and `../freeze/bin`; this skill owns both scripts).
|
|
28
|
+
- Removed the gstack analytics/telemetry writes to `~/.gstack/analytics/skill-usage.jsonl`
|
|
29
|
+
from both scripts and the skill body.
|
|
30
|
+
- Rebranded hook state root from `~/.gstack` to `~/.luckiest` (still honors
|
|
31
|
+
`CLAUDE_PLUGIN_DATA`); warning/deny message prefix changed to `[guard]`.
|
|
32
|
+
- Added an honest "Limits" section (not a security boundary; Bash can still write outside the
|
|
33
|
+
freeze dir; session-scoped; symlink-resolution edge) — the original scattered these caveats.
|
|
34
|
+
|
|
35
|
+
### Improve pass (/refract)
|
|
36
|
+
- Boundary-set step now hard-fails if the path does not resolve to an existing directory,
|
|
37
|
+
instead of silently writing an empty/garbage boundary.
|
|
38
|
+
|
|
39
|
+
### Verification
|
|
40
|
+
- Smoke-tested the scripts: destructive commands warn (`rm -rf /var/data`, `git push -f`),
|
|
41
|
+
safe/build-artifact deletes allow (`rm -rf node_modules`, `ls`), no-boundary allows all
|
|
42
|
+
edits, a set boundary allows edits inside (including new files) and denies edits outside.
|
|
43
|
+
|
|
44
|
+
### Network hook
|
|
45
|
+
- N/A — a guardrail skill emits no shareable artifact.
|
|
46
|
+
|
|
47
|
+
### Trend pass (/newsjack + /luckiest-trends)
|
|
48
|
+
- no actionable signal — safety-guardrail tooling is not news-driven.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Garry Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: luckiest-coder-guard
|
|
3
|
+
description: >-
|
|
4
|
+
Safety guardrails for risky sessions. Warns before destructive shell commands
|
|
5
|
+
(rm -rf, DROP TABLE, TRUNCATE, git push --force, git reset --hard, kubectl delete,
|
|
6
|
+
docker prune) and can hard-block file edits outside a chosen directory. Use when
|
|
7
|
+
touching production, debugging live systems, or working in a shared repo. Trigger
|
|
8
|
+
phrases: "be careful", "safety mode", "prod mode", "guard mode", "full safety",
|
|
9
|
+
"lock it down", "freeze edits to this folder", "restrict edits", and "unfreeze" /
|
|
10
|
+
"unlock edits" to clear the boundary.
|
|
11
|
+
license: See ATTRIBUTION.md
|
|
12
|
+
allowed-tools:
|
|
13
|
+
- Bash
|
|
14
|
+
- Read
|
|
15
|
+
- AskUserQuestion
|
|
16
|
+
hooks:
|
|
17
|
+
PreToolUse:
|
|
18
|
+
- matcher: "Bash"
|
|
19
|
+
hooks:
|
|
20
|
+
- type: command
|
|
21
|
+
command: "bash ${CLAUDE_SKILL_DIR}/bin/check-careful.sh"
|
|
22
|
+
statusMessage: "Checking for destructive commands..."
|
|
23
|
+
- matcher: "Edit"
|
|
24
|
+
hooks:
|
|
25
|
+
- type: command
|
|
26
|
+
command: "bash ${CLAUDE_SKILL_DIR}/bin/check-freeze.sh"
|
|
27
|
+
statusMessage: "Checking freeze boundary..."
|
|
28
|
+
- matcher: "Write"
|
|
29
|
+
hooks:
|
|
30
|
+
- type: command
|
|
31
|
+
command: "bash ${CLAUDE_SKILL_DIR}/bin/check-freeze.sh"
|
|
32
|
+
statusMessage: "Checking freeze boundary..."
|
|
33
|
+
metadata:
|
|
34
|
+
version: "1.1.0"
|
|
35
|
+
listing_id: luckiest-coder-guard
|
|
36
|
+
author: luckiest
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
# Luckiest Coder — Guard
|
|
40
|
+
|
|
41
|
+
Session-scoped safety rails, enforced by PreToolUse hooks (not by remembering to be
|
|
42
|
+
careful). Two protections, independently controllable:
|
|
43
|
+
|
|
44
|
+
- **Careful** — every Bash command is screened for destructive patterns and you are asked
|
|
45
|
+
to confirm before it runs. Active as soon as this skill is on. Nothing to configure.
|
|
46
|
+
- **Freeze** — Edit/Write to any file outside a chosen directory is *blocked* (denied, not
|
|
47
|
+
just warned). Off until you set a boundary.
|
|
48
|
+
|
|
49
|
+
"Guard mode" is simply both at once: careful is always on, plus a freeze boundary.
|
|
50
|
+
|
|
51
|
+
## Staying current
|
|
52
|
+
|
|
53
|
+
On activation, call the Luckiest MCP `check_updates` tool with
|
|
54
|
+
`{ listingId: "luckiest-coder-guard", installedSemver: "1.1.0" }`. If it returns
|
|
55
|
+
`upToDate: false`, surface the `notice`. Do nothing if `upToDate: true`.
|
|
56
|
+
|
|
57
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-coder-guard", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
58
|
+
|
|
59
|
+
## Activating
|
|
60
|
+
|
|
61
|
+
Tell the user careful mode is now active: destructive commands will prompt for
|
|
62
|
+
confirmation before running, and they can always override. Then ask what they want:
|
|
63
|
+
|
|
64
|
+
- **Just careful** (warnings only) → done, no boundary needed.
|
|
65
|
+
- **Freeze / guard** (also lock edits to one folder) → run the Set a boundary step below.
|
|
66
|
+
|
|
67
|
+
## Set a boundary (freeze / guard)
|
|
68
|
+
|
|
69
|
+
Ask, via AskUserQuestion with a free-text answer, which directory edits should be
|
|
70
|
+
restricted to. Files outside it will be blocked. Then persist it:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
BOUNDARY=$(cd "<user-provided-path>" 2>/dev/null && pwd -P)
|
|
74
|
+
[ -z "$BOUNDARY" ] && { echo "That path does not exist — pick an existing directory."; exit 1; }
|
|
75
|
+
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.luckiest}"
|
|
76
|
+
mkdir -p "$STATE_DIR"
|
|
77
|
+
printf '%s/\n' "${BOUNDARY%/}" > "$STATE_DIR/freeze-dir.txt"
|
|
78
|
+
echo "Freeze boundary set: ${BOUNDARY%/}/"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Tell the user: edits are now restricted to that directory; any Edit or Write outside it is
|
|
82
|
+
blocked. To change it, run this step again. To remove it, run the Unfreeze step.
|
|
83
|
+
|
|
84
|
+
## Unfreeze (clear the boundary)
|
|
85
|
+
|
|
86
|
+
Removes the edit restriction without ending the session. Careful-mode warnings stay on.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.luckiest}"
|
|
90
|
+
if [ -f "$STATE_DIR/freeze-dir.txt" ]; then
|
|
91
|
+
PREV=$(cat "$STATE_DIR/freeze-dir.txt")
|
|
92
|
+
rm -f "$STATE_DIR/freeze-dir.txt"
|
|
93
|
+
echo "Freeze boundary cleared (was: $PREV). Edits allowed everywhere again."
|
|
94
|
+
else
|
|
95
|
+
echo "No freeze boundary was set."
|
|
96
|
+
fi
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## What careful mode catches
|
|
100
|
+
|
|
101
|
+
| Pattern | Example | Risk |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `rm -rf` / `rm -r` / `--recursive` | `rm -rf /var/data` | Recursive delete |
|
|
104
|
+
| `DROP TABLE` / `DROP DATABASE` | `DROP TABLE users;` | Data loss |
|
|
105
|
+
| `TRUNCATE` | `TRUNCATE orders;` | Data loss |
|
|
106
|
+
| `git push --force` / `-f` | `git push -f origin main` | History rewrite |
|
|
107
|
+
| `git reset --hard` | `git reset --hard HEAD~3` | Uncommitted work loss |
|
|
108
|
+
| `git checkout .` / `git restore .` | `git checkout .` | Uncommitted work loss |
|
|
109
|
+
| `kubectl delete` | `kubectl delete pod x` | Production impact |
|
|
110
|
+
| `docker rm -f` / `system prune` | `docker system prune -a` | Container/image loss |
|
|
111
|
+
|
|
112
|
+
**Safe exceptions** (no warning): recursive delete of `node_modules`, `.next`, `dist`,
|
|
113
|
+
`build`, `__pycache__`, `.cache`, `.turbo`, `coverage`.
|
|
114
|
+
|
|
115
|
+
## Limits (be honest about these)
|
|
116
|
+
|
|
117
|
+
- This prevents *accidents*, it is not a security boundary. A Bash command like `sed -i` or
|
|
118
|
+
`> file` can still modify files outside the freeze boundary — only the Edit/Write tools are
|
|
119
|
+
gated. Careful screens command *text*; it does not sandbox execution.
|
|
120
|
+
- Hooks and the boundary are **session-scoped**. Warnings and blocks stop when the
|
|
121
|
+
conversation ends; the boundary state file is cleared by the Unfreeze step or ignored once
|
|
122
|
+
the hooks are no longer registered.
|
|
123
|
+
- Boundary matching resolves symlinks; if both the boundary and a target's parent directory
|
|
124
|
+
are unresolvable, a path may be over-blocked. Point the boundary at a directory that exists.
|
|
125
|
+
|
|
126
|
+
Network hook: N/A — a guardrail emits no shareable artifact.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# check-careful.sh — PreToolUse(Bash) hook for luckiest-coder-guard.
|
|
3
|
+
# Reads JSON from stdin, checks the Bash command for destructive patterns.
|
|
4
|
+
# Emits {"permissionDecision":"ask","message":"..."} to warn, or {} to allow.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
INPUT=$(cat)
|
|
8
|
+
|
|
9
|
+
# Extract the "command" field from tool_input. grep/sed handles the common case;
|
|
10
|
+
# fall back to python3 for commands containing escaped quotes.
|
|
11
|
+
CMD=$(printf '%s' "$INPUT" | grep -o '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*:[[:space:]]*"//;s/"$//' || true)
|
|
12
|
+
if [ -z "$CMD" ]; then
|
|
13
|
+
CMD=$(printf '%s' "$INPUT" | python3 -c 'import sys,json; print(json.loads(sys.stdin.read()).get("tool_input",{}).get("command",""))' 2>/dev/null || true)
|
|
14
|
+
fi
|
|
15
|
+
if [ -z "$CMD" ]; then echo '{}'; exit 0; fi
|
|
16
|
+
|
|
17
|
+
CMD_LOWER=$(printf '%s' "$CMD" | tr '[:upper:]' '[:lower:]')
|
|
18
|
+
|
|
19
|
+
# Safe exceptions: recursive delete of well-known build artifacts is allowed silently.
|
|
20
|
+
if printf '%s' "$CMD" | grep -qE 'rm\s+(-[a-zA-Z]*r[a-zA-Z]*\s+|--recursive\s+)' 2>/dev/null; then
|
|
21
|
+
SAFE_ONLY=true
|
|
22
|
+
RM_ARGS=$(printf '%s' "$CMD" | sed -E 's/.*rm[[:space:]]+(-[a-zA-Z]+[[:space:]]+)*//;s/--recursive[[:space:]]*//')
|
|
23
|
+
for target in $RM_ARGS; do
|
|
24
|
+
case "$target" in
|
|
25
|
+
*/node_modules|node_modules|*/\.next|\.next|*/dist|dist|*/__pycache__|__pycache__|*/\.cache|\.cache|*/build|build|*/\.turbo|\.turbo|*/coverage|coverage) ;;
|
|
26
|
+
-*) ;;
|
|
27
|
+
*) SAFE_ONLY=false; break ;;
|
|
28
|
+
esac
|
|
29
|
+
done
|
|
30
|
+
if [ "$SAFE_ONLY" = true ]; then echo '{}'; exit 0; fi
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
WARN=""
|
|
34
|
+
|
|
35
|
+
if printf '%s' "$CMD" | grep -qE 'rm\s+(-[a-zA-Z]*r|--recursive)' 2>/dev/null; then
|
|
36
|
+
WARN="Destructive: recursive delete (rm -r). This permanently removes files."
|
|
37
|
+
fi
|
|
38
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD_LOWER" | grep -qE 'drop\s+(table|database)' 2>/dev/null; then
|
|
39
|
+
WARN="Destructive: SQL DROP detected. This permanently deletes database objects."
|
|
40
|
+
fi
|
|
41
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD_LOWER" | grep -qE '\btruncate\b' 2>/dev/null; then
|
|
42
|
+
WARN="Destructive: SQL TRUNCATE detected. This deletes all rows from a table."
|
|
43
|
+
fi
|
|
44
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD" | grep -qE 'git\s+push\s+.*(-f\b|--force)' 2>/dev/null; then
|
|
45
|
+
WARN="Destructive: git force-push rewrites remote history. Other contributors may lose work."
|
|
46
|
+
fi
|
|
47
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD" | grep -qE 'git\s+reset\s+--hard' 2>/dev/null; then
|
|
48
|
+
WARN="Destructive: git reset --hard discards all uncommitted changes."
|
|
49
|
+
fi
|
|
50
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD" | grep -qE 'git\s+(checkout|restore)\s+\.' 2>/dev/null; then
|
|
51
|
+
WARN="Destructive: discards all uncommitted changes in the working tree."
|
|
52
|
+
fi
|
|
53
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD" | grep -qE 'kubectl\s+delete' 2>/dev/null; then
|
|
54
|
+
WARN="Destructive: kubectl delete removes Kubernetes resources. May impact production."
|
|
55
|
+
fi
|
|
56
|
+
if [ -z "$WARN" ] && printf '%s' "$CMD" | grep -qE 'docker\s+(rm\s+-f|system\s+prune)' 2>/dev/null; then
|
|
57
|
+
WARN="Destructive: Docker force-remove or prune. May delete running containers or cached images."
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -n "$WARN" ]; then
|
|
61
|
+
WARN_ESCAPED=$(printf '%s' "$WARN" | sed 's/"/\\"/g')
|
|
62
|
+
printf '{"permissionDecision":"ask","message":"[guard] %s"}\n' "$WARN_ESCAPED"
|
|
63
|
+
else
|
|
64
|
+
echo '{}'
|
|
65
|
+
fi
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# check-freeze.sh — PreToolUse(Edit|Write) hook for luckiest-coder-guard.
|
|
3
|
+
# Reads JSON from stdin, checks whether file_path is within the freeze boundary.
|
|
4
|
+
# Emits {"permissionDecision":"deny","message":"..."} to block, or {} to allow.
|
|
5
|
+
# No boundary file set → allows everything (this is "careful" mode).
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
INPUT=$(cat)
|
|
9
|
+
|
|
10
|
+
STATE_DIR="${CLAUDE_PLUGIN_DATA:-$HOME/.luckiest}"
|
|
11
|
+
FREEZE_FILE="$STATE_DIR/freeze-dir.txt"
|
|
12
|
+
|
|
13
|
+
if [ ! -f "$FREEZE_FILE" ]; then echo '{}'; exit 0; fi
|
|
14
|
+
|
|
15
|
+
FREEZE_DIR=$(tr -d '[:space:]' < "$FREEZE_FILE")
|
|
16
|
+
if [ -z "$FREEZE_DIR" ]; then echo '{}'; exit 0; fi
|
|
17
|
+
|
|
18
|
+
FILE_PATH=$(printf '%s' "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*:[[:space:]]*"//;s/"$//' || true)
|
|
19
|
+
if [ -z "$FILE_PATH" ]; then
|
|
20
|
+
FILE_PATH=$(printf '%s' "$INPUT" | python3 -c 'import sys,json; print(json.loads(sys.stdin.read()).get("tool_input",{}).get("file_path",""))' 2>/dev/null || true)
|
|
21
|
+
fi
|
|
22
|
+
if [ -z "$FILE_PATH" ]; then echo '{}'; exit 0; fi
|
|
23
|
+
|
|
24
|
+
case "$FILE_PATH" in
|
|
25
|
+
/*) ;;
|
|
26
|
+
*) FILE_PATH="$(pwd)/$FILE_PATH" ;;
|
|
27
|
+
esac
|
|
28
|
+
FILE_PATH=$(printf '%s' "$FILE_PATH" | sed 's|/\+|/|g;s|/$||')
|
|
29
|
+
|
|
30
|
+
# Resolve symlinks and .. (POSIX-portable, works on macOS).
|
|
31
|
+
_resolve_path() {
|
|
32
|
+
local _dir _base
|
|
33
|
+
_dir="$(dirname "$1")"
|
|
34
|
+
_base="$(basename "$1")"
|
|
35
|
+
_dir="$(cd "$_dir" 2>/dev/null && pwd -P || printf '%s' "$_dir")"
|
|
36
|
+
printf '%s/%s' "$_dir" "$_base"
|
|
37
|
+
}
|
|
38
|
+
FILE_PATH=$(_resolve_path "$FILE_PATH")
|
|
39
|
+
FREEZE_DIR=$(_resolve_path "$FREEZE_DIR")
|
|
40
|
+
|
|
41
|
+
case "$FILE_PATH" in
|
|
42
|
+
"${FREEZE_DIR}/"*|"${FREEZE_DIR}")
|
|
43
|
+
echo '{}'
|
|
44
|
+
;;
|
|
45
|
+
*)
|
|
46
|
+
printf '{"permissionDecision":"deny","message":"[guard] Blocked: %s is outside the freeze boundary (%s). Only edits within the frozen directory are allowed. Run the unfreeze step to clear it."}\n' "$FILE_PATH" "$FREEZE_DIR"
|
|
47
|
+
;;
|
|
48
|
+
esac
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Attribution
|
|
2
|
+
|
|
3
|
+
This skill is adapted from the "qa" and "qa-only" skills in gstack
|
|
4
|
+
(https://github.com/garrytan/gstack) by Garry Tan, used under the MIT License.
|
|
5
|
+
The `references/issue-taxonomy.md` and `references/qa-report-template.md` files are
|
|
6
|
+
carried over from the original with minor edits.
|
|
7
|
+
|
|
8
|
+
MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2026 Garry Tan
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Changelog — luckiest-coder-qa
|
|
2
|
+
|
|
3
|
+
## 1.1.0 — 2026-07-06
|
|
4
|
+
Skill updater pass: analytics integration.
|
|
5
|
+
|
|
6
|
+
### Analytics (report_usage)
|
|
7
|
+
- Updated `report_usage` call to `skill_version: "1.1.0"` and `check_updates`
|
|
8
|
+
`installedSemver: "1.1.0"`. The skill now reports usage to the Luckiest
|
|
9
|
+
telemetry pipeline on every run, making it visible on the admin Skill Usage
|
|
10
|
+
page (/owner/skill-usage).
|
|
11
|
+
|
|
12
|
+
## 1.0.0 — 2026-07-03
|
|
13
|
+
Rebranded and consolidated from gstack's `qa` + `qa-only` skills (MIT, Copyright (c) 2026
|
|
14
|
+
Garry Tan). Two source skills (~2,900 lines combined) distilled into one SKILL.md (~150
|
|
15
|
+
lines) plus two carried-over references. `report-only` folded in as a mode of the one skill
|
|
16
|
+
rather than a separate listing. Frontmatter `name`/`listing_id` set to `luckiest-coder-qa`;
|
|
17
|
+
Staying-current `check_updates` hook added.
|
|
18
|
+
|
|
19
|
+
### Security pass
|
|
20
|
+
- PASS — no red flags across the source files (no prompt injection, no credential access, no
|
|
21
|
+
exfiltration, no obfuscation). Note preserved: real passwords are redacted from reports and
|
|
22
|
+
never imported into tests.
|
|
23
|
+
|
|
24
|
+
### Best-practices pass
|
|
25
|
+
- Dropped ~800 lines of gstack-internal preamble per source (telemetry, gbrain, voice,
|
|
26
|
+
plan-mode, skill-routing boilerplate).
|
|
27
|
+
- Decoupled from gstack's proprietary `$B` browse binary and `gstack-learnings-search` /
|
|
28
|
+
`~/.gstack` artifact paths. The skill is now browser-tool-agnostic: it maps each browser
|
|
29
|
+
action (navigate, screenshot, snapshot, console, fill/click, viewport) to whatever the host
|
|
30
|
+
provides (browser MCP, `/browse`-style skill, or preview tools), and degrades to `curl`
|
|
31
|
+
status checks when no browser exists.
|
|
32
|
+
- Body under the ~500-line spec; the per-page checklist and severity taxonomy live in
|
|
33
|
+
`references/issue-taxonomy.md`, the report format in `references/qa-report-template.md`.
|
|
34
|
+
|
|
35
|
+
### Improve pass (/refract)
|
|
36
|
+
- Non-obvious bug fixes route through a `luckiest-coder-debugging` mindset for root cause
|
|
37
|
+
instead of gstack's `/investigate`.
|
|
38
|
+
- Kept the strongest safety rails intact: atomic one-commit-per-fix, mandatory regression
|
|
39
|
+
test on verified fixes, the WTF-likelihood self-regulation heuristic (>20% → stop), and the
|
|
40
|
+
50-fix hard cap — these are what stop an autonomous fix loop from running amok.
|
|
41
|
+
- Report-only mode given an explicit early-stop so it can never mutate code.
|
|
42
|
+
|
|
43
|
+
### Network hook (share-with-tribe)
|
|
44
|
+
- After a QA run that fixed bugs, offers once to call the Luckiest MCP `share_artifact` tool
|
|
45
|
+
with the health-score delta and fix count for the tribe leaderboard. Opt-in.
|
|
46
|
+
|
|
47
|
+
### Trend pass (/newsjack + /luckiest-trends)
|
|
48
|
+
- no actionable signal — internal QA-loop workflow; browser-QA mechanics are not news-driven,
|
|
49
|
+
so no dated signal was applied.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Garry Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|