Skip to content

Commit 76bb2f2

Browse files
author
Marvin Zhang
committed
Refactor Project Management Page layout and improve project card design
- Updated the layout of the Project Management Page for better responsiveness and aesthetics. - Enhanced project card design with improved spacing and alignment. - Added tags display for projects, allowing better categorization. - Changed button styles and functionality for viewing project dashboards and stats. - Improved the "No Projects Found" message with a more engaging design. - Updated dependencies in pnpm-lock.yaml, including tailwindcss and vitest packages.
1 parent 5ccba57 commit 76bb2f2

File tree

8 files changed

+252
-554
lines changed

8 files changed

+252
-554
lines changed

packages/mcp/src/adapters/mcp-api-adapter.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ export class MCPApiAdapter {
9191
this.apiClient.setCurrentProject(projectId);
9292
}
9393

94+
/**
95+
* Get the current project ID
96+
*/
97+
getCurrentProjectId(): number {
98+
return this.currentProjectId;
99+
}
100+
94101
/**
95102
* Get the underlying API client (for project tools)
96103
*/

packages/mcp/src/index.ts

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,26 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
6565

6666
try {
6767
switch (name) {
68-
case 'list_devlogs': {
69-
const validation = validateToolArgs(ListDevlogsArgsSchema, args, 'list_devlogs');
68+
case 'devlog_list': {
69+
const validation = validateToolArgs(ListDevlogsArgsSchema, args, 'devlog_list');
7070
if (!validation.success) return validation.result;
7171
return await adapter.listDevlogs(validation.data);
7272
}
7373

74-
case 'search_devlogs': {
75-
const validation = validateToolArgs(SearchDevlogsArgsSchema, args, 'search_devlogs');
74+
case 'devlog_search': {
75+
const validation = validateToolArgs(SearchDevlogsArgsSchema, args, 'devlog_search');
7676
if (!validation.success) return validation.result;
7777
return await adapter.searchDevlogs(validation.data);
7878
}
7979

80-
case 'discover_related_devlogs': {
81-
const validation = validateToolArgs(DiscoverRelatedDevlogsArgsSchema, args, 'discover_related_devlogs');
80+
case 'devlog_discover_related': {
81+
const validation = validateToolArgs(DiscoverRelatedDevlogsArgsSchema, args, 'devlog_discover_related');
8282
if (!validation.success) return validation.result;
8383
return await adapter.discoverRelatedDevlogs(validation.data);
8484
}
8585

86-
case 'create_devlog': {
87-
const validation = validateToolArgs(CreateDevlogArgsSchema, args, 'create_devlog');
86+
case 'devlog_create': {
87+
const validation = validateToolArgs(CreateDevlogArgsSchema, args, 'devlog_create');
8888
if (!validation.success) return validation.result;
8989

9090
// Apply defaults
@@ -96,20 +96,20 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
9696
return await adapter.createDevlog(validatedArgs);
9797
}
9898

99-
case 'update_devlog': {
100-
const validation = validateToolArgs(UpdateDevlogArgsSchema, args, 'update_devlog');
99+
case 'devlog_update': {
100+
const validation = validateToolArgs(UpdateDevlogArgsSchema, args, 'devlog_update');
101101
if (!validation.success) return validation.result;
102102
return await adapter.updateDevlog(validation.data);
103103
}
104104

105-
case 'get_devlog': {
106-
const validation = validateToolArgs(GetDevlogArgsSchema, args, 'get_devlog');
105+
case 'devlog_get': {
106+
const validation = validateToolArgs(GetDevlogArgsSchema, args, 'devlog_get');
107107
if (!validation.success) return validation.result;
108108
return await adapter.getDevlog(validation.data);
109109
}
110110

111-
case 'add_devlog_note': {
112-
const validation = validateToolArgs(AddDevlogNoteArgsSchema, args, 'add_devlog_note');
111+
case 'devlog_add_note': {
112+
const validation = validateToolArgs(AddDevlogNoteArgsSchema, args, 'devlog_add_note');
113113
if (!validation.success) return validation.result;
114114

115115
// Apply defaults
@@ -121,8 +121,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
121121
return await adapter.addDevlogNote(validatedArgs);
122122
}
123123

124-
case 'update_devlog_with_note': {
125-
const validation = validateToolArgs(UpdateDevlogWithNoteArgsSchema, args, 'update_devlog_with_note');
124+
case 'devlog_update_with_note': {
125+
const validation = validateToolArgs(UpdateDevlogWithNoteArgsSchema, args, 'devlog_update_with_note');
126126
if (!validation.success) return validation.result;
127127

128128
// Apply defaults
@@ -134,39 +134,39 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
134134
return await adapter.updateDevlogWithNote(validatedArgs);
135135
}
136136

137-
case 'complete_devlog': {
138-
const validation = validateToolArgs(CompleteDevlogArgsSchema, args, 'complete_devlog');
137+
case 'devlog_complete': {
138+
const validation = validateToolArgs(CompleteDevlogArgsSchema, args, 'devlog_complete');
139139
if (!validation.success) return validation.result;
140140
return await adapter.completeDevlog(validation.data);
141141
}
142142

143-
case 'close_devlog': {
144-
const validation = validateToolArgs(CloseDevlogArgsSchema, args, 'close_devlog');
143+
case 'devlog_close': {
144+
const validation = validateToolArgs(CloseDevlogArgsSchema, args, 'devlog_close');
145145
if (!validation.success) return validation.result;
146146
return await adapter.closeDevlog(validation.data);
147147
}
148148

149-
case 'archive_devlog': {
150-
const validation = validateToolArgs(ArchiveDevlogArgsSchema, args, 'archive_devlog');
149+
case 'devlog_archive': {
150+
const validation = validateToolArgs(ArchiveDevlogArgsSchema, args, 'devlog_archive');
151151
if (!validation.success) return validation.result;
152152
return await adapter.archiveDevlog(validation.data);
153153
}
154154

155-
case 'unarchive_devlog': {
156-
const validation = validateToolArgs(ArchiveDevlogArgsSchema, args, 'unarchive_devlog');
155+
case 'devlog_unarchive': {
156+
const validation = validateToolArgs(ArchiveDevlogArgsSchema, args, 'devlog_unarchive');
157157
if (!validation.success) return validation.result;
158158
return await adapter.unarchiveDevlog(validation.data);
159159
}
160160

161161
// Project management tools
162-
case 'list_projects':
162+
case 'project_list':
163163
return await handleListProjects(adapter.manager);
164164

165-
case 'get_current_project':
165+
case 'project_get_current':
166166
return await handleGetCurrentProject(adapter);
167167

168-
case 'switch_project': {
169-
const validation = validateToolArgs(SwitchProjectArgsSchema, args, 'switch_project');
168+
case 'project_switch': {
169+
const validation = validateToolArgs(SwitchProjectArgsSchema, args, 'project_switch');
170170
if (!validation.success) return validation.result;
171171
return await handleSwitchProject(adapter, validation.data);
172172
}
@@ -191,18 +191,29 @@ async function main() {
191191
// Parse command line arguments for default project
192192
const args = process.argv.slice(2);
193193
const projectArgIndex = args.findIndex((arg) => arg === '--project' || arg === '-p');
194-
const defaultProject =
194+
const defaultProjectStr =
195195
projectArgIndex !== -1 && args[projectArgIndex + 1]
196196
? args[projectArgIndex + 1]
197-
: process.env.MCP_DEFAULT_PROJECT || 'default';
197+
: process.env.MCP_DEFAULT_PROJECT || '1';
198+
199+
// Convert to number, defaulting to 1 if invalid
200+
let defaultProjectId = 1;
201+
try {
202+
const parsed = parseInt(defaultProjectStr, 10);
203+
if (!isNaN(parsed) && parsed > 0) {
204+
defaultProjectId = parsed;
205+
}
206+
} catch {
207+
console.error(`Invalid project ID '${defaultProjectStr}', using default project 1`);
208+
}
198209

199210
// Create adapter using factory with discovery
200211
const adapterInstance = await createMCPAdapterWithDiscovery();
201212

202-
// If default project was specified, set it
203-
if (defaultProject) {
204-
// TODO: Implement setCurrentProjectId in adapter
205-
// adapterInstance.setCurrentProjectId(defaultProject);
213+
// Set the default project ID
214+
if (adapterInstance.setCurrentProjectId) {
215+
adapterInstance.setCurrentProjectId(defaultProjectId);
216+
console.error(`Set current project to: ${defaultProjectId}`);
206217
}
207218

208219
// Assign the adapter instance directly
@@ -211,8 +222,7 @@ async function main() {
211222
const transport = new StdioServerTransport();
212223
await server.connect(transport);
213224

214-
const projectInfo = defaultProject ? ` (default project: ${defaultProject})` : '';
215-
console.error(`Devlog MCP Server started with flexible storage architecture${projectInfo}`);
225+
console.error(`Devlog MCP Server started with project: ${defaultProjectId}`);
216226
}
217227

218228
// Cleanup on process exit

packages/mcp/src/schemas/mcp-tool-schemas.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ import {
1212
UpdateDevlogEntrySchema,
1313
DevlogIdSchema,
1414
DevlogFilterSchema,
15-
} from '@codervisor/devlog-core/validation/devlog-schemas.js';
16-
import {
15+
1716
CreateProjectRequestSchema,
1817
UpdateProjectRequestSchema,
1918
ProjectIdSchema,
20-
} from '@codervisor/devlog-core/validation/project-schemas.js';
19+
} from '@codervisor/devlog-core';
2120

2221
/**
2322
* Devlog tool argument schemas

packages/mcp/src/tools/devlog-tools.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,65 +19,65 @@ import {
1919
*/
2020
export const devlogTools: Tool[] = [
2121
{
22-
name: 'create_devlog',
22+
name: 'devlog_create',
2323
description: 'Create a new devlog entry for a task, feature, or bugfix with rich context',
2424
inputSchema: zodToJsonSchema(CreateDevlogArgsSchema),
2525
},
2626
{
27-
name: 'get_devlog',
27+
name: 'devlog_get',
2828
description: 'Get detailed information about a specific devlog entry',
2929
inputSchema: zodToJsonSchema(GetDevlogArgsSchema),
3030
},
3131
{
32-
name: 'update_devlog',
32+
name: 'devlog_update',
3333
description: 'Update an existing devlog entry with progress, notes, or status changes',
3434
inputSchema: zodToJsonSchema(UpdateDevlogArgsSchema),
3535
},
3636
{
37-
name: 'add_devlog_note',
37+
name: 'devlog_add_note',
3838
description: 'Add a timestamped note to an existing devlog entry',
3939
inputSchema: zodToJsonSchema(AddDevlogNoteArgsSchema),
4040
},
4141
{
42-
name: 'update_devlog_with_note',
42+
name: 'devlog_update_with_note',
4343
description: 'Update devlog status/fields and add a note in one operation',
4444
inputSchema: zodToJsonSchema(UpdateDevlogWithNoteArgsSchema),
4545
},
4646
{
47-
name: 'complete_devlog',
47+
name: 'devlog_complete',
4848
description: 'Mark a devlog entry as completed and archive it',
4949
inputSchema: zodToJsonSchema(CompleteDevlogArgsSchema),
5050
},
5151
{
52-
name: 'list_devlogs',
52+
name: 'devlog_list',
5353
description: 'List all devlog entries with optional filtering and pagination',
5454
inputSchema: zodToJsonSchema(ListDevlogsArgsSchema),
5555
},
5656
{
57-
name: 'close_devlog',
57+
name: 'devlog_close',
5858
description:
5959
'Close a devlog entry by setting status to cancelled. Safer alternative to deletion that preserves the entry.',
6060
inputSchema: zodToJsonSchema(CloseDevlogArgsSchema),
6161
},
6262
{
63-
name: 'archive_devlog',
63+
name: 'devlog_archive',
6464
description: 'Archive a devlog entry to reduce clutter in default views while preserving it.',
6565
inputSchema: zodToJsonSchema(ArchiveDevlogArgsSchema),
6666
},
6767
{
68-
name: 'unarchive_devlog',
68+
name: 'devlog_unarchive',
6969
description: 'Unarchive a devlog entry to restore it to default views.',
7070
inputSchema: zodToJsonSchema(ArchiveDevlogArgsSchema),
7171
},
7272

7373
{
74-
name: 'discover_related_devlogs',
74+
name: 'devlog_discover_related',
7575
description:
7676
'Comprehensively search for existing devlog entries related to planned work before creating new entries. Returns detailed analysis of relevant historical context to prevent duplicate work.',
7777
inputSchema: zodToJsonSchema(DiscoverRelatedDevlogsArgsSchema),
7878
},
7979
{
80-
name: 'search_devlogs',
80+
name: 'devlog_search',
8181
description: 'Search devlog entries by keywords in title, description, or notes',
8282
inputSchema: zodToJsonSchema(SearchDevlogsArgsSchema),
8383
},

packages/mcp/src/tools/project-tools.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ import {
99

1010
// Project management tools for MCP server
1111
export const listProjectsTool: Tool = {
12-
name: 'list_projects',
12+
name: 'project_list',
1313
description: 'List all available projects with their configurations',
1414
inputSchema: zodToJsonSchema(ListProjectsArgsSchema),
1515
};
1616

1717
export const getCurrentProjectTool: Tool = {
18-
name: 'get_current_project',
18+
name: 'project_get_current',
1919
description: 'Get the currently active project information',
2020
inputSchema: zodToJsonSchema(GetCurrentProjectArgsSchema),
2121
};
2222

2323
export const switchProjectTool: Tool = {
24-
name: 'switch_project',
24+
name: 'project_switch',
2525
description: 'Switch to a different project by ID',
2626
inputSchema: zodToJsonSchema(SwitchProjectArgsSchema),
2727
};

packages/web/app/AppLayout.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ export function AppLayout({ children }: AppLayoutProps) {
3333
return (
3434
<ErrorBoundary>
3535
<SidebarProvider>
36-
<div className="min-h-screen bg-background">
36+
<div className="min-h-screen bg-background w-full">
3737
<TopNavbar />
38-
<div className="flex flex-1">
38+
<div className="flex flex-1 w-full">
3939
<NavigationSidebar
4040
stats={stats}
4141
statsLoading={isLoadingStats}
4242
collapsed={sidebarCollapsed}
4343
connected={connected}
4444
onToggle={() => setSidebarCollapsed(!sidebarCollapsed)}
4545
/>
46-
<div className="flex-1 flex flex-col">
47-
<main className="flex-1 p-6">
48-
<div className="max-w-full">
46+
<div className="flex-1 flex flex-col w-full">
47+
<main className="flex-1 p-6 w-full">
48+
<div className="w-full">
4949
{error && (
5050
<Alert className="mb-4">
5151
<AlertTriangle className="h-4 w-4" />

0 commit comments

Comments
 (0)