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.
Files changed (43) hide show
  1. package/bundle/meta/scaffold-manifest.json +8 -8
  2. package/bundle/scaffold/VERSION +1 -1
  3. package/bundle/scaffold/prisma/seed.ts +40 -35
  4. package/bundle/scaffold/src/app/(portal)/client/example/example-client.tsx +1 -2
  5. package/bundle/scaffold/src/app/(portal)/client/page.tsx +5 -4
  6. package/bundle/scaffold/src/app/page.tsx +2 -2
  7. package/bundle/scaffold/src/components/portal-shell.tsx +1 -1
  8. package/bundle/toolchain/CLI_VERSION +1 -1
  9. package/bundle/toolchain/VERSION +1 -1
  10. package/bundle/toolchain/skills/VERSION +1 -1
  11. package/bundle/toolchain/skills/portal-analytics/SKILL.md +9 -12
  12. package/bundle/toolchain/skills/portal-analytics/SKILL.md.tmpl +4 -4
  13. package/bundle/toolchain/skills/portal-create/SKILL.md +13 -16
  14. package/bundle/toolchain/skills/portal-create/SKILL.md.tmpl +8 -8
  15. package/bundle/toolchain/skills/portal-credentials/SKILL.md +15 -18
  16. package/bundle/toolchain/skills/portal-credentials/SKILL.md.tmpl +10 -10
  17. package/bundle/toolchain/skills/portal-delete/SKILL.md +14 -17
  18. package/bundle/toolchain/skills/portal-delete/SKILL.md.tmpl +9 -9
  19. package/bundle/toolchain/skills/portal-deploy/SKILL.md +5 -8
  20. package/bundle/toolchain/skills/portal-dev/SKILL.md +10 -13
  21. package/bundle/toolchain/skills/portal-dev/SKILL.md.tmpl +5 -5
  22. package/bundle/toolchain/skills/portal-list/SKILL.md +15 -18
  23. package/bundle/toolchain/skills/portal-list/SKILL.md.tmpl +10 -10
  24. package/bundle/toolchain/skills/portal-onboard/SKILL.md +50 -30
  25. package/bundle/toolchain/skills/portal-onboard/SKILL.md.tmpl +46 -23
  26. package/bundle/toolchain/skills/portal-preview/SKILL.md +16 -19
  27. package/bundle/toolchain/skills/portal-preview/SKILL.md.tmpl +11 -11
  28. package/bundle/toolchain/skills/portal-setup/SKILL.md +15 -13
  29. package/bundle/toolchain/skills/portal-setup/SKILL.md.tmpl +11 -6
  30. package/bundle/toolchain/skills/portal-share/SKILL.md +17 -20
  31. package/bundle/toolchain/skills/portal-share/SKILL.md.tmpl +12 -12
  32. package/bundle/toolchain/skills/portal-status/SKILL.md +9 -12
  33. package/bundle/toolchain/skills/portal-status/SKILL.md.tmpl +4 -4
  34. package/bundle/toolchain/skills/portal-update/SKILL.md +9 -12
  35. package/bundle/toolchain/skills/portal-update/SKILL.md.tmpl +4 -4
  36. package/bundle/toolchain/skills/portal-upgrade/SKILL.md +6 -9
  37. package/bundle/toolchain/skills/portal-upgrade/SKILL.md.tmpl +1 -1
  38. package/bundle/toolchain/skills/portal-verify/SKILL.md +6 -9
  39. package/bundle/toolchain/skills/portal-verify/SKILL.md.tmpl +1 -1
  40. package/bundle/toolchain/skills/shared/runtime-principles.md +4 -4
  41. package/bundle/toolchain/templates/sales-followup/sales-followup-client.tsx +1 -1
  42. package/dist/index.js +28 -5
  43. 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 setup first."
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 upgrade`.
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`, ask the user once about telemetry and then record the decision:
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
- - anonymous — local analytics plus anonymous remote sync, with no stable device id
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 <anonymous|off>
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 list to see your portals."
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 list`.
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 list"
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 credentials <slug>`.
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 list` to verify the slug.
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 reactivate` skill in v1. Reactivation should be a deliberate choice, not a casual undo.
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 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.
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 status` can note when a portal was deactivated if the user asks about it.
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 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.
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 list to see your portals."
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 list`.
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 list"
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 credentials <slug>`.
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 list` to verify the slug.
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 reactivate` skill in v1. Reactivation should be a deliberate choice, not a casual undo.
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 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.
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 status` can note when a portal was deactivated if the user asks about it.
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 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.
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 setup first."
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 upgrade`.
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`, ask the user once about telemetry and then record the decision:
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
- - anonymous — local analytics plus anonymous remote sync, with no stable device id
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 <anonymous|off>
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 setup first."
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 upgrade`.
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`, ask the user once about telemetry and then record the decision:
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
- - anonymous — local analytics plus anonymous remote sync, with no stable device id
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 <anonymous|off>
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 dev`
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 create <slug>
249
- - Edit a portal: /portal update <slug>
250
- - View all portals: /portal list
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 credentials`
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 dev`
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 create <slug>
162
- - Edit a portal: /portal update <slug>
163
- - View all portals: /portal list
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 credentials`
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 setup first."
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 upgrade`.
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`, ask the user once about telemetry and then record the decision:
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
- - anonymous — local analytics plus anonymous remote sync, with no stable device id
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 <anonymous|off>
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 list` to find a slug before using `/portal analytics`, `/portal share`, or `/portal preview`.
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 setup`.
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 create <slug>
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 onboard`, they would have gone through this already, but many users will discover the CLI skill-by-skill.
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 credentials example to set up access."
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 status`) but too detailed for a list view.
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 setup` to reconfigure.
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 create`, it will appear in the list immediately.
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 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.
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 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.
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 list` to find a slug before using `/portal analytics`, `/portal share`, or `/portal preview`.
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 setup`.
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 create <slug>
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 onboard`, they would have gone through this already, but many users will discover the CLI skill-by-skill.
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 credentials example to set up access."
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 status`) but too detailed for a list view.
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 setup` to reconfigure.
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 create`, it will appear in the list immediately.
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 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.
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 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.
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 upgrade`.
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`, ask the user once about telemetry and then record the decision:
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
- - anonymous — local analytics plus anonymous remote sync, with no stable device id
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 <anonymous|off>
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 onboard` is the canonical first-run workflow. It should feel like one
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 explain the flow in plain language:
169
+ Then use one short, friendly paragraph. Keep it concise and informal.
170
+
171
+ Suggested shape:
173
172
 
174
- - local setup if needed
175
- - first draft
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
- Do not lead with prompt examples. This skill is the first-run default.
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. For first-run onboarding, collect only the minimum
201
- company context needed to make the first portal feel real:
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
- - organization name
204
- - contact email
205
- - website/domain if available
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 setup` later if needed.
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
- Recommended order:
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 if available
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 update`
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 update <slug>
357
- Help: /portal list, /portal status
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 preview`
413
- - `/portal credentials`
414
- - `/portal share`
415
- - `/portal deploy`
432
+ - `/portal-preview`
433
+ - `/portal-credentials`
434
+ - `/portal-share`
435
+ - `/portal-deploy`
416
436
 
417
437
  ## Completion
418
438