odoo-demo-architect: discovery -> live Odoo demo + sales docs, AI-built
Public skill for Claude Code. Mines a discovery call, researches native-vs-custom, stands up a working Odoo demo over XML-RPC (modules + data + tested hero features), and generates run-of-show, one-pager, and a 1-page demo script. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBytQq5dcASi4ETm7n6THb
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
# Doc templates
|
||||
|
||||
Three self-contained HTML docs the skill produces in step 8. Inline `brand.css`
|
||||
into each (one `<style>` block, no external deps except Google Fonts). Replace the
|
||||
footer brand with the SELLING company. Fill `{{placeholders}}` from the engagement.
|
||||
|
||||
## 1. `run-of-show` (internal — the presenter drives from this)
|
||||
Sections, in order:
|
||||
- **Hero band**: client × your-company, date/time, audience, environment.
|
||||
- **The one-line story** (lead): mirror the client's pain back as one sentence.
|
||||
- **Status grid** (4 cards): what's built + tested (module live, fleet %, currency/data counts, staged quote).
|
||||
- **Pain → demo beat** table (their words → the beat that kills it → status pill).
|
||||
- **Run-of-show** rows: each beat = time, what to DO (exact click-path), what to SAY.
|
||||
- **Pre-loaded data** cheat-sheet (customers/limits, products/weights, vehicles/capacity, ready objects).
|
||||
- **Risks & tips** + a **close script** (dark card).
|
||||
|
||||
## 2. `one-pager` (external — leave-behind for the decision-maker)
|
||||
- Hero band branded for YOUR company; audience = the economic buyer.
|
||||
- **Today vs. with Odoo** before/after table.
|
||||
- **What gets automated** (4 bullets, each tied to a pain).
|
||||
- **Investment & timeline** grid (price, all-phases, duration, payment terms) — use the SOW's agreed figures/currency.
|
||||
- **Path to go-live** step grid (demo = HERE).
|
||||
- A dark "why Enterprise / why custom" card.
|
||||
|
||||
## 3. `demo-script-1pager` (internal — the one-page follow-along)
|
||||
Compact, prints on one A4. A login strip, then a numbered table: `# | Do (click path) | Say`.
|
||||
~7 steps: frame → clean order → ⭐hero block → ⭐override → fleet load → invoice → close.
|
||||
Hero rows highlighted. Footer ref strip with the staged data. See
|
||||
`demo-script-1pager.template.html`.
|
||||
|
||||
## Placeholders used
|
||||
`{{CLIENT}}` `{{SELLER}}` `{{DATE_TIME}}` `{{AUDIENCE}}` `{{ODOO_URL}}` `{{ADMIN_LOGIN}}`
|
||||
`{{PRICE}}` `{{ALL_PHASES}}` `{{DURATION}}` `{{PAYMENT_TERMS}}` and per-row step content.
|
||||
@@ -0,0 +1,40 @@
|
||||
/* Reusable brand theme for odoo-demo-architect docs.
|
||||
Light, blue #005EFF, navy #191F2E, Inter + Space Grotesk. Inline this into each
|
||||
self-contained HTML doc (no external deps except Google Fonts). Swap the brand
|
||||
footer per the SELLING company. */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&display=swap');
|
||||
:root{--blue:#005EFF;--blue-dark:#0046bd;--blue-light:rgba(0,94,255,0.08);--cyan:#00C6FF;
|
||||
--navy:#191F2E;--txt:#191F2E;--dim:#414651;--faint:#6b7280;--bg:#F5F7FA;
|
||||
--hero:radial-gradient(circle at 50% 0%,#E3F2FD 0%,#F8FAFC 70%);--surface:#fff;--line:#e5e9f0;
|
||||
--ok:#16a34a;--warn:#d97706;--bad:#dc2626;--sh-sm:0 2px 4px rgba(0,0,0,.02);
|
||||
--sh-md:0 12px 24px -6px rgba(0,0,0,.05);--r:16px;--r-sm:10px;}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:var(--bg);color:var(--txt);font:15px/1.55 Inter,system-ui,sans-serif;-webkit-font-smoothing:antialiased}
|
||||
.wrap{max-width:1000px;margin:0 auto;padding:36px 28px 60px}
|
||||
h1,h2,h3{font-family:'Space Grotesk',sans-serif;color:var(--navy);letter-spacing:-.02em;line-height:1.2}
|
||||
h1{font-size:32px;margin:0 0 6px;font-weight:700}
|
||||
h2{font-size:20px;margin:34px 0 12px;font-weight:600;border-bottom:1px solid var(--line);padding-bottom:8px}
|
||||
h3{font-size:15px;margin:18px 0 6px;font-weight:600;color:var(--blue)}
|
||||
.sub{color:var(--dim);margin:0 0 4px;font-size:15px}.src{color:var(--faint);font-size:12px;margin:0 0 22px}
|
||||
a{color:var(--blue);text-decoration:none}
|
||||
.gradient-text{background:linear-gradient(135deg,var(--blue),var(--cyan));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.label{font-family:'Space Grotesk',sans-serif;font-size:11px;font-weight:700;color:var(--blue);text-transform:uppercase;letter-spacing:.1em;background:var(--blue-light);padding:4px 12px;border-radius:100px;display:inline-block;margin-bottom:14px}
|
||||
.lead{background:#fff;border:1px solid var(--line);border-left:4px solid var(--blue);padding:14px 18px;border-radius:var(--r-sm);margin:16px 0;box-shadow:var(--sh-sm)}
|
||||
.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:22px 0}
|
||||
.card{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:18px;box-shadow:var(--sh-sm)}
|
||||
.card .n{font-family:'Space Grotesk',sans-serif;font-size:27px;font-weight:700;color:var(--navy)}.card .n.blue{color:var(--blue)}.card .l{color:var(--dim);font-size:13px;margin-top:3px}
|
||||
.card-dark{background:var(--navy);color:#fff;border-radius:var(--r);padding:22px 24px;box-shadow:var(--sh-md);margin:18px 0}.card-dark h3{color:#fff}.card-dark p{color:#cbd5e1;margin:6px 0 0}
|
||||
table{width:100%;border-collapse:collapse;font-size:14px;background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
|
||||
th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);vertical-align:top}
|
||||
th{color:var(--faint);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.04em;background:#fafbfc}tr:last-child td{border-bottom:none}
|
||||
.pill{display:inline-block;padding:2px 10px;border-radius:100px;font-size:11.5px;font-weight:600}.pill.live{background:#dcfce7;color:#15803d}.pill.bad{background:#fee2e2;color:#b91c1c}
|
||||
.box{background:#fff;border:1px solid var(--line);border-left:4px solid var(--ok);border-radius:var(--r-sm);padding:12px 16px;margin:10px 0;box-shadow:var(--sh-sm)}.box.warn{border-left-color:var(--warn)}.box.info{border-left-color:var(--blue)}
|
||||
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}
|
||||
.step{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:16px;position:relative;box-shadow:var(--sh-sm)}.step.here{border-color:var(--blue);box-shadow:0 0 0 1px var(--blue) inset}
|
||||
.step .num{font-family:'Space Grotesk',sans-serif;font-size:11px;color:var(--faint);font-weight:700;text-transform:uppercase}.step .ttl{font-family:'Space Grotesk',sans-serif;font-size:15px;font-weight:700;color:var(--navy);margin:4px 0 6px}.step .d{font-size:12.5px;color:var(--dim)}
|
||||
.step.here .badge{position:absolute;top:-10px;right:10px;background:var(--blue);color:#fff;font-size:11px;font-weight:700;padding:2px 9px;border-radius:100px}
|
||||
code{background:var(--blue-light);border:1px solid #d6e4ff;border-radius:5px;padding:1px 6px;font:12.5px ui-monospace,Consolas,monospace;color:var(--blue-dark)}
|
||||
footer{margin-top:40px;color:var(--faint);font-size:12px;border-top:1px solid var(--line);padding-top:16px}
|
||||
.hero{background:var(--hero);padding:44px 28px 32px}.hero .wrap{padding:0;max-width:1000px;margin:0 auto}
|
||||
@media(max-width:760px){.grid,.steps{grid-template-columns:1fr 1fr}h1{font-size:25px}}
|
||||
@media print{body{background:#fff}.wrap{padding:0}@page{size:A4;margin:12mm}}
|
||||
@@ -0,0 +1,56 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{CLIENT}} Demo — Step-by-Step (1 page)</title>
|
||||
<style>
|
||||
/* >>> inline templates/brand.css here <<< plus the small extras below */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@600;700&display=swap');
|
||||
:root{--blue:#005EFF;--cyan:#00C6FF;--navy:#191F2E;--txt:#191F2E;--dim:#414651;--faint:#6b7280;--bg:#F5F7FA;--line:#e5e9f0;--ok:#16a34a;--warn:#d97706;--bad:#dc2626;--blue-light:rgba(0,94,255,0.08)}
|
||||
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--txt);font:13px/1.45 Inter,system-ui,sans-serif}
|
||||
.wrap{max-width:920px;margin:0 auto;padding:22px 26px 30px}
|
||||
h1{font-family:'Space Grotesk',sans-serif;font-size:23px;margin:0 0 2px;color:var(--navy);letter-spacing:-.02em}
|
||||
.sub{color:var(--dim);font-size:13px;margin:0 0 2px}.src{color:var(--faint);font-size:11px;margin:0 0 12px}
|
||||
.gradient-text{background:linear-gradient(135deg,var(--blue),var(--cyan));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.bar{display:flex;flex-wrap:wrap;gap:8px;background:#fff;border:1px solid var(--line);border-left:4px solid var(--blue);border-radius:8px;padding:9px 12px;margin:0 0 14px;font-size:12px}
|
||||
.bar b{color:var(--navy)}code{background:var(--blue-light);border:1px solid #d6e4ff;border-radius:4px;padding:1px 5px;font:11.5px ui-monospace,Consolas,monospace;color:#0046bd}
|
||||
table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:8px;overflow:hidden}
|
||||
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
|
||||
th{color:var(--faint);font-weight:600;font-size:10.5px;text-transform:uppercase;background:#fafbfc}tr:last-child td{border-bottom:none}
|
||||
td.n{font-family:'Space Grotesk',sans-serif;font-weight:700;color:var(--blue);width:26px;text-align:center;font-size:15px}
|
||||
td.do{width:46%}td.do b{color:var(--navy)}td.say{color:var(--dim);font-style:italic}
|
||||
tr.hero td{background:#fffdf6}tr.hero td.n{color:var(--warn)}
|
||||
.tag{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:100px;margin-left:4px}.tag.block{background:#fee2e2;color:#b91c1c}.tag.ok{background:#dcfce7;color:#15803d}
|
||||
.ref{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;font-size:11.5px;color:var(--dim)}.ref div{background:#fff;border:1px solid var(--line);border-radius:8px;padding:7px 10px}.ref b{color:var(--navy)}
|
||||
footer{margin-top:12px;color:var(--faint);font-size:10.5px;border-top:1px solid var(--line);padding-top:8px}
|
||||
@media print{body{background:#fff}.wrap{padding:0}@page{size:A4;margin:12mm}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<h1>{{CLIENT}} Demo — <span class="gradient-text">Step-by-Step</span></h1>
|
||||
<p class="sub">{{DATE_TIME}} · {{AUDIENCE}} · Odoo {{ODOO_VERSION}}</p>
|
||||
<p class="src">Follow top to bottom. ~25 min.</p>
|
||||
<div class="bar">
|
||||
<span><b>Login:</b> <code>{{ODOO_URL}}</code></span>
|
||||
<span><b>Manager:</b> <code>{{ADMIN_LOGIN}}</code></span>
|
||||
<span><b>Rep:</b> <code>{{REP_LOGIN}}</code> / <code>{{REP_PASSWORD}}</code></span>
|
||||
</div>
|
||||
<table>
|
||||
<thead><tr><th>#</th><th>Do (click path)</th><th>Say</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td class="n">1</td><td class="do"><b>Frame it.</b> Open the Sales app.</td><td class="say">"{{FRAME_LINE}}"</td></tr>
|
||||
<tr><td class="n">2</td><td class="do"><b>Clean order.</b> Sales → Orders → New → {{CLEAN_CUSTOMER}} → add products → Confirm <span class="tag ok">goes through</span></td><td class="say">"{{CLEAN_LINE}}"</td></tr>
|
||||
<tr class="hero"><td class="n">3</td><td class="do"><b>⭐ {{HERO1}}.</b> {{HERO1_CLICKS}} <span class="tag block">BLOCKED</span></td><td class="say">"{{HERO1_LINE}}"</td></tr>
|
||||
<tr class="hero"><td class="n">4</td><td class="do"><b>⭐ Override.</b> {{OVERRIDE_CLICKS}} <span class="tag ok">confirmed</span></td><td class="say">"{{OVERRIDE_LINE}}"</td></tr>
|
||||
<tr><td class="n">5</td><td class="do"><b>{{HERO2}}.</b> {{HERO2_CLICKS}}</td><td class="say">"{{HERO2_LINE}}"</td></tr>
|
||||
<tr><td class="n">6</td><td class="do"><b>Invoice.</b> On a confirmed order → Create Invoice → Post.</td><td class="say">"{{INVOICE_LINE}}"</td></tr>
|
||||
<tr><td class="n">7</td><td class="do"><b>Close.</b> Hand over the one-pager.</td><td class="say">"{{CLOSE_LINE}}"</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="ref">{{DATA_REF_CHIPS}}</div>
|
||||
<footer>Rehearse once, leave the demo quote in draft · have a hotspot backup · {{SELLER}} × {{CLIENT}}</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user