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.
- package/bundle/meta/scaffold-manifest.json +2 -2
- package/bundle/scaffold/prisma/seed.ts +6 -2
- package/bundle/toolchain/CLI_VERSION +1 -1
- package/bundle/toolchain/VERSION +1 -1
- package/bundle/toolchain/bin/get-org.ts +16 -1
- package/bundle/toolchain/skills/portal-create/SKILL.md +11 -2
- package/bundle/toolchain/skills/portal-create/SKILL.md.tmpl +11 -2
- package/bundle/toolchain/skills/portal-deploy/SKILL.md +4 -5
- package/bundle/toolchain/skills/portal-deploy/SKILL.md.tmpl +4 -5
- package/bundle/toolchain/skills/portal-onboard/SKILL.md +20 -3
- package/bundle/toolchain/skills/portal-onboard/SKILL.md.tmpl +20 -3
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"generatedAt": "2026-04-
|
|
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": "
|
|
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() ||
|
|
34
|
-
const contactEmail = process.env.SHOWPANE_CONTACT_EMAIL?.trim() ||
|
|
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.
|
|
1
|
+
0.4.23
|
package/bundle/toolchain/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.1.
|
|
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: {
|
|
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
|
|
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
|
|
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
|
|
135
|
-
|
|
136
|
-
|
|
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**:
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
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**:
|
|
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
|
-
|
|
293
|
+
This phase is optional.
|
|
294
294
|
|
|
295
|
-
|
|
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
|
|
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
|
-
|
|
200
|
+
This phase is optional.
|
|
201
201
|
|
|
202
|
-
|
|
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
|
|
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?
|