Communitygithub.com

Varnan-Tech/opendirectory

輸入新創產品的 URL 或描述,自動偵測產業與募資階段,找出 5 家已獲融資的競爭對手,追查其投資者(Track A),並搜尋針對該領域發表投資主題的創投公司(Track B),最後產出一份附有來源排名、深度分析與聯繫切入點的投資人名單。

opendirectory 是什麼?

此技能專為需要尋找投資人的創業者、研究特定領域投資風向的分析師,以及想驗證投資人-市場匹配度的團隊所設計。它會先透過產品 URL 或描述,利用 Firecrawl 或 Tavily 擷取頁面內容,並以正則表達式分析 CTA 按鈕與文字,推斷出最準確的募資階段(pre-seed 到 series-b)。接著,它會執行兩條研究路徑:Track A 搜尋 5 家已獲融資的競爭對手,找出實際投資他們的創投公司;Track B 則搜尋公開發表該領域投資主題的創投。最後,依據搜尋結果產出附有來源、排名與產品差異化聯繫切入點的投資人名單。 此技能的核心原則是「零幻覺政策」—所有事實,從競爭對手名稱、創投基金名稱,到投資金額、階段專注領域,都必須直接來自 Tavily 搜尋結果或產品頁面,絕不依賴模型訓練知識。若搜尋資料不足,會明確標示「搜尋資料中未找到」。此外,它內建一個包含 25 家經驗證創投基金的精選資料集,可用於預先比對產品分類標籤,在不消耗 Tavily 額度的情況下提供初步匹配建議。支援的平台包括 Claude Code 等可執行 shell 命令與 Tavily API 的 AI 代理環境。

相容平台✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/vc-finder

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

創投搜尋器 (VC Finder)

輸入產品 URL 或描述。自動偵測產業與階段。找出 5 家已獲融資的競爭對手。執行兩條研究路徑:追查投資這些競爭對手的創投(Track A),以及搜尋針對此領域發表投資主題的創投(Track B)。產出附有來源、排名與聯繫切入點的投資人名單。


零幻覺政策: 輸出中的每一項事實都必須能追溯到特定的 Tavily 搜尋結果或所擷取的產品頁面。這包括:

  • 競爭對手公司名稱:必須出現在 Tavily 搜尋結果中,而非 AI 訓練知識
  • 創投基金名稱:必須完全一致地出現在 Tavily 搜尋結果中
  • 投資金額、階段專注領域、投資組合公司:必須來自搜尋片段,而非 AI 知識
  • 基金概覽與主題摘要:僅從搜尋片段中提取。若某細節不在搜尋資料中,請寫「搜尋資料中未找到」——切勿從訓練知識中填補。

常見錯誤

代理人可能會想要這麼做...為什麼這是錯的
因為 a16z 或 Sequoia 很有名就加入名單有名但沒有證據就是雜訊。只有在 Tavily 針對此特定產品的搜尋結果中出現的創投才能列入。隨意提及只是浪費創辦人的時間。
從訓練知識中生成競爭對手公司競爭對手必須來自 Tavily 搜尋結果(步驟 6)。AI 對公司的知識並非證據——從記憶推測出的公司可能會有錯誤的募資狀態,或者根本不是真正的競爭對手。
當所有 5 個 Track A 搜尋都回傳 0 個結果時仍繼續進行0 個 Track A 結果意味著競爭對手選擇錯誤或過於冷門。請停止,以更廣泛的搜尋查詢重新執行步驟 6,然後再試一次。
未引用文章或貼文就列入 Track B 的創投沒有來源的主題與幻覺無異。創辦人無法驗證,名單也將失去所有可信度。
從訓練知識中填補基金概覽基金概覽必須僅來自 Tavily 片段文字。若片段中未描述該基金,請寫「搜尋資料中未找到」。
從網站美學風格來偵測階段階段必須來自步驟 4 中偵測到的特定 CTA 訊號。
撰寫籠統的聯繫切入點每個聯繫切入點都必須指名此特定產品的差異化優勢,以及搜尋資料中特定的創投組合訊號或主題引用。
當使用者有提供描述時就跳過抓取 URL務必抓取 URL。實際的網頁通常會顯示出使用者描述中未提及的階段訊號。

