vibespot 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +54 -5
  2. package/assets/blog-rules.md +251 -0
  3. package/assets/email-rules.md +390 -0
  4. package/assets/humanify-guide.md +300 -101
  5. package/assets/plan-templates/blog-content-hub.md +18 -9
  6. package/assets/plan-templates/email-announcement.md +41 -0
  7. package/assets/plan-templates/email-event-invite.md +43 -0
  8. package/assets/plan-templates/email-newsletter.md +41 -0
  9. package/assets/plan-templates/email-re-engagement.md +42 -0
  10. package/assets/plan-templates/email-welcome.md +41 -0
  11. package/dist/index.js +1460 -387
  12. package/dist/index.js.map +1 -1
  13. package/package.json +5 -5
  14. package/starters/06-blog-content-hub.json +75 -0
  15. package/starters/06-email-welcome.json +60 -0
  16. package/starters/07-email-announcement.json +60 -0
  17. package/starters/08-email-newsletter.json +52 -0
  18. package/ui/chat.js +777 -63
  19. package/ui/code-editor.js +49 -7
  20. package/ui/dashboard.js +379 -93
  21. package/ui/docs/docs.css +29 -0
  22. package/ui/docs/index.html +416 -119
  23. package/ui/docs/screenshots/asset-type-cards.png +0 -0
  24. package/ui/docs/screenshots/brand-kit-preview.png +0 -0
  25. package/ui/docs/screenshots/content-type-dropdown.png +0 -0
  26. package/ui/docs/screenshots/deploy-progress.png +0 -0
  27. package/ui/docs/screenshots/editor-full-layout.png +0 -0
  28. package/ui/docs/screenshots/email-client-preview.png +0 -0
  29. package/ui/docs/screenshots/inline-wysiwyg-editing.png +0 -0
  30. package/ui/docs/screenshots/module-overview-slideout.png +0 -0
  31. package/ui/docs/screenshots/multi-page-tree.png +0 -0
  32. package/ui/docs/screenshots/onboarding-walkthrough.png +0 -0
  33. package/ui/docs/screenshots/pipeline-progress.png +0 -0
  34. package/ui/docs/screenshots/project-overview-table.png +0 -0
  35. package/ui/docs/screenshots/split-pane-view.png +0 -0
  36. package/ui/docs/screenshots/visual-controls-toolbar.png +0 -0
  37. package/ui/docs/screenshots/workspace-tabs.png +0 -0
  38. package/ui/email-preview.js +109 -0
  39. package/ui/field-editor.js +72 -1
  40. package/ui/icons.js +120 -0
  41. package/ui/index.html +877 -629
  42. package/ui/inline-edit.js +710 -0
  43. package/ui/plan.js +0 -0
  44. package/ui/preview.js +101 -198
  45. package/ui/section-controls.js +628 -0
  46. package/ui/settings.js +58 -16
  47. package/ui/setup.js +750 -140
  48. package/ui/styles.css +3430 -952
  49. package/ui/upload-panel.js +47 -20
package/README.md CHANGED
@@ -25,20 +25,35 @@ npx vibespot
25
25
 
26
26
  Opens a browser with:
27
27
  - **Chat on the left** — describe your landing page in natural language
28
- - **Live preview on the right** — see your page render in real-time, plus a **Plan tab** and a **Code tab**
28
+ - **Live preview on the right** — see your page render in real-time, with Split, Plan, and Code views
29
29
  - **Agentic pipeline** — multi-stage AI generation with real-time progress
30
- - **Plan mode** *(new in v1.1)* toggle on to deliberate before generating: the AI asks elicitation questions, builds a markdown plan in a dedicated pane, and only generates after you approve
31
- - **Project sidebar** — create, open, resume, or delete projects
30
+ - **Multi-page sites** — create full HubSpot sites from a single prompt with shared header/footer, per-page layouts, and cross-page navigation validation
31
+ - **Inline WYSIWYG editing** — click text, images, and links directly in the live preview to edit them inline
32
+ - **Per-section visual controls** — hover any module for a floating toolbar with color pickers, spacing sliders, image swap, and font size controls
33
+ - **Plan mode** — toggle on to deliberate before generating: the AI asks elicitation questions, builds a markdown plan in a resizable sidebar, and only generates after you approve. Pre-canned plan templates for common page types skip the cold-start phase.
34
+ - **Onboarding walkthrough** — 3-step intro for first-time users covering what vibeSpot is, how it maps to HubSpot, and a guided first prompt
35
+ - **Workspace tabs** — Pages, Brand, Library, Marketplace, Settings tabs organize the dashboard. Brand tab includes a live visual preview of your brand kit.
36
+ - **Project sidebar** — create, open, resume, or delete projects; page tree shows all templates with type badges and module counts
32
37
  - **Module management** — reorder via drag-and-drop, edit fields, delete modules from module list or module library
