跳到正文
GitHub·· 10 天前AI 评分22

Bizidea:基于 GitHub Copilot 的自动化创业研究工厂

vibewatch/bizidea

AI 导读

Bizidea 是一个每日全自动创业研究工厂,通过 GitHub Actions 定时触发 Bizidea Copilot 编排器,由八个专家智能体依次完成新闻筛选、创意生成去重、市场调研、商业计划、3 年财务模型与报告产出,每个选题生成 YAML 工件及简体中文版本。

正文

Bizidea is a daily, fully-automated startup-research factory. A scheduled GitHub Actions workflow invokes the Bizidea Copilot orchestrator: one News Triage scan, idea generation + dedupe, then per-idea report production. Each surviving topic becomes a folder of YAML artifacts (idea, market research, business plan, 3-year financial model, machine-readable index) plus Simplified Chinese siblings. The companion Astro site renders those YAMLs as an FT-style editorial reading experience and ships to GitHub Pages on every push.

Live site: https://bizidea.genisisiq.com

How it works

A run is one orchestrator (Bizidea) delegating to eight specialists through GitHub Copilot's native custom-agent mechanism. Each specialist owns one stage and validates it; the orchestrator verifies files and validator exit codes instead of parsing a home-grown response protocol.

End-to-end flow

flowchart TD
  cron([GitHub cron / manual dispatch]) --> wf[".github/workflows/bizidea.yml"]
    wf -->|"copilot --agent Bizidea"| orch{{"Bizidea<br/>orchestrator"}}

    orch -->|"once per run"| triage["News Triage<br/>web fetch · cluster · score · dedupe"]
    triage -->|"writes"| triageFile[("ideas/_triage/&lt;ts&gt;/triage.yaml<br/>selected: cluster c1..cN")]

    triageFile --> fanout{{"for each selected cluster"}}
    fanout --> idea["Idea Generator<br/>one cluster &rarr; one idea"]
    idea -->|"writes"| ideaFile[("idea.yaml<br/>+ embedded sourceContext")]
    ideaFile --> dedup{{"scripts/deduplicate-idea.mjs<br/>vs ideas/_index.yaml"}}
    dedup -->|"duplicate"| drop["delete partial folder"]
    dedup -->|"new"| pipeline

    subgraph pipeline ["Per-idea pipeline (English stages ordered, translations overlapped)"]
        direction TB
        mr["Market Researcher<br/>adaptive 24–36 page budget, TAM/SAM/SOM, competitors"] -->|"research.yaml"| bp["Business Plan Writer<br/>GTM, milestones, investor memo"]
        bp -->|"business-plan.yaml"| fm["Financial Modeler<br/>3-year P&amp;L, unit economics, funding ask"]
        fm -->|"financial-model.yaml"| rep["Reporter<br/>extract + rate &rarr; website sidecar"]
        zh["ZH Translator &times; 5<br/>GPT-6 Luna validated drafts"]
        zhEdit["ZH Editor &times; 5<br/>source-anchored edit + rollback"]
        ideaFile -.->|"idea.zh.yaml"| zh
        mr -.->|"research.zh.yaml"| zh
        bp -.->|"business-plan.zh.yaml"| zh
        fm -.->|"financial-model.zh.yaml"| zh
        rep -.->|"index.zh.yaml"| zh
        zh --> zhEdit
        zhEdit --> zhFiles[("*.zh.yaml &times; 5")]
    end

    zhFiles --> finalize{{"Bizidea finalize"}}
    finalize -->|"node scripts/build-ideas-index.mjs --strict"| indexFile[("ideas/_index.yaml<br/>aggregated history")]
    finalize -->|"npm run validate:all"| validate["validate everything"]
    indexFile --> push["git commit &amp; push"]
    push --> deploy[".github/workflows/deploy.yml<br/>Astro build &rarr; GitHub Pages"]

Loading

Agents