步驟 1:環境設定檢查

echo "TAVILY_API_KEY:    ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-not set, Tavily extract will be used as fallback}"

若缺少 TAVILY_API_KEY: 停止。告訴使用者:「需要 TAVILY_API_KEY 才能進行創投投資與主題研究。此項沒有替代方案。請到 app.tavily.com 取得——免費方案每月 1000 點數(約 125 次完整執行)。將其加入您的 .env 檔案。」

若只有 FIRECRAWL_API_KEY 缺少: 繼續執行(不顯示錯誤)。將使用 Tavily extract 作為 URL 擷取的回退方案。


步驟 2:取得輸入資料

你需要:

  • 產品 URL(必要,除非使用者直接貼上產品描述)
  • 可選:目標階段提示(pre-seed、seed、series-a、series-b)——若有提供則直接使用,跳過階段偵測
  • 可選:地理偏好(US、Europe、global)——若未指定,預設為 US

若使用者只提供貼上的描述(沒有 URL): 跳過步驟 3-4。直接以貼上的文字作為 product_content 進入步驟 5。將 stage_source 設為 user_description。

若沒有提供 URL 也沒有描述: 詢問:「您的產品或新創公司的 URL 是什麼?或者,請貼上簡短的描述:它做什麼、目標對象是誰、以及您目前的階段(pre-seed、seed、Series A)。」

為輸出檔案名稱,從 URL 推導產品縮寫:

PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_HERE'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")

步驟 3:擷取產品頁面

主要方法:Firecrawl(若 FIRECRAWL_API_KEY 已設定)

curl -s -X POST https://api.firecrawl.dev/v1/scrape \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \
  | python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'擷取到: {len(content)} 字元')
open('/tmp/vc-product-raw.md', 'w').write(content)
"

回退方案:Tavily extract(若 FIRECRAWL_API_KEY 未設定)

curl -s -X POST https://api.tavily.com/extract \
  -H "Content-Type: application/json" \
  -d "{\"api_key\": \"$TAVILY_API_KEY\", \"urls\": [\"URL_HERE\"]}" \
  | python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('results', [{}])[0].get('raw_content', '')
print(f'透過 Tavily extract 擷取: {len(content)} 字元')
open('/tmp/vc-product-raw.md', 'w').write(content)
"

步驟層級的檢查點:

python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
    print('錯誤:頁面回傳少於 200 字元。')
else:
    print(f'內容檢查通過: {len(content)} 字元')
"

若內容少於 200 字元: 停止擷取。告訴使用者:「產品頁面回傳了無法讀取的內容。這通常表示網站是 JavaScript 渲染的,需要使用瀏覽器。請直接貼上您的產品描述:它做什麼、目標對象是誰、以及您目前的階段。」

以貼上的描述作為 product_content 繼續進行步驟 5。


步驟 4:在本機偵測階段訊號(無需 API)

在分析步驟之前,使用正則表達式解析已擷取的 markdown 內容。

python3 << 'PYEOF'
import re, json

content = open('/tmp/vc-product-raw.md').read().lower()
stage_signals = []

# 等待清單或 Beta 版 CTA
if re.search(r'join\s+(the\s+)?waitlist|sign\s+up\s+for\s+beta|early\s+access|request\s+(an?\s+)?invite|get\s+notified', content):
    stage_signals.append({'signal': '等待清單或 Beta 版 CTA', 'stage_hint': 'pre-seed'})

# 免費試用或 Demo CTA
if re.search(r'start\s+(your\s+)?free\s+trial|try\s+(it\s+)?for\s+free|request\s+a?\s+demo|book\s+a?\s+demo|schedule\s+a?\s+demo', content):
    stage_signals.append({'signal': '免費試用或 Demo CTA', 'stage_hint': 'seed'})

