@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.
- package/LICENSE +14 -0
- package/dist/api/agent-load.js +1 -1
- package/dist/api/agent-load.js.map +1 -1
- package/dist/api/theme-agents.js +2 -2
- package/dist/api/theme-agents.js.map +1 -1
- package/dist/bikerack.d.ts +2 -0
- package/dist/bikerack.d.ts.map +1 -0
- package/dist/bikerack.js +43 -0
- package/dist/bikerack.js.map +1 -0
- package/dist/hooks/cyclist-pretooluse-hook.d.ts +60 -0
- package/dist/hooks/cyclist-pretooluse-hook.d.ts.map +1 -0
- package/dist/hooks/cyclist-pretooluse-hook.js +57 -0
- package/dist/hooks/cyclist-pretooluse-hook.js.map +1 -0
- package/dist/hooks/pretooluse-hook.d.ts +89 -0
- package/dist/hooks/pretooluse-hook.d.ts.map +1 -0
- package/dist/hooks/pretooluse-hook.js +235 -0
- package/dist/hooks/pretooluse-hook.js.map +1 -0
- package/dist/notification-sound.d.ts +59 -0
- package/dist/notification-sound.d.ts.map +1 -0
- package/dist/notification-sound.js +219 -0
- package/dist/notification-sound.js.map +1 -0
- package/dist/plugin-loader.test.d.ts +17 -0
- package/dist/plugin-loader.test.d.ts.map +1 -0
- package/dist/plugin-loader.test.js +407 -0
- package/dist/plugin-loader.test.js.map +1 -0
- package/dist/public/css/react.css +1 -1
- package/dist/public/js/react/react.js +32 -32
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/sprint-data.d.ts +21 -0
- package/dist/sprint-data.d.ts.map +1 -1
- package/dist/sprint-data.js +26 -1
- package/dist/sprint-data.js.map +1 -1
- package/dist/theme-metadata.js +1 -1
- package/dist/theme-metadata.js.map +1 -1
- package/dist/websocket.js +2 -2
- package/dist/websocket.js.map +1 -1
- package/package.json +32 -33
- package/portraits/a-team/large/face-44442.png +0 -0
- package/portraits/a-team/medium/face-44442.png +0 -0
- package/portraits/alice-in-wonderland/large/tweedles-44342.png +0 -0
- package/portraits/alice-in-wonderland/medium/tweedles-44342.png +0 -0
- package/portraits/battlestar-galactica/large/baltar-53343.png +0 -0
- package/portraits/battlestar-galactica/medium/baltar-53343.png +0 -0
- package/portraits/blade-runner/large/tyrell-54232.png +0 -0
- package/portraits/blade-runner/medium/tyrell-54232.png +0 -0
- package/portraits/catch-22/large/major-34253.png +0 -0
- package/portraits/catch-22/medium/major-34253.png +0 -0
- package/portraits/control/large/burt-44342.png +0 -0
- package/portraits/control/medium/burt-44342.png +0 -0
- package/portraits/cowboy-bebop/large/ed-54342.png +0 -0
- package/portraits/cowboy-bebop/medium/ed-54342.png +0 -0
- package/portraits/discworld/large/moist-44342.png +0 -0
- package/portraits/discworld/medium/moist-44342.png +0 -0
- package/portraits/doctor-who/large/sarah-jane-44342.png +0 -0
- package/portraits/doctor-who/medium/sarah-jane-44342.png +0 -0
- package/portraits/dune/large/thufir-44342.png +0 -0
- package/portraits/dune/medium/thufir-44342.png +0 -0
- package/portraits/fifth-element/large/cornelius-54343.png +0 -0
- package/portraits/fifth-element/large/diva-53453.png +0 -0
- package/portraits/fifth-element/large/korben-34232.png +0 -0
- package/portraits/fifth-element/large/leeloo-54333.png +0 -0
- package/portraits/fifth-element/large/lindberg-34432.png +0 -0
- package/portraits/fifth-element/large/lindberg-44342.png +0 -0
- package/portraits/fifth-element/large/mondoshawan-55131.png +0 -0
- package/portraits/fifth-element/large/munro-25321.png +0 -0
- package/portraits/fifth-element/large/pacoli-45232.png +0 -0
- package/portraits/fifth-element/large/ruby-53544.png +0 -0
- package/portraits/fifth-element/large/zorg-45312.png +0 -0
- package/portraits/fifth-element/medium/cornelius-54343.png +0 -0
- package/portraits/fifth-element/medium/diva-53453.png +0 -0
- package/portraits/fifth-element/medium/korben-34232.png +0 -0
- package/portraits/fifth-element/medium/leeloo-54333.png +0 -0
- package/portraits/fifth-element/medium/lindberg-34432.png +0 -0
- package/portraits/fifth-element/medium/lindberg-44342.png +0 -0
- package/portraits/fifth-element/medium/mondoshawan-55131.png +0 -0
- package/portraits/fifth-element/medium/munro-25321.png +0 -0
- package/portraits/fifth-element/medium/pacoli-45232.png +0 -0
- package/portraits/fifth-element/medium/ruby-53544.png +0 -0
- package/portraits/fifth-element/medium/zorg-45312.png +0 -0
- package/portraits/firefly/large/book-44342.png +0 -0
- package/portraits/firefly/medium/book-44342.png +0 -0
- package/portraits/game-of-thrones/large/varys-44342.png +0 -0
- package/portraits/game-of-thrones/medium/varys-44342.png +0 -0
- package/portraits/harry-potter/large/hermione-44342.png +0 -0
- package/portraits/harry-potter/medium/hermione-44342.png +0 -0
- package/portraits/hitchhikers-guide/large/trillian-44342.png +0 -0
- package/portraits/hitchhikers-guide/medium/trillian-44342.png +0 -0
- package/portraits/lord-of-the-rings/large/elrond-44342.png +0 -0
- package/portraits/lord-of-the-rings/medium/elrond-44342.png +0 -0
- package/portraits/mad-max/large/the-dag-44342.png +0 -0
- package/portraits/mad-max/medium/the-dag-44342.png +0 -0
- package/portraits/mash/large/hawkeye-52544.png +0 -0
- package/portraits/mash/large/klinger-33543.png +0 -0
- package/portraits/mash/large/margaret-34343.png +0 -0
- package/portraits/mash/large/margaret-45443.png +0 -0
- package/portraits/mash/large/mulcahy-34352.png +0 -0
- package/portraits/mash/large/potter-44443.png +0 -0
- package/portraits/mash/large/potter-45342.png +0 -0
- package/portraits/mash/large/radar-24342.png +0 -0
- package/portraits/mash/large/radar-35254.png +0 -0
- package/portraits/mash/large/radar-45242.png +0 -0
- package/portraits/mash/large/winchester-55322.png +0 -0
- package/portraits/mash/medium/hawkeye-52544.png +0 -0
- package/portraits/mash/medium/klinger-33543.png +0 -0
- package/portraits/mash/medium/margaret-34343.png +0 -0
- package/portraits/mash/medium/margaret-45443.png +0 -0
- package/portraits/mash/medium/mulcahy-34352.png +0 -0
- package/portraits/mash/medium/potter-44443.png +0 -0
- package/portraits/mash/medium/potter-45342.png +0 -0
- package/portraits/mash/medium/radar-24342.png +0 -0
- package/portraits/mash/medium/radar-35254.png +0 -0
- package/portraits/mash/medium/radar-45242.png +0 -0
- package/portraits/mash/medium/winchester-55322.png +0 -0
- package/portraits/princess-bride/large/vizzini-54342.png +0 -0
- package/portraits/princess-bride/medium/vizzini-54342.png +0 -0
- package/portraits/sandman/large/lucien-54342.png +0 -0
- package/portraits/sandman/medium/lucien-54342.png +0 -0
- package/portraits/star-trek-tng/large/troi-44352.png +0 -0
- package/portraits/star-trek-tng/medium/troi-44352.png +0 -0
- package/portraits/star-wars/large/mothma-44342.png +0 -0
- package/portraits/star-wars/medium/mothma-44342.png +0 -0
- package/portraits/the-expanse/large/avasarala-44342.png +0 -0
- package/portraits/the-expanse/medium/avasarala-44342.png +0 -0
- package/portraits/the-matrix/large/oracle-44342.png +0 -0
- package/portraits/the-matrix/medium/oracle-44342.png +0 -0
- package/portraits/watchmen/large/veidt-44342.png +0 -0
- package/portraits/watchmen/medium/veidt-44342.png +0 -0
- package/portraits/west-wing/large/c-j-44342.png +0 -0
- package/portraits/west-wing/medium/c-j-44342.png +0 -0
- package/portraits/x-files/large/gunmen-44342.png +0 -0
- package/portraits/x-files/medium/gunmen-44342.png +0 -0
- package/src/public/App.tsx +34 -0
- package/src/public/components/AgentPopup.tsx +1 -0
- package/src/public/components/BikeRackIndex.tsx +54 -0
- package/src/public/components/BikeRackWorkspace.tsx +142 -0
- package/src/public/components/DockviewWorkspace.tsx +5 -6
- package/src/public/components/MessageView.tsx +2 -1
- package/src/public/components/PersonaHeader.tsx +2 -0
- package/src/public/components/StandalonePanel.tsx +84 -0
- package/src/public/components/TandemPortrait.tsx +1 -0
- package/src/public/components/panel-registry.ts +11 -0
- package/src/public/styles/dockview-theme.css +1 -1
- package/src/public/types/electron.d.ts +18 -0
- package/src/public/utils/messageFilters.ts +1 -0
- 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
|
-
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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
|
+
}
|
|
@@ -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:
|
|
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 {};
|
|
@@ -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"
|