showpane 0.4.20 → 0.4.22

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-04-12T08:47:16.973Z",
3
+ "generatedAt": "2026-04-12T09:23:46.426Z",
4
4
  "scaffoldVersion": "0.2.7",
5
5
  "files": {
6
6
  ".env.example": "ed105f2bdcd1888a98181d55e3c9f7d6eff3ae9c3e2366c2e777a12e3caddfa7",
@@ -12,7 +12,7 @@
12
12
  "postcss.config.js": "fa650b380adfabb151a0b352f7135e107e6352345f899060f1c5c231228f94bf",
13
13
  "prisma.config.ts": "36f56fd74eae70632e484443e38d08665158d72d5c978dc456651d8d5e1a636e",
14
14
  "prisma/schema.local.prisma": "f5d6f3cb17d6d229f46ef82eef7c0ff4261596924f0173fef075ac394f423073",
15
- "prisma/seed.ts": "98f7d5fd97ce2ff66bdf060ccb6695416d18ac983672b256d5d95d315ccee6e5",
15
+ "prisma/seed.ts": "01b4295296676ab415ab2b30b4e39e13c3fdd30c3bab2b22a7cca672d1c2ea90",
16
16
  "public/example-avatar.svg": "0edeb0d3fbefa89cc27ffe6564d20e3ee0fd073cb6d9f2a025248ef3b3f277fd",
17
17
  "public/example-logo.svg": "bc5cd933aff2a17698dee66a7b4ea940ad12238e9d813474d643b459b1e8d6da",
18
18
  "public/robots.txt": "331ea9090db0c9f6f597bd9840fd5b171830f6e0b3ba1cb24dfa91f0c95aedc1",
@@ -30,11 +30,15 @@ async function main() {
30
30
 
31
31
  const organizationSlug =
32
32
  process.env.SHOWPANE_ORG_SLUG?.trim() || normalizeSlug(organizationName);
33
- const contactName = process.env.SHOWPANE_CONTACT_NAME?.trim() || null;
34
- const contactEmail = process.env.SHOWPANE_CONTACT_EMAIL?.trim() || null;
33
+ const contactName = process.env.SHOWPANE_CONTACT_NAME?.trim() || organizationName;
34
+ const contactEmail = process.env.SHOWPANE_CONTACT_EMAIL?.trim() || "";
35
35
  const websiteUrl = normalizeWebsiteUrl(process.env.SHOWPANE_WEBSITE_URL);
36
36
  const contactTitle = "Point of contact";
37
37
 
38
+ if (!contactEmail) {
39
+ throw new Error("SHOWPANE_CONTACT_EMAIL is required to seed the local organization");
40
+ }
41
+
38
42
  const org = await prisma.organization.upsert({
39
43
  where: { slug: organizationSlug },
40
44
  update: {},
@@ -1 +1 @@
1
- 0.4.20
1
+ 0.4.22
@@ -28,7 +28,22 @@ async function main() {
28
28
  try {
29
29
  const org = await prisma.organization.findUnique({
30
30
  where: { slug },
31
- select: { id: true, slug: true, name: true },
31
+ select: {
32
+ id: true,
33
+ slug: true,
34
+ name: true,
35
+ logoUrl: true,
36
+ primaryColor: true,
37
+ portalLabel: true,
38
+ websiteUrl: true,
39
+ contactName: true,
40
+ contactTitle: true,
41
+ contactEmail: true,
42
+ contactPhone: true,
43
+ contactAvatar: true,
44
+ supportEmail: true,
45
+ customDomain: true,
46
+ },
32
47
  });
33
48
 
34
49
  if (!org) {
@@ -128,6 +128,12 @@ Store:
128
128
 
129
129
  - `ORG_ID`
130
130
  - `ORG_NAME`
131
+ - `ORG_CONTACT_NAME`
132
+ - `ORG_CONTACT_TITLE`
133
+ - `ORG_CONTACT_EMAIL`
134
+ - `ORG_CONTACT_AVATAR`
135
+ - `ORG_SUPPORT_EMAIL`
136
+ - `ORG_WEBSITE_URL`
131
137
 
132
138
  If the helper fails, stop and tell the user to run `/portal-setup` again instead
133
139
  of guessing with ad-hoc SQL.
@@ -140,6 +146,7 @@ The canonical references for this skill are:
140
146
 
141
147
  - the configured `APP_PATH`
142
148
  - the configured `ORG_SLUG`
149
+ - the org fields returned by `get-org.ts`
143
150
  - this skill file
144
151
  - `$SKILL_DIR/templates/<chosen-template>/...`
145
152
  - `$APP_PATH/src/app/(portal)/client/example/example-client.tsx`
@@ -277,13 +284,13 @@ import { PortalShell } from "@/components/portal-shell";
277
284
  - The exported component returns `<PortalShell>` with all required props
278
285
 
279
286
  **PortalShell props (all required):**
280
- - `companyName` — the org's company name (from config/DB)
287
+ - `companyName` — the org's company name (from `ORG_NAME`)
281
288
  - `companyLogo` — a `<span>` with the first letter of the company name, white text
282
289
  - `clientName` — the client's company name (from transcript or user input)
283
290
  - `clientLogoSrc` — if client domain was provided: use `getLogoUrl(domain)` from `app/src/lib/branding.ts`. If not: use `getInitialLogo(clientName)` to generate an SVG data URI. Store the chosen URL in the ClientPortal record's `logoUrl` field
284
291
  - `clientLogoAlt` — the client company name
285
292
  - `lastUpdated` — today's date formatted as "7 April 2026"
286
- - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from org config)
293
+ - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from the `get-org.ts` result, not from ad-hoc config or DB probing)
287
294
  - `tabs` — array of tab objects with `id`, `label`, `icon`, `content`, and optional `badge`
288
295
  - `hideFooterOnTab` — set to `"overview"` (hides the contact footer on the first tab since it typically has contact info inline)
289
296
 
@@ -33,6 +33,12 @@ Store:
33
33
 
34
34
  - `ORG_ID`
35
35
  - `ORG_NAME`
36
+ - `ORG_CONTACT_NAME`
37
+ - `ORG_CONTACT_TITLE`
38
+ - `ORG_CONTACT_EMAIL`
39
+ - `ORG_CONTACT_AVATAR`
40
+ - `ORG_SUPPORT_EMAIL`
41
+ - `ORG_WEBSITE_URL`
36
42
 
37
43
  If the helper fails, stop and tell the user to run `/portal-setup` again instead
38
44
  of guessing with ad-hoc SQL.
@@ -45,6 +51,7 @@ The canonical references for this skill are:
45
51
 
46
52
  - the configured `APP_PATH`
47
53
  - the configured `ORG_SLUG`
54
+ - the org fields returned by `get-org.ts`
48
55
  - this skill file
49
56
  - `$SKILL_DIR/templates/<chosen-template>/...`
50
57
  - `$APP_PATH/src/app/(portal)/client/example/example-client.tsx`
@@ -182,13 +189,13 @@ import { PortalShell } from "@/components/portal-shell";
182
189
  - The exported component returns `<PortalShell>` with all required props
183
190
 
184
191
  **PortalShell props (all required):**
185
- - `companyName` — the org's company name (from config/DB)
192
+ - `companyName` — the org's company name (from `ORG_NAME`)
186
193
  - `companyLogo` — a `<span>` with the first letter of the company name, white text
187
194
  - `clientName` — the client's company name (from transcript or user input)
188
195
  - `clientLogoSrc` — if client domain was provided: use `getLogoUrl(domain)` from `app/src/lib/branding.ts`. If not: use `getInitialLogo(clientName)` to generate an SVG data URI. Store the chosen URL in the ClientPortal record's `logoUrl` field
189
196
  - `clientLogoAlt` — the client company name
190
197
  - `lastUpdated` — today's date formatted as "7 April 2026"
191
- - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from org config)
198
+ - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from the `get-org.ts` result, not from ad-hoc config or DB probing)
192
199
  - `tabs` — array of tab objects with `id`, `label`, `icon`, `content`, and optional `badge`
193
200
  - `hideFooterOnTab` — set to `"overview"` (hides the contact footer on the first tab since it typically has contact info inline)
194
201
 
@@ -290,9 +290,17 @@ Save checkpoint with:
290
290
 
291
291
  ### Phase 5: Practical refinements
292
292
 
293
- Do not ask the user to invent a whole redesign. Ask for one or two high-signal refinements only.
293
+ This phase is optional.
294
294
 
295
- Recommended refinement prompts:
295
+ Default behavior: do not stop to ask for refinements right after the draft is created.
296
+ Move straight to preview unless one of these is true:
297
+
298
+ - the user explicitly asked to polish before preview
299
+ - there is an obvious missing practical element that would make the preview misleading
300
+
301
+ If you do need a refinement prompt, keep it to one short, high-signal question.
302
+
303
+ Recommended options:
296
304
 
297
305
  - `Do you want the portal to feel more concise, more sales-focused, or more delivery-focused?`
298
306
  - `Should we add anything practical before preview — timeline, documents, or sharper next steps?`
@@ -300,12 +308,18 @@ Recommended refinement prompts:
300
308
  Apply the requested refinement inline, using the same patterns as `/portal-update`
301
309
  without forcing the user to switch skills.
302
310
 
303
- If the user is happy with the first draft, move on immediately.
311
+ If no refinement is needed, skip this phase entirely.
304
312
 
305
313
  Save checkpoint with phase `draft-refined`.
306
314
 
307
315
  ### Phase 6: Local preview
308
316
 
317
+ The default path is:
318
+
319
+ 1. create the draft
320
+ 2. show local credentials if they were generated
321
+ 3. open the preview immediately
322
+
309
323
  Run the `portal-preview` flow inline.
310
324
 
311
325
  If no dev server is running, start it using the `portal-dev` instructions first.
@@ -320,6 +334,9 @@ the preview link. Keep it simple:
320
334
  Do this before opening the browser so the user is not dropped onto a login screen
321
335
  without the credentials they need.
322
336
 
337
+ After that, open the local preview immediately. Do not ask a separate
338
+ "do you want refinements first?" question unless the user already asked for that.
339
+
323
340
  Tell the user exactly what to inspect:
324
341
 
325
342
  - does the overall story feel right?
@@ -197,9 +197,17 @@ Save checkpoint with:
197
197
 
198
198
  ### Phase 5: Practical refinements
199
199
 
200
- Do not ask the user to invent a whole redesign. Ask for one or two high-signal refinements only.
200
+ This phase is optional.
201
201
 
202
- Recommended refinement prompts:
202
+ Default behavior: do not stop to ask for refinements right after the draft is created.
203
+ Move straight to preview unless one of these is true:
204
+
205
+ - the user explicitly asked to polish before preview
206
+ - there is an obvious missing practical element that would make the preview misleading
207
+
208
+ If you do need a refinement prompt, keep it to one short, high-signal question.
209
+
210
+ Recommended options:
203
211
 
204
212
  - `Do you want the portal to feel more concise, more sales-focused, or more delivery-focused?`
205
213
  - `Should we add anything practical before preview — timeline, documents, or sharper next steps?`
@@ -207,12 +215,18 @@ Recommended refinement prompts:
207
215
  Apply the requested refinement inline, using the same patterns as `/portal-update`
208
216
  without forcing the user to switch skills.
209
217
 
210
- If the user is happy with the first draft, move on immediately.
218
+ If no refinement is needed, skip this phase entirely.
211
219
 
212
220
  Save checkpoint with phase `draft-refined`.
213
221
 
214
222
  ### Phase 6: Local preview
215
223
 
224
+ The default path is:
225
+
226
+ 1. create the draft
227
+ 2. show local credentials if they were generated
228
+ 3. open the preview immediately
229
+
216
230
  Run the `portal-preview` flow inline.
217
231
 
218
232
  If no dev server is running, start it using the `portal-dev` instructions first.
@@ -227,6 +241,9 @@ the preview link. Keep it simple:
227
241
  Do this before opening the browser so the user is not dropped onto a login screen
228
242
  without the credentials they need.
229
243
 
244
+ After that, open the local preview immediately. Do not ask a separate
245
+ "do you want refinements first?" question unless the user already asked for that.
246
+
230
247
  Tell the user exactly what to inspect:
231
248
 
232
249
  - does the overall story feel right?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "showpane",
3
- "version": "0.4.20",
3
+ "version": "0.4.22",
4
4
  "description": "CLI for Showpane — AI-generated client portals",
5
5
  "type": "module",
6
6
  "bin": {