@opendirectory.dev/skills 0.1.43 → 0.1.45

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 (32) hide show
  1. package/package.json +1 -1
  2. package/registry.json +16 -0
  3. package/skills/oss-launch-kit/.env.example +2 -0
  4. package/skills/oss-launch-kit/PRD.md +122 -0
  5. package/skills/oss-launch-kit/README.md +27 -0
  6. package/skills/oss-launch-kit/SKILL.md +33 -0
  7. package/skills/oss-launch-kit/TECHNICAL_DESIGN.md +187 -0
  8. package/skills/oss-launch-kit/evals/cli-cli.full.md +49 -0
  9. package/skills/oss-launch-kit/evals/evals.json +44 -0
  10. package/skills/oss-launch-kit/evals/octocat-hello-world.full.md +53 -0
  11. package/skills/oss-launch-kit/evals/pydantic-pydantic.full.md +152 -0
  12. package/skills/oss-launch-kit/evals/vercel-next-js.full.md +152 -0
  13. package/skills/oss-launch-kit/hero.png +0 -0
  14. package/skills/oss-launch-kit/references/channel_rules.md +9 -0
  15. package/skills/oss-launch-kit/references/launch_framework.md +10 -0
  16. package/skills/oss-launch-kit/references/output_template.md +3 -0
  17. package/skills/oss-launch-kit/scripts/__pycache__/build_product_brief.cpython-313.pyc +0 -0
  18. package/skills/oss-launch-kit/scripts/__pycache__/generate_assets.cpython-313.pyc +0 -0
  19. package/skills/oss-launch-kit/scripts/build_product_brief.py +335 -0
  20. package/skills/oss-launch-kit/scripts/fetch_repo_context.py +169 -0
  21. package/skills/oss-launch-kit/scripts/generate_assets.py +526 -0
  22. package/skills/oss-launch-kit/scripts/run.py +41 -0
  23. package/skills/oss-launch-kit/scripts/test_logic.py +99 -0
  24. package/skills/pricing-finder/.env.example +15 -0
  25. package/skills/pricing-finder/README.md +142 -0
  26. package/skills/pricing-finder/SKILL.md +748 -0
  27. package/skills/pricing-finder/evals/evals.json +124 -0
  28. package/skills/pricing-finder/references/extraction-guide.md +156 -0
  29. package/skills/pricing-finder/references/positioning-guide.md +114 -0
  30. package/skills/pricing-finder/references/pricing-models.md +113 -0
  31. package/skills/pricing-finder/requirements.txt +8 -0
  32. package/skills/pricing-finder/scripts/research.py +449 -0
