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.
Files changed (71) hide show
  1. package/README.md +96 -210
  2. package/dist/{agents-VLK4BMVA.js → agents-5OPQKM5K.js} +6 -5
  3. package/dist/{chunk-OMNXYPXC.js → chunk-2V4NF7J2.js} +14 -1
  4. package/dist/chunk-2V4NF7J2.js.map +1 -0
  5. package/dist/{chunk-XKT5MHPT.js → chunk-4YSYJ4HM.js} +2 -2
  6. package/dist/{chunk-XFR2DLMR.js → chunk-76F6DSVS.js} +49 -10
  7. package/dist/chunk-76F6DSVS.js.map +1 -0
  8. package/dist/{chunk-PI7Y3PSN.js → chunk-F5555J3A.js} +42 -6
  9. package/dist/chunk-F5555J3A.js.map +1 -0
  10. package/dist/{chunk-KJ2TRXNK.js → chunk-FTCPTHIJ.js} +47 -420
  11. package/dist/chunk-FTCPTHIJ.js.map +1 -0
  12. package/dist/chunk-HJSM6E6U.js +1038 -0
  13. package/dist/chunk-HJSM6E6U.js.map +1 -0
  14. package/dist/{chunk-RBUO57TC.js → chunk-NLQRED36.js} +3 -3
  15. package/dist/chunk-NLQRED36.js.map +1 -0
  16. package/dist/{chunk-ASY7T35E.js → chunk-OWHXCGVO.js} +245 -90
  17. package/dist/chunk-OWHXCGVO.js.map +1 -0
  18. package/dist/{chunk-BKCWRMUX.js → chunk-VHKSS7QX.js} +106 -11
  19. package/dist/chunk-VHKSS7QX.js.map +1 -0
  20. package/dist/{chunk-GFP3PIPB.js → chunk-YGJ54GW2.js} +1 -1
  21. package/dist/chunk-YGJ54GW2.js.map +1 -0
  22. package/dist/cli/index.js +1521 -935
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/dashboard/prompts/work-agent.md +2 -0
  25. package/dist/dashboard/public/assets/index-Ce6q21Fm.js +743 -0
  26. package/dist/dashboard/public/assets/{index-UjZq6ykz.css → index-NzpI0ItZ.css} +1 -1
  27. package/dist/dashboard/public/index.html +2 -2
  28. package/dist/dashboard/server.js +4274 -2320
  29. package/dist/{feedback-writer-LVZ5TFYZ.js → feedback-writer-VRMMWWTW.js} +2 -2
  30. package/dist/git-utils-I2UDKNZH.js +131 -0
  31. package/dist/git-utils-I2UDKNZH.js.map +1 -0
  32. package/dist/index.d.ts +12 -1
  33. package/dist/index.js +5 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/{projects-JEIVIYC6.js → projects-CFX3RTDL.js} +4 -2
  36. package/dist/{remote-workspace-AHVHQEES.js → remote-workspace-7FPGF2RM.js} +2 -2
  37. package/dist/{review-status-EPFG4XM7.js → review-status-TDPSOU5J.js} +2 -2
  38. package/dist/{specialist-context-T3NBMCIE.js → specialist-context-WGUUYDWY.js} +5 -5
  39. package/dist/{specialist-logs-CVKD3YJ3.js → specialist-logs-XJB5TCKJ.js} +5 -5
  40. package/dist/{specialists-TKAP6T6Z.js → specialists-5LBRHYFA.js} +5 -5
  41. package/dist/{traefik-QX4ZV4YG.js → traefik-WFMQX2LY.js} +3 -3
  42. package/dist/{workspace-manager-KLHUCIZV.js → workspace-manager-E434Z45T.js} +2 -2
  43. package/package.json +1 -1
  44. package/scripts/record-cost-event.js +5 -5
  45. package/scripts/stop-hook +7 -0
  46. package/scripts/work-agent-stop-hook +137 -0
  47. package/skills/myn-standards/SKILL.md +351 -0
  48. package/skills/pan-new-project/SKILL.md +304 -0
  49. package/skills/write-spec/SKILL.md +138 -0
  50. package/dist/chunk-7XNJJBH6.js +0 -538
  51. package/dist/chunk-7XNJJBH6.js.map +0 -1
  52. package/dist/chunk-ASY7T35E.js.map +0 -1
  53. package/dist/chunk-BKCWRMUX.js.map +0 -1
  54. package/dist/chunk-GFP3PIPB.js.map +0 -1
  55. package/dist/chunk-KJ2TRXNK.js.map +0 -1
  56. package/dist/chunk-OMNXYPXC.js.map +0 -1
  57. package/dist/chunk-PI7Y3PSN.js.map +0 -1
  58. package/dist/chunk-RBUO57TC.js.map +0 -1
  59. package/dist/chunk-XFR2DLMR.js.map +0 -1
  60. package/dist/dashboard/public/assets/index-kAJqtLDO.js +0 -708
  61. /package/dist/{agents-VLK4BMVA.js.map → agents-5OPQKM5K.js.map} +0 -0
  62. /package/dist/{chunk-XKT5MHPT.js.map → chunk-4YSYJ4HM.js.map} +0 -0
  63. /package/dist/{feedback-writer-LVZ5TFYZ.js.map → feedback-writer-VRMMWWTW.js.map} +0 -0
  64. /package/dist/{projects-JEIVIYC6.js.map → projects-CFX3RTDL.js.map} +0 -0
  65. /package/dist/{remote-workspace-AHVHQEES.js.map → remote-workspace-7FPGF2RM.js.map} +0 -0
  66. /package/dist/{review-status-EPFG4XM7.js.map → review-status-TDPSOU5J.js.map} +0 -0
  67. /package/dist/{specialist-context-T3NBMCIE.js.map → specialist-context-WGUUYDWY.js.map} +0 -0
  68. /package/dist/{specialist-logs-CVKD3YJ3.js.map → specialist-logs-XJB5TCKJ.js.map} +0 -0
  69. /package/dist/{specialists-TKAP6T6Z.js.map → specialists-5LBRHYFA.js.map} +0 -0
  70. /package/dist/{traefik-QX4ZV4YG.js.map → traefik-WFMQX2LY.js.map} +0 -0
  71. /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.