# 定價或銷售 CTA
if re.search(r'contact\s+sales|talk\s+to\s+(our\s+)?sales|see\s+pricing|view\s+pricing|plans\s+and\s+pricing', content):
    stage_signals.append({'signal': '定價或銷售 CTA', 'stage_hint': 'series-a'})
if re.search(r'case\s+stud(y|ies)|customer\s+stor(y|ies)|trusted\s+by\s+[\d,]+|used\s+by\s+[\d,]+', content):
    stage_signals.append({'signal': '案例研究或客戶數量', 'stage_hint': 'series-a'})

# 企業方案或徵才
if re.search(r'enterprise\s+(plan|pricing|tier)|we.?re\s+hiring|join\s+our\s+team|open\s+positions', content):
    stage_signals.append({'signal': '企業方案或職缺', 'stage_hint': 'series-a-or-b'})

# 募資公告
funding_match = re.search(
    r'raised\s+\$[\d,.]+\s*[mk]?|series\s+[abc]\s+round|seed\s+round|(\$[\d,.]+\s*[mk]?\s+(?:seed|series\s+[abc]))',
    content
)
if funding_match:
    stage_signals.append({'signal': f'募資文字: {funding_match.group(0).strip()}', 'stage_hint': 'announced'})

# 決定主導階段
if not stage_signals:
    dominant = 'unknown'
elif any(s['stage_hint'] == 'announced' for s in stage_signals):
    dominant = 'announced'
elif any(s['stage_hint'] == 'series-a-or-b' for s in stage_signals):
    dominant = 'series-a'
elif any(s['stage_hint'] == 'series-a' for s in stage_signals):
    dominant = 'series-a'
elif any(s['stage_hint'] == 'seed' for s in stage_signals):
    dominant = 'seed'
else:
    dominant = 'pre-seed'

confidence = 'high' if len(stage_signals) >= 2 else ('medium' if len(stage_signals) == 1 else 'low')

result = {'signals': stage_signals, 'dominant_stage': dominant, 'confidence': confidence}
json.dump(result, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'階段: {dominant}({confidence} 可信度)從 {len(stage_signals)} 個訊號中偵測')
for s in stage_signals:
    print(f'  - {s["signal"]} -> {s["stage_hint"]}')
PYEOF

步驟 5:產品分析(分類、階段、ICP)

列印產品內容與階段訊號:

python3 -c "
import json
content = open('/tmp/vc-product-raw.md').read()[:6000]
signals = json.load(open('/tmp/vc-stage-signals.json'))
print('=== 產品頁面(前 6000 字元)===')
print(content)
print()
print('=== 偵測到的階段訊號 ===')
print(json.dumps(signals, indent=2))
"

AI 指示: 分析以上產品頁面內容。僅生成分類、ICP 與階段分類——尚未生成競爭對手公司(此動作將在步驟 6 透過即時搜尋進行)。

寫入 /tmp/vc-product-analysis.json:

  • product_name:來自頁面
  • one_line_description:它做什麼、為誰而做、核心價值主張。少於 20 字。無行銷用語。
  • industry_taxonomy:l1(頂層:fintech / healthtech / developer tools / consumer / 等)、l2(領域:sales technology / logistics software / 等)、l3(特定利基:outbound prospecting / last-mile routing / 等)。僅使用「technology」或「software」這類模糊標籤是不被接受的。
  • icp:buyer_persona(職稱)、company_type、company_size
  • detected_stage:pre-seed / seed / series-a / series-b / unknown
  • stage_confidence:high / medium / low
  • stage_evidence:一句話,確切引用頁面上哪個 CTA 或文字導致此判斷。若未知,請寫「未找到明確訊號」。
  • geography_bias:US / Europe / global / unclear
  • comparable_companies:保留為空陣列 []——將在步驟 6 中填入
python3 << 'PYEOF'
import json

analysis = {
    # 根據上述分析填入
    "comparable_companies": []
}