# Agent Writes Job
1 News Triage _triage/<ts>/triage.yaml Runs parallel search lanes with AnySearch when available, otherwise native web search. Selects only non-dominated cohort champions scoring 5 in creativity, venture potential, or white space, with hard source-diversity floors.
2 Idea Generator <folder>/idea.yaml Privately explores ≥6 concepts across ≥4 venture archetypes, chooses a single champion rather than an average, records nearest-history differences, and rejects OS/copilot/control-plane naming.
2.5 gate (deletes folder on dup) scripts/deduplicate-idea.mjs runs after every idea.yaml. Duplicates removed before any research starts.
3 Market Researcher <folder>/research.yaml Adaptive 24–36 page budget with parallel evidence lanes and saturation stopping; enforces publisher, source-type, primary, independent, and geographic diversity.
4 Business Plan Writer <folder>/business-plan.yaml Investor-ready plan: ICP, product sequencing, GTM, milestones, hiring, risks, funding ask, investor memo. No web; gaps surfaced as null.
5 Financial Modeler <folder>/financial-model.yaml 3-year model: monthly Y1 + quarterly Y2/Y3 P&L, headcount, CAC/LTV/payback, runway-based funding ask, sanityChecks.flags, modelSanity summary. Every number ties to assumptions[].
6 Reporter <folder>/index.yaml Extracts and rates into the compact website sidecar and exposes the idea's champion selectionLens. Preserves units (K, M); missing values → null.
7 ZH Translator One requested <folder>/*.zh.yaml GPT-6 Luna creates a publishable first pass and runs strict schema, identifier, number, terminology, qualifier, protected-term, undertranslation, and translationese checks.
8 ZH Editor Edits one validated <folder>/*.zh.yaml GPT-6 Luna compares the complete English source with the valid Chinese draft, rewrites it as native investor-memo prose, and rolls back deterministically if the edited output damages fidelity.
∞ Bizidea finalize ideas/_index.yaml After all five *.zh.yaml exist, sweeps partial <runTimestamp>-* folders, rebuilds the history index with --strict, then runs npm run validate:all (the same superset CI uses).

Orchestration rules

  • One triage per run. No second scout/news agent.
  • Native delegation. Parent/child completion is provided by GitHub Copilot. Artifact existence and deterministic validators are authoritative.
  • Champion selection. Every selected cluster must lead the cohort in at least one exceptional dimension and sit on the Pareto frontier; weighted-average mediocrity cannot pass.
  • Generate-then-research barrier. All selected ideas are generated and deduped before any Market Researcher invocation, so the dedupe gate is authoritative across the batch.
  • Ordered English, overlapped two-pass translation. English stages remain dependency-ordered, while each validated artifact runs through GPT-6 Luna translation and source-anchored editing concurrently with the next English stage.
  • Gate-and-retry. A failed gate triggers exactly one retry of the same specialist. A second failure marks only that idea as failed and deletes its partial folder.
  • Stable folder names. scripts/create-report-dir.mjs creates ideas/<runTimestamp>-<slug>/ once; the name never changes if the slug evolves.
  • Hard stops. Triage failure or final index-rebuild failure aborts the whole run; per-idea failures only abort that idea.
  • Localization is part of "done". A report is not generated until its five *.zh.yaml files exist and parse.

Artifact gates

Stage contracts are enforced deterministically by scripts/validate-stage.mjs. Each specialist runs its validator before returning; the orchestrator re-runs the same gate before advancing.

Repository layout

Path Purpose
ideas/ Report folders (English + *.zh.yaml). _index.yaml = aggregated history. _triage/<ts>/ = daily triage. _-prefixed paths ignored by Astro.
website/ Astro 6 site that renders reports.
cloudflare/ Retired Cloudflare workflow-dispatch helper retained for reference.
.github/agents/ Copilot agents: Bizidea orchestrator, the eight specialists above, and shared references (sector-vocabulary.md, yaml-syntax.md).
.github/workflows/ bizidea.yml (scheduled pipeline run) and deploy.yml (publishes the site on main pushes touching website/** or ideas/**).
scripts/ Deterministic Node helpers for indexing, semantic dedupe, champion/source-quality gates, Chinese quality checks, measurement, and full validation.
.cache/ Local-only digest manifests for incremental builds (gitignored; restored in CI via actions/cache).
AGENTS.md Coding-agent quick reference (commands, layout, YAML conventions).

YAML conventions (camelCase field names, units in numeric names like revenueK/marginPct, indentation/quoting/multi-line rules) live in .github/agents/yaml-syntax.md.

Local development

cd website
npm ci
npm run dev          # http://localhost:4321/
npm run build        # static output → website/dist/ (runs check-ideas first)

The website build is read-only with respect to ideas/. YAML repair (npm --prefix website run repair:yaml) runs in the daily workflow before commits, not during rendering.

Common checks from the repo root:

Command Purpose
npm run build:ideas-index Rebuild ideas/_index.yaml from completed folders.
npm run check:agents Validate orchestrator/specialist agent frontmatter names.
npm run check:triage Validate historical ideas/_triage/**/triage.yaml artifacts.
npm run check:ideas-index Validate _index.yaml without rewriting.
npm run check:duplicates Report legacy similarity candidates and block current-policy concept duplicates or repeated title frames.
npm run check:content-quality Enforce current champion, originality, research, and index policies.
npm run check:ideas Validate report artifacts through the website schema.
npm run check:zh-translations Validate Simplified Chinese report translations.
npm run check:types Type-check the website.
npm run test Vitest.
npm run measure:quality Print corpus quality and speed-proxy metrics.
npm run validate:all Full local validation gate.

