lov-bp
Orchestrate a complete investor BP workflow or route to one focused module: source-backed outline, PPTX/PDF production, or evidence/content/visual polishing. Use when the user wants to create a business plan end to end, combine BP stages, continue from an existing BP workspace, o
Install
npx skills add https://github.com/lovstudio/skills/tree/main/skills/bp
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install lovstudio-skills@llmmart
git clone https://github.com/lovstudio/skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole lovstudio/skills collection as a plugin from our marketplace. Git is the plain clone.
README
BP 工坊 · BP Studio
一套可以拆开使用、也可以自由组合的投资人 BP 工具包。
项目材料 → BP 大纲 → PPTX / PDF → 专业审稿与润色
↑ ↑ ↑
bp-outline bp-deck bp-polish
└──────── lov-bp 总控 ────────┘
不再把“想清楚融资叙事”“制作 PPT”“审稿润色”塞进一次又长又重的执行。用户可以只拿需要的那一段,也可以让总控完成全流程。
由 Skill Publisher 免费开源。
安装
安装整套 BP Skill Kit:
npx skills add bp -g -y
只安装一个模块:
npx skills add bp-outline -g -y
npx skills add bp-deck -g -y
npx skills add bp-polish -g -y
WorkBuddy
仓库内置腾讯 WorkBuddy skill-only Connector 发行配置,可生成一个运营审核包
以及四个适合在 WorkBuddy“上传技能”页面逐个导入的 ZIP:
python3 scripts/build_workbuddy_connector.py \
--output-dir ./lov-bp-workbuddy-v0.2.1
其中 lov-bp.zip 是可独立审查和安装的自包含总控包,内部携带三个
子模块;另外三个 ZIP 仍可作为独立 Skill 使用。
接入说明和审核文案见 workbuddy/。
四个入口
| Skill | 最适合的任务 | 交付物 |
|---|---|---|
lov-bp |
不确定用哪个,或要完成全流程 | 自动组合所需模块 |
lov-bp-outline |
从项目资料建立投资叙事 | Brief、证据账本、12–15 页大纲 |
lov-bp-deck |
把已确认大纲做成专业 PPT | PPTX、PDF、全稿预览、Deck Manifest |
lov-bp-polish |
审查或升级已有 BP/PPT | 100 分报告、逐页修改、定向重做 |
组合方式
只想先把内容想清楚
$lov-bp-outline 根据当前项目材料写一份种子轮 BP 大纲
已有大纲,直接做 PPT
$lov-bp-deck ./business-plan/outline.md --style minimal
已经有 BP,只想变得更专业
$lov-bp-polish ./project-bp.pdf --full
从材料到最终交付
$lov-bp 从当前项目生成完整 BP,不要问我问题,按推荐方案
总控默认组合:
bp-outline → evidence gate → bp-deck → visual gate → bp-polish
每个阶段共享同一个工作区,不会重复提问,也不会覆盖已经确认的大纲。
组合与回退规则见 references/composition.md。
工作区
business-plan/
├── brief.md # 融资任务和产品定义
├── evidence-ledger.md # 事实 / 推断 / 假设 / 缺口
├── outline.md # 投资人叙事源文件
├── assets/ # Logo、截图、照片、二维码、数据
├── deck-manifest.md # 风格、页数、素材和导出状态
├── reports/bp-review.md # 内容、证据和视觉审稿报告
├── project-bp.pptx
├── project-bp.pdf
└── project-bp-preview.png
体验原则
- 先读取项目与已有材料,再决定问什么。
- 只有真正影响结果的选择才询问用户。
- 用户说“按推荐方案”时直接使用种子轮 12–15 页默认值。
- 大纲确认后才进入视觉风格与 PPT 生产。
- 图表和视觉润色不能改变事实。
- 只重做有问题的页面,不因为一次修改推翻整份材料。
- 完整流程必须交付 PPTX、PDF、预览和审稿报告。
公开案例:Yoda 种子轮 BP
Yoda 案例经历了完整组合流程:从项目材料和用户反馈中重建产品定位,形成证据化 15 页大纲,再完成专业图表、品牌视觉、二维码与最终审稿。


