@pennyfarthing/cyclist 10.2.0 → 10.3.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 (148) hide show
  1. package/LICENSE +14 -0
  2. package/dist/api/agent-load.js +1 -1
  3. package/dist/api/agent-load.js.map +1 -1
  4. package/dist/api/theme-agents.js +2 -2
  5. package/dist/api/theme-agents.js.map +1 -1
  6. package/dist/bikerack.d.ts +2 -0
  7. package/dist/bikerack.d.ts.map +1 -0
  8. package/dist/bikerack.js +43 -0
  9. package/dist/bikerack.js.map +1 -0
  10. package/dist/hooks/cyclist-pretooluse-hook.d.ts +60 -0
  11. package/dist/hooks/cyclist-pretooluse-hook.d.ts.map +1 -0
  12. package/dist/hooks/cyclist-pretooluse-hook.js +57 -0
  13. package/dist/hooks/cyclist-pretooluse-hook.js.map +1 -0
  14. package/dist/hooks/pretooluse-hook.d.ts +89 -0
  15. package/dist/hooks/pretooluse-hook.d.ts.map +1 -0
  16. package/dist/hooks/pretooluse-hook.js +235 -0
  17. package/dist/hooks/pretooluse-hook.js.map +1 -0
  18. package/dist/notification-sound.d.ts +59 -0
  19. package/dist/notification-sound.d.ts.map +1 -0
  20. package/dist/notification-sound.js +219 -0
  21. package/dist/notification-sound.js.map +1 -0
  22. package/dist/plugin-loader.test.d.ts +17 -0
  23. package/dist/plugin-loader.test.d.ts.map +1 -0
  24. package/dist/plugin-loader.test.js +407 -0
  25. package/dist/plugin-loader.test.js.map +1 -0
  26. package/dist/public/css/react.css +1 -1
  27. package/dist/public/js/react/react.js +32 -32
  28. package/dist/server.d.ts +1 -0
  29. package/dist/server.d.ts.map +1 -1
  30. package/dist/server.js +9 -0
  31. package/dist/server.js.map +1 -1
  32. package/dist/sprint-data.d.ts +21 -0
  33. package/dist/sprint-data.d.ts.map +1 -1
  34. package/dist/sprint-data.js +26 -1
  35. package/dist/sprint-data.js.map +1 -1
  36. package/dist/theme-metadata.js +1 -1
  37. package/dist/theme-metadata.js.map +1 -1
  38. package/dist/websocket.js +2 -2
  39. package/dist/websocket.js.map +1 -1
  40. package/package.json +32 -33
  41. package/portraits/a-team/large/face-44442.png +0 -0
  42. package/portraits/a-team/medium/face-44442.png +0 -0
  43. package/portraits/alice-in-wonderland/large/tweedles-44342.png +0 -0
  44. package/portraits/alice-in-wonderland/medium/tweedles-44342.png +0 -0
  45. package/portraits/battlestar-galactica/large/baltar-53343.png +0 -0
  46. package/portraits/battlestar-galactica/medium/baltar-53343.png +0 -0
  47. package/portraits/blade-runner/large/tyrell-54232.png +0 -0
  48. package/portraits/blade-runner/medium/tyrell-54232.png +0 -0
  49. package/portraits/catch-22/large/major-34253.png +0 -0
  50. package/portraits/catch-22/medium/major-34253.png +0 -0
  51. package/portraits/control/large/burt-44342.png +0 -0
  52. package/portraits/control/medium/burt-44342.png +0 -0
  53. package/portraits/cowboy-bebop/large/ed-54342.png +0 -0
  54. package/portraits/cowboy-bebop/medium/ed-54342.png +0 -0
  55. package/portraits/discworld/large/moist-44342.png +0 -0
  56. package/portraits/discworld/medium/moist-44342.png +0 -0
  57. package/portraits/doctor-who/large/sarah-jane-44342.png +0 -0
  58. package/portraits/doctor-who/medium/sarah-jane-44342.png +0 -0
  59. package/portraits/dune/large/thufir-44342.png +0 -0
  60. package/portraits/dune/medium/thufir-44342.png +0 -0
  61. package/portraits/fifth-element/large/cornelius-54343.png +0 -0
  62. package/portraits/fifth-element/large/diva-53453.png +0 -0
  63. package/portraits/fifth-element/large/korben-34232.png +0 -0
  64. package/portraits/fifth-element/large/leeloo-54333.png +0 -0
  65. package/portraits/fifth-element/large/lindberg-34432.png +0 -0
  66. package/portraits/fifth-element/large/lindberg-44342.png +0 -0
  67. package/portraits/fifth-element/large/mondoshawan-55131.png +0 -0
  68. package/portraits/fifth-element/large/munro-25321.png +0 -0
  69. package/portraits/fifth-element/large/pacoli-45232.png +0 -0
  70. package/portraits/fifth-element/large/ruby-53544.png +0 -0
  71. package/portraits/fifth-element/large/zorg-45312.png +0 -0
  72. package/portraits/fifth-element/medium/cornelius-54343.png +0 -0
  73. package/portraits/fifth-element/medium/diva-53453.png +0 -0
  74. package/portraits/fifth-element/medium/korben-34232.png +0 -0
  75. package/portraits/fifth-element/medium/leeloo-54333.png +0 -0
  76. package/portraits/fifth-element/medium/lindberg-34432.png +0 -0
  77. package/portraits/fifth-element/medium/lindberg-44342.png +0 -0
  78. package/portraits/fifth-element/medium/mondoshawan-55131.png +0 -0
  79. package/portraits/fifth-element/medium/munro-25321.png +0 -0
  80. package/portraits/fifth-element/medium/pacoli-45232.png +0 -0
  81. package/portraits/fifth-element/medium/ruby-53544.png +0 -0
  82. package/portraits/fifth-element/medium/zorg-45312.png +0 -0
  83. package/portraits/firefly/large/book-44342.png +0 -0
  84. package/portraits/firefly/medium/book-44342.png +0 -0
  85. package/portraits/game-of-thrones/large/varys-44342.png +0 -0
  86. package/portraits/game-of-thrones/medium/varys-44342.png +0 -0
  87. package/portraits/harry-potter/large/hermione-44342.png +0 -0
  88. package/portraits/harry-potter/medium/hermione-44342.png +0 -0
  89. package/portraits/hitchhikers-guide/large/trillian-44342.png +0 -0
  90. package/portraits/hitchhikers-guide/medium/trillian-44342.png +0 -0
  91. package/portraits/lord-of-the-rings/large/elrond-44342.png +0 -0
  92. package/portraits/lord-of-the-rings/medium/elrond-44342.png +0 -0
  93. package/portraits/mad-max/large/the-dag-44342.png +0 -0
  94. package/portraits/mad-max/medium/the-dag-44342.png +0 -0
  95. package/portraits/mash/large/hawkeye-52544.png +0 -0
  96. package/portraits/mash/large/klinger-33543.png +0 -0
  97. package/portraits/mash/large/margaret-34343.png +0 -0
  98. package/portraits/mash/large/margaret-45443.png +0 -0
  99. package/portraits/mash/large/mulcahy-34352.png +0 -0
  100. package/portraits/mash/large/potter-44443.png +0 -0
  101. package/portraits/mash/large/potter-45342.png +0 -0
  102. package/portraits/mash/large/radar-24342.png +0 -0
  103. package/portraits/mash/large/radar-35254.png +0 -0
  104. package/portraits/mash/large/radar-45242.png +0 -0
  105. package/portraits/mash/large/winchester-55322.png +0 -0
  106. package/portraits/mash/medium/hawkeye-52544.png +0 -0
  107. package/portraits/mash/medium/klinger-33543.png +0 -0
  108. package/portraits/mash/medium/margaret-34343.png +0 -0
  109. package/portraits/mash/medium/margaret-45443.png +0 -0
  110. package/portraits/mash/medium/mulcahy-34352.png +0 -0
  111. package/portraits/mash/medium/potter-44443.png +0 -0
  112. package/portraits/mash/medium/potter-45342.png +0 -0
  113. package/portraits/mash/medium/radar-24342.png +0 -0
  114. package/portraits/mash/medium/radar-35254.png +0 -0
  115. package/portraits/mash/medium/radar-45242.png +0 -0
  116. package/portraits/mash/medium/winchester-55322.png +0 -0
  117. package/portraits/princess-bride/large/vizzini-54342.png +0 -0
  118. package/portraits/princess-bride/medium/vizzini-54342.png +0 -0
  119. package/portraits/sandman/large/lucien-54342.png +0 -0
  120. package/portraits/sandman/medium/lucien-54342.png +0 -0
  121. package/portraits/star-trek-tng/large/troi-44352.png +0 -0
  122. package/portraits/star-trek-tng/medium/troi-44352.png +0 -0
  123. package/portraits/star-wars/large/mothma-44342.png +0 -0
  124. package/portraits/star-wars/medium/mothma-44342.png +0 -0
  125. package/portraits/the-expanse/large/avasarala-44342.png +0 -0
  126. package/portraits/the-expanse/medium/avasarala-44342.png +0 -0
  127. package/portraits/the-matrix/large/oracle-44342.png +0 -0
  128. package/portraits/the-matrix/medium/oracle-44342.png +0 -0
  129. package/portraits/watchmen/large/veidt-44342.png +0 -0
  130. package/portraits/watchmen/medium/veidt-44342.png +0 -0
  131. package/portraits/west-wing/large/c-j-44342.png +0 -0
  132. package/portraits/west-wing/medium/c-j-44342.png +0 -0
  133. package/portraits/x-files/large/gunmen-44342.png +0 -0
  134. package/portraits/x-files/medium/gunmen-44342.png +0 -0
  135. package/src/public/App.tsx +34 -0
  136. package/src/public/components/AgentPopup.tsx +1 -0
  137. package/src/public/components/BikeRackIndex.tsx +54 -0
  138. package/src/public/components/BikeRackWorkspace.tsx +142 -0
  139. package/src/public/components/DockviewWorkspace.tsx +5 -6
  140. package/src/public/components/MessageView.tsx +2 -1
  141. package/src/public/components/PersonaHeader.tsx +2 -0
  142. package/src/public/components/StandalonePanel.tsx +84 -0
  143. package/src/public/components/TandemPortrait.tsx +1 -0
  144. package/src/public/components/panel-registry.ts +11 -0
  145. package/src/public/styles/dockview-theme.css +1 -1
  146. package/src/public/types/electron.d.ts +18 -0
  147. package/src/public/utils/messageFilters.ts +1 -0
  148. package/src/public/utils/slash-commands.ts +4 -0