json.dump(analysis, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('產品分析已寫入。')
PYEOF

驗證:

python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('產品:', a['product_name'])
print('產業:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('階段:', a['detected_stage'], '(' + a['stage_confidence'] + ' 可信度)')
"

步驟 5b:針對已驗證基金資料集進行預先比對

將產品分類與一個包含 25 家已驗證創投基金的資料集(來源為基金官網)進行比對。可產生零幻覺的基金匹配結果以及用於 Track A 的種子級競爭對手參考——不消耗任何 Tavily 點數。

為標籤對應列印產品分析:

python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('分類:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('階段:', a['detected_stage'])
print('地理:', a['geography_bias'])
"

AI 指示: 將產品分類對應到基金資料集中使用的標準標籤。可用標籤: DevTools, Infrastructure, Open Source, B2B SaaS, AI, Data, FinTech, HealthTech, Enterprise, Consumer, Marketplaces, E-commerce, Crypto, DeepTech, Cybersecurity, Generalist

選擇 2-4 個描述此產品的標籤。將 detected_stage 對應為:Pre-seed、Seed、Series A 或 Growth。將 geography_bias 對應為:US、Europe、India 或 Global。

寫入產品背景資訊:

python3 << 'PYEOF'
import json

# 根據上述分類分析填入
context = {
    "extracted_tags": ["TagA", "TagB"],  # 從上方清單中選擇 2-4 個標籤
    "stage_hint": "Seed",               # Pre-seed / Seed / Series A / Growth
    "geography_hint": "US"              # US / Europe / India / Global
}
json.dump(context, open('/tmp/vc-product-context.json', 'w'), indent=2)
print('產品背景:', context)
PYEOF

針對嵌入式精選資料集執行評分:

python3 << 'PYEOF'
import json

context = json.load(open('/tmp/vc-product-context.json'))

VC_FUNDS = [
  {"fund_name":"Y Combinator","thesis":"We provide seed funding for startups. We invest in deeply technical teams building massive companies across all domains.","check_size":"$500k","stage_focus":["Pre-seed","Seed"],"industry_tags":["Generalist","B2B SaaS","DevTools","AI"],"geography_focus":["Global"],"notable_portfolio":["Stripe","Airbnb","GitLab"],"website":"https://www.ycombinator.com"},
  {"fund_name":"boldstart ventures","thesis":"Day one partner for developer first, crypto, and SaaS founders. We love deeply technical founders solving hard infrastructure problems.","check_size":"$1M - $3M","stage_focus":["Pre-seed","Seed"],"industry_tags":["DevTools","Infrastructure","Crypto"],"geography_focus":["Global","US"],"notable_portfolio":["Snyk","Blockdaemon","Superhuman"],"website":"https://boldstart.vc"},
  {"fund_name":"Heavybit","thesis":"The leading investor in developer-first startups. We help technical founders launch, gain traction, and build enterprise-ready companies.","check_size":"$1M - $5M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","Open Source"],"geography_focus":["Global","US"],"notable_portfolio":["PagerDuty","Sanity","Netlify"],"website":"https://www.heavybit.com"},
  {"fund_name":"Amplify Partners","thesis":"We invest in technical founders building the next generation of IT infrastructure, developer tools, and data platforms.","check_size":"$2M - $8M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","AI","Data"],"geography_focus":["US"],"notable_portfolio":["Datadog","OCTO","dbt Labs"],"website":"https://www.amplifypartners.com"},
  {"fund_name":"OSS Capital","thesis":"We exclusively back early-stage founders building Commercial Open Source Software (COSS) companies.","check_size":"$500k - $2M","stage_focus":["Pre-seed","Seed","Series A"],"industry_tags":["Open Source","DevTools"],"geography_focus":["Global"],"notable_portfolio":["Cal.com","Appsmith","Hoppscotch"],"website":"https://oss.capital"}
]

# 針對產品背景對每個基金進行評分
scored = []
for fund in VC_FUNDS:
    score = 0
    # 產業標籤重疊
    overlap = set(fund["industry_tags"]) & set(context["extracted_tags"])
    score += len(overlap) * 3
    # 階段匹配
    if context["stage_hint"] in fund["stage_focus"]:
        score += 2
    # 地理匹配
    if context["geography_hint"] in fund["geography_focus"] or "Global" in fund["geography_focus"]:
        score += 1
    # 一般性基金加分較少
    if "Generalist" in fund["industry_tags"] and len(overlap) < 2:
        score -= 1
    scored.append((score, fund))

scored.sort(reverse=True, key=lambda x: x[0])

if scored:
    top_score = scored[0][0]
    if top_score >= 3:
        matches = [f for s, f in scored if s >= 3]
    else:
        matches = []
else:
    matches = []

result = {
    "matched_funds": [m["fund_name"] for m in matches],
    "scored_funds": [{"fund": m["fund_name"], "score": s} for s, m in scored],
    "match_quality": "high" if len(matches) >= 2 else ("medium" if len(matches) == 1 else "none")
}

json.dump(result, open('/tmp/vc-curated-matches.json', 'w'), indent=2)
print(f"精選匹配結果: {result['match_quality']}")
for s, fund in scored:
    print(f"  {fund['fund_name']}: {s} 分")
if matches:
    print(f"\n高品質匹配 ({len(matches)}):")
    for fund in matches:
        print(f"  - {fund['fund_name']}")
PYEOF

步驟 6:競爭對手研究(Tavily 搜尋)

使用 Tavily 的 search API 來找出已獲融資的競爭對手。請勿使用可能已存在於分析檔案中的對手——所有結果必須來自本次即時搜尋。

TAVILY_API_KEY="$TAVILY_API_KEY"
INDUSTRY_QUERY=$(python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
query = a.get('industry_taxonomy', {}).get('l2', '') or a.get('industry_taxonomy', {}).get('l1', '')
print(query)
")

curl -s -X POST https://api.tavily.com/search \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "'"$TAVILY_API_KEY"'",
    "query": "funded startups in '"$INDUSTRY_QUERY"'",
    "search_depth": "advanced",
    "max_results": 10,
    "include_answer": false
  }' \
  | python3 -c "
import sys, json
d = json.load(sys.stdin)
results = d.get('results', [])
print(f'找到 {len(results)} 個搜尋結果')
for i, r in enumerate(results):
    print(f'  {i+1}. {r["title"]} ({r["url"]})')
    print(f'     {r["content"][:200]}')
json.dump(results, open('/tmp/vc-tavily-competitors.json', 'w'), indent=2)
"

AI 指示: 分析以上 Tavily 搜尋結果。選出 5 家融資金額最高的競爭對手。請務必真實——如果結果沒有包含足夠的已融資公司,請回報較少的數量。

對於每個競爭對手,請寫下列資訊:

  • name:公司名稱
  • description:一句話摘要
  • estimated_funding:估計募資金額與輪次
  • source_url:Tavily 搜尋結果中提及該公司的 URL
python3 << 'PYEOF'
import json

competitors = [
    # 從 Tavily 結果中填入 3-5 家競爭對手
    # 每項都必須有 source_url,對應於 Tavily 結果中的 URL
]

json.dump(competitors, open('/tmp/vc-competitors.json', 'w'), indent=2)
print(f'已記錄 {len(competitors)} 家競爭對手')
PYEOF

更新產品分析中的競爭對手陣列:

python3 << 'PYEOF'
import json

a = json.load(open('/tmp/vc-product-analysis.json'))
c = json.load(open('/tmp/vc-competitors.json'))
a['comparable_companies'] = [comp['name'] for comp in c]
json.dump(a, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('分析已更新競爭對手。')
for comp in c:
    print(f'  - {comp["name"]}: {comp["description"]} ({comp["source_url"]})')
PYEOF

步驟 7:追蹤 A——競爭對手投資者研究(Tavily 搜尋)

對於每個競爭對手,搜尋其投資者。

TAVILY_API_KEY="$TAVILY_API_KEY"
python3 << 'PYEOF'
import json, subprocess, sys

competitors = json.load(open('/tmp/vc-competitors.json'))
track_a_results = []

for comp in competitors[:5]:
    name = comp['name']
    print(f'\n--- 正在搜尋 {name} 的投資者 ---')
    
    query = f"{name} funding round investors"
    result = subprocess.run([
        'curl', '-s', '-X', 'POST', 'https://api.tavily.com/search',
        '-H', 'Content-Type: application/json',
        '-d', json.dumps({
            'api_key': "$TAVILY_API_KEY",
            'query': query,
            'search_depth': 'advanced',
            'max_results': 5
        })
    ], capture_output=True, text=True)
    
    try:
        data = json.loads(result.stdout)
        results = data.get('results', [])
        print(f'找到 {len(results)} 個 {name} 的結果')
        for r in results:
            print(f'  {r["title"]} — {r["url"]}')
        track_a_results.append({
            'company': name,
            'results': results
        })
    except:
        print(f'警告:{name} 的搜尋失敗')
        track_a_results.append({
            'company': name,
            'results': []
        })

json.dump(track_a_results, open('/tmp/vc-track-a-investors.json', 'w'), indent=2)
print(f'\nTrack A 完成:已處理 {len(track_a_results)} 家競爭對手')
PYEOF

步驟 8:追蹤 B——創投主題搜尋(Tavily 搜尋)

搜尋針對此產品領域發表過投資主題的創投。

TAVILY_API_KEY="$TAVILY_API_KEY"
INDUSTRY_L2=$(python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print(a.get('industry_taxonomy', {}).get('l2', 'technology'))
")

curl -s -X POST https://api.tavily.com/search \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "'"$TAVILY_API_KEY"'",
    "query": "venture capital investment thesis '"$INDUSTRY_L2"'",
    "search_depth": "advanced",
    "max_results": 10,
    "include_answer": false
  }' \
  | python3 -c "
import sys, json
d = json.load(sys.stdin)
results = d.get('results', [])
print(f'Track B 搜尋找到 {len(results)} 個結果')
for i, r in enumerate(results):
    print(f'  {i+1}. {r["title"]} ({r["url"]})')
    print(f'     {r["content"][:200]}')
json.dump(results, open('/tmp/vc-track-b-theses.json', 'w'), indent=2)
"

步驟 9:整合與排序

結合精選匹配結果(步驟 5b)、Track A 投資者資料(步驟 7)和 Track B 創投主題(步驟 8),產生最終排序名單。

python3 << 'PYEOF'
import json

curated = json.load(open('/tmp/vc-curated-matches.json'))
track_a = json.load(open('/tmp/vc-track-a-investors.json'))
track_b = json.load(open('/tmp/vc-track-b-theses.json'))

final_list = []

# 來自精選資料集:已驗證的基金
for fund_entry in curated.get('scored_funds', []):
    final_list.append({
        'fund_name': fund_entry['fund'],
        'source': 'curated_dataset',
        'match_score': fund_entry['score'],
        'confidence': 'high' if fund_entry['score'] >= 5 else 'medium'
    })

# 來自 Track A:競爭對手投資者
for comp_entry in track_a:
    for result in comp_entry.get('results', []):
        # 從搜尋片段中提取創投名稱
        content = result.get('content', '')
        # AI 指示:在內容中尋找創投名稱
        final_list.append({
            'fund_name': 'AI_EXTRACT_FROM_RESULT',
            'source': 'track_a',
            'evidence': {
                'company': comp_entry['company'],
                'snippet': content[:300]
            },
            'confidence': 'medium'
        })

# 來自 Track B:主題
for result in track_b:
    final_list.append({
        'fund_name': 'AI_EXTRACT_FROM_RESULT',
        'source': 'track_b',
        'evidence': {
            'title': result.get('title', ''),
            'url': result.get('url', ''),
            'snippet': result.get('content', '')[:300]
        },
        'confidence': 'medium'
    })

# 去重並排序(AI 指示:根據 match_score 和 confidence 排序)
json.dump(final_list, open('/tmp/vc-final-investors.json', 'w'), indent=2)
print(f'最終名單包含 {len(final_list)} 筆紀錄')
PYEOF

步驟 10:產生最終報告

撰寫包含來源、排名與聯絡切入點的最終投資人名單。產出一個結構化的檔案。

python3 << 'PYEOF'
import json

a = json.load(open('/tmp/vc-product-analysis.json'))
final = json.load(open('/tmp/vc-final-investors.json'))

def create_visual_report(product_analysis, investor_list):
    """使用純文字格式建立視覺化報告"""
    
    report = f"""
╔══════════════════════════════════════════════════════════════╗
║                   創投投資者研究報告                         ║
╚══════════════════════════════════════════════════════════════╝

產品:{product_analysis.get('product_name', '未知')}
{product_analysis.get('one_line_description', '')}
產業:{product_analysis.get('industry_taxonomy', {}).get('l1', 'N/A')} > {product_analysis.get('industry_taxonomy', {}).get('l2', 'N/A')} > {product_analysis.get('industry_taxonomy', {}).get('l3', 'N/A')}
階段:{product_analysis.get('detected_stage', '未知')}({product_analysis.get('stage_confidence', 'N/A')} 可信度)
證據:{product_analysis.get('stage_evidence', '未找到明確訊號')}

"""
    
    if investor_list:
        report += "排名投資人名單:\n" + "─" * 50 + "\n\n"
        for i, inv in enumerate(investor_list, 1):
            name = inv.get('fund_name', '未知')
            source = inv.get('source', '未知')
            confidence = inv.get('confidence', '低')
            score = inv.get('match_score', 'N/A')
            
            report += f"{i}. {name}\n"
            report += f"   來源:{source} | 可信度:{confidence} | 匹配分數:{score}\n"
            
            if source == 'track_a' and 'evidence' in inv:
                report += f"   競爭對手:{inv['evidence'].get('company', 'N/A')}\n"
            elif source == 'track_b' and 'evidence' in inv:
                report += f"   主題文章:{inv['evidence'].get('title', 'N/A')}\n"
                report += f"   網址:{inv['evidence'].get('url', 'N/A')}\n"
            report += "\n"
    else:
        report += "⚠️ 未找到投資人。\n"
        report += "建議:\n"
        report += "  - 重新檢查產業分類標籤是否正確\n"
        report += "  - 嘗試使用更具體的關鍵字手動搜尋\n"
        report += "  - 考慮在不同地理區域搜尋\n"
    
    return report

report = create_visual_report(a, final)
print(report)

# 同時儲存至檔案
with open('/tmp/vc-investor-report.md', 'w') as f:
    f.write(report)
print(f"\n報告已儲存至 /tmp/vc-investor-report.md")
PYEOF

步驟 11:深度分析與聯絡切入點

為前 3 名投資人撰寫深度分析與產品專屬的聯絡切入點。

python3 << 'PYEOF'
import json

a = json.load(open('/tmp/vc-product-analysis.json'))
final = json.load(open('/tmp/vc-final-investors.json'))

# 取前 3 名
for i, inv in enumerate(final[:3], 1):
    print(f"\n╔═══ {i}. {inv.get('fund_name', '未知')} 深度分析 ═══╗")
    print(f"""
基金名稱:{inv.get('fund_name', '未知')}
來源:{inv.get('source', '未知')}
可信度:{inv.get('confidence', '低')}

基金概覽:
[待從 Tavily 片段中填入]

投資主題:
[待從 Tavily 片段中填入]

投資組合相似性:
[待從 Tavily 片段中填入]

此產品的聯絡切入點:
根據產品差異化優勢 [產品名稱] 與此基金的投資主題 [主題],一個有力的切入點可能是:
"[自訂的、具體的切入點]"

行動項目:
- [ ] 在 LinkedIn 上追蹤合夥人
- [ ] 透過電子郵件聯繫,提及共同投資者
- [ ] 申請他們的加速器計畫或公開申請表單""")
    print("╚" + "═" * 50)
PYEOF

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Varnan-Tech/opendirectory

Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.

Varnan-Tech/opendirectory

World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.

Varnan-Tech/opendirectory

Use when the user asks to generate or update a project's CLAUDE or AGENTS context file from a codebase scan. Writes a focused file under 100 lines containing only the non-obvious build commands, conventions, and gotchas Claude Code needs.

Varnan-Tech/opendirectory

Use when the user wants to verify cold emails, enrich a lead list, or autonomously guess email addresses from a CSV using ValidEmail.co or the open-source Reacher engine.

Varnan-Tech/opendirectory

Competitive intelligence orchestrator tracking companies across 8+ platforms (GitHub, Twitter, Reddit, HN, PH, YC Jobs) with heat scores and AI briefings.

Varnan-Tech/opendirectory

Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.

Varnan-Tech/opendirectory

Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository).

Varnan-Tech/opendirectory

Scans your project for outdated npm, pip, Cargo, Go, or Ruby packages. Runs a CVE security audit. Fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch, minor, major). Includes Diagnosis Mode for install conflicts. Use when asked to update dependencies, check for outdated packages, open dependency PRs, scan for package updates, audit for CVEs, or flag breaking changes in upgrades. Trigger when a user says "check for outdated packages", "update my dependencies", "open PRs for dependency updates", "scan for CVEs", or "which packages need upgrading".

