Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
418 commits
Select commit Hold shift + click to select a range
c2fe3b8
feat: Enrich Mitsubishi colors with AEM Assets API hero renders
Paul008 Mar 19, 2026
072c822
fix: Dynamic color name discovery for Kia — no more Unknown codes
Paul008 Mar 19, 2026
69bee9e
chore: Change offers crawl from every 4h to daily at 5am AEST
Paul008 Mar 19, 2026
3b9cab1
feat: Protect page builder edits from Brand Ambassador overwrite
Paul008 Mar 19, 2026
6dd048e
docs: Update cron schedules, add manual edit protection to Brand Amba…
Paul008 Mar 19, 2026
a451baa
feat: Overhaul onboarding page with current cron schedules and features
Paul008 Mar 19, 2026
49858b5
feat: Onboard Chery Australia as 18th OEM
Paul008 Mar 19, 2026
2e013d1
feat: Seed Chery AU — 22 products, 85 colors, 22 pricing, 6 offers
Paul008 Mar 19, 2026
ddb5dd8
docs: Update all references from 17 to 18 OEMs (Chery Australia added)
Paul008 Mar 19, 2026
42da255
feat: Chery accessories (211 items, 9 models) + add chery-au to prici…
Paul008 Mar 19, 2026
2513c9c
docs: Add chery-au to all skills, OEM ID lists, and documentation
Paul008 Mar 19, 2026
a3ec094
feat: Full VW AU seed from OneHub API — 49 products, 410 colors, 15 b…
Paul008 Mar 19, 2026
d8404f0
fix: Sync hero images between page builder sections and header.slides
Paul008 Mar 19, 2026
f737729
Merge branch 'main' of https://github.com/Paul008/oem-agent
Paul008 Mar 19, 2026
9fc31cb
docs: Update platform totals — 18 OEMs, 796 products, 4952 colors, 30…
Paul008 Mar 19, 2026
0018e74
docs: Add VW OneHub API to skills, pipelines, and discovered APIs
Paul008 Mar 19, 2026
b29dc98
feat: Add offer detail dialog with disclaimers, finance, and eligibility
Paul008 Mar 19, 2026
9c53fbe
feat: Universal disclaimer on all 18 OEMs + dealer API catalog response
Paul008 Mar 19, 2026
cae87db
docs: Final count update across all skills and docs
Paul008 Mar 19, 2026
a9d8775
feat: VW OneHub in daily cron + auto-fix offer images
Paul008 Mar 19, 2026
2af4df9
feat: Implement all OpenClaw cron stubs — health check, memory sync, …
Paul008 Mar 19, 2026
2a29988
feat: Traffic Controller — orchestrator meta-skill for autonomous OEM…
Paul008 Mar 19, 2026
83767a6
docs: Add oem-orchestrator skill + update all skills/cron docs
Paul008 Mar 19, 2026
31393e6
feat: Fix PDF vectorization + upgrade sales rep skill for OpenClaw
Paul008 Mar 19, 2026
5a269f6
fix: PDF vectorization — pdf-parse v4 API compatibility
Paul008 Mar 19, 2026
c8431aa
feat: Gemini 2.5 Flash vision for PDF text extraction
Paul008 Mar 19, 2026
3a5d038
fix: Switch to gemini-embedding-001 for PDF vectorization
Paul008 Mar 19, 2026
c95c6b6
feat: Automatic PDF embedding sync — new brochures vectorized on cron
Paul008 Mar 19, 2026
55f61c2
fix: Shift cron triggers to Australian early morning (UTC offset)
Paul008 Mar 19, 2026
816196a
docs: map existing codebase
Paul008 Mar 21, 2026
db12ed8
feat: Subaru offers, hero typography controls, media upload fix
Paul008 Mar 23, 2026
e80edd9
feat: Add standalone Heading block to page builder
Paul008 Mar 23, 2026
1b5a3d1
fix: Register heading section in PageBuilderCanvas component map
Paul008 Mar 23, 2026
1e912ea
feat: Hero section gradient overlay toggle and full-width image option
Paul008 Mar 23, 2026
0f37ef9
feat: purge dealer network cache on page builder save
Paul008 Mar 23, 2026
f76d4e7
feat: Page builder UX — drag reorder, cog editor, full-width fix
Paul008 Mar 24, 2026
5d7febf
feat: Add cog icon and drag reorder to sidebar section list
Paul008 Mar 24, 2026
4c86c6c
fix: Show settings cog only on hover like other action icons
Paul008 Mar 24, 2026
11b1f06
feat: Add standalone Image section block to page builder
Paul008 Mar 24, 2026
b522ced
fix: Remove whitespace under images and fix edge-to-edge in canvas
Paul008 Mar 24, 2026
fa96a46
fix: Hero image absolute positioned to fill container, eliminating wh…
Paul008 Mar 24, 2026
d04a128
fix: Make cron crawls production-grade — runs no longer get stuck
Paul008 Mar 24, 2026
b45cdfa
fix: Add cooperative cancellation and reduce browser timeouts
Paul008 Mar 24, 2026
9cff796
fix: Reduce timeouts to fit 18 OEMs within 15-min cron limit
Paul008 Mar 24, 2026
d43768c
fix: Use try/finally for R2 cron run record save
Paul008 Mar 24, 2026
2245bfe
feat: Add Stock Health dashboard and enhanced stock alerting
Paul008 Mar 24, 2026
3bf6e2d
fix: Use correct column name validity_end instead of end_date on offers
Paul008 Mar 24, 2026
4a29439
fix: Skip browser rendering on admin-triggered crawls (30s budget)
Paul008 Mar 24, 2026
35ac73e
fix: Guard against division by zero in stock health avg calculation
Paul008 Mar 24, 2026
094660d
fix: Bugs found during battle testing
Paul008 Mar 24, 2026
416f17d
docs: Update CRON_SYSTEM.md with reliability features and stock health
Paul008 Mar 24, 2026
062ae00
fix: Skip browser rendering when HTML hash unchanged for ALL OEMs
Paul008 Mar 24, 2026
184f977
fix: Store HTML hash in source_pages so hash-based render skip works
Paul008 Mar 24, 2026
6be331e
fix: Disable browser rendering for LDV, Mazda, Suzuki (SSR sites)
Paul008 Mar 24, 2026
7e9e581
feat: Add Crawl Doctor autonomous agent and Known Issues Runbook
Paul008 Mar 24, 2026
91e6aee
feat: Offer lifecycle, price validation, and priceStr extraction fix
Paul008 Mar 24, 2026
8a1f87d
feat: P0+P1 improvements — offer lifecycle, validation, rendering audit
Paul008 Mar 25, 2026
8073958
feat: P1+P2 — rendering audit, stale products, weekly report, tests
Paul008 Mar 25, 2026
155683d
docs: Update runbook with rendering config and autonomous systems table
Paul008 Mar 25, 2026
c494b1d
feat: P3 — fan-out architecture, competitive intelligence, Subaru fix
Paul008 Mar 25, 2026
dbf77c7
fix: Guard applicable_models as array in competitive intel
Paul008 Mar 25, 2026
791fb05
docs: Final documentation sync across all files
Paul008 Mar 25, 2026
62b7785
fix: Dashboard CI was broken — switch npm to pnpm in deploy workflow
Paul008 Mar 25, 2026
5df653d
fix: Remove pnpm version from workflow — already in package.json pack…
Paul008 Mar 26, 2026
f742759
fix: Heavy cron jobs run via waitUntil, stale R2 records auto-cleaned
Paul008 Mar 26, 2026
b9f1672
fix: Video section layout — add missing dropdown, fix full-width rend…
Paul008 Mar 26, 2026
0e779a7
feat: add brand_recipes and default_recipes tables
Paul008 Mar 27, 2026
1b86f25
feat: seed default recipes (23) and Toyota brand recipes (8)
Paul008 Mar 27, 2026
e12de27
feat: add recipes API endpoint and dashboard client
Paul008 Mar 27, 2026
62388b8
feat: recipe-aware section picker with pattern grouping and sidebar w…
Paul008 Mar 27, 2026
7e5ad88
feat: inject OEM recipes into AI agent structuring prompt
Paul008 Mar 27, 2026
a9d7cfe
feat: Save as Recipe button + recipe-aware structuring prompt
Paul008 Mar 27, 2026
fddbb2e
feat: add /dashboard/recipes management page with CRUD
Paul008 Mar 27, 2026
8cd02dd
fix: recipes page uses worker API (bypasses RLS), add admin/recipes e…
Paul008 Mar 27, 2026
52b909a
feat: seed brand recipes for Kia (8), GWM (8), Hyundai (8)
Paul008 Mar 27, 2026
eb4d502
fix: brand tokens sidebar, recipe preview, save button wiring, brand-…
Paul008 Mar 27, 2026
38f0e96
fix: rename RLS migration to avoid date collision, mark as applied
Paul008 Mar 28, 2026
65d3c63
feat: visual recipe editor with composition builder, style panel, and…
Paul008 Mar 28, 2026
90034ea
feat: add /dashboard/style-guide page with visual brand catalog
Paul008 Mar 28, 2026
74e5eb0
feat: add /dashboard/style-guide page with visual brand catalog
Paul008 Mar 28, 2026
05f3962
wip(02-style-guides): paused at plan 02-02
Paul008 Mar 28, 2026
2a0f80f
feat: seed brand tokens for all 14 remaining OEMs
Paul008 Mar 28, 2026
3409c78
feat: seed brand recipes for all 14 remaining OEMs (~109 recipes)
Paul008 Mar 28, 2026
933ad73
fix: seed missing brand tokens for Kia, GWM, Hyundai
Paul008 Mar 28, 2026
22cd892
wip(02-style-guides): paused at plan 02-03
Paul008 Mar 28, 2026
aa43d18
feat: add RecipeExtractor class for screenshot-to-recipe pipeline
Paul008 Mar 28, 2026
dcae6a2
feat: add POST /admin/recipes/extract endpoint + client
Paul008 Mar 28, 2026
436e499
feat: recipe-from-screenshot pipeline — extractor + endpoint + UI
Paul008 Mar 28, 2026
1070610
feat: OEM font hosting via R2 + dynamic @font-face loading on style g…
Paul008 Mar 28, 2026
610aa94
wip(02-style-guides): paused for Lightpanda MCP restart
Paul008 Mar 28, 2026
ab131e6
feat: section thumbnails, OEM font hosting (7 OEMs), Gemini 3.1 Pro e…
Paul008 Mar 28, 2026
d6f82e5
feat(02-style-guides): PDF/PNG export from style guide page
Paul008 Mar 28, 2026
4a6904a
feat(02-style-guides): Phase 2 complete — style guides, fonts, extrac…
Paul008 Mar 28, 2026
da6c7fd
feat(03-unified-cardgrid): composition-driven CardGrid renderer
Paul008 Mar 28, 2026
d1c5b32
docs(03-unified-cardgrid): Plan 03-01 summary + state update
Paul008 Mar 28, 2026
ea0499d
feat(03-unified-cardgrid): smart-route card_composition to CardGrid
Paul008 Mar 28, 2026
20ce7f2
docs(03-unified-cardgrid): Plan 03-02 summary + state update
Paul008 Mar 28, 2026
06cdc18
feat(03-unified-cardgrid): migrate existing feature-cards to card_com…
Paul008 Mar 28, 2026
ca66cd2
docs(03-unified-cardgrid): Plan 03-03 summary + state update
Paul008 Mar 28, 2026
8ea4c12
feat(03-unified-cardgrid): Phase 3 complete — CardGrid renderer, smar…
Paul008 Mar 28, 2026
4823161
feat(04-consolidation): split-content unifies intro + content-block
Paul008 Mar 28, 2026
5230d8e
docs(04-consolidation): Plan 04-01 summary + state update
Paul008 Mar 28, 2026
42e0ee9
feat(04-consolidation): hero unifies cta-banner + countdown
Paul008 Mar 28, 2026
4bb124c
docs(04-consolidation): Plan 04-02 summary + state update
Paul008 Mar 28, 2026
63f1cf8
feat(04-consolidation): media unifies image + gallery + video + embed
Paul008 Mar 28, 2026
f5e38cc
feat: v1.0 Recipe Design System — Milestone Complete
Paul008 Mar 28, 2026
571d06a
milestone: v2.0 Intelligent Design Pipeline created
Paul008 Mar 28, 2026
de20c27
wip(v2.0): paused before Phase 5 planning
Paul008 Mar 28, 2026
0cd75d3
feat(05-component-generation): recipe → Alpine.js component with live…
Paul008 Mar 28, 2026
b89a6e9
feat(05-component-generation): Phase 5 complete — recipe → component …
Paul008 Mar 28, 2026
8ecd6ca
wip(v2.0): paused before Phase 6 planning
Paul008 Mar 28, 2026
ea7fb62
feat(06-live-tokens): CSS token crawler with diff view and apply
Paul008 Mar 28, 2026
d87ca6e
feat(06-live-tokens): Phase 6 complete — CSS token crawler
Paul008 Mar 28, 2026
6b68a41
feat(07-recipe-analytics): coverage dashboard with pattern matrix and…
Paul008 Mar 28, 2026
283e724
feat(07-recipe-analytics): Phase 7 complete — analytics dashboard
Paul008 Mar 28, 2026
99f1c7d
feat(08-batch-extraction): multi-URL recipe extraction with progress
Paul008 Mar 28, 2026
4ee1038
feat: v2.0 Intelligent Design Pipeline — Milestone Complete
Paul008 Mar 28, 2026
13c418e
milestone: v3.0 Production Design System created
Paul008 Mar 28, 2026
c2cc8fc
wip(v3.0): paused before Phase 9 planning
Paul008 Mar 28, 2026
7f5055c
feat(09-deferred): brand token preview switching + batch token crawling
Paul008 Mar 28, 2026
56593d9
feat(09-deferred): Phase 9 complete
Paul008 Mar 28, 2026
fde1b22
feat(10-page-templates): template gallery with one-click page creation
Paul008 Mar 28, 2026
062ccb7
feat(10-page-templates): Phase 10 complete
Paul008 Mar 28, 2026
ea125df
feat(11-quality-drift): design health dashboard with drift detection
Paul008 Mar 28, 2026
fd29336
feat: v3.0 Production Design System — Milestone Complete
Paul008 Mar 28, 2026
02f2007
milestone: v4.0 Autonomous Design Operations created
Paul008 Mar 28, 2026
06e7392
wip(v4.0): paused before Phase 12 planning
Paul008 Mar 28, 2026
e11f310
feat(12-automation): scheduled drift cron, auto-regen flag, AI qualit…
Paul008 Mar 28, 2026
36139a3
feat(12-automation): Phase 12 complete
Paul008 Mar 28, 2026
7a47549
feat(13-dealer): save as template + dealer overrides API
Paul008 Mar 28, 2026
02264f8
feat(13-dealer): Phase 13 complete
Paul008 Mar 28, 2026
7f6f164
feat(14-integration): webhook system with CRUD + settings page
Paul008 Mar 28, 2026
417594c
feat: v4.0 Autonomous Design Operations — Milestone Complete
Paul008 Mar 28, 2026
9f66214
milestone: v5.0 Production Hardening created
Paul008 Mar 28, 2026
6f3781a
wip(v5.0): paused before Phase 15 planning
Paul008 Mar 28, 2026
e1b6485
feat(15-polish): sync PageBuilderCanvas with consolidated renderers +…
Paul008 Mar 28, 2026
fc45f08
wip(15-polish): paused mid-plan — style-guide split remaining
Paul008 Mar 28, 2026
ae780a0
refactor(15-polish): split style-guide.vue into 7 sub-components
Paul008 Mar 28, 2026
120673d
feat(15-polish): Phase 15 complete — style-guide split, canvas sync, …
Paul008 Mar 28, 2026
e58e65c
feat(16-dealer-api): public recipes endpoint + dealer_overrides in pages
Paul008 Mar 28, 2026
82da164
feat(16-dealer-api): Phase 16 complete
Paul008 Mar 28, 2026
30eaeae
test(17-testing): 58 unit tests for design pipeline
Paul008 Mar 28, 2026
f2476e4
test(17-testing): Phase 17 complete — 161 tests passing
Paul008 Mar 28, 2026
3f4b98d
feat(18-security): rate limiting + audit logging on admin endpoints
Paul008 Mar 28, 2026
f5f3a99
feat: v5.0 Production Hardening — Milestone Complete
Paul008 Mar 28, 2026
f6586dc
docs: update AGENTS.md, BRIEFING.md, OpenClaw cron-jobs for v1-v5
Paul008 Mar 29, 2026
741bead
feat(19-showcase): Recipe Refinement Studio with stacked panels
Paul008 Mar 29, 2026
03ef1ff
feat(19-showcase): Phase 19 complete — Recipe Refinement Studio
Paul008 Mar 29, 2026
e59d3b5
fix: DataCloneError in recipe showcase — replace structuredClone with…
Paul008 Mar 29, 2026
64f8517
fix: ComponentGenerator JSON parsing — extract from markdown code blocks
Paul008 Mar 29, 2026
4e34cfe
fix: inject OEM-specific images into component generation — no cross-…
Paul008 Mar 29, 2026
d0b7dd6
fix: refinement studio — contextual controls, no auto-regen, bigger p…
Paul008 Mar 29, 2026
a228aff
feat: responsive viewport toggle in refinement studio (desktop/tablet…
Paul008 Mar 29, 2026
b91a70d
wip: paused — refinement studio needs inline URL capture + dynamic AI…
Paul008 Mar 29, 2026
d2310d7
feat: inline OEM reference capture + AI-dynamic recipe controls
Paul008 Mar 29, 2026
5ae6aef
fix: persist generated HTML, config schema, and reference in recipe save
Paul008 Mar 29, 2026
6b59227
refactor: refinement studio uses shadcn-vue components
Paul008 Mar 29, 2026
afd280a
wip: session 11 handoff — refinement studio with shadcn components
Paul008 Mar 29, 2026
7049020
feat: Section capture tool — load OEM page in iframe, click to capture
Paul008 Mar 29, 2026
ea0bf90
fix: Section capture — inline computed styles, fix security, fix memo…
Paul008 Mar 29, 2026
c18d53e
feat: Inline text editing — double-click to edit on canvas
Paul008 Mar 29, 2026
f8d1a76
feat: Phase 2 — click-to-replace images + inline editing on more sect…
Paul008 Mar 29, 2026
ecbaae2
feat: Phase 3 — Google Fonts picker + font_family support
Paul008 Mar 29, 2026
8a9d9da
feat: Phase 4 — responsive preview + inline editing on 4 more sections
Paul008 Mar 29, 2026
67a5a3a
feat: Inline editing on all remaining key sections (13 total)
Paul008 Mar 29, 2026
953da45
feat: Complete inline editing coverage — all 18 section types
Paul008 Mar 29, 2026
201547e
feat: AI-powered smart capture — identifies section type + downloads …
Paul008 Mar 29, 2026
7281731
fix: Smart capture uses aiRouter.route() with response.content
Paul008 Mar 29, 2026
b5fce1b
feat: Right-click context menu + background color picker on canvas
Paul008 Mar 29, 2026
1bd049d
feat: Inline editing on final 3 sections — complete coverage
Paul008 Mar 29, 2026
2732faf
feat: Inline editing on final 4 sections — truly complete (25/25)
Paul008 Mar 29, 2026
e1ce97b
fix: Canvas uses standalone section components for inline editing
Paul008 Mar 29, 2026
ce7698f
feat: GSAP scroll animations for dealer site sections
Paul008 Mar 29, 2026
3278b58
feat: GSAP production polish — preview button, count-up data, lazy chunk
Paul008 Mar 29, 2026
dc77a5a
feat: Animation system production polish — defaults, speed controls, …
Paul008 Mar 29, 2026
e6fdb88
feat: Accessibility + smart capture animation defaults
Paul008 Mar 29, 2026
2ed9709
fix: Add missing OEMs (Foton, Chery, GMSV) to model pages dashboard
Paul008 Mar 29, 2026
3fac381
fix: Move capture injection script to separate .ts file
Paul008 Mar 29, 2026
45cd85e
fix: Capture injection regex escape + debug log
Paul008 Mar 29, 2026
e79f8fd
feat: Show empty state with Generate button when page builder 404s
Paul008 Mar 29, 2026
52b3e00
feat: Legacy importer, OEM scraper, capture injection fixes, and side…
Paul008 Mar 30, 2026
f2fdb0c
fix: Preserve /media/ proxy paths in page structurer
Paul008 Mar 30, 2026
ca12953
fix: Extract real filename from Storyblok CDN URLs in page capturer
Paul008 Mar 30, 2026
9b5a494
fix: Update GWM ORA URL, strip scripts in proxy-html, protect scraped…
Paul008 Mar 30, 2026
2912bf3
feat: Auto-populate capture tool URL with model's source URL
Paul008 Mar 30, 2026
a14d1b7
feat: Pixel-perfect smart capture with Tailwind CSS conversion
Paul008 Mar 30, 2026
77d1cee
fix: Replace full computed styles with selective visual properties in…
Paul008 Mar 30, 2026
5cd7946
fix: Clean HTML capture — strip inline styles, send structure + image…
Paul008 Mar 30, 2026
126a013
fix: Section capture now targets <section> elements by default
Paul008 Mar 30, 2026
83f53c0
fix: Route smart-capture to Claude instead of Gemini
Paul008 Mar 30, 2026
254c3b0
feat: Render _generated_html Tailwind output in page builder canvas
Paul008 Mar 30, 2026
2bc506f
fix: Simplify smart-capture prompt — focus on correct image extraction
Paul008 Mar 30, 2026
016876f
fix: Extract real filename from Storyblok CDN URLs in smart-capture
Paul008 Mar 30, 2026
100639d
feat: Add overlay card style for feature-cards sections
Paul008 Mar 30, 2026
73b2391
feat: Queue-based capture with scroll-to-resize selection
Paul008 Mar 30, 2026
7ada639
fix: Only intercept scroll when Alt/Option held for selection resize
Paul008 Mar 30, 2026
fe98c84
feat: Add CTA text and URL fields to feature-cards editor
Paul008 Mar 30, 2026
4fbe421
fix: Default selection targets section-level elements, not deepest child
Paul008 Mar 30, 2026
c1d3d8c
fix: Force carousel/slider containers visible in capture iframe
Paul008 Mar 30, 2026
eb5bb3f
feat: Screenshot-based capture mode with region selection
Paul008 Mar 30, 2026
d244b30
fix: Add /media/screenshots/ route for capture screenshots
Paul008 Mar 31, 2026
f5f8c23
fix: Screenshot selection rectangle and cross-origin canvas cropping
Paul008 Mar 31, 2026
4b41194
fix: Show errors from screenshot capture instead of failing silently
Paul008 Mar 31, 2026
98f711c
fix: Improve JSON extraction from AI and show raw response on error
Paul008 Mar 31, 2026
6415761
feat: Deterministic HTML parser replaces AI for section capture
Paul008 Mar 31, 2026
b7a2092
fix: Resolve /media/ paths for image, image-showcase, cta-banner sect…
Paul008 Mar 31, 2026
39311cc
feat: Right-click context menu, cached iframe, forced type override
Paul008 Mar 31, 2026
7874074
feat: Fix parser misclassification, dark testimonial, multi-column co…
adme-dev Mar 31, 2026
f47a612
feat: Screenshot mode maps drawn regions to HTML sections
adme-dev Mar 31, 2026
925b891
fix: Intro image position works at smaller viewport widths
adme-dev Mar 31, 2026
e3b815f
feat: Raw HTML Block option in capture right-click menu
adme-dev Mar 31, 2026
569d1c8
feat: HTML → Tailwind AI conversion in capture right-click menu
adme-dev Mar 31, 2026
a82a9bb
fix: Use full worker URL for images in _generated_html
adme-dev Mar 31, 2026
3958253
feat: Show _generated_html in content-block editor
adme-dev Mar 31, 2026
4fce843
fix: Send styled HTML (with layout properties) for Tailwind conversion
adme-dev Mar 31, 2026
ef3b223
feat: Deterministic CSS-to-Tailwind converter replaces AI conversion
adme-dev Mar 31, 2026
8ef925c
fix: CSS-to-Tailwind converter handles percentage widths and flex-basis
adme-dev Mar 31, 2026
d0e274b
feat: Bootstrap class-name → Tailwind mapping (tailwindo-style)
adme-dev Mar 31, 2026
397b1e4
./.
adme-dev Mar 31, 2026
e7d8d08
fix: Rename 'HTML → Tailwind (AI)' to 'HTML → Tailwind' — no longer u…
adme-dev Mar 31, 2026
8189bff
fix: Kia AU banner extraction — update selectors to match AEM structure
adme-dev Mar 31, 2026
f8530e3
fix: HTML clone uses inline styles (not Tailwind classes) and no dupl…
adme-dev Mar 31, 2026
5d576fb
feat: Inline editing for captured HTML blocks via contenteditable
adme-dev Mar 31, 2026
3e85fe5
feat: Show edit toolbar when editing captured HTML blocks
adme-dev Mar 31, 2026
b1d2ec9
feat: Link URL editor popover for captured HTML blocks
adme-dev Mar 31, 2026
cbcd0a4
fix: LLM merge no longer overwrites CSS-extracted banners with empty …
adme-dev Mar 31, 2026
ab2edc9
fix: capturer image proxy paths missing /assets/ segment — all sectio…
adme-dev Apr 1, 2026
2f349da
feat: Foton dynamic color, brochure & Aumark S sync via daily cron
adme-dev Apr 1, 2026
ac7a506
refactor: address code review — dedupe fetches, merge cta_links, fix …
adme-dev Apr 1, 2026
b1f5dd2
refactor: extract shared servePageAsset handler for media routes
adme-dev Apr 1, 2026
a265520
fix: increase crawl concurrency from 3 to 6 to avoid CF Worker timeout
adme-dev Apr 1, 2026
23233ee
fix: Address code review — SSRF, XSS, dedup, dead code
adme-dev Apr 1, 2026
0522a1d
feat: add selector_overrides table for banner-triage agent
adme-dev Apr 1, 2026
30f94d3
feat: add inline data extractor for JSON-LD, Next.js, Nuxt, Gatsby, A…
adme-dev Apr 1, 2026
466aca9
feat: add banner data filter with heuristic detection and confidence …
adme-dev Apr 1, 2026
b0c48b9
feat: extractWithSelectors accepts runtime selector overrides
adme-dev Apr 1, 2026
24b22f2
feat: detect banner extraction failures and emit change events
adme-dev Apr 1, 2026
4b42be2
feat: Crawl Doctor detects stale banners and emits triage events
adme-dev Apr 1, 2026
a400db0
feat: banner triage agent with 5-layer discovery cascade
adme-dev Apr 1, 2026
929fd58
feat: register banner-triage skill in cron router
adme-dev Apr 1, 2026
2606248
fix: LDV banner selector + img[alt] headline fallback
adme-dev Apr 1, 2026
7754f59
docs: banner triage agent — spec, plan, skill, workflow docs
adme-dev Apr 1, 2026
edf8d6c
fix: address code review — SSRF, selector naming, override wiring, qu…
adme-dev Apr 2, 2026
373d7fc
docs: update agent counts and references for banner-triage
adme-dev Apr 2, 2026
abfe522
fix: update component-generator test to match last-resort fallback be…
adme-dev Apr 2, 2026
0d35434
fix: Suzuki banners now auto-extract via Lightpanda browser rendering
adme-dev Apr 2, 2026
b045ea3
feat: crawl doctor step 7b — banner image URL health check
adme-dev Apr 2, 2026
abf70f4
docs: PDF catalog & spec extraction design spec
adme-dev Apr 2, 2026
cc8c102
feat: daily banner image health check at 4:30am AEDT (graveyard shift)
adme-dev Apr 2, 2026
04e0cf8
docs: PDF spec extraction implementation plan — 7 tasks
adme-dev Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
187 changes: 187 additions & 0 deletions .claude/agents/oem-onboard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# OEM Onboarding Agent

You are an OEM onboarding specialist. Your job is to add a new Australian automotive OEM to the platform by completing every step in the checklist below.

## Input

The user will provide:
- **OEM name** (e.g. "Foton Australia")
- **OEM ID** (e.g. `foton-au`) — format: `{brand}-au`
- **Base URL** (e.g. `https://www.fotonaustralia.com.au`)

You should then **browse the OEM website** to discover:
- Vehicle model pages (URLs + page types)
- Category/index pages
- Offers, news, accessories, dealer locator pages
- Whether the site requires browser rendering (SPA/Next.js) or is server-rendered
- Sub-brands (if any)
- Brand colors (from CSS/logo)
- Any data APIs (check network tab via browser tools)

## Onboarding Steps

Complete **all** steps in order. Mark each done as you go.

### Step 1 — Discover site structure

Use browser tools or fetch the sitemap to identify:
- All vehicle model page URLs
- Category/index pages
- Key pages (offers, news, accessories, dealer locator)
- Whether `requiresBrowserRendering` is needed
- Sub-brands (if the OEM has multiple marques)
- Brand primary color (hex)

Look for APIs in the network tab — pricing APIs, product data endpoints, configurator APIs.

### Step 2 — Add to OemId union type

**File**: `src/oem/types.ts`

Add `| '<oem-id>'` to the `OemId` type union. Place it alphabetically or after the last entry.

### Step 3 — Add OEM definition to registry

**File**: `src/oem/registry.ts`

1. Add an `OemDefinition` export (e.g. `export const fotonAu: OemDefinition = { ... }`) before the "Registry Collection" section
2. Add the entry to the `oemRegistry` object
3. Update the file header comment count (e.g. "18 Australian OEMs")
4. Update the `generateOemSeedData()` comment count

Use existing OEM definitions as the template. Key fields:
- `id`, `name`, `baseUrl`
- `config.homepage`, `config.vehicles_index`, `config.offers`, `config.news`, `config.schedule`
- `selectors.vehicleLinks`, `selectors.heroSlides`, `selectors.offerTiles`
- `flags.requiresBrowserRendering`, `flags.hasSubBrands`, etc.

### Step 4 — Add brand notes to design agent

**File**: `src/design/agent.ts` → `OEM_BRAND_NOTES` object

Add an entry with:
- `colors`: array of hex color strings (primary brand color at minimum)
- `notes`: rendering info, API notes, vehicle range description

### Step 5 — Create Supabase migration

**File**: `supabase/migrations/<YYYYMMDD>_<oem>_oem.sql` (NEW file)

Check existing migrations with `ls supabase/migrations/` and use the next available date that doesn't conflict.

The migration must:
1. INSERT the OEM record into `oems` with `ON CONFLICT DO UPDATE`
2. INSERT source pages into `source_pages` with `ON CONFLICT DO NOTHING`

Use `supabase/migrations/20260301_foton_oem.sql` or `supabase/migrations/20260228_gmsv_oem.sql` as templates.

Page types: `homepage`, `vehicle`, `category`, `offers`, `news`, `other`

### Step 6 — Add discovered APIs

If any APIs were discovered in Step 1:

1. Add them to `dashboard/scripts/seed-discovered-apis.mjs` in the `apis` array
2. Insert them into the database directly using the Supabase client

### Step 7 — Update OEM count references

This is critical. Run:
```bash
grep -rn "N OEM\|N Australian" --include="*.md" --include="*.ts" --include="*.mjs" --include="*.json" --include="*.vue"
```

(Replace N with the OLD count number)

Update **every** match. Key files that always need updating:

**Top-level**: `BRIEFING.md`, `AGENTS.md`, `package.json`
**Workspace**: `workspace/SOUL.md`, `workspace/MEMORY.md`, `workspace/AGENTS.md`, `workspace-crawler/SOUL.md`, `workspace-crawler/AGENTS.md`, `workspace-reporter/SOUL.md`, `workspace-reporter/AGENTS.md`, `workspace-extractor/SOUL.md`, `workspace-designer/SOUL.md`
**Skills**: `skills/oem-report/SKILL.md`, `skills/oem-report/index.ts`, `skills/oem-sales-rep/SKILL.md`, `skills/oem-extract/SKILL.md`, `skills/oem-data-sync/SKILL.md`
**Docs**: `docs/DATABASE_SETUP.md`, `docs/DATABASE_RESTRUCTURE.md`, `docs/IMPLEMENTATION_SUMMARY.md`, `docs/OEM_AGENT_ARCHITECTURE.md`, `docs/crawl-config-v1.2.md`
**Dashboard**: `dashboard/src/pages/dashboard/page-builder-docs.vue`, `dashboard/scripts/seed-oem-portals.mjs`

Also update:
- OEM tables in `BRIEFING.md` (Monitored OEMs) and `docs/DATABASE_SETUP.md` (OEMs Seeded)
- OEM ID lists in `workspace/MEMORY.md`, `workspace/AGENTS.md`, `workspace-crawler/SOUL.md`

### Step 8 — Push migration

```bash
npx supabase db push
```

If it fails with "Found local migration files to be inserted before the last migration":
1. Rename conflicting `.sql` files to `.sql.bak`
2. Run `npx supabase db push` again
3. Rename `.sql.bak` files back

### Step 9 — Deploy worker

```bash
npm run deploy
```

### Step 10 — Verify

```bash
# No new TypeScript errors
npx tsc --noEmit 2>&1 | grep -i '<oem>'

# No remaining stale OEM counts
grep -rn "OLD_COUNT OEM\|OLD_COUNT Australian" --include="*.md" --include="*.ts" --include="*.mjs" --include="*.json" --include="*.vue"
```

Also verify in the database:
- `SELECT * FROM oems WHERE id = '<oem-id>'` returns 1 row
- `SELECT count(*) FROM source_pages WHERE oem_id = '<oem-id>'` returns expected count
- `SELECT * FROM discovered_apis WHERE oem_id = '<oem-id>'` returns any discovered APIs

### Step 11 — Trigger first crawl and verify

Trigger a manual crawl to validate the pipeline works end-to-end before relying on crons:

```bash
curl -s -X POST https://oem-agent.adme-dev.workers.dev/api/v1/oem-agent/admin/crawl/<oem-id> | jq
```

Wait ~60 seconds, then check results:

```bash
# Import run was created
SELECT id, status, started_at FROM import_runs WHERE oem_id = '<oem-id>' ORDER BY created_at DESC LIMIT 1;

# Source pages were crawled (last_crawled_at should be populated)
SELECT url, page_type, last_crawled_at FROM source_pages WHERE oem_id = '<oem-id>';

# Vehicle models discovered (may be 0 on first crawl if extraction needs tuning)
SELECT count(*) FROM vehicle_models WHERE oem_id = '<oem-id>';

# Products extracted
SELECT count(*) FROM products WHERE oem_id = '<oem-id>';
```

If the import run shows `status = 'failed'` or no vehicle models are found, investigate the logs and fix extraction before leaving the OEM to run on crons unattended.

### Step 12 — Update onboarding history

Add the new OEM to the history table at the bottom of `docs/OEM_ONBOARDING.md`.

## Dashboard Wizard Integration

If the user has already used the **dashboard onboarding wizard** (`/dashboard/onboarding`), many steps are already done:

- **Skip Steps 1, 5, 6, 8**: Discovery, migration push, and DB registration are handled by the wizard
- **Focus on Steps 2-4, 7, 9-12**: TypeScript code changes (types, registry, brand notes) + OEM count updates + deploy + verification
- **Use wizard-generated snippets**: The wizard's Step 6 provides copy-ready code for `types.ts`, `registry.ts`, `agent.ts`, and the migration SQL. Use these as your starting point instead of writing from scratch.

Ask the user: _"Did you use the dashboard onboarding wizard? If so, I'll skip discovery and DB registration."_

## Important Notes

- Always read files before editing them
- Use existing OEM definitions as templates — don't invent new patterns
- The migration date must not conflict with existing migration dates (check `ls supabase/migrations/`)
- Same-date timestamps conflict on the `version` primary key — use different dates
- After the grep for stale counts, do a **second pass** to catch any you missed
- The Supabase service role key is in `dashboard/scripts/seed-discovered-apis.mjs` if you need it for direct DB inserts
44 changes: 44 additions & 0 deletions .github/workflows/deploy-dashboard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Deploy Dashboard

on:
push:
branches: [main]
paths:
- 'dashboard/**'
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: dashboard/pnpm-lock.yaml

- name: Install dependencies
working-directory: dashboard
run: pnpm install --frozen-lockfile

- name: Build
working-directory: dashboard
env:
VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
VITE_WORKER_URL: ${{ secrets.VITE_WORKER_URL }}
run: pnpm exec vite build

- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CF_ACCOUNT_ID }}
command: pages deploy dashboard/dist --project-name oem-dashboard --branch main
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,5 @@ terraform.tfvars
test/e2e/.dev.vars

