showpane 0.4.20 → 0.4.23

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-12T11:40:53.513Z",
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.23
@@ -1 +1 @@
1
- 1.1.7 (requires app >= 0.2.7)
1
+ 1.1.8 (requires app >= 0.2.7)
@@ -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.
@@ -135,11 +141,14 @@ of guessing with ad-hoc SQL.
135
141
  Do not probe `showpane --help`, `package.json`, `scripts/`, `prisma/`, or template
136
142
  directories just to understand the project. Do not call `check-slug.ts` with
137
143
  anything except `--org-id`.
144
+ Do not re-read config, Prisma, or SQLite to rediscover org fields that were already
145
+ returned by `get-org.ts`.
138
146
 
139
147
  The canonical references for this skill are:
140
148
 
141
149
  - the configured `APP_PATH`
142
150
  - the configured `ORG_SLUG`
151
+ - the org fields returned by `get-org.ts`
143
152
  - this skill file
144
153
  - `$SKILL_DIR/templates/<chosen-template>/...`
145
154
  - `$APP_PATH/src/app/(portal)/client/example/example-client.tsx`
@@ -277,13 +286,13 @@ import { PortalShell } from "@/components/portal-shell";
277
286
  - The exported component returns `<PortalShell>` with all required props
278
287
 
279
288
  **PortalShell props (all required):**
280
- - `companyName` — the org's company name (from config/DB)
289
+ - `companyName` — the org's company name (from `ORG_NAME`)
281
290
  - `companyLogo` — a `<span>` with the first letter of the company name, white text
282
291
  - `clientName` — the client's company name (from transcript or user input)
283
292
  - `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
293
  - `clientLogoAlt` — the client company name
285
294
  - `lastUpdated` — today's date formatted as "7 April 2026"
286
- - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from org config)
295
+ - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from the `get-org.ts` result, not from ad-hoc config or DB probing)
287
296
  - `tabs` — array of tab objects with `id`, `label`, `icon`, `content`, and optional `badge`
288
297
  - `hideFooterOnTab` — set to `"overview"` (hides the contact footer on the first tab since it typically has contact info inline)
289
298
 
@@ -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.
@@ -40,11 +46,14 @@ of guessing with ad-hoc SQL.
40
46
  Do not probe `showpane --help`, `package.json`, `scripts/`, `prisma/`, or template
41
47
  directories just to understand the project. Do not call `check-slug.ts` with
42
48
  anything except `--org-id`.
49
+ Do not re-read config, Prisma, or SQLite to rediscover org fields that were already
50
+ returned by `get-org.ts`.
43
51
 
44
52
  The canonical references for this skill are:
45
53
 
46
54
  - the configured `APP_PATH`
47
55
  - the configured `ORG_SLUG`
56
+ - the org fields returned by `get-org.ts`
48
57
  - this skill file
49
58
  - `$SKILL_DIR/templates/<chosen-template>/...`
50
59
  - `$APP_PATH/src/app/(portal)/client/example/example-client.tsx`
@@ -182,13 +191,13 @@ import { PortalShell } from "@/components/portal-shell";
182
191
  - The exported component returns `<PortalShell>` with all required props
183
192
 
184
193
  **PortalShell props (all required):**
185
- - `companyName` — the org's company name (from config/DB)
194
+ - `companyName` — the org's company name (from `ORG_NAME`)
186
195
  - `companyLogo` — a `<span>` with the first letter of the company name, white text
187
196
  - `clientName` — the client's company name (from transcript or user input)
188
197
  - `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
198
  - `clientLogoAlt` — the client company name
190
199
  - `lastUpdated` — today's date formatted as "7 April 2026"
191
- - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from org config)
200
+ - `contact` — object with `name`, `title`, `avatarSrc`, `email` (from the `get-org.ts` result, not from ad-hoc config or DB probing)
192
201
  - `tabs` — array of tab objects with `id`, `label`, `icon`, `content`, and optional `badge`
193
202
  - `hideFooterOnTab` — set to `"overview"` (hides the contact footer on the first tab since it typically has contact info inline)
194
203
 
@@ -131,10 +131,9 @@ fi
131
131
  If the token is missing, stop and tell the user:
132
132
 
133
133
  - `showpane login` is the right next step
134
- - it opens browser auth for Showpane Cloud automatically
135
- - if they need an account first:
136
- - sign up: `https://app.showpane.com/sign-up`
137
- - sign in: `https://app.showpane.com/sign-in`
134
+ - it owns the whole browser flow now: sign up or sign in if needed, start checkout,
135
+ then return to CLI authorization automatically
136
+ - do not manually steer the user through separate sign-up, sign-in, or checkout steps
138
137
 
139
138
  If they are already inside Claude Code, explicitly suggest:
140
139
 
@@ -536,7 +535,7 @@ If the health endpoint returns non-200 after deploy:
536
535
  If the Showpane Cloud API returns 401/403 during pre-flight or publish:
537
536
  - **401 Unauthorized**: The access token is expired or revoked. Run `showpane login` to re-authenticate.
538
537
  - **403 Forbidden**: The token does not belong to an org that can publish. Re-authenticate or finish cloud onboarding.
539
- - **409 organization_required**: The user authenticated but has no org yet. Send them to Showpane Cloud checkout to start the trial, then re-run `showpane login`.
538
+ - **409 organization_required**: Tell the user to run `showpane login` again and let that browser flow continue. Do not manually redirect them into separate checkout steps from this skill.
540
539
  - **409 organization_not_ready**: The org exists, but billing or provisioning is not publish-ready. Surface the returned `reason`, `nextAction`, and settings/checkout URL directly instead of collapsing it into a generic deploy failure.
541
540
 
542
541
  ### Cloud: Artifact upload failure
@@ -36,10 +36,9 @@ fi
36
36
  If the token is missing, stop and tell the user:
37
37
 
38
38
  - `showpane login` is the right next step
39
- - it opens browser auth for Showpane Cloud automatically
40
- - if they need an account first:
41
- - sign up: `https://app.showpane.com/sign-up`
42
- - sign in: `https://app.showpane.com/sign-in`
39
+ - it owns the whole browser flow now: sign up or sign in if needed, start checkout,
40
+ then return to CLI authorization automatically
41
+ - do not manually steer the user through separate sign-up, sign-in, or checkout steps
43
42
 
44
43
  If they are already inside Claude Code, explicitly suggest:
45
44
 
@@ -441,7 +440,7 @@ If the health endpoint returns non-200 after deploy:
441
440
  If the Showpane Cloud API returns 401/403 during pre-flight or publish:
442
441
  - **401 Unauthorized**: The access token is expired or revoked. Run `showpane login` to re-authenticate.
443
442
  - **403 Forbidden**: The token does not belong to an org that can publish. Re-authenticate or finish cloud onboarding.
444
- - **409 organization_required**: The user authenticated but has no org yet. Send them to Showpane Cloud checkout to start the trial, then re-run `showpane login`.
443
+ - **409 organization_required**: Tell the user to run `showpane login` again and let that browser flow continue. Do not manually redirect them into separate checkout steps from this skill.
445
444
  - **409 organization_not_ready**: The org exists, but billing or provisioning is not publish-ready. Surface the returned `reason`, `nextAction`, and settings/checkout URL directly instead of collapsing it into a generic deploy failure.
446
445
 
447
446
  ### Cloud: Artifact upload failure
@@ -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.23",
4
4
  "description": "CLI for Showpane — AI-generated client portals",
5
5
  "type": "module",
6
6
  "bin": {