panopticon-cli 0.4.33 → 0.5.1
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/README.md +96 -210
- package/dist/{agents-VLK4BMVA.js → agents-5OPQKM5K.js} +6 -5
- package/dist/{chunk-OMNXYPXC.js → chunk-2V4NF7J2.js} +14 -1
- package/dist/chunk-2V4NF7J2.js.map +1 -0
- package/dist/{chunk-XKT5MHPT.js → chunk-4YSYJ4HM.js} +2 -2
- package/dist/{chunk-XFR2DLMR.js → chunk-76F6DSVS.js} +49 -10
- package/dist/chunk-76F6DSVS.js.map +1 -0
- package/dist/{chunk-PI7Y3PSN.js → chunk-F5555J3A.js} +42 -6
- package/dist/chunk-F5555J3A.js.map +1 -0
- package/dist/{chunk-KJ2TRXNK.js → chunk-FTCPTHIJ.js} +47 -420
- package/dist/chunk-FTCPTHIJ.js.map +1 -0
- package/dist/chunk-HJSM6E6U.js +1038 -0
- package/dist/chunk-HJSM6E6U.js.map +1 -0
- package/dist/{chunk-RBUO57TC.js → chunk-NLQRED36.js} +3 -3
- package/dist/chunk-NLQRED36.js.map +1 -0
- package/dist/{chunk-ASY7T35E.js → chunk-OWHXCGVO.js} +245 -90
- package/dist/chunk-OWHXCGVO.js.map +1 -0
- package/dist/{chunk-BKCWRMUX.js → chunk-VHKSS7QX.js} +106 -11
- package/dist/chunk-VHKSS7QX.js.map +1 -0
- package/dist/{chunk-GFP3PIPB.js → chunk-YGJ54GW2.js} +1 -1
- package/dist/chunk-YGJ54GW2.js.map +1 -0
- package/dist/cli/index.js +1521 -935
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/prompts/work-agent.md +2 -0
- package/dist/dashboard/public/assets/index-Ce6q21Fm.js +743 -0
- package/dist/dashboard/public/assets/{index-UjZq6ykz.css → index-NzpI0ItZ.css} +1 -1
- package/dist/dashboard/public/index.html +2 -2
- package/dist/dashboard/server.js +4274 -2320
- package/dist/{feedback-writer-LVZ5TFYZ.js → feedback-writer-VRMMWWTW.js} +2 -2
- package/dist/git-utils-I2UDKNZH.js +131 -0
- package/dist/git-utils-I2UDKNZH.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/{projects-JEIVIYC6.js → projects-CFX3RTDL.js} +4 -2
- package/dist/{remote-workspace-AHVHQEES.js → remote-workspace-7FPGF2RM.js} +2 -2
- package/dist/{review-status-EPFG4XM7.js → review-status-TDPSOU5J.js} +2 -2
- package/dist/{specialist-context-T3NBMCIE.js → specialist-context-WGUUYDWY.js} +5 -5
- package/dist/{specialist-logs-CVKD3YJ3.js → specialist-logs-XJB5TCKJ.js} +5 -5
- package/dist/{specialists-TKAP6T6Z.js → specialists-5LBRHYFA.js} +5 -5
- package/dist/{traefik-QX4ZV4YG.js → traefik-WFMQX2LY.js} +3 -3
- package/dist/{workspace-manager-KLHUCIZV.js → workspace-manager-E434Z45T.js} +2 -2
- package/package.json +1 -1
- package/scripts/record-cost-event.js +5 -5
- package/scripts/stop-hook +7 -0
- package/scripts/work-agent-stop-hook +137 -0
- package/skills/myn-standards/SKILL.md +351 -0
- package/skills/pan-new-project/SKILL.md +304 -0
- package/skills/write-spec/SKILL.md +138 -0
- package/dist/chunk-7XNJJBH6.js +0 -538
- package/dist/chunk-7XNJJBH6.js.map +0 -1
- package/dist/chunk-ASY7T35E.js.map +0 -1
- package/dist/chunk-BKCWRMUX.js.map +0 -1
- package/dist/chunk-GFP3PIPB.js.map +0 -1
- package/dist/chunk-KJ2TRXNK.js.map +0 -1
- package/dist/chunk-OMNXYPXC.js.map +0 -1
- package/dist/chunk-PI7Y3PSN.js.map +0 -1
- package/dist/chunk-RBUO57TC.js.map +0 -1
- package/dist/chunk-XFR2DLMR.js.map +0 -1
- package/dist/dashboard/public/assets/index-kAJqtLDO.js +0 -708
- /package/dist/{agents-VLK4BMVA.js.map → agents-5OPQKM5K.js.map} +0 -0
- /package/dist/{chunk-XKT5MHPT.js.map → chunk-4YSYJ4HM.js.map} +0 -0
- /package/dist/{feedback-writer-LVZ5TFYZ.js.map → feedback-writer-VRMMWWTW.js.map} +0 -0
- /package/dist/{projects-JEIVIYC6.js.map → projects-CFX3RTDL.js.map} +0 -0
- /package/dist/{remote-workspace-AHVHQEES.js.map → remote-workspace-7FPGF2RM.js.map} +0 -0
- /package/dist/{review-status-EPFG4XM7.js.map → review-status-TDPSOU5J.js.map} +0 -0
- /package/dist/{specialist-context-T3NBMCIE.js.map → specialist-context-WGUUYDWY.js.map} +0 -0
- /package/dist/{specialist-logs-CVKD3YJ3.js.map → specialist-logs-XJB5TCKJ.js.map} +0 -0
- /package/dist/{specialists-TKAP6T6Z.js.map → specialists-5LBRHYFA.js.map} +0 -0
- /package/dist/{traefik-QX4ZV4YG.js.map → traefik-WFMQX2LY.js.map} +0 -0
- /package/dist/{workspace-manager-KLHUCIZV.js.map → workspace-manager-E434Z45T.js.map} +0 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: myn-standards
|
|
3
|
+
description: >
|
|
4
|
+
Mind Your Now coding standards, design system, and component patterns.
|
|
5
|
+
Auto-applied when writing or reviewing MYN code.
|
|
6
|
+
triggers:
|
|
7
|
+
- myn component
|
|
8
|
+
- mind your now
|
|
9
|
+
- myn styling
|
|
10
|
+
- myn design
|
|
11
|
+
- myn frontend
|
|
12
|
+
- myn ui
|
|
13
|
+
- notification toast
|
|
14
|
+
- task card
|
|
15
|
+
- briefing
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Mind Your Now Design System & Coding Standards
|
|
19
|
+
|
|
20
|
+
## Brand Identity
|
|
21
|
+
|
|
22
|
+
### Brand Colors
|
|
23
|
+
|
|
24
|
+
| Name | Hex | Tailwind Token | Usage |
|
|
25
|
+
|------|-----|----------------|-------|
|
|
26
|
+
| All-Knowing Blu | `#00AEEF` | `brand-blue` | Primary brand, links, CTAs |
|
|
27
|
+
| Yours Truly Blu | `#80D7F7` | `brand-blue-light` | Hover states, light accents |
|
|
28
|
+
| Golden Hour Yellow | `#FFC60B` | `brand-yellow` | Accent, highlights, "now" in wordmark |
|
|
29
|
+
| Midnight Blue | `#0C4064` | `brand-dark` | Headings on light backgrounds |
|
|
30
|
+
|
|
31
|
+
### Brand Wordmark
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<h1>
|
|
35
|
+
<span className="text-blue-800">mind</span>
|
|
36
|
+
<span className="font-thin text-blue-200">your</span>
|
|
37
|
+
<span className="text-yellow-500">now</span>
|
|
38
|
+
</h1>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Logo
|
|
42
|
+
|
|
43
|
+
- Asset: `/images/logo-no-text.png` (sun-burst motif)
|
|
44
|
+
- Always paired with the wordmark on splash/auth screens
|
|
45
|
+
|
|
46
|
+
## Color System
|
|
47
|
+
|
|
48
|
+
### Semantic Colors
|
|
49
|
+
|
|
50
|
+
| Token | Light | Dark | Usage |
|
|
51
|
+
|-------|-------|------|-------|
|
|
52
|
+
| `semantic-success` | `#22C55E` | `#4ADE80` | Completed, positive |
|
|
53
|
+
| `semantic-warning` | `#F59E0B` | `#FBBF24` | Attention needed |
|
|
54
|
+
| `semantic-error` | `#EF4444` | `#F87171` | Errors, overdue |
|
|
55
|
+
| `semantic-info` | `#3B82F6` | `#60A5FA` | Informational |
|
|
56
|
+
|
|
57
|
+
### Priority Colors
|
|
58
|
+
|
|
59
|
+
| Priority | Hex | Token |
|
|
60
|
+
|----------|-----|-------|
|
|
61
|
+
| Critical | `#EF4444` | `priority-critical` |
|
|
62
|
+
| High | `#F97316` | `priority-high` |
|
|
63
|
+
| Medium | `#EAB308` | `priority-medium` |
|
|
64
|
+
| Low | `#22C55E` | `priority-low` |
|
|
65
|
+
| None | `#6B7280` | `priority-none` |
|
|
66
|
+
|
|
67
|
+
### MYN Task Type Colors (Methodology)
|
|
68
|
+
|
|
69
|
+
| Type | Hex | Token |
|
|
70
|
+
|------|-----|-------|
|
|
71
|
+
| Parking Lot | `#F04F23` | `taskType-parkinglot` |
|
|
72
|
+
| Over the Horizon | `#F9913B` | `taskType-overthehorizon` |
|
|
73
|
+
| Critical Now | `#0C803D` | `taskType-critical` |
|
|
74
|
+
| Opportunity Now | `#107CC4` | `taskType-opportunitynow` |
|
|
75
|
+
| Tomorrow | `#854EB1` | `taskType-tomorrow` |
|
|
76
|
+
|
|
77
|
+
### Shadcn/UI Semantic Tokens (CSS Variables)
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
--background Page background (white / slate-950)
|
|
81
|
+
--foreground Primary text (slate-950 / slate-50)
|
|
82
|
+
--card Card backgrounds (white / slate-900)
|
|
83
|
+
--muted Muted backgrounds (slate-100 / slate-800)
|
|
84
|
+
--muted-foreground Secondary text (slate-500 / slate-400)
|
|
85
|
+
--border Borders (slate-200 / slate-700)
|
|
86
|
+
--primary Primary actions (blue-600 / blue-500)
|
|
87
|
+
--destructive Destructive actions (red-600 / red-500)
|
|
88
|
+
--ring Focus rings (blue-500 / blue-400)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### App Background
|
|
92
|
+
|
|
93
|
+
- Light: `#eff6ff` (blue-50)
|
|
94
|
+
- Dark: `#0f172a` (slate-900)
|
|
95
|
+
- Surfaces: `#1e293b` dark, `#334155` elevated dark
|
|
96
|
+
|
|
97
|
+
## Typography
|
|
98
|
+
|
|
99
|
+
### Font Stack
|
|
100
|
+
|
|
101
|
+
- **Primary**: Inter (all UI text)
|
|
102
|
+
- **Monospace**: SF Mono, Monaco, Cascadia Code
|
|
103
|
+
- **Accessibility**: Tiresias Infofont, OpenDyslexic3 (user-selectable)
|
|
104
|
+
- All legacy font aliases (Roboto, Lato, Montserrat, SF Pro) map to Inter
|
|
105
|
+
|
|
106
|
+
### Type Scale
|
|
107
|
+
|
|
108
|
+
| Token | Size | Weight | Letter Spacing | Usage |
|
|
109
|
+
|-------|------|--------|----------------|-------|
|
|
110
|
+
| `display` | 2.441rem (39px) | 700 | -0.02em | Hero headlines |
|
|
111
|
+
| `h1` | 1.953rem (31px) | 700 | -0.01em | Page titles |
|
|
112
|
+
| `h2` | 1.563rem (25px) | 600 | -0.01em | Section headers |
|
|
113
|
+
| `h3` | 1.25rem (20px) | 600 | -- | Card headers |
|
|
114
|
+
| `body-lg` | 1.125rem (18px) | 400 | -- | Large body text |
|
|
115
|
+
| `body` | 1rem (16px) | 400 | -- | Default body text |
|
|
116
|
+
| `body-sm` | 0.875rem (14px) | 400 | -- | Compact text, task titles |
|
|
117
|
+
| `caption` | 0.75rem (12px) | 400 | -- | Labels, hints |
|
|
118
|
+
| `overline` | 0.625rem (10px) | 600 | 0.1em | Category labels |
|
|
119
|
+
|
|
120
|
+
### Text Colors
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
text-foreground Primary text
|
|
124
|
+
text-muted-foreground Secondary text, labels, icons
|
|
125
|
+
text-primary Links, emphasis
|
|
126
|
+
text-destructive Errors
|
|
127
|
+
text-card-foreground Text on cards
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Spacing & Layout
|
|
131
|
+
|
|
132
|
+
### Spacing Scale
|
|
133
|
+
|
|
134
|
+
Standard Tailwind 4px base: `1`=4px, `2`=8px, `3`=12px, `4`=16px, `6`=24px, `8`=32px
|
|
135
|
+
|
|
136
|
+
### Common Patterns
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
// Page container
|
|
140
|
+
<div className="max-w-[1320px] mx-auto pt-4 px-3 sm:px-4 lg:px-6">
|
|
141
|
+
|
|
142
|
+
// Two-column grid (sidebar visible at xl)
|
|
143
|
+
<div className="grid gap-7 xl:grid-cols-[minmax(0,820px)_420px]">
|
|
144
|
+
|
|
145
|
+
// Card padding
|
|
146
|
+
p-3 // Compact
|
|
147
|
+
p-4 // Standard
|
|
148
|
+
p-5 // Spacious
|
|
149
|
+
|
|
150
|
+
// Section gaps
|
|
151
|
+
mt-3 // Between compact sections
|
|
152
|
+
mt-4 // Between standard sections
|
|
153
|
+
gap-2 // Icon + text
|
|
154
|
+
gap-3 // Form elements
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Breakpoints
|
|
158
|
+
|
|
159
|
+
| Token | Width | Usage |
|
|
160
|
+
|-------|-------|-------|
|
|
161
|
+
| `xxs` | 350px | Small phones |
|
|
162
|
+
| `sm` | 640px | Small tablets |
|
|
163
|
+
| `md` | 768px | Tablets |
|
|
164
|
+
| `lg` | 1024px | Small desktops |
|
|
165
|
+
| `xl` | 1280px | Desktop (sidebar visible) |
|
|
166
|
+
|
|
167
|
+
## Border & Shadow
|
|
168
|
+
|
|
169
|
+
### Border Radius
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
rounded-md (6px) Buttons, inputs, small cards
|
|
173
|
+
rounded-lg (8px) Cards, panels
|
|
174
|
+
rounded-xl (12px) Large cards, modals
|
|
175
|
+
rounded-full Pills, avatars
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Shadows
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
shadow-sm Sidebar cards, secondary
|
|
182
|
+
shadow-md Main cards, primary content
|
|
183
|
+
shadow-lg Dropdowns, modals
|
|
184
|
+
shadow-xl Popovers, overlays
|
|
185
|
+
shadow-2xl Dialogs
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Opacity Modifiers
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
bg-muted/40 // Very subtle containers
|
|
192
|
+
border-border/50 // Container borders (default)
|
|
193
|
+
border-border/60 // Button/input borders
|
|
194
|
+
ring-ring/40 // Focus state ring
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Component Patterns
|
|
198
|
+
|
|
199
|
+
### Buttons
|
|
200
|
+
|
|
201
|
+
| Size | Height | Padding | Icon | Usage |
|
|
202
|
+
|------|--------|---------|------|-------|
|
|
203
|
+
| xs | `h-7` | `px-2` | `h-3.5 w-3.5` | Inline actions |
|
|
204
|
+
| sm | `h-8` | `px-3` | `h-4 w-4` | Secondary actions |
|
|
205
|
+
| md | `h-9` | `px-3` | `h-4 w-4` | Icon buttons |
|
|
206
|
+
| lg | `h-10` | `px-4` | `h-5 w-5` | Primary actions |
|
|
207
|
+
|
|
208
|
+
```tsx
|
|
209
|
+
// Primary
|
|
210
|
+
"h-10 px-4 rounded-md bg-primary text-primary-foreground hover:opacity-90"
|
|
211
|
+
|
|
212
|
+
// Secondary
|
|
213
|
+
"h-10 px-4 rounded-md border border-border/60 bg-card hover:bg-muted"
|
|
214
|
+
|
|
215
|
+
// Ghost
|
|
216
|
+
"h-9 px-3 rounded-md hover:bg-muted"
|
|
217
|
+
|
|
218
|
+
// Icon
|
|
219
|
+
"h-9 w-9 rounded-md hover:bg-muted text-muted-foreground"
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Cards
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
// Main card (primary, higher elevation)
|
|
226
|
+
<Card className="bg-card text-card-foreground rounded-lg shadow-md">
|
|
227
|
+
|
|
228
|
+
// Sidebar card (secondary, lower)
|
|
229
|
+
<Card className="bg-card text-card-foreground rounded-lg shadow-sm">
|
|
230
|
+
|
|
231
|
+
// Subtle container
|
|
232
|
+
<div className="rounded-md border border-border/50 bg-muted/40 px-3 py-2">
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Frosted Glass (Auth/Splash Screens)
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
// Blue gradient background
|
|
239
|
+
style={{ background: 'linear-gradient(to bottom, rgb(56, 189, 248), rgb(37, 99, 235))' }}
|
|
240
|
+
|
|
241
|
+
// Frosted glass card
|
|
242
|
+
<Card className="bg-white/90 backdrop-blur-sm border-blue-200 hover:shadow-lg transition-all duration-300">
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Toast Notifications
|
|
246
|
+
|
|
247
|
+
Current implementation uses Radix UI `@radix-ui/react-toast` with CVA variants:
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
// Variants: default, destructive, success, error, warning, info
|
|
251
|
+
// Base style:
|
|
252
|
+
"rounded-lg border-2 p-5 pr-7 shadow-xl backdrop-blur-sm"
|
|
253
|
+
|
|
254
|
+
// Each variant has light/dark mode colors:
|
|
255
|
+
// success: border-green-300 bg-green-50/95 text-green-900
|
|
256
|
+
// error: border-red-300 bg-red-50/95 text-red-900
|
|
257
|
+
// warning: border-amber-300 bg-amber-50/95 text-amber-900
|
|
258
|
+
// info: border-blue-300 bg-blue-50/95 text-blue-900
|
|
259
|
+
|
|
260
|
+
// Viewport: bottom-right on desktop, top on mobile
|
|
261
|
+
// Max width: 420px
|
|
262
|
+
// Animations: slide-in-from-top (mobile), slide-in-from-bottom (desktop)
|
|
263
|
+
// Hover: shadow-2xl + translate-y-0.5 lift
|
|
264
|
+
// Icons: Lucide (CheckCircle2, AlertCircle, AlertTriangle, Info) in rounded-full bg
|
|
265
|
+
// Close: absolute top-right, visible on hover
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Form Controls
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
// Input
|
|
272
|
+
"h-10 rounded-md border border-border/60 bg-card px-3 text-sm focus:ring-2 focus:ring-ring/40"
|
|
273
|
+
|
|
274
|
+
// Textarea
|
|
275
|
+
"rounded-md border border-border/60 bg-card p-3 text-sm min-h-[80px] focus:ring-2 focus:ring-ring/40"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Animation System
|
|
279
|
+
|
|
280
|
+
### Tailwind Keyframes
|
|
281
|
+
|
|
282
|
+
| Name | Duration | Usage |
|
|
283
|
+
|------|----------|-------|
|
|
284
|
+
| `wiggle` | 1s infinite | Playful attention |
|
|
285
|
+
| `fade-in` | 0.5s ease-out | Element entrance (translateY 10px) |
|
|
286
|
+
| `spin-slow` | 3s linear infinite | Loading states |
|
|
287
|
+
| `pulse-subtle` | 2s infinite | Gentle pulse (opacity 1→0.9) |
|
|
288
|
+
| `shimmer` | 2s linear infinite | Loading skeleton |
|
|
289
|
+
| `bounce-once` | 1s ease | Single bounce |
|
|
290
|
+
|
|
291
|
+
### Framer Motion (Auth/Splash)
|
|
292
|
+
|
|
293
|
+
```tsx
|
|
294
|
+
// Container: stagger children by 0.1s
|
|
295
|
+
const containerVariants = {
|
|
296
|
+
hidden: { opacity: 0 },
|
|
297
|
+
visible: { opacity: 1, transition: { staggerChildren: 0.1 } },
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Items: spring up from 20px below
|
|
301
|
+
const itemVariants = {
|
|
302
|
+
hidden: { y: 20, opacity: 0 },
|
|
303
|
+
visible: { y: 0, opacity: 1, transition: { type: 'spring', stiffness: 50 } },
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Task Completion
|
|
308
|
+
|
|
309
|
+
- Wavy green SVG strikethrough line + text fade
|
|
310
|
+
- 2s animation duration
|
|
311
|
+
- Do NOT modify sort logic in `sortTasksAndEvents.js`
|
|
312
|
+
|
|
313
|
+
## Design Principles
|
|
314
|
+
|
|
315
|
+
1. **Neutral Over Saturated** -- Use muted backgrounds, subtle borders. No saturated gradients for secondary elements.
|
|
316
|
+
2. **Elevation Hierarchy** -- Primary content gets `shadow-md`, secondary gets `shadow-sm`.
|
|
317
|
+
3. **Progressive Disclosure** -- Hide secondary actions until hover/focus.
|
|
318
|
+
4. **Density Over Chrome** -- Tight padding, compact buttons, reduce visual noise.
|
|
319
|
+
|
|
320
|
+
## Tech Stack
|
|
321
|
+
|
|
322
|
+
- **Framework**: React 19, Vite 7, TypeScript
|
|
323
|
+
- **State**: Jotai (client) + TanStack Query (server)
|
|
324
|
+
- **UI**: shadcn/ui (new-york style) + Material-UI (legacy, migrating away)
|
|
325
|
+
- **Styling**: Tailwind CSS with custom design tokens
|
|
326
|
+
- **Icons**: Lucide (primary), FontAwesome (legacy, GettingStarted only)
|
|
327
|
+
- **Animation**: Framer Motion (auth flows), Tailwind keyframes (in-app)
|
|
328
|
+
- **Mobile**: Capacitor for iOS/Android
|
|
329
|
+
- **Dark Mode**: `class` strategy via Tailwind `darkMode: 'class'`
|
|
330
|
+
|
|
331
|
+
## File Structure
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
src/
|
|
335
|
+
styles/
|
|
336
|
+
design-tokens.css CSS custom properties (brand, semantic, priority, task type)
|
|
337
|
+
notification-animations.css Toast animation keyframes
|
|
338
|
+
globals.css shadcn/ui CSS variables
|
|
339
|
+
components/
|
|
340
|
+
ui/ shadcn/ui base components (toast, card, button, etc.)
|
|
341
|
+
auth/ Auth flows (GettingStarted, EmailForm)
|
|
342
|
+
notifications/ NotificationItem, notification panels
|
|
343
|
+
lib/
|
|
344
|
+
utils.ts cn() helper (clsx + tailwind-merge)
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Key Files
|
|
348
|
+
|
|
349
|
+
- `tailwind.config.js` -- All design tokens, type scale, colors, animations
|
|
350
|
+
- `src/styles/design-tokens.css` -- CSS custom properties with dark mode overrides
|
|
351
|
+
- `docs/technical/frontend/UI-DESIGN-SYSTEM.md` -- Full design system documentation
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pan-new-project
|
|
3
|
+
description: >
|
|
4
|
+
Complete setup for registering a new project with Panopticon. Handles
|
|
5
|
+
project registration, issue prefix, workspace config, trust setup,
|
|
6
|
+
beads init, tracker config, and validates against working projects.
|
|
7
|
+
triggers:
|
|
8
|
+
- new project
|
|
9
|
+
- add new project
|
|
10
|
+
- register new project
|
|
11
|
+
- setup new project
|
|
12
|
+
- onboard project
|
|
13
|
+
- pan new project
|
|
14
|
+
allowed-tools:
|
|
15
|
+
- Bash
|
|
16
|
+
- Read
|
|
17
|
+
- Edit
|
|
18
|
+
- Write
|
|
19
|
+
- Glob
|
|
20
|
+
- Grep
|
|
21
|
+
- AskUserQuestion
|
|
22
|
+
version: "2.0.0"
|
|
23
|
+
author: "Ed Becker"
|
|
24
|
+
license: "MIT"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# New Project Setup
|
|
28
|
+
|
|
29
|
+
**Trigger:** `/pan-new-project`
|
|
30
|
+
|
|
31
|
+
Sets up a new project for Panopticon management. This is the ONLY correct
|
|
32
|
+
way to add a new project. Do NOT just run `pan project add` alone — it
|
|
33
|
+
creates a skeleton entry that breaks planning agents, workspace creation,
|
|
34
|
+
issue routing, and beads.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## WHY THIS SKILL EXISTS
|
|
39
|
+
|
|
40
|
+
Running `pan project add /path --name foo` alone causes these failures:
|
|
41
|
+
|
|
42
|
+
| Missing config | Symptom |
|
|
43
|
+
|----------------|---------|
|
|
44
|
+
| `linear_team` (issue prefix) | Planning agents start in `$HOME`, not the project root |
|
|
45
|
+
| Trust entry in `~/.claude.json` | Claude Code shows trust dialog, blocking autonomous agents |
|
|
46
|
+
| `GITHUB_REPOS` entry | Issues don't appear on the dashboard kanban board |
|
|
47
|
+
| `beads.role` in git config | Every `bd` command prints "beads.role not configured" warnings |
|
|
48
|
+
| `workspaces/` directory | Git worktree creation fails |
|
|
49
|
+
| `.gitignore` entry | `workspaces/` gets committed accidentally |
|
|
50
|
+
| Test config | Specialist test agents can't run tests |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## EXECUTION STEPS
|
|
55
|
+
|
|
56
|
+
### Step 1: Gather Project Information
|
|
57
|
+
|
|
58
|
+
Ask the user for (or auto-detect from the filesystem):
|
|
59
|
+
|
|
60
|
+
| Field | Required | Example | Notes |
|
|
61
|
+
|-------|----------|---------|-------|
|
|
62
|
+
| Path | Yes | `/home/eltmon/Projects/myapp` | Must exist, must have `.git/` |
|
|
63
|
+
| Name | Yes | `myapp` | Short lowercase key for projects.yaml |
|
|
64
|
+
| Issue prefix | Yes | `APP` | Maps `APP-123` → this project. Goes in `linear_team` field |
|
|
65
|
+
| Tracker | Yes | `github` / `linear` / `gitlab` | Where issues live |
|
|
66
|
+
| Repo slug | Yes | `owner/repo` | `github_repo` or `gitlab_repo` |
|
|
67
|
+
| Workspace type | Yes | `standalone` / `monorepo` / `polyrepo` | How git worktrees work |
|
|
68
|
+
|
|
69
|
+
**Auto-detection:**
|
|
70
|
+
- `go.mod` → Go, test: `make test` or `go test ./...`
|
|
71
|
+
- `package.json` → Node/TS, test: `npm test` or `pnpm test`
|
|
72
|
+
- `pom.xml` / `mvnw` → Java/Maven, test: `./mvnw test`
|
|
73
|
+
- `Cargo.toml` → Rust, test: `cargo test`
|
|
74
|
+
- `pyproject.toml` → Python, test: `pytest`
|
|
75
|
+
|
|
76
|
+
### Step 2: Register Project
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pan project add <path> --name <name>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
This creates a minimal entry AND pre-trusts the directory in `~/.claude.json`
|
|
83
|
+
(the `projectAddCommand` calls `preTrustDirectory` automatically).
|
|
84
|
+
|
|
85
|
+
### Step 3: Configure projects.yaml
|
|
86
|
+
|
|
87
|
+
Edit `~/.panopticon/projects.yaml` to add the FULL configuration.
|
|
88
|
+
|
|
89
|
+
**Minimum viable config:**
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
<project-key>:
|
|
93
|
+
name: <name>
|
|
94
|
+
path: <absolute-path>
|
|
95
|
+
linear_team: <PREFIX> # CRITICAL: issue prefix for routing
|
|
96
|
+
github_repo: <owner/repo> # or gitlab_repo
|
|
97
|
+
workspace:
|
|
98
|
+
type: <standalone|monorepo|polyrepo>
|
|
99
|
+
workspaces_dir: workspaces
|
|
100
|
+
default_branch: main
|
|
101
|
+
tests:
|
|
102
|
+
unit:
|
|
103
|
+
type: <go|vitest|maven|pytest|cargo>
|
|
104
|
+
path: .
|
|
105
|
+
command: <test command>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Full config** (for projects with services, Docker, DNS):
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
<project-key>:
|
|
112
|
+
name: <name>
|
|
113
|
+
path: <absolute-path>
|
|
114
|
+
linear_team: <PREFIX>
|
|
115
|
+
github_repo: <owner/repo>
|
|
116
|
+
workspace:
|
|
117
|
+
type: <type>
|
|
118
|
+
workspaces_dir: workspaces
|
|
119
|
+
default_branch: main
|
|
120
|
+
dns:
|
|
121
|
+
domain: <name>.localhost
|
|
122
|
+
entries:
|
|
123
|
+
- "{{FEATURE_FOLDER}}.{{DOMAIN}}"
|
|
124
|
+
sync_method: hosts_file
|
|
125
|
+
docker:
|
|
126
|
+
traefik: templates/traefik
|
|
127
|
+
compose_template: infra/.devcontainer-template
|
|
128
|
+
agent:
|
|
129
|
+
template_dir: infra/.agent-template
|
|
130
|
+
copy_dirs:
|
|
131
|
+
- .claude/commands
|
|
132
|
+
- .claude/skills
|
|
133
|
+
services:
|
|
134
|
+
- name: <service>
|
|
135
|
+
path: .
|
|
136
|
+
start_command: <cmd>
|
|
137
|
+
health_url: <url>
|
|
138
|
+
port: <port>
|
|
139
|
+
env:
|
|
140
|
+
secrets_file: ~/.myapp/.env
|
|
141
|
+
tests:
|
|
142
|
+
unit:
|
|
143
|
+
type: <type>
|
|
144
|
+
path: .
|
|
145
|
+
command: <cmd>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Step 4: Add to Dashboard Tracker Config
|
|
149
|
+
|
|
150
|
+
For **GitHub** projects, add to `GITHUB_REPOS` in `~/.panopticon.env`:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Format: owner/repo:PREFIX (comma-separated)
|
|
154
|
+
# Example: current value might be:
|
|
155
|
+
# GITHUB_REPOS=eltmon/panopticon-cli:PAN
|
|
156
|
+
# Append the new project:
|
|
157
|
+
# GITHUB_REPOS=eltmon/panopticon-cli:PAN,owner/newrepo:APP
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Read current value, append new repo, write back. The dashboard polls this
|
|
161
|
+
to fetch issues from GitHub.
|
|
162
|
+
|
|
163
|
+
For **Linear** projects, issues are fetched automatically by team — no
|
|
164
|
+
extra config needed beyond `linear_team` in projects.yaml.
|
|
165
|
+
|
|
166
|
+
For **GitLab** projects, TBD — not yet supported in dashboard polling.
|
|
167
|
+
|
|
168
|
+
### Step 5: Initialize Beads
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
cd <project-path>
|
|
172
|
+
git config beads.role agent
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
This prevents the `"beads.role not configured"` warning on every `bd` command.
|
|
176
|
+
New worktrees inherit this automatically since Panopticon now sets it during
|
|
177
|
+
workspace creation (`workspace-manager.ts` and `worktree.ts`).
|
|
178
|
+
|
|
179
|
+
### Step 6: Create workspaces/ Directory
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
mkdir -p <project-path>/workspaces
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Check `.gitignore` — add `workspaces/` if not already there:
|
|
186
|
+
```bash
|
|
187
|
+
grep -q '^workspaces/' <project-path>/.gitignore 2>/dev/null || \
|
|
188
|
+
echo 'workspaces/' >> <project-path>/.gitignore
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Step 7: Create CLAUDE.md (if missing)
|
|
192
|
+
|
|
193
|
+
Check if the project has a `CLAUDE.md`. If not, create a minimal one:
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+
# <Project Name>
|
|
197
|
+
|
|
198
|
+
## Project Overview
|
|
199
|
+
<Brief description>
|
|
200
|
+
|
|
201
|
+
## Stack
|
|
202
|
+
<Language, framework, key dependencies>
|
|
203
|
+
|
|
204
|
+
## Development
|
|
205
|
+
<How to build, run, test>
|
|
206
|
+
|
|
207
|
+
## Testing
|
|
208
|
+
<Test commands, coverage requirements>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Step 8: Validate Configuration
|
|
212
|
+
|
|
213
|
+
Run ALL of these checks and report pass/fail:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# 1. Project registered
|
|
217
|
+
pan project list | grep <name>
|
|
218
|
+
|
|
219
|
+
# 2. Issue prefix resolves (won't crash)
|
|
220
|
+
# Check projects.yaml has linear_team: <PREFIX>
|
|
221
|
+
|
|
222
|
+
# 3. Trust is set in ~/.claude.json
|
|
223
|
+
node -e "
|
|
224
|
+
const d=JSON.parse(require('fs').readFileSync(
|
|
225
|
+
require('os').homedir()+'/.claude.json','utf8'));
|
|
226
|
+
console.log(d.projects?.['<path>']?.hasTrustDialogAccepted
|
|
227
|
+
? 'PASS: trusted' : 'FAIL: not trusted');
|
|
228
|
+
"
|
|
229
|
+
|
|
230
|
+
# 4. Dashboard can see issues (GitHub only)
|
|
231
|
+
grep 'GITHUB_REPOS' ~/.panopticon.env | grep -q '<PREFIX>' && \
|
|
232
|
+
echo "PASS: in GITHUB_REPOS" || echo "FAIL: not in GITHUB_REPOS"
|
|
233
|
+
|
|
234
|
+
# 5. Beads configured
|
|
235
|
+
cd <path> && git config beads.role && echo "PASS" || echo "FAIL: beads.role not set"
|
|
236
|
+
|
|
237
|
+
# 6. workspaces/ exists
|
|
238
|
+
test -d <path>/workspaces && echo "PASS" || echo "FAIL: no workspaces/"
|
|
239
|
+
|
|
240
|
+
# 7. workspaces/ in .gitignore
|
|
241
|
+
grep -q 'workspaces' <path>/.gitignore 2>/dev/null && \
|
|
242
|
+
echo "PASS" || echo "FAIL: workspaces/ not in .gitignore"
|
|
243
|
+
|
|
244
|
+
# 8. CLAUDE.md exists
|
|
245
|
+
test -f <path>/CLAUDE.md && echo "PASS" || echo "WARN: no CLAUDE.md"
|
|
246
|
+
|
|
247
|
+
# 9. Git clean
|
|
248
|
+
cd <path> && git status --short | head -5
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Step 9: Summary
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
## New Project Setup Complete: <NAME>
|
|
255
|
+
|
|
256
|
+
Path: <path>
|
|
257
|
+
Issue prefix: <PREFIX> (e.g., <PREFIX>-1, <PREFIX>-42)
|
|
258
|
+
Tracker: GitHub (<owner/repo>)
|
|
259
|
+
Workspace type: <type>
|
|
260
|
+
Tests: <command>
|
|
261
|
+
Trusted: Yes
|
|
262
|
+
Beads: Configured
|
|
263
|
+
Dashboard: Issues visible
|
|
264
|
+
|
|
265
|
+
Validation: 8/8 checks passed
|
|
266
|
+
|
|
267
|
+
Next steps:
|
|
268
|
+
1. Create issues on <tracker>
|
|
269
|
+
2. Run: pan opus-plan <PREFIX>-<N> (plan with Opus)
|
|
270
|
+
3. Run: pan work issue <PREFIX>-<N> (spawn implementation agent)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## REFERENCE: Working Project Configs
|
|
276
|
+
|
|
277
|
+
### panopticon-cli (monorepo, GitHub)
|
|
278
|
+
- `linear_team: PAN`, `github_repo: eltmon/panopticon-cli`
|
|
279
|
+
- `workspace.type: monorepo`
|
|
280
|
+
- Has: dns, docker, agent, services, env, tests
|
|
281
|
+
|
|
282
|
+
### mind-your-now (polyrepo, Linear/GitLab)
|
|
283
|
+
- `linear_team: MIN`, `gitlab_repo: eltmon/mind-your-now`
|
|
284
|
+
- `workspace.type: polyrepo` with 6 sub-repos
|
|
285
|
+
- Has: dns, docker, database, agent, services, tunnel, hume, env, tests
|
|
286
|
+
|
|
287
|
+
### myn-cli (standalone, GitHub)
|
|
288
|
+
- `linear_team: CLI`, `github_repo: mindyournow/myn-cli`
|
|
289
|
+
- `workspace.type: standalone`
|
|
290
|
+
- Has: tests
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## COMMON MISTAKES
|
|
295
|
+
|
|
296
|
+
1. **Missing `linear_team`** — The #1 cause of "planning agent starts in $HOME."
|
|
297
|
+
Despite the name, this field is the issue PREFIX for ALL trackers, not just Linear.
|
|
298
|
+
2. **Not in `GITHUB_REPOS`** — Issues don't appear on dashboard kanban board.
|
|
299
|
+
3. **No `beads.role`** — Every `bd` command prints warning noise in agent output.
|
|
300
|
+
4. **Not pre-trusting the directory** — Agent gets stuck on trust dialog.
|
|
301
|
+
5. **Wrong `workspace.type`** — `standalone` = single repo, `monorepo` = one repo with
|
|
302
|
+
worktrees, `polyrepo` = multiple repos under one parent dir.
|
|
303
|
+
6. **Missing `workspaces/` directory** — Git worktree creation fails.
|
|
304
|
+
7. **Missing `.gitignore` entry** — `workspaces/` gets committed accidentally.
|