# Temporary e2e wrangler configs
.wrangler-e2e-*.jsonc
.wrangler-e2e-*.jsonc
.wrangler-out/
Empty file added .last-sync
Empty file.
Empty file added .local.db
Empty file.
50 changes: 50 additions & 0 deletions .paul/HANDOFF-2026-03-29-session11.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# PAUL Handoff

**Date:** 2026-03-29 (session 11)
**Status:** paused — context limit

---

## READ THIS FIRST

**Project:** OEM Agent — AI-powered platform for branded dealer pages
**Core value:** Dealers get brand-accurate vehicle pages without manual design work

---

## Current State

**Working on:** Recipe Refinement Studio (Phase 19)
**Status:** Functional and deployed, iterating on UX

---

## What Was Done This Session

1. Inline OEM reference capture — paste URL in studio, screenshot captured inline
2. AI-dynamic recipe controls — ComponentGenerator returns config_schema, controls render dynamically
3. Persistence fix — generated HTML, config schema, config values, reference all saved in defaults_json
4. shadcn-vue refactor — accordion panels, UiSwitch, UiSelect, UiInput, UiLabel

## Known Issues Still Open

- Some recipes show cross-brand content (Subaru text on Toyota) — AI prompt improved but not perfect
- Batch-extracted recipes (98 from 13 OEMs) used full screenshot as thumbnail, not cropped sections
- Some OEMs failed extraction (Isuzu, GMSV, GAC, Chery — JS-heavy SPAs)

## Session Stats

- 38+ commits this project across sessions
- 37 PAUL plans shipped (v1.0–v5.0 + Phase 19)
- 161 tests passing
- Recipe Refinement Studio fully functional with shadcn-vue components

---

## Resume Instructions

1. `/paul:resume`

---

*Handoff created: 2026-03-29*
Loading