@@ -26,6 +26,7 @@ import {
26
26
  } from 'dockview-react';
27
27
  import 'dockview-react/dist/styles/dockview.css';
28
28
  import { ErrorBoundary } from './ErrorBoundary';
29
+ import { panelRegistry } from './panel-registry';
29
30
  import { useResponsiveLayout, MIN_DIMENSIONS, SIDEBAR_WIDTHS } from '../hooks/useResponsiveLayout';
30
31
  import '../styles/dockview-theme.css';
31
32
 
@@ -58,13 +59,11 @@ export type PanelId = typeof PANEL_INVENTORY[keyof typeof PANEL_INVENTORY];
58
59
  // Panel Component Registry
59
60
  // =============================================================================
60
61
 
61
- const panelComponents: Map<string, ComponentType> = new Map();
62
-
63
62
  /**
64
63
  * Register a panel component by ID
65
64
  */
66
65
  export function registerPanelComponent(id: string, component: ComponentType): void {
67
- panelComponents.set(id, component);
66
+ panelRegistry.set(id, component);
68
67
  }
69
68
 
70
69
  // =============================================================================
@@ -177,7 +176,7 @@ interface PanelAdapterParams {
177
176
  }
178
177
 
179
178
  export function PanelAdapter({ params }: IDockviewPanelProps<PanelAdapterParams>): React.ReactElement | null {
180
- const Component = panelComponents.get(params.panelId);
179
+ const Component = panelRegistry.get(params.panelId);
181
180
 
182
181
  if (!Component) {
183
182
  console.warn(`[DockviewWorkspace] No component registered for panel: ${params.panelId}`);
@@ -458,7 +457,7 @@ export function DockviewWorkspace({
458
457
  // Add remaining left sidebar panels to the same group
459
458
  for (let i = 1; i < LEFT_SIDEBAR_PANELS.length; i++) {
460
459
  const panelId = LEFT_SIDEBAR_PANELS[i];
461
- if (panelComponents.has(panelId)) {
460
+ if (panelRegistry.has(panelId)) {
462
461
  api.addPanel({
463
462
  id: panelId,
464
463
  component: 'PanelAdapter',
@@ -490,7 +489,7 @@ export function DockviewWorkspace({
490
489
  // Add remaining right sidebar panels to the same group
491
490
  for (let i = 1; i < RIGHT_SIDEBAR_PANELS.length; i++) {
492
491
  const panelId = RIGHT_SIDEBAR_PANELS[i];
493
- if (panelComponents.has(panelId)) {
492
+ if (panelRegistry.has(panelId)) {
494
493
  api.addPanel({
495
494
  id: panelId,
496
495
  component: 'PanelAdapter',
@@ -36,12 +36,13 @@ const AGENT_COLORS: Record<string, string> = {
36
36
  pm: '#a78bfa', sm: '#60a5fa', dev: '#4ade80', tea: '#2dd4bf',
37
37
  reviewer: '#f87171', architect: '#fb923c', devops: '#22d3ee',
38
38
  'ux-designer': '#f0abfc', 'tech-writer': '#e5e5e5', orchestrator: '#e879f9',
39
+ ba: '#a3e635',
39
40
  };
40
41
 
41
42
  const AGENT_ABBREV: Record<string, string> = {
42
43
  pm: 'PM', sm: 'SM', dev: 'DEV', tea: 'TEA', reviewer: 'REV',
43
44
  architect: 'ARC', devops: 'OPS', 'ux-designer': 'UX', 'tech-writer': 'TW',
44
- orchestrator: 'ORC',
45
+ orchestrator: 'ORC', ba: 'BA',
45
46
  };
46
47
 
47
48
  interface MessageViewProps {
@@ -35,6 +35,7 @@ const AGENT_COLORS: Record<string, string> = {
35
35
  'ux-designer': '#f0abfc', // Pink - design
36
36
  'tech-writer': '#e5e5e5', // White/light gray - documentation
37
37
  orchestrator: '#e879f9', // Magenta - coordination
38
+ ba: '#a3e635', // Lime - discovery
38
39
  };
39
40
 
40
41
  // Abbreviated role names for compact badge display
@@ -49,6 +50,7 @@ const AGENT_ABBREV: Record<string, string> = {
49
50
  'ux-designer': 'UX',
50
51
  'tech-writer': 'TW',
51
52
  orchestrator: 'ORC',
53
+ ba: 'BA',
52
54
  };
53
55
 
54
56
  // Convert kebab-case theme name to Title Case (e.g., "princess-bride" -> "Princess Bride")
@@ -0,0 +1,84 @@
1
+ /**
2
+ * StandalonePanel - Full-screen panel wrapper for BikeRack mode
3
+ *
4
+ * Story MSSCI-14821: StandalonePanel wrapper and ?panel=X client routing
5
+ * Epic: 101 (BikeRack Mode)
6
+ *
7
+ * Renders a single panel full-screen based on ?panel=X URL parameter.
8
+ * PANEL_REGISTRY is the single source of truth for routing (CE-2).
9
+ *
10
+ * Rules:
11
+ * - No dockview-react imports (Rule 7)
12
+ * - No BikeRack-specific props to panels (Rule 2)
13
+ * - URL-based detection only (Rule 10)
14
+ */
15
+
16
+ import React from 'react';
17
+ import {
18
+ EnhancedSprintPanel,
19
+ GitPanel,
20
+ DiffsPanel,
21
+ TodoPanel,
22
+ WorkflowPanel,
23
+ BackgroundPanel,
24
+ AuditLogPanel,
25
+ ChangedPanel,
26
+ ACPanel,
27
+ TTYPanel,
28
+ DebugPanel,
29
+ BikeLanePanel,
30
+ SettingsPanel,
31
+ } from './panels';
32
+
33
+ /**
34
+ * Registry mapping panel URL names to their components.
35
+ * Single source of truth for standalone panel routing (CE-2).
36
+ */
37
+ export const PANEL_REGISTRY: Record<string, React.ComponentType> = {
38
+ sprint: EnhancedSprintPanel,
39
+ git: GitPanel,
40
+ diffs: DiffsPanel,
41
+ todos: TodoPanel,
42
+ workflow: WorkflowPanel,
43
+ background: BackgroundPanel,
44
+ audit: AuditLogPanel,
45
+ changed: ChangedPanel,
46
+ ac: ACPanel,
47
+ tty: TTYPanel,
48
+ debug: DebugPanel,
49
+ bikelane: BikeLanePanel,
50
+ settings: SettingsPanel,
51
+ };
52
+
53
+ /**
54
+ * Detect standalone panel mode from URL parameters (Rule 10).
55
+ */
56
+ export function getStandalonePanelName(): string | null {
57
+ const params = new URLSearchParams(window.location.search);
58
+ return params.get('panel');
59
+ }
60
+
61
+ /**
62
+ * StandalonePanel wrapper - renders a single panel full-screen.
63
+ */
64
+ export function StandalonePanel(): React.ReactElement {
65
+ const panelName = getStandalonePanelName();
66
+ const PanelComponent = panelName ? PANEL_REGISTRY[panelName] : null;
67
+
68
+ if (!PanelComponent) {
69
+ return (
70
+ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100vh', width: '100vw', backgroundColor: 'var(--bg-primary, #1a1a2e)', color: 'var(--text-primary, #e4e4e7)' }}>
71
+ <h1>Panel not found</h1>
72
+ <p>
73
+ <a href="/bikerack" style={{ color: 'var(--accent, #818cf8)' }}>Back to BikeRack</a>
74
+ </p>
75
+ </div>
76
+ );
77
+ }
78
+
79
+ return (
80
+ <div style={{ height: '100vh', width: '100vw', overflow: 'auto', backgroundColor: 'var(--bg-primary, #1a1a2e)', color: 'var(--text-primary, #e4e4e7)' }}>
81
+ <PanelComponent />
82
+ </div>
83
+ );
84
+ }
@@ -28,6 +28,7 @@ const AGENT_ABBREV: Record<string, string> = {
28
28
  'ux-designer': 'UX',
29
29
  'tech-writer': 'TW',
30
30
  orchestrator: 'ORC',
31
+ ba: 'BA',
31
32
  };
32
33
 
33
34
  export default function TandemPortrait({
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared panel component registry
3
+ *
4
+ * Used by both DockviewWorkspace and BikeRackWorkspace to look up
5
+ * registered panel components by ID. Extracted to avoid importing
6
+ * DockviewWorkspace (which has shadcn/ui deps) from BikeRackWorkspace.
7
+ */
8
+
9
+ import type { ComponentType } from 'react';
10
+
11
+ export const panelRegistry: Map<string, ComponentType> = new Map();
@@ -104,7 +104,7 @@
104
104
  ============================================================================= */
105
105
 
106
106
  .cyclist-dockview .dv-resize-container .dv-sash {
107
- background-color: transparent;
107
+ background-color: var(--border-bright, #3f3f46);
108
108
  transition: background-color 0.15s ease;
109
109
  }
110
110
 
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Global type declarations for window.electronAPI
3
+ *
4
+ * Story MSSCI-12717 - React Migration
5
+ *
6
+ * This file provides TypeScript type definitions for the Electron API
7
+ * exposed via preload.ts to the renderer process.
8
+ */
9
+
10
+ import type { ElectronAPI } from '../../preload';
11
+
12
+ declare global {
13
+ interface Window {
14
+ electronAPI?: ElectronAPI;
15
+ }
16
+ }
17
+
18
+ export {};
@@ -48,6 +48,7 @@ const AGENT_LABELS: Record<string, string> = {
48
48
  'ux-designer': 'UX Designer',
49
49
  devops: 'DevOps',
50
50
  orchestrator: 'Orchestrator',
51
+ ba: 'Business Analyst',
51
52
  };
52
53
 
53
54
  /**
@@ -36,6 +36,10 @@ export const SLASH_COMMANDS: SlashCommand[] = [
36
36
  "name": "/architect",
37
37
  "description": "System Architect - Technical design and architecture"
38
38
  },
39
+ {
40
+ "name": "/ba",
41
+ "description": "Business Analyst - Requirements discovery and stakeholder analysis"
42
+ },
39
43
  {
40
44
  "name": "/brainstorming",
41
45
  "description": "Structured problem-solving brainstorm session"