showpane 0.4.14 → 0.4.16
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 +8 -8
- package/bundle/scaffold/VERSION +1 -1
- package/bundle/scaffold/prisma/seed.ts +40 -35
- package/bundle/scaffold/src/app/(portal)/client/example/example-client.tsx +1 -2
- package/bundle/scaffold/src/app/(portal)/client/page.tsx +5 -4
- package/bundle/scaffold/src/app/page.tsx +2 -2
- package/bundle/scaffold/src/components/portal-shell.tsx +1 -1
- package/bundle/toolchain/CLI_VERSION +1 -1
- package/bundle/toolchain/VERSION +1 -1
- package/bundle/toolchain/skills/VERSION +1 -1
- package/bundle/toolchain/skills/portal-analytics/SKILL.md +9 -12
- package/bundle/toolchain/skills/portal-analytics/SKILL.md.tmpl +4 -4
- package/bundle/toolchain/skills/portal-create/SKILL.md +13 -16
- package/bundle/toolchain/skills/portal-create/SKILL.md.tmpl +8 -8
- package/bundle/toolchain/skills/portal-credentials/SKILL.md +15 -18
- package/bundle/toolchain/skills/portal-credentials/SKILL.md.tmpl +10 -10
- package/bundle/toolchain/skills/portal-delete/SKILL.md +14 -17
- package/bundle/toolchain/skills/portal-delete/SKILL.md.tmpl +9 -9
- package/bundle/toolchain/skills/portal-deploy/SKILL.md +5 -8
- package/bundle/toolchain/skills/portal-dev/SKILL.md +10 -13
- package/bundle/toolchain/skills/portal-dev/SKILL.md.tmpl +5 -5
- package/bundle/toolchain/skills/portal-list/SKILL.md +15 -18
- package/bundle/toolchain/skills/portal-list/SKILL.md.tmpl +10 -10
- package/bundle/toolchain/skills/portal-onboard/SKILL.md +50 -30
- package/bundle/toolchain/skills/portal-onboard/SKILL.md.tmpl +46 -23
- package/bundle/toolchain/skills/portal-preview/SKILL.md +16 -19
- package/bundle/toolchain/skills/portal-preview/SKILL.md.tmpl +11 -11
- package/bundle/toolchain/skills/portal-setup/SKILL.md +15 -13
- package/bundle/toolchain/skills/portal-setup/SKILL.md.tmpl +11 -6
- package/bundle/toolchain/skills/portal-share/SKILL.md +17 -20
- package/bundle/toolchain/skills/portal-share/SKILL.md.tmpl +12 -12
- package/bundle/toolchain/skills/portal-status/SKILL.md +9 -12
- package/bundle/toolchain/skills/portal-status/SKILL.md.tmpl +4 -4
- package/bundle/toolchain/skills/portal-update/SKILL.md +9 -12
- package/bundle/toolchain/skills/portal-update/SKILL.md.tmpl +4 -4
- package/bundle/toolchain/skills/portal-upgrade/SKILL.md +6 -9
- package/bundle/toolchain/skills/portal-upgrade/SKILL.md.tmpl +1 -1
- package/bundle/toolchain/skills/portal-verify/SKILL.md +6 -9
- package/bundle/toolchain/skills/portal-verify/SKILL.md.tmpl +1 -1
- package/bundle/toolchain/skills/shared/runtime-principles.md +4 -4
- package/bundle/toolchain/templates/sales-followup/sales-followup-client.tsx +1 -1
- package/dist/index.js +28 -5
- package/package.json +3 -3
|
@@ -25,7 +25,7 @@ SHOWPANE_HOME="$HOME/.showpane"
|
|
|
25
25
|
SHOWPANE_BIN="$SHOWPANE_HOME/bin"
|
|
26
26
|
CONFIG="$SHOWPANE_HOME/config.json"
|
|
27
27
|
if [ ! -f "$CONFIG" ]; then
|
|
28
|
-
echo "Showpane not configured. Run /portal
|
|
28
|
+
echo "Showpane not configured. Run /portal-setup first."
|
|
29
29
|
exit 1
|
|
30
30
|
fi
|
|
31
31
|
|
|
@@ -78,16 +78,13 @@ echo "TEL_PROMPTED: $TEL_PROMPTED"
|
|
|
78
78
|
|
|
79
79
|
If output shows `JUST_UPGRADED <from> <to>`, tell the user Showpane was just upgraded and continue.
|
|
80
80
|
|
|
81
|
-
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal
|
|
81
|
+
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal-upgrade`.
|
|
82
82
|
|
|
83
|
-
If `TEL_PROMPTED` is `no`,
|
|
83
|
+
If `TEL_PROMPTED` is `no`, default telemetry to `anonymous` without interrupting the flow. Do not mention telemetry unless the user asks.
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
- off — local analytics only, no remote sync
|
|
87
|
-
|
|
88
|
-
After the user chooses, run:
|
|
85
|
+
Run:
|
|
89
86
|
```bash
|
|
90
|
-
"$SHOWPANE_BIN/showpane-config" set telemetry
|
|
87
|
+
"$SHOWPANE_BIN/showpane-config" set telemetry anonymous
|
|
91
88
|
touch "$SHOWPANE_HOME/.telemetry-prompted"
|
|
92
89
|
```
|
|
93
90
|
|
|
@@ -121,7 +118,7 @@ Soft delete is intentional. Nothing is truly destroyed. If the user changes thei
|
|
|
121
118
|
|
|
122
119
|
### Step 1: Identify the target portal
|
|
123
120
|
|
|
124
|
-
The user must specify which portal to deactivate. If no slug is provided, ask: "Which portal do you want to deactivate? Run /portal
|
|
121
|
+
The user must specify which portal to deactivate. If no slug is provided, ask: "Which portal do you want to deactivate? Run /portal-list to see your portals."
|
|
125
122
|
|
|
126
123
|
Do not proceed without a confirmed slug.
|
|
127
124
|
|
|
@@ -158,7 +155,7 @@ Expected success response:
|
|
|
158
155
|
|
|
159
156
|
Expected error responses:
|
|
160
157
|
|
|
161
|
-
- `portal_not_found`: The slug does not exist in this organization. Suggest `/portal
|
|
158
|
+
- `portal_not_found`: The slug does not exist in this organization. Suggest `/portal-list`.
|
|
162
159
|
- `already_inactive`: The portal is already deactivated. Inform the user: "Portal '<slug>' is already inactive. No changes made."
|
|
163
160
|
|
|
164
161
|
### Step 4: Print confirmation
|
|
@@ -194,7 +191,7 @@ Depending on context:
|
|
|
194
191
|
|
|
195
192
|
- "To reactivate this portal later, update the database record: set `isActive` to `true` on the ClientPortal with slug '<slug>'."
|
|
196
193
|
- "To permanently remove the page files: `git rm -r src/app/(portal)/client/<slug>/` and commit."
|
|
197
|
-
- "To see your remaining portals: /portal
|
|
194
|
+
- "To see your remaining portals: /portal-list"
|
|
198
195
|
|
|
199
196
|
## What Deactivation Does NOT Do
|
|
200
197
|
|
|
@@ -207,7 +204,7 @@ Be explicit about what this skill does not touch:
|
|
|
207
204
|
|
|
208
205
|
## Edge Cases
|
|
209
206
|
|
|
210
|
-
- **Portal with active share link**: Deactivation invalidates the link because the portal is no longer active. If the portal should stay active but all tokens must be revoked, rotate credentials with `/portal
|
|
207
|
+
- **Portal with active share link**: Deactivation invalidates the link because the portal is no longer active. If the portal should stay active but all tokens must be revoked, rotate credentials with `/portal-credentials <slug>`.
|
|
211
208
|
- **Portal already inactive**: The script returns `already_inactive`. Do not treat this as an error -- just inform the user.
|
|
212
209
|
- **Last remaining portal**: No special handling. The user can deactivate their last portal. The organization continues to exist with zero active portals.
|
|
213
210
|
|
|
@@ -222,7 +219,7 @@ Be explicit about what this skill does not touch:
|
|
|
222
219
|
## Error Handling
|
|
223
220
|
|
|
224
221
|
- If the preamble fails, stop and display the error.
|
|
225
|
-
- If the portal is not found, suggest `/portal
|
|
222
|
+
- If the portal is not found, suggest `/portal-list` to verify the slug.
|
|
226
223
|
- If the database operation fails, show the error from stderr. Common cause: database connection issues.
|
|
227
224
|
- If the user cancels, acknowledge cleanly and stop. Do not ask again.
|
|
228
225
|
|
|
@@ -243,9 +240,9 @@ cd $APP_PATH && npx tsx -e "
|
|
|
243
240
|
"
|
|
244
241
|
```
|
|
245
242
|
|
|
246
|
-
This is intentionally manual. There is no `/portal
|
|
243
|
+
This is intentionally manual. There is no `/portal-reactivate` skill in v1. Reactivation should be a deliberate choice, not a casual undo.
|
|
247
244
|
|
|
248
|
-
**Option 2: Re-create the portal.** If the page files were deleted from git after deactivation, the simplest path is to run `/portal
|
|
245
|
+
**Option 2: Re-create the portal.** If the page files were deleted from git after deactivation, the simplest path is to run `/portal-create <slug>` again. This creates new page files and a new database record. The old analytics data is tied to the old record and will not carry over.
|
|
249
246
|
|
|
250
247
|
## Audit Trail
|
|
251
248
|
|
|
@@ -261,7 +258,7 @@ If learnings are enabled, the skill records the deactivation event:
|
|
|
261
258
|
{"skill":"portal-delete","key":"deactivated","insight":"whzan deactivated on 2026-04-07","confidence":10,"ts":"2026-04-07T15:00:00Z"}
|
|
262
259
|
```
|
|
263
260
|
|
|
264
|
-
This helps other skills provide context. For example, `/portal
|
|
261
|
+
This helps other skills provide context. For example, `/portal-status` can note when a portal was deactivated if the user asks about it.
|
|
265
262
|
|
|
266
263
|
## Bulk Deactivation
|
|
267
264
|
|
|
@@ -274,7 +271,7 @@ If the user explicitly asks to "deactivate all portals" or "shut everything down
|
|
|
274
271
|
Two operations can revoke client access, and they serve different purposes:
|
|
275
272
|
|
|
276
273
|
- **Deactivation** (this skill): Removes the portal entirely from client view. New visitors see "not found". Existing sessions and share links stop working because the portal is inactive. Use when the client relationship has ended or the portal is no longer needed.
|
|
277
|
-
- **Credential rotation** (`/portal
|
|
274
|
+
- **Credential rotation** (`/portal-credentials`): Changes the password and invalidates all tokens (sessions + share links). The portal remains active and accessible. Use when credentials may be compromised but the portal should stay live.
|
|
278
275
|
|
|
279
276
|
If the user wants to immediately revoke all access AND deactivate, the sequence is: rotate credentials first (to kill existing sessions immediately), then deactivate (to prevent new logins).
|
|
280
277
|
|
|
@@ -34,7 +34,7 @@ Soft delete is intentional. Nothing is truly destroyed. If the user changes thei
|
|
|
34
34
|
|
|
35
35
|
### Step 1: Identify the target portal
|
|
36
36
|
|
|
37
|
-
The user must specify which portal to deactivate. If no slug is provided, ask: "Which portal do you want to deactivate? Run /portal
|
|
37
|
+
The user must specify which portal to deactivate. If no slug is provided, ask: "Which portal do you want to deactivate? Run /portal-list to see your portals."
|
|
38
38
|
|
|
39
39
|
Do not proceed without a confirmed slug.
|
|
40
40
|
|
|
@@ -71,7 +71,7 @@ Expected success response:
|
|
|
71
71
|
|
|
72
72
|
Expected error responses:
|
|
73
73
|
|
|
74
|
-
- `portal_not_found`: The slug does not exist in this organization. Suggest `/portal
|
|
74
|
+
- `portal_not_found`: The slug does not exist in this organization. Suggest `/portal-list`.
|
|
75
75
|
- `already_inactive`: The portal is already deactivated. Inform the user: "Portal '<slug>' is already inactive. No changes made."
|
|
76
76
|
|
|
77
77
|
### Step 4: Print confirmation
|
|
@@ -107,7 +107,7 @@ Depending on context:
|
|
|
107
107
|
|
|
108
108
|
- "To reactivate this portal later, update the database record: set `isActive` to `true` on the ClientPortal with slug '<slug>'."
|
|
109
109
|
- "To permanently remove the page files: `git rm -r src/app/(portal)/client/<slug>/` and commit."
|
|
110
|
-
- "To see your remaining portals: /portal
|
|
110
|
+
- "To see your remaining portals: /portal-list"
|
|
111
111
|
|
|
112
112
|
## What Deactivation Does NOT Do
|
|
113
113
|
|
|
@@ -120,7 +120,7 @@ Be explicit about what this skill does not touch:
|
|
|
120
120
|
|
|
121
121
|
## Edge Cases
|
|
122
122
|
|
|
123
|
-
- **Portal with active share link**: Deactivation invalidates the link because the portal is no longer active. If the portal should stay active but all tokens must be revoked, rotate credentials with `/portal
|
|
123
|
+
- **Portal with active share link**: Deactivation invalidates the link because the portal is no longer active. If the portal should stay active but all tokens must be revoked, rotate credentials with `/portal-credentials <slug>`.
|
|
124
124
|
- **Portal already inactive**: The script returns `already_inactive`. Do not treat this as an error -- just inform the user.
|
|
125
125
|
- **Last remaining portal**: No special handling. The user can deactivate their last portal. The organization continues to exist with zero active portals.
|
|
126
126
|
|
|
@@ -135,7 +135,7 @@ Be explicit about what this skill does not touch:
|
|
|
135
135
|
## Error Handling
|
|
136
136
|
|
|
137
137
|
- If the preamble fails, stop and display the error.
|
|
138
|
-
- If the portal is not found, suggest `/portal
|
|
138
|
+
- If the portal is not found, suggest `/portal-list` to verify the slug.
|
|
139
139
|
- If the database operation fails, show the error from stderr. Common cause: database connection issues.
|
|
140
140
|
- If the user cancels, acknowledge cleanly and stop. Do not ask again.
|
|
141
141
|
|
|
@@ -156,9 +156,9 @@ cd $APP_PATH && npx tsx -e "
|
|
|
156
156
|
"
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
This is intentionally manual. There is no `/portal
|
|
159
|
+
This is intentionally manual. There is no `/portal-reactivate` skill in v1. Reactivation should be a deliberate choice, not a casual undo.
|
|
160
160
|
|
|
161
|
-
**Option 2: Re-create the portal.** If the page files were deleted from git after deactivation, the simplest path is to run `/portal
|
|
161
|
+
**Option 2: Re-create the portal.** If the page files were deleted from git after deactivation, the simplest path is to run `/portal-create <slug>` again. This creates new page files and a new database record. The old analytics data is tied to the old record and will not carry over.
|
|
162
162
|
|
|
163
163
|
## Audit Trail
|
|
164
164
|
|
|
@@ -174,7 +174,7 @@ If learnings are enabled, the skill records the deactivation event:
|
|
|
174
174
|
{"skill":"portal-delete","key":"deactivated","insight":"whzan deactivated on 2026-04-07","confidence":10,"ts":"2026-04-07T15:00:00Z"}
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
-
This helps other skills provide context. For example, `/portal
|
|
177
|
+
This helps other skills provide context. For example, `/portal-status` can note when a portal was deactivated if the user asks about it.
|
|
178
178
|
|
|
179
179
|
## Bulk Deactivation
|
|
180
180
|
|
|
@@ -187,7 +187,7 @@ If the user explicitly asks to "deactivate all portals" or "shut everything down
|
|
|
187
187
|
Two operations can revoke client access, and they serve different purposes:
|
|
188
188
|
|
|
189
189
|
- **Deactivation** (this skill): Removes the portal entirely from client view. New visitors see "not found". Existing sessions and share links stop working because the portal is inactive. Use when the client relationship has ended or the portal is no longer needed.
|
|
190
|
-
- **Credential rotation** (`/portal
|
|
190
|
+
- **Credential rotation** (`/portal-credentials`): Changes the password and invalidates all tokens (sessions + share links). The portal remains active and accessible. Use when credentials may be compromised but the portal should stay live.
|
|
191
191
|
|
|
192
192
|
If the user wants to immediately revoke all access AND deactivate, the sequence is: rotate credentials first (to kill existing sessions immediately), then deactivate (to prevent new logins).
|
|
193
193
|
|
|
@@ -18,7 +18,7 @@ SHOWPANE_HOME="$HOME/.showpane"
|
|
|
18
18
|
SHOWPANE_BIN="$SHOWPANE_HOME/bin"
|
|
19
19
|
CONFIG="$SHOWPANE_HOME/config.json"
|
|
20
20
|
if [ ! -f "$CONFIG" ]; then
|
|
21
|
-
echo "Showpane not configured. Run /portal
|
|
21
|
+
echo "Showpane not configured. Run /portal-setup first."
|
|
22
22
|
exit 1
|
|
23
23
|
fi
|
|
24
24
|
|
|
@@ -71,16 +71,13 @@ echo "TEL_PROMPTED: $TEL_PROMPTED"
|
|
|
71
71
|
|
|
72
72
|
If output shows `JUST_UPGRADED <from> <to>`, tell the user Showpane was just upgraded and continue.
|
|
73
73
|
|
|
74
|
-
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal
|
|
74
|
+
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal-upgrade`.
|
|
75
75
|
|
|
76
|
-
If `TEL_PROMPTED` is `no`,
|
|
76
|
+
If `TEL_PROMPTED` is `no`, default telemetry to `anonymous` without interrupting the flow. Do not mention telemetry unless the user asks.
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
- off — local analytics only, no remote sync
|
|
80
|
-
|
|
81
|
-
After the user chooses, run:
|
|
78
|
+
Run:
|
|
82
79
|
```bash
|
|
83
|
-
"$SHOWPANE_BIN/showpane-config" set telemetry
|
|
80
|
+
"$SHOWPANE_BIN/showpane-config" set telemetry anonymous
|
|
84
81
|
touch "$SHOWPANE_HOME/.telemetry-prompted"
|
|
85
82
|
```
|
|
86
83
|
|
|
@@ -15,7 +15,7 @@ SHOWPANE_HOME="$HOME/.showpane"
|
|
|
15
15
|
SHOWPANE_BIN="$SHOWPANE_HOME/bin"
|
|
16
16
|
CONFIG="$SHOWPANE_HOME/config.json"
|
|
17
17
|
if [ ! -f "$CONFIG" ]; then
|
|
18
|
-
echo "Showpane not configured. Run /portal
|
|
18
|
+
echo "Showpane not configured. Run /portal-setup first."
|
|
19
19
|
exit 1
|
|
20
20
|
fi
|
|
21
21
|
|
|
@@ -68,16 +68,13 @@ echo "TEL_PROMPTED: $TEL_PROMPTED"
|
|
|
68
68
|
|
|
69
69
|
If output shows `JUST_UPGRADED <from> <to>`, tell the user Showpane was just upgraded and continue.
|
|
70
70
|
|
|
71
|
-
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal
|
|
71
|
+
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal-upgrade`.
|
|
72
72
|
|
|
73
|
-
If `TEL_PROMPTED` is `no`,
|
|
73
|
+
If `TEL_PROMPTED` is `no`, default telemetry to `anonymous` without interrupting the flow. Do not mention telemetry unless the user asks.
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
- off — local analytics only, no remote sync
|
|
77
|
-
|
|
78
|
-
After the user chooses, run:
|
|
75
|
+
Run:
|
|
79
76
|
```bash
|
|
80
|
-
"$SHOWPANE_BIN/showpane-config" set telemetry
|
|
77
|
+
"$SHOWPANE_BIN/showpane-config" set telemetry anonymous
|
|
81
78
|
touch "$SHOWPANE_HOME/.telemetry-prompted"
|
|
82
79
|
```
|
|
83
80
|
|
|
@@ -119,7 +116,7 @@ If a process is listening on port 3000:
|
|
|
119
116
|
|
|
120
117
|
3. If it's a different process, warn the user:
|
|
121
118
|
> "Port 3000 is in use by another process (PID: <pid>). Options:"
|
|
122
|
-
> - Kill it: `kill <pid>` then re-run `/portal
|
|
119
|
+
> - Kill it: `kill <pid>` then re-run `/portal-dev`
|
|
123
120
|
> - Use a different port: `cd $APP_PATH && PORT=3001 npm run dev`
|
|
124
121
|
|
|
125
122
|
Ask the user how to proceed. Do not kill processes without explicit permission.
|
|
@@ -245,9 +242,9 @@ Then show tips:
|
|
|
245
242
|
|
|
246
243
|
```
|
|
247
244
|
Tips:
|
|
248
|
-
- Create a portal: /portal
|
|
249
|
-
- Edit a portal: /portal
|
|
250
|
-
- View all portals: /portal
|
|
245
|
+
- Create a portal: /portal-create <slug>
|
|
246
|
+
- Edit a portal: /portal-update <slug>
|
|
247
|
+
- View all portals: /portal-list
|
|
251
248
|
- Hot reload is ON: edits to portal files appear instantly
|
|
252
249
|
- Stop the server: Ctrl+C in the terminal, or kill the process
|
|
253
250
|
```
|
|
@@ -291,7 +288,7 @@ The Next.js dev server watches all files under `src/` for changes. When you edit
|
|
|
291
288
|
Portals in development can be accessed in two ways:
|
|
292
289
|
|
|
293
290
|
1. **Direct URL**: Navigate to `http://localhost:3000/client/<slug>` — this bypasses authentication during local development if the portal doesn't have credentials set yet
|
|
294
|
-
2. **Login page**: Navigate to `http://localhost:3000/client` — use this to test the full authentication flow with credentials created via `/portal
|
|
291
|
+
2. **Login page**: Navigate to `http://localhost:3000/client` — use this to test the full authentication flow with credentials created via `/portal-credentials`
|
|
295
292
|
|
|
296
293
|
The example portal at `/client/example` always works without authentication and is a useful reference while building new portals.
|
|
297
294
|
|
|
@@ -32,7 +32,7 @@ If a process is listening on port 3000:
|
|
|
32
32
|
|
|
33
33
|
3. If it's a different process, warn the user:
|
|
34
34
|
> "Port 3000 is in use by another process (PID: <pid>). Options:"
|
|
35
|
-
> - Kill it: `kill <pid>` then re-run `/portal
|
|
35
|
+
> - Kill it: `kill <pid>` then re-run `/portal-dev`
|
|
36
36
|
> - Use a different port: `cd $APP_PATH && PORT=3001 npm run dev`
|
|
37
37
|
|
|
38
38
|
Ask the user how to proceed. Do not kill processes without explicit permission.
|
|
@@ -158,9 +158,9 @@ Then show tips:
|
|
|
158
158
|
|
|
159
159
|
```
|
|
160
160
|
Tips:
|
|
161
|
-
- Create a portal: /portal
|
|
162
|
-
- Edit a portal: /portal
|
|
163
|
-
- View all portals: /portal
|
|
161
|
+
- Create a portal: /portal-create <slug>
|
|
162
|
+
- Edit a portal: /portal-update <slug>
|
|
163
|
+
- View all portals: /portal-list
|
|
164
164
|
- Hot reload is ON: edits to portal files appear instantly
|
|
165
165
|
- Stop the server: Ctrl+C in the terminal, or kill the process
|
|
166
166
|
```
|
|
@@ -204,7 +204,7 @@ The Next.js dev server watches all files under `src/` for changes. When you edit
|
|
|
204
204
|
Portals in development can be accessed in two ways:
|
|
205
205
|
|
|
206
206
|
1. **Direct URL**: Navigate to `http://localhost:3000/client/<slug>` — this bypasses authentication during local development if the portal doesn't have credentials set yet
|
|
207
|
-
2. **Login page**: Navigate to `http://localhost:3000/client` — use this to test the full authentication flow with credentials created via `/portal
|
|
207
|
+
2. **Login page**: Navigate to `http://localhost:3000/client` — use this to test the full authentication flow with credentials created via `/portal-credentials`
|
|
208
208
|
|
|
209
209
|
The example portal at `/client/example` always works without authentication and is a useful reference while building new portals.
|
|
210
210
|
|
|
@@ -15,7 +15,7 @@ SHOWPANE_HOME="$HOME/.showpane"
|
|
|
15
15
|
SHOWPANE_BIN="$SHOWPANE_HOME/bin"
|
|
16
16
|
CONFIG="$SHOWPANE_HOME/config.json"
|
|
17
17
|
if [ ! -f "$CONFIG" ]; then
|
|
18
|
-
echo "Showpane not configured. Run /portal
|
|
18
|
+
echo "Showpane not configured. Run /portal-setup first."
|
|
19
19
|
exit 1
|
|
20
20
|
fi
|
|
21
21
|
|
|
@@ -68,16 +68,13 @@ echo "TEL_PROMPTED: $TEL_PROMPTED"
|
|
|
68
68
|
|
|
69
69
|
If output shows `JUST_UPGRADED <from> <to>`, tell the user Showpane was just upgraded and continue.
|
|
70
70
|
|
|
71
|
-
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal
|
|
71
|
+
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal-upgrade`.
|
|
72
72
|
|
|
73
|
-
If `TEL_PROMPTED` is `no`,
|
|
73
|
+
If `TEL_PROMPTED` is `no`, default telemetry to `anonymous` without interrupting the flow. Do not mention telemetry unless the user asks.
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
- off — local analytics only, no remote sync
|
|
77
|
-
|
|
78
|
-
After the user chooses, run:
|
|
75
|
+
Run:
|
|
79
76
|
```bash
|
|
80
|
-
"$SHOWPANE_BIN/showpane-config" set telemetry
|
|
77
|
+
"$SHOWPANE_BIN/showpane-config" set telemetry anonymous
|
|
81
78
|
touch "$SHOWPANE_HOME/.telemetry-prompted"
|
|
82
79
|
```
|
|
83
80
|
|
|
@@ -97,7 +94,7 @@ If `skills/shared/platform-constraints.md` exists, read it once near the start o
|
|
|
97
94
|
|
|
98
95
|
## Overview
|
|
99
96
|
|
|
100
|
-
This skill retrieves all portals belonging to the current organization and displays them as a formatted table in the terminal. It is the quickest way to see what portals exist, their status, and when they were last updated. It is also a good starting point before running other portal-specific skills -- users often run `/portal
|
|
97
|
+
This skill retrieves all portals belonging to the current organization and displays them as a formatted table in the terminal. It is the quickest way to see what portals exist, their status, and when they were last updated. It is also a good starting point before running other portal-specific skills -- users often run `/portal-list` to find a slug before using `/portal-analytics`, `/portal-share`, or `/portal-preview`.
|
|
101
98
|
|
|
102
99
|
## Steps
|
|
103
100
|
|
|
@@ -141,7 +138,7 @@ Expected success response:
|
|
|
141
138
|
|
|
142
139
|
If the script exits with a non-zero code, read stderr. Common errors:
|
|
143
140
|
|
|
144
|
-
- `org_not_found`: The organization slug from config does not exist in the database. The user may need to re-run `/portal
|
|
141
|
+
- `org_not_found`: The organization slug from config does not exist in the database. The user may need to re-run `/portal-setup`.
|
|
145
142
|
- `database_error`: Connection issue. Check that DATABASE_URL is correct and the database is accessible.
|
|
146
143
|
|
|
147
144
|
### Step 2: Format as an ASCII table
|
|
@@ -176,18 +173,18 @@ PORTALS (Demo Company)
|
|
|
176
173
|
════════════════════════════════════════
|
|
177
174
|
No portals yet.
|
|
178
175
|
|
|
179
|
-
Create your first portal: /portal
|
|
176
|
+
Create your first portal: /portal-create <slug>
|
|
180
177
|
════════════════════════════════════════
|
|
181
178
|
```
|
|
182
179
|
|
|
183
|
-
This guides new users toward the next action. If the user ran `/portal
|
|
180
|
+
This guides new users toward the next action. If the user ran `/portal-onboard`, they would have gone through this already, but many users will discover the CLI skill-by-skill.
|
|
184
181
|
|
|
185
182
|
### Step 4: Add contextual hints
|
|
186
183
|
|
|
187
184
|
After the table, provide brief contextual guidance based on what the list reveals:
|
|
188
185
|
|
|
189
186
|
- **All portals active, credentials set**: No additional notes needed. The list is self-explanatory.
|
|
190
|
-
- **Portal without credentials**: Append a note: "Portal 'example' has no credentials. Run /portal
|
|
187
|
+
- **Portal without credentials**: Append a note: "Portal 'example' has no credentials. Run /portal-credentials example to set up access."
|
|
191
188
|
- **Inactive portals present**: "1 inactive portal not shown. Use --all to include inactive portals." (The `--all` flag can be passed to `list-portals.ts`.)
|
|
192
189
|
- **Large number of portals (10+)**: Consider grouping or paginating. For now, just show all of them -- the terminal handles scrolling.
|
|
193
190
|
|
|
@@ -211,18 +208,18 @@ Pass these flags through to the `list-portals.ts` script if the user requests th
|
|
|
211
208
|
- Format dates as `DD Mon YYYY` (e.g., "2 Apr 2026"). Do not show times in the list view -- they add clutter without value at this level.
|
|
212
209
|
- Right-pad string columns for alignment. The table should look clean even with varying slug and company name lengths.
|
|
213
210
|
- Use double-line box drawing (`═`) for outer borders and single-line (`─`) for the header separator.
|
|
214
|
-
- If the response includes `tabCount`, do not show it in the default table. It is available for other skills (like `/portal
|
|
211
|
+
- If the response includes `tabCount`, do not show it in the default table. It is available for other skills (like `/portal-status`) but too detailed for a list view.
|
|
215
212
|
- The footer line ("3 portals total") should always be present, even for a single portal ("1 portal total").
|
|
216
213
|
|
|
217
214
|
## Error Handling
|
|
218
215
|
|
|
219
216
|
- If the preamble fails, stop and display the error. Do not attempt to query the database.
|
|
220
217
|
- If the database query fails, show the error from stderr and suggest checking the connection: "Database query failed. Verify your DATABASE_URL is correct and the database is running."
|
|
221
|
-
- If the org is not found, suggest re-running `/portal
|
|
218
|
+
- If the org is not found, suggest re-running `/portal-setup` to reconfigure.
|
|
222
219
|
|
|
223
220
|
## Data Freshness
|
|
224
221
|
|
|
225
|
-
The list data comes directly from the database at query time. It reflects the current state of all portals, including any changes made moments ago. There is no caching layer. If the user just created a portal with `/portal
|
|
222
|
+
The list data comes directly from the database at query time. It reflects the current state of all portals, including any changes made moments ago. There is no caching layer. If the user just created a portal with `/portal-create`, it will appear in the list immediately.
|
|
226
223
|
|
|
227
224
|
The `lastUpdated` timestamp reflects when the portal's database record was last modified. This includes credential changes, status changes, and metadata updates. It does NOT reflect when the portal's React source files were last edited -- file changes are tracked by git, not the database.
|
|
228
225
|
|
|
@@ -247,9 +244,9 @@ The list skill does not write learnings. It is a read-only query. However, if le
|
|
|
247
244
|
Portals have two states in the database:
|
|
248
245
|
|
|
249
246
|
- **Active** (`isActive: true`): The portal is accessible to clients. It appears in the default list view. This is the normal operating state.
|
|
250
|
-
- **Inactive** (`isActive: false`): The portal has been deactivated via `/portal
|
|
247
|
+
- **Inactive** (`isActive: false`): The portal has been deactivated via `/portal-delete`. It is hidden from the default list view but still exists in the database. Page files may or may not still be in the repository.
|
|
251
248
|
|
|
252
|
-
There is no "draft" or "pending" state. A portal is either active or inactive. When `/portal
|
|
249
|
+
There is no "draft" or "pending" state. A portal is either active or inactive. When `/portal-create` runs, the portal is immediately active. If the user wants to prepare a portal before making it accessible, they should create it and set up credentials last -- the portal page exists but is behind the login gate.
|
|
253
250
|
|
|
254
251
|
## Response Format Details
|
|
255
252
|
|
|
@@ -10,7 +10,7 @@ allowed-tools: [Bash, Read, Glob, Grep]
|
|
|
10
10
|
|
|
11
11
|
## Overview
|
|
12
12
|
|
|
13
|
-
This skill retrieves all portals belonging to the current organization and displays them as a formatted table in the terminal. It is the quickest way to see what portals exist, their status, and when they were last updated. It is also a good starting point before running other portal-specific skills -- users often run `/portal
|
|
13
|
+
This skill retrieves all portals belonging to the current organization and displays them as a formatted table in the terminal. It is the quickest way to see what portals exist, their status, and when they were last updated. It is also a good starting point before running other portal-specific skills -- users often run `/portal-list` to find a slug before using `/portal-analytics`, `/portal-share`, or `/portal-preview`.
|
|
14
14
|
|
|
15
15
|
## Steps
|
|
16
16
|
|
|
@@ -54,7 +54,7 @@ Expected success response:
|
|
|
54
54
|
|
|
55
55
|
If the script exits with a non-zero code, read stderr. Common errors:
|
|
56
56
|
|
|
57
|
-
- `org_not_found`: The organization slug from config does not exist in the database. The user may need to re-run `/portal
|
|
57
|
+
- `org_not_found`: The organization slug from config does not exist in the database. The user may need to re-run `/portal-setup`.
|
|
58
58
|
- `database_error`: Connection issue. Check that DATABASE_URL is correct and the database is accessible.
|
|
59
59
|
|
|
60
60
|
### Step 2: Format as an ASCII table
|
|
@@ -89,18 +89,18 @@ PORTALS (Demo Company)
|
|
|
89
89
|
════════════════════════════════════════
|
|
90
90
|
No portals yet.
|
|
91
91
|
|
|
92
|
-
Create your first portal: /portal
|
|
92
|
+
Create your first portal: /portal-create <slug>
|
|
93
93
|
════════════════════════════════════════
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
This guides new users toward the next action. If the user ran `/portal
|
|
96
|
+
This guides new users toward the next action. If the user ran `/portal-onboard`, they would have gone through this already, but many users will discover the CLI skill-by-skill.
|
|
97
97
|
|
|
98
98
|
### Step 4: Add contextual hints
|
|
99
99
|
|
|
100
100
|
After the table, provide brief contextual guidance based on what the list reveals:
|
|
101
101
|
|
|
102
102
|
- **All portals active, credentials set**: No additional notes needed. The list is self-explanatory.
|
|
103
|
-
- **Portal without credentials**: Append a note: "Portal 'example' has no credentials. Run /portal
|
|
103
|
+
- **Portal without credentials**: Append a note: "Portal 'example' has no credentials. Run /portal-credentials example to set up access."
|
|
104
104
|
- **Inactive portals present**: "1 inactive portal not shown. Use --all to include inactive portals." (The `--all` flag can be passed to `list-portals.ts`.)
|
|
105
105
|
- **Large number of portals (10+)**: Consider grouping or paginating. For now, just show all of them -- the terminal handles scrolling.
|
|
106
106
|
|
|
@@ -124,18 +124,18 @@ Pass these flags through to the `list-portals.ts` script if the user requests th
|
|
|
124
124
|
- Format dates as `DD Mon YYYY` (e.g., "2 Apr 2026"). Do not show times in the list view -- they add clutter without value at this level.
|
|
125
125
|
- Right-pad string columns for alignment. The table should look clean even with varying slug and company name lengths.
|
|
126
126
|
- Use double-line box drawing (`═`) for outer borders and single-line (`─`) for the header separator.
|
|
127
|
-
- If the response includes `tabCount`, do not show it in the default table. It is available for other skills (like `/portal
|
|
127
|
+
- If the response includes `tabCount`, do not show it in the default table. It is available for other skills (like `/portal-status`) but too detailed for a list view.
|
|
128
128
|
- The footer line ("3 portals total") should always be present, even for a single portal ("1 portal total").
|
|
129
129
|
|
|
130
130
|
## Error Handling
|
|
131
131
|
|
|
132
132
|
- If the preamble fails, stop and display the error. Do not attempt to query the database.
|
|
133
133
|
- If the database query fails, show the error from stderr and suggest checking the connection: "Database query failed. Verify your DATABASE_URL is correct and the database is running."
|
|
134
|
-
- If the org is not found, suggest re-running `/portal
|
|
134
|
+
- If the org is not found, suggest re-running `/portal-setup` to reconfigure.
|
|
135
135
|
|
|
136
136
|
## Data Freshness
|
|
137
137
|
|
|
138
|
-
The list data comes directly from the database at query time. It reflects the current state of all portals, including any changes made moments ago. There is no caching layer. If the user just created a portal with `/portal
|
|
138
|
+
The list data comes directly from the database at query time. It reflects the current state of all portals, including any changes made moments ago. There is no caching layer. If the user just created a portal with `/portal-create`, it will appear in the list immediately.
|
|
139
139
|
|
|
140
140
|
The `lastUpdated` timestamp reflects when the portal's database record was last modified. This includes credential changes, status changes, and metadata updates. It does NOT reflect when the portal's React source files were last edited -- file changes are tracked by git, not the database.
|
|
141
141
|
|
|
@@ -160,9 +160,9 @@ The list skill does not write learnings. It is a read-only query. However, if le
|
|
|
160
160
|
Portals have two states in the database:
|
|
161
161
|
|
|
162
162
|
- **Active** (`isActive: true`): The portal is accessible to clients. It appears in the default list view. This is the normal operating state.
|
|
163
|
-
- **Inactive** (`isActive: false`): The portal has been deactivated via `/portal
|
|
163
|
+
- **Inactive** (`isActive: false`): The portal has been deactivated via `/portal-delete`. It is hidden from the default list view but still exists in the database. Page files may or may not still be in the repository.
|
|
164
164
|
|
|
165
|
-
There is no "draft" or "pending" state. A portal is either active or inactive. When `/portal
|
|
165
|
+
There is no "draft" or "pending" state. A portal is either active or inactive. When `/portal-create` runs, the portal is immediately active. If the user wants to prepare a portal before making it accessible, they should create it and set up credentials last -- the portal page exists but is behind the login gate.
|
|
166
166
|
|
|
167
167
|
## Response Format Details
|
|
168
168
|
|
|
@@ -83,16 +83,13 @@ fi
|
|
|
83
83
|
|
|
84
84
|
If output shows `JUST_UPGRADED <from> <to>`, tell the user Showpane was just upgraded and continue.
|
|
85
85
|
|
|
86
|
-
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal
|
|
86
|
+
If output shows `UPGRADE_AVAILABLE <old> <new>`, tell the user a newer Showpane toolchain is available and recommend `/portal-upgrade`.
|
|
87
87
|
|
|
88
|
-
If `TEL_PROMPTED` is `no`,
|
|
88
|
+
If `TEL_PROMPTED` is `no`, default telemetry to `anonymous` without interrupting the flow. Do not mention telemetry unless the user asks.
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
- off — local analytics only, no remote sync
|
|
92
|
-
|
|
93
|
-
After the user chooses, run:
|
|
90
|
+
Run:
|
|
94
91
|
```bash
|
|
95
|
-
"$SHOWPANE_BIN/showpane-config" set telemetry
|
|
92
|
+
"$SHOWPANE_BIN/showpane-config" set telemetry anonymous
|
|
96
93
|
touch "$SHOWPANE_HOME/.telemetry-prompted"
|
|
97
94
|
```
|
|
98
95
|
|
|
@@ -112,7 +109,7 @@ If `skills/shared/platform-constraints.md` exists, read it once near the start o
|
|
|
112
109
|
|
|
113
110
|
## Overview
|
|
114
111
|
|
|
115
|
-
`/portal
|
|
112
|
+
`/portal-onboard` is the canonical first-run workflow. It should feel like one
|
|
116
113
|
coherent wizard, not like the user is manually hopping between separate skills.
|
|
117
114
|
|
|
118
115
|
The recommended shape is:
|
|
@@ -169,15 +166,14 @@ Start with a compact welcome:
|
|
|
169
166
|
╚══════════════════════════════════════════╝
|
|
170
167
|
```
|
|
171
168
|
|
|
172
|
-
Then
|
|
169
|
+
Then use one short, friendly paragraph. Keep it concise and informal.
|
|
170
|
+
|
|
171
|
+
Suggested shape:
|
|
173
172
|
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
- local preview
|
|
177
|
-
- access setup
|
|
178
|
-
- cloud publish
|
|
173
|
+
- "Let's get your first portal started."
|
|
174
|
+
- "Who's it for, and what's the context? If you've got a call transcript, paste it in and I'll use that too."
|
|
179
175
|
|
|
180
|
-
|
|
176
|
+
Keep the opening focused on the user's first portal. This skill is the first-run default, so the top of the flow should feel fast, calm, and immediately useful.
|
|
181
177
|
|
|
182
178
|
Immediately save checkpoint:
|
|
183
179
|
|
|
@@ -197,15 +193,28 @@ If config exists, verify only the minimum first-run requirements before continui
|
|
|
197
193
|
- local SQLite schema is ready
|
|
198
194
|
- org exists or can be created
|
|
199
195
|
|
|
200
|
-
Keep this phase minimal.
|
|
201
|
-
|
|
196
|
+
Keep this phase minimal.
|
|
197
|
+
|
|
198
|
+
If the local checks pass, move straight into the user's portal work without extra system narration.
|
|
199
|
+
|
|
200
|
+
If there is already exactly one local organization and it clearly matches the
|
|
201
|
+
workspace the user just created, treat the org basics as already captured.
|
|
202
|
+
Do not create a separate "company context" phase just to re-ask the same setup
|
|
203
|
+
details.
|
|
204
|
+
|
|
205
|
+
Only ask for a missing field, and ask exactly one thing at a time.
|
|
206
|
+
|
|
207
|
+
Recommended order for missing fields:
|
|
202
208
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
209
|
+
1. organization name, if it is not already obvious from the workspace setup
|
|
210
|
+
2. contact email
|
|
211
|
+
3. website/domain
|
|
212
|
+
|
|
213
|
+
Do not batch these into a numbered questionnaire unless the user explicitly asks
|
|
214
|
+
for the full checklist.
|
|
206
215
|
|
|
207
216
|
Optional extras like brand color, phone number, or contact title belong in
|
|
208
|
-
`/portal
|
|
217
|
+
`/portal-setup` later if needed.
|
|
209
218
|
|
|
210
219
|
If setup fails, stop with a concrete recovery step and keep the checkpoint.
|
|
211
220
|
|
|
@@ -213,9 +222,20 @@ Save checkpoint with phase `local-ready`.
|
|
|
213
222
|
|
|
214
223
|
### Phase 3: Choose the first-portal source
|
|
215
224
|
|
|
216
|
-
|
|
225
|
+
Start with one short source question, not a menu.
|
|
226
|
+
|
|
227
|
+
Recommended opening:
|
|
228
|
+
|
|
229
|
+
- "Who's it for, and what's the context? If you've got a call transcript, paste it in and I'll use that too."
|
|
230
|
+
|
|
231
|
+
Only branch after the user answers:
|
|
232
|
+
|
|
233
|
+
- if they have a real transcript, ask whether to use Granola or paste it
|
|
234
|
+
- if they do not, ask whether they want to start from notes or a template
|
|
235
|
+
|
|
236
|
+
Only show the full menu if the user is unsure:
|
|
217
237
|
|
|
218
|
-
1. recent Granola meeting
|
|
238
|
+
1. recent Granola meeting
|
|
219
239
|
2. pasted transcript
|
|
220
240
|
3. short description of the client + meeting outcome
|
|
221
241
|
4. template-only start
|
|
@@ -260,7 +280,7 @@ Recommended refinement prompts:
|
|
|
260
280
|
- `Do you want the portal to feel more concise, more sales-focused, or more delivery-focused?`
|
|
261
281
|
- `Should we add anything practical before preview — timeline, documents, or sharper next steps?`
|
|
262
282
|
|
|
263
|
-
Apply the requested refinement inline, using the same patterns as `/portal
|
|
283
|
+
Apply the requested refinement inline, using the same patterns as `/portal-update`
|
|
264
284
|
without forcing the user to switch skills.
|
|
265
285
|
|
|
266
286
|
If the user is happy with the first draft, move on immediately.
|
|
@@ -353,8 +373,8 @@ Show a compact final reference card:
|
|
|
353
373
|
Cloud: <hosted-url-or-publishing-status>
|
|
354
374
|
Access: <hosted login / hosted share link / both>
|
|
355
375
|
|
|
356
|
-
Next: /portal
|
|
357
|
-
Help: /portal
|
|
376
|
+
Next: /portal-update <slug>
|
|
377
|
+
Help: /portal-list, /portal-status
|
|
358
378
|
════════════════════════════════════════
|
|
359
379
|
```
|
|
360
380
|
|
|
@@ -409,10 +429,10 @@ to continue refining it or create a new portal. Recommend continuing unless the
|
|
|
409
429
|
- Missing config is not a preamble failure here. It simply means setup starts from scratch.
|
|
410
430
|
- If a step fails after useful progress, keep the checkpoint and tell the user exactly how to resume.
|
|
411
431
|
- If the user wants to stop early, summarize the current state and point them to the next concrete skill:
|
|
412
|
-
- `/portal
|
|
413
|
-
- `/portal
|
|
414
|
-
- `/portal
|
|
415
|
-
- `/portal
|
|
432
|
+
- `/portal-preview`
|
|
433
|
+
- `/portal-credentials`
|
|
434
|
+
- `/portal-share`
|
|
435
|
+
- `/portal-deploy`
|
|
416
436
|
|
|
417
437
|
## Completion
|
|
418
438
|
|