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.
- 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/bin/get-org.ts +16 -1
- package/bundle/toolchain/skills/portal-create/SKILL.md +9 -2
- package/bundle/toolchain/skills/portal-create/SKILL.md.tmpl +9 -2
- 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-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": "
|
|
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.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: {
|
|
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
|
|
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
|
|
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
|
-
|
|
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?
|