Skip to content
Content
Skill

/proposal-maker

Turn a raw commercial offer (client + line items + total) into an HTML proposal whose style copies a brand website. LLM-authored from a brand screenshot; --quick offline fallback. Output: proposal.html with clickable links + exact prices, prints to PDF. Use when: 'make a

From plugin
mikefluff-skills
1944 skills2 commands1 hook
Install
$ npx -y skills add Mikefluff/skills --skill proposal-maker --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/proposal-maker

Context preview

The summary Claude sees to decide when to auto-load this skill.

Turn a raw commercial offer (client + line items + total) into an HTML proposal whose style copies a brand website. LLM-authored from a brand screenshot; --quick offline fallback. Output: proposal.html with clickable links + exact prices, prints to PDF. Use when: 'make a

SKILL.md

proposal-maker.SKILL.md
name: proposal-maker
description: "Turn a raw commercial offer (client + line items + total) into an HTML proposal whose style copies a brand website. LLM-authored from a brand screenshot; --quick offline fallback. Output: proposal.html with clickable links + exact prices, prints to PDF. Use when: 'make a proposal', 'commercial offer', 'КП', 'коммерческое предложение'."

license: MIT
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Grep
  - Glob

<objective> End-to-end commercial-proposal generator. Input: a free-form offer (client block + itemised order with prices + total, usually pasted from Telegram/WhatsApp) and a brand site to copy the look from. Output: a single self-contained `proposal.html` that genuinely **looks like that brand** and prints to a clean PDF.

The default is **LLM-authored, screenshot-driven**. A deterministic template can't capture "dark, bold, dramatic brand with a green accent and uppercase display type" — it reads colours by frequency and gets the mood wrong. So instead: a Python step assembles a **brand kit**, and you (the orchestrator) *look at the brand* and *write the markup*.

Execute-layer modules under `common/runners/`: 1. `proposal/parse.py` — offer text → structured `skills.proposal.plan.v1` (items, prices, recomputed subtotal, mismatch + outlier flags). 2. `proposal/brand.py` — scrape brand tokens (accent / fonts / logo / name) + enrich each item with its real catalogue photo + description (`og:` tags). 3. `proposal/kit.py` — screenshot the brand site (headless Chrome), download the logo, write `BRIEF.md` bundling tokens + the item table + authoring rules. 4. `proposal/render.py` — the `--quick` deterministic themed template + HTML→PDF helper.

Why a document and NOT an image deck: a proposal carries **exact prices** and **clickable product links**. AI image generation garbles both. You write real HTML text.

This skill does NOT: generate slides/images (use `carousel-builder`/`flyer-maker`); invent prices or discounts; silently rewrite a suspicious number (it flags, you ask); log into a CRM or send anything; compute tax/VAT. </objective>

ROLE

Build the brand kit → **look at the brand screenshot** → surface data-quality warnings to the user → **author a bespoke `proposal.html` that mirrors the brand** → verify it by screenshotting your own output → deliver. Fall back to `--quick` only when there's no LLM loop or no network.

PIPELINE (default — LLM-authored)

1. **Capture the offer.** Save the user's pasted offer verbatim to a temp file (or pipe via stdin). Don't reformat — the parser handles emoji headers, RU/EN keys, `Name (url) qty — price CUR` lines, and `Total:`.

2. **Build the brand kit:**

   python3 proposal-maker/scripts/run.py --offer /tmp/offer.txt
   # brand site auto-detected from the offer footer; or pass --brand-url <site>

This writes to `./generated/proposal/<slug>/`: `site.png` (the brand screenshot), `logo.*`, `brand.json`, `offer.json` (enriched with per-item photo URLs), and `BRIEF.md`.

3. **Look at the brand.** `Read` `site.png` — actually view it. Note: dark vs light mood, type weight/case, where/how the logo sits, accent colour usage, imagery feel. Then read `BRIEF.md` for the tokens + the full item table (names, qty, prices, links, photo URLs).

4. **Surface warnings.** If the run printed `⚠ stated total ≠ computed` or `⚠ '<item>' is N% of the total — possible typo`, **tell the user and ask** before using that number. (The seed Double D offer has `Логистика 5 000 000` — 97% of the total — almost certainly `5 000`.) Never auto-fix; confirm, then correct the offer text and re-run if needed.

5. **Author `proposal.html`** into the kit folder. House rules:

  • **Mirror the screenshot.** Same mood (dark canvas if the site is dark), same type

personality (the brand font from `BRIEF.md` via its Google Fonts link), the accent as the one hot colour, the logo placed like the site places it.

  • **Logo treatment.** Brand logos are often monochrome/white SVGs. On a dark header use

as-is; on a light header tint to white via `filter:brightness(0) invert(1)` or set it on a dark/accent plate. **Always show the brand name beside it** so identity survives.

  • **Prominent key facts.** Lead the hero with a big Date / Time / Location block — the

fields the client checks first — above smaller secondary pills (guests, phone).

  • **Group by category.** Split the items into 4–7 logical categories named for the

client's domain (e.g. Звук и свет / Доп оборудование / Артисты / Декорации / Сервис), each with a **large, scannable header** (big type + accent marker), item count, and **per-category subtotal**. Never one long pile.

  • **Vary density.** Showpiece / high-value items → big photo cards; utility / low-cost

items (controllers, stands, staff, logistics) → compact 2-column rows (small thumb + name + price). Don't render everything large — it reads as sprawling.

  • **Real photos.** Each item gets its `og:image` from `BRIEF.md` (Tilda URLs hotlink

fine). Items the kit could not photograph from a link get an **auto-generated on-brand image** (kit fills these; marked in `BRIEF.md`) — use it and tell the user they can swap a real one. Never a blank/placeholder if a photo can be sourced.

  • **Exact data.** Prices and links exactly as parsed; the computed subtotal is the total;

quantity chips where given.

  • **Self-contained.** One file: inline `<style>`, the Google Fonts `<link>`, CSS custom

properties for the tokens.

  • **Print CSS (required — the PDF depends on it).** `@page{size:A4;margin:0}` to kill

white margins (full-bleed). Running header **and** footer on every page via the **table `<thead>`/`<tfoot>`** pattern (`display:table-header-group`/`-footer-group` in print) — a `position:fixed` band can't reserve per-page space and looks broken on inner pages. `break-

Read more
Ships withmikefluff-skills

44 skills for Claude Code that make content — and refuse to let it read like a machine made it. Prose editing that strips the tells. Prompt engineering for 40+ image, video and music models, with optional one-command execution against the real APIs.

Get the whole plugin
Stats
19
Stars
1
Forks
Maintained
Maintenance
Python
Language
MIT
License
1mo ago
Last commit
3mo ago
Created

Repo: Mikefluff/skills

Other skills on mikefluff-skills.