- ListCommand: when no --column filter, groups output by column with counts;
with --column filter, returns flat list (no redundant column header)
- BoardCommand (kanban board): ASCII box per column in config order,
self-sizing to longest ticket line; supports --type/--label/--milestone filters
registered as 'kanban_board' MCP tool
- Test counts updated: 13 MCP tools, 'board' in subcommands list
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- index.md: rewrite architecture section to reflect DewToolCommand mixin,
CommandRegistry, and per-package config extension pattern
- config.md: update default columns to backlog/doing/done
- features/mcp.md: replace McpToolProvider references with DewToolCommand,
add all 12 tools to the table, add link types table
- features/kanban.md: replace stub with full docs covering storage layout,
ticket format, CLI command reference, link types, and config
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
DewConfig in core is now a thin YamlMap wrapper. Feature-specific config
classes live in their own packages and expose themselves via Dart extensions:
- KanbanConfig, ColumnConfig, TicketTypeConfig + KanbanDewConfig extension
moved to packages/kanban/lib/src/kanban_config.dart
- McpConfig + McpDewConfig extension added to
packages/mcp/lib/src/mcp_config.dart
- DewConfig.fromYaml() now trivially wraps the raw YamlMap
- All call sites unchanged: context.config.kanban.* / context.config.mcp.*
- Added yaml dependency to dew_mcp pubspec
- Updated core test to validate raw yaml instead of typed fields
- Fixed cross-suite Directory.current isolation (existing issue, not introduced)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Link types: blocks/is_blocked_by, relates_to (symmetric),
duplicates/is_duplicated_by, parent_of/child_of
- Add TicketLink(targetId, type) class and linkTypeInverses map to
ticket.dart
- Update Ticket.links from List<String> to List<TicketLink>
- Update toFileContent/fromFileContent for new {id, type} YAML format
- Update TicketStore.linkTickets to accept a type, write the forward
link and automatically write the inverse on the target ticket
- Update TicketStore.unlinkTickets to remove both sides
- Update LinkCommand with mandatory --type/-y option (enum of all valid
types); describe inverse in output message
- Update GetCommand to display typed links in ticket output
- Update all tests: typed roundtrip, bidirectional store tests for
blocks, relates_to (symmetric), parent_of/child_of, unlink both sides
- 29 tests pass, dart analyze clean
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- 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>
- tools/mcp_client.dart: spawns the compiled dew binary, connects via
stdioChannel, initializes the MCP handshake, lists all tools, and calls
kanban_list_tickets — useful for verifying the server without a real client
- .vscode/mcp.json: proper VS Code MCP server config using ${workspaceFolder}
to point at the compiled binary with 'mcp serve' args
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two bugs caused immediate connection close:
1. ProjectContext.find() at startup crashed if cwd wasn't a project root;
it's not needed here — each tool handler calls it on demand.
2. io.stdin.drain() added a second listener to stdin after stdioChannel
already subscribed, throwing StateError and killing the process.
The Dart event loop keeps the process alive while stdin has a listener.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
melos run pollutes stdout, breaking the MCP JSON-RPC channel.
The compiled binary has clean stdio and can be pointed at directly
by MCP clients.
- Add melos run compile script (output to .project/toolchain/bin/dew)
- Ignore .project/toolchain/ in .gitignore
- Update mcp.md with compile + client config instructions
- Remove workspace-root bin/ directory
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Flesh out docs/index.md, docs/config.md, docs/features/mcp.md,
docs/features/kanban.md with full content and aligned tables
- Fix .markdownlint-cli2.mjs config (rules were outside 'config' key)
- Add packages/mcp as a standalone MCP server package
- Update all pubspec descriptions
- Implement DewCommand + CommandRegistry in core
- Implement KanbanCommand and McpCommand stubs with registerCommands()
- Wire CLI entry point using CommandRunner + CommandRegistry
- Add 'melos run dew' script for running the CLI from workspace root
- Update tests across core, kanban, mcp packages
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>