Expand find_comments

This commit is contained in:
Ian Gulliver
2025-06-27 21:53:04 -07:00
parent b7cbe3a222
commit 55592f0e50
3 changed files with 25 additions and 8 deletions

1
CLAUDE.md Symbolic link
View File

@@ -0,0 +1 @@
CONTEXT.md

10
main.go
View File

@@ -159,12 +159,15 @@ func main() {
// Define the find_comments tool // Define the find_comments tool
findCommentsTool := mcp.NewTool("find_comments", findCommentsTool := mcp.NewTool("find_comments",
mcp.WithDescription("Find undocumented exports, TODOs, and analyze comments"), mcp.WithDescription("Find all comments in Go files, with optional filtering for TODOs or undocumented exports"),
mcp.WithString("dir", mcp.WithString("dir",
mcp.Description("Directory to search (default: current directory)"), mcp.Description("Directory to search (default: current directory)"),
), ),
mcp.WithString("type", mcp.WithString("type",
mcp.Description("Comment type to find: 'todo', 'undocumented', or 'all' (default: 'all')"), mcp.Description("Comment type: 'todo' (filters by TODO keywords), 'undocumented' (finds undocumented exports), or 'all' (returns all comments, default)"),
),
mcp.WithString("filter",
mcp.Description("Optional regex to filter comments (applies to 'todo' and 'all' types)"),
), ),
) )
mcpServer.AddTool(findCommentsTool, findCommentsHandler) mcpServer.AddTool(findCommentsTool, findCommentsHandler)
@@ -678,8 +681,9 @@ func analyzeTestsHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp
func findCommentsHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { func findCommentsHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
dir := request.GetString("dir", "./") dir := request.GetString("dir", "./")
commentType := request.GetString("type", "all") commentType := request.GetString("type", "all")
filter := request.GetString("filter", "")
comments, err := findComments(dir, commentType) comments, err := findComments(dir, commentType, filter)
if err != nil { if err != nil {
return mcp.NewToolResultError(fmt.Sprintf("failed to find comments: %v", err)), nil return mcp.NewToolResultError(fmt.Sprintf("failed to find comments: %v", err)), nil
} }

View File

@@ -20,7 +20,7 @@ type CommentItem struct {
Position Position `json:"position"` Position Position `json:"position"`
} }
func findComments(dir string, commentType string) ([]CommentInfo, error) { func findComments(dir string, commentType string, filter string) ([]CommentInfo, error) {
var comments []CommentInfo var comments []CommentInfo
err := walkGoFiles(dir, func(path string, src []byte, file *ast.File, fset *token.FileSet) error { err := walkGoFiles(dir, func(path string, src []byte, file *ast.File, fset *token.FileSet) error {
@@ -28,16 +28,28 @@ func findComments(dir string, commentType string) ([]CommentInfo, error) {
File: path, File: path,
} }
// Find TODOs in comments // Find comments based on type
if commentType == "todo" || commentType == "all" { if commentType == "todo" || commentType == "all" {
todoRegex := regexp.MustCompile(`(?i)\b(todo|fixme|hack|bug|xxx)\b`) var filterRegex *regexp.Regexp
if filter != "" {
var err error
filterRegex, err = regexp.Compile(filter)
if err != nil {
return err
}
} else if commentType == "todo" {
// Default TODO regex if no filter provided and type is "todo"
filterRegex = regexp.MustCompile(`(?i)\b(todo|fixme|hack|bug|xxx)\b`)
}
for _, cg := range file.Comments { for _, cg := range file.Comments {
for _, c := range cg.List { for _, c := range cg.List {
if todoRegex.MatchString(c.Text) { // If no filter or filter matches, include the comment
if filterRegex == nil || filterRegex.MatchString(c.Text) {
pos := fset.Position(c.Pos()) pos := fset.Position(c.Pos())
info.TODOs = append(info.TODOs, CommentItem{ info.TODOs = append(info.TODOs, CommentItem{
Comment: c.Text, Comment: c.Text,
Type: "todo", Type: "comment",
Position: newPosition(pos), Position: newPosition(pos),
}) })
} }