33
- - **Starter templates** — SaaS, Portfolio, Restaurant, Event
38
+ - **Starter templates** — SaaS, Portfolio, Restaurant, Event, Coming Soon, Blog — pre-built page bundles for instant preview with no AI wait
39
+ - **Content types** — landing pages, email templates, and blog templates all supported from asset-type cards and the page type dropdown
40
+ - **Email client preview** — renders your email in Gmail, Outlook Desktop, and Apple Mail with per-client rendering notes
41
+ - **Split-pane view** — preview + code editor side by side in a 50/50 layout
42
+ - **Project overview table** — sortable table with page, email, module, and brand asset counts per project, plus bulk duplicate/delete
43
+ - **Brand kit enforcement** — colors, fonts, and logo are injected as constraints into AI generation; validator warns on off-brand values
44
+ - **Interact mode** — unified mode that auto-detects whether you're editing content inline or referencing modules in chat
45
+ - **Undo/redo** — Ctrl+Z / Ctrl+Y step through version history; a compact timeline strip shows every generation step
46
+ - **Smart suggestions** — contextual suggestion chips appear after pipeline completion, filtered by existing modules
34
47
  - **From Figma** *(Beta)* — paste a Figma URL to extract design tokens, text, and assets, then generate a full page that translates the design verbatim
35
48
  - **From React** *(Beta)* — convert existing React/Lovable projects from a Git URL
49
+ - **From HubSpot** — fetch an existing theme, then run inverse analysis to extract design tokens, module graph, and round-trip risks
36
50
  - **Field editor** — tweak text, colors, images directly
37
51
  - **File uploads** — attach images and documents via drag-and-drop or paperclip button
38
52
  - **Upload to HubSpot** — per-file progress, auto-fix, celebration popup with direct portal link
39
- - **Version history** — per-template git commits with rollback
53
+ - **Version history** — per-template git commits with rollback in a collapsible bottom panel
40
54
  - **Light/dark mode** — toggle or auto-detect system preference
41
55
  - **Tabbed settings** — AI engines (with extended-thinking toggle), HubSpot accounts, Figma, GitHub, vibeSpot config
56
+ - **Mobile responsive** — tablet breakpoint collapses the rail; sub-768px shows a gate dialog
42
57
  - **ZIP download** — export your theme as a ZIP file
43
58
 
44
59
  ### Agentic Pipeline
@@ -157,10 +172,12 @@ Once your modules are ready:
157
172
 