Varnan-Tech/opendirectory

Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture. Uses graphify to build a knowledge graph first, then writes accurate docs from it. Use when asked to write docs, generate a README, document an API, update stale docs, create an API reference from code, add an architecture section, or document a project in any language. Trigger when a user says their docs are missing, outdated, or wants to document their codebase without writing it manually.

Varnan-Tech/opendirectory

Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.

Varnan-Tech/opendirectory

Brutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), produces a prioritized action plan ranked by impact × effort, and sketches an ideal README. Trigger when user says "roast my repo", "audit my README", "dx audit", "developer experience review", "score my GitHub project", "before launch checklist", or "make my repo shareable".

Varnan-Tech/opendirectory

Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".

Varnan-Tech/opendirectory

Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment. Use when asked to explain a PR, summarize a pull request, write a plain-English description of a PR, add a summary comment to a PR, or understand what a PR changes. Trigger when a user says "explain this PR", "summarize this pull request", "what does this PR do", "add a comment explaining the PR", or shares a GitHub PR URL and asks what it does.

Varnan-Tech/opendirectory

Audit how often LLMs recommend your brand vs competitors and generate a GEO action plan.

Varnan-Tech/opendirectory

Takes a competitor's public GitHub repo URL, fetches their open issues via the GitHub REST API, filters noise locally, clusters issues into 6 demand categories, computes a demand score per issue and per cluster, and outputs a ranked demand gap report with a GTM messaging brief. Use when asked to scan a competitor's GitHub issues, find what their users are begging for, turn GitHub complaints into product positioning, identify competitor feature gaps, or generate messaging from real user demand. Trigger when a user says "scan competitor issues", "what are users asking for on X repo", "find demand gaps in Y", "turn GitHub issues into messaging", or "what should I build based on competitor complaints".

Varnan-Tech/opendirectory

Find recurring confusion in your repo's GitHub Discussions, rank it by urgency, and draft the actual docs fixes and content angles — with verbatim community quotes and source links as evidence.

Varnan-Tech/opendirectory

SEO keyword research workflow for blog generation using Google Trends data. Use when writing blog posts, planning content calendars, or optimizing articles for search engines. Finds breakout keywords, builds content structure, and generates SEO-optimized blog outlines targeting tech and developer audiences.

Varnan-Tech/opendirectory

Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".

Varnan-Tech/opendirectory

Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6. 1080×1080px default, 5 style presets, highlight annotations. Trigger when user says "create a chart", "visualize data", "make a bar chart", "line graph", "pie chart", "data visualization", "chart this data", "plot", "graph", or "visualize these numbers".

Varnan-Tech/opendirectory

Fetches low-star App Store and Google Play reviews, clusters them into broken-promise patterns, and generates a ranked copy brief with positioning opportunities.

相關技能