- Add DewToolCommand mixin that auto-derives MCP tool JSON Schema from ArgParser, eliminating the need to define CLI commands and MCP tools separately - Add schemaFromArgParser() to generate JSON Schema from ArgParser options - Add CommandRegistry.mcpTools recursive collector for all DewToolCommand subcommands - Refactor all kanban subcommands to use the mixin; switch get/update/delete from positional rest args to --id / -i option for schema compatibility - Promote list to a proper CLI subcommand (was MCP-only before) - Add search, comment, and config subcommands (CLI + MCP tools) - Add TicketStore.addComment() for non-destructive comment appending - Simplify mcp.registerCommands() to take only CommandRegistry - Simplify CLI entry point (no more KanbanToolProvider/McpToolRegistry) - Delete stale files: kanban_tool_provider.dart, mcp_tool_provider.dart, mcp_tool_registry.dart (superseded by DewToolCommand mixin) - Add tools/mcp_client.dart debug client for manual MCP server testing - Update .vscode/mcp.json with correct server config All 26 tests pass, dart analyze clean. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
37 lines
975 B
Dart
37 lines
975 B
Dart
import 'dart:io' as io;
|
|
|
|
import 'package:dart_mcp/stdio.dart';
|
|
import 'package:dew_core/dew_core.dart';
|
|
|
|
import '../dew_mcp_server.dart';
|
|
|
|
class ServeCommand extends DewCommand {
|
|
final CommandRegistry _commandRegistry;
|
|
|
|
ServeCommand(this._commandRegistry);
|
|
|
|
@override
|
|
final String name = 'serve';
|
|
|
|
@override
|
|
final String description =
|
|
'Start the Dew MCP server on stdio. '
|
|
'Connect your MCP client to this process.';
|
|
|
|
@override
|
|
Future<void> run() async {
|
|
// Resolve tools at serve time so all feature packages are already registered.
|
|
final tools = _commandRegistry.mcpTools;
|
|
|
|
io.stderr.writeln(
|
|
'Dew MCP server starting — ${tools.length} tool(s) registered.',
|
|
);
|
|
|
|
// stdioChannel subscribes to stdin; do not touch stdin after this point.
|
|
// The Dart event loop keeps the process alive until the client disconnects.
|
|
DewMcpServer(
|
|
stdioChannel(input: io.stdin, output: io.stdout),
|
|
tools,
|
|
);
|
|
}
|
|
}
|