@@ -0,0 +1,41 @@
1
+ """CLI entrypoint for oss-launch-kit.
2
+
3
+ This orchestrates GitHub repo fetching, brief building, and full launch-kit generation.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ from pathlib import Path
10
+
11
+ from build_product_brief import build_product_brief
12
+ from fetch_repo_context import fetch_repo_context
13
+ from generate_assets import render_full_launch_kit_markdown
14
+
15
+
16
+ def build_parser() -> argparse.ArgumentParser:
17
+ parser = argparse.ArgumentParser(description="Generate a coordinated OSS launch strategy and readiness report from a GitHub repo.")
18
+ parser.add_argument("--repo-url", required=True, help="Public GitHub repository URL")
19
+ parser.add_argument("--output", default="launch-kit.md", help="Output Markdown file path")
20
+ return parser
21
+
22
+
23
+ def run(repo_url: str) -> tuple[dict, dict, str]:
24
+ repo_context = fetch_repo_context(repo_url)
25
+ brief = build_product_brief(repo_context)
26
+ markdown = render_full_launch_kit_markdown(brief)
27
+ return repo_context, brief, markdown
28
+
29
+
30
+ def main() -> None:
31
+ parser = build_parser()
32
+ args = parser.parse_args()
33
+
34
+ _, _, markdown = run(args.repo_url)
35
+ output_path = Path(args.output)
36
+ output_path.write_text(markdown, encoding="utf-8")
37
+ print(f"Wrote {output_path}")
38
+
39
+
40
+ if __name__ == "__main__":
41
+ main()
@@ -0,0 +1,99 @@
1
+ import unittest
2
+ import sys
3
+ from pathlib import Path
4
+
5
+ # Add the scripts directory to sys.path
6
+ sys.path.append(str(Path(__file__).parent))
7
+
8
+ from build_product_brief import build_product_brief
9
+ from generate_assets import render_full_launch_kit_markdown
10
+
11
+ class TestOSSLaunchKitLogic(unittest.TestCase):
12
+ def test_low_readiness_handling(self):
13
+ # Mock repo context for a very weak repo
14
+ low_context = {
15
+ "name": "octocat/Hello-World",
16
+ "description": "My first repository on GitHub!",
17
+ "stars": 2,
18
+ "readme_text": "Hello World!",
19
+ "language": "HTML",
20
+ "license": None,
21
+ "confidence": "low"
22
+ }
23
+
24
+ brief = build_product_brief(low_context)
25
+ self.assertEqual(brief["launch_readiness"]["score"], "low")
26
+ self.assertTrue(len(brief["launch_readiness"]["fix_plan"]) > 0)
27
+
28
+ markdown = render_full_launch_kit_markdown(brief)
29
+
30
+ # Assertions for low readiness output
31
+ self.assertIn("Project Maturity**: LOW", markdown)
32
+ self.assertIn("> [!CAUTION]", markdown)
33
+ self.assertIn("This project is not launch-ready yet", markdown)
34
+ self.assertIn("## Launch Readiness Fix Plan", markdown)
35
+
36
+ # High friction sections and full checklist should be absent
37
+ self.assertNotIn("### [Show HN]", markdown)
38
+ self.assertNotIn("### [Product Hunt]", markdown)
39
+ self.assertNotIn("## Coordinated Launch Timeline", markdown)
40
+ self.assertNotIn("## Channel Strategy & Positioning", markdown)
41
+
42
+ def test_medium_readiness_handling(self):
43
+ # Mock repo context for a medium tool
44
+ medium_context = {
45
+ "full_name": "user/medium-tool",
46
+ "description": "A tool that does something useful",
47
+ "stars": 25,
48
+ "readme_text": "# Medium Tool\n\n## install\nnpm install medium-tool\n\n## usage\nmedium-tool --help\n\n## license\nMIT\n\n" + "Word " * 200, # > 1000 chars
49
+ "language": "JavaScript",
50
+ "license": "MIT",
51
+ "confidence": "medium"
52
+ }
53
+
54
+ brief = build_product_brief(medium_context)
55
+ self.assertEqual(brief["launch_readiness"]["score"], "medium")
56
+
57
+ markdown = render_full_launch_kit_markdown(brief)
58
+
59
+ # Assertions for medium readiness output
60
+ self.assertIn("Project Maturity**: MEDIUM", markdown)
61
+ self.assertIn("## Soft Launch Strategy", markdown)
62
+ self.assertIn("## Launch Readiness Fix Plan", markdown)
63
+ self.assertIn("## Coordinated Launch Timeline", markdown)
64
+ self.assertIn("Step 1: Soft Launch", markdown)
65
+ self.assertIn("## Suggested Skills (Post-Fix)", markdown)
66
+
67
+ # Should still have handoffs but in the Post-Fix section
68
+ self.assertIn("use `producthunt-launch-kit`", markdown)
69
+
70
+ def test_high_readiness_handling(self):
71
+ # Mock repo context for a strong tool
72
+ high_context = {
73
+ "full_name": "cli/cli",
74
+ "description": "GitHub’s official command line tool helps developers solve github workflow issues",
75
+ "stars": 35000,
76
+ "readme_text": "# GitHub CLI\n\n## Quickstart\nbrew install gh\n\n## Usage\ngh issue list\n\n## License\nMIT\n\n## Contributing\nSee CONTRIBUTING.md\n\n## Demo\nVisit https://cli.github.com for a demo.\n\n" + "Long description about why this tool is amazing. " * 50,
77
+ "language": "Go",
78
+ "license": "MIT",
79
+ "confidence": "high"
80
+ }
81
+
82
+ brief = build_product_brief(high_context)
83
+ self.assertEqual(brief["launch_readiness"]["score"], "high")
84
+
85
+ markdown = render_full_launch_kit_markdown(brief)
86
+
87
+ # Assertions for high readiness output
88
+ self.assertIn("Project Maturity**: HIGH", markdown)
89
+ self.assertIn("## Coordinated Launch Timeline", markdown)
90
+ self.assertIn("- [ ] Day 1: Show HN", markdown)
91
+ self.assertIn("## Channel Strategy & Positioning", markdown)
92
+ self.assertIn("### [Show HN] - Fit: HIGH", markdown)
93
+ # cli/cli is a tool so PH is low, which is fine
94
+ self.assertIn("### [Twitter/X]", markdown)
95
+ self.assertNotIn("> [!CAUTION]", markdown)
96
+ self.assertNotIn("## Soft Launch Strategy", markdown)
97
+
98
+ if __name__ == "__main__":
99
+ unittest.main()
@@ -0,0 +1,15 @@
1
+ # pricing-finder -- environment variables
2
+ # All keys are OPTIONAL. The skill runs for free without any keys.
3
+ # Install free dependencies first: pip install -r requirements.txt
4
+
5
+ # Optional: Tavily API key
6
+ # Upgrades web search quality over DuckDuckGo.
7
+ # Get it at: https://app.tavily.com
8
+ # Free tier: 1000 credits/month
9
+ # TAVILY_API_KEY=your_tavily_api_key_here
10
+
11
+ # Optional: Firecrawl API key
12
+ # Upgrades pricing page fetching for JS-heavy sites.
13
+ # Get it at: https://firecrawl.dev
14
+ # Free tier: 500 credits/month
15
+ # FIRECRAWL_API_KEY=your_firecrawl_api_key_here
@@ -0,0 +1,142 @@
1
+ # pricing-finder
2
+
3
+ Tell it what your product is (URL or description). It finds 5 competitors globally, fetches their actual pricing pages, and returns a complete pricing intelligence report: the dominant pricing model in your space, a benchmark price table, feature gate analysis, a competitive positioning map, and a concrete recommended pricing strategy for your product.
4
+
5
+ **Zero API keys required.** Runs entirely on free pip dependencies.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npx "@opendirectory.dev/skills" install pricing-finder --target claude
11
+ ```
12
+
13
+ ### Video Tutorial
14
+ Watch this quick video to see how it's done:
15
+
16
+ https://github.com/user-attachments/assets/ee98a1b5-ebc4-452f-bbfb-c434f2935067
17
+
18
+ ### Step 1: Download the skill from GitHub
19
+ 1. Copy the URL of this specific skill folder from your browser's address bar.
20
+ 2. Go to [download-directory.github.io](https://download-directory.github.io/).
21
+ 3. Paste the URL and click **Enter** to download.
22
+
23
+ ### Step 2: Install the Skill in Claude
24
+ 1. Open your **Claude desktop app**.
25
+ 2. Go to the sidebar on the left side and click on the **Customize** section.
26
+ 3. Click on the **Skills** tab, then click on the **+** (plus) icon button to create a new skill.
27
+ 4. Choose the option to **Upload a skill**, and drag and drop the `.zip` file (or you can extract it and drop the folder, both work).
28
+
29
+ > **Note:** For some skills (like `position-me`), the `SKILL.md` file might be located inside a subfolder. Always make sure you are uploading the specific folder that contains the `SKILL.md` file!
30
+
31
+ ## Setup
32
+
33
+ ```bash
34
+ # Install free Python dependencies (required)
35
+ pip install ddgs requests beautifulsoup4 html2text
36
+ ```
37
+
38
+ No API keys needed. Optionally add keys to `.env` for better quality:
39
+
40
+ ```bash
41
+ cp .env.example .env
42
+ # Uncomment TAVILY_API_KEY or FIRECRAWL_API_KEY if you have them
43
+ ```
44
+
45
+ ## Usage
46
+
47
+ ```
48
+ Find pricing benchmarks for my startup: https://yourstartup.com
49
+ ```
50
+
51
+ Or paste a description if you don't have a live URL:
52
+
53
+ ```
54
+ Find pricing benchmarks. We build [what you do] for [who]. [Stage], [geography].
55
+ ```
56
+
57
+ ## What It Does
58
+
59
+ 1. Fetches your product page to understand what you're building
60
+ 2. Analyzes your product: category, differentiators, ICP
61
+ 3. Discovers 5 competitors in your space via DuckDuckGo search
62
+ 4. **Asks you to confirm the competitor list** before fetching any data
63
+ 5. Fetches each competitor's pricing page (3-tier fallback: direct fetch → Google cache → search snippet)
64
+ 6. Extracts structured pricing data: tiers, prices, limits, feature gates
65
+ 7. Analyzes patterns across all 5 competitors
66
+ 8. Maps competitive positioning and identifies underserved gaps
67
+ 9. Recommends a concrete pricing strategy for your product
68
+
69
+ ## Output
70
+
71
+ A pricing intel report saved to `docs/pricing-intel/[product-slug]-[date].md` containing:
72
+
73
+ - **Pricing Model Analysis** -- dominant model in your space (per-seat / flat-rate / usage-based / freemium) and why
74
+ - **Price Point Benchmark Table** -- every competitor's tiers with exact prices, free tier, free trial
75
+ - **Market ranges** -- entry tier median, mid tier median, enterprise floor
76
+ - **Feature Gate Analysis** -- what's always free, what's always paid, what varies
77
+ - **Competitive Positioning Map** -- who owns cheap+simple, middle market, enterprise, and where the gap is
78
+ - **Recommended Pricing Strategy** -- model, entry price, mid price, top price, free tier decision, annual discount, what to gate behind paid
79
+
80
+ ## Cost
81
+
82
+ **$0.00.** Entirely free using pip dependencies.
83
+
84
+ Optional API upgrades:
85
+ - Tavily API (free tier: 1000 credits/month) -- better search results
86
+ - Firecrawl API (free tier: 500 credits/month) -- better JS-heavy page rendering
87
+
88
+ ## Zero-Hallucination Policy
89
+
90
+ Every price in the output traces to fetched pricing page content or a search snippet. "Contact Sales" is recorded exactly -- never estimated. Fields that could not be sourced are labeled "not found in page data." Low-quality data (search snippets) is explicitly flagged so you know which competitors to verify manually.
91
+
92
+ ## How Pricing Page Fetching Works
93
+
94
+ The script tries three methods per competitor, in order:
95
+
96
+ 1. **Direct fetch** (`requests` + `beautifulsoup4` + `html2text`) -- works for most pricing pages since companies make them SEO-friendly and server-rendered
97
+ 2. **Google cache** -- fallback for recently-changed pages or soft blocks
98
+ 3. **Search snippet** -- last resort; marks data quality as "low" in the output
99
+
100
+ If you have a Firecrawl API key, it replaces step 1 with a fully JS-rendered fetch.
101
+
102
+ ## Project Structure
103
+
104
+ ```
105
+ pricing-finder/
106
+ ├── SKILL.md -- 10-step workflow for Claude Code
107
+ ├── README.md -- this file
108
+ ├── .env.example -- optional API key template
109
+ ├── requirements.txt -- free pip dependencies
110
+ ├── scripts/
111
+ │ └── research.py -- two-phase data collector
112
+ ├── evals/
113
+ │ └── evals.json -- 5 test cases
114
+ └── references/
115
+ ├── pricing-models.md -- per-seat, flat, usage, freemium definitions + signals
116
+ ├── extraction-guide.md -- how to read a pricing page
117
+ └── positioning-guide.md -- how to map competitors and find gaps
118
+ ```
119
+
120
+ ## Standalone Script Usage
121
+
122
+ ```bash
123
+ # Phase 1: competitor discovery
124
+ python3 scripts/research.py \
125
+ --phase discover \
126
+ --product-analysis /tmp/pf-product-analysis.json \
127
+ --output /tmp/pf-competitors-raw.json
128
+
129
+ # Phase 2: fetch pricing pages
130
+ python3 scripts/research.py \
131
+ --phase fetch-pricing \
132
+ --competitors /tmp/pf-competitors-confirmed.json \
133
+ --output /tmp/pf-pricing-raw.json
134
+
135
+ # With optional API key upgrades
136
+ python3 scripts/research.py \
137
+ --phase fetch-pricing \
138
+ --competitors /tmp/pf-competitors-confirmed.json \
139
+ --firecrawl-key "$FIRECRAWL_API_KEY" \
140
+ --tavily-key "$TAVILY_API_KEY" \
141
+ --output /tmp/pf-pricing-raw.json
142
+ ```