@industry-theme/alexandria-panels 0.1.0

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.
@@ -0,0 +1,51 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { LocalProjectsPanel } from './index';
3
+ import { LocalProjectCard } from './LocalProjectCard';
4
+ import { RepositoryAvatar } from './RepositoryAvatar';
5
+ /**
6
+ * LocalProjectsPanel - Browse and manage local Alexandria repositories
7
+ *
8
+ * This panel displays a list of locally registered repositories with:
9
+ * - Search/filter functionality
10
+ * - Add new project capability
11
+ * - Open/focus project actions
12
+ * - Remove project from registry
13
+ */
14
+ declare const meta: Meta<typeof LocalProjectsPanel>;
15
+ export default meta;
16
+ type Story = StoryObj<typeof LocalProjectsPanel>;
17
+ /**
18
+ * Default state with mock repositories
19
+ */
20
+ export declare const Default: Story;
21
+ /**
22
+ * Empty state - no repositories registered
23
+ */
24
+ export declare const Empty: Story;
25
+ /**
26
+ * Loading state
27
+ */
28
+ export declare const Loading: Story;
29
+ /**
30
+ * Without add button (no selectDirectory action)
31
+ */
32
+ export declare const ReadOnly: Story;
33
+ /**
34
+ * LocalProjectCard component stories
35
+ */
36
+ export declare const CardDefault: StoryObj<typeof LocalProjectCard>;
37
+ export declare const CardSelected: StoryObj<typeof LocalProjectCard>;
38
+ export declare const CardWindowOpen: StoryObj<typeof LocalProjectCard>;
39
+ export declare const CardWindowOpening: StoryObj<typeof LocalProjectCard>;
40
+ export declare const CardMinimalMode: StoryObj<typeof LocalProjectCard>;
41
+ export declare const CardAddToWorkspaceMode: StoryObj<typeof LocalProjectCard>;
42
+ export declare const CardLocalOnly: StoryObj<typeof LocalProjectCard>;
43
+ export declare const CardCompact: StoryObj<typeof LocalProjectCard>;
44
+ export declare const CardCompactList: StoryObj<typeof LocalProjectCard>;
45
+ /**
46
+ * RepositoryAvatar component stories
47
+ */
48
+ export declare const AvatarWithOwner: StoryObj<typeof RepositoryAvatar>;
49
+ export declare const AvatarSizes: StoryObj<typeof RepositoryAvatar>;
50
+ export declare const AvatarFallback: StoryObj<typeof RepositoryAvatar>;
51
+ //# sourceMappingURL=LocalProjectsPanel.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalProjectsPanel.stories.d.ts","sourceRoot":"","sources":["../../../src/panels/LocalProjectsPanel/LocalProjectsPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD;;;;;;;;GAQG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAiCzC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,KAsBnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAsBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAWtB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAazD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAc1D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAc5D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAc/D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAa7D,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAapE,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAa3D,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAczD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAgB7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAU7D,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAWzD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,gBAAgB,CAe5D,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { RepositoryAvatarProps } from './types';
3
+ /**
4
+ * RepositoryAvatar - Displays repository owner avatar
5
+ *
6
+ * Priority:
7
+ * 1. customAvatarUrl prop
8
+ * 2. GitHub avatar from owner username
9
+ * 3. Fallback icon or initial
10
+ */
11
+ export declare const RepositoryAvatar: React.FC<RepositoryAvatarProps>;
12
+ //# sourceMappingURL=RepositoryAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepositoryAvatar.d.ts","sourceRoot":"","sources":["../../../src/panels/LocalProjectsPanel/RepositoryAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAyD5D,CAAC"}
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import './LocalProjectsPanel.css';
3
+ import type { PanelComponentProps } from '../../types';
4
+ /**
5
+ * LocalProjectsPanel - Browse and manage local Alexandria repositories
6
+ *
7
+ * Features:
8
+ * - List all registered local repositories
9
+ * - Search/filter by name, owner, or path
10
+ * - Add new projects via directory picker
11
+ * - Open projects in dev workspace
12
+ * - Remove projects from registry
13
+ *
14
+ * Data Slices:
15
+ * - alexandriaRepositories: List of AlexandriaEntry objects
16
+ *
17
+ * Events Emitted:
18
+ * - industry-theme.local-projects:repository-selected
19
+ * - industry-theme.local-projects:repository-opened
20
+ *
21
+ * Events Listened:
22
+ * - industry-theme.local-projects:filter
23
+ * - industry-theme.local-projects:select-repository
24
+ * - industry-theme.local-projects:open-repository
25
+ */
26
+ export declare const LocalProjectsPanel: React.FC<PanelComponentProps>;
27
+ /**
28
+ * LocalProjectsPanelPreview - Compact preview for panel tabs/thumbnails
29
+ */
30
+ export declare const LocalProjectsPanelPreview: React.FC;
31
+ export type { LocalProjectCardProps, RepositoryAvatarProps } from './types';
32
+ export { LocalProjectCard } from './LocalProjectCard';
33
+ export { RepositoryAvatar } from './RepositoryAvatar';
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/panels/LocalProjectsPanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAGzE,OAAO,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAoXvD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAM5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EA6C7C,CAAC;AAGF,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * UTCP Tools for LocalProjectsPanel
3
+ *
4
+ * These tools allow AI agents to interact with the Local Projects panel
5
+ * through the Universal Tool Communication Protocol.
6
+ */
7
+ import type { PanelTool, PanelToolsMetadata } from '../../types';
8
+ /**
9
+ * Filter projects tool
10
+ * Allows filtering the project list by search term
11
+ */
12
+ export declare const filterProjectsTool: PanelTool;
13
+ /**
14
+ * Select project tool
15
+ * Allows selecting a specific project in the list
16
+ */
17
+ export declare const selectProjectTool: PanelTool;
18
+ /**
19
+ * Open project tool
20
+ * Allows opening a project in the dev workspace
21
+ */
22
+ export declare const openProjectTool: PanelTool;
23
+ /**
24
+ * All tools for the LocalProjectsPanel
25
+ */
26
+ export declare const localProjectsPanelTools: PanelTool[];
27
+ /**
28
+ * Tools metadata for registration
29
+ */
30
+ export declare const localProjectsPanelToolsMetadata: PanelToolsMetadata;
31
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/panels/LocalProjectsPanel/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAyBhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAyB/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAyB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,EAI9C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,EAAE,kBAK7C,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * LocalProjectsPanel Type Definitions
3
+ *
4
+ * Types for the Local Projects panel, extending core-library types
5
+ */
6
+ import type { AlexandriaEntry } from '@principal-ai/alexandria-core-library/types';
7
+ import type { PanelActions } from '../../types';
8
+ /**
9
+ * Data slice for Alexandria repositories
10
+ * Provided by the host application through panel context
11
+ */
12
+ export interface AlexandriaRepositoriesSlice {
13
+ /** List of registered local repositories */
14
+ repositories: AlexandriaEntry[];
15
+ /** Whether repositories are currently loading */
16
+ loading: boolean;
17
+ /** Error message if loading failed */
18
+ error?: string;
19
+ }
20
+ /**
21
+ * Window state for a repository
22
+ */
23
+ export type RepositoryWindowState = 'closed' | 'opening' | 'ready';
24
+ /**
25
+ * Extended actions for LocalProjectsPanel
26
+ * These are provided by the host application
27
+ */
28
+ export interface LocalProjectsPanelActions extends PanelActions {
29
+ /**
30
+ * Open a directory picker dialog
31
+ * @returns Selected directory info or null if cancelled
32
+ */
33
+ selectDirectory?: () => Promise<{
34
+ path: string;
35
+ name: string;
36
+ } | null>;
37
+ /**
38
+ * Register a new repository in Alexandria
39
+ * @param name - Repository name
40
+ * @param path - Local path to the repository
41
+ */
42
+ registerRepository?: (name: string, path: string) => Promise<void>;
43
+ /**
44
+ * Remove a repository from Alexandria
45
+ * @param name - Repository name
46
+ * @param deleteLocal - Whether to delete local files
47
+ */
48
+ removeRepository?: (name: string, deleteLocal: boolean) => Promise<void>;
49
+ /**
50
+ * Open a repository in dev workspace
51
+ * @param entry - Alexandria entry to open
52
+ */
53
+ openRepository?: (entry: AlexandriaEntry) => Promise<void>;
54
+ /**
55
+ * Focus an already-open repository window
56
+ * @param entry - Alexandria entry to focus
57
+ */
58
+ focusRepository?: (entry: AlexandriaEntry) => Promise<void>;
59
+ /**
60
+ * Check if a repository window is open
61
+ * @param entry - Alexandria entry to check
62
+ * @returns Window state
63
+ */
64
+ getRepositoryWindowState?: (entry: AlexandriaEntry) => Promise<RepositoryWindowState>;
65
+ }
66
+ /**
67
+ * Action mode for LocalProjectCard
68
+ * Controls which action buttons are displayed
69
+ */
70
+ export type CardActionMode = 'default' | 'add-to-workspace' | 'minimal';
71
+ /**
72
+ * Props for LocalProjectCard component
73
+ */
74
+ export interface LocalProjectCardProps {
75
+ /** Alexandria entry data */
76
+ entry: AlexandriaEntry;
77
+ /** Action mode controls which buttons are shown */
78
+ actionMode?: CardActionMode;
79
+ /** Whether this card is currently selected */
80
+ isSelected?: boolean;
81
+ /** Callback when card is clicked/selected */
82
+ onSelect?: (entry: AlexandriaEntry) => void;
83
+ /** Callback when open button is clicked */
84
+ onOpen?: (entry: AlexandriaEntry) => void;
85
+ /** Callback when remove button is clicked */
86
+ onRemove?: (entry: AlexandriaEntry) => void;
87
+ /** Callback for add-to-workspace action */
88
+ onAddToWorkspace?: (entry: AlexandriaEntry) => void;
89
+ /** Whether an operation is in progress */
90
+ isLoading?: boolean;
91
+ /** Current window state for this repository */
92
+ windowState?: RepositoryWindowState;
93
+ /** Compact mode - hides path/info, stacks buttons under name */
94
+ compact?: boolean;
95
+ }
96
+ /**
97
+ * Props for RepositoryAvatar component
98
+ */
99
+ export interface RepositoryAvatarProps {
100
+ /** GitHub owner username for avatar URL */
101
+ owner?: string;
102
+ /** Custom avatar URL (takes precedence over owner) */
103
+ customAvatarUrl?: string | null;
104
+ /** Avatar size in pixels */
105
+ size?: number;
106
+ /** Fallback content when no avatar available */
107
+ fallbackIcon?: React.ReactNode;
108
+ }
109
+ /**
110
+ * Event payloads for LocalProjectsPanel
111
+ */
112
+ export interface LocalProjectsPanelEventPayloads {
113
+ /** Filter projects event */
114
+ 'filter': {
115
+ filter: string;
116
+ };
117
+ /** Select project event */
118
+ 'select-repository': {
119
+ identifier: string;
120
+ };
121
+ /** Open project event */
122
+ 'open-repository': {
123
+ identifier: string;
124
+ };
125
+ /** Repository selected notification */
126
+ 'repository-selected': {
127
+ entry: AlexandriaEntry;
128
+ };
129
+ /** Repository opened notification */
130
+ 'repository-opened': {
131
+ entry: AlexandriaEntry;
132
+ };
133
+ }
134
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/panels/LocalProjectsPanel/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /* Container query for responsive LocalProjectCard */
2
+ .local-projects-panel {
3
+ container-type: inline-size;
4
+ container-name: local-projects;
5
+ height: 100%;
6
+ }
7
+
8
+ .local-project-card {
9
+ display: flex;
10
+ flex-direction: row;
11
+ align-items: center;
12
+ gap: 12px;
13
+ }
14
+
15
+ .local-project-card__content {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 12px;
19
+ flex: 1;
20
+ min-width: 0;
21
+ }
22
+
23
+ .local-project-card__info {
24
+ flex: 1;
25
+ min-width: 0;
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: 2px;
29
+ }
30
+
31
+ .local-project-card__path,
32
+ .local-project-card__meta {
33
+ display: flex;
34
+ }
35
+
36
+ .local-project-card__actions {
37
+ display: flex;
38
+ gap: 4px;
39
+ flex-shrink: 0;
40
+ align-items: center;
41
+ }
42
+
43
+ .local-project-card__actions--stacked {
44
+ display: none;
45
+ }
46
+
47
+ /* Compact mode when container is 400px or less */
48
+ @container local-projects (max-width: 400px) {
49
+ .local-projects-panel {
50
+ padding: 8px !important;
51
+ gap: 8px !important;
52
+ }
53
+
54
+ .local-projects-list {
55
+ gap: 12px !important;
56
+ }
57
+
58
+ .local-project-card {
59
+ flex-direction: column;
60
+ align-items: stretch;
61
+ gap: 6px;
62
+ padding: 0 !important;
63
+ }
64
+
65
+ .local-project-card__content {
66
+ gap: 8px;
67
+ }
68
+
69
+ .local-project-card__path,
70
+ .local-project-card__meta {
71
+ display: none;
72
+ }
73
+
74
+ .local-project-card__actions {
75
+ display: none;
76
+ }
77
+
78
+ .local-project-card__actions--stacked {
79
+ display: flex;
80
+ gap: 4px;
81
+ }
82
+
83
+ .local-project-card__actions--stacked button {
84
+ flex: 1;
85
+ }
86
+ }