Incremental builds

Both the website loader and check:ideas are digest-keyed, so unchanged report folders are skipped on rebuild:

  • website/src/content/ideas-loader.ts hashes each index.yaml (plus LOADER_VERSION) and reuses Astro's persistent content store at website/.astro/data-store.json. Bump LOADER_VERSION when the schema or parseData inputs change.
  • website/scripts/check-ideas.mjs hashes every YAML in each ideas/<run>/ folder (plus CHECK_VERSION) and persists .cache/check-ideas.json. Failures are never cached. Bump CHECK_VERSION when validation rules change. Set CHECK_IDEAS_NO_CACHE=1 to bypass.

In CI, deploy.yml restores website/.astro and .cache/ via actions/cache@v4, keyed by the hash of website/src/** and ideas/**/*.yaml so any source/idea change re-keys the cache automatically.

Running the pipeline

In CI, GitHub Actions schedules the workflow once daily at 07:00 UTC. Scheduled broad scans use a rolling seven-day window so promising events can accumulate enough primary and independent evidence; manual runs retain their explicit input. Triage may shortlist a non-dominated cohort champion scoring 4 or 5, but the generated idea must still score an absolute 5 before research and publication. Every custom agent is explicitly pinned to GPT-6 Luna, and pipeline runs use xhigh reasoning. Local role benchmarks found that the strongest alternative improved blind-judge quality by less than 0.5/10 while using 13–21× more AI credits.

The Action separates AI generation from publishing. The read-only generate job records stage attempts in an atomic run manifest, validates the complete repository, and uploads an immutable bundle. The write-enabled publish job downloads and revalidates that bundle before committing. A failed publish job can therefore be rerun without repeating any model calls. Generation and final manifests are retained as workflow artifacts for 30 days.

Manual triggers:

  • GitHub UI: Actions → Bizidea — triage, generate, and publish reports → Run workflow. Inputs: cap (1–5), timeWindow (e.g. yesterday, last 7 days), and optional topic. Chinese localization uses separate GPT-6 Luna draft and source-anchored editorial agents. Strict validators, a saved valid draft, and deterministic rollback provide the quality safety net.

  • Local Copilot CLI (requires a Copilot license):

    npm install -g @github/copilot
    copilot --yolo --autopilot --reasoning-effort xhigh --agent Bizidea \
      -p "Scan yesterday's startup news and generate up to 5 non-duplicate startup reports."

Deployment

deploy.yml builds the Astro site and publishes to GitHub Pages on main pushes touching website/**, ideas/**, or the workflow itself. The custom domain bizidea.genisisiq.com is set via website/public/CNAME.

Scheduling

.github/workflows/bizidea.yml is the authoritative scheduler and runs once daily at 07:00 UTC. Manual workflow_dispatch runs remain available.

The former Cloudflare dispatcher remains under cloudflare/ for reference, but its Wrangler configuration declares no cron trigger. Redeploy that configuration if retiring an older deployed Worker trigger.

Required secrets

Secret Used by Purpose
COPILOT_PAT bizidea.yml Copilot-licensed PAT, passed as COPILOT_GITHUB_TOKEN to the Copilot CLI.
BIZIDEA_PAT bizidea.yml Repo-write PAT used only by the isolated publish job for checkout and commit, so downstream deploy workflows trigger reliably.

Optional repository variables

Variable Used by Purpose
PUBLIC_GA_ID deploy.yml Google Analytics measurement ID (G-XXXXXXX). When set and matching the G-... shape, the production build injects gtag.js from website/src/layouts/BaseLayout.astro. Unset → no analytics; dev builds never inject.

License

MIT.

来源:GitHub · github.com