A universal Neovim plugin that bridges 10+ task management systems with code comments across multiple programming languages. Create, update, and manage tasks directly from your comments without leaving your editor.
๐ Rendered documentation: docs.georgeharker.com/comment-tasks.nvim
Manage tasks from code without losing focus. Maintain task references in code.
Transform your TODO comments into actionable tasks across 10+ platforms while keeping task URLs embedded in your codebase for perfect traceability.
| Provider | Type | Custom Status | Bulk Operations | File References |
|---|---|---|---|---|
| ๐ฏ ClickUp | Full | โ | โ | โ |
| ๐ Asana | Full | โ | โ | โ |
| โก Linear | Full | โ | โ | โ |
| ๐ข Jira | Full | โ | โ | โ |
| ๐ Notion | Full | โ | โ | โ |
| ๐ Monday.com | Full | โ | โ | โ |
| ๐ GitHub Issues | Basic | โ | โ | โ |
| ๐ฆ GitLab Issues | Basic | โ | โ | โ |
| ๐ฆ Trello | Basic | โ | โ | โ |
| โ Todoist | Basic | โ | โ | โ |
Full: Complete workflow customization with any status names
Basic: Open/closed or list-based status management
Works with 15+ programming languages including: Python โข JavaScript/TypeScript โข Lua โข Rust โข C/C++ โข Go โข Java โข Ruby โข PHP โข CSS โข HTML โข Bash โข Vim Script โข YAML โข JSON
{
"georgeharker/comment-tasks.nvim",
config = function()
require("comment-tasks").setup({
default_provider = "clickup", -- Choose your preferred provider
providers = {
clickup = {
enabled = true,
api_key_env = "CLICKUP_API_KEY",
list_id = "your_clickup_list_id",
statuses = {
new = "To Do",
in_progress = "In Progress",
review = "Code Review",
completed = "Complete",
}
},
-- Add other providers as needed
},
})
end
}
Environment Setup:
export CLICKUP_API_KEY="your_api_key_here"
๐ Detailed Installation: docs/installation.md
# TODO: Implement user authentication system
# This needs proper validation and error handling
Place cursor on the comment and run :ClickUpTask new โ
# TODO: Implement user authentication system
# This needs proper validation and error handling
# https://app.clickup.com/t/task_id
Update task status as you progress:
:ClickUpTask in_progress " When you start working
:ClickUpTask review " When ready for code review
:ClickUpTask close " When finished (uses completed status)
" ClickUp (Full custom status support)
:ClickUpTask " Create task (default)
:ClickUpTask new " Create task (explicit)
:ClickUpTask in_progress " Update to 'In Progress' status
:ClickUpTask review " Update to 'Code Review' status
:ClickUpTask close " Complete task (uses completed status)
:ClickUpTask addfile " Add current file to task
" GitHub Issues (Basic support)
:GitHubTask " Create issue (default)
:GitHubTask new " Create issue (explicit)
:GitHubTask close " Close issue
:GitHubTask addfile " Add file reference
" Asana (Full custom status support)
:AsanaTask " Create task (default)
:AsanaTask new " Create task (explicit)
:AsanaTask blocked " Update to 'Blocked' status
:AsanaTask close " Complete task
:CommentTask " Create task with default provider (default)
:CommentTask new " Create task with default provider (explicit)
:CommentTask close " Complete task with default provider
:CommentTask addfile " Add file reference with default provider
:CommentTaskClose " Complete task with default provider
:CommentTaskAddFile " Add file reference with default provider
Available commands are generated dynamically from your status configuration.
require("comment-tasks").setup({
default_provider = "clickup", -- Provider for generic commands
providers = {
clickup = {
enabled = true,
api_key_env = "CLICKUP_API_KEY",
list_id = "123456789",
statuses = {
new = "To Do", -- Special: creates tasks
completed = "Complete", -- Special: completes tasks
review = "Code Review", -- Custom: creates :ClickUpTask review
blocked = "Blocked", -- Custom: creates :ClickUpTask blocked
}
}
}
})
Commands are automatically generated from your status configuration:
statuses = {
new = "Backlog", -- โ :ClickUpTask new (creates with "Backlog")
completed = "Done", -- โ :ClickUpTask completed (updates to "Done")
review = "In Review", -- โ :ClickUpTask review (updates to "In Review")
testing = "QA Testing", -- โ :ClickUpTask testing (updates to "QA Testing")
}
๐ Complete Configuration: docs/configuration.md
Override provider settings per-project by placing a .comment-tasks.json file at your project root. This lets different repositories target different task lists, boards, or projects without changing your personal Neovim config.
When a command runs, the plugin walks upward from the current file's directory:
.comment-tasks.json is checked first at every level โ if found, that directory is the project root.git, pyproject.toml, package.json, etc.) act as a ceilingThis means .comment-tasks.json always wins as the root anchor, even if it lives in a subdirectory above nested package.json files.
.comment-tasks.json{
"default_provider": "clickup",
"providers": {
"clickup": { "list_id": "9012345678", "team_id": "1234567" },
"github": { "repo_owner": "acme-corp", "repo_name": "backend-api" },
"jira": { "project_key": "BACKEND", "server_url": "https://acme.atlassian.net" }
}
}
Only project-targeting fields are overridden (list IDs, project keys, etc.). API keys and enabled flags always come from your Neovim config โ they are never read from the project file.
The default root markers cover most ecosystems. Override them in setup():
require("comment-tasks").setup({
root_markers = { ".git", "pyproject.toml", "Cargo.toml", ".my-marker" },
-- ...
})
๐ Full details: docs/configuration.md
vim.keymap.set("n", "<leader>tcc", function()
require("comment-tasks").create_clickup_task_from_comment()
end, { desc = "Create ClickUp task" })
vim.keymap.set("n", "<leader>tgh", function()
require("comment-tasks").create_github_task_from_comment()
end, { desc = "Create GitHub issue" })
vim.keymap.set("n", "<leader>tc", function()
require("comment-tasks").create_task_from_comment()
end, { desc = "Create task (default provider)" })
vim.keymap.set("n", "<leader>tu", function()
require("comment-tasks").update_task_status_from_comment("completed")
end, { desc = "Complete task" })
vim.keymap.set("n", "<leader>tx", function()
require("comment-tasks").close_task_from_comment()
end, { desc = "Close task" })
We welcome contributions! See our Contributing Guide for:
git clone https://github.com/georgeharker/comment-tasks.nvim.git
cd comment-tasks.nvim
MIT License - see LICENSE for details.
Ready to get started? Check out the Installation Guide and choose your provider setup.