兼容性
- Python 3.8+:工作区初始化和确定性审稿。
lov-any2deck:PPTX/PDF 生产。- 当前市场、竞品、政策和融资事实需要访问权威来源。
- 不依赖作者私有路径;品牌和输出目录通过参数、环境变量或共享配置传入。
原有脚本入口继续可用:
python3 scripts/init_bp.py --name "Project" --output ./business-plan
python3 scripts/audit_bp.py --input ./business-plan/outline.md
License
MIT
Skill manifest
BP 工坊 · BP Studio
Compose only the stages the user needs. The kit preserves the existing
$lov-bp entrypoint while exposing three focused skills that can be used
independently.
Triggers
Activate for requests containing or clearly implying:
- Chinese: “商业计划书”, “BP 大纲”, “融资 PPT”, “路演材料”, “投资人演示文稿”, “BP 审稿”, “BP 润色”, or “从项目材料做完整 BP”;
- English: “business plan”, “BP outline”, “pitch deck”, “investor deck”, “fundraising deck”, “review my BP”, or “polish this deck”.
Do not activate for a generic company introduction, ordinary product presentation, annual report, marketing proposal, or document formatting request unless the user also needs an investor-facing business plan.
Runtime and portability
Use Python 3.8+ for workspace and audit scripts. Resolve presentation generation through the active Agent Skills environment; never assume an author's private path. Take user-specific output, brand, and asset paths from the request or current project.
Kit Map
| Skill | Input | Output | Use alone when… |
|---|---|---|---|
lov-bp-outline |
Project files, links, metrics, interviews | brief.md, evidence-ledger.md, outline.md |
The user needs to clarify the investment story first |
lov-bp-deck |
Approved outline + evidence + brand assets | PPTX, PDF, preview, deck manifest | The outline already exists and the user wants slides |
lov-bp-polish |
Outline, PPTX/PDF, or rendered slides | Scored report + exact revisions + corrected assets | The user already has a BP and wants it made credible/professional |
Default full pipeline:
project evidence
↓
bp-outline ── evidence gate ──→ bp-deck ── visual gate ──→ bp-polish
│ │ │
└ brief / ledger / outline └ PPTX / PDF / preview └ report / fixes
Routing Rules
Select the smallest route that fulfills the request:
| User intent | Route |
|---|---|
| “先写 BP 大纲”“梳理融资叙事” | bp-outline |
| “大纲已经有了,做成 PPT”“选择 PPT 风格” | bp-deck |
| “这份 BP 不专业”“润色/审稿/改图表/改版式” | bp-polish |
| “做一份完整 BP”“从项目材料做到 PPT” | bp-outline → bp-deck → bp-polish |
| “重写现有 BP 并重新出图” | bp-polish → bp-deck → bp-polish |
Do not run all modules merely because they exist. For example, a user asking for an outline should not wait for image generation.
For the state machine and handoff semantics, read references/composition.md.
Shared Workspace Contract
All modules read and write the same portable workspace:
business-plan/
├── brief.md
├── evidence-ledger.md
├── outline.md
├── assets/
├── deck-manifest.md
├── reports/bp-review.md
├── project-bp.pptx
├── project-bp.pdf
└── project-bp-preview.png
Rules:
- Never recreate a file that already contains accepted user work.
- Preserve evidence IDs across modules.
outline.mdis the narrative source of truth.deck-manifest.mdrecords style, slide count, assets, filenames, and render status.reports/bp-review.mdrecords findings and fixes; it must not silently rewrite facts.- A later module may send work back to an earlier module when it finds a blocker.
Orchestration Workflow (MANDATORY)
Step 0: Resolve the kit
Resolve this SKILL.md directory as KIT_DIR. Module entrypoints are:
$KIT_DIR/skills/bp-outline/SKILL.md
$KIT_DIR/skills/bp-deck/SKILL.md
$KIT_DIR/skills/bp-polish/SKILL.md
Before executing a selected module, read that module's SKILL.md completely and
follow its references. If a standalone installation is being used, resolve its own
directory as SKILL_DIR.
Verify every selected module before execution:
- read
kit.yamland resolve the declared relative module path insideKIT_DIR; - confirm the selected module's
SKILL.mdexists; - if it is missing, stop before producing partial output and report:
BP Skill Kit installation is incomplete: missing <relative path>; - tell the user to reinstall the self-contained
lov-bppackage or install the requested standalone module. Do not silently redirect to a sibling directory or improvise a replacement workflow.
Step 1: Inspect context before asking
Inspect the current project, previous BP workspace, supplied deck, conversation, and links. Reuse known audience, financing stage, ask, language, brand, and output path.
Ask at most one compact round of questions only when an answer changes the result. If the user says “不要问”“直接做”“按推荐方案”, use these defaults:
- seed-stage investors who may not understand the technology;
- 12–15 slides / 8–10 minutes;
- same language as the user;
- clean editorial style with one brand color;
- PPTX + PDF + preview + review report.
Step 2: Run the selected module(s)
For each module:
- announce the module and why it is needed;
- read its full
SKILL.md; - pass the existing workspace instead of starting over;
- verify its output contract;
- continue to the next module only if requested or implied by the chosen route.
Step 3: Respect the two useful gates
Evidence gate — after bp-outline:
- product definition is investor-readable;
- all 12 investor questions are covered;
- core numbers have sources or are labeled assumptions;
- no fabricated traction, market, quote, or revenue.
If the user only asked for an outline, stop here. In an interactive full workflow, show the concise page map and ask whether to produce PPT. Skip this pause when the user already requested a complete deck or autonomous execution.
Visual gate — after bp-deck:
- PPTX/PDF/preview exist and page counts match;
- every page has one conclusion and a legible proof;
- logos, images, sources, and QR codes survive final rendering.
Then use bp-polish for the final adversarial review.
Step 4: Handle loop-backs
bp-polish may return one of three verdicts:
- copy fix → patch the outline and regenerate only affected slides;
- evidence blocker → return to
bp-outline, update the ledger, then regenerate; - visual defect → return to
bp-deck, regenerate affected slides, and recheck.
Limit automatic correction to three cycles. If a core source remains unavailable, leave an explicit gap rather than guessing.
Step 5: Deliver
Return clickable paths to all artifacts created by the selected route. For a full pipeline, report:
- outline and evidence ledger;
- editable PPTX and PDF;
- full-deck preview;
- deck manifest;
- final review report;
- at most five unresolved decisions or evidence gaps.
Composition Examples
$lov-bp-outline 根据当前仓库和用户访谈写融资大纲
$lov-bp-deck ./business-plan/outline.md --style minimal
$lov-bp-polish ./business-plan/project-bp.pdf --full
$lov-bp 从当前项目材料生成完整种子轮 BP,不要问,按推荐方案
Backward Compatibility
The original commands remain available:
python3 "$KIT_DIR/scripts/init_bp.py" --name "Project" --output ./business-plan
python3 "$KIT_DIR/scripts/audit_bp.py" --input ./business-plan/outline.md
They delegate to the same templates and rubric used by the child skills.
Non-Negotiables
- Do not conflate “write an outline” with “produce a finished deck”.
- Do not choose a visual style before the investment narrative is coherent.
- Do not rewrite facts during visual polishing.
- Do not force a user through all modules when one module solves the request.
- Do not finish a full route without PPTX, PDF, preview, and review report.
Runtime context (shared)
运行前读取本 Skill 包的 skill.yaml,由宿主提供 skill-runtime/v1 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。
- 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。
required: true字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。- 报错提供可复制的
context_id、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。
通用反馈闭环
用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行:
- 先判断意见是
task-specific(仅本次)还是reusable(可跨任务复用)。 task-specific只修改当前任务,不改 Skill。reusable先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。- 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。
reusable修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。
Files (skills)
-
assets
-
templates
-
bp-review.md 1.3 KB
# BP Review Report Project: {{PROJECT_NAME}} Reviewed: {{DATE}} Version: {{VERSION}} ## Verdict - Score: __ / 100 - Decision: not ready / conditional / investor-ready - One-line verdict: __ ## Blockers | Severity | Slide | Issue | Why it matters | Exact revision | |---|---:|---|---|---| | — | — | None yet recorded | — | — | ## Scorecard | Dimension | Score | Max | Main finding | |---|---:|---:|---| | Story structure | 0 | 25 | — | | Investor readability | 0 | 20 | — | | Evidence and data hygiene | 0 | 25 | — | | Charts and visual specification | 0 | 20 | — | | Financing delivery | 0 | 10 | — | ## Page-level findings | Slide | Status | Finding | Revision | |---:|---|---|---| | — | — | — | — | ## Evidence gaps | Claim | Current status | Required source / action | Owner | |---|---|---|---| | — | — | — | — | ## Visual QA - [ ] Contact sheet reviewed. - [ ] Body text ≥20 pt. - [ ] Charts match evidence ledger. - [ ] Product screenshots are genuine and legible. - [ ] Logos are optically balanced. - [ ] QR codes decode from final images. - [ ] PPTX/PDF page counts match. - [ ] Filenames are normalized. ## Deliverables | Artifact | Path | Status | |---|---|---| | PPTX | — | missing | | PDF | — | missing | | Full-deck preview | — | missing | | Outline | — | missing | | Evidence ledger | — | missing | -
brief.md 1.2 KB
# {{PROJECT_NAME}} — BP Brief Updated: {{DATE}} ## Financing task - Audience: early-stage investors who may not know the technology - Stage: {{STAGE}} - Target presentation: 12–15 slides / 8–10 minutes - Financing ask: missing - Instrument / equity: missing - Validation window: 18–24 months (assumption until confirmed) ## Product definition - One-line product definition: missing - Category: missing - Core user / buyer: missing - Core job to be done: missing - Early wedge: missing - Adjacent users: missing - Long-term market: missing ## Investment thesis - Problem: missing - Product insight: missing - Why now: missing - Evidence already proven: missing - Evidence not yet proven: missing - Business model: missing - Defensibility: missing - Founder–market/product fit: missing ## Required source material - [ ] Product docs and current screenshots - [ ] Current usage / retention / revenue data - [ ] Customer interviews, pilots, orders, or support evidence - [ ] Competitor product pages and pricing - [ ] Market data with source and date - [ ] Team profile and execution evidence - [ ] Financing amount, use of funds, and milestones - [ ] Brand assets and contact action -
evidence-ledger.md 1.5 KB
# {{PROJECT_NAME}} — Evidence Ledger Updated: {{DATE}} Status values: `fact`, `inference`, `assumption`, `missing`. | ID | Claim | Status | Source | As of | Slide | Notes / next action | |---|---|---|---|---|---|---| | E-001 | Product definition | missing | — | {{DATE}} | 1 | Validate with product and buyer language | | E-002 | Core problem evidence | missing | — | {{DATE}} | 2 | Add interview, workflow, or measured cost | | E-003 | Product workflow | missing | — | {{DATE}} | 3–4 | Add real screenshot and current capability boundary | | E-004 | Why-now evidence | missing | — | {{DATE}} | 5 | Verify current primary sources | | E-005 | Traction | missing | — | {{DATE}} | 6 | Separate install, active, retained, trial, and paid | | E-006 | Business model | assumption | — | {{DATE}} | 7 | Identify buyer, offer, price, and sales motion | | E-007 | TAM/SAM/SOM | missing | — | {{DATE}} | 8 | Build bottom-up and cross-check top-down | | E-008 | Competition | missing | — | {{DATE}} | 9 | Verify current product pages and pricing | | E-009 | Growth plan | assumption | — | {{DATE}} | 10 | Tie channels to measurable capacity | | E-010 | Team fit | missing | — | {{DATE}} | 11 | Add execution and domain evidence | | E-011 | Financing ask | missing | — | {{DATE}} | 12 | Amount, structure, use, window, milestones | ## Source notes Record definitions, denominators, query dates, screenshots, and exclusions here. Do not paste credentials or private customer information. -
outline.md 3.1 KB
# {{PROJECT_NAME}} — Investor BP Outline Stage: {{STAGE}} Updated: {{DATE}} Audience: Early-stage investors Length: 12–15 slides / 8–10 minutes ## Slide 1 — Product definition Headline: TODO — one investor-readable definition Investor takeaway: TODO Evidence: E-001 Visual: clean cover; product/company name + definition Speaker purpose: establish what the company is in ten seconds Gap: E-001 ## Slide 2 — Concrete problem Headline: TODO — state the user pain as a conclusion Investor takeaway: TODO Evidence: E-002 Visual: before workflow, direct quote, or measured pain Speaker purpose: prove frequency and cost Gap: E-002 ## Slide 3 — Solution Headline: TODO — show the changed user outcome Investor takeaway: TODO Evidence: E-003 Visual: before/after or solution flow Speaker purpose: connect pain to the product insight Gap: E-003 ## Slide 4 — Product demo Headline: TODO — describe what the real experience proves Investor takeaway: TODO Evidence: E-003 Visual: real product screenshot or demo sequence Speaker purpose: make the product tangible Gap: E-003 ## Slide 5 — Why now Headline: TODO — state the structural change Investor takeaway: TODO Evidence: E-004 Visual: timeline or 2–3 converging trends with sources Speaker purpose: explain timing Gap: E-004 ## Slide 6 — Real validation Headline: TODO — state what is proven and what is not Investor takeaway: TODO Evidence: E-005 Visual: evidence ladder, cohort, revenue, pilots, or usage chart Speaker purpose: reduce execution and demand uncertainty Gap: E-005 ## Slide 7 — Business model Headline: TODO — explain who pays for what value Investor takeaway: TODO Evidence: E-006 Visual: value/revenue staircase or buyer-to-payment flow Speaker purpose: show how money enters the system Gap: E-006 ## Slide 8 — Market and wedge Headline: TODO — connect the first buyer to the larger market Investor takeaway: TODO Evidence: E-007 Visual: bottom-up TAM/SAM/SOM bridge with formulas Speaker purpose: establish venture-scale potential and credible entry Gap: E-007 ## Slide 9 — Competition and differentiation Headline: TODO — state the defensible position Investor takeaway: TODO Evidence: E-008 Visual: comparison table or defensible quadrant Speaker purpose: show alternatives honestly and explain the wedge Gap: E-008 ## Slide 10 — Growth plan Headline: TODO — state the repeatable acquisition hypothesis Investor takeaway: TODO Evidence: E-009 Visual: funnel, flywheel, or phased channel plan Speaker purpose: connect channel activity to measurable growth Gap: E-009 ## Slide 11 — Team fit Headline: TODO — state why this team is unusually suited Investor takeaway: TODO Evidence: E-010 Visual: evidence timeline, founder-product loop, or customer access Speaker purpose: prove founder–market/product fit Gap: E-010 ## Slide 12 — Financing and next proof Headline: TODO — amount + most important proof this round buys Investor takeaway: TODO Evidence: E-011 Visual: use-of-funds chart + 18–24 month milestone gates + contact Speaker purpose: make the investment decision concrete Gap: E-011
-
-
-
cases
-
cases.json 701 B
[ { "type": "case", "title": "Yoda 种子轮投资人 BP", "description": "完整演示 bp-outline → bp-deck → bp-polish 的组合:把技术导向的“多智能体编程工作台”重构为投资人可理解的“Agent 时代集成委托环境”,再用真实产品截图、专业图表和定向视觉修正完成 15 页 PPTX/PDF。" }, { "type": "article", "title": "Yoda BP:从功能清单到投资叙事的完整复盘", "url": "https://example.com/skills/bp-skill/blob/main/references/case-yoda.md", "source": "Skill Publisher 案例报告", "cover": "https://raw.githubusercontent.com/skill-publisher/bp-skill/main/cases/yoda-bp-cover.png" } ] -
yoda-bp-cover.png 37.8 KB · in bundle
-
yoda-bp-overview.png 2 MB · in bundle
-
-
references
-
case-yoda.md 3.8 KB
# Case: Yoda Seed BP This case is also the reference composition for the BP Skill Kit: ```text bp-outline → bp-deck → bp-polish → targeted bp-deck fixes → bp-polish ``` ## Context Yoda is an open desktop workspace for orchestrating AI coding work from intent to delivery. The initial BP narrative accurately described technical capabilities, but it made the company look narrower and more replaceable than the product ambition. ## Initial symptoms - “多智能体编程工作台” was accurate but implementation-led. - “让一个开发者指挥一支 AI 团队” made multi-Agent operation sound mandatory. - “本地优先” could be misread as running models locally, despite cloud services, Relay, and model APIs. - Worktree/branch behavior was elevated above broader product paradigms. - The deck described features before defining the human need: reliably delegating creative work to AI. - Early layouts had too many boxes and insufficient chart evidence. ## Reframing method 1. Separated product core from work modes. 2. Defined the early wedge (super developers), adjacent users (AI-native creators and teams), and long-term market. 3. Replaced implementation-first language with the human–AI relationship: Harness, delegation, evidence, approval, and creation. 4. Used an investor-readable category: “Agent 时代的集成委托环境”. 5. Built the story around the falling cost of implementation and the rising complexity of reliable delegation. 6. Kept commercial gaps visible: build/use evidence was separated from payment proof, and financing was framed as the window to validate retention, payment, institutional contracts, and measurable growth. These decisions belong to `bp-outline`. No visual style was selected until the page argument and evidence gaps were explicit. ## Final 15-slide architecture 1. Integrated Delegation Environment. 2. IDE center moves from code to delegation. 3. Implementation cost falls while delegation complexity rises. 4. Execution becomes an auditable delivery loop. 5. Task to Feature manages complete delivery, not chat. 6. Five-layer product architecture. 7. System moat: freedom, robustness, evolution. 8. Why now: model capability becomes infrastructure; Harness gains value. 9. Build/use/pay evidence ladder. 10. Super developers as wedge; larger delegation market. 11. Reliable delegation vs. execution-only alternatives. 12. Open local core; continuity and collaboration are paid. 13. Consumer and institutional entry paths. 14. Founder–product fit. 15. Financing ask, use of funds, and 18–24 month validation window. ## Visual evolution The final direction used warm white, deep Yoda green, large conclusion headlines, real screenshots, simple sourced charts, and substantial whitespace. The cover was reduced to a strong title and horizontal brand treatment. The final page used two clearly separated QR codes for product and personal contact, then verified both from the rendered slide. The initial deck came from `bp-deck`; the later cover, logo balance, final-page layout, filename, and QR corrections are examples of `bp-polish` returning targeted work to `bp-deck` instead of regenerating the entire presentation.   ## Reusable lessons - Technical truth is not automatically an investable category. - A narrow initial user does not have to cap the long-term market. - Single Agent, multiple Agents, Agent teams, and worktrees can be product modes rather than the company definition. - Honest zeroes can strengthen the financing thesis when the deck clearly states what the next capital will validate. - Professional visuals require chart logic and final-image inspection; a polished template alone is insufficient. -
charts-and-visuals.md 2.8 KB
# Charts and Visual Standards ## Visual principle The design should combine product-launch clarity, consulting-report credibility, and the evidence texture of a real startup. “Premium” comes from editing and hierarchy, not decoration. ## Baseline - 16:9 landscape. - White or warm-gray background and one brand accent. - Dark headline, large conclusion, body text at least 20 pt. - One dominant visual per page and roughly one-third breathing room. - Product screenshots, customer scenes, workflows, interview evidence, and orders before stock photography. - Do not stretch logos; align by optical weight, not only bounding boxes. ## Choose the proof, then the chart | Claim | Recommended visual | |---|---| | Process is fragmented | Before workflow / swimlane | | Product compresses work | Before/after or time-to-outcome bars | | Category is shifting | Timeline or converging trends | | Product closes a loop | Circular process with evidence rail | | Product has depth | Layered architecture with customer consequences | | Traction has stages | Evidence ladder or funnel | | Retention is improving | Cohort heatmap or retention curves | | Revenue expands with value | Value/revenue staircase | | Market bridges to revenue | Buyer bridge or concentric market with formula | | Competitive position | 2×2 only when axes are defensible; otherwise comparison table | | Growth has two entry points | Dual funnel / phased path | | Financing buys proof | Use-of-funds donut + milestone gates | ## Chart requirements Every quantitative chart needs: - title containing the conclusion; - axes and units when applicable; - time period and as-of date; - legend where more than one series exists; - source or evidence IDs; - assumptions beside the number, not hidden in notes; - “illustrative / 示意” label for non-measured conceptual curves. Avoid 3D charts, gauges, decorative radar charts, dual axes without necessity, and large coordinate systems with tiny data differences. ## Product screenshots - Use real current screenshots. - Crop to the workflow being proved. - Add 1–3 callouts maximum. - Keep interface text legible at normal presentation size. - State what is live, prototype, planned, or illustrative. - Do not reconstruct a fake UI when the real product exists. ## Cover A seed BP cover should usually contain only: - product/company name or logo; - one investor-readable definition; - optional financing stage/date. Use a single centered composition or a strong branded band. Do not fill the cover with feature tags, funding terms, or multiple logos competing for attention. ## Final page The final page should answer: - how much is being raised; - equity/structure when disclosed; - runway or time window; - 2–4 proofs the financing will buy; - one clear contact action. If QR codes are present, decode the final rendered image—not only the source asset. -
composition.md 2.2 KB
# BP Skill Kit Composition ## Principle Composition is file-based, not conversation-based. Every module shares a stable BP workspace so users can stop, switch agents, or resume later without losing state. ## Module boundaries | Module | Owns | Must not own | |---|---|---| | `bp-outline` | Facts, assumptions, positioning, page argument | Visual decoration and slide export | | `bp-deck` | Style, layout, rendering, branding, export | New business facts or unsupported copy | | `bp-polish` | Adversarial review, exact revisions, targeted correction | Silent changes to evidence or complete regeneration by default | ## Handoff states ```text MATERIALS │ ▼ OUTLINE_DRAFT ── evidence gate ──► OUTLINE_APPROVED │ ▼ DECK_DRAFT │ visual + claim gate │ ▼ DECK_READY ``` An evidence blocker moves `DECK_DRAFT` back to `OUTLINE_DRAFT`. A visual defect keeps the workflow in `DECK_DRAFT` and regenerates only affected slides. ## User-intent routing - A noun usually selects an artifact: “大纲” → outline, “PPT/PDF” → deck. - A quality complaint selects polish: “不专业 / 太技术 / 图表乱 / 页面拖沓”. - “完整 / 从项目材料开始 / 融资 BP” selects the full pipeline. - Explicit scope always wins over automatic routing. ## Interaction budget Collect decisions once and persist them in `brief.md` or `deck-manifest.md`. - Outline questions: audience/stage, financing ask, source scope. - Deck questions: visual direction and required format. - Polish questions: review mode only when the request does not reveal it. Do not ask the same question again in a later module. ## Completion rules - Outline route ends with three Markdown artifacts and evidence gaps. - Deck route ends with PPTX, PDF, preview, and manifest. - Polish route ends with a scored report and applied or explicitly proposed fixes. - Full route ends only when all three contracts are satisfied. -
deck-architecture.md 2.9 KB
# 12–15 Slide Investor Deck Architecture ## Base 12-slide sequence | # | Investor question | Required proof | Strong visual | |---:|---|---|---| | 1 | What are you? | Product definition + company/brand | Clean cover or one visual metaphor | | 2 | What hurts? | Concrete user moment, frequency, cost | Before workflow, quote, or pain funnel | | 3 | What changes? | Specific product response | Before/after or solution flow | | 4 | Does it work? | Real product or experience | Product screenshot / demo sequence | | 5 | Why now? | 2–3 structural changes | Timeline or converging trend chart | | 6 | What is proven? | Usage, retention, revenue, speed, or pilots | Evidence ladder / cohort / verified metrics | | 7 | How do you make money? | Buyer, offer, price, sales motion | Value/revenue staircase | | 8 | How large can it be? | Source-backed TAM/SAM/SOM + wedge | Market bridge / rings with methodology | | 9 | Why you vs. alternatives? | Honest competitor dimensions | Matrix, table, or value-chain map | | 10 | How will you grow? | Channels, milestones, economics | Funnel, flywheel, or phased roadmap | | 11 | Why this team? | Founder-market/product fit | Evidence timeline, not résumé wall | | 12 | What are you raising? | Ask, use, runway, 18–24 month proof | Use-of-funds chart + milestone gates | ## When to expand to 13–15 slides Add a page only when it carries evidence that cannot fit cleanly elsewhere: - a second product-demo page for a complex workflow; - a technology/moat page with measurable defensibility; - a dedicated go-to-market wedge page; - a regulated/B2B deployment model; - a financial model when revenue complexity materially affects the investment case. Do not add generic mission, feature grids, long roadmaps, or “thank you” pages merely to reach a page count. ## Slide contract Each outline entry should contain: ```markdown ## Slide 06 — Real validation Headline: One conclusion, not a topic label Investor takeaway: What uncertainty this page removes Evidence: Exact facts and source IDs Visual: Chart type and field mapping Speaker purpose: Why this page exists in the spoken story Gap: Missing evidence or “none” ``` ## Page discipline - One page, one argument. - The headline contains the conclusion. - A viewer should understand the page in 8–12 seconds. - Keep only the numbers needed for the conclusion. - Put methodology and source notes at the bottom, not in the speaker's memory. - 8–10 minutes means roughly 35–50 seconds per page; demo pages may take longer. ## Executive summary rule For a long-form business plan, write the executive summary last. It must include: 1. what the company does; 2. problem and buyer; 3. solution and difference; 4. market opportunity with a traceable number; 5. exact ask and what it unlocks. The pitch deck's first and last pages should make the same promise and ask, from opposite ends of the argument. -
evidence-and-market.md 2.8 KB
# Evidence and Market Sizing ## Evidence classes Every material claim belongs to one class: | Class | Meaning | How to present | |---|---|---| | Fact | Directly supported by a reliable source | State with source and as-of date | | Inference | Reasoned conclusion from facts | Label as inference and show bridge | | Assumption | Planning input not yet verified | Label and sensitivity-test | | Missing | Necessary evidence not yet available | Keep as a named gap, never fill by intuition | ## Source hierarchy Prefer sources in this order: 1. Product database, payment processor, analytics, contracts, repository history. 2. Direct customer interviews, support conversations, signed pilots, orders. 3. Official government, company, exchange, standards, or research data. 4. Reputable analyst/research reports with disclosed methodology. 5. Quality secondary reporting. 6. Search snippets, social posts, and unsourced aggregations only as leads. Time-sensitive facts must be checked live. Capture the date and exact URL. If a source is inaccessible, say so in the report. ## Evidence ledger format | ID | Claim | Status | Source | As of | Slide | Notes / next action | |---|---|---|---|---|---|---| | E-001 | ... | fact | URL or dashboard export | YYYY-MM-DD | 6 | ... | Use stable IDs in the outline so charts and slide copy can be traced back. ## TAM / SAM / SOM methodology Do not paste a broad “AI will be worth $X trillion” forecast into a deck. Build a bridge from actual buyer to price. ### TAM All plausible buyers × annual value of the complete category. ```text TAM = global buyer count × realistic annual spend per buyer ``` Use a top-down source only as a cross-check. ### SAM The part of TAM reachable by current product scope, geography, regulation, and sales motion. ```text SAM = target buyer count in reachable segments × current annual contract value ``` ### SOM A three-to-five-year operating plan, not a percentage chosen for visual symmetry. ```text SOM = acquired accounts × annual price × expected retention ``` Show the channel capacity or sales capacity that makes acquired accounts credible. ## Scenario model Use at least two scenarios: - conservative: slower conversion, lower price, longer sales cycle; - base: management plan; - upside: only if named leading indicators improve. Never present the upside case as a forecast. Put assumptions next to the chart. ## Metric hygiene - Distinguish downloads, clones, activated users, active users, retained users, and paid users. - Distinguish trial, activation, conversion, renewal, and revenue. - Use cohorts for retention; do not infer retention from cumulative installs. - Define the period, denominator, timezone, duplicates, bots, and internal usage. - Put “as of YYYY-MM-DD” on changing metrics. - When the number is zero, say zero; the honest gap can define the financing thesis. -
investor-story.md 3.1 KB
# Investor Story ## The investor's reading order An investor does not read a BP like a product manual. The sequence is closer to: 1. Can I understand what this is in ten seconds? 2. Is the pain real, frequent, and expensive enough? 3. Is the product response specific and demonstrable? 4. Why can this become large now? 5. What has already been de-risked? 6. How does money enter the system? 7. Why will this team win? 8. What exactly does this financing buy? Every slide should reduce one uncertainty in that order. ## Three layers of positioning ### Layer 1: Product definition State the category or the completed job. It should be repeatable, not poetic. - Chinese: ideally 14–20 characters. - English: ideally 8–12 words. - One subject, one category/job, one clear beneficiary. - Do not lead with architecture, protocols, model names, or number of Agents. Draft three alternatives: 1. **Literal category** — “面向 X 的 Y”。 2. **Comparator** — “X 版的 Y” or “X for Y”. 3. **Category creation** — a new category with an immediate plain-language gloss. Choose the line a non-technical investor can repeat accurately after ten seconds. ### Layer 2: Market wedge Name the first buyer and the urgent use case. A credible wedge is narrower than the vision but large enough to prove demand. ```text Core wedge → adjacent users → long-term market ``` Do not confuse the wedge with the final market, or describe the final market as the current customer base. ### Layer 3: Vision Explain the structural change that makes the company matter. Vision earns its place after the product and wedge are clear. ## Product vs. implementation Ask: “If this mechanism changed tomorrow, would the customer still buy the result?” - If yes, it is implementation and should not define the company. - If no, it may be the category or moat. Examples of implementation-heavy framing: - number of Agents; - local vs. cloud runtime without explaining user benefit; - branch/worktree selection; - model/provider list; - architecture components. Translate them into the user consequence: continuity, control, trust, speed, cost, collaboration, or creative freedom. ## Before / after test | Weak | Better | |---|---| | “We integrate many models and Agents.” | “One workspace keeps AI work controllable from idea to delivery.” | | “Local-first multi-Agent orchestration.” | “Your work, context, and choices stay portable while AI does the execution.” | | “Everyone can command an Agent team.” | “Creators can reliably turn intent into finished digital products.” | The “better” line is still a hypothesis. It must match the actual product and buyer. ## Narrative red flags - The first three slides require a glossary. - The one-liner is a slogan with no product noun or job. - The company is defined by a feature available in every model vendor. - The market slide appears before the buyer is clear. - The deck claims “no competitors” or makes strong competitors look foolish. - Vision, TAM, and product roadmap describe three different businesses. - The financing ask does not connect to the key risks still unproven. -
review-rubric.md 2.3 KB
# BP Review Rubric ## Content score (100) | Dimension | Weight | Pass condition | |---|---:|---| | Story structure | 25 | All 12 investor questions are answered in a coherent order | | Investor readability | 20 | Product is clear in ten seconds; headlines state conclusions | | Evidence and data hygiene | 25 | Core claims trace to sources; assumptions are labeled | | Charts and visual specification | 20 | Each page names the right proof and chart, not decoration | | Financing delivery | 10 | Exact ask, use of funds, runway/window, and milestones connect | Target: 85+. A high score does not override a blocker. ## Blockers - Invented or untraceable core metrics. - Unlabeled market/revenue assumption. - No clear product definition or buyer. - No real product or experience proof when one exists. - No financing amount, use, or validation milestones. - Placeholder/TODO text. - Broken source, broken QR code, unreadable slide, or incorrect filename. ## Adversarial review lenses Review the deck as four people: 1. **Non-technical investor** — what remains unclear after ten seconds? 2. **Category expert** — which claims are technically or competitively naive? 3. **Skeptical partner** — what evidence is missing or overstated? 4. **Design director** — where does layout reduce trust or distort meaning? For every issue, report page, severity, why it matters, and exact revision. ## Visual QA checklist - [ ] Contact sheet reviewed at normal size. - [ ] One claim per slide. - [ ] Title/body/source hierarchy is consistent. - [ ] Body text is at least 20 pt. - [ ] No clipped, overlapping, or off-canvas elements. - [ ] CJK fonts render correctly. - [ ] Logos have consistent optical weight. - [ ] Images are not stretched or low resolution. - [ ] Charts match evidence ledger and include units/dates/sources. - [ ] Concept charts are labeled illustrative. - [ ] Product screenshots are genuine and legible. - [ ] QR codes decode from the final slide image. - [ ] Cover and final page are visually calm. - [ ] PPTX and PDF page counts match. - [ ] File names contain project, document type, and date/version. ## Report format Use `assets/templates/bp-review.md`. Lead with verdict and score, then blockers, page-level findings, evidence gaps, and final delivery checks. Do not begin with a long description of what the reviewer did. -
user-config.md 2.3 KB
# User Configuration This skill follows the portable agent skill profile contract. It must not assume a private workspace, personal absolute paths, or private brand assets. ## Resolution Order 1. Explicit CLI flags. 2. Environment variables. 3. Shared profile JSON. 4. Safe defaults such as the current working directory or `$HOME/Documents`. 5. Ask the user once for missing required fields. ## Shared Profile Default profile path: ```bash ${SKILL_PROFILE_PATH:-$HOME/.skill-publisher/skills/profile.json} ``` Example: ```json { "user": { "name": "Your Name", "language": "zh-CN", "timezone": "Asia/Shanghai" }, "workspace": { "root": "$HOME/projects", "output_dir": "$HOME/Documents/lov-skill-output" }, "brand": { "name": "Your Brand", "site": "https://example.com", "profile": "$HOME/.skill-publisher/skills/brand.json", "design_guide": "$HOME/.skill-publisher/skills/design-guide.md" } } ``` Environment variable overrides: | Variable | Meaning | |----------|---------| | `SKILL_PROFILE_PATH` | Path to the shared profile JSON | | `SKILLS_CONFIG_DIR` | Shared Skill Publisher skills config/data directory | | `SKILL_WORKSPACE_ROOT` | User workspace root | | `SKILL_OUTPUT_DIR` | Default generated output directory | | `SKILL_PROFILE_PATH` | Brand profile JSON or Markdown | | `SKILL_DESIGN_GUIDE` | Design guide path | BP-specific overrides take precedence over shared values: | Variable | Meaning | |----------|---------| | `SKILL_BP_OUTPUT_DIR` | Default output directory for BP workspaces | | `SKILL_BP_BRAND_PROFILE` | Brand profile used by the deck | | `SKILL_BP_DESIGN_GUIDE` | Visual design guide used by the deck | If none are set, use an explicit `--output` path or a project-local `business-plan/` directory. Never assume an author's private workspace. ## Implementation Notes - Store source descriptions in `evidence-ledger.md`; do not copy secrets into the BP workspace. - Prefer relative paths inside the workspace so it can be moved or shared. - Brand files remain user-owned inputs. The public Yoda assets are an example, not a default theme. - Scripts should accept explicit paths via CLI flags. - Missing profile fields should produce actionable errors. - Skill Publisher maintainer defaults belong in an optional profile, not in the workflow.
-
-
reports
-
yoda-bp-case-report.md 2.7 KB
# Yoda BP Case Quality Report Reviewed: 2026-07-23 Scope: 15-page seed investor deck Kit route: `bp-outline → bp-deck → bp-polish → targeted fixes` ## Verdict The final deck is materially stronger than the first versions because it defines a new product category in investor language, keeps the technical mechanisms subordinate to user value, uses real product evidence, and makes commercial uncertainty explicit. It is a credible seed-stage conversation document, with future updates required for retention, paid conversion, institutional contracts, and repeatable acquisition. Manual review score: **89 / 100** | Dimension | Score | Max | Note | |---|---:|---:|---| | Story structure | 23 | 25 | Complete 15-page arc; category education still needs a concise spoken bridge | | Investor readability | 18 | 20 | Conclusion-led and non-technical; several architecture terms remain | | Evidence and data hygiene | 20 | 25 | Build/use evidence is clear; retention and paid evidence remain missing | | Charts and visual specification | 19 | 20 | Strong chart language, real screenshots, clean hierarchy | | Financing delivery | 9 | 10 | Ask, use, and proof window are explicit; scenario economics need live validation | ## What improved | Area | Earlier state | Final state | |---|---|---| | Product definition | Multi-Agent coding workbench | Integrated Delegation Environment for the Agent era | | User value | Command an Agent team | Reliably delegate creation and delivery to AI | | Market | Developers as the ceiling | Super developers as wedge; AI-native creators and teams as expansion | | Product proof | Feature list | Task → Feature → evidence → delivery loop | | Traction | Cumulative signals mixed together | Build / use / pay evidence separated | | Commercial honesty | Monetization implied | Trials and zero paid conversion shown as validation gaps | | Visual language | Dense boxes and decoration | Warm-white editorial system, large conclusions, charts, screenshots | | Contact | Brand QR ambiguity | Product website + personal contact, both decoded after rendering | ## Remaining evidence gaps 1. Cohort retention and active-use definitions. 2. Relay trial activation, paid conversion, and renewal. 3. Institution-level pilot and annual contract evidence. 4. Channel-level CAC and conversion. 5. Bottom-up market buyer counts and price sensitivity. ## Reusable judgment The strongest move was not visual. It was changing the unit of analysis from “how many Agents run” to “how safely a person can delegate and accept responsibility for the result.” The visual system worked once each page had a precise claim to prove. See [the full case](../references/case-yoda.md) and the included contact sheet.
-
-
scripts
-
audit_bp.py 10.6 KB
#!/usr/bin/env python3 """Deterministic lint for investor BP outlines. The audit checks structure and evidence hygiene. It intentionally does not pretend to replace investor judgment or visual inspection. """ from __future__ import annotations import argparse import datetime as dt import json import re import sys from pathlib import Path from typing import Dict, List, Sequence, Tuple BEATS: Sequence[Tuple[str, Sequence[str]]] = ( ("product definition", ("product definition", "who you are", "定位", "你是谁", "是什么")), ("problem", ("problem", "pain", "用户问题", "具体问题", "痛点")), ("solution", ("solution", "how the product solves", "解决方案", "如何解决")), ("product demo", ("demo", "core experience", "product experience", "产品演示", "核心体验")), ("why now", ("why now", "为什么现在", "时机")), ("traction", ("traction", "validation", "proof", "真实验证", "进展", "留存")), ("business model", ("business model", "revenue model", "商业模式", "收入模式")), ("market", ("market", "tam", "sam", "som", "市场规模", "切入路径")), ("competition", ("competition", "competitive", "竞争", "差异化")), ("growth", ("growth", "go-to-market", "gtm", "增长计划", "获客")), ("team", ("team", "founder", "团队", "创始人")), ("financing", ("financing", "fundraise", "raise", "融资", "资金用途")), ) PLACEHOLDER_RE = re.compile(r"\b(?:TODO|TBD|FIXME|XXX)\b|待补|待确认|missing", re.IGNORECASE) SLIDE_RE = re.compile(r"^##\s+(?:Slide\s+)?(\d+)(?:\s+of\s+\d+)?\b.*$", re.IGNORECASE | re.MULTILINE) SLIDE_ZH_RE = re.compile(r"^##\s*第\s*(\d+)\s*页.*$", re.MULTILINE) HEADLINE_RE = re.compile(r"^(?:Headline|Title|标题|结论)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) EVIDENCE_RE = re.compile(r"^(?:Evidence|Source|Sources|证据|来源)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) VISUAL_RE = re.compile(r"^(?:Visual|Chart|图表|视觉)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Audit a 12–15 slide investor BP outline.") parser.add_argument("--input", required=True, help="outline.md or a workspace containing it") parser.add_argument("--output", help="Markdown/JSON report path") parser.add_argument("--format", choices=("markdown", "json"), default="markdown") parser.add_argument("--min-slides", type=int, default=12) parser.add_argument("--max-slides", type=int, default=15) parser.add_argument("--strict", action="store_true", help="Exit 1 below 85 or with blockers") return parser.parse_args() def resolve_input(raw: str) -> Path: path = Path(raw).expanduser().resolve() if path.is_dir(): path = path / "outline.md" if not path.is_file(): raise SystemExit(f"Outline not found: {path}") return path def parse_slides(text: str) -> List[Dict[str, str]]: matches = list(SLIDE_RE.finditer(text)) if not matches: matches = list(SLIDE_ZH_RE.finditer(text)) slides: List[Dict[str, str]] = [] for index, match in enumerate(matches): start = match.start() end = matches[index + 1].start() if index + 1 < len(matches) else len(text) block = text[start:end].strip() headline = HEADLINE_RE.search(block) evidence = EVIDENCE_RE.search(block) visual = VISUAL_RE.search(block) slides.append( { "number": match.group(1), "block": block, "headline": headline.group(1).strip() if headline else "", "evidence": evidence.group(1).strip() if evidence else "", "visual": visual.group(1).strip() if visual else "", } ) return slides def present(value: str) -> bool: return bool(value and not PLACEHOLDER_RE.search(value)) def contains_any(text: str, terms: Sequence[str]) -> bool: lowered = text.lower() return any(term.lower() in lowered for term in terms) def audit(text: str, slides: List[Dict[str, str]], minimum: int, maximum: int) -> Dict[str, object]: count = len(slides) covered = [name for name, terms in BEATS if contains_any(text, terms)] missing_beats = [name for name, _ in BEATS if name not in covered] headlines = sum(1 for slide in slides if present(slide["headline"])) evidence = sum(1 for slide in slides if present(slide["evidence"])) visuals = sum(1 for slide in slides if present(slide["visual"])) placeholder_count = len(PLACEHOLDER_RE.findall(text)) structure = min(25, len(covered) * 2 + (1 if minimum <= count <= maximum else 0)) headline_ratio = headlines / count if count else 0 readability = round(12 * headline_ratio) if contains_any(text, ("investor takeaway", "投资人 takeaway", "投资人结论")): readability += 4 if contains_any(text, ("one-line", "一句话", "product definition", "产品定位")): readability += 4 readability = min(20, readability) evidence_ratio = evidence / count if count else 0 evidence_score = round(14 * evidence_ratio) if contains_any(text, ("source", "来源", "evidence", "证据")): evidence_score += 4 if contains_any(text, ("assumption", "假设", "inference", "推断", "fact", "事实")): evidence_score += 4 if contains_any(text, ("as of", "截至", "updated", "更新")): evidence_score += 3 evidence_score = max(0, min(25, evidence_score - min(10, placeholder_count))) visual_ratio = visuals / count if count else 0 visual_score = round(14 * visual_ratio) if contains_any(text, ("screenshot", "产品截图", "真实截图", "demo")): visual_score += 3 if contains_any(text, ("chart", "图表", "axis", "坐标轴", "source note", "来源")): visual_score += 3 visual_score = min(20, visual_score) delivery = 0 if contains_any(text, ("financing ask", "融资金额", "raise", "融资")): delivery += 4 if contains_any(text, ("use of funds", "资金用途")): delivery += 3 if contains_any(text, ("milestone", "里程碑", "18–24", "18-24", "runway")): delivery += 3 blockers: List[str] = [] if not (minimum <= count <= maximum): blockers.append(f"Slide count is {count}; expected {minimum}–{maximum}.") if missing_beats: blockers.append("Missing investor story beats: " + ", ".join(missing_beats) + ".") if placeholder_count: blockers.append(f"Found {placeholder_count} placeholder or missing markers.") if "financing" in missing_beats: blockers.append("No clear financing ask.") if evidence_ratio < 0.75: blockers.append("Fewer than 75% of slides contain a non-placeholder evidence/source field.") score = structure + readability + evidence_score + visual_score + delivery score = max(0, min(100, score)) findings: List[str] = [] if headline_ratio < 1: findings.append(f"{count - headlines} slide(s) lack a conclusion headline.") if visual_ratio < 1: findings.append(f"{count - visuals} slide(s) lack an explicit visual/chart specification.") if evidence_ratio < 1: findings.append(f"{count - evidence} slide(s) lack an explicit evidence/source field.") if score >= 85 and not blockers: decision = "investor-ready for visual production" elif score >= 70: decision = "conditional — revise before rendering" else: decision = "not ready" return { "score": score, "decision": decision, "slide_count": count, "scorecard": { "story_structure": structure, "investor_readability": readability, "evidence_hygiene": evidence_score, "visual_specification": visual_score, "financing_delivery": delivery, }, "coverage": covered, "missing_beats": missing_beats, "blockers": blockers, "findings": findings, "placeholder_count": placeholder_count, } def markdown_report(result: Dict[str, object], source: Path) -> str: scorecard = result["scorecard"] blockers = result["blockers"] or ["None detected by deterministic audit."] findings = result["findings"] or ["No structural findings detected."] missing = result["missing_beats"] or ["None"] lines = [ "# BP Audit Report", "", f"- Source: `{source}`", f"- Reviewed: {dt.date.today().isoformat()}", f"- Score: **{result['score']} / 100**", f"- Decision: **{result['decision']}**", f"- Slides: {result['slide_count']}", "", "## Scorecard", "", "| Dimension | Score | Max |", "|---|---:|---:|", f"| Story structure | {scorecard['story_structure']} | 25 |", f"| Investor readability | {scorecard['investor_readability']} | 20 |", f"| Evidence and data hygiene | {scorecard['evidence_hygiene']} | 25 |", f"| Charts and visual specification | {scorecard['visual_specification']} | 20 |", f"| Financing delivery | {scorecard['financing_delivery']} | 10 |", "", "## Blockers", "", ] lines.extend(f"- {item}" for item in blockers) lines.extend(["", "## Findings", ""]) lines.extend(f"- {item}" for item in findings) lines.extend(["", "## Missing story beats", ""]) lines.extend(f"- {item}" for item in missing) lines.extend( [ "", "## Required visual review", "", "This script cannot validate typography, optical alignment, chart truth, screenshot", "legibility, or QR decoding. Review every final rendered page using the visual QA", "checklist in `references/review-rubric.md`.", "", ] ) return "\n".join(lines) def main() -> int: args = parse_args() source = resolve_input(args.input) text = source.read_text(encoding="utf-8") slides = parse_slides(text) result = audit(text, slides, args.min_slides, args.max_slides) if args.format == "json": report = json.dumps(result, ensure_ascii=False, indent=2) + "\n" else: report = markdown_report(result, source) if args.output: output = Path(args.output).expanduser().resolve() output.parent.mkdir(parents=True, exist_ok=True) output.write_text(report, encoding="utf-8") print(f"Wrote BP audit report: {output}") else: print(report, end="" if report.endswith("\n") else "\n") if args.strict and (int(result["score"]) < 85 or bool(result["blockers"])): return 1 return 0 if __name__ == "__main__": sys.exit(main()) -
build_workbuddy_connector.py 14.6 KB
#!/usr/bin/env python3 """Build a validated WorkBuddy skill-only Connector distribution.""" from __future__ import annotations import argparse import json import re import shutil import sys import zipfile from pathlib import Path ROOT = Path(__file__).resolve().parent.parent WORKBUDDY_DIR = ROOT / "workbuddy" GIT_URL = "https://example.com/skills/bp-skill" SKILLS = { "lov-bp": { "source": ROOT, "version": "0.2.1", "description": ( "根据项目材料和用户目标,按需编排投资人商业计划书大纲、融资演示文稿、" "证据核验与专业审校流程;适用于完整 BP、融资 PPT、已有材料续作和逐页润色。" ), }, "lov-bp-outline": { "source": ROOT / "skills" / "bp-outline", "version": "0.1.0", "description": ( "从项目材料提取事实和证据,形成投资人叙事、证据账本与商业计划书大纲;" "适用于首次融资梳理、已有材料重构、市场数据核验和投资人页序设计。" ), }, "lov-bp-deck": { "source": ROOT / "skills" / "bp-deck", "version": "0.1.0", "description": ( "将已确认的商业计划书大纲制作成结构清晰、证据可信的专业融资演示文稿;" "覆盖视觉风格、图表、品牌素材、可编辑 PPTX、PDF 和全稿预览交付。" ), }, "lov-bp-polish": { "source": ROOT / "skills" / "bp-polish", "version": "0.1.0", "description": ( "审查并润色已有商业计划书大纲、PPT 或 PDF,输出逐页修改与定向重做建议;" "覆盖事实证据、投资逻辑、文案、图表、版式和最终交付质量。" ), }, } MODULE_SKILLS = { "bp-outline": "lov-bp-outline", "bp-deck": "lov-bp-deck", "bp-polish": "lov-bp-polish", } ROOT_RESOURCE_FILES = ("kit.yaml",) ROOT_RESOURCE_DIRS = ("assets", "cases", "references", "scripts") SKILL_RESOURCES = ("assets", "references", "scripts") IGNORED_PATTERNS = ("__pycache__", "*.pyc", "*.pyo", ".DS_Store") def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Build the Skill Publisher BP WorkBuddy Connector package." ) parser.add_argument( "--output-dir", type=Path, required=True, help="New directory to create. It must not already exist.", ) parser.add_argument( "--zip-path", type=Path, help="Optional ZIP path. Defaults to <output-dir>.zip.", ) return parser.parse_args() def split_frontmatter(text: str) -> tuple[str, str]: if not text.startswith("---\n"): raise ValueError("SKILL.md is missing YAML frontmatter") marker = text.find("\n---\n", 4) if marker < 0: raise ValueError("SKILL.md frontmatter is not closed") return text[4:marker], text[marker + 5 :] def workbuddy_skill_text( name: str, description: str, version: str, source_text: str ) -> str: _, body = split_frontmatter(source_text) if name == "lov-bp-deck": body = body.replace( "### Step 0: Resolve input and dependency", "### Step 0: Resolve input and WorkBuddy capabilities", ) body = body.replace( "Resolve `lov-any2deck` through the active Agent Skills environment; do not\n" "assume an author's private installation path.", "Use WorkBuddy's available presentation and document-generation capabilities. " "Do not\nassume an author's private installation path or require a separate " "Skill Publisher Skill.", ) body = body.replace( "### Step 4: Generate with `lov-any2deck`", "### Step 4: Generate with WorkBuddy", ) body = body.replace( "Invoke `lov-any2deck` using the approved outline and chosen style. Preserve the\n" "BP page order and evidence notes.", "Use WorkBuddy's presentation-generation capability with the approved outline and " "chosen\nstyle. Preserve the BP page order and evidence notes.", ) frontmatter = ( "---\n" f"name: {name}\n" f"description: {json.dumps(description, ensure_ascii=False)}\n" f'version: "{version}"\n' "author: Skill Publisher\n" "source_type: git\n" f"git_url: {GIT_URL}\n" "---\n" ) return frontmatter + body def copy_resources(source_dir: Path, target_dir: Path) -> None: for relative in SKILL_RESOURCES: source = source_dir / relative if source.exists(): shutil.copytree( source, target_dir / relative, ignore=shutil.ignore_patterns(*IGNORED_PATTERNS), ) def write_skill( name: str, config: dict[str, object], source_dir: Path, target_dir: Path ) -> None: target_dir.mkdir(parents=True) source_text = (source_dir / "SKILL.md").read_text(encoding="utf-8") target_text = workbuddy_skill_text( name=name, description=str(config["description"]), version=str(config["version"]), source_text=source_text, ) (target_dir / "SKILL.md").write_text(target_text, encoding="utf-8") def copy_skill(name: str, config: dict[str, object], skills_dir: Path) -> None: source_dir = Path(config["source"]) target_dir = skills_dir / name write_skill(name, config, source_dir, target_dir) if name == "lov-bp": for relative in ROOT_RESOURCE_FILES: source = ROOT / relative target = target_dir / relative target.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(source, target) for relative in ROOT_RESOURCE_DIRS: ignored = list(IGNORED_PATTERNS) if relative == "scripts": ignored.append("build_workbuddy_connector.py") shutil.copytree( ROOT / relative, target_dir / relative, ignore=shutil.ignore_patterns(*ignored), ) for module_id, module_name in MODULE_SKILLS.items(): module_config = SKILLS[module_name] module_source = Path(module_config["source"]) module_target = target_dir / "skills" / module_id write_skill(module_name, module_config, module_source, module_target) copy_resources(module_source, module_target) return copy_resources(source_dir, target_dir) def write_zip(output_dir: Path, zip_path: Path) -> None: if zip_path.exists(): raise FileExistsError(f"ZIP already exists: {zip_path}") zip_path.parent.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as archive: for path in sorted(output_dir.rglob("*")): if path.is_file(): archive.write(path, Path(output_dir.name) / path.relative_to(output_dir)) def write_individual_zips(output_dir: Path, individual_dir: Path) -> None: if individual_dir.exists(): raise FileExistsError(f"individual ZIP directory already exists: {individual_dir}") individual_dir.mkdir(parents=True) for skill_dir in sorted((output_dir / "skills").iterdir()): zip_path = individual_dir / f"{skill_dir.name}.zip" with zipfile.ZipFile( zip_path, "w", compression=zipfile.ZIP_DEFLATED ) as archive: for path in sorted(skill_dir.rglob("*")): if path.is_file(): archive.write( path, Path(skill_dir.name) / path.relative_to(skill_dir) ) def validate_frontmatter(skill_file: Path) -> list[str]: errors: list[str] = [] frontmatter, body = split_frontmatter(skill_file.read_text(encoding="utf-8")) for field in ( "name", "description", "version", "author", "source_type", "git_url", ): if not re.search(rf"(?m)^{re.escape(field)}:\s*.+$", frontmatter): errors.append(f"{skill_file}: missing {field}") if not re.search(r"(?m)^source_type:\s*git\s*$", frontmatter): errors.append(f"{skill_file}: source_type must be git") if not re.search( rf"(?m)^git_url:\s*{re.escape(GIT_URL)}\s*$", frontmatter ): errors.append(f"{skill_file}: git_url must be {GIT_URL}") if not body.strip(): errors.append(f"{skill_file}: empty body") return errors def validate_package(output_dir: Path) -> None: errors: list[str] = [] meta_path = output_dir / "connector-meta.json" meta = json.loads(meta_path.read_text(encoding="utf-8")) required = ( "name", "name_en", "description", "description_zh", "description_en", "source", "type", "version", "examples_zh", "examples_en", "source_type", "git_url", ) for field in required: if field not in meta: errors.append(f"connector-meta.json: missing {field}") if meta.get("type") != "skill-only": errors.append('connector-meta.json: type must be "skill-only"') if not re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", str(meta.get("source", ""))): errors.append("connector-meta.json: source must be kebab-case") if meta.get("source_type") != "git": errors.append('connector-meta.json: source_type must be "git"') if meta.get("git_url") != GIT_URL: errors.append(f"connector-meta.json: git_url must be {GIT_URL}") for field in ("examples_zh", "examples_en"): value = meta.get(field) if not isinstance(value, list) or not 2 <= len(value) <= 5: errors.append(f"connector-meta.json: {field} must contain 2-5 examples") skill_files = sorted((output_dir / "skills").glob("*/SKILL.md")) if len(skill_files) != len(SKILLS): errors.append(f"expected {len(SKILLS)} SKILL.md files, found {len(skill_files)}") for skill_file in skill_files: errors.extend(validate_frontmatter(skill_file)) for name, config in SKILLS.items(): description = str(config["description"]) if not 50 <= len(description) <= 200: errors.append( f"{name}: description must contain 50-200 characters, " f"found {len(description)}" ) forbidden_files = [ path for path in output_dir.rglob("*") if path.name == "__pycache__" or path.suffix.lower() in {".pyc", ".pyo"} ] for path in forbidden_files: errors.append(f"package contains generated Python artifact: {path}") all_text = "\n".join( path.read_text(encoding="utf-8", errors="ignore") for path in output_dir.rglob("*") if path.is_file() and path.suffix.lower() in {".md", ".json", ".yaml", ".yml", ".svg"} ) if "${SKILL_USER_ROOT}" in all_text: errors.append("package contains a private absolute path") deck_text = ( output_dir / "skills" / "lov-bp-deck" / "SKILL.md" ).read_text(encoding="utf-8") if "Requires lov-any2deck" in deck_text or "Invoke `lov-any2deck`" in deck_text: errors.append("WorkBuddy deck Skill still has a hard any2deck runtime dependency") root_text = ( output_dir / "skills" / "lov-bp" / "SKILL.md" ).read_text(encoding="utf-8") if "$KIT_DIR/../lov-bp-" in root_text: errors.append("WorkBuddy controller points at external sibling Skills") if "## Triggers" not in root_text: errors.append("WorkBuddy controller is missing an explicit Triggers section") controller_dir = output_dir / "skills" / "lov-bp" kit_text = (controller_dir / "kit.yaml").read_text(encoding="utf-8") if not re.search(r"(?m)^source_type:\s*git\s*$", kit_text): errors.append("lov-bp/kit.yaml: source_type must be git") if not re.search(rf"(?m)^git_url:\s*{re.escape(GIT_URL)}\s*$", kit_text): errors.append(f"lov-bp/kit.yaml: git_url must be {GIT_URL}") for module_id, module_name in MODULE_SKILLS.items(): module_skill = controller_dir / "skills" / module_id / "SKILL.md" if not module_skill.is_file(): errors.append(f"controller is missing module: skills/{module_id}/SKILL.md") continue errors.extend(validate_frontmatter(module_skill)) module_frontmatter, _ = split_frontmatter( module_skill.read_text(encoding="utf-8") ) if not re.search( rf"(?m)^name:\s*{re.escape(module_name)}\s*$", module_frontmatter ): errors.append(f"{module_skill}: expected name {module_name}") expected_reference = f"$KIT_DIR/skills/{module_id}/SKILL.md" if expected_reference not in root_text: errors.append(f"controller does not reference {expected_reference}") case_reference = controller_dir / "references" / "case-yoda.md" case_text = case_reference.read_text(encoding="utf-8") for relative_link in re.findall(r"!\[[^\]]*\]\(([^)]+)\)", case_text): linked_path = (case_reference.parent / relative_link).resolve() if not linked_path.is_file(): errors.append(f"broken case image reference: {relative_link}") if errors: raise ValueError("WorkBuddy package validation failed:\n- " + "\n- ".join(errors)) def build(output_dir: Path, zip_path: Path, individual_dir: Path) -> None: if output_dir.exists(): raise FileExistsError(f"output directory already exists: {output_dir}") output_dir.mkdir(parents=True) for filename in ("connector-meta.json", "icon.svg", "README.md", "SUBMISSION.md"): shutil.copy2(WORKBUDDY_DIR / filename, output_dir / filename) skills_dir = output_dir / "skills" skills_dir.mkdir() for name, config in SKILLS.items(): copy_skill(name, config, skills_dir) validate_package(output_dir) write_zip(output_dir, zip_path) write_individual_zips(output_dir, individual_dir) print(f"connector_dir={output_dir}") print(f"connector_zip={zip_path}") print(f"individual_zips={individual_dir}") print(f"skills={len(SKILLS)}") print("validation=passed") def main() -> int: args = parse_args() output_dir = args.output_dir.expanduser().resolve() zip_path = ( args.zip_path.expanduser().resolve() if args.zip_path else Path(f"{output_dir}.zip") ) individual_dir = output_dir.parent / f"{output_dir.name}-individual" try: build(output_dir, zip_path, individual_dir) except (FileExistsError, ValueError, OSError, json.JSONDecodeError) as error: print(f"error: {error}", file=sys.stderr) return 1 return 0 if __name__ == "__main__": raise SystemExit(main()) -
init_bp.py 6.3 KB
#!/usr/bin/env python3 """Create a portable investor-BP workspace without overwriting existing work.""" from __future__ import annotations import argparse import datetime as dt import json import os import re import sys from pathlib import Path from typing import Any, Dict, Optional def expand_path(value: str) -> Path: return Path(os.path.expandvars(os.path.expanduser(value))).resolve() def slugify(value: str) -> str: normalized = re.sub(r"[^\w\u4e00-\u9fff]+", "-", value.strip().lower(), flags=re.UNICODE) return normalized.strip("-_") or "project" def load_profile(path: Path) -> Dict[str, Any]: if not path.exists(): return {} try: data = json.loads(path.read_text(encoding="utf-8")) except (OSError, json.JSONDecodeError) as exc: raise SystemExit(f"Cannot read profile {path}: {exc}") from exc if not isinstance(data, dict): raise SystemExit(f"Profile must be a JSON object: {path}") return data def nested(data: Dict[str, Any], *keys: str) -> Optional[str]: current: Any = data for key in keys: if not isinstance(current, dict): return None current = current.get(key) return current if isinstance(current, str) and current.strip() else None def resolve_output(args: argparse.Namespace, profile: Dict[str, Any]) -> Path: if args.output: return expand_path(args.output) skill_output = os.environ.get("SKILL_BP_OUTPUT_DIR") if skill_output: return expand_path(skill_output) / f"{slugify(args.name)}-business-plan" shared_output = os.environ.get("SKILL_OUTPUT_DIR") if shared_output: return expand_path(shared_output) / f"{slugify(args.name)}-business-plan" profile_output = nested(profile, "workspace", "output_dir") if profile_output: return expand_path(profile_output) / f"{slugify(args.name)}-business-plan" return (Path.cwd() / "business-plan").resolve() def resolve_optional(explicit: Optional[str], env_name: str, profile: Dict[str, Any], key: str) -> str: value = explicit or os.environ.get(env_name) or nested(profile, "brand", key) return str(expand_path(value)) if value else "not configured" def render_template(template: Path, destination: Path, values: Dict[str, str]) -> None: text = template.read_text(encoding="utf-8") for key, value in values.items(): text = text.replace("{{" + key + "}}", value) destination.write_text(text, encoding="utf-8") def ensure_safe_destination(output: Path) -> None: home = Path.home().resolve() if output in {Path("/").resolve(), home}: raise SystemExit(f"Refusing to use broad destination: {output}") if output.exists() and any(output.iterdir()): raise SystemExit( f"Destination already contains files: {output}\n" "Continue in that workspace manually or choose a new --output path." ) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Create a source-backed 12–15 slide investor-BP workspace." ) parser.add_argument("--name", required=True, help="Project or company name") parser.add_argument( "--stage", default="seed", choices=("pre-seed", "seed", "angel", "pre-a", "series-a", "growth", "other"), help="Financing stage (default: seed)", ) parser.add_argument("--output", help="Exact workspace directory") parser.add_argument("--profile", help="Shared Skill Publisher skills profile JSON") parser.add_argument("--brand-profile", help="Brand profile file") parser.add_argument("--design-guide", help="Design guide file") parser.add_argument("--json", action="store_true", help="Print machine-readable result") return parser.parse_args() def main() -> int: args = parse_args() profile_path = expand_path( args.profile or os.environ.get("SKILL_PROFILE_PATH") or "$HOME/.skill-publisher/skills/profile.json" ) profile = load_profile(profile_path) output = resolve_output(args, profile) ensure_safe_destination(output) skill_root = Path(__file__).resolve().parent.parent template_root = skill_root / "assets" / "templates" required_templates = { "brief.md": template_root / "brief.md", "evidence-ledger.md": template_root / "evidence-ledger.md", "outline.md": template_root / "outline.md", "reports/bp-review.md": template_root / "bp-review.md", } missing = [str(path) for path in required_templates.values() if not path.exists()] if missing: raise SystemExit("Missing templates:\n- " + "\n- ".join(missing)) output.mkdir(parents=True, exist_ok=True) (output / "assets").mkdir(exist_ok=True) (output / "reports").mkdir(exist_ok=True) (output / "assets" / ".gitkeep").touch() today = dt.date.today().isoformat() values = { "PROJECT_NAME": args.name.strip(), "STAGE": args.stage, "DATE": today, "VERSION": "draft-0.1", } created = [] for relative, template in required_templates.items(): destination = output / relative render_template(template, destination, values) created.append(str(destination)) brand_profile = resolve_optional( args.brand_profile, "SKILL_BP_BRAND_PROFILE", profile, "profile" ) design_guide = resolve_optional( args.design_guide, "SKILL_BP_DESIGN_GUIDE", profile, "design_guide" ) source_note = output / "source-config.md" source_note.write_text( "# BP Source Configuration\n\n" f"- Project: {args.name.strip()}\n" f"- Stage: {args.stage}\n" f"- Created: {today}\n" f"- Brand profile: {brand_profile}\n" f"- Design guide: {design_guide}\n\n" "Do not store credentials or private customer data in this file.\n", encoding="utf-8", ) created.append(str(source_note)) result = { "project": args.name.strip(), "stage": args.stage, "workspace": str(output), "created": created, } if args.json: print(json.dumps(result, ensure_ascii=False, indent=2)) else: print(f"Created investor-BP workspace: {output}") for path in created: print(f" - {path}") print("Next: replace missing/TODO items with sourced evidence, then run audit_bp.py.") return 0 if __name__ == "__main__": sys.exit(main())
-
-
skills
-
bp-deck
-
references
-
charts-and-visuals.md 2.8 KB
# Charts and Visual Standards ## Visual principle The design should combine product-launch clarity, consulting-report credibility, and the evidence texture of a real startup. “Premium” comes from editing and hierarchy, not decoration. ## Baseline - 16:9 landscape. - White or warm-gray background and one brand accent. - Dark headline, large conclusion, body text at least 20 pt. - One dominant visual per page and roughly one-third breathing room. - Product screenshots, customer scenes, workflows, interview evidence, and orders before stock photography. - Do not stretch logos; align by optical weight, not only bounding boxes. ## Choose the proof, then the chart | Claim | Recommended visual | |---|---| | Process is fragmented | Before workflow / swimlane | | Product compresses work | Before/after or time-to-outcome bars | | Category is shifting | Timeline or converging trends | | Product closes a loop | Circular process with evidence rail | | Product has depth | Layered architecture with customer consequences | | Traction has stages | Evidence ladder or funnel | | Retention is improving | Cohort heatmap or retention curves | | Revenue expands with value | Value/revenue staircase | | Market bridges to revenue | Buyer bridge or concentric market with formula | | Competitive position | 2×2 only when axes are defensible; otherwise comparison table | | Growth has two entry points | Dual funnel / phased path | | Financing buys proof | Use-of-funds donut + milestone gates | ## Chart requirements Every quantitative chart needs: - title containing the conclusion; - axes and units when applicable; - time period and as-of date; - legend where more than one series exists; - source or evidence IDs; - assumptions beside the number, not hidden in notes; - “illustrative / 示意” label for non-measured conceptual curves. Avoid 3D charts, gauges, decorative radar charts, dual axes without necessity, and large coordinate systems with tiny data differences. ## Product screenshots - Use real current screenshots. - Crop to the workflow being proved. - Add 1–3 callouts maximum. - Keep interface text legible at normal presentation size. - State what is live, prototype, planned, or illustrative. - Do not reconstruct a fake UI when the real product exists. ## Cover A seed BP cover should usually contain only: - product/company name or logo; - one investor-readable definition; - optional financing stage/date. Use a single centered composition or a strong branded band. Do not fill the cover with feature tags, funding terms, or multiple logos competing for attention. ## Final page The final page should answer: - how much is being raised; - equity/structure when disclosed; - runway or time window; - 2–4 proofs the financing will buy; - one clear contact action. If QR codes are present, decode the final rendered image—not only the source asset. -
user-config.md 2.3 KB
# User Configuration This skill follows the portable agent skill profile contract. It must not assume a private workspace, personal absolute paths, or private brand assets. ## Resolution Order 1. Explicit CLI flags. 2. Environment variables. 3. Shared profile JSON. 4. Safe defaults such as the current working directory or `$HOME/Documents`. 5. Ask the user once for missing required fields. ## Shared Profile Default profile path: ```bash ${SKILL_PROFILE_PATH:-$HOME/.skill-publisher/skills/profile.json} ``` Example: ```json { "user": { "name": "Your Name", "language": "zh-CN", "timezone": "Asia/Shanghai" }, "workspace": { "root": "$HOME/projects", "output_dir": "$HOME/Documents/lov-skill-output" }, "brand": { "name": "Your Brand", "site": "https://example.com", "profile": "$HOME/.skill-publisher/skills/brand.json", "design_guide": "$HOME/.skill-publisher/skills/design-guide.md" } } ``` Environment variable overrides: | Variable | Meaning | |----------|---------| | `SKILL_PROFILE_PATH` | Path to the shared profile JSON | | `SKILLS_CONFIG_DIR` | Shared Skill Publisher skills config/data directory | | `SKILL_WORKSPACE_ROOT` | User workspace root | | `SKILL_OUTPUT_DIR` | Default generated output directory | | `SKILL_PROFILE_PATH` | Brand profile JSON or Markdown | | `SKILL_DESIGN_GUIDE` | Design guide path | BP-specific overrides take precedence over shared values: | Variable | Meaning | |----------|---------| | `SKILL_BP_OUTPUT_DIR` | Default output directory for BP workspaces | | `SKILL_BP_BRAND_PROFILE` | Brand profile used by the deck | | `SKILL_BP_DESIGN_GUIDE` | Visual design guide used by the deck | If none are set, use an explicit `--output` path or a project-local `business-plan/` directory. Never assume an author's private workspace. ## Implementation Notes - Store source descriptions in `evidence-ledger.md`; do not copy secrets into the BP workspace. - Prefer relative paths inside the workspace so it can be moved or shared. - Brand files remain user-owned inputs. The public Yoda assets are an example, not a default theme. - Scripts should accept explicit paths via CLI flags. - Missing profile fields should produce actionable errors. - Skill Publisher maintainer defaults belong in an optional profile, not in the workflow.
-
-
CHANGELOG.md 317 B
# Changelog All notable changes to this skill are documented here. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning: [SemVer](https://semver.org/) ## [0.2.0] - 2026-08-24 ### Added - add the shared feedback-classification and approval-invalidation gate used by every LovStudio Skill -
README.md 522 B
# BP 大师 · BP Master  把已经确认的 BP 大纲做成专业 PPTX、PDF 和全稿预览。 ## 安装 ```bash npx skills add bp-deck -g -y ``` 依赖免费的 `lov-any2deck`。 ## 使用 ```text $lov-bp-deck ./business-plan/outline.md $lov-bp-deck ./outline.md --style minimal $lov-bp-deck 重做第 6 和第 12 页,保持其他页面不变 ``` ## 交付物 - PPTX - PDF - 全部页面图片 - 全稿预览 - `deck-manifest.md` ## License MIT -
SKILL.md 6.2 KB
--- name: lov-bp-deck description: > Turn an approved investor BP outline into a clean, professional slide deck with deliberate style selection, real product evidence, charts, branding, PPTX/PDF, and a full-deck preview. Use when the narrative already exists and the user wants PPT production, visual style exploration, slide regeneration, or export. Trigger on "把 BP 大纲做成 PPT", "选择 BP 风格", "生成融资 PPT", "重做第几页", "BP deck", "pitch deck design", "render investor slides", or "export BP PDF". license: MIT metadata: author: contributors version: "0.2.0" tags: business-plan pitch-deck pptx pdf style charts branding slides --- # BP 大师 · BP Master Produce the presentation after the investment narrative is approved. This skill owns style selection, visual specification, rendering, export, and final-image QA; it does not invent missing business evidence. ## Input Gate Required: - approved `outline.md` or equivalent page-by-page narrative; - evidence/source notes for core claims; - project/company name. Recommended: - brand logo and primary color; - real product screenshots; - founder/team photos; - source data for charts; - website/contact destination and QR asset. If the outline lacks a clear product definition, financing ask, or source-backed core numbers, stop and recommend `lov-bp-outline` before rendering. ## Output Contract ```text business-plan/ ├── outline.md ├── assets/ ├── deck-manifest.md ├── 01-slide-cover.png ├── ... ├── project-bp.pptx ├── project-bp.pdf └── project-bp-preview.png ``` ## Workflow (MANDATORY) ### Step 0: Resolve input and dependency Resolve this skill directory as `SKILL_DIR` and locate the user's approved outline. Resolve `lov-any2deck` through the active Agent Skills environment; do not assume an author's private installation path. Read `references/user-config.md` and `references/charts-and-visuals.md`. ### Step 1: Lock the narrative Do not rewrite the storyline during style exploration. Check: - 12–15 slides unless the user explicitly chooses otherwise; - one conclusion per slide; - evidence IDs/source notes on core claims; - chart type and exact data mapping; - no placeholder or fabricated metric. Send evidence blockers back to `bp-outline`. Small copy corrections may be recorded in `deck-manifest.md` and applied without changing the thesis. ### Step 2: Select style with minimal friction Infer style from brand, audience, reference images, and the outline. If the user has not selected a direction, use `AskUserQuestion` once with 2–3 concrete options. Recommended first option for seed-stage investors: **Clean editorial** — white/warm-gray background, one brand color, dark conclusion headlines, real screenshots, consulting-grade charts, and restrained decoration. Alternative options: - **Product keynote** — more whitespace and product/demo emphasis; - **Consulting report** — denser evidence and chart emphasis; - **Reference-led** — derive a design system from a supplied visual reference. If the user says “按推荐方案” or “不要问”, use clean editorial. ### Step 3: Write `deck-manifest.md` Record before rendering: - outline path and version; - audience, language, slide count, and presentation duration; - style name, palette, typography, spacing, and safe margins; - logos, screenshots, photos, data, and QR assets; - naming convention; - expected PPTX/PDF/preview paths; - any slide intentionally marked illustrative. ### Step 4: Generate with `lov-any2deck` Invoke `lov-any2deck` using the approved outline and chosen style. Preserve the BP page order and evidence notes. Use 16:9, body text at least 20 pt, and a single dominant visual per page. Prefer: - real product screenshots and user scenes; - process diagrams and evidence ladders; - source-backed charts with axes, units, dates, legends, and notes; - simple cover and one clear final contact action. Avoid stock-photo filler, decorative card walls, gradients, tiny source text, fake dashboards, and unsourced growth curves. ### Step 5: Export and inspect Produce editable PPTX, PDF, all slide images, and one full-deck preview. Review every page at presentation size: - no clipped/overlapping text or broken CJK; - title/body/source hierarchy is consistent; - logos are optically balanced; - images are not stretched; - chart values match the evidence ledger; - product screenshots are genuine and legible; - QR codes decode from the final rendered slide; - PPTX and PDF page counts match; - filenames include project, document type, and date/version. Regenerate only affected slides. Record the result in `deck-manifest.md`. ### Step 6: Handoff Return PPTX, PDF, preview, manifest, and any unresolved visual risks. Recommend `lov-bp-polish` for an adversarial final review. ## Recommended Next Step ```text $lov-bp-polish ./business-plan/project-bp.pdf --full ``` ## Runtime context (shared) 运行前读取本 Skill 包的 `skill.yaml`,由宿主提供 `skill-runtime/v1` 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。 - 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。 - `required: true` 字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。 - 报错提供可复制的 `context_id`、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。 ## 通用反馈闭环 用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行: 1. 先判断意见是 `task-specific`(仅本次)还是 `reusable`(可跨任务复用)。 2. `task-specific` 只修改当前任务,不改 Skill。 3. `reusable` 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。 4. 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。 5. `reusable` 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。
-
-
bp-outline
-
assets
-
templates
-
brief.md 1.2 KB
# {{PROJECT_NAME}} — BP Brief Updated: {{DATE}} ## Financing task - Audience: early-stage investors who may not know the technology - Stage: {{STAGE}} - Target presentation: 12–15 slides / 8–10 minutes - Financing ask: missing - Instrument / equity: missing - Validation window: 18–24 months (assumption until confirmed) ## Product definition - One-line product definition: missing - Category: missing - Core user / buyer: missing - Core job to be done: missing - Early wedge: missing - Adjacent users: missing - Long-term market: missing ## Investment thesis - Problem: missing - Product insight: missing - Why now: missing - Evidence already proven: missing - Evidence not yet proven: missing - Business model: missing - Defensibility: missing - Founder–market/product fit: missing ## Required source material - [ ] Product docs and current screenshots - [ ] Current usage / retention / revenue data - [ ] Customer interviews, pilots, orders, or support evidence - [ ] Competitor product pages and pricing - [ ] Market data with source and date - [ ] Team profile and execution evidence - [ ] Financing amount, use of funds, and milestones - [ ] Brand assets and contact action -
evidence-ledger.md 1.5 KB
# {{PROJECT_NAME}} — Evidence Ledger Updated: {{DATE}} Status values: `fact`, `inference`, `assumption`, `missing`. | ID | Claim | Status | Source | As of | Slide | Notes / next action | |---|---|---|---|---|---|---| | E-001 | Product definition | missing | — | {{DATE}} | 1 | Validate with product and buyer language | | E-002 | Core problem evidence | missing | — | {{DATE}} | 2 | Add interview, workflow, or measured cost | | E-003 | Product workflow | missing | — | {{DATE}} | 3–4 | Add real screenshot and current capability boundary | | E-004 | Why-now evidence | missing | — | {{DATE}} | 5 | Verify current primary sources | | E-005 | Traction | missing | — | {{DATE}} | 6 | Separate install, active, retained, trial, and paid | | E-006 | Business model | assumption | — | {{DATE}} | 7 | Identify buyer, offer, price, and sales motion | | E-007 | TAM/SAM/SOM | missing | — | {{DATE}} | 8 | Build bottom-up and cross-check top-down | | E-008 | Competition | missing | — | {{DATE}} | 9 | Verify current product pages and pricing | | E-009 | Growth plan | assumption | — | {{DATE}} | 10 | Tie channels to measurable capacity | | E-010 | Team fit | missing | — | {{DATE}} | 11 | Add execution and domain evidence | | E-011 | Financing ask | missing | — | {{DATE}} | 12 | Amount, structure, use, window, milestones | ## Source notes Record definitions, denominators, query dates, screenshots, and exclusions here. Do not paste credentials or private customer information. -
outline.md 3.1 KB
# {{PROJECT_NAME}} — Investor BP Outline Stage: {{STAGE}} Updated: {{DATE}} Audience: Early-stage investors Length: 12–15 slides / 8–10 minutes ## Slide 1 — Product definition Headline: TODO — one investor-readable definition Investor takeaway: TODO Evidence: E-001 Visual: clean cover; product/company name + definition Speaker purpose: establish what the company is in ten seconds Gap: E-001 ## Slide 2 — Concrete problem Headline: TODO — state the user pain as a conclusion Investor takeaway: TODO Evidence: E-002 Visual: before workflow, direct quote, or measured pain Speaker purpose: prove frequency and cost Gap: E-002 ## Slide 3 — Solution Headline: TODO — show the changed user outcome Investor takeaway: TODO Evidence: E-003 Visual: before/after or solution flow Speaker purpose: connect pain to the product insight Gap: E-003 ## Slide 4 — Product demo Headline: TODO — describe what the real experience proves Investor takeaway: TODO Evidence: E-003 Visual: real product screenshot or demo sequence Speaker purpose: make the product tangible Gap: E-003 ## Slide 5 — Why now Headline: TODO — state the structural change Investor takeaway: TODO Evidence: E-004 Visual: timeline or 2–3 converging trends with sources Speaker purpose: explain timing Gap: E-004 ## Slide 6 — Real validation Headline: TODO — state what is proven and what is not Investor takeaway: TODO Evidence: E-005 Visual: evidence ladder, cohort, revenue, pilots, or usage chart Speaker purpose: reduce execution and demand uncertainty Gap: E-005 ## Slide 7 — Business model Headline: TODO — explain who pays for what value Investor takeaway: TODO Evidence: E-006 Visual: value/revenue staircase or buyer-to-payment flow Speaker purpose: show how money enters the system Gap: E-006 ## Slide 8 — Market and wedge Headline: TODO — connect the first buyer to the larger market Investor takeaway: TODO Evidence: E-007 Visual: bottom-up TAM/SAM/SOM bridge with formulas Speaker purpose: establish venture-scale potential and credible entry Gap: E-007 ## Slide 9 — Competition and differentiation Headline: TODO — state the defensible position Investor takeaway: TODO Evidence: E-008 Visual: comparison table or defensible quadrant Speaker purpose: show alternatives honestly and explain the wedge Gap: E-008 ## Slide 10 — Growth plan Headline: TODO — state the repeatable acquisition hypothesis Investor takeaway: TODO Evidence: E-009 Visual: funnel, flywheel, or phased channel plan Speaker purpose: connect channel activity to measurable growth Gap: E-009 ## Slide 11 — Team fit Headline: TODO — state why this team is unusually suited Investor takeaway: TODO Evidence: E-010 Visual: evidence timeline, founder-product loop, or customer access Speaker purpose: prove founder–market/product fit Gap: E-010 ## Slide 12 — Financing and next proof Headline: TODO — amount + most important proof this round buys Investor takeaway: TODO Evidence: E-011 Visual: use-of-funds chart + 18–24 month milestone gates + contact Speaker purpose: make the investment decision concrete Gap: E-011
-
-
-
references
-
deck-architecture.md 2.9 KB
# 12–15 Slide Investor Deck Architecture ## Base 12-slide sequence | # | Investor question | Required proof | Strong visual | |---:|---|---|---| | 1 | What are you? | Product definition + company/brand | Clean cover or one visual metaphor | | 2 | What hurts? | Concrete user moment, frequency, cost | Before workflow, quote, or pain funnel | | 3 | What changes? | Specific product response | Before/after or solution flow | | 4 | Does it work? | Real product or experience | Product screenshot / demo sequence | | 5 | Why now? | 2–3 structural changes | Timeline or converging trend chart | | 6 | What is proven? | Usage, retention, revenue, speed, or pilots | Evidence ladder / cohort / verified metrics | | 7 | How do you make money? | Buyer, offer, price, sales motion | Value/revenue staircase | | 8 | How large can it be? | Source-backed TAM/SAM/SOM + wedge | Market bridge / rings with methodology | | 9 | Why you vs. alternatives? | Honest competitor dimensions | Matrix, table, or value-chain map | | 10 | How will you grow? | Channels, milestones, economics | Funnel, flywheel, or phased roadmap | | 11 | Why this team? | Founder-market/product fit | Evidence timeline, not résumé wall | | 12 | What are you raising? | Ask, use, runway, 18–24 month proof | Use-of-funds chart + milestone gates | ## When to expand to 13–15 slides Add a page only when it carries evidence that cannot fit cleanly elsewhere: - a second product-demo page for a complex workflow; - a technology/moat page with measurable defensibility; - a dedicated go-to-market wedge page; - a regulated/B2B deployment model; - a financial model when revenue complexity materially affects the investment case. Do not add generic mission, feature grids, long roadmaps, or “thank you” pages merely to reach a page count. ## Slide contract Each outline entry should contain: ```markdown ## Slide 06 — Real validation Headline: One conclusion, not a topic label Investor takeaway: What uncertainty this page removes Evidence: Exact facts and source IDs Visual: Chart type and field mapping Speaker purpose: Why this page exists in the spoken story Gap: Missing evidence or “none” ``` ## Page discipline - One page, one argument. - The headline contains the conclusion. - A viewer should understand the page in 8–12 seconds. - Keep only the numbers needed for the conclusion. - Put methodology and source notes at the bottom, not in the speaker's memory. - 8–10 minutes means roughly 35–50 seconds per page; demo pages may take longer. ## Executive summary rule For a long-form business plan, write the executive summary last. It must include: 1. what the company does; 2. problem and buyer; 3. solution and difference; 4. market opportunity with a traceable number; 5. exact ask and what it unlocks. The pitch deck's first and last pages should make the same promise and ask, from opposite ends of the argument. -
evidence-and-market.md 2.8 KB
# Evidence and Market Sizing ## Evidence classes Every material claim belongs to one class: | Class | Meaning | How to present | |---|---|---| | Fact | Directly supported by a reliable source | State with source and as-of date | | Inference | Reasoned conclusion from facts | Label as inference and show bridge | | Assumption | Planning input not yet verified | Label and sensitivity-test | | Missing | Necessary evidence not yet available | Keep as a named gap, never fill by intuition | ## Source hierarchy Prefer sources in this order: 1. Product database, payment processor, analytics, contracts, repository history. 2. Direct customer interviews, support conversations, signed pilots, orders. 3. Official government, company, exchange, standards, or research data. 4. Reputable analyst/research reports with disclosed methodology. 5. Quality secondary reporting. 6. Search snippets, social posts, and unsourced aggregations only as leads. Time-sensitive facts must be checked live. Capture the date and exact URL. If a source is inaccessible, say so in the report. ## Evidence ledger format | ID | Claim | Status | Source | As of | Slide | Notes / next action | |---|---|---|---|---|---|---| | E-001 | ... | fact | URL or dashboard export | YYYY-MM-DD | 6 | ... | Use stable IDs in the outline so charts and slide copy can be traced back. ## TAM / SAM / SOM methodology Do not paste a broad “AI will be worth $X trillion” forecast into a deck. Build a bridge from actual buyer to price. ### TAM All plausible buyers × annual value of the complete category. ```text TAM = global buyer count × realistic annual spend per buyer ``` Use a top-down source only as a cross-check. ### SAM The part of TAM reachable by current product scope, geography, regulation, and sales motion. ```text SAM = target buyer count in reachable segments × current annual contract value ``` ### SOM A three-to-five-year operating plan, not a percentage chosen for visual symmetry. ```text SOM = acquired accounts × annual price × expected retention ``` Show the channel capacity or sales capacity that makes acquired accounts credible. ## Scenario model Use at least two scenarios: - conservative: slower conversion, lower price, longer sales cycle; - base: management plan; - upside: only if named leading indicators improve. Never present the upside case as a forecast. Put assumptions next to the chart. ## Metric hygiene - Distinguish downloads, clones, activated users, active users, retained users, and paid users. - Distinguish trial, activation, conversion, renewal, and revenue. - Use cohorts for retention; do not infer retention from cumulative installs. - Define the period, denominator, timezone, duplicates, bots, and internal usage. - Put “as of YYYY-MM-DD” on changing metrics. - When the number is zero, say zero; the honest gap can define the financing thesis. -
investor-story.md 3.1 KB
# Investor Story ## The investor's reading order An investor does not read a BP like a product manual. The sequence is closer to: 1. Can I understand what this is in ten seconds? 2. Is the pain real, frequent, and expensive enough? 3. Is the product response specific and demonstrable? 4. Why can this become large now? 5. What has already been de-risked? 6. How does money enter the system? 7. Why will this team win? 8. What exactly does this financing buy? Every slide should reduce one uncertainty in that order. ## Three layers of positioning ### Layer 1: Product definition State the category or the completed job. It should be repeatable, not poetic. - Chinese: ideally 14–20 characters. - English: ideally 8–12 words. - One subject, one category/job, one clear beneficiary. - Do not lead with architecture, protocols, model names, or number of Agents. Draft three alternatives: 1. **Literal category** — “面向 X 的 Y”。 2. **Comparator** — “X 版的 Y” or “X for Y”. 3. **Category creation** — a new category with an immediate plain-language gloss. Choose the line a non-technical investor can repeat accurately after ten seconds. ### Layer 2: Market wedge Name the first buyer and the urgent use case. A credible wedge is narrower than the vision but large enough to prove demand. ```text Core wedge → adjacent users → long-term market ``` Do not confuse the wedge with the final market, or describe the final market as the current customer base. ### Layer 3: Vision Explain the structural change that makes the company matter. Vision earns its place after the product and wedge are clear. ## Product vs. implementation Ask: “If this mechanism changed tomorrow, would the customer still buy the result?” - If yes, it is implementation and should not define the company. - If no, it may be the category or moat. Examples of implementation-heavy framing: - number of Agents; - local vs. cloud runtime without explaining user benefit; - branch/worktree selection; - model/provider list; - architecture components. Translate them into the user consequence: continuity, control, trust, speed, cost, collaboration, or creative freedom. ## Before / after test | Weak | Better | |---|---| | “We integrate many models and Agents.” | “One workspace keeps AI work controllable from idea to delivery.” | | “Local-first multi-Agent orchestration.” | “Your work, context, and choices stay portable while AI does the execution.” | | “Everyone can command an Agent team.” | “Creators can reliably turn intent into finished digital products.” | The “better” line is still a hypothesis. It must match the actual product and buyer. ## Narrative red flags - The first three slides require a glossary. - The one-liner is a slogan with no product noun or job. - The company is defined by a feature available in every model vendor. - The market slide appears before the buyer is clear. - The deck claims “no competitors” or makes strong competitors look foolish. - Vision, TAM, and product roadmap describe three different businesses. - The financing ask does not connect to the key risks still unproven. -
user-config.md 2.3 KB
# User Configuration This skill follows the portable agent skill profile contract. It must not assume a private workspace, personal absolute paths, or private brand assets. ## Resolution Order 1. Explicit CLI flags. 2. Environment variables. 3. Shared profile JSON. 4. Safe defaults such as the current working directory or `$HOME/Documents`. 5. Ask the user once for missing required fields. ## Shared Profile Default profile path: ```bash ${SKILL_PROFILE_PATH:-$HOME/.skill-publisher/skills/profile.json} ``` Example: ```json { "user": { "name": "Your Name", "language": "zh-CN", "timezone": "Asia/Shanghai" }, "workspace": { "root": "$HOME/projects", "output_dir": "$HOME/Documents/lov-skill-output" }, "brand": { "name": "Your Brand", "site": "https://example.com", "profile": "$HOME/.skill-publisher/skills/brand.json", "design_guide": "$HOME/.skill-publisher/skills/design-guide.md" } } ``` Environment variable overrides: | Variable | Meaning | |----------|---------| | `SKILL_PROFILE_PATH` | Path to the shared profile JSON | | `SKILLS_CONFIG_DIR` | Shared Skill Publisher skills config/data directory | | `SKILL_WORKSPACE_ROOT` | User workspace root | | `SKILL_OUTPUT_DIR` | Default generated output directory | | `SKILL_PROFILE_PATH` | Brand profile JSON or Markdown | | `SKILL_DESIGN_GUIDE` | Design guide path | BP-specific overrides take precedence over shared values: | Variable | Meaning | |----------|---------| | `SKILL_BP_OUTPUT_DIR` | Default output directory for BP workspaces | | `SKILL_BP_BRAND_PROFILE` | Brand profile used by the deck | | `SKILL_BP_DESIGN_GUIDE` | Visual design guide used by the deck | If none are set, use an explicit `--output` path or a project-local `business-plan/` directory. Never assume an author's private workspace. ## Implementation Notes - Store source descriptions in `evidence-ledger.md`; do not copy secrets into the BP workspace. - Prefer relative paths inside the workspace so it can be moved or shared. - Brand files remain user-owned inputs. The public Yoda assets are an example, not a default theme. - Scripts should accept explicit paths via CLI flags. - Missing profile fields should produce actionable errors. - Skill Publisher maintainer defaults belong in an optional profile, not in the workflow.
-
-
scripts
-
init_bp.py 6.2 KB
#!/usr/bin/env python3 """Create a portable investor-BP workspace without overwriting existing work.""" from __future__ import annotations import argparse import datetime as dt import json import os import re import sys from pathlib import Path from typing import Any, Dict, Optional def expand_path(value: str) -> Path: return Path(os.path.expandvars(os.path.expanduser(value))).resolve() def slugify(value: str) -> str: normalized = re.sub(r"[^\w\u4e00-\u9fff]+", "-", value.strip().lower(), flags=re.UNICODE) return normalized.strip("-_") or "project" def load_profile(path: Path) -> Dict[str, Any]: if not path.exists(): return {} try: data = json.loads(path.read_text(encoding="utf-8")) except (OSError, json.JSONDecodeError) as exc: raise SystemExit(f"Cannot read profile {path}: {exc}") from exc if not isinstance(data, dict): raise SystemExit(f"Profile must be a JSON object: {path}") return data def nested(data: Dict[str, Any], *keys: str) -> Optional[str]: current: Any = data for key in keys: if not isinstance(current, dict): return None current = current.get(key) return current if isinstance(current, str) and current.strip() else None def resolve_output(args: argparse.Namespace, profile: Dict[str, Any]) -> Path: if args.output: return expand_path(args.output) skill_output = os.environ.get("SKILL_BP_OUTPUT_DIR") if skill_output: return expand_path(skill_output) / f"{slugify(args.name)}-business-plan" shared_output = os.environ.get("SKILL_OUTPUT_DIR") if shared_output: return expand_path(shared_output) / f"{slugify(args.name)}-business-plan" profile_output = nested(profile, "workspace", "output_dir") if profile_output: return expand_path(profile_output) / f"{slugify(args.name)}-business-plan" return (Path.cwd() / "business-plan").resolve() def resolve_optional(explicit: Optional[str], env_name: str, profile: Dict[str, Any], key: str) -> str: value = explicit or os.environ.get(env_name) or nested(profile, "brand", key) return str(expand_path(value)) if value else "not configured" def render_template(template: Path, destination: Path, values: Dict[str, str]) -> None: text = template.read_text(encoding="utf-8") for key, value in values.items(): text = text.replace("{{" + key + "}}", value) destination.write_text(text, encoding="utf-8") def ensure_safe_destination(output: Path) -> None: home = Path.home().resolve() if output in {Path("/").resolve(), home}: raise SystemExit(f"Refusing to use broad destination: {output}") if output.exists() and any(output.iterdir()): raise SystemExit( f"Destination already contains files: {output}\n" "Continue in that workspace manually or choose a new --output path." ) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Create a source-backed 12–15 slide investor-BP workspace." ) parser.add_argument("--name", required=True, help="Project or company name") parser.add_argument( "--stage", default="seed", choices=("pre-seed", "seed", "angel", "pre-a", "series-a", "growth", "other"), help="Financing stage (default: seed)", ) parser.add_argument("--output", help="Exact workspace directory") parser.add_argument("--profile", help="Shared Skill Publisher skills profile JSON") parser.add_argument("--brand-profile", help="Brand profile file") parser.add_argument("--design-guide", help="Design guide file") parser.add_argument("--json", action="store_true", help="Print machine-readable result") return parser.parse_args() def main() -> int: args = parse_args() profile_path = expand_path( args.profile or os.environ.get("SKILL_PROFILE_PATH") or "$HOME/.skill-publisher/skills/profile.json" ) profile = load_profile(profile_path) output = resolve_output(args, profile) ensure_safe_destination(output) skill_root = Path(__file__).resolve().parent.parent template_root = skill_root / "assets" / "templates" required_templates = { "brief.md": template_root / "brief.md", "evidence-ledger.md": template_root / "evidence-ledger.md", "outline.md": template_root / "outline.md", } missing = [str(path) for path in required_templates.values() if not path.exists()] if missing: raise SystemExit("Missing templates:\n- " + "\n- ".join(missing)) output.mkdir(parents=True, exist_ok=True) (output / "assets").mkdir(exist_ok=True) (output / "assets" / ".gitkeep").touch() today = dt.date.today().isoformat() values = { "PROJECT_NAME": args.name.strip(), "STAGE": args.stage, "DATE": today, "VERSION": "draft-0.1", } created = [] for relative, template in required_templates.items(): destination = output / relative render_template(template, destination, values) created.append(str(destination)) brand_profile = resolve_optional( args.brand_profile, "SKILL_BP_BRAND_PROFILE", profile, "profile" ) design_guide = resolve_optional( args.design_guide, "SKILL_BP_DESIGN_GUIDE", profile, "design_guide" ) source_note = output / "source-config.md" source_note.write_text( "# BP Source Configuration\n\n" f"- Project: {args.name.strip()}\n" f"- Stage: {args.stage}\n" f"- Created: {today}\n" f"- Brand profile: {brand_profile}\n" f"- Design guide: {design_guide}\n\n" "Do not store credentials or private customer data in this file.\n", encoding="utf-8", ) created.append(str(source_note)) result = { "project": args.name.strip(), "stage": args.stage, "workspace": str(output), "created": created, } if args.json: print(json.dumps(result, ensure_ascii=False, indent=2)) else: print(f"Created investor-BP workspace: {output}") for path in created: print(f" - {path}") print("Next: replace missing/TODO items, pass the evidence gate, then use bp-deck.") return 0 if __name__ == "__main__": sys.exit(main())
-
-
CHANGELOG.md 317 B
# Changelog All notable changes to this skill are documented here. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning: [SemVer](https://semver.org/) ## [0.2.0] - 2026-08-24 ### Added - add the shared feedback-classification and approval-invalidation gate used by every LovStudio Skill -
README.md 557 B
# BP 蓝图 · BP Blueprint  把项目资料整理成投资人能看懂的产品定义、证据账本和 12–15 页 BP 大纲。 ## 安装 ```bash npx skills add bp-outline -g -y ``` ## 使用 ```text $lov-bp-outline 根据当前仓库和用户访谈写 BP 大纲 $lov-bp-outline 重写这份大纲,先不要做 PPT ``` ## 交付物 - `brief.md` - `evidence-ledger.md` - `outline.md` - 待补证据清单 大纲确认后,可交给 `lov-bp-deck` 继续制作 PPT。 ## License MIT -
SKILL.md 5.7 KB
--- name: lov-bp-outline description: > Turn existing project materials into a source-backed investor BP brief, evidence ledger, and 12–15 slide outline. Use before making slides, when the product positioning is unclear, or when an existing outline is too technical, generic, or unsupported. Trigger on "写 BP 大纲", "融资叙事", "梳理商业计划书", "先不要做 PPT", "BP outline", "investor narrative", or "pitch deck outline". license: MIT metadata: author: contributors version: "0.2.0" tags: business-plan outline investor narrative evidence market positioning --- # BP 蓝图 · BP Blueprint Build the investment story before choosing a visual style. This skill stops at an approved, source-backed outline and does not generate PPTX/PDF. ## Input Any combination of: - repository, product docs, PRD, website, prior applications, or existing BP; - analytics exports, payment/usage data, GitHub evidence, and customer notes; - product screenshots, founder profile, team history, brand assets; - financing stage, amount, equity/instrument, and milestones. ## Output Contract ```text business-plan/ ├── brief.md ├── evidence-ledger.md ├── outline.md └── assets/ ``` The output is ready for `lov-bp-deck` only when the evidence gate passes. ## Workflow (MANDATORY) ### Step 0: Resolve the skill and workspace Resolve this `SKILL.md` directory as `SKILL_DIR`. If the user already has a `business-plan/` workspace, continue in it. Otherwise initialize one: ```bash python3 "$SKILL_DIR/scripts/init_bp.py" \ --name "Project Name" \ --stage seed \ --output ./business-plan ``` Read `references/user-config.md` for portable path and brand resolution. ### Step 1: Inspect before asking Search the user's supplied scope first. Prefer exact repo/files/URLs over broad discovery. Extract known audience, financing stage, ask, product, buyer, traction, business model, market, competition, growth, and team evidence. Ask at most one compact round of questions for missing decisions that materially change the outline. If the user says “不要问”“按推荐方案”, assume seed investors, 12–15 slides, 8–10 minutes, and mark the financing ask as a visible gap if unknown. ### Step 2: Build the evidence ledger Record every material claim as: - fact; - inference; - assumption; - missing. Include source, as-of date, slide destination, and next action. For changing claims, verify current authoritative sources. Never substitute a broad AI forecast for a buyer-linked market calculation. Read `references/evidence-and-market.md`. ### Step 3: Define the investor-readable product Before the vision, draft three one-line definitions: 1. literal category; 2. accurate comparator (“X for Y”); 3. category-creation language with a plain-language explanation. Choose the line a non-technical investor can repeat after ten seconds. Separate: ```text early wedge → adjacent users → long-term market ``` Treat technical modes as implementation unless the buyer actually pays for the mechanism. Read `references/investor-story.md`. ### Step 4: Write the 12–15 page argument Use this 12-page base: 1. one sentence: who you are; 2. concrete user problem; 3. how the product solves it; 4. product demo or core experience; 5. why now; 6. real validation; 7. business model; 8. market size and wedge; 9. competition and differentiation; 10. growth plan; 11. why this team; 12. financing ask, use, and next proof. Expand only when a product demo, moat, B2B deployment model, or financial model needs a dedicated page. Read `references/deck-architecture.md`. Each slide entry must contain: - conclusion headline; - investor takeaway; - evidence IDs and sources; - exact visual/chart proof; - speaker purpose; - unresolved gap or “none”. ### Step 5: Run the evidence gate The outline is ready only when: - all 12 investor questions are covered; - the product definition is investor-readable; - every core number traces to evidence or a labeled assumption; - traction stages and denominators are not mixed; - TAM/SAM/SOM has a buyer-price-reachability bridge; - the financing ask connects to 18–24 month validation milestones; - no placeholder is hidden as final copy. Report the page map and at most five evidence gaps. Do not start slide generation unless the user asked for a complete BP or explicitly continues with `bp-deck`. ## Recommended Next Step ```text $lov-bp-deck ./business-plan/outline.md ``` ## Runtime context (shared) 运行前读取本 Skill 包的 `skill.yaml`,由宿主提供 `skill-runtime/v1` 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。 - 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。 - `required: true` 字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。 - 报错提供可复制的 `context_id`、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。 ## 通用反馈闭环 用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行: 1. 先判断意见是 `task-specific`(仅本次)还是 `reusable`(可跨任务复用)。 2. `task-specific` 只修改当前任务,不改 Skill。 3. `reusable` 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。 4. 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。 5. `reusable` 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。
-
-
bp-polish
-
assets
-
templates
-
bp-review.md 1.3 KB
# BP Review Report Project: {{PROJECT_NAME}} Reviewed: {{DATE}} Version: {{VERSION}} ## Verdict - Score: __ / 100 - Decision: not ready / conditional / investor-ready - One-line verdict: __ ## Blockers | Severity | Slide | Issue | Why it matters | Exact revision | |---|---:|---|---|---| | — | — | None yet recorded | — | — | ## Scorecard | Dimension | Score | Max | Main finding | |---|---:|---:|---| | Story structure | 0 | 25 | — | | Investor readability | 0 | 20 | — | | Evidence and data hygiene | 0 | 25 | — | | Charts and visual specification | 0 | 20 | — | | Financing delivery | 0 | 10 | — | ## Page-level findings | Slide | Status | Finding | Revision | |---:|---|---|---| | — | — | — | — | ## Evidence gaps | Claim | Current status | Required source / action | Owner | |---|---|---|---| | — | — | — | — | ## Visual QA - [ ] Contact sheet reviewed. - [ ] Body text ≥20 pt. - [ ] Charts match evidence ledger. - [ ] Product screenshots are genuine and legible. - [ ] Logos are optically balanced. - [ ] QR codes decode from final images. - [ ] PPTX/PDF page counts match. - [ ] Filenames are normalized. ## Deliverables | Artifact | Path | Status | |---|---|---| | PPTX | — | missing | | PDF | — | missing | | Full-deck preview | — | missing | | Outline | — | missing | | Evidence ledger | — | missing |
-
-
-
references
-
charts-and-visuals.md 2.8 KB
# Charts and Visual Standards ## Visual principle The design should combine product-launch clarity, consulting-report credibility, and the evidence texture of a real startup. “Premium” comes from editing and hierarchy, not decoration. ## Baseline - 16:9 landscape. - White or warm-gray background and one brand accent. - Dark headline, large conclusion, body text at least 20 pt. - One dominant visual per page and roughly one-third breathing room. - Product screenshots, customer scenes, workflows, interview evidence, and orders before stock photography. - Do not stretch logos; align by optical weight, not only bounding boxes. ## Choose the proof, then the chart | Claim | Recommended visual | |---|---| | Process is fragmented | Before workflow / swimlane | | Product compresses work | Before/after or time-to-outcome bars | | Category is shifting | Timeline or converging trends | | Product closes a loop | Circular process with evidence rail | | Product has depth | Layered architecture with customer consequences | | Traction has stages | Evidence ladder or funnel | | Retention is improving | Cohort heatmap or retention curves | | Revenue expands with value | Value/revenue staircase | | Market bridges to revenue | Buyer bridge or concentric market with formula | | Competitive position | 2×2 only when axes are defensible; otherwise comparison table | | Growth has two entry points | Dual funnel / phased path | | Financing buys proof | Use-of-funds donut + milestone gates | ## Chart requirements Every quantitative chart needs: - title containing the conclusion; - axes and units when applicable; - time period and as-of date; - legend where more than one series exists; - source or evidence IDs; - assumptions beside the number, not hidden in notes; - “illustrative / 示意” label for non-measured conceptual curves. Avoid 3D charts, gauges, decorative radar charts, dual axes without necessity, and large coordinate systems with tiny data differences. ## Product screenshots - Use real current screenshots. - Crop to the workflow being proved. - Add 1–3 callouts maximum. - Keep interface text legible at normal presentation size. - State what is live, prototype, planned, or illustrative. - Do not reconstruct a fake UI when the real product exists. ## Cover A seed BP cover should usually contain only: - product/company name or logo; - one investor-readable definition; - optional financing stage/date. Use a single centered composition or a strong branded band. Do not fill the cover with feature tags, funding terms, or multiple logos competing for attention. ## Final page The final page should answer: - how much is being raised; - equity/structure when disclosed; - runway or time window; - 2–4 proofs the financing will buy; - one clear contact action. If QR codes are present, decode the final rendered image—not only the source asset. -
review-rubric.md 2.3 KB
# BP Review Rubric ## Content score (100) | Dimension | Weight | Pass condition | |---|---:|---| | Story structure | 25 | All 12 investor questions are answered in a coherent order | | Investor readability | 20 | Product is clear in ten seconds; headlines state conclusions | | Evidence and data hygiene | 25 | Core claims trace to sources; assumptions are labeled | | Charts and visual specification | 20 | Each page names the right proof and chart, not decoration | | Financing delivery | 10 | Exact ask, use of funds, runway/window, and milestones connect | Target: 85+. A high score does not override a blocker. ## Blockers - Invented or untraceable core metrics. - Unlabeled market/revenue assumption. - No clear product definition or buyer. - No real product or experience proof when one exists. - No financing amount, use, or validation milestones. - Placeholder/TODO text. - Broken source, broken QR code, unreadable slide, or incorrect filename. ## Adversarial review lenses Review the deck as four people: 1. **Non-technical investor** — what remains unclear after ten seconds? 2. **Category expert** — which claims are technically or competitively naive? 3. **Skeptical partner** — what evidence is missing or overstated? 4. **Design director** — where does layout reduce trust or distort meaning? For every issue, report page, severity, why it matters, and exact revision. ## Visual QA checklist - [ ] Contact sheet reviewed at normal size. - [ ] One claim per slide. - [ ] Title/body/source hierarchy is consistent. - [ ] Body text is at least 20 pt. - [ ] No clipped, overlapping, or off-canvas elements. - [ ] CJK fonts render correctly. - [ ] Logos have consistent optical weight. - [ ] Images are not stretched or low resolution. - [ ] Charts match evidence ledger and include units/dates/sources. - [ ] Concept charts are labeled illustrative. - [ ] Product screenshots are genuine and legible. - [ ] QR codes decode from the final slide image. - [ ] Cover and final page are visually calm. - [ ] PPTX and PDF page counts match. - [ ] File names contain project, document type, and date/version. ## Report format Use `assets/templates/bp-review.md`. Lead with verdict and score, then blockers, page-level findings, evidence gaps, and final delivery checks. Do not begin with a long description of what the reviewer did. -
user-config.md 2.3 KB
# User Configuration This skill follows the portable agent skill profile contract. It must not assume a private workspace, personal absolute paths, or private brand assets. ## Resolution Order 1. Explicit CLI flags. 2. Environment variables. 3. Shared profile JSON. 4. Safe defaults such as the current working directory or `$HOME/Documents`. 5. Ask the user once for missing required fields. ## Shared Profile Default profile path: ```bash ${SKILL_PROFILE_PATH:-$HOME/.skill-publisher/skills/profile.json} ``` Example: ```json { "user": { "name": "Your Name", "language": "zh-CN", "timezone": "Asia/Shanghai" }, "workspace": { "root": "$HOME/projects", "output_dir": "$HOME/Documents/lov-skill-output" }, "brand": { "name": "Your Brand", "site": "https://example.com", "profile": "$HOME/.skill-publisher/skills/brand.json", "design_guide": "$HOME/.skill-publisher/skills/design-guide.md" } } ``` Environment variable overrides: | Variable | Meaning | |----------|---------| | `SKILL_PROFILE_PATH` | Path to the shared profile JSON | | `SKILLS_CONFIG_DIR` | Shared Skill Publisher skills config/data directory | | `SKILL_WORKSPACE_ROOT` | User workspace root | | `SKILL_OUTPUT_DIR` | Default generated output directory | | `SKILL_PROFILE_PATH` | Brand profile JSON or Markdown | | `SKILL_DESIGN_GUIDE` | Design guide path | BP-specific overrides take precedence over shared values: | Variable | Meaning | |----------|---------| | `SKILL_BP_OUTPUT_DIR` | Default output directory for BP workspaces | | `SKILL_BP_BRAND_PROFILE` | Brand profile used by the deck | | `SKILL_BP_DESIGN_GUIDE` | Visual design guide used by the deck | If none are set, use an explicit `--output` path or a project-local `business-plan/` directory. Never assume an author's private workspace. ## Implementation Notes - Store source descriptions in `evidence-ledger.md`; do not copy secrets into the BP workspace. - Prefer relative paths inside the workspace so it can be moved or shared. - Brand files remain user-owned inputs. The public Yoda assets are an example, not a default theme. - Scripts should accept explicit paths via CLI flags. - Missing profile fields should produce actionable errors. - Skill Publisher maintainer defaults belong in an optional profile, not in the workflow.
-
-
scripts
-
audit_bp.py 10.6 KB
#!/usr/bin/env python3 """Deterministic lint for investor BP outlines. The audit checks structure and evidence hygiene. It intentionally does not pretend to replace investor judgment or visual inspection. """ from __future__ import annotations import argparse import datetime as dt import json import re import sys from pathlib import Path from typing import Dict, List, Sequence, Tuple BEATS: Sequence[Tuple[str, Sequence[str]]] = ( ("product definition", ("product definition", "who you are", "定位", "你是谁", "是什么")), ("problem", ("problem", "pain", "用户问题", "具体问题", "痛点")), ("solution", ("solution", "how the product solves", "解决方案", "如何解决")), ("product demo", ("demo", "core experience", "product experience", "产品演示", "核心体验")), ("why now", ("why now", "为什么现在", "时机")), ("traction", ("traction", "validation", "proof", "真实验证", "进展", "留存")), ("business model", ("business model", "revenue model", "商业模式", "收入模式")), ("market", ("market", "tam", "sam", "som", "市场规模", "切入路径")), ("competition", ("competition", "competitive", "竞争", "差异化")), ("growth", ("growth", "go-to-market", "gtm", "增长计划", "获客")), ("team", ("team", "founder", "团队", "创始人")), ("financing", ("financing", "fundraise", "raise", "融资", "资金用途")), ) PLACEHOLDER_RE = re.compile(r"\b(?:TODO|TBD|FIXME|XXX)\b|待补|待确认|missing", re.IGNORECASE) SLIDE_RE = re.compile(r"^##\s+(?:Slide\s+)?(\d+)(?:\s+of\s+\d+)?\b.*$", re.IGNORECASE | re.MULTILINE) SLIDE_ZH_RE = re.compile(r"^##\s*第\s*(\d+)\s*页.*$", re.MULTILINE) HEADLINE_RE = re.compile(r"^(?:Headline|Title|标题|结论)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) EVIDENCE_RE = re.compile(r"^(?:Evidence|Source|Sources|证据|来源)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) VISUAL_RE = re.compile(r"^(?:Visual|Chart|图表|视觉)\s*[::]\s*(.+)$", re.IGNORECASE | re.MULTILINE) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Audit a 12–15 slide investor BP outline.") parser.add_argument("--input", required=True, help="outline.md or a workspace containing it") parser.add_argument("--output", help="Markdown/JSON report path") parser.add_argument("--format", choices=("markdown", "json"), default="markdown") parser.add_argument("--min-slides", type=int, default=12) parser.add_argument("--max-slides", type=int, default=15) parser.add_argument("--strict", action="store_true", help="Exit 1 below 85 or with blockers") return parser.parse_args() def resolve_input(raw: str) -> Path: path = Path(raw).expanduser().resolve() if path.is_dir(): path = path / "outline.md" if not path.is_file(): raise SystemExit(f"Outline not found: {path}") return path def parse_slides(text: str) -> List[Dict[str, str]]: matches = list(SLIDE_RE.finditer(text)) if not matches: matches = list(SLIDE_ZH_RE.finditer(text)) slides: List[Dict[str, str]] = [] for index, match in enumerate(matches): start = match.start() end = matches[index + 1].start() if index + 1 < len(matches) else len(text) block = text[start:end].strip() headline = HEADLINE_RE.search(block) evidence = EVIDENCE_RE.search(block) visual = VISUAL_RE.search(block) slides.append( { "number": match.group(1), "block": block, "headline": headline.group(1).strip() if headline else "", "evidence": evidence.group(1).strip() if evidence else "", "visual": visual.group(1).strip() if visual else "", } ) return slides def present(value: str) -> bool: return bool(value and not PLACEHOLDER_RE.search(value)) def contains_any(text: str, terms: Sequence[str]) -> bool: lowered = text.lower() return any(term.lower() in lowered for term in terms) def audit(text: str, slides: List[Dict[str, str]], minimum: int, maximum: int) -> Dict[str, object]: count = len(slides) covered = [name for name, terms in BEATS if contains_any(text, terms)] missing_beats = [name for name, _ in BEATS if name not in covered] headlines = sum(1 for slide in slides if present(slide["headline"])) evidence = sum(1 for slide in slides if present(slide["evidence"])) visuals = sum(1 for slide in slides if present(slide["visual"])) placeholder_count = len(PLACEHOLDER_RE.findall(text)) structure = min(25, len(covered) * 2 + (1 if minimum <= count <= maximum else 0)) headline_ratio = headlines / count if count else 0 readability = round(12 * headline_ratio) if contains_any(text, ("investor takeaway", "投资人 takeaway", "投资人结论")): readability += 4 if contains_any(text, ("one-line", "一句话", "product definition", "产品定位")): readability += 4 readability = min(20, readability) evidence_ratio = evidence / count if count else 0 evidence_score = round(14 * evidence_ratio) if contains_any(text, ("source", "来源", "evidence", "证据")): evidence_score += 4 if contains_any(text, ("assumption", "假设", "inference", "推断", "fact", "事实")): evidence_score += 4 if contains_any(text, ("as of", "截至", "updated", "更新")): evidence_score += 3 evidence_score = max(0, min(25, evidence_score - min(10, placeholder_count))) visual_ratio = visuals / count if count else 0 visual_score = round(14 * visual_ratio) if contains_any(text, ("screenshot", "产品截图", "真实截图", "demo")): visual_score += 3 if contains_any(text, ("chart", "图表", "axis", "坐标轴", "source note", "来源")): visual_score += 3 visual_score = min(20, visual_score) delivery = 0 if contains_any(text, ("financing ask", "融资金额", "raise", "融资")): delivery += 4 if contains_any(text, ("use of funds", "资金用途")): delivery += 3 if contains_any(text, ("milestone", "里程碑", "18–24", "18-24", "runway")): delivery += 3 blockers: List[str] = [] if not (minimum <= count <= maximum): blockers.append(f"Slide count is {count}; expected {minimum}–{maximum}.") if missing_beats: blockers.append("Missing investor story beats: " + ", ".join(missing_beats) + ".") if placeholder_count: blockers.append(f"Found {placeholder_count} placeholder or missing markers.") if "financing" in missing_beats: blockers.append("No clear financing ask.") if evidence_ratio < 0.75: blockers.append("Fewer than 75% of slides contain a non-placeholder evidence/source field.") score = structure + readability + evidence_score + visual_score + delivery score = max(0, min(100, score)) findings: List[str] = [] if headline_ratio < 1: findings.append(f"{count - headlines} slide(s) lack a conclusion headline.") if visual_ratio < 1: findings.append(f"{count - visuals} slide(s) lack an explicit visual/chart specification.") if evidence_ratio < 1: findings.append(f"{count - evidence} slide(s) lack an explicit evidence/source field.") if score >= 85 and not blockers: decision = "investor-ready for visual production" elif score >= 70: decision = "conditional — revise before rendering" else: decision = "not ready" return { "score": score, "decision": decision, "slide_count": count, "scorecard": { "story_structure": structure, "investor_readability": readability, "evidence_hygiene": evidence_score, "visual_specification": visual_score, "financing_delivery": delivery, }, "coverage": covered, "missing_beats": missing_beats, "blockers": blockers, "findings": findings, "placeholder_count": placeholder_count, } def markdown_report(result: Dict[str, object], source: Path) -> str: scorecard = result["scorecard"] blockers = result["blockers"] or ["None detected by deterministic audit."] findings = result["findings"] or ["No structural findings detected."] missing = result["missing_beats"] or ["None"] lines = [ "# BP Audit Report", "", f"- Source: `{source}`", f"- Reviewed: {dt.date.today().isoformat()}", f"- Score: **{result['score']} / 100**", f"- Decision: **{result['decision']}**", f"- Slides: {result['slide_count']}", "", "## Scorecard", "", "| Dimension | Score | Max |", "|---|---:|---:|", f"| Story structure | {scorecard['story_structure']} | 25 |", f"| Investor readability | {scorecard['investor_readability']} | 20 |", f"| Evidence and data hygiene | {scorecard['evidence_hygiene']} | 25 |", f"| Charts and visual specification | {scorecard['visual_specification']} | 20 |", f"| Financing delivery | {scorecard['financing_delivery']} | 10 |", "", "## Blockers", "", ] lines.extend(f"- {item}" for item in blockers) lines.extend(["", "## Findings", ""]) lines.extend(f"- {item}" for item in findings) lines.extend(["", "## Missing story beats", ""]) lines.extend(f"- {item}" for item in missing) lines.extend( [ "", "## Required visual review", "", "This script cannot validate typography, optical alignment, chart truth, screenshot", "legibility, or QR decoding. Review every final rendered page using the visual QA", "checklist in `references/review-rubric.md`.", "", ] ) return "\n".join(lines) def main() -> int: args = parse_args() source = resolve_input(args.input) text = source.read_text(encoding="utf-8") slides = parse_slides(text) result = audit(text, slides, args.min_slides, args.max_slides) if args.format == "json": report = json.dumps(result, ensure_ascii=False, indent=2) + "\n" else: report = markdown_report(result, source) if args.output: output = Path(args.output).expanduser().resolve() output.parent.mkdir(parents=True, exist_ok=True) output.write_text(report, encoding="utf-8") print(f"Wrote BP audit report: {output}") else: print(report, end="" if report.endswith("\n") else "\n") if args.strict and (int(result["score"]) < 85 or bool(result["blockers"])): return 1 return 0 if __name__ == "__main__": sys.exit(main())
-
-
CHANGELOG.md 317 B
# Changelog All notable changes to this skill are documented here. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) · Versioning: [SemVer](https://semver.org/) ## [0.2.0] - 2026-08-24 ### Added - add the shared feedback-classification and approval-invalidation gate used by every LovStudio Skill -
README.md 572 B
# BP 精修 · BP Polish  审查并润色已有 BP:投资逻辑、证据、文字、图表和视觉一起检查,但绝不为了好看改动事实。 ## 安装 ```bash npx skills add bp-polish -g -y ``` ## 使用 ```text $lov-bp-polish ./project-bp.pdf --full $lov-bp-polish ./outline.md --content $lov-bp-polish 这份 BP 图表不专业,只做视觉审查 ``` ## 交付物 - 100 分审稿报告 - 阻断项与证据缺口 - 逐页修改建议 - 定向重做后的页面或文件 ## License MIT -
SKILL.md 5.9 KB
--- name: lov-bp-polish description: > Review and improve an existing BP outline, PPTX, PDF, or rendered slide set across investment logic, evidence, copy, charts, and visual quality. Produces a scored report, page-level revisions, and targeted regeneration instructions while keeping facts separate from assumptions. Trigger on "润色 BP", "审稿商业计划书", "PPT 不专业", "逐页检查", "改图表", "BP review", "polish pitch deck", or "audit investor deck". license: MIT metadata: author: contributors version: "0.2.0" tags: business-plan review polish audit evidence charts visual-quality pitch-deck --- # BP 精修 · BP Polish Improve an existing BP without silently changing its business facts. This skill can be used before deck production, after rendering, or in a correction loop. ## Modes | Mode | Input | Focus | |---|---|---| | `content` | Outline / Markdown | Product definition, story, copy, page rhythm | | `evidence` | Outline + ledger/sources | Claims, metrics, TAM/SAM/SOM, assumptions | | `visual` | PPTX/PDF/slide images | Hierarchy, charts, layout, branding, QR codes | | `full` | Any complete BP workspace | All dimensions + correction loop | Infer the smallest useful mode from the request. Do not require a PDF when the user only wants the outline reviewed. ## Output Contract ```text business-plan/ ├── reports/bp-review.md ├── outline.md # patched only when authorized by the request ├── deck-manifest.md # updated for visual fixes └── revised slide/deck assets # only affected artifacts ``` ## Workflow (MANDATORY) ### Step 0: Resolve source and mode Resolve this `SKILL.md` directory as `SKILL_DIR`. Inspect the supplied source and any existing BP workspace. Reuse audience, stage, style, and evidence definitions. If multiple review modes are plausible, prefill from the user's wording. Ask one compact question only when the choice materially changes the work. “不专业” defaults to `full`; “文字太技术” defaults to `content`; “图表不好看” defaults to `visual`. Read `references/review-rubric.md`, `references/charts-and-visuals.md`, and `references/user-config.md` as relevant. ### Step 1: Run deterministic outline audit When an outline exists: ```bash python3 "$SKILL_DIR/scripts/audit_bp.py" \ --input ./business-plan/outline.md \ --output ./business-plan/reports/bp-review.md ``` Use `--strict` before final delivery. The script checks structure and evidence hygiene; it does not replace investor judgment or visual inspection. ### Step 2: Review as four adversaries 1. **Non-technical investor** — can the product be repeated after ten seconds? 2. **Category expert** — which product/competition claims are naive or imprecise? 3. **Skeptical partner** — which core claims lack proof or overstate traction? 4. **Design director** — where does layout reduce trust or distort meaning? For every issue record slide, severity, why it matters, and exact revision. ### Step 3: Protect facts during polishing - Never make numbers “look better”. - Never turn an assumption into a fact. - Never invent a customer quote or testimonial. - Never widen TAM without a buyer and price bridge. - Never change a product boundary solely to improve the story. If a revision needs new evidence, mark an evidence blocker and return it to `lov-bp-outline`. ### Step 4: Inspect rendered slides For visual/full mode, create or inspect a contact sheet and every page at normal presentation size. Check: - one conclusion per page; - body text at least 20 pt; - optical alignment and whitespace; - chart axes, units, legends, dates, and sources; - genuine, legible product screenshots; - unstretched images and logos; - no clipped text or broken CJK; - QR codes decoded from final rendered pages; - clean cover and one-action final page; - matching PPTX/PDF page counts and normalized filenames. ### Step 5: Apply targeted fixes Classify each fix: - **copy fix** — patch outline and regenerate affected slides; - **evidence blocker** — update ledger/source before rewriting; - **visual defect** — change layout/style or regenerate affected slides only. Do not regenerate the whole deck for a one-page issue. Repeat audit → fix → audit for at most three cycles. ### Step 6: Deliver the report Lead with verdict and score, then blockers, page-level findings, evidence gaps, visual QA, and delivery status. Use `assets/templates/bp-review.md`. Target: 85+ with no blocker. A high numeric score never overrides fabricated data, missing financing ask, broken source, unreadable slide, or invalid QR code. ## Runtime context (shared) 运行前读取本 Skill 包的 `skill.yaml`,由宿主提供 `skill-runtime/v1` 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。 - 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。 - `required: true` 字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。 - 报错提供可复制的 `context_id`、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。 ## 通用反馈闭环 用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行: 1. 先判断意见是 `task-specific`(仅本次)还是 `reusable`(可跨任务复用)。 2. `task-specific` 只修改当前任务,不改 Skill。 3. `reusable` 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。 4. 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。 5. `reusable` 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。
-
-
-
workbuddy
-
connector-meta.json 1.3 KB
{ "name": "Skill Publisher BP", "name_zh": "Skill Publisher 商业计划书", "name_en": "Skill Publisher BP", "description": "从项目材料生成投资人商业计划书大纲、融资演示文稿,并完成专业审校。", "description_zh": "从项目材料生成投资人商业计划书大纲、融资演示文稿,并完成证据、内容和视觉审校。", "description_en": "Create investor-ready BP outlines, pitch decks, and evidence-based reviews from project materials.", "source": "lov-bp", "type": "skill-only", "version": "0.2.1", "source_type": "git", "git_url": "https://example.com/skills/bp-skill", "minWorkbuddyVersion": "4.24.0", "examples_zh": [ "根据当前项目材料,先写一份种子轮商业计划书大纲", "把已经确认的商业计划书大纲制作成专业融资演示文稿", "逐页审查这份商业计划书,修正证据、文案和视觉问题", "从项目资料开始,完成商业计划书大纲、演示文稿和最终审校" ], "examples_en": [ "Create a seed-stage BP outline from the current project materials", "Turn the approved BP outline into a professional investor pitch deck", "Review this BP slide by slide and fix evidence, copy, and visual issues", "Build and polish a complete investor BP from the available project files" ] } -
icon.svg 549 B · in bundle
-
README.md 1.5 KB
# WorkBuddy Connector 发行说明 本目录用于生成 `Skill Publisher BP Skill Kit` 的 WorkBuddy `skill-only` Connector 提交包。 ## 接入判断 - Connector 类型:`skill-only` - 不需要 `mcp.json` - 不需要 `cli.json` - 不需要 OAuth、Token 或其他用户凭证 - 不调用 Skill Publisher 私有服务 - Skill 本体按 MIT License 免费开源 ## 提交包内容 ```text lov-bp-workbuddy-v0.2.1/ ├── connector-meta.json ├── icon.svg ├── README.md ├── SUBMISSION.md └── skills/ ├── lov-bp/ ├── lov-bp-outline/ ├── lov-bp-deck/ └── lov-bp-polish/ ``` 四个 Skill 可以独立使用,也可以由 `lov-bp` 总控按需组合。 其中 `lov-bp` 自身已内置 `skills/bp-outline`、`skills/bp-deck` 和 `skills/bp-polish`,单独提交该 ZIP 时不会依赖同级目录中的其他 Skill。 ## 构建 输出目录必须是一个尚不存在的新目录: ```bash python3 scripts/build_workbuddy_connector.py \ --output-dir /path/to/lov-bp-workbuddy-v0.2.1 ``` 脚本会同时生成同名 ZIP,并执行结构、元信息、Frontmatter、私有路径和 PPT 运行时适配检查。它还会生成 `lov-bp-workbuddy-v0.2.1-individual/`,其中包含四个可在 WorkBuddy“上传技能”界面逐个导入的 ZIP。 ## 维护 更新 BP Skill Kit 后: 1. 更新 `workbuddy/connector-meta.json` 的版本和文案; 2. 使用新的版本化目录重新构建; 3. 将 ZIP 提交给 WorkBuddy 运营团队审核。 -
SUBMISSION.md 2.2 KB
# WorkBuddy Connector 审核提交说明 ## 提交主题 Skill Publisher BP Skill Kit v0.2.1(skill-only Connector)重新审核申请 ## 项目简介 Skill Publisher BP Skill Kit 是一套免费、开源、可组合的商业计划书 Skill。 它将融资材料生产拆分为项目证据梳理、投资人叙事、大纲制作、PPT 生成和 专业审校几个阶段。用户既可以独立使用某一个 Skill,也可以交由总控 Skill 完成完整流程。 ## 本次提交内容 - `lov-bp`:识别用户意图并编排所需模块; - `lov-bp-outline`:从项目材料生成证据账本和 12–15 页 BP 大纲; - `lov-bp-deck`:将已确认大纲制作成专业融资演示文稿; - `lov-bp-polish`:审查和修正已有大纲、PPT、PDF 的证据、内容与视觉问题。 ## 0.2.1 审查修复 - `lov-bp.zip` 已改为自包含包,内置三个被编排子模块及其资源; - 总控与 `kit.yaml` 统一使用包内 `skills/bp-*` 相对路径; - Skill frontmatter、`kit.yaml` 和 Connector 元数据均补充 Git 来源标识; - 补充显式触发词、不应触发条件和缺失模块错误提示; - 补齐 Yoda 案例图片,并在构建时拒绝 `__pycache__`、`.pyc` 与失效图片引用。 ## 接入信息 - Connector ID:`lov-bp` - Connector 类型:`skill-only` - 版本:`0.2.1` - 最低 WorkBuddy 版本:`4.24.0` - 认证:不需要 - 外部服务:不需要 - MCP Server:不需要 - CLI:不需要 - License:MIT - 项目主页:https://example.com/skills/bp - 源代码:https://example.com/skills/bp-skill ## 隐私与安全 Skill 仅处理用户主动提供或当前工作区可访问的项目材料,不要求用户提供 账号、Token、API Key 或其他第三方凭证。事实性数据与推断、假设分开记录, 生成演示文稿时禁止编造市场、财务或用户指标。 ## 建议审核用例 1. “根据当前项目材料,先写一份种子轮商业计划书大纲。” 2. “把已经确认的商业计划书大纲制作成专业融资演示文稿。” 3. “逐页审查这份商业计划书,修正证据、文案和视觉问题。” 4. “从项目资料开始,完成商业计划书大纲、演示文稿和最终审校。”
-
-
.gitignore 78 B · in bundle
-
CHANGELOG.md 1.4 KB
# Changelog ## [0.3.0] - 2026-08-24 ### Added - add the shared feedback-classification and approval-invalidation gate used by every LovStudio Skill ## 0.2.1 — 2026-07-31 - 将 WorkBuddy `lov-bp.zip` 改为自包含总控包,内置三个子模块。 - 在 Skill frontmatter、`kit.yaml` 和 Connector 元数据中补充 Git 来源标识。 - 增加显式触发词、不应触发条件和子模块缺失错误提示。 - 将 Yoda 案例图片纳入发布包,并阻止 `__pycache__` / `.pyc` 进入产物。 - 强化发布校验,覆盖模块完整性、来源、描述长度、案例链接与生成文件清洁度。 ## 0.2.0 — 2026-07-23 - 将单体 `lov-bp` 升级为可组合的 BP Skill Kit。 - 新增可独立安装的 `bp-outline`、`bp-deck`、`bp-polish` 三个子 Skill。 - 总控入口根据用户意图选择一个或多个模块,不再强制跑完整流程。 - 建立共享工作区、证据门、视觉门和最多三轮的回退修正机制。 - 保留 v0.1.0 的工作区初始化与审稿脚本入口。 - 新增腾讯 WorkBuddy `skill-only Connector` 发行包、独立 Skill ZIP 和自动校验。 ## 0.1.0 — 2026-07-23 - 首次公开发布。 - 建立证据账本、投资叙事、12–15 页结构与专业图表规范。 - 提供 BP 工作区初始化和确定性审稿脚本。 - 收录 Yoda 种子轮 BP 真实迭代案例与质量报告。 - 接入 `lov-any2deck` 生成 PPTX/PDF。 -
kit.yaml 1 KB
name: bp display_name: BP Skill Kit version: 0.2.1 entrypoint: lov-bp runtime: skill-runtime/v1 profile: manifest: skill.yaml workspace: business-plan source_type: git git_url: https://example.com/skills/bp-skill modules: - id: bp-outline skill: lov-bp-outline path: skills/bp-outline consumes: - project-materials produces: - brief.md - evidence-ledger.md - outline.md - id: bp-deck skill: lov-bp-deck path: skills/bp-deck consumes: - outline.md - evidence-ledger.md - assets produces: - deck-manifest.md - '*.pptx' - '*.pdf' - '*-preview.png' - id: bp-polish skill: lov-bp-polish path: skills/bp-polish consumes: - outline-or-deck produces: - reports/bp-review.md - revised-assets pipelines: full: - bp-outline - bp-deck - bp-polish content-only: - bp-outline deck-only: - bp-deck review-only: - bp-polish rewrite-and-render: - bp-polish - bp-deck - bp-polish -
LICENSE 1 KB · in bundle
-
README.md 4.7 KB
# BP 工坊 · BP Studio    一套可以拆开使用、也可以自由组合的投资人 BP 工具包。 ```text 项目材料 → BP 大纲 → PPTX / PDF → 专业审稿与润色 ↑ ↑ ↑ bp-outline bp-deck bp-polish └──────── lov-bp 总控 ────────┘ ``` 不再把“想清楚融资叙事”“制作 PPT”“审稿润色”塞进一次又长又重的执行。用户可以只拿需要的那一段,也可以让总控完成全流程。 由 [Skill Publisher](https://example.com) 免费开源。 ## 安装 安装整套 BP Skill Kit: ```bash npx skills add bp -g -y ``` 只安装一个模块: ```bash npx skills add bp-outline -g -y npx skills add bp-deck -g -y npx skills add bp-polish -g -y ``` ### WorkBuddy 仓库内置腾讯 WorkBuddy `skill-only Connector` 发行配置,可生成一个运营审核包 以及四个适合在 WorkBuddy“上传技能”页面逐个导入的 ZIP: ```bash python3 scripts/build_workbuddy_connector.py \ --output-dir ./lov-bp-workbuddy-v0.2.1 ``` 其中 `lov-bp.zip` 是可独立审查和安装的自包含总控包,内部携带三个 子模块;另外三个 ZIP 仍可作为独立 Skill 使用。 接入说明和审核文案见 [`workbuddy/`](workbuddy/)。 ## 四个入口 | Skill | 最适合的任务 | 交付物 | |---|---|---| | [`lov-bp`](SKILL.md) | 不确定用哪个,或要完成全流程 | 自动组合所需模块 | | [`lov-bp-outline`](skills/bp-outline/SKILL.md) | 从项目资料建立投资叙事 | Brief、证据账本、12–15 页大纲 | | [`lov-bp-deck`](skills/bp-deck/SKILL.md) | 把已确认大纲做成专业 PPT | PPTX、PDF、全稿预览、Deck Manifest | | [`lov-bp-polish`](skills/bp-polish/SKILL.md) | 审查或升级已有 BP/PPT | 100 分报告、逐页修改、定向重做 | ## 组合方式 ### 只想先把内容想清楚 ```text $lov-bp-outline 根据当前项目材料写一份种子轮 BP 大纲 ``` ### 已有大纲,直接做 PPT ```text $lov-bp-deck ./business-plan/outline.md --style minimal ``` ### 已经有 BP,只想变得更专业 ```text $lov-bp-polish ./project-bp.pdf --full ``` ### 从材料到最终交付 ```text $lov-bp 从当前项目生成完整 BP,不要问我问题,按推荐方案 ``` 总控默认组合: ```text bp-outline → evidence gate → bp-deck → visual gate → bp-polish ``` 每个阶段共享同一个工作区,不会重复提问,也不会覆盖已经确认的大纲。 组合与回退规则见 [references/composition.md](references/composition.md)。 ## 工作区 ```text business-plan/ ├── brief.md # 融资任务和产品定义 ├── evidence-ledger.md # 事实 / 推断 / 假设 / 缺口 ├── outline.md # 投资人叙事源文件 ├── assets/ # Logo、截图、照片、二维码、数据 ├── deck-manifest.md # 风格、页数、素材和导出状态 ├── reports/bp-review.md # 内容、证据和视觉审稿报告 ├── project-bp.pptx ├── project-bp.pdf └── project-bp-preview.png ``` ## 体验原则 - 先读取项目与已有材料,再决定问什么。 - 只有真正影响结果的选择才询问用户。 - 用户说“按推荐方案”时直接使用种子轮 12–15 页默认值。 - 大纲确认后才进入视觉风格与 PPT 生产。 - 图表和视觉润色不能改变事实。 - 只重做有问题的页面,不因为一次修改推翻整份材料。 - 完整流程必须交付 PPTX、PDF、预览和审稿报告。 ## 公开案例:Yoda 种子轮 BP Yoda 案例经历了完整组合流程:从项目材料和用户反馈中重建产品定位,形成证据化 15 页大纲,再完成专业图表、品牌视觉、二维码与最终审稿。   - [案例复盘](references/case-yoda.md) - [案例质量报告](reports/yoda-bp-case-report.md) ## 兼容性 - Python 3.8+:工作区初始化和确定性审稿。 - [`lov-any2deck`](https://example.com/skills/any2deck-skill):PPTX/PDF 生产。 - 当前市场、竞品、政策和融资事实需要访问权威来源。 - 不依赖作者私有路径;品牌和输出目录通过参数、环境变量或共享配置传入。 原有脚本入口继续可用: ```bash python3 scripts/init_bp.py --name "Project" --output ./business-plan python3 scripts/audit_bp.py --input ./business-plan/outline.md ``` ## License MIT -
SKILL.md 9.6 KB
--- name: lov-bp description: > Orchestrate a complete investor BP workflow or route to one focused module: source-backed outline, PPTX/PDF production, or evidence/content/visual polishing. Use when the user wants to create a business plan end to end, combine BP stages, continue from an existing BP workspace, or is unsure which BP skill to use. Trigger on "做 BP", "完整商业计划书", "融资 PPT 全流程", "BP skill kit", "business plan workflow", "pitch deck pipeline", or "continue my BP". license: MIT metadata: author: contributors version: "0.3.0" tags: skill-kit business-plan pitch-deck fundraising outline slides polish audit --- # BP 工坊 · BP Studio Compose only the stages the user needs. The kit preserves the existing `$lov-bp` entrypoint while exposing three focused skills that can be used independently. ## Triggers Activate for requests containing or clearly implying: - Chinese: “商业计划书”, “BP 大纲”, “融资 PPT”, “路演材料”, “投资人演示文稿”, “BP 审稿”, “BP 润色”, or “从项目材料做完整 BP”; - English: “business plan”, “BP outline”, “pitch deck”, “investor deck”, “fundraising deck”, “review my BP”, or “polish this deck”. Do not activate for a generic company introduction, ordinary product presentation, annual report, marketing proposal, or document formatting request unless the user also needs an investor-facing business plan. ## Runtime and portability Use Python 3.8+ for workspace and audit scripts. Resolve presentation generation through the active Agent Skills environment; never assume an author's private path. Take user-specific output, brand, and asset paths from the request or current project. ## Kit Map | Skill | Input | Output | Use alone when… | |---|---|---|---| | `lov-bp-outline` | Project files, links, metrics, interviews | `brief.md`, `evidence-ledger.md`, `outline.md` | The user needs to clarify the investment story first | | `lov-bp-deck` | Approved outline + evidence + brand assets | PPTX, PDF, preview, deck manifest | The outline already exists and the user wants slides | | `lov-bp-polish` | Outline, PPTX/PDF, or rendered slides | Scored report + exact revisions + corrected assets | The user already has a BP and wants it made credible/professional | Default full pipeline: ```text project evidence ↓ bp-outline ── evidence gate ──→ bp-deck ── visual gate ──→ bp-polish │ │ │ └ brief / ledger / outline └ PPTX / PDF / preview └ report / fixes ``` ## Routing Rules Select the smallest route that fulfills the request: | User intent | Route | |---|---| | “先写 BP 大纲”“梳理融资叙事” | `bp-outline` | | “大纲已经有了,做成 PPT”“选择 PPT 风格” | `bp-deck` | | “这份 BP 不专业”“润色/审稿/改图表/改版式” | `bp-polish` | | “做一份完整 BP”“从项目材料做到 PPT” | `bp-outline → bp-deck → bp-polish` | | “重写现有 BP 并重新出图” | `bp-polish → bp-deck → bp-polish` | Do not run all modules merely because they exist. For example, a user asking for an outline should not wait for image generation. For the state machine and handoff semantics, read `references/composition.md`. ## Shared Workspace Contract All modules read and write the same portable workspace: ```text business-plan/ ├── brief.md ├── evidence-ledger.md ├── outline.md ├── assets/ ├── deck-manifest.md ├── reports/bp-review.md ├── project-bp.pptx ├── project-bp.pdf └── project-bp-preview.png ``` Rules: - Never recreate a file that already contains accepted user work. - Preserve evidence IDs across modules. - `outline.md` is the narrative source of truth. - `deck-manifest.md` records style, slide count, assets, filenames, and render status. - `reports/bp-review.md` records findings and fixes; it must not silently rewrite facts. - A later module may send work back to an earlier module when it finds a blocker. ## Orchestration Workflow (MANDATORY) ### Step 0: Resolve the kit Resolve this `SKILL.md` directory as `KIT_DIR`. Module entrypoints are: ```text $KIT_DIR/skills/bp-outline/SKILL.md $KIT_DIR/skills/bp-deck/SKILL.md $KIT_DIR/skills/bp-polish/SKILL.md ``` Before executing a selected module, read that module's `SKILL.md` completely and follow its references. If a standalone installation is being used, resolve its own directory as `SKILL_DIR`. Verify every selected module before execution: 1. read `kit.yaml` and resolve the declared relative module path inside `KIT_DIR`; 2. confirm the selected module's `SKILL.md` exists; 3. if it is missing, stop before producing partial output and report: `BP Skill Kit installation is incomplete: missing <relative path>`; 4. tell the user to reinstall the self-contained `lov-bp` package or install the requested standalone module. Do not silently redirect to a sibling directory or improvise a replacement workflow. ### Step 1: Inspect context before asking Inspect the current project, previous BP workspace, supplied deck, conversation, and links. Reuse known audience, financing stage, ask, language, brand, and output path. Ask at most one compact round of questions only when an answer changes the result. If the user says “不要问”“直接做”“按推荐方案”, use these defaults: - seed-stage investors who may not understand the technology; - 12–15 slides / 8–10 minutes; - same language as the user; - clean editorial style with one brand color; - PPTX + PDF + preview + review report. ### Step 2: Run the selected module(s) For each module: 1. announce the module and why it is needed; 2. read its full `SKILL.md`; 3. pass the existing workspace instead of starting over; 4. verify its output contract; 5. continue to the next module only if requested or implied by the chosen route. ### Step 3: Respect the two useful gates **Evidence gate — after `bp-outline`:** - product definition is investor-readable; - all 12 investor questions are covered; - core numbers have sources or are labeled assumptions; - no fabricated traction, market, quote, or revenue. If the user only asked for an outline, stop here. In an interactive full workflow, show the concise page map and ask whether to produce PPT. Skip this pause when the user already requested a complete deck or autonomous execution. **Visual gate — after `bp-deck`:** - PPTX/PDF/preview exist and page counts match; - every page has one conclusion and a legible proof; - logos, images, sources, and QR codes survive final rendering. Then use `bp-polish` for the final adversarial review. ### Step 4: Handle loop-backs `bp-polish` may return one of three verdicts: - **copy fix** → patch the outline and regenerate only affected slides; - **evidence blocker** → return to `bp-outline`, update the ledger, then regenerate; - **visual defect** → return to `bp-deck`, regenerate affected slides, and recheck. Limit automatic correction to three cycles. If a core source remains unavailable, leave an explicit gap rather than guessing. ### Step 5: Deliver Return clickable paths to all artifacts created by the selected route. For a full pipeline, report: - outline and evidence ledger; - editable PPTX and PDF; - full-deck preview; - deck manifest; - final review report; - at most five unresolved decisions or evidence gaps. ## Composition Examples ```text $lov-bp-outline 根据当前仓库和用户访谈写融资大纲 $lov-bp-deck ./business-plan/outline.md --style minimal $lov-bp-polish ./business-plan/project-bp.pdf --full $lov-bp 从当前项目材料生成完整种子轮 BP,不要问,按推荐方案 ``` ## Backward Compatibility The original commands remain available: ```bash python3 "$KIT_DIR/scripts/init_bp.py" --name "Project" --output ./business-plan python3 "$KIT_DIR/scripts/audit_bp.py" --input ./business-plan/outline.md ``` They delegate to the same templates and rubric used by the child skills. ## Non-Negotiables - Do not conflate “write an outline” with “produce a finished deck”. - Do not choose a visual style before the investment narrative is coherent. - Do not rewrite facts during visual polishing. - Do not force a user through all modules when one module solves the request. - Do not finish a full route without PPTX, PDF, preview, and review report. ## Runtime context (shared) 运行前读取本 Skill 包的 `skill.yaml`,由宿主提供 `skill-runtime/v1` 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。 - 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。 - `required: true` 字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。 - 报错提供可复制的 `context_id`、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。 ## 通用反馈闭环 用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行: 1. 先判断意见是 `task-specific`(仅本次)还是 `reusable`(可跨任务复用)。 2. `task-specific` 只修改当前任务,不改 Skill。 3. `reusable` 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。 4. 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。 5. `reusable` 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。 -
skill.yaml 818 B
schema: skill-manifest/v1 id: lov-bp version: "0.3.0" runtime: skill-runtime/v1 context: profile: fields: - path: identity.name required: true question: 如果本次输出需要品牌身份,请提供品牌名称。 - path: identity.logo required: false question: 如果需要使用品牌 Logo,请提供 Logo 地址或文件路径。 - path: brand.tone required: false question: 如果已有品牌语气或审美关键词,请提供它们。 preferences: namespace: lov_bp fields: - path: user.language required: false question: 希望使用哪种语言输出? - path: user.timezone required: false question: 需要使用哪个时区处理日期和时间? interaction: ask_missing: true max_questions: 1
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.