@slycode/slycode 0.1.14 → 0.1.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 (81) hide show
  1. package/dist/bridge/session-manager.js +1 -8
  2. package/dist/bridge/session-manager.js.map +1 -1
  3. package/dist/store/skills/context-priming/references/area-index.md +121 -68
  4. package/{templates/store/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/feature-guide.md +44 -18
  5. package/dist/store/skills/context-priming/references/areas/messaging.md +108 -34
  6. package/dist/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  7. package/dist/store/skills/context-priming/references/areas/skills.md +99 -38
  8. package/{templates/updates/skills/context-priming/references → dist/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  9. package/dist/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  10. package/dist/store/skills/context-priming/references/areas/web-frontend.md +259 -74
  11. package/dist/web/.next/BUILD_ID +1 -1
  12. package/dist/web/.next/build-manifest.json +2 -2
  13. package/dist/web/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/dist/web/.next/server/app/_not-found.html +1 -1
  21. package/dist/web/.next/server/app/_not-found.rsc +1 -1
  22. package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  23. package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  25. package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  28. package/dist/web/.next/server/pages/404.html +1 -1
  29. package/dist/web/.next/server/pages/500.html +2 -2
  30. package/lib/cli/sync.d.ts +7 -0
  31. package/lib/cli/sync.d.ts.map +1 -1
  32. package/lib/cli/sync.js +32 -0
  33. package/lib/cli/sync.js.map +1 -1
  34. package/lib/cli/update.d.ts.map +1 -1
  35. package/lib/cli/update.js +9 -0
  36. package/lib/cli/update.js.map +1 -1
  37. package/package.json +1 -1
  38. package/templates/kanban-seed.json +1 -1
  39. package/templates/store/skills/context-priming/references/area-index.md +121 -68
  40. package/templates/{updates/skills/context-priming/references → store/skills/context-priming}/references/areas/feature-guide.md +44 -18
  41. package/templates/store/skills/context-priming/references/areas/messaging.md +108 -34
  42. package/templates/store/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  43. package/templates/store/skills/context-priming/references/areas/skills.md +99 -38
  44. package/{dist/store/skills/context-priming/references → templates/store/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  45. package/templates/store/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  46. package/templates/store/skills/context-priming/references/areas/web-frontend.md +259 -74
  47. package/templates/updates/skills/context-priming/references/area-index.md +121 -68
  48. package/{dist/store/skills/context-priming/references → templates/updates/skills/context-priming}/references/areas/feature-guide.md +44 -18
  49. package/templates/updates/skills/context-priming/references/areas/messaging.md +108 -34
  50. package/templates/updates/skills/context-priming/references/areas/scripts-deployment.md +61 -16
  51. package/templates/updates/skills/context-priming/references/areas/skills.md +99 -38
  52. package/templates/{store/skills/context-priming/references → updates/skills/context-priming}/references/areas/terminal-actions.md +1 -1
  53. package/templates/updates/skills/context-priming/references/areas/terminal-bridge.md +74 -42
  54. package/templates/updates/skills/context-priming/references/areas/web-frontend.md +259 -74
  55. package/dist/store/skills/context-priming/references/areas/claude-actions.md +0 -120
  56. package/dist/store/skills/context-priming/references/references/area-index.md +0 -152
  57. package/dist/store/skills/context-priming/references/references/areas/messaging.md +0 -251
  58. package/dist/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  59. package/dist/store/skills/context-priming/references/references/areas/skills.md +0 -196
  60. package/dist/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  61. package/dist/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  62. package/dist/store/skills/context-priming/references/references/maintenance.md +0 -128
  63. package/templates/store/skills/context-priming/references/areas/claude-actions.md +0 -120
  64. package/templates/store/skills/context-priming/references/references/area-index.md +0 -152
  65. package/templates/store/skills/context-priming/references/references/areas/messaging.md +0 -251
  66. package/templates/store/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  67. package/templates/store/skills/context-priming/references/references/areas/skills.md +0 -196
  68. package/templates/store/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  69. package/templates/store/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  70. package/templates/store/skills/context-priming/references/references/maintenance.md +0 -128
  71. package/templates/updates/skills/context-priming/references/areas/claude-actions.md +0 -120
  72. package/templates/updates/skills/context-priming/references/references/area-index.md +0 -152
  73. package/templates/updates/skills/context-priming/references/references/areas/messaging.md +0 -251
  74. package/templates/updates/skills/context-priming/references/references/areas/scripts-deployment.md +0 -183
  75. package/templates/updates/skills/context-priming/references/references/areas/skills.md +0 -196
  76. package/templates/updates/skills/context-priming/references/references/areas/terminal-bridge.md +0 -263
  77. package/templates/updates/skills/context-priming/references/references/areas/web-frontend.md +0 -437
  78. package/templates/updates/skills/context-priming/references/references/maintenance.md +0 -128
  79. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_buildManifest.js +0 -0
  80. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_clientMiddlewareManifest.json +0 -0
  81. /package/dist/web/.next/static/{wMUaNt62q8VYjpVs4m1_t → 0m9O2FYuB-xI-Vb-Y4k-C}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
1
  # Web Frontend
2
2
 
3
- Updated: 2026-02-14
3
+ Updated: 2026-03-14
4
4
 
5
5
  ## Overview
6
6
 
7
- Next.js 16 command center for project management. Features project cards with health scoring, kanban boards with drag-drop, card modals, command configuration, system health monitoring, cross-project toolkit/asset management, global search, activity feed, project scaffolding, and graceful reconnection handling. Neon-minimalist theme (SlyCode Neon) with Tailwind CSS v4, featuring lane-colored gradients, SVG noise textures, and theme-aware terminal styling.
7
+ Next.js 16 command center for project management. Features project cards with health scoring, kanban boards with drag-drop, card modals with agent notes and automation config, command configuration, system health monitoring, cross-project toolkit/asset management, global search, activity feed, project scaffolding, server-side automation scheduler, voice-to-text input, image paste to terminal, responsive mobile layout, and graceful reconnection handling. Neon-minimalist theme (SlyCode Neon) with Tailwind CSS v4, featuring lane-colored gradients, SVG noise textures, shadow depth system, glassmorphism cards, priority-colored glows, and theme-aware terminal styling. JetBrains Mono font (`--font-jetbrains-mono`) for card numbers and checklist counts.
8
8
 
9
9
  ## Key Files
10
10
 
@@ -12,101 +12,165 @@ Next.js 16 command center for project management. Features project cards with he
12
12
  - `web/src/app/page.tsx` - Home dashboard, lists projects from registry
13
13
  - `web/src/app/project/[id]/page.tsx` - Project detail page with kanban
14
14
  - `web/src/components/ProjectPageClient.tsx` - Client wrapper for project pages, global terminal activity polling
15
- - `web/src/components/ProjectView.tsx` - Project view wrapper, manages archive toggle state
15
+ - `web/src/components/ProjectView.tsx` - Project view wrapper, manages archive toggle and active-automation-indicator state
16
16
 
17
17
  ### Core Components
18
- - `web/src/components/Dashboard.tsx` - Project card grid + Toolkit tab, global search, number-key shortcuts
19
- - `web/src/components/ProjectKanban.tsx` - Kanban board container, drag-drop logic
20
- - `web/src/components/KanbanColumn.tsx` - Stage columns (backlog, design, impl, testing, done)
21
- - `web/src/components/KanbanCardItem.tsx` - Individual card, status indicators, active glow effect
22
- - `web/src/components/CardModal.tsx` - Full card editor with dynamic tabs, edit session protection
23
- - `web/src/components/ProjectHeader.tsx` - Header with Commands, Archive toggle, HealthMonitor
18
+ - `web/src/components/Dashboard.tsx` - "Code Den" + CLI Assets tabs (with description subtitles), project card grid, global search, number-key shortcuts, footer with version display
19
+ - `web/src/components/ProjectKanban.tsx` - Kanban board container, drag-drop logic, context menu state, onActiveAutomationsChange callback to ProjectView
20
+ - `web/src/components/KanbanColumn.tsx` - Stage columns, flex-grow layout (min-w-72 max-w-96) for wide viewports
21
+ - `web/src/components/KanbanCardItem.tsx` - Individual card with glassmorphic style, priority-colored hover glow, card numbers, type emojis, compact mode for done stage, right-click onContextMenu trigger
22
+ - `web/src/components/CardModal.tsx` - Full card editor with dynamic tabs, agent notes, automation toggle (disabled for archived cards), archive toggle (disabled for automation cards), copy title button, edit session protection, suppressAutoTerminal prop
23
+ - `web/src/components/AutomationConfig.tsx` - Cron builder UI for card automation settings (schedule, provider, fresh session, report toggle, Run Now button with loading/success/error feedback). No prompt field — card description is the automation prompt. All nextRun calculation server-side: `refreshNextRun()` POSTs to /api/scheduler `nextRun` action on enable toggle, schedule type switch, builder changes, and raw cron input.
24
+ - `web/src/components/AutomationsScreen.tsx` - Full-screen automations view (max-w-5xl, 2-col grid), countdown timers, tag grouping, chevron texture cards with hazard stripe
25
+ - `web/src/components/ProjectHeader.tsx` - Header with Commands (badge for action updates), Archive toggle, Automations toggle (pulses when automations active), HealthMonitor. Polls /api/cli-assets/updates for actionEntries count. Invalidates actions cache on SlyActionConfigModal close.
26
+ - `web/src/components/ContextMenu.tsx` - Portal-based context menu with keyboard navigation (Arrow keys, Enter, Escape), submenus (150ms hover delay), viewport-aware positioning, lane-colored accent bar
27
+ - `web/src/components/ConfirmDialog.tsx` - Confirmation dialog for destructive actions (delete), z-60 overlay
24
28
 
25
29
  ### Project Management
26
- - `web/src/components/ProjectCard.tsx` - Enhanced project card with health dot, platform badges, edit/delete
27
- - `web/src/components/AddProjectModal.tsx` - Multi-phase project creation wizard (details → analysisscaffolddone)
30
+ - `web/src/components/ProjectCard.tsx` - Compact project card with drag handle, truncated title, health dot, platform badges, edit/delete
31
+ - `web/src/components/AddProjectModal.tsx` - Multi-phase project creation wizard (details → providersreviewcreating → summary) with scaffold preview grouped by purpose
28
32
  - `web/src/components/HealthDot.tsx` - Health score indicator with tooltip (green/amber/red)
29
33
  - `web/src/components/PlatformBadges.tsx` - Detected AI platform badges (Claude, Gemini, Codex)
30
- - `web/src/components/SearchBar.tsx` - Global/contextual search across all kanban cards
34
+ - `web/src/components/SearchBar.tsx` - Global search across cards, active session display when query empty
31
35
 
32
36
  ### Terminal & Commands
33
- - `web/src/components/ClaudeTerminalPanel.tsx` - Reusable terminal with provider selector, startupCommands/activeCommands, card area filtering
34
- - `web/src/components/Terminal.tsx` - xterm.js terminal with ConnectionManager integration
35
- - `web/src/components/CommandConfigModal.tsx` - Command configuration UI with Command Assistant terminal
36
- - `web/src/components/GlobalClaudePanel.tsx` - Floating panel for project-wide session, supports session/CWD/class overrides
37
-
38
- ### Toolkit & Assets
39
- - `web/src/components/ToolkitTab.tsx` - Asset management tab with matrix view and pending changes
40
- - `web/src/components/AssetMatrix.tsx` - Cross-project asset deployment matrix with click-to-deploy/remove
41
- - `web/src/components/AssetViewer.tsx` - Modal viewer for asset content with frontmatter display
37
+ - `web/src/components/ClaudeTerminalPanel.tsx` - Reusable terminal with provider button group, single actions prop (splits by placement), card area filtering, image paste handling with screenshot toast, instruction file warning with opt-out checkbox
38
+ - `web/src/components/Terminal.tsx` - xterm.js terminal with ConnectionManager integration, Ctrl+V interception via `attachCustomKeyEventHandler` for image paste (falls back to text paste), resize broadcast with echo-loop suppression
39
+ - `web/src/components/SlyActionConfigModal.tsx` - Two-tab command config: Commands tab (edit definitions + placement) and Classes tab (assign + reorder per class), with Action Assistant terminal. Voice-integrated, Escape passes through to terminal when assistant is expanded. Shows "Updates" tab (with badge count) when action updates available.
40
+ - `web/src/components/ActionUpdatesModal.tsx` - Dedicated modal for action update delivery: accept/dismiss/preview with inline diff viewer (reuses SkillDiffViewer patterns)
41
+ - `web/src/components/GlobalClaudePanel.tsx` - Floating panel for project-wide session, handles terminal prompt events (auto-start/send), voice-aware click-outside (prevents collapse during recording)
42
+
43
+ ### Voice Input
44
+ - `web/src/contexts/VoiceContext.tsx` - Centralized voice state via React Context (`useVoice()` hook). Voice claim system (claimant model), settings management, terminal registry, floating widget rendering. VoiceProvider wraps entire app in layout.tsx.
45
+ - `web/src/components/VoiceControlBar.tsx` - Voice recording UI in CardModal header (mic button, timer, controls, state machine)
46
+ - `web/src/components/VoiceSettingsPopover.tsx` - Settings gear popover (keyboard shortcuts, auto-submit toggle, max recording length)
47
+ - `web/src/components/VoiceErrorPopup.tsx` - Error popup with retry/clear when transcription fails
48
+ - `web/src/components/FloatingVoiceWidget.tsx` - Floating portal-based voice widget shown at bottom-right when no modal claims voice control (recording/paused/transcribing states)
49
+ - `web/src/components/ThemeToggle.tsx` - Light/dark theme toggle using localStorage (`slycode-theme`), imported by Dashboard
50
+
51
+ ### CLI Assets
52
+ - `web/src/components/CliAssetsTab.tsx` - Asset management with Projects/Store/Updates views, provider sub-tabs, pending changes bar, 60s update polling, ImportDialog for skill imports (SKILL.md-only vs full folder)
53
+ - `web/src/components/AssetMatrix.tsx` - Cross-project asset deployment matrix with Fix/Ignore actions
54
+ - `web/src/components/AssetViewer.tsx` - Modal viewer for asset content with frontmatter display (version, updated, description — no provider field), project-aware loading
55
+ - `web/src/components/StoreView.tsx` - Store tab: flat canonical store (store/skills/, store/agents/), Delete/Fix/Modify actions
56
+ - `web/src/components/UpdatesView.tsx` - Update delivery: shows available updates from updates/ folder, accept/dismiss/preview workflow
57
+ - `web/src/components/SkillDiffViewer.tsx` - Side-by-side diff modal for comparing skill versions with line-level highlighting
58
+ - `web/src/components/AssetAssistant.tsx` - Modal for LLM-guided asset creation/modification via terminal prompts
59
+
60
+ ### Version Updates
61
+ - `web/src/components/VersionUpdateToast.tsx` - Bottom-left toast for npm version updates (6-hour poll, daily dismiss)
62
+ - `web/src/app/api/version-check/route.ts` - npm version check endpoint
63
+
64
+ ### Automation & Scheduling
65
+ - `web/src/lib/scheduler.ts` - Server-side cron engine (croner), 30s check interval, triggerAutomation() bridge integration, timezone-aware via TZ env var, buildRunHeader() for rich automation context, loadParentEnv() for .env loading (skips BRIDGE_URL/BRIDGE_PORT to avoid dev/prod port mismatch), updateCardAutomation() exported for manual trigger persistence. Split fresh/resume paths: fresh sessions use checkSessionAlive() (20s liveness check, no retry), resume sessions use waitForActivity() with retry. fetchWithTimeout() (10s) wraps all bridge calls. Soft failure handling: only sends Telegram notification on hard failures (crash, HTTP error), not detection uncertainty. Grace window (GRACE_WINDOW_MS = 60s): isDue() clamps lastRun reference to at most 60s ago, preventing stale ticks from long-disabled automations firing immediately on re-enable. New automations (no lastRun) always wait for first tick. HMR-safe: state + timer stored in `globalThis` via `__scheduler_state__`/`__scheduler_timer__` keys, `startScheduler()` clears stale intervals before creating new one. `getNextRun()` exported for use by kanban API and scheduler route.
66
+ - `web/src/lib/cron-utils.ts` - Shared cronToHumanReadable() utility (extracted from duplicate code in AutomationConfig + AutomationsScreen), timezone abbreviation suffix support. `getNextRunISO()` removed — all nextRun calculation now server-side via scheduler.ts `getNextRun()`.
67
+ - `web/src/instrumentation.ts` - Next.js instrumentation hook, auto-starts scheduler on server boot
68
+ - `web/src/app/api/scheduler/route.ts` - GET status + timezone info (auto-start), POST start/stop/trigger/nextRun. Manual trigger now persists lastRun/lastResult via updateCardAutomation(). `nextRun` action computes next cron run on demand (used by AutomationConfig `refreshNextRun()`).
42
69
 
43
70
  ### Activity & Content
44
71
  - `web/src/components/ActivityFeed.tsx` - Collapsible event log with day grouping and stage indicators
45
72
  - `web/src/components/MarkdownContent.tsx` - Markdown renderer using react-markdown with GFM support
46
73
 
47
74
  ### Health & Connection
48
- - `web/src/components/HealthMonitor.tsx` - System stats widget (CPU, memory, terminals)
49
- - `web/src/components/ConnectionStatusIndicator.tsx` - Reconnection toast indicator
75
+ - `web/src/components/HealthMonitor.tsx` - System stats widget (CPU, memory, terminals), click-to-toggle expand (mobile: compact dot + count, desktop: full bars)
76
+ - `web/src/components/ConnectionStatusIndicator.tsx` - Reconnection toast indicator with debounced disconnect and success timeout cleanup (unmount-safe refs)
50
77
  - `web/src/lib/connection-manager.ts` - Centralized SSE reconnection with Page Visibility API
51
78
 
52
79
  ### Hooks
53
80
  - `web/src/hooks/useConnectionStatus.ts` - Hook for connection state subscription
54
81
  - `web/src/hooks/useKeyboardShortcuts.ts` - Keyboard navigation (1-9 project jump, Escape)
55
- - `web/src/hooks/useCommandsConfig.ts` - Polling-based commands config loader (30s intervals)
82
+ - `web/src/hooks/useSlyActionsConfig.ts` - Polling-based commands config loader (30s intervals, serves v3 format with classAssignments)
83
+ - `web/src/hooks/useVoiceRecorder.ts` - Core voice hook: MediaRecorder lifecycle, state machine, timer, pause/resume, max-length auto-pause, audio blob management
84
+ - `web/src/hooks/useVoiceShortcuts.ts` - Voice keyboard shortcuts (context-dependent: idle vs recording states), configurable via settings
85
+ - `web/src/hooks/useSettings.ts` - Generic settings hook for reading/writing data/settings.json via API (on-demand fetch, optimistic updates)
56
86
  - `web/src/hooks/usePolling.ts` - Generic polling hook
57
87
 
58
88
  ### Utilities
59
89
  - `web/src/lib/types.ts` - All shared types (see Data Models)
60
- - `web/src/lib/claude-actions.ts` - getStartupCommands(), getActiveCommands(), renderTemplate()
61
- - `web/src/lib/registry.ts` - Project registry loader with kanban, health scoring, platform detection
62
- - `web/src/lib/paths.ts` - Dynamic path resolution for SlyCode root and project directories
63
- - `web/src/lib/kanban-paths.ts` - Project-aware kanban file path resolution with tiered backup
64
- - `web/src/lib/asset-scanner.ts` - Asset scanning, frontmatter parsing, version comparison, platform detection
90
+ - `web/src/lib/sly-actions.ts` - getActionsForClass(), renderTemplate(), buildPrompt(), CONTEXT_TEMPLATES (hardcoded), types
91
+ - `web/src/lib/action-scanner.ts` - Action .md file scanner: parse YAML frontmatter, assemble SlyActionsConfig, 30s cache, write support, update scanning (content-hash based), accept with additive class merge
92
+ - `web/src/lib/registry.ts` - Project registry loader with kanban, health scoring, platform detection. Exports `getRepoRoot()` for workspace root resolution.
93
+ - `web/src/lib/paths.ts` - Dynamic path resolution: getSlycodeRoot() (workspace), getPackageDir() (package assets — dev: repo root, prod: node_modules/@slycode/slycode/dist/)
94
+ - `web/src/lib/kanban-paths.ts` - Project-aware kanban file path resolution with tiered backup. Workspace ID derived via `path.basename(getRepoRoot())` with underscore→hyphen normalization.
95
+ - `web/src/lib/asset-scanner.ts` - Asset scanning, frontmatter parsing, version comparison, store matrix building, update scanning (scanUpdatesFolder, acceptUpdate, getIgnoredUpdates). MASTER_PROJECT_ID derived via `path.basename()` — no hardcoded project name.
96
+ - `web/src/lib/store-scanner.ts` - Flat canonical store scanning (store/skills/ dirs, store/agents/ files)
97
+ - `web/src/lib/provider-paths.ts` - Provider-specific asset directory conventions (Claude/Codex/Gemini)
98
+ - `web/src/lib/mcp-common.ts` - Provider-neutral MCP config format with per-provider transformers
99
+ - `web/src/lib/terminal-events.ts` - Custom event system for pushing prompts to global terminal (pushToTerminal)
65
100
  - `web/src/lib/event-log.ts` - Append-only activity log with filtering/querying (500 event cap)
66
101
  - `web/src/lib/health-score.ts` - Health score calculator with configurable weights
67
102
  - `web/src/lib/tab-sync.ts` - Cross-tab synchronization using BroadcastChannel API
68
103
 
69
104
  ### API Routes
70
- - `web/src/app/api/kanban/route.ts` - Kanban CRUD
105
+ - `web/src/app/api/kanban/route.ts` - Kanban CRUD. GET dynamically computes nextRun for all enabled recurring automation cards (server-side single source of truth for timezone via scheduler.ts getNextRun).
71
106
  - `web/src/app/api/bridge/[...path]/route.ts` - Bridge proxy
72
- - `web/src/app/api/commands/route.ts` - Commands CRUD
73
- - `web/src/app/api/commands/stream/route.ts` - SSE for command file changes
107
+ - `web/src/app/api/sly-actions/route.ts` - GET assembled config from action-scanner / PUT writes back to .md files
108
+ - `web/src/app/api/sly-actions/stream/route.ts` - SSE watching store/actions/ directory for changes
109
+ - `web/src/app/api/sly-actions/invalidate/route.ts` - POST cache invalidation for actions
74
110
  - `web/src/app/api/system-stats/route.ts` - CPU/memory metrics
75
111
  - `web/src/app/api/areas/route.ts` - Available areas list
76
112
  - `web/src/app/api/terminal-classes/route.ts` - Terminal class definitions
77
- - `web/src/app/api/claude-actions/route.ts` - Commands in ClaudeActionsConfig format
78
- - `web/src/app/api/toolkit/route.ts` - Scan all project assets, build matrix
79
- - `web/src/app/api/toolkit/sync/route.ts` - Batch deploy/remove assets
80
- - `web/src/app/api/toolkit/import/route.ts` - Import asset from project to workspace
113
+ - `web/src/app/api/sly-actions/config/route.ts` - Actions in SlyActionsConfig format
114
+ - `web/src/app/api/cli-assets/route.ts` - Scan project assets, build matrix using flat canonical store as master
115
+ - `web/src/app/api/cli-assets/import/route.ts` - Import asset from project into workspace (uses getRepoRoot(), not registry lookup)
116
+ - `web/src/app/api/cli-assets/sync/route.ts` - Batch deploy/remove assets from canonical store to project provider dirs (uses getRepoRoot())
117
+ - `web/src/app/api/cli-assets/store/route.ts` - Flat store CRUD (GET scan, POST import with skillMainOnly option, DELETE remove)
118
+ - `web/src/app/api/cli-assets/store/preview/route.ts` - Import preview: lists files in project skill directory before importing
119
+ - `web/src/app/api/cli-assets/updates/route.ts` - Update delivery for skills + actions (GET scan both, POST accept with type routing, DELETE dismiss with contentHash for actions)
120
+ - `web/src/app/api/cli-assets/fix/route.ts` - Generate compliance fix prompts for non-compliant frontmatter
121
+ - `web/src/app/api/cli-assets/assistant/route.ts` - Generate asset creation/modification prompts
81
122
  - `web/src/app/api/events/route.ts` - Query activity log with filters
82
123
  - `web/src/app/api/search/route.ts` - Cross-project card search
83
124
  - `web/src/app/api/projects/route.ts` - List/create projects
84
125
  - `web/src/app/api/projects/[id]/route.ts` - GET/PUT/DELETE individual project
85
- - `web/src/app/api/projects/analyze/route.ts` - Analyze directory before scaffolding
126
+ - `web/src/app/api/projects/analyze/route.ts` - Analyze directory before scaffolding (returns groups and detected providers)
127
+ - `web/src/app/api/projects/reorder/route.ts` - Persist project display order
128
+ - `web/src/app/api/version-check/route.ts` - npm version check for update toast
129
+ - `web/src/app/api/transcribe/route.ts` - POST audio upload → dual-backend STT. Checks `STT_BACKEND` env var (from process.env or parent .env). Local backend: writes temp file → ffmpeg WAV conversion → whisper-cli execution. OpenAI backend: Whisper API. Generic `loadEnv()` caches all env vars from parent .env.
130
+ - `web/src/app/api/settings/route.ts` - GET/PUT for data/settings.json (voice settings, keyboard shortcuts)
86
131
  - `web/src/app/api/providers/route.ts` - GET/PUT for providers.json (provider list + stage defaults)
87
132
  - `web/src/app/api/file/route.ts` - Read files from approved directories
88
133
  - `web/src/app/api/git-status/route.ts` - Git status for projects
134
+ - `web/src/app/api/dashboard/route.ts` - Dashboard data: loads registry, enriches with bridge session counts
89
135
 
90
136
  ## Key Functions
91
137
 
92
138
  - `ProjectKanban.handleDragEnd()` - Reorders cards, handles cross-column moves
139
+ - `ProjectKanban.handleCardContextMenu()` - Right-click context menu with stage/priority submenus, archive, delete
140
+ - `ProjectKanban.buildKanbanMenuGroups()` / `buildAutomationMenuGroups()` - Build context menu items per card type
93
141
  - `ConnectionManager.createManagedEventSource()` - Auto-reconnecting SSE with backoff
94
- - `getStartupCommands(commands, terminalClass, hasHistory)` - Filter commands for session start
95
- - `getActiveCommands(commands, terminalClass)` - Filter commands for running session toolbar
142
+ - `getActionsForClass(commands, classAssignments, terminalClass, options?)` - Single getter: class ordered IDs → filter by project/cardType
96
143
  - `scanProjectAssets()` - Scan commands/skills/agents across projects, build matrix
144
+ - `scanStoreAssets()` - Scan store directory for cross-provider asset variants
145
+ - `pushToTerminal()` - Dispatch prompt to global terminal via custom events
97
146
  - `calculateHealthScore()` - Score 0-100 based on configurable weighted factors
147
+ - `startScheduler()` / `stopScheduler()` - Automation scheduler lifecycle
148
+ - `triggerAutomation()` - Execute card automation: build prompt with run header, create/reuse bridge session. Fresh sessions: checkSessionAlive() after 20s (no retry, prompt delivered via CLI args). Resume sessions: waitForActivity() differential check + retry via bracketed paste if no activity. Accepts TriggerOptions (scheduled/manual). Returns KickoffResult with sessionName.
149
+ - `buildRunHeader()` - Formats === AUTOMATION RUN === block with timestamp, card info, trigger type, last run time
150
+ - `getConfiguredTimezone()` - Returns IANA timezone + abbreviation from TZ env var
151
+ - `loadParentEnv()` - Reads .env from workspace root (Next.js only loads from web/). Skips BRIDGE_URL/BRIDGE_PORT (port-dependent, differs dev vs prod) to avoid routing scheduler requests to wrong bridge.
152
+ - `next.config.ts` reads `DEV_HOSTNAME` from parent .env via inline `getParentEnv()` for `allowedDevOrigins` (Tailscale dev access). Dashboard footer shows slycode version fetched from `/api/version-check`.
153
+ - `cronToHumanReadable()` - Cron to human-readable text (shared utility in cron-utils.ts)
154
+ - `getNextRun()` - Calculate next cron run as Date (exported from scheduler.ts, server-side only). Used by GET /api/kanban (dynamic nextRun on all enabled recurring cards) and POST /api/scheduler `nextRun` action (on-demand for AutomationConfig UI). Client-side `getNextRunISO()` removed from cron-utils.ts — no croner dependency on client.
98
155
 
99
156
  ## CardModal Tabs
100
157
 
101
- - **Details** - Edit fields, dropdowns for stage/priority, editable areas/tags chips, delete button
158
+ - **Details** - Edit fields, dropdowns for stage/priority, editable areas/tags chips, delete button. Automation cards show "Description / Automation Instructions" label and AutomationConfig panel (with Run Now button) instead of problems section.
159
+ - **Notes** - Agent notes (AgentNote[]) with scroll shadows, add/delete/clear, purple accent. Empty state shows CLI hint.
102
160
  - **Design** - Shows if `design_ref` exists, renders markdown with copy path button
103
161
  - **Feature** - Shows if `feature_ref` exists, renders markdown
104
162
  - **Test** - Shows if `test_ref` exists, renders markdown
105
163
  - **Checklist** - Interactive checkboxes with progress bar (uses ref-based state for rapid clicks)
106
- - **Terminal** - AI session with provider selector, auto-connect, startupCommands/activeCommands
164
+ - **Terminal** - AI session with provider selector, auto-connect, single actions prop split by placement
107
165
 
108
166
  CardModal uses edit session protection: last-known-value tracking, 2000ms grace period for field editing, prevents overwriting active edits from external updates.
109
167
 
168
+ ### Voice-to-Text
169
+ Voice is a **global system** using React Context (`VoiceContext.tsx`). VoiceProvider wraps the app in layout.tsx. Components use `useVoice()` hook instead of managing voice locally. Voice claim system: components register as claimants (CardModal, GlobalClaudePanel) via `claimVoice()`/`releaseVoice()`. When no modal claims voice, FloatingVoiceWidget appears at bottom-right for global voice control. Records audio via browser MediaRecorder, sends to /api/transcribe (Whisper STT), inserts transcription at claimant's target. Focus targets: input/textarea fields (via execCommand('insertText') for undo support) or terminal (via sendInput). VoiceSettingsPopover (gear icon) configures shortcuts, auto-submit, max recording length. Settings persisted in data/settings.json via /api/settings. VoicePopoverPortal renders popovers via createPortal to escape CardModal stacking context.
170
+
171
+ ### Automation Cards
172
+ Cards with `card.automation` set get orange-themed header/tabs (instead of stage color). Automation toggle in card header enables/disables automation mode (disabled for archived cards). Archive toggle is disabled for automation cards ("Automation cards cannot be archived"). Automation cards are filtered from normal kanban columns and shown in AutomationsScreen instead.
173
+
110
174
  ## Health Scoring
111
175
 
112
176
  - **Factors**: outdated assets, stale cards, unresolved problems, missing CLAUDE.md, non-compliant frontmatter
@@ -114,14 +178,33 @@ CardModal uses edit session protection: last-known-value tracking, 2000ms grace
114
178
  - **Display**: HealthDot component with tooltip showing score breakdown
115
179
  - Located on ProjectCard in Dashboard
116
180
 
117
- ## Toolkit (Asset Management)
118
-
119
- - Scans commands/skills/agents across all projects
120
- - Frontmatter validation: name, version, updated, description required
121
- - Version comparison for detecting outdated assets
122
- - Matrix view: rows=assets, columns=projects, cells=status
123
- - Batch operations: deploy to / remove from projects
124
- - Import from project back to workspace
181
+ ## CLI Assets (Asset Management)
182
+
183
+ Three views: **Projects**, **Store**, and **Updates**.
184
+
185
+ ### Projects View
186
+ - Provider sub-tabs (Claude/Codex/Gemini) filter which provider's assets are shown
187
+ - Matrix view: rows=assets, columns=projects, cells=status (current/outdated/missing)
188
+ - Canonical store is master source of truth (store/skills/, store/agents/)
189
+ - Batch deploy/remove with pending changes bar
190
+ - "Not in Store" section for importing untracked project assets
191
+ - Fix action for non-compliant frontmatter (generates LLM prompt)
192
+ - Ignore/Unignore for assets that shouldn't be tracked
193
+
194
+ ### Store View
195
+ - Flat canonical layout: skills and agents listed from store/
196
+ - Delete, Fix, and Modify actions per asset
197
+ - New Asset button → AssetAssistant modal → terminal prompt
198
+ - Modify action on existing assets → pre-filled AssetAssistant
199
+
200
+ ### Updates View
201
+ - Scans updates/ folder against store/ for available updates
202
+ - Shows status per update: "new" (skill not in store) or "update" (newer version)
203
+ - Preview button opens SkillDiffViewer with side-by-side diff
204
+ - Accept: copies from updates/ → store/ with backup of old version
205
+ - Dismiss: records version in store/.ignored-updates.json (skipped on future scans)
206
+ - Post-accept: shows push-to-projects options
207
+ - 60s polling interval via usePolling hook
125
208
 
126
209
  ## Connection Management
127
210
 
@@ -132,29 +215,44 @@ CardModal uses edit session protection: last-known-value tracking, 2000ms grace
132
215
 
133
216
  ## Data Models
134
217
 
135
- - `KanbanCard` - id, title, description, type, priority, order, areas[], tags[], problems[], checklist[], archived?, design_ref?, feature_ref?, test_ref?, claude_session?
136
- - `Command` - label, description, group, cardTypes[], prompt, visibleIn, scope, sessionState
218
+ - `KanbanCard` - id, number?, title, description, type, priority, order, areas[], tags[], problems[], checklist[], archived?, design_ref?, feature_ref?, test_ref?, claude_session?, agentNotes?, automation?, last_modified_by?
219
+ - `AgentNote` - id (sequential int), agent? (Claude/Codex/Gemini/User), text, timestamp, summary? (bool), summarizedCount?, dateRange?
220
+ - `AutomationConfig` - enabled, schedule, scheduleType (recurring|one-shot), provider, freshSession, workingDirectory?, reportViaMessaging, lastRun?, lastResult?, nextRun? (no prompt field — card description is the execution prompt). Manual triggers now persist lastRun/lastResult via scheduler API route.
221
+ - `KickoffResult` - cardId, projectId, success, error?, sessionName?
222
+ - `SlyAction` - label, description, group, cardTypes[], placement, prompt, scope, projects[]
137
223
  - `BridgeStats` - bridgeTerminals, connectedClients, activelyWorking, sessions[]
138
224
  - `SystemStats` - cpu (0-100), memory {used, total}, swap {used, total}
139
- - `SessionActivity` - name, status, lastOutputAt, isActive
140
- - `AssetInfo` - name, type, version, updated, description, filePath, frontmatter
141
- - `AssetCell` - status (present|outdated|missing|extra), masterVersion?, projectVersion?
142
- - `ToolkitData` - rows (AssetRow[]), projects (string[])
225
+ - `SessionActivity` - name, status, lastOutputAt, isActive, activityStartedAt?, lastOutputSnippet?
226
+ - `ProviderId` - 'claude' | 'agents' | 'codex' | 'gemini'
227
+ - `AssetType` - 'skill' | 'agent' | 'mcp' (no 'command' — all commands converted to skills)
228
+ - `AssetInfo` - name, type, version, updated, description, filePath, frontmatter, isValid
229
+ - `AssetCell` - status (current|outdated|missing), masterVersion?, projectVersion?
230
+ - `CliAssetsData` - skills (AssetRow[]), agents (AssetRow[]), nonImported (AssetRow[])
231
+ - `StoreData` - skills[], agents[], mcp[] (StoreAssetInfo arrays, flat canonical layout)
232
+ - `UpdateEntry` - name, assetType, status (update|new), currentVersion?, availableVersion, description?, updatesPath, storePath, filesAffected[], skillMdOnly
233
+ - `UpdatesData` - entries[], totalAvailable
234
+ - `IgnoredUpdates` - Record<string, string> (key: "skills/{name}", value: ignored version)
235
+ - `ProviderAssetPaths` - commands, skills, agents, mcpConfig paths per provider
236
+ - `PendingChange` - action, asset, project, provider, source for batch operations
143
237
  - `HealthScore` - score (0-100), level (green|amber|red), factors[]
144
238
  - `ActivityEvent` - type, timestamp, project, detail, cardId?
145
- - `SearchResult` - card, project, matchedFields[]
146
- - `ProjectWithBacklog` - extends Project with assets, gitUncommitted, healthScore, platforms, lastActivity, activeSessions
147
- - `ProvidersData` - providers (Record<id, ProviderConfig>), defaults (stages, global, projects)
148
- - `ProviderConfig` - id, displayName, command, permissions, resume, prompt
239
+ - `SearchResult` - cardId, cardTitle, projectId, projectName, stage, matchField, snippet, isArchived?
240
+ - `ProjectWithBacklog` - extends Project with backlog, designs, features, accessible, assets?, gitUncommitted?, healthScore?, platforms?, lastActivity?, activeSessions?
241
+ - `DashboardData` - projects (ProjectWithBacklog[]), totalBacklogItems, activeItems, totalOutdatedAssets?, totalUncommitted?, lastRefresh, slycodeRoot, projectsDir
242
+ - `VoiceClaimant` - id, onRecordStart?, onTranscriptionComplete, onRelease?
243
+ - `VoiceState` - 'disabled' | 'idle' | 'recording' | 'paused' | 'transcribing' | 'error'
244
+ - `VoiceSettings` - autoSubmitTerminal, maxRecordingSeconds, shortcuts (VoiceShortcuts)
245
+ - `VoiceShortcuts` - startRecording, pauseResume, submit, submitPasteOnly, clear (configurable key combos)
246
+ - `AppSettings` - voice (VoiceSettings); persisted server-side in data/settings.json
149
247
 
150
248
  ## Design System — SlyCode Neon Theme
151
249
 
152
250
  ### Philosophy
153
- Neon-minimalist aesthetic. Clean surfaces with subtle texture for life and depth. Never sterile/flat, never over-the-top. The theme should feel like a premium tool — atmospheric but professional. Light mode is clean with color; dark mode is moody with glow.
251
+ Neon-minimalist aesthetic. Clean surfaces with subtle texture for life and depth. Never sterile/flat, never over-the-top. The theme should feel like a premium tool — atmospheric but professional. Light mode is clean with solid colors (no gradients or grain textures on headers); dark mode is moody with glow and gradient textures.
154
252
 
155
253
  ### Color Palette
156
254
  - **Neon Blue** (`--neon-blue: #00bfff`) — Primary accent, design/implementation lanes, links, active states
157
- - **Neon Orange** (`--neon-orange: #ff8c00`) — Global/project terminal headers, warnings
255
+ - **Neon Orange** (`--neon-orange: #ff8c00`) — Automation cards, warnings
158
256
  - **Red-Orange** (`#ff6a33`) — Testing lane (NOT standard orange, which looks brown in dark mode)
159
257
  - **Green** — Done lane, success states, running indicators
160
258
  - **Void** — Neutral grey scale for backgrounds, borders, muted text
@@ -163,12 +261,25 @@ Neon-minimalist aesthetic. Clean surfaces with subtle texture for life and depth
163
261
  ### Critical Color Lesson
164
262
  Dark-end scale colors (e.g. `neon-orange-950 = #2b1700`) are inherently brown. For vibrant dark mode colors, use the BRIGHT color at LOW OPACITY (e.g. `neon-orange-400/15`) instead of dark scale values.
165
263
 
264
+ ### Shadow Depth System (globals.css)
265
+ Three CSS custom property tiers, defined on `:root` (light) and `.dark` (dark), providing consistent elevation across all components:
266
+
267
+ - `--shadow-surface` — Flat elements (column wrappers, panels). Light: subtle outward shadow. Dark: inset highlight + deep outward shadow + faint border ring.
268
+ - `--shadow-card` — Elevated cards, active elements. Light: medium spread. Dark: inset highlight + heavy spread + neon-blue edge ring.
269
+ - `--shadow-overlay` — Modals, overlays. Light: deep multi-layer. Dark: extreme depth + inset highlight + neon-blue ring.
270
+
271
+ Usage: `shadow-(--shadow-card)` in Tailwind classes, or `var(--shadow-card)` in keyframe animations. All neon-pulse keyframes layer glow effects ON TOP of the appropriate shadow var (e.g., `box-shadow: var(--shadow-card), 0 0 8px 2px rgba(...)`) to preserve depth while glowing.
272
+
166
273
  ### Texture System (globals.css)
167
- Three-layer texture approach for gradient surfaces:
274
+ Three-layer texture approach for gradient surfaces, plus lane and automation-specific textures:
168
275
 
169
276
  1. **Fine grain** (`.grain`) — High-frequency SVG feTurbulence noise (`baseFrequency: 0.65`), overlay blend. Desaturate with `feColorMatrix type='saturate' values='0'` when color neutrality matters.
170
277
  2. **Perlin noise** (`.depth-glow`) — Low-frequency organic texture (`baseFrequency: 0.015` light, `0.012` dark), large 400px tiles. Light mode uses `screen` blend (lightens), dark mode uses `soft-light`. Masked with left-to-right gradient fade.
171
278
  3. **Terminal texture** (`.terminal-texture`) — CRT-like grain + vignette + lane-colored tint via `--terminal-tint` CSS variable. Box-shaped mask (edges visible, centre clear). Light: `soft-light` blend. Dark: `screen` blend (avoids warm/red cast from `soft-light` on dark backgrounds).
279
+ 4. **Lane texture** (`.lane-texture`) — 18px grid-line background (subtle crosshatch). Light: rgba(40,80,200,0.12) blue-tinted, dark: rgba(255,255,255,0.015). Applied to KanbanColumn card scroll areas via `colorClasses.texture`.
280
+ 5. **Light-clean suppression** (`.light-clean`) — Add to elements that use `.grain` and `.depth-glow` to suppress texture in light mode only. Hides `::after` (grain) and `::before` (depth-glow) via `display: none` in `:root:not(.dark)`. Used on column headers and global terminal header for clean light mode appearance.
281
+ 6. **Automation chevron** (`.automation-chevron`) — Right-pointing filled SVG chevron arrows (3 copies per 50px tile for seamless wrap), fading left-to-right via mask. Orange fill in light mode, white fill at 0.08 opacity in dark mode. `.automation-chevron-muted` drops to 0.02 opacity for disabled cards.
282
+ 7. **Hazard stripe** (`.hazard-stripe`) — Industrial diagonal amber/dark repeating stripe (8px bands at -45deg). Dark mode uses semi-transparent orange. `.hazard-stripe-muted` uses grey stripes at low opacity for disabled cards.
172
283
 
173
284
  ### Blend Mode Rules
174
285
  - `soft-light` on dark backgrounds produces warm/red cast — avoid for dark mode textures
@@ -183,11 +294,12 @@ Logos have opaque backgrounds (white for light, black for dark). Two `<img>` tag
183
294
  - Light: `mix-blend-multiply dark:hidden`
184
295
  - Dark: `mix-blend-lighten hidden dark:block`
185
296
  - All CSS drop-shadow/filter glow DISABLED (creates rectangular artifacts with blend modes). Logos have baked-in glow.
186
- - Files: `slycode_light.png` / `slycode.png` (hero), `slycode_logo_light.png` / `slycode_logo.png` (nav)
297
+ - Files: `slycode_light.webp` / `slycode.webp` (hero), `slycode_logo_light.webp` / `slycode_logo.webp` (nav)
298
+ - Favicon: `web/public/favicon.png` (64×64 rounded SlyCode logo, referenced via metadata in layout.tsx)
187
299
 
188
300
  ### Lane-Colored Theming
189
301
  Stage colors flow through multiple layers:
190
- - **KanbanColumn headers** — `colorClasses` map with header gradient, text, count badge, border
302
+ - **KanbanColumn headers** — `colorClasses` map (includes `texture` key for lane-texture): light mode uses flat bg colors (e.g., `bg-neon-blue-100/80`), dark mode uses gradients. Inset shadows on headers (color-matched per lane). Thicker bottom borders (`border-b-[3px]`). Header text has drop-shadow for legibility. Text colors: light mode uses `text-void-500/600`, dark mode uses lane colors. Light mode column wrappers: `bg-[#d8e1f0]` blue-tinted background with complex inset shadows (top/left white highlights, bottom/right blue shadows) and blue-tinted borders. Dark mode column wrappers use standard `shadow-(--shadow-surface)` variant.
191
303
  - **CardModal header/tabs** — `stageModalStyles` map with gradients, borders per stage. Uses transparency (85% → 50%) for subtle glass quality
192
304
  - **CardModal footer** — `stageTerminalColors` with colored top border
193
305
  - **Terminal tint** — `stageTerminalTint` map provides rgba color → passed as `tintColor` prop → sets `--terminal-tint` CSS variable on terminal overlay
@@ -196,10 +308,10 @@ Stage colors flow through multiple layers:
196
308
  Left-to-right, vibrant-to-soft. The left/start side is always the stronger color, fading lighter toward the right. Never center-out fades (looks artificial).
197
309
 
198
310
  ### Button Aesthetic — Neon Glass
199
- Terminal/action buttons use semi-transparent backgrounds with colored borders and hover glow:
311
+ Terminal/action buttons use neon-blue semi-transparent backgrounds with colored borders and hover glow:
200
312
  ```
201
- border border-{color}-400/40 bg-{color}-400/15 text-{color}-400
202
- hover:bg-{color}-400/25 hover:shadow-[0_0_12px_rgba(...,0.3)]
313
+ border border-neon-blue-400/40 bg-neon-blue-400/15 text-neon-blue-400
314
+ hover:bg-neon-blue-400/25 hover:shadow-[0_0_12px_rgba(0,191,255,0.3)]
203
315
  ```
204
316
 
205
317
  ### Health Monitor
@@ -216,37 +328,110 @@ Card modals get colored outer borders in dark mode (`dark:border dark:border-{co
216
328
 
217
329
  ## Patterns & Invariants
218
330
 
219
- - Cards auto-save on changes via `/api/kanban` PUT
331
+ - Cards auto-save on changes via `/api/kanban` POST with `changedCardIds` for surgical merge
332
+ - Surgical save: only changed cards sent in payload, server merges against disk state, preserves concurrent CLI/agent edits
220
333
  - Kanban data stored in `documentation/kanban.json` per project
221
334
  - Stage order: backlog → design → implementation → testing → done
222
- - Active glow: `active-glow-card` CSS class with pulse animation (2s activity threshold)
223
- - Commands use `startupCommands` (session start) and `activeCommands` (running toolbar)
335
+ - Active glow: `active-glow-card` CSS class with `neon-pulse-priority` animation uses `--glow-color` CSS var (from card's priority color, not hardcoded blue). Automation toggle button in header gets `active-glow-automation-btn` pulse when any automation card has an active session. All glow effects have light/dark mode variants.
336
+ - Commands use single `actions` prop split by placement (startup/toolbar/both) at the component level
224
337
  - SSE connections managed centrally via ConnectionManager for reconnection
225
- - Dynamic path resolution via paths.ts (no hardcoded paths)
338
+ - Dynamic path resolution via paths.ts: getSlycodeRoot() (SLYCODE_HOME → cwd, no legacy root env var fallback), getPackageDir() for package assets (scripts/, scaffold-templates/). All API routes use centralized path functions — no local getRepoRoot() helpers. CLI assets import/sync use registry.ts getRepoRoot() instead of looking up project by ID.
226
339
  - Cross-tab sync via BroadcastChannel API
227
340
  - Number keys 1-9 jump to projects, Escape closes modals
228
341
  - Event log capped at 500 entries, append-only
229
342
  - Session names include provider segment: `{projectId}:{provider}:card:{cardId}`
230
- - Provider selector shown on no-session screen, pre-filled from stage defaults
343
+ - Provider button group (not dropdown) on no-session screen, pre-filled from stage defaults
231
344
  - CardModal detects existing session's provider from session name for pre-selection
232
345
  - ProjectKanban/ProjectPageClient use regex patterns to match both new and legacy session names
346
+ - Terminal prompt events: pushToTerminal() → GlobalClaudePanel handler → auto-start or send input
347
+ - 300ms delay before Enter on multi-line pastes (bracket paste mode handling)
348
+ - Store is master source of truth for assets (not SlyCode's .claude/)
349
+ - Dashboard tabs: "Code Den" (projects) and "CLI Assets" (assets) with description subtitles
350
+ - Dashboard projects support drag-and-drop reordering with drop indicators, persisted via displayOrder field
351
+ - Right-click context menu on kanban cards: move stage, set priority, copy title/ID/description, archive, delete (with ConfirmDialog)
352
+ - Context menu uses portal rendering (z-51, submenus z-52) with viewport-aware positioning and lane-colored accent bars
353
+ - Z-index layers: BackdropModal z-50, ContextMenu z-51, Submenu z-52, ConfirmDialog z-60
354
+ - suppressAutoTerminal: context menu "Open details" sets flag to prevent CardModal from auto-switching to terminal tab
355
+ - onActiveAutomationsChange: ProjectKanban reports to ProjectView whether any automation cards have active sessions (drives header pulse indicator)
356
+ - Instruction file check: ClaudeTerminalPanel fetches `/check-instruction-file` on provider/cwd change, shows amber warning with opt-out checkbox if instruction file is missing but a sibling exists. `createInstructionFile` state passed to session creation.
357
+ - Resize broadcast: Terminal.tsx guards resize POST to visible tabs only (document.visibilityState), uses `suppressResizePost` flag to prevent echo loop when handling SSE resize events from other tabs. Skips resize post on reconnect.
358
+ - Image paste: Ctrl+V in terminal intercepted at keydown level (before xterm.js), checks clipboard.read() for images, falls back to text paste via sendInput
359
+ - Screenshot toast: uploading/done/error states with thumbnail preview, auto-dismiss after 2s, double-fire guard
360
+ - Voice recording: state machine (disabled → idle → recording → paused → transcribing), configurable shortcuts, max-length auto-pause
361
+ - Voice focus tracking: captures last-focused field (input/textarea/terminal) before recording starts, inserts transcription there
362
+ - Voice-aware click-outside: GlobalClaudePanel and SlyActionConfigModal prevent closing while voice is busy (recording/transcribing) to ensure transcription lands in the correct terminal
363
+ - SlyActionConfigModal Escape handling: when assistant terminal is expanded, Escape passes through to terminal (not intercepted by modal)
364
+ - Settings persisted server-side: data/settings.json via GET/PUT /api/settings (voice section with VoiceSettings)
365
+ - Automation safeguards: automation cards cannot be archived (CLI rejects + web disables toggle), archived cards cannot enable automation (web disables toggle). Mutual exclusion enforced in CardModal header toggles.
366
+ - Automation cards filtered from normal kanban columns, shown in AutomationsScreen
367
+ - AutomationsScreen: max-w-5xl centered, 2-col grid (was 3-col), cards have chevron texture background + hazard stripe bottom bar + orange left border accent. Countdown timers are large (text-2xl), show "idle" label when disabled. Collapsible tag groups via `<details open>`.
368
+ - Scheduler auto-starts via instrumentation.ts on Next.js boot, checks every 30s, timezone-aware (TZ env var). Scheduler state and timer stored on globalThis to survive HMR reloads (prevents duplicate setInterval instances causing multiple schedulers to fight over kanban.json writes). loadParentEnv() reads .env from workspace root at module load (Next.js only loads .env from web/). nextRun computed dynamically by GET /api/kanban (server-side single source of truth for timezone) — no longer recalculated in checkAutomations loop. Grace window: isDue() clamps lastRun to max 60s ago so stale automations don't fire immediately on re-enable; new automations (no lastRun) wait for their first cron tick.
369
+ - Fresh session path: prompt delivered via CLI args (OS-level guarantee), checkSessionAlive() after 20s confirms session didn't crash, no retry needed.
370
+ - Resume session path: prompt pasted via bracketed paste (unreliable delivery), waitForActivity() takes baseline+5s differential, retries via re-paste on failure.
371
+ - fetchWithTimeout(10s) wraps all bridge HTTP calls to prevent hung bridge from blocking activeKickoffs indefinitely.
372
+ - Soft failure notifications: only Telegram-notifies on hard failures (Session create failed, Session stopped, Input failed, No automation config). Detection uncertainty logged but not notified.
373
+ - Automation run header: rich context block (=== AUTOMATION RUN ===) with time, card, trigger type (scheduled/manual with cron description), last run + relative time
374
+ - AutomationsScreen shows timezone abbreviation badge in header
375
+ - AutomationConfig shows timezone abbreviation next to one-shot date picker
376
+ - Notes tab shows amber "Summary" badge for summary notes (with summarizedCount/dateRange tooltip)
377
+ - last_modified_by tracks source of card changes: 'web', 'cli', or 'agent'
378
+ - KanbanColumn uses flex-grow (min-w-72 max-w-96) + justify-center for wide viewport scaling
379
+ - KanbanCardItem visual polish: glassmorphism (bg-white/55 + backdrop-blur-lg, dark: bg-[#20232a]/55 + backdrop-blur-xl), top hairline border (border-t-white/50), priority-colored left border with inset glow on hover (uses `--glow-color` CSS var set inline from priorityIndicators map), `::before` pseudo-element for hover highlight stripe on left edge
380
+ - Card numbers: sequential `number` field on KanbanCard (zero-padded #0001 format), displayed top-right in JetBrains Mono. Backfilled by CLI on first write (ensureCardNumbers/backfillCardNumbers in kanban.js), tracked via kanban.nextCardNumber
381
+ - Session status dots: running/activelyWorking show green ping dot, detached/resumable show orange dot, no-session shows grey dot. Type color dots replaced by type emojis (bug/feature/chore)
382
+ - Done column compact mode: `isCompact` when stage='done' hides tags/areas section to reduce visual clutter
383
+ - ChecklistProgress: smaller SVG ring (13px, 1.5 stroke), completed state uses void-400/void-500 (not green), count text in JetBrains Mono 10px
384
+ - Skill import preview: ImportDialog in CliAssetsTab shows file listing for skill directories, defaults to SKILL.md-only import (avoids overwriting store references/). Full folder option available. Non-skill assets import directly (single file).
385
+ - Activity ring: uses `isActive` (not `status=running`) to prevent flash on reconnect. Global terminal sessions included in activity counts (not just card sessions).
386
+
387
+ ### Responsive Mobile Layout
388
+ - **Breakpoint strategy**: `sm:` (640px) is the mobile/desktop threshold. Mobile-first classes with `sm:` overrides for desktop.
389
+ - **CardModal**: fullscreen on mobile (`p-0 overflow-hidden h-full rounded-none`), windowed on desktop (`lg:p-4 lg:rounded-xl lg:h-auto lg:max-w-4xl`). Tabs scroll horizontally with `overflow-x-auto scrollbar-hide`. Smaller text/padding on mobile (`text-base sm:text-xl`, `p-3 sm:p-4`). Automation/Archive labels hidden on mobile (`hidden sm:inline`).
390
+ - **GlobalClaudePanel**: fullscreen on mobile when expanded (`inset-0 h-svh w-screen`), windowed on desktop (`sm:inset-auto sm:bottom-0 sm:right-4 sm:h-[500px] sm:w-[700px]`). Rounded corners removed on mobile when expanded.
391
+ - **HealthMonitor**: click-to-toggle (replaced hover-expand with 500ms delay). Click-outside dismiss. Mobile: compact status dot (worst-metric colored) + terminal count + activity ping. Desktop: full metric bars.
392
+ - **Terminal**: touch-to-scroll handler (manual `touchstart`/`touchmove`/`touchend` because xterm viewport is sibling not ancestor of canvas). Debounced resize (150ms timeout) prevents ResizeObserver feedback loop on mobile. Container has `touch-none` CSS.
393
+ - **ProjectHeader**: responsive layout — mobile hides project name/description, shows search icon button (opens full-width overlay), Actions button hidden on mobile (`hidden sm:flex`). All buttons use min-h/w-[44px] touch targets. Logo scales down on mobile (40px vs 52px).
394
+ - **KanbanColumn**: mobile snap-scroll columns (`min-w-[85vw] sm:min-w-72 max-w-[85vw] sm:max-w-96 snap-start`). Parent uses `snap-x snap-mandatory` for horizontal swiping.
395
+ - **globals.css**: `.scrollbar-hide` utility (hides scrollbars via `-ms-overflow-style: none`, `scrollbar-width: none`, `::-webkit-scrollbar display: none`)
233
396
 
234
397
  ## When to Expand
235
398
 
236
399
  - Editing card behavior → CardModal.tsx
237
400
  - Kanban drag/drop issues → ProjectKanban.tsx, KanbanColumn.tsx
401
+ - Context menu actions → ContextMenu.tsx, ProjectKanban.tsx (buildKanbanMenuGroups/buildAutomationMenuGroups)
402
+ - Confirmation dialogs → ConfirmDialog.tsx
238
403
  - Adding new card fields → types.ts, CardModal.tsx
239
- - Command configuration → CommandConfigModal.tsx, data/commands.json
404
+ - Command configuration → SlyActionConfigModal.tsx (Commands tab + Classes tab), data/sly-actions.json (v3 format)
240
405
  - Health monitoring → HealthMonitor.tsx, /api/system-stats
241
406
  - Connection issues → connection-manager.ts, ConnectionStatusIndicator.tsx
242
407
  - Terminal panel behavior → ClaudeTerminalPanel.tsx
243
408
  - Provider selection → ClaudeTerminalPanel.tsx, /api/providers, data/providers.json
244
409
  - Provider detection for existing sessions → CardModal.tsx (session name parsing)
245
- - Asset management → asset-scanner.ts, ToolkitTab.tsx, AssetMatrix.tsx
410
+ - Asset management → asset-scanner.ts, CliAssetsTab.tsx, AssetMatrix.tsx, StoreView.tsx
411
+ - Store management → store-scanner.ts, StoreView.tsx, /api/cli-assets/store
412
+ - Update delivery → asset-scanner.ts (scanUpdatesFolder), UpdatesView.tsx, SkillDiffViewer.tsx, /api/cli-assets/updates
413
+ - Asset assistant → AssetAssistant.tsx, /api/cli-assets/assistant
414
+ - Version updates → VersionUpdateToast.tsx, /api/version-check
415
+ - Project reordering → Dashboard.tsx (drag-drop), /api/projects/reorder, registry.ts
416
+ - Terminal prompt flow → terminal-events.ts, GlobalClaudePanel.tsx
417
+ - Provider paths → provider-paths.ts, mcp-common.ts
246
418
  - Health scoring → health-score.ts, HealthDot.tsx
247
419
  - Activity feed → event-log.ts, ActivityFeed.tsx
248
420
  - Project scaffolding → AddProjectModal.tsx, /api/projects
249
421
  - Search → SearchBar.tsx, /api/search
422
+ - Agent notes → CardModal.tsx (notes tab), types.ts (AgentNote)
423
+ - Automation config → AutomationConfig.tsx, CardModal.tsx (automation toggle + panel)
424
+ - Automations screen → AutomationsScreen.tsx, ProjectKanban.tsx (showAutomations), ProjectView.tsx
425
+ - Scheduler → scheduler.ts, instrumentation.ts, /api/scheduler
426
+ - Surgical save → /api/kanban route.ts (changedCardIds merge), ProjectKanban.tsx (saveStages)
250
427
  - Path resolution → paths.ts, kanban-paths.ts
251
428
  - Keyboard shortcuts → useKeyboardShortcuts.ts
429
+ - Voice input → VoiceContext.tsx (global state), VoiceControlBar.tsx, FloatingVoiceWidget.tsx, useVoiceRecorder.ts, useVoiceShortcuts.ts, CardModal.tsx (voice claim)
430
+ - Voice settings → VoiceSettingsPopover.tsx, useSettings.ts, /api/settings
431
+ - Image paste → Terminal.tsx (Ctrl+V interception), ClaudeTerminalPanel.tsx (handleImagePaste, screenshot toast)
432
+ - App settings → useSettings.ts, /api/settings, data/settings.json
252
433
  - Theme/design system → globals.css (texture classes), CardModal.tsx (stageModalStyles), KanbanColumn.tsx (colorClasses), GlobalClaudePanel.tsx (terminal header), Terminal.tsx (tintColor, terminal-texture)
434
+ - Responsive/mobile → CardModal.tsx (fullscreen), GlobalClaudePanel.tsx (fullscreen), HealthMonitor.tsx (click-toggle), Terminal.tsx (touch scroll), ProjectHeader.tsx (mobile search), KanbanColumn.tsx (snap-scroll)
435
+ - Skill import → CliAssetsTab.tsx (ImportDialog), /api/cli-assets/store/preview, /api/cli-assets/store (skillMainOnly)
436
+ - Instruction file warning → ClaudeTerminalPanel.tsx (instructionFileCheck state, createInstructionFile checkbox)
437
+ - Terminal resize sync → Terminal.tsx (sendResize visibility guard, suppressResizePost, SSE resize event)