158
173
  ```bash
159
174
  vibespot # Vibe coding web UI (default)
175
+ vibespot email # Start in email template mode
160
176
  vibespot wizard # Classic CLI wizard
161
177
  vibespot init # Check and install required tools
162
178
  vibespot convert # Convert a React project (no upload)
163
179
  vibespot upload # Upload theme to HubSpot
180
+ vibespot inverse [--path] [--json] [--apply-tokens] # Analyze an imported theme (design tokens, module graph, risks)
164
181
  vibespot marketplace check [--fix] [--json] # Audit theme for HubSpot Marketplace submission
165
182
  vibespot marketplace edit # Edit Marketplace listing metadata (marketplace.json)
166
183
  vibespot doctor # Diagnose environment issues
@@ -182,6 +199,38 @@ Settings are managed in the **Settings** panel (tabbed: AI, HubSpot, Figma, GitH
182
199
 
183
200
  ## What's New
184
201
 
202
+ ### v1.3.1
203
+ - **Project overview table** — sortable table view for all projects with page, email, module, and brand asset counts
204
+ - **Bulk operations** — select multiple projects for bulk duplicate or delete
205
+ - **Email client preview** — preview emails as they render in Gmail, Outlook Desktop, and Apple Mail
206
+ - **Pipeline robustness** — auto-regenerate modules with broken fieldsJson; tightened similarity checks
207
+ - **Email deploy fixes** — correct dnd_area naming, module references for drag-and-drop editor, deploy UX improvements
208
+ - **Security hardening** — eliminated shell injection in git operations, path-traversal guards on theme routes
209
+
210
+ ### v1.3.0
211
+ - **Email template generation** — full pipeline support for HubSpot email templates: email-specific prompts, table-based layout, MSO/VML compatibility, 3 email starters, 5 email plan templates, and email validator auto-fix
212
+ - **Multi-page sites** — create full HubSpot sites from a single prompt with shared modules, page tree sidebar, and cross-page navigation validation
213
+ - **Inline WYSIWYG editing** — click text, images, and links directly in the live preview to edit inline
214
+ - **Per-section visual controls** — hover toolbar with color pickers, spacing sliders, image swap, and font size controls
215
+ - **Blog template generation** — blog as a content type with HubSpot blog variable support and a Blog Content Hub starter template
216
+ - **Split-pane view** — preview + code editor side by side
217
+ - **Brand kit enforcement** — colors, fonts, and logo injected as AI constraints with off-brand warnings
218
+ - **Workspace tab navigation** — Pages, Brand, Library, Marketplace, Settings tabs
219
+ - **Guided entry with asset-type cards** — Landing Page, Email, Website, Blog Post, From Template, and Import
220
+ - **First-visit onboarding** — 3-step walkthrough for new users
221
+ - **Material Design SVG icons** — replaced UI emoji glyphs with crisp SVG icons
222
+ - **Project assets browser** — Library tab shows project files (images, fonts, scripts) instead of starter templates
223
+
224
+ ### v1.2.0
225
+ - **Inverse pipeline (HubSpot → vibeSpot)** — reverse-engineer imported HubSpot themes: design token extraction, module graph, field schema flags, and round-trip risk detection
226
+ - **Simplified setup** — returning users land on a recent projects rail; new users see a chat-style prompt as the primary path
227
+ - **Select mode** — click elements in the live preview to reference them in chat
228
+ - **Undo/redo with visual timeline** — Ctrl+Z / Ctrl+Y step through version history with hover tooltips
229
+ - **Smart chat suggestions** — contextual suggestion chips filtered by existing modules
230
+ - **Plan-mode templates** — 7 pre-canned plan structures that skip cold-start elicitation
231
+ - **Starter templates** — 5 bundled page templates for instant preview with no AI wait
232
+ - **HubSpot Marketplace publication path** — rule-based audit, auto-fix, and listing metadata editor
233
+
185
234
  ### v1.1.3
186
235
  - **Model selection persists for Codex CLI, Gemini CLI, and Gemini API** — picking a non-default model used to revert because the `/api/settings/engine` route had no cases for those engines, no config fields existed, and `getCurrentModel` returned `null` (so the dropdown reset to the first option). Added the config fields, route persistence, UI lookup, and runtime `--model`/`-m` flag plumbing into the CLI subprocess invocation.
187
236
 
@@ -0,0 +1,251 @@
1
+ # BLOG_RULES.md — HubSpot Blog Template Rules & Variables
2
+
3
+ > Rules for generating HubSpot blog listing and blog post templates. Every variable and pattern here comes from the HubSpot CMS blog documentation and real template validation.
4
+
5
+ ---
6
+
7
+ ## 1. Template Types
8
+
9
+ HubSpot blogs require TWO templates:
10
+
11
+ ### Blog Post Template
12
+ - `templateType: blog_post` in the template annotation
13
+ - Renders a single blog post
14
+ - `host_template_types: ["BLOG_POST"]` in module meta.json
15
+
16
+ ### Blog Listing Template
17
+ - `templateType: blog_listing` in the template annotation
18
+ - Renders the blog index / archive page with post cards
19
+ - `host_template_types: ["BLOG_LISTING"]` in module meta.json
20
+
21
+ Modules can support both: `host_template_types: ["BLOG_POST", "BLOG_LISTING"]`
22
+
23
+ ---
24
+
25
+ ## 2. Blog Post Variables (Required)
26
+
27
+ These HubL variables are available in blog post templates:
28
+
29
+ ```
30
+ {{ content.name }} — Post title
31
+ {{ content.post_body }} — Full post body HTML (the article content)
32
+ {{ content.featured_image }} — Featured image URL
33
+ {{ content.featured_image_alt_text }} — Featured image alt text
34
+ {{ content.publish_date }} — Publish date (use |datetimeformat)
35
+ {{ content.updated }} — Last updated date
36
+ {{ content.meta_description }} — SEO meta description / excerpt
37
+ {{ content.absolute_url }} — Canonical URL
38
+ {{ content.comment_count }} — Number of comments
39
+ ```
40
+
41
+ ### Author Variables
42
+ ```
43
+ {{ content.blog_post_author }} — Author display name
44
+ {{ content.author.display_name }} — Author display name (alternative)
45
+ {{ content.author.avatar }} — Author avatar image URL
46
+ {{ content.author.bio }} — Author bio text
47
+ {{ content.author.slug }} — Author URL slug
48
+ {{ content.author.email }} — Author email
49
+ ```
50
+
51
+ ### Tag & Topic Variables
52
+ ```
53
+ {{ content.tag_list }} — List of tags (iterable)
54
+ {{ content.topic_list }} — List of topics/categories (iterable)
55
+ ```
56
+
57
+ Tag iteration:
58
+ ```html
59
+ {% for tag in content.tag_list %}
60
+ <a href="{{ blog_tag_url(group.id, tag.slug) }}">{{ tag.name }}</a>
61
+ {% endfor %}
62
+ ```
63
+
64
+ ### Date Formatting
65
+ ```html
66
+ {{ content.publish_date|datetimeformat('%B %d, %Y') }}
67
+ <!-- Output: April 30, 2026 -->
68
+
69
+ {{ content.publish_date|datetimeformat('%b %d') }}
70
+ <!-- Output: Apr 30 -->
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 3. Blog Listing Variables (Required)
76
+
77
+ These HubL variables are available in blog listing templates:
78
+
79
+ ### Post Loop
80
+ ```html
81
+ {% for content in contents %}
82
+ <h2><a href="{{ content.absolute_url }}">{{ content.name }}</a></h2>
83
+ <p>{{ content.meta_description|truncate(160) }}</p>
84
+ {% if content.featured_image %}
85
+ <img src="{{ content.featured_image }}" alt="{{ content.featured_image_alt_text }}" />
86
+ {% endif %}
87
+ <span>{{ content.publish_date|datetimeformat('%B %d, %Y') }}</span>
88
+ <span>{{ content.blog_post_author }}</span>
89
+ {% endfor %}
90
+ ```
91
+
92
+ ### Blog Metadata
93
+ ```
94
+ {{ group.public_title }} — Blog name/title
95
+ {{ group.description }} — Blog description
96
+ {{ group.absolute_url }} — Blog listing URL
97
+ ```
98
+
99
+ ### Pagination
100
+ ```html
101
+ {% if last_page_num > 1 %}
102
+ <nav class="blog-pagination">
103
+ {% if current_page_num > 1 %}
104
+ <a href="{{ blog_page_link(current_page_num - 1) }}">Previous</a>
105
+ {% endif %}
106
+
107
+ {% for page_num in range(1, last_page_num + 1) %}
108
+ {% if page_num == current_page_num %}
109
+ <span class="current">{{ page_num }}</span>
110
+ {% else %}
111
+ <a href="{{ blog_page_link(page_num) }}">{{ page_num }}</a>
112
+ {% endif %}
113
+ {% endfor %}
114
+
115
+ {% if current_page_num < last_page_num %}
116
+ <a href="{{ blog_page_link(current_page_num + 1) }}">Next</a>
117
+ {% endif %}
118
+ </nav>
119
+ {% endif %}
120
+ ```
121
+
122
+ ### Filtering by Topic/Tag
123
+ ```html
124
+ {% set topics = blog_topics(group.id, 250) %}
125
+ {% for topic in topics %}
126
+ <a href="{{ blog_tag_url(group.id, topic.slug) }}"
127
+ class="{% if topic.slug == tag %}active{% endif %}">
128
+ {{ topic.name }}
129
+ </a>
130
+ {% endfor %}
131
+ ```
132
+
133
+ ---
134
+
135
+ ## 4. Related Posts & Widgets
136
+
137
+ ### Related Posts
138
+ ```html
139
+ {% related_blog_posts limit=3 %}
140
+ ```
141
+
142
+ Or manual implementation:
143
+ ```html
144
+ {% set recent = blog_recent_posts(group.id, 3) %}
145
+ {% for post in recent %}
146
+ {% if post.absolute_url != content.absolute_url %}
147
+ <a href="{{ post.absolute_url }}">{{ post.name }}</a>
148
+ {% endif %}
149
+ {% endfor %}
150
+ ```
151
+
152
+ ### Blog Social Sharing
153
+ ```html
154
+ {% blog_social_sharing %}
155
+ ```
156
+
157
+ ### Blog Comments
158
+ ```html
159
+ {% blog_comments %}
160
+ ```
161
+
162
+ ### Blog Subscribe (CTA)
163
+ ```html
164
+ {% blog_subscribe "blog_subscribe" overrideable=True, label="Blog Subscribe" %}
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 5. Reading-Optimized Design Rules
170
+
171
+ ### Typography
172
+ - Body text: 18-20px for long-form readability
173
+ - Line height: 1.6-1.8 for body copy
174
+ - Content width: 680-720px max for article body (optimal reading measure)
175
+ - Heading scale: use a clear hierarchy (h1 > h2 > h3)
176
+
177
+ ### Spacing
178
+ - Generous paragraph spacing: 1.5em between paragraphs
179
+ - Section breaks: 3-4rem between major sections
180
+ - Whitespace is critical for readability
181
+
182
+ ### Images
183
+ - Featured image: full-width within content area, 16:9 or 3:2 aspect ratio
184
+ - In-article images: max-width: 100% within the content column
185
+ - Always include alt text fields
186
+ - Use lazy loading: `loading="lazy"` on images below the fold
187
+
188
+ ### Colors
189
+ - High contrast for body text (WCAG AA minimum)
190
+ - Subtle accent for links (distinguishable but not distracting)
191
+ - Light background for reading (dark text on light bg for articles)
192
+
193
+ ---
194
+
195
+ ## 6. Module Patterns for Blog
196
+
197
+ ### Blog Post Modules (typical set)
198
+ 1. **blog-post-header** — Title, featured image, author, date, tags
199
+ 2. **blog-post-body** — The `{{ content.post_body }}` wrapper with reading-optimized styles
200
+ 3. **author-bio** — Author card with avatar, name, bio, social links
201
+ 4. **related-posts** — 3 related post cards
202
+ 5. **blog-comments** — Comment section
203
+ 6. **share-bar** — Social sharing buttons
204
+
205
+ ### Blog Listing Modules (typical set)
206
+ 1. **blog-hero** — Blog name, description, featured/pinned post
207
+ 2. **topic-filter** — Category/tag navigation pills
208
+ 3. **post-grid** — Card grid of posts with pagination
209
+ 4. **newsletter-signup** — Email subscription form
210
+ 5. **popular-posts** — Sidebar or section with most-read posts
211
+
212
+ ### Module meta.json for Blog Post
213
+ ```json
214
+ {
215
+ "host_template_types": ["BLOG_POST"],
216
+ "is_available_for_new_content": true
217
+ }
218
+ ```
219
+
220
+ ### Module meta.json for Blog Listing
221
+ ```json
222
+ {
223
+ "host_template_types": ["BLOG_LISTING"],
224
+ "is_available_for_new_content": true
225
+ }
226
+ ```
227
+
228
+ ---
229
+
230
+ ## 7. Common Mistakes
231
+
232
+ - Using `{{ content.body }}` instead of `{{ content.post_body }}` — post_body is the correct variable
233
+ - Forgetting pagination on listing templates — always include when more than 1 page
234
+ - Not using `|datetimeformat` on dates — raw dates are ugly
235
+ - Using `now()` — not valid HubL, use `local_dt` instead
236
+ - Hardcoding blog URLs — use `{{ content.absolute_url }}` and `{{ blog_page_link() }}`
237
+ - Missing `{% for content in contents %}` loop on listing pages — this is required
238
+ - Using page-style `{% dnd_area %}` in blog templates — blog templates use fixed module positions
239
+ - Not setting correct `host_template_types` — blog modules need `BLOG_POST` or `BLOG_LISTING`
240
+
241
+ ---
242
+
243
+ ## 8. SEO Essentials
244
+
245
+ Blog post templates should include:
246
+ - `<title>{{ content.name }} | {{ group.public_title }}</title>` (or via HubSpot settings)
247
+ - `<meta name="description" content="{{ content.meta_description }}" />`
248
+ - `<link rel="canonical" href="{{ content.absolute_url }}" />`
249
+ - Open Graph tags for social sharing
250
+ - Structured data (Article schema) where possible
251
+ - Proper heading hierarchy (single h1 for post title)