This is page 2 of 52. Use http://codebase.md/eyaltoledano/claude-task-master?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .changeset │ ├── config.json │ └── README.md ├── .claude │ ├── agents │ │ ├── task-checker.md │ │ ├── task-executor.md │ │ └── task-orchestrator.md │ ├── commands │ │ ├── dedupe.md │ │ └── tm │ │ ├── add-dependency │ │ │ └── add-dependency.md │ │ ├── add-subtask │ │ │ ├── add-subtask.md │ │ │ └── convert-task-to-subtask.md │ │ ├── add-task │ │ │ └── add-task.md │ │ ├── analyze-complexity │ │ │ └── analyze-complexity.md │ │ ├── complexity-report │ │ │ └── complexity-report.md │ │ ├── expand │ │ │ ├── expand-all-tasks.md │ │ │ └── expand-task.md │ │ ├── fix-dependencies │ │ │ └── fix-dependencies.md │ │ ├── generate │ │ │ └── generate-tasks.md │ │ ├── help.md │ │ ├── init │ │ │ ├── init-project-quick.md │ │ │ └── init-project.md │ │ ├── learn.md │ │ ├── list │ │ │ ├── list-tasks-by-status.md │ │ │ ├── list-tasks-with-subtasks.md │ │ │ └── list-tasks.md │ │ ├── models │ │ │ ├── setup-models.md │ │ │ └── view-models.md │ │ ├── next │ │ │ └── next-task.md │ │ ├── parse-prd │ │ │ ├── parse-prd-with-research.md │ │ │ └── parse-prd.md │ │ ├── remove-dependency │ │ │ └── remove-dependency.md │ │ ├── remove-subtask │ │ │ └── remove-subtask.md │ │ ├── remove-subtasks │ │ │ ├── remove-all-subtasks.md │ │ │ └── remove-subtasks.md │ │ ├── remove-task │ │ │ └── remove-task.md │ │ ├── set-status │ │ │ ├── to-cancelled.md │ │ │ ├── to-deferred.md │ │ │ ├── to-done.md │ │ │ ├── to-in-progress.md │ │ │ ├── to-pending.md │ │ │ └── to-review.md │ │ ├── setup │ │ │ ├── install-taskmaster.md │ │ │ └── quick-install-taskmaster.md │ │ ├── show │ │ │ └── show-task.md │ │ ├── status │ │ │ └── project-status.md │ │ ├── sync-readme │ │ │ └── sync-readme.md │ │ ├── tm-main.md │ │ ├── update │ │ │ ├── update-single-task.md │ │ │ ├── update-task.md │ │ │ └── update-tasks-from-id.md │ │ ├── utils │ │ │ └── analyze-project.md │ │ ├── validate-dependencies │ │ │ └── validate-dependencies.md │ │ └── workflows │ │ ├── auto-implement-tasks.md │ │ ├── command-pipeline.md │ │ └── smart-workflow.md │ └── TM_COMMANDS_GUIDE.md ├── .coderabbit.yaml ├── .cursor │ ├── mcp.json │ └── rules │ ├── ai_providers.mdc │ ├── ai_services.mdc │ ├── architecture.mdc │ ├── changeset.mdc │ ├── commands.mdc │ ├── context_gathering.mdc │ ├── cursor_rules.mdc │ ├── dependencies.mdc │ ├── dev_workflow.mdc │ ├── git_workflow.mdc │ ├── glossary.mdc │ ├── mcp.mdc │ ├── new_features.mdc │ ├── self_improve.mdc │ ├── tags.mdc │ ├── taskmaster.mdc │ ├── tasks.mdc │ ├── telemetry.mdc │ ├── test_workflow.mdc │ ├── tests.mdc │ ├── ui.mdc │ └── utilities.mdc ├── .cursorignore ├── .env.example ├── .github │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.md │ │ ├── enhancements---feature-requests.md │ │ └── feedback.md │ ├── PULL_REQUEST_TEMPLATE │ │ ├── bugfix.md │ │ ├── config.yml │ │ ├── feature.md │ │ └── integration.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── scripts │ │ ├── auto-close-duplicates.mjs │ │ ├── backfill-duplicate-comments.mjs │ │ ├── check-pre-release-mode.mjs │ │ ├── parse-metrics.mjs │ │ ├── release.mjs │ │ ├── tag-extension.mjs │ │ └── utils.mjs │ └── workflows │ ├── auto-close-duplicates.yml │ ├── backfill-duplicate-comments.yml │ ├── ci.yml │ ├── claude-dedupe-issues.yml │ ├── claude-docs-trigger.yml │ ├── claude-docs-updater.yml │ ├── claude-issue-triage.yml │ ├── claude.yml │ ├── extension-ci.yml │ ├── extension-release.yml │ ├── log-issue-events.yml │ ├── pre-release.yml │ ├── release-check.yml │ ├── release.yml │ ├── update-models-md.yml │ └── weekly-metrics-discord.yml ├── .gitignore ├── .kiro │ ├── hooks │ │ ├── tm-code-change-task-tracker.kiro.hook │ │ ├── tm-complexity-analyzer.kiro.hook │ │ ├── tm-daily-standup-assistant.kiro.hook │ │ ├── tm-git-commit-task-linker.kiro.hook │ │ ├── tm-pr-readiness-checker.kiro.hook │ │ ├── tm-task-dependency-auto-progression.kiro.hook │ │ └── tm-test-success-task-completer.kiro.hook │ ├── settings │ │ └── mcp.json │ └── steering │ ├── dev_workflow.md │ ├── kiro_rules.md │ ├── self_improve.md │ ├── taskmaster_hooks_workflow.md │ └── taskmaster.md ├── .manypkg.json ├── .mcp.json ├── .npmignore ├── .nvmrc ├── .taskmaster │ ├── CLAUDE.md │ ├── config.json │ ├── docs │ │ ├── MIGRATION-ROADMAP.md │ │ ├── prd-tm-start.txt │ │ ├── prd.txt │ │ ├── README.md │ │ ├── research │ │ │ ├── 2025-06-14_how-can-i-improve-the-scope-up-and-scope-down-comm.md │ │ │ ├── 2025-06-14_should-i-be-using-any-specific-libraries-for-this.md │ │ │ ├── 2025-06-14_test-save-functionality.md │ │ │ ├── 2025-06-14_test-the-fix-for-duplicate-saves-final-test.md │ │ │ └── 2025-08-01_do-we-need-to-add-new-commands-or-can-we-just-weap.md │ │ ├── task-template-importing-prd.txt │ │ ├── test-prd.txt │ │ └── tm-core-phase-1.txt │ ├── reports │ │ ├── task-complexity-report_cc-kiro-hooks.json │ │ ├── task-complexity-report_test-prd-tag.json │ │ ├── task-complexity-report_tm-core-phase-1.json │ │ ├── task-complexity-report.json │ │ └── tm-core-complexity.json │ ├── state.json │ ├── tasks │ │ ├── task_001_tm-start.txt │ │ ├── task_002_tm-start.txt │ │ ├── task_003_tm-start.txt │ │ ├── task_004_tm-start.txt │ │ ├── task_007_tm-start.txt │ │ └── tasks.json │ └── templates │ └── example_prd.txt ├── .vscode │ ├── extensions.json │ └── settings.json ├── apps │ ├── cli │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ ├── commands │ │ │ │ ├── auth.command.ts │ │ │ │ ├── context.command.ts │ │ │ │ ├── list.command.ts │ │ │ │ ├── set-status.command.ts │ │ │ │ ├── show.command.ts │ │ │ │ └── start.command.ts │ │ │ ├── index.ts │ │ │ ├── ui │ │ │ │ ├── components │ │ │ │ │ ├── dashboard.component.ts │ │ │ │ │ ├── header.component.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── next-task.component.ts │ │ │ │ │ ├── suggested-steps.component.ts │ │ │ │ │ └── task-detail.component.ts │ │ │ │ └── index.ts │ │ │ └── utils │ │ │ ├── auto-update.ts │ │ │ └── ui.ts │ │ └── tsconfig.json │ ├── docs │ │ ├── archive │ │ │ ├── ai-client-utils-example.mdx │ │ │ ├── ai-development-workflow.mdx │ │ │ ├── command-reference.mdx │ │ │ ├── configuration.mdx │ │ │ ├── cursor-setup.mdx │ │ │ ├── examples.mdx │ │ │ └── Installation.mdx │ │ ├── best-practices │ │ │ ├── advanced-tasks.mdx │ │ │ ├── configuration-advanced.mdx │ │ │ └── index.mdx │ │ ├── capabilities │ │ │ ├── cli-root-commands.mdx │ │ │ ├── index.mdx │ │ │ ├── mcp.mdx │ │ │ └── task-structure.mdx │ │ ├── CHANGELOG.md │ │ ├── docs.json │ │ ├── favicon.svg │ │ ├── getting-started │ │ │ ├── contribute.mdx │ │ │ ├── faq.mdx │ │ │ └── quick-start │ │ │ ├── configuration-quick.mdx │ │ │ ├── execute-quick.mdx │ │ │ ├── installation.mdx │ │ │ ├── moving-forward.mdx │ │ │ ├── prd-quick.mdx │ │ │ ├── quick-start.mdx │ │ │ ├── requirements.mdx │ │ │ ├── rules-quick.mdx │ │ │ └── tasks-quick.mdx │ │ ├── introduction.mdx │ │ ├── licensing.md │ │ ├── logo │ │ │ ├── dark.svg │ │ │ ├── light.svg │ │ │ └── task-master-logo.png │ │ ├── package.json │ │ ├── README.md │ │ ├── style.css │ │ ├── vercel.json │ │ └── whats-new.mdx │ └── extension │ ├── .vscodeignore │ ├── assets │ │ ├── banner.png │ │ ├── icon-dark.svg │ │ ├── icon-light.svg │ │ ├── icon.png │ │ ├── screenshots │ │ │ ├── kanban-board.png │ │ │ └── task-details.png │ │ └── sidebar-icon.svg │ ├── CHANGELOG.md │ ├── components.json │ ├── docs │ │ ├── extension-CI-setup.md │ │ └── extension-development-guide.md │ ├── esbuild.js │ ├── LICENSE │ ├── package.json │ ├── package.mjs │ ├── package.publish.json │ ├── README.md │ ├── src │ │ ├── components │ │ │ ├── ConfigView.tsx │ │ │ ├── constants.ts │ │ │ ├── TaskDetails │ │ │ │ ├── AIActionsSection.tsx │ │ │ │ ├── DetailsSection.tsx │ │ │ │ ├── PriorityBadge.tsx │ │ │ │ ├── SubtasksSection.tsx │ │ │ │ ├── TaskMetadataSidebar.tsx │ │ │ │ └── useTaskDetails.ts │ │ │ ├── TaskDetailsView.tsx │ │ │ ├── TaskMasterLogo.tsx │ │ │ └── ui │ │ │ ├── badge.tsx │ │ │ ├── breadcrumb.tsx │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── collapsible.tsx │ │ │ ├── CollapsibleSection.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── label.tsx │ │ │ ├── scroll-area.tsx │ │ │ ├── separator.tsx │ │ │ ├── shadcn-io │ │ │ │ └── kanban │ │ │ │ └── index.tsx │ │ │ └── textarea.tsx │ │ ├── extension.ts │ │ ├── index.ts │ │ ├── lib │ │ │ └── utils.ts │ │ ├── services │ │ │ ├── config-service.ts │ │ │ ├── error-handler.ts │ │ │ ├── notification-preferences.ts │ │ │ ├── polling-service.ts │ │ │ ├── polling-strategies.ts │ │ │ ├── sidebar-webview-manager.ts │ │ │ ├── task-repository.ts │ │ │ ├── terminal-manager.ts │ │ │ └── webview-manager.ts │ │ ├── test │ │ │ └── extension.test.ts │ │ ├── utils │ │ │ ├── configManager.ts │ │ │ ├── connectionManager.ts │ │ │ ├── errorHandler.ts │ │ │ ├── event-emitter.ts │ │ │ ├── logger.ts │ │ │ ├── mcpClient.ts │ │ │ ├── notificationPreferences.ts │ │ │ └── task-master-api │ │ │ ├── cache │ │ │ │ └── cache-manager.ts │ │ │ ├── index.ts │ │ │ ├── mcp-client.ts │ │ │ ├── transformers │ │ │ │ └── task-transformer.ts │ │ │ └── types │ │ │ └── index.ts │ │ └── webview │ │ ├── App.tsx │ │ ├── components │ │ │ ├── AppContent.tsx │ │ │ ├── EmptyState.tsx │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── PollingStatus.tsx │ │ │ ├── PriorityBadge.tsx │ │ │ ├── SidebarView.tsx │ │ │ ├── TagDropdown.tsx │ │ │ ├── TaskCard.tsx │ │ │ ├── TaskEditModal.tsx │ │ │ ├── TaskMasterKanban.tsx │ │ │ ├── ToastContainer.tsx │ │ │ └── ToastNotification.tsx │ │ ├── constants │ │ │ └── index.ts │ │ ├── contexts │ │ │ └── VSCodeContext.tsx │ │ ├── hooks │ │ │ ├── useTaskQueries.ts │ │ │ ├── useVSCodeMessages.ts │ │ │ └── useWebviewHeight.ts │ │ ├── index.css │ │ ├── index.tsx │ │ ├── providers │ │ │ └── QueryProvider.tsx │ │ ├── reducers │ │ │ └── appReducer.ts │ │ ├── sidebar.tsx │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ ├── logger.ts │ │ └── toast.ts │ └── tsconfig.json ├── assets │ ├── .windsurfrules │ ├── AGENTS.md │ ├── claude │ │ ├── agents │ │ │ ├── task-checker.md │ │ │ ├── task-executor.md │ │ │ └── task-orchestrator.md │ │ ├── commands │ │ │ └── tm │ │ │ ├── add-dependency │ │ │ │ └── add-dependency.md │ │ │ ├── add-subtask │ │ │ │ ├── add-subtask.md │ │ │ │ └── convert-task-to-subtask.md │ │ │ ├── add-task │ │ │ │ └── add-task.md │ │ │ ├── analyze-complexity │ │ │ │ └── analyze-complexity.md │ │ │ ├── clear-subtasks │ │ │ │ ├── clear-all-subtasks.md │ │ │ │ └── clear-subtasks.md │ │ │ ├── complexity-report │ │ │ │ └── complexity-report.md │ │ │ ├── expand │ │ │ │ ├── expand-all-tasks.md │ │ │ │ └── expand-task.md │ │ │ ├── fix-dependencies │ │ │ │ └── fix-dependencies.md │ │ │ ├── generate │ │ │ │ └── generate-tasks.md │ │ │ ├── help.md │ │ │ ├── init │ │ │ │ ├── init-project-quick.md │ │ │ │ └── init-project.md │ │ │ ├── learn.md │ │ │ ├── list │ │ │ │ ├── list-tasks-by-status.md │ │ │ │ ├── list-tasks-with-subtasks.md │ │ │ │ └── list-tasks.md │ │ │ ├── models │ │ │ │ ├── setup-models.md │ │ │ │ └── view-models.md │ │ │ ├── next │ │ │ │ └── next-task.md │ │ │ ├── parse-prd │ │ │ │ ├── parse-prd-with-research.md │ │ │ │ └── parse-prd.md │ │ │ ├── remove-dependency │ │ │ │ └── remove-dependency.md │ │ │ ├── remove-subtask │ │ │ │ └── remove-subtask.md │ │ │ ├── remove-subtasks │ │ │ │ ├── remove-all-subtasks.md │ │ │ │ └── remove-subtasks.md │ │ │ ├── remove-task │ │ │ │ └── remove-task.md │ │ │ ├── set-status │ │ │ │ ├── to-cancelled.md │ │ │ │ ├── to-deferred.md │ │ │ │ ├── to-done.md │ │ │ │ ├── to-in-progress.md │ │ │ │ ├── to-pending.md │ │ │ │ └── to-review.md │ │ │ ├── setup │ │ │ │ ├── install-taskmaster.md │ │ │ │ └── quick-install-taskmaster.md │ │ │ ├── show │ │ │ │ └── show-task.md │ │ │ ├── status │ │ │ │ └── project-status.md │ │ │ ├── sync-readme │ │ │ │ └── sync-readme.md │ │ │ ├── tm-main.md │ │ │ ├── update │ │ │ │ ├── update-single-task.md │ │ │ │ ├── update-task.md │ │ │ │ └── update-tasks-from-id.md │ │ │ ├── utils │ │ │ │ └── analyze-project.md │ │ │ ├── validate-dependencies │ │ │ │ └── validate-dependencies.md │ │ │ └── workflows │ │ │ ├── auto-implement-tasks.md │ │ │ ├── command-pipeline.md │ │ │ └── smart-workflow.md │ │ └── TM_COMMANDS_GUIDE.md │ ├── config.json │ ├── env.example │ ├── example_prd.txt │ ├── gitignore │ ├── kiro-hooks │ │ ├── tm-code-change-task-tracker.kiro.hook │ │ ├── tm-complexity-analyzer.kiro.hook │ │ ├── tm-daily-standup-assistant.kiro.hook │ │ ├── tm-git-commit-task-linker.kiro.hook │ │ ├── tm-pr-readiness-checker.kiro.hook │ │ ├── tm-task-dependency-auto-progression.kiro.hook │ │ └── tm-test-success-task-completer.kiro.hook │ ├── roocode │ │ ├── .roo │ │ │ ├── rules-architect │ │ │ │ └── architect-rules │ │ │ ├── rules-ask │ │ │ │ └── ask-rules │ │ │ ├── rules-code │ │ │ │ └── code-rules │ │ │ ├── rules-debug │ │ │ │ └── debug-rules │ │ │ ├── rules-orchestrator │ │ │ │ └── orchestrator-rules │ │ │ └── rules-test │ │ │ └── test-rules │ │ └── .roomodes │ ├── rules │ │ ├── cursor_rules.mdc │ │ ├── dev_workflow.mdc │ │ ├── self_improve.mdc │ │ ├── taskmaster_hooks_workflow.mdc │ │ └── taskmaster.mdc │ └── scripts_README.md ├── bin │ └── task-master.js ├── biome.json ├── CHANGELOG.md ├── CLAUDE.md ├── context │ ├── chats │ │ ├── add-task-dependencies-1.md │ │ └── max-min-tokens.txt.md │ ├── fastmcp-core.txt │ ├── fastmcp-docs.txt │ ├── MCP_INTEGRATION.md │ ├── mcp-js-sdk-docs.txt │ ├── mcp-protocol-repo.txt │ ├── mcp-protocol-schema-03262025.json │ └── mcp-protocol-spec.txt ├── CONTRIBUTING.md ├── docs │ ├── CLI-COMMANDER-PATTERN.md │ ├── command-reference.md │ ├── configuration.md │ ├── contributor-docs │ │ └── testing-roo-integration.md │ ├── cross-tag-task-movement.md │ ├── examples │ │ └── claude-code-usage.md │ ├── examples.md │ ├── licensing.md │ ├── mcp-provider-guide.md │ ├── mcp-provider.md │ ├── migration-guide.md │ ├── models.md │ ├── providers │ │ └── gemini-cli.md │ ├── README.md │ ├── scripts │ │ └── models-json-to-markdown.js │ ├── task-structure.md │ └── tutorial.md ├── images │ └── logo.png ├── index.js ├── jest.config.js ├── jest.resolver.cjs ├── LICENSE ├── llms-install.md ├── mcp-server │ ├── server.js │ └── src │ ├── core │ │ ├── __tests__ │ │ │ └── context-manager.test.js │ │ ├── context-manager.js │ │ ├── direct-functions │ │ │ ├── add-dependency.js │ │ │ ├── add-subtask.js │ │ │ ├── add-tag.js │ │ │ ├── add-task.js │ │ │ ├── analyze-task-complexity.js │ │ │ ├── cache-stats.js │ │ │ ├── clear-subtasks.js │ │ │ ├── complexity-report.js │ │ │ ├── copy-tag.js │ │ │ ├── create-tag-from-branch.js │ │ │ ├── delete-tag.js │ │ │ ├── expand-all-tasks.js │ │ │ ├── expand-task.js │ │ │ ├── fix-dependencies.js │ │ │ ├── generate-task-files.js │ │ │ ├── initialize-project.js │ │ │ ├── list-tags.js │ │ │ ├── list-tasks.js │ │ │ ├── models.js │ │ │ ├── move-task-cross-tag.js │ │ │ ├── move-task.js │ │ │ ├── next-task.js │ │ │ ├── parse-prd.js │ │ │ ├── remove-dependency.js │ │ │ ├── remove-subtask.js │ │ │ ├── remove-task.js │ │ │ ├── rename-tag.js │ │ │ ├── research.js │ │ │ ├── response-language.js │ │ │ ├── rules.js │ │ │ ├── scope-down.js │ │ │ ├── scope-up.js │ │ │ ├── set-task-status.js │ │ │ ├── show-task.js │ │ │ ├── update-subtask-by-id.js │ │ │ ├── update-task-by-id.js │ │ │ ├── update-tasks.js │ │ │ ├── use-tag.js │ │ │ └── validate-dependencies.js │ │ ├── task-master-core.js │ │ └── utils │ │ ├── env-utils.js │ │ └── path-utils.js │ ├── custom-sdk │ │ ├── errors.js │ │ ├── index.js │ │ ├── json-extractor.js │ │ ├── language-model.js │ │ ├── message-converter.js │ │ └── schema-converter.js │ ├── index.js │ ├── logger.js │ ├── providers │ │ └── mcp-provider.js │ └── tools │ ├── add-dependency.js │ ├── add-subtask.js │ ├── add-tag.js │ ├── add-task.js │ ├── analyze.js │ ├── clear-subtasks.js │ ├── complexity-report.js │ ├── copy-tag.js │ ├── delete-tag.js │ ├── expand-all.js │ ├── expand-task.js │ ├── fix-dependencies.js │ ├── generate.js │ ├── get-operation-status.js │ ├── get-task.js │ ├── get-tasks.js │ ├── index.js │ ├── initialize-project.js │ ├── list-tags.js │ ├── models.js │ ├── move-task.js │ ├── next-task.js │ ├── parse-prd.js │ ├── remove-dependency.js │ ├── remove-subtask.js │ ├── remove-task.js │ ├── rename-tag.js │ ├── research.js │ ├── response-language.js │ ├── rules.js │ ├── scope-down.js │ ├── scope-up.js │ ├── set-task-status.js │ ├── update-subtask.js │ ├── update-task.js │ ├── update.js │ ├── use-tag.js │ ├── utils.js │ └── validate-dependencies.js ├── mcp-test.js ├── output.json ├── package-lock.json ├── package.json ├── packages │ ├── build-config │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ └── tsdown.base.ts │ │ └── tsconfig.json │ └── tm-core │ ├── .gitignore │ ├── CHANGELOG.md │ ├── docs │ │ └── listTasks-architecture.md │ ├── package.json │ ├── POC-STATUS.md │ ├── README.md │ ├── src │ │ ├── auth │ │ │ ├── auth-manager.test.ts │ │ │ ├── auth-manager.ts │ │ │ ├── config.ts │ │ │ ├── credential-store.test.ts │ │ │ ├── credential-store.ts │ │ │ ├── index.ts │ │ │ ├── oauth-service.ts │ │ │ ├── supabase-session-storage.ts │ │ │ └── types.ts │ │ ├── clients │ │ │ ├── index.ts │ │ │ └── supabase-client.ts │ │ ├── config │ │ │ ├── config-manager.spec.ts │ │ │ ├── config-manager.ts │ │ │ ├── index.ts │ │ │ └── services │ │ │ ├── config-loader.service.spec.ts │ │ │ ├── config-loader.service.ts │ │ │ ├── config-merger.service.spec.ts │ │ │ ├── config-merger.service.ts │ │ │ ├── config-persistence.service.spec.ts │ │ │ ├── config-persistence.service.ts │ │ │ ├── environment-config-provider.service.spec.ts │ │ │ ├── environment-config-provider.service.ts │ │ │ ├── index.ts │ │ │ ├── runtime-state-manager.service.spec.ts │ │ │ └── runtime-state-manager.service.ts │ │ ├── constants │ │ │ └── index.ts │ │ ├── entities │ │ │ └── task.entity.ts │ │ ├── errors │ │ │ ├── index.ts │ │ │ └── task-master-error.ts │ │ ├── executors │ │ │ ├── base-executor.ts │ │ │ ├── claude-executor.ts │ │ │ ├── executor-factory.ts │ │ │ ├── executor-service.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── index.ts │ │ ├── interfaces │ │ │ ├── ai-provider.interface.ts │ │ │ ├── configuration.interface.ts │ │ │ ├── index.ts │ │ │ └── storage.interface.ts │ │ ├── logger │ │ │ ├── factory.ts │ │ │ ├── index.ts │ │ │ └── logger.ts │ │ ├── mappers │ │ │ └── TaskMapper.ts │ │ ├── parser │ │ │ └── index.ts │ │ ├── providers │ │ │ ├── ai │ │ │ │ ├── base-provider.ts │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── repositories │ │ │ ├── supabase-task-repository.ts │ │ │ └── task-repository.interface.ts │ │ ├── services │ │ │ ├── index.ts │ │ │ ├── organization.service.ts │ │ │ ├── task-execution-service.ts │ │ │ └── task-service.ts │ │ ├── storage │ │ │ ├── api-storage.ts │ │ │ ├── file-storage │ │ │ │ ├── file-operations.ts │ │ │ │ ├── file-storage.ts │ │ │ │ ├── format-handler.ts │ │ │ │ ├── index.ts │ │ │ │ └── path-resolver.ts │ │ │ ├── index.ts │ │ │ └── storage-factory.ts │ │ ├── subpath-exports.test.ts │ │ ├── task-master-core.ts │ │ ├── types │ │ │ ├── database.types.ts │ │ │ ├── index.ts │ │ │ └── legacy.ts │ │ └── utils │ │ ├── id-generator.ts │ │ └── index.ts │ ├── tests │ │ ├── integration │ │ │ └── list-tasks.test.ts │ │ ├── mocks │ │ │ └── mock-provider.ts │ │ ├── setup.ts │ │ └── unit │ │ ├── base-provider.test.ts │ │ ├── executor.test.ts │ │ └── smoke.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── README-task-master.md ├── README.md ├── scripts │ ├── dev.js │ ├── init.js │ ├── modules │ │ ├── ai-services-unified.js │ │ ├── commands.js │ │ ├── config-manager.js │ │ ├── dependency-manager.js │ │ ├── index.js │ │ ├── prompt-manager.js │ │ ├── supported-models.json │ │ ├── sync-readme.js │ │ ├── task-manager │ │ │ ├── add-subtask.js │ │ │ ├── add-task.js │ │ │ ├── analyze-task-complexity.js │ │ │ ├── clear-subtasks.js │ │ │ ├── expand-all-tasks.js │ │ │ ├── expand-task.js │ │ │ ├── find-next-task.js │ │ │ ├── generate-task-files.js │ │ │ ├── is-task-dependent.js │ │ │ ├── list-tasks.js │ │ │ ├── migrate.js │ │ │ ├── models.js │ │ │ ├── move-task.js │ │ │ ├── parse-prd │ │ │ │ ├── index.js │ │ │ │ ├── parse-prd-config.js │ │ │ │ ├── parse-prd-helpers.js │ │ │ │ ├── parse-prd-non-streaming.js │ │ │ │ ├── parse-prd-streaming.js │ │ │ │ └── parse-prd.js │ │ │ ├── remove-subtask.js │ │ │ ├── remove-task.js │ │ │ ├── research.js │ │ │ ├── response-language.js │ │ │ ├── scope-adjustment.js │ │ │ ├── set-task-status.js │ │ │ ├── tag-management.js │ │ │ ├── task-exists.js │ │ │ ├── update-single-task-status.js │ │ │ ├── update-subtask-by-id.js │ │ │ ├── update-task-by-id.js │ │ │ └── update-tasks.js │ │ ├── task-manager.js │ │ ├── ui.js │ │ ├── update-config-tokens.js │ │ ├── utils │ │ │ ├── contextGatherer.js │ │ │ ├── fuzzyTaskSearch.js │ │ │ └── git-utils.js │ │ └── utils.js │ ├── task-complexity-report.json │ ├── test-claude-errors.js │ └── test-claude.js ├── src │ ├── ai-providers │ │ ├── anthropic.js │ │ ├── azure.js │ │ ├── base-provider.js │ │ ├── bedrock.js │ │ ├── claude-code.js │ │ ├── custom-sdk │ │ │ ├── claude-code │ │ │ │ ├── errors.js │ │ │ │ ├── index.js │ │ │ │ ├── json-extractor.js │ │ │ │ ├── language-model.js │ │ │ │ ├── message-converter.js │ │ │ │ └── types.js │ │ │ └── grok-cli │ │ │ ├── errors.js │ │ │ ├── index.js │ │ │ ├── json-extractor.js │ │ │ ├── language-model.js │ │ │ ├── message-converter.js │ │ │ └── types.js │ │ ├── gemini-cli.js │ │ ├── google-vertex.js │ │ ├── google.js │ │ ├── grok-cli.js │ │ ├── groq.js │ │ ├── index.js │ │ ├── ollama.js │ │ ├── openai.js │ │ ├── openrouter.js │ │ ├── perplexity.js │ │ └── xai.js │ ├── constants │ │ ├── commands.js │ │ ├── paths.js │ │ ├── profiles.js │ │ ├── providers.js │ │ ├── rules-actions.js │ │ ├── task-priority.js │ │ └── task-status.js │ ├── profiles │ │ ├── amp.js │ │ ├── base-profile.js │ │ ├── claude.js │ │ ├── cline.js │ │ ├── codex.js │ │ ├── cursor.js │ │ ├── gemini.js │ │ ├── index.js │ │ ├── kilo.js │ │ ├── kiro.js │ │ ├── opencode.js │ │ ├── roo.js │ │ ├── trae.js │ │ ├── vscode.js │ │ ├── windsurf.js │ │ └── zed.js │ ├── progress │ │ ├── base-progress-tracker.js │ │ ├── cli-progress-factory.js │ │ ├── parse-prd-tracker.js │ │ ├── progress-tracker-builder.js │ │ └── tracker-ui.js │ ├── prompts │ │ ├── add-task.json │ │ ├── analyze-complexity.json │ │ ├── expand-task.json │ │ ├── parse-prd.json │ │ ├── README.md │ │ ├── research.json │ │ ├── schemas │ │ │ ├── parameter.schema.json │ │ │ ├── prompt-template.schema.json │ │ │ ├── README.md │ │ │ └── variant.schema.json │ │ ├── update-subtask.json │ │ ├── update-task.json │ │ └── update-tasks.json │ ├── provider-registry │ │ └── index.js │ ├── task-master.js │ ├── ui │ │ ├── confirm.js │ │ ├── indicators.js │ │ └── parse-prd.js │ └── utils │ ├── asset-resolver.js │ ├── create-mcp-config.js │ ├── format.js │ ├── getVersion.js │ ├── logger-utils.js │ ├── manage-gitignore.js │ ├── path-utils.js │ ├── profiles.js │ ├── rule-transformer.js │ ├── stream-parser.js │ └── timeout-manager.js ├── test-clean-tags.js ├── test-config-manager.js ├── test-prd.txt ├── test-tag-functions.js ├── test-version-check-full.js ├── test-version-check.js ├── tests │ ├── e2e │ │ ├── e2e_helpers.sh │ │ ├── parse_llm_output.cjs │ │ ├── run_e2e.sh │ │ ├── run_fallback_verification.sh │ │ └── test_llm_analysis.sh │ ├── fixture │ │ └── test-tasks.json │ ├── fixtures │ │ ├── .taskmasterconfig │ │ ├── sample-claude-response.js │ │ ├── sample-prd.txt │ │ └── sample-tasks.js │ ├── integration │ │ ├── claude-code-optional.test.js │ │ ├── cli │ │ │ ├── commands.test.js │ │ │ ├── complex-cross-tag-scenarios.test.js │ │ │ └── move-cross-tag.test.js │ │ ├── manage-gitignore.test.js │ │ ├── mcp-server │ │ │ └── direct-functions.test.js │ │ ├── move-task-cross-tag.integration.test.js │ │ ├── move-task-simple.integration.test.js │ │ └── profiles │ │ ├── amp-init-functionality.test.js │ │ ├── claude-init-functionality.test.js │ │ ├── cline-init-functionality.test.js │ │ ├── codex-init-functionality.test.js │ │ ├── cursor-init-functionality.test.js │ │ ├── gemini-init-functionality.test.js │ │ ├── opencode-init-functionality.test.js │ │ ├── roo-files-inclusion.test.js │ │ ├── roo-init-functionality.test.js │ │ ├── rules-files-inclusion.test.js │ │ ├── trae-init-functionality.test.js │ │ ├── vscode-init-functionality.test.js │ │ └── windsurf-init-functionality.test.js │ ├── manual │ │ ├── progress │ │ │ ├── parse-prd-analysis.js │ │ │ ├── test-parse-prd.js │ │ │ └── TESTING_GUIDE.md │ │ └── prompts │ │ ├── prompt-test.js │ │ └── README.md │ ├── README.md │ ├── setup.js │ └── unit │ ├── ai-providers │ │ ├── claude-code.test.js │ │ ├── custom-sdk │ │ │ └── claude-code │ │ │ └── language-model.test.js │ │ ├── gemini-cli.test.js │ │ ├── mcp-components.test.js │ │ └── openai.test.js │ ├── ai-services-unified.test.js │ ├── commands.test.js │ ├── config-manager.test.js │ ├── config-manager.test.mjs │ ├── dependency-manager.test.js │ ├── init.test.js │ ├── initialize-project.test.js │ ├── kebab-case-validation.test.js │ ├── manage-gitignore.test.js │ ├── mcp │ │ └── tools │ │ ├── __mocks__ │ │ │ └── move-task.js │ │ ├── add-task.test.js │ │ ├── analyze-complexity.test.js │ │ ├── expand-all.test.js │ │ ├── get-tasks.test.js │ │ ├── initialize-project.test.js │ │ ├── move-task-cross-tag-options.test.js │ │ ├── move-task-cross-tag.test.js │ │ └── remove-task.test.js │ ├── mcp-providers │ │ ├── mcp-components.test.js │ │ └── mcp-provider.test.js │ ├── parse-prd.test.js │ ├── profiles │ │ ├── amp-integration.test.js │ │ ├── claude-integration.test.js │ │ ├── cline-integration.test.js │ │ ├── codex-integration.test.js │ │ ├── cursor-integration.test.js │ │ ├── gemini-integration.test.js │ │ ├── kilo-integration.test.js │ │ ├── kiro-integration.test.js │ │ ├── mcp-config-validation.test.js │ │ ├── opencode-integration.test.js │ │ ├── profile-safety-check.test.js │ │ ├── roo-integration.test.js │ │ ├── rule-transformer-cline.test.js │ │ ├── rule-transformer-cursor.test.js │ │ ├── rule-transformer-gemini.test.js │ │ ├── rule-transformer-kilo.test.js │ │ ├── rule-transformer-kiro.test.js │ │ ├── rule-transformer-opencode.test.js │ │ ├── rule-transformer-roo.test.js │ │ ├── rule-transformer-trae.test.js │ │ ├── rule-transformer-vscode.test.js │ │ ├── rule-transformer-windsurf.test.js │ │ ├── rule-transformer-zed.test.js │ │ ├── rule-transformer.test.js │ │ ├── selective-profile-removal.test.js │ │ ├── subdirectory-support.test.js │ │ ├── trae-integration.test.js │ │ ├── vscode-integration.test.js │ │ ├── windsurf-integration.test.js │ │ └── zed-integration.test.js │ ├── progress │ │ └── base-progress-tracker.test.js │ ├── prompt-manager.test.js │ ├── prompts │ │ └── expand-task-prompt.test.js │ ├── providers │ │ └── provider-registry.test.js │ ├── scripts │ │ └── modules │ │ ├── commands │ │ │ ├── move-cross-tag.test.js │ │ │ └── README.md │ │ ├── dependency-manager │ │ │ ├── circular-dependencies.test.js │ │ │ ├── cross-tag-dependencies.test.js │ │ │ └── fix-dependencies-command.test.js │ │ ├── task-manager │ │ │ ├── add-subtask.test.js │ │ │ ├── add-task.test.js │ │ │ ├── analyze-task-complexity.test.js │ │ │ ├── clear-subtasks.test.js │ │ │ ├── complexity-report-tag-isolation.test.js │ │ │ ├── expand-all-tasks.test.js │ │ │ ├── expand-task.test.js │ │ │ ├── find-next-task.test.js │ │ │ ├── generate-task-files.test.js │ │ │ ├── list-tasks.test.js │ │ │ ├── move-task-cross-tag.test.js │ │ │ ├── move-task.test.js │ │ │ ├── parse-prd.test.js │ │ │ ├── remove-subtask.test.js │ │ │ ├── remove-task.test.js │ │ │ ├── research.test.js │ │ │ ├── scope-adjustment.test.js │ │ │ ├── set-task-status.test.js │ │ │ ├── setup.js │ │ │ ├── update-single-task-status.test.js │ │ │ ├── update-subtask-by-id.test.js │ │ │ ├── update-task-by-id.test.js │ │ │ └── update-tasks.test.js │ │ ├── ui │ │ │ └── cross-tag-error-display.test.js │ │ └── utils-tag-aware-paths.test.js │ ├── task-finder.test.js │ ├── task-manager │ │ ├── clear-subtasks.test.js │ │ ├── move-task.test.js │ │ ├── tag-boundary.test.js │ │ └── tag-management.test.js │ ├── task-master.test.js │ ├── ui │ │ └── indicators.test.js │ ├── ui.test.js │ ├── utils-strip-ansi.test.js │ └── utils.test.js ├── tsconfig.json ├── tsdown.config.ts └── turbo.json ``` # Files -------------------------------------------------------------------------------- /src/prompts/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # Task Master Prompt Management System 2 | 3 | This directory contains the centralized prompt templates for all AI-powered features in Task Master. 4 | 5 | ## Overview 6 | 7 | The prompt management system provides: 8 | - **Centralized Storage**: All prompts in one location (`/src/prompts`) 9 | - **JSON Schema Validation**: Comprehensive validation using AJV with detailed error reporting 10 | - **Version Control**: Track changes to prompts over time 11 | - **Variant Support**: Different prompts for different contexts (research mode, complexity levels, etc.) 12 | - **Template Variables**: Dynamic prompt generation with variable substitution 13 | - **IDE Integration**: VS Code IntelliSense and validation support 14 | 15 | ## Directory Structure 16 | 17 | ``` 18 | src/prompts/ 19 | ├── README.md # This file 20 | ├── schemas/ # JSON schemas for validation 21 | │ ├── README.md # Schema documentation 22 | │ ├── prompt-template.schema.json # Main template schema 23 | │ ├── parameter.schema.json # Parameter validation schema 24 | │ └── variant.schema.json # Prompt variant schema 25 | ├── parse-prd.json # PRD parsing prompts 26 | ├── expand-task.json # Task expansion prompts 27 | ├── add-task.json # Task creation prompts 28 | ├── update-tasks.json # Bulk task update prompts 29 | ├── update-task.json # Single task update prompts 30 | ├── update-subtask.json # Subtask update prompts 31 | ├── analyze-complexity.json # Complexity analysis prompts 32 | └── research.json # Research query prompts 33 | ``` 34 | 35 | ## Schema Validation 36 | 37 | All prompt templates are validated against JSON schemas located in `/src/prompts/schemas/`. The validation system: 38 | 39 | - **Structural Validation**: Ensures required fields and proper nesting 40 | - **Parameter Type Checking**: Validates parameter types, patterns, and ranges 41 | - **Template Syntax**: Validates Handlebars syntax and variable references 42 | - **Semantic Versioning**: Enforces proper version format 43 | - **Cross-Reference Validation**: Ensures parameters match template variables 44 | 45 | ### Validation Features 46 | - **Required Fields**: `id`, `version`, `description`, `prompts.default` 47 | - **Type Safety**: String, number, boolean, array, object validation 48 | - **Pattern Matching**: Regex validation for string parameters 49 | - **Range Validation**: Min/max values for numeric parameters 50 | - **Enum Constraints**: Restricted value sets for categorical parameters 51 | 52 | ## Development Workflow 53 | 54 | ### Setting Up Development Environment 55 | 1. **VS Code Integration**: Schemas are automatically configured for IntelliSense 56 | 2. **Dependencies**: `ajv` and `ajv-formats` are required for validation 57 | 3. **File Watching**: Changes to templates trigger automatic validation 58 | 59 | ### Creating New Prompts 60 | 1. Create a new `.json` file in `/src/prompts/` 61 | 2. Follow the schema structure (see Template Structure section) 62 | 3. Define parameters with proper types and validation 63 | 4. Create system and user prompts with template variables 64 | 5. Test with the PromptManager before committing 65 | 66 | ### Modifying Existing Prompts 67 | 1. Update the `version` field following semantic versioning 68 | 2. Maintain backward compatibility when possible 69 | 3. Test with existing code that uses the prompt 70 | 4. Update documentation if parameters change 71 | 72 | ## Prompt Template Reference 73 | 74 | ### 1. parse-prd.json 75 | **Purpose**: Parse a Product Requirements Document into structured tasks 76 | **Variants**: `default`, `research` (when research mode is enabled) 77 | 78 | **Required Parameters**: 79 | - `numTasks` (number): Target number of tasks to generate 80 | - `nextId` (number): Starting ID for tasks 81 | - `prdContent` (string): Content of the PRD file 82 | - `prdPath` (string): Path to the PRD file 83 | - `defaultTaskPriority` (string): Default priority for generated tasks 84 | 85 | **Optional Parameters**: 86 | - `research` (boolean): Enable research mode for latest best practices (default: false) 87 | 88 | **Usage**: Used by `task-master parse-prd` command to convert PRD documents into actionable task lists. 89 | 90 | ### 2. add-task.json 91 | **Purpose**: Generate a new task based on user description 92 | **Variants**: `default`, `research` (when research mode is enabled) 93 | 94 | **Required Parameters**: 95 | - `prompt` (string): User's task description 96 | - `newTaskId` (number): ID for the new task 97 | 98 | **Optional Parameters**: 99 | - `existingTasks` (array): List of existing tasks for context 100 | - `gatheredContext` (string): Context gathered from codebase analysis 101 | - `contextFromArgs` (string): Additional context from manual args 102 | - `priority` (string): Task priority (high/medium/low, default: medium) 103 | - `dependencies` (array): Task dependency IDs 104 | - `useResearch` (boolean): Use research mode (default: false) 105 | 106 | **Usage**: Used by `task-master add-task` command to create new tasks with AI assistance. 107 | 108 | ### 3. expand-task.json 109 | **Purpose**: Break down a task into detailed subtasks with three sophisticated strategies 110 | **Variants**: `complexity-report` (when expansionPrompt exists), `research` (when research mode is enabled), `default` (standard case) 111 | 112 | **Required Parameters**: 113 | - `subtaskCount` (number): Number of subtasks to generate 114 | - `task` (object): The task to expand 115 | - `nextSubtaskId` (number): Starting ID for new subtasks 116 | 117 | **Optional Parameters**: 118 | - `additionalContext` (string): Additional context for expansion (default: "") 119 | - `complexityReasoningContext` (string): Complexity analysis reasoning context (default: "") 120 | - `gatheredContext` (string): Gathered project context (default: "") 121 | - `useResearch` (boolean): Use research mode (default: false) 122 | - `expansionPrompt` (string): Expansion prompt from complexity report 123 | 124 | **Variant Selection Strategy**: 125 | 1. **complexity-report**: Used when `expansionPrompt` exists (highest priority) 126 | 2. **research**: Used when `useResearch === true && !expansionPrompt` 127 | 3. **default**: Standard fallback strategy 128 | 129 | **Usage**: Used by `task-master expand` command to break complex tasks into manageable subtasks using the most appropriate strategy based on available context and complexity analysis. 130 | 131 | ### 4. update-task.json 132 | **Purpose**: Update a single task with new information, supporting full updates and append mode 133 | **Variants**: `default`, `append` (when appendMode is true), `research` (when research mode is enabled) 134 | 135 | **Required Parameters**: 136 | - `task` (object): The task to update 137 | - `taskJson` (string): JSON string representation of the task 138 | - `updatePrompt` (string): Description of changes to apply 139 | 140 | **Optional Parameters**: 141 | - `appendMode` (boolean): Whether to append to details or do full update (default: false) 142 | - `useResearch` (boolean): Use research mode (default: false) 143 | - `currentDetails` (string): Current task details for context (default: "(No existing details)") 144 | - `gatheredContext` (string): Additional project context 145 | 146 | **Usage**: Used by `task-master update-task` command to modify existing tasks. 147 | 148 | ### 5. update-tasks.json 149 | **Purpose**: Update multiple tasks based on new context or changes 150 | **Variants**: `default`, `research` (when research mode is enabled) 151 | 152 | **Required Parameters**: 153 | - `tasks` (array): Array of tasks to update 154 | - `updatePrompt` (string): Description of changes to apply 155 | 156 | **Optional Parameters**: 157 | - `useResearch` (boolean): Use research mode (default: false) 158 | - `projectContext` (string): Additional project context 159 | 160 | **Usage**: Used by `task-master update` command to bulk update multiple tasks. 161 | 162 | ### 6. update-subtask.json 163 | **Purpose**: Append information to a subtask by generating only new content 164 | **Variants**: `default`, `research` (when research mode is enabled) 165 | 166 | **Required Parameters**: 167 | - `parentTask` (object): The parent task context 168 | - `currentDetails` (string): Current subtask details (default: "(No existing details)") 169 | - `updatePrompt` (string): User request for what to add 170 | 171 | **Optional Parameters**: 172 | - `prevSubtask` (object): The previous subtask if any 173 | - `nextSubtask` (object): The next subtask if any 174 | - `useResearch` (boolean): Use research mode (default: false) 175 | - `gatheredContext` (string): Additional project context 176 | 177 | **Usage**: Used by `task-master update-subtask` command to log progress and findings on subtasks. 178 | 179 | ### 7. analyze-complexity.json 180 | **Purpose**: Analyze task complexity and generate expansion recommendations 181 | **Variants**: `default`, `research` (when research mode is enabled), `batch` (when analyzing >10 tasks) 182 | 183 | **Required Parameters**: 184 | - `tasks` (array): Array of tasks to analyze 185 | 186 | **Optional Parameters**: 187 | - `gatheredContext` (string): Additional project context 188 | - `threshold` (number): Complexity threshold for expansion recommendation (1-10, default: 5) 189 | - `useResearch` (boolean): Use research mode for deeper analysis (default: false) 190 | 191 | **Usage**: Used by `task-master analyze-complexity` command to determine which tasks need breakdown. 192 | 193 | ### 8. research.json 194 | **Purpose**: Perform AI-powered research with project context 195 | **Variants**: `default`, `low` (concise responses), `medium` (balanced), `high` (detailed) 196 | 197 | **Required Parameters**: 198 | - `query` (string): Research query 199 | 200 | **Optional Parameters**: 201 | - `gatheredContext` (string): Gathered project context 202 | - `detailLevel` (string): Level of detail (low/medium/high, default: medium) 203 | - `projectInfo` (object): Project information with properties: 204 | - `root` (string): Project root path 205 | - `taskCount` (number): Number of related tasks 206 | - `fileCount` (number): Number of related files 207 | 208 | **Usage**: Used by `task-master research` command to get contextual information and guidance. 209 | 210 | ## Template Structure 211 | 212 | Each prompt template is a JSON file with the following structure: 213 | 214 | ```json 215 | { 216 | "id": "unique-identifier", 217 | "version": "1.0.0", 218 | "description": "What this prompt does", 219 | "metadata": { 220 | "author": "system", 221 | "created": "2024-01-01T00:00:00Z", 222 | "updated": "2024-01-01T00:00:00Z", 223 | "tags": ["category", "feature"], 224 | "category": "task" 225 | }, 226 | "parameters": { 227 | "paramName": { 228 | "type": "string|number|boolean|array|object", 229 | "required": true|false, 230 | "default": "default value", 231 | "description": "Parameter description", 232 | "enum": ["option1", "option2"], 233 | "pattern": "^[a-z]+$", 234 | "minimum": 1, 235 | "maximum": 100 236 | } 237 | }, 238 | "prompts": { 239 | "default": { 240 | "system": "System prompt template", 241 | "user": "User prompt template" 242 | }, 243 | "variant-name": { 244 | "condition": "JavaScript expression", 245 | "system": "Variant system prompt", 246 | "user": "Variant user prompt", 247 | "metadata": { 248 | "description": "When to use this variant" 249 | } 250 | } 251 | } 252 | } 253 | ``` 254 | 255 | ## Template Features 256 | 257 | ### Variable Substitution 258 | Use `{{variableName}}` to inject dynamic values: 259 | ``` 260 | "user": "Analyze these {{tasks.length}} tasks with threshold {{threshold}}" 261 | ``` 262 | 263 | ### Conditionals 264 | Use `{{#if variable}}...{{/if}}` for conditional content: 265 | ``` 266 | "user": "{{#if useResearch}}Research and {{/if}}create a task" 267 | ``` 268 | 269 | ### Helper Functions 270 | 271 | #### Equality Helper 272 | Use `{{#if (eq variable "value")}}...{{/if}}` for string comparisons: 273 | ``` 274 | "user": "{{#if (eq detailLevel \"low\")}}Provide a brief summary{{/if}}" 275 | "user": "{{#if (eq priority \"high\")}}URGENT: {{/if}}{{taskTitle}}" 276 | ``` 277 | 278 | The `eq` helper enables clean conditional logic based on parameter values: 279 | - Compare strings: `(eq detailLevel "medium")` 280 | - Compare with enum values: `(eq status "pending")` 281 | - Multiple conditions: `{{#if (eq level "1")}}First{{/if}}{{#if (eq level "2")}}Second{{/if}}` 282 | 283 | #### Negation Helper 284 | Use `{{#if (not variable)}}...{{/if}}` for negation conditions: 285 | ``` 286 | "user": "{{#if (not useResearch)}}Use basic analysis{{/if}}" 287 | "user": "{{#if (not hasSubtasks)}}This task has no subtasks{{/if}}" 288 | ``` 289 | 290 | The `not` helper enables clean negative conditional logic: 291 | - Negate boolean values: `(not useResearch)` 292 | - Negate truthy/falsy values: `(not emptyArray)` 293 | - Cleaner than separate boolean parameters: No need for `notUseResearch` flags 294 | 295 | #### Numeric Comparison Helpers 296 | Use `{{#if (gt variable number)}}...{{/if}}` for greater than comparisons: 297 | ``` 298 | "user": "generate {{#if (gt numTasks 0)}}approximately {{numTasks}}{{else}}an appropriate number of{{/if}} top-level development tasks" 299 | "user": "{{#if (gt complexity 5)}}This is a complex task{{/if}}" 300 | "system": "create {{#if (gt subtaskCount 0)}}exactly {{subtaskCount}}{{else}}an appropriate number of{{/if}} subtasks" 301 | ``` 302 | 303 | Use `{{#if (gte variable number)}}...{{/if}}` for greater than or equal comparisons: 304 | ``` 305 | "user": "{{#if (gte priority 8)}}HIGH PRIORITY{{/if}}" 306 | "user": "{{#if (gte threshold 1)}}Analysis enabled{{/if}}" 307 | "system": "{{#if (gte complexityScore 8)}}Use detailed breakdown approach{{/if}}" 308 | ``` 309 | 310 | The numeric comparison helpers enable sophisticated conditional logic: 311 | - **Dynamic counting**: `{{#if (gt numTasks 0)}}exactly {{numTasks}}{{else}}an appropriate number of{{/if}}` 312 | - **Threshold-based behavior**: `(gte complexityScore 8)` for high-complexity handling 313 | - **Zero checks**: `(gt subtaskCount 0)` for conditional content generation 314 | - **Decimal support**: `(gt score 7.5)` for fractional comparisons 315 | - **Enhanced prompt sophistication**: Enables parse-prd and expand-task logic matching GitHub specifications 316 | 317 | ### Loops 318 | Use `{{#each array}}...{{/each}}` to iterate over arrays: 319 | ``` 320 | "user": "Tasks:\n{{#each tasks}}- {{id}}: {{title}}\n{{/each}}" 321 | ``` 322 | 323 | ### Special Loop Variables 324 | Inside `{{#each}}` blocks, you have access to: 325 | - `{{@index}}`: Current array index (0-based) 326 | - `{{@first}}`: Boolean, true for first item 327 | - `{{@last}}`: Boolean, true for last item 328 | 329 | ``` 330 | "user": "{{#each tasks}}{{@index}}. {{title}}{{#unless @last}}\n{{/unless}}{{/each}}" 331 | ``` 332 | 333 | ### JSON Serialization 334 | Use `{{{json variable}}}` (triple braces) to serialize objects/arrays to JSON: 335 | ``` 336 | "user": "Analyze these tasks: {{{json tasks}}}" 337 | ``` 338 | 339 | ### Nested Properties 340 | Access nested properties with dot notation: 341 | ``` 342 | "user": "Project: {{context.projectName}}" 343 | ``` 344 | 345 | ## Prompt Variants 346 | 347 | Variants allow different prompts based on conditions: 348 | 349 | ```json 350 | { 351 | "prompts": { 352 | "default": { 353 | "system": "Default system prompt", 354 | "user": "Default user prompt" 355 | }, 356 | "research": { 357 | "condition": "useResearch === true", 358 | "system": "Research-focused system prompt", 359 | "user": "Research-focused user prompt" 360 | }, 361 | "high-complexity": { 362 | "condition": "complexityScore >= 8", 363 | "system": "Complex task handling prompt", 364 | "user": "Detailed breakdown request" 365 | } 366 | } 367 | } 368 | ``` 369 | 370 | ### Condition Evaluation 371 | Conditions are JavaScript expressions evaluated with parameter values as context: 372 | - Simple comparisons: `useResearch === true` 373 | - Numeric comparisons: `threshold >= 5` 374 | - String matching: `priority === 'high'` 375 | - Complex logic: `useResearch && threshold > 7` 376 | 377 | ## PromptManager Module 378 | 379 | The PromptManager is implemented in `scripts/modules/prompt-manager.js` and provides: 380 | - **Template loading and caching**: Templates are loaded once and cached for performance 381 | - **Schema validation**: Comprehensive validation using AJV with detailed error reporting 382 | - **Variable substitution**: Handlebars-like syntax for dynamic content 383 | - **Variant selection**: Automatic selection based on conditions 384 | - **Error handling**: Graceful fallbacks and detailed error messages 385 | - **Singleton pattern**: One instance per project root for efficiency 386 | 387 | ### Validation Behavior 388 | - **Schema Available**: Full validation with detailed error messages 389 | - **Schema Missing**: Falls back to basic structural validation 390 | - **Invalid Templates**: Throws descriptive errors with field-level details 391 | - **Parameter Validation**: Type checking, pattern matching, range validation 392 | 393 | ## Usage in Code 394 | 395 | ### Basic Usage 396 | ```javascript 397 | import { getPromptManager } from '../prompt-manager.js'; 398 | 399 | const promptManager = getPromptManager(); 400 | const { systemPrompt, userPrompt, metadata } = promptManager.loadPrompt('add-task', { 401 | // Parameters matching the template's parameter definitions 402 | prompt: 'Create a user authentication system', 403 | newTaskId: 5, 404 | priority: 'high', 405 | useResearch: false 406 | }); 407 | 408 | // Use with AI service 409 | const result = await generateObjectService({ 410 | systemPrompt, 411 | prompt: userPrompt, 412 | // ... other AI parameters 413 | }); 414 | ``` 415 | 416 | ### With Variants 417 | ```javascript 418 | // Research variant will be selected automatically 419 | const { systemPrompt, userPrompt } = promptManager.loadPrompt('expand-task', { 420 | useResearch: true, // Triggers research variant 421 | task: taskObject, 422 | subtaskCount: 5 423 | }); 424 | ``` 425 | 426 | ### Error Handling 427 | ```javascript 428 | try { 429 | const result = promptManager.loadPrompt('invalid-template', {}); 430 | } catch (error) { 431 | if (error.message.includes('Schema validation failed')) { 432 | console.error('Template validation error:', error.message); 433 | } else if (error.message.includes('not found')) { 434 | console.error('Template not found:', error.message); 435 | } 436 | } 437 | ``` 438 | 439 | ## Adding New Prompts 440 | 441 | 1. **Create the JSON file** following the template structure 442 | 2. **Define parameters** with proper types, validation, and descriptions 443 | 3. **Create prompts** with clear system and user templates 444 | 4. **Use template variables** for dynamic content 445 | 5. **Add variants** if needed for different contexts 446 | 6. **Test thoroughly** with the PromptManager 447 | 7. **Update this documentation** with the new prompt details 448 | 449 | ### Example New Prompt 450 | ```json 451 | { 452 | "id": "new-feature", 453 | "version": "1.0.0", 454 | "description": "Generate code for a new feature", 455 | "parameters": { 456 | "featureName": { 457 | "type": "string", 458 | "required": true, 459 | "pattern": "^[a-zA-Z][a-zA-Z0-9-]*$", 460 | "description": "Name of the feature to implement" 461 | }, 462 | "complexity": { 463 | "type": "string", 464 | "required": false, 465 | "enum": ["simple", "medium", "complex"], 466 | "default": "medium", 467 | "description": "Feature complexity level" 468 | } 469 | }, 470 | "prompts": { 471 | "default": { 472 | "system": "You are a senior software engineer.", 473 | "user": "Create a {{complexity}} {{featureName}} feature." 474 | } 475 | } 476 | } 477 | ``` 478 | 479 | ## Best Practices 480 | 481 | ### Template Design 482 | 1. **Clear IDs**: Use kebab-case, descriptive identifiers 483 | 2. **Semantic Versioning**: Follow semver for version management 484 | 3. **Comprehensive Parameters**: Define all required and optional parameters 485 | 4. **Type Safety**: Use proper parameter types and validation 486 | 5. **Clear Descriptions**: Document what each prompt and parameter does 487 | 488 | ### Variable Usage 489 | 1. **Meaningful Names**: Use descriptive variable names 490 | 2. **Consistent Patterns**: Follow established naming conventions 491 | 3. **Safe Defaults**: Provide sensible default values 492 | 4. **Validation**: Use patterns, enums, and ranges for validation 493 | 494 | ### Variant Strategy 495 | 1. **Simple Conditions**: Keep variant conditions easy to understand 496 | 2. **Clear Purpose**: Each variant should have a distinct use case 497 | 3. **Fallback Logic**: Always provide a default variant 498 | 4. **Documentation**: Explain when each variant is used 499 | 500 | ### Performance 501 | 1. **Caching**: Templates are cached automatically 502 | 2. **Lazy Loading**: Templates load only when needed 503 | 3. **Minimal Variants**: Don't create unnecessary variants 504 | 4. **Efficient Conditions**: Keep condition evaluation fast 505 | 506 | ## Testing Prompts 507 | 508 | ### Validation Testing 509 | ```javascript 510 | // Test schema validation 511 | const promptManager = getPromptManager(); 512 | const results = promptManager.validateAllPrompts(); 513 | console.log(`Valid: ${results.valid.length}, Errors: ${results.errors.length}`); 514 | ``` 515 | 516 | ### Integration Testing 517 | When modifying prompts, ensure to test: 518 | - Variable substitution works with actual data structures 519 | - Variant selection triggers correctly based on conditions 520 | - AI responses remain consistent with expected behavior 521 | - All parameters are properly validated 522 | - Error handling works for invalid inputs 523 | 524 | ### Quick Testing 525 | ```javascript 526 | // Test prompt loading and variable substitution 527 | const promptManager = getPromptManager(); 528 | const result = promptManager.loadPrompt('research', { 529 | query: 'What are the latest React best practices?', 530 | detailLevel: 'medium', 531 | gatheredContext: 'React project with TypeScript' 532 | }); 533 | console.log('System:', result.systemPrompt); 534 | console.log('User:', result.userPrompt); 535 | console.log('Metadata:', result.metadata); 536 | ``` 537 | 538 | ### Testing Checklist 539 | - [ ] Template validates against schema 540 | - [ ] All required parameters are defined 541 | - [ ] Variable substitution works correctly 542 | - [ ] Variants trigger under correct conditions 543 | - [ ] Error messages are clear and helpful 544 | - [ ] Performance is acceptable for repeated usage 545 | 546 | ## Troubleshooting 547 | 548 | ### Common Issues 549 | 550 | **Schema Validation Errors**: 551 | - Check required fields are present 552 | - Verify parameter types match schema 553 | - Ensure version follows semantic versioning 554 | - Validate JSON syntax 555 | 556 | **Variable Substitution Problems**: 557 | - Check variable names match parameter names 558 | - Verify nested property access syntax 559 | - Ensure array iteration syntax is correct 560 | - Test with actual data structures 561 | 562 | **Variant Selection Issues**: 563 | - Verify condition syntax is valid JavaScript 564 | - Check parameter values match condition expectations 565 | - Ensure default variant exists 566 | - Test condition evaluation with debug logging 567 | 568 | **Performance Issues**: 569 | - Check for circular references in templates 570 | - Verify caching is working correctly 571 | - Monitor template loading frequency 572 | - Consider simplifying complex conditions 573 | ``` -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- ```markdown 1 | # Claude Code Instructions 2 | 3 | ## Task Master AI Instructions 4 | **Import Task Master's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.** 5 | @./.taskmaster/CLAUDE.md 6 | 7 | ## Changeset Guidelines 8 | 9 | - When creating changesets, remember that it's user-facing, meaning we don't have to get into the specifics of the code, but rather mention what the end-user is getting or fixing from this changeset. ``` -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- ```markdown 1 | # Contributing to Task Master 2 | 3 | Thank you for your interest in contributing to Task Master! We're excited to work with you and appreciate your help in making this project better. 🚀 4 | 5 | ## 🤝 Our Collaborative Approach 6 | 7 | We're a **PR-friendly team** that values collaboration: 8 | 9 | - ✅ **We review PRs quickly** - Usually within hours, not days 10 | - ✅ **We're super reactive** - Expect fast feedback and engagement 11 | - ✅ **We sometimes take over PRs** - If your contribution is valuable but needs cleanup, we might jump in to help finish it 12 | - ✅ **We're open to all contributions** - From bug fixes to major features 13 | 14 | **We don't mind AI-generated code**, but we do expect you to: 15 | 16 | - ✅ **Review and understand** what the AI generated 17 | - ✅ **Test the code thoroughly** before submitting 18 | - ✅ **Ensure it's well-written** and follows our patterns 19 | - ❌ **Don't submit "AI slop"** - untested, unreviewed AI output 20 | 21 | > **Why this matters**: We spend significant time reviewing PRs. Help us help you by submitting quality contributions that save everyone time! 22 | 23 | ## 🚀 Quick Start for Contributors 24 | 25 | ### 1. Fork and Clone 26 | 27 | ```bash 28 | git clone https://github.com/YOUR_USERNAME/claude-task-master.git 29 | cd claude-task-master 30 | npm install 31 | ``` 32 | 33 | ### 2. Create a Feature Branch 34 | 35 | **Important**: Always target the `next` branch, not `main`: 36 | 37 | ```bash 38 | git checkout next 39 | git pull origin next 40 | git checkout -b feature/your-feature-name 41 | ``` 42 | 43 | ### 3. Make Your Changes 44 | 45 | Follow our development guidelines below. 46 | 47 | ### 4. Test Everything Yourself 48 | 49 | **Before submitting your PR**, ensure: 50 | 51 | ```bash 52 | # Run all tests 53 | npm test 54 | 55 | # Check formatting 56 | npm run format-check 57 | 58 | # Fix formatting if needed 59 | npm run format 60 | ``` 61 | 62 | ### 5. Create a Changeset 63 | 64 | **Required for most changes**: 65 | 66 | ```bash 67 | npm run changeset 68 | ``` 69 | 70 | See the [Changeset Guidelines](#changeset-guidelines) below for details. 71 | 72 | ### 6. Submit Your PR 73 | 74 | - Target the `next` branch 75 | - Write a clear description 76 | - Reference any related issues 77 | 78 | ## 📋 Development Guidelines 79 | 80 | ### Branch Strategy 81 | 82 | - **`main`**: Production-ready code 83 | - **`next`**: Development branch - **target this for PRs** 84 | - **Feature branches**: `feature/description` or `fix/description` 85 | 86 | ### Code Quality Standards 87 | 88 | 1. **Write tests** for new functionality 89 | 2. **Follow existing patterns** in the codebase 90 | 3. **Add JSDoc comments** for functions 91 | 4. **Keep functions focused** and single-purpose 92 | 93 | ### Testing Requirements 94 | 95 | Your PR **must pass all CI checks**: 96 | 97 | - ✅ **Unit tests**: `npm test` 98 | - ✅ **Format check**: `npm run format-check` 99 | 100 | **Test your changes locally first** - this saves review time and shows you care about quality. 101 | 102 | ## 📦 Changeset Guidelines 103 | 104 | We use [Changesets](https://github.com/changesets/changesets) to manage versioning and generate changelogs. 105 | 106 | ### When to Create a Changeset 107 | 108 | **Always create a changeset for**: 109 | 110 | - ✅ New features 111 | - ✅ Bug fixes 112 | - ✅ Breaking changes 113 | - ✅ Performance improvements 114 | - ✅ User-facing documentation updates 115 | - ✅ Dependency updates that affect functionality 116 | 117 | **Skip changesets for**: 118 | 119 | - ❌ Internal documentation only 120 | - ❌ Test-only changes 121 | - ❌ Code formatting/linting 122 | - ❌ Development tooling that doesn't affect users 123 | 124 | ### How to Create a Changeset 125 | 126 | 1. **After making your changes**: 127 | 128 | ```bash 129 | npm run changeset 130 | ``` 131 | 132 | 2. **Choose the bump type**: 133 | 134 | - **Major**: Breaking changes 135 | - **Minor**: New features 136 | - **Patch**: Bug fixes, docs, performance improvements 137 | 138 | 3. **Write a clear summary**: 139 | 140 | ``` 141 | Add support for custom AI models in MCP configuration 142 | ``` 143 | 144 | 4. **Commit the changeset file** with your changes: 145 | ```bash 146 | git add .changeset/*.md 147 | git commit -m "feat: add custom AI model support" 148 | ``` 149 | 150 | ### Changeset vs Git Commit Messages 151 | 152 | - **Changeset summary**: User-facing, goes in CHANGELOG.md 153 | - **Git commit**: Developer-facing, explains the technical change 154 | 155 | Example: 156 | 157 | ```bash 158 | # Changeset summary (user-facing) 159 | "Add support for custom Ollama models" 160 | 161 | # Git commit message (developer-facing) 162 | "feat(models): implement custom Ollama model validation 163 | 164 | - Add model validation for custom Ollama endpoints 165 | - Update configuration schema to support custom models 166 | - Add tests for new validation logic" 167 | ``` 168 | 169 | ## 🔧 Development Setup 170 | 171 | ### Prerequisites 172 | 173 | - Node.js 18+ 174 | - npm or yarn 175 | 176 | ### Environment Setup 177 | 178 | 1. **Copy environment template**: 179 | 180 | ```bash 181 | cp .env.example .env 182 | ``` 183 | 184 | 2. **Add your API keys** (for testing AI features): 185 | ```bash 186 | ANTHROPIC_API_KEY=your_key_here 187 | OPENAI_API_KEY=your_key_here 188 | # Add others as needed 189 | ``` 190 | 191 | ### Running Tests 192 | 193 | ```bash 194 | # Run all tests 195 | npm test 196 | 197 | # Run tests in watch mode 198 | npm run test:watch 199 | 200 | # Run with coverage 201 | npm run test:coverage 202 | 203 | # Run E2E tests 204 | npm run test:e2e 205 | ``` 206 | 207 | ### Code Formatting 208 | 209 | We use Prettier for consistent formatting: 210 | 211 | ```bash 212 | # Check formatting 213 | npm run format-check 214 | 215 | # Fix formatting 216 | npm run format 217 | ``` 218 | 219 | ## 📝 PR Guidelines 220 | 221 | ### Before Submitting 222 | 223 | - [ ] **Target the `next` branch** 224 | - [ ] **Test everything locally** 225 | - [ ] **Run the full test suite** 226 | - [ ] **Check code formatting** 227 | - [ ] **Create a changeset** (if needed) 228 | - [ ] **Re-read your changes** - ensure they're clean and well-thought-out 229 | 230 | ### PR Description Template 231 | 232 | ```markdown 233 | ## Description 234 | 235 | Brief description of what this PR does. 236 | 237 | ## Type of Change 238 | 239 | - [ ] Bug fix 240 | - [ ] New feature 241 | - [ ] Breaking change 242 | - [ ] Documentation update 243 | 244 | ## Testing 245 | 246 | - [ ] I have tested this locally 247 | - [ ] All existing tests pass 248 | - [ ] I have added tests for new functionality 249 | 250 | ## Changeset 251 | 252 | - [ ] I have created a changeset (or this change doesn't need one) 253 | 254 | ## Additional Notes 255 | 256 | Any additional context or notes for reviewers. 257 | ``` 258 | 259 | ### What We Look For 260 | 261 | ✅ **Good PRs**: 262 | 263 | - Clear, focused changes 264 | - Comprehensive testing 265 | - Good commit messages 266 | - Proper changeset (when needed) 267 | - Self-reviewed code 268 | 269 | ❌ **Avoid**: 270 | 271 | - Massive PRs that change everything 272 | - Untested code 273 | - Formatting issues 274 | - Missing changesets for user-facing changes 275 | - AI-generated code that wasn't reviewed 276 | 277 | ## 🏗️ Project Structure 278 | 279 | ``` 280 | claude-task-master/ 281 | ├── bin/ # CLI executables 282 | ├── mcp-server/ # MCP server implementation 283 | ├── scripts/ # Core task management logic 284 | ├── src/ # Shared utilities and providers and well refactored code (we are slowly moving everything here) 285 | ├── tests/ # Test files 286 | ├── docs/ # Documentation 287 | └── .cursor/ # Cursor IDE rules and configuration 288 | └── assets/ # Assets like rules and configuration for all IDEs 289 | ``` 290 | 291 | ### Key Areas for Contribution 292 | 293 | - **CLI Commands**: `scripts/modules/commands.js` 294 | - **MCP Tools**: `mcp-server/src/tools/` 295 | - **Core Logic**: `scripts/modules/task-manager/` 296 | - **AI Providers**: `src/ai-providers/` 297 | - **Tests**: `tests/` 298 | 299 | ## 🐛 Reporting Issues 300 | 301 | ### Bug Reports 302 | 303 | Include: 304 | 305 | - Task Master version 306 | - Node.js version 307 | - Operating system 308 | - Steps to reproduce 309 | - Expected vs actual behavior 310 | - Error messages/logs 311 | 312 | ### Feature Requests 313 | 314 | Include: 315 | 316 | - Clear description of the feature 317 | - Use case/motivation 318 | - Proposed implementation (if you have ideas) 319 | - Willingness to contribute 320 | 321 | ## 💬 Getting Help 322 | 323 | - **Discord**: [Join our community](https://discord.gg/taskmasterai) 324 | - **Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) 325 | - **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) 326 | 327 | ## 📄 License 328 | 329 | By contributing, you agree that your contributions will be licensed under the same license as the project (MIT with Commons Clause). 330 | 331 | --- 332 | 333 | **Thank you for contributing to Task Master!** 🎉 334 | 335 | Your contributions help make AI-driven development more accessible and efficient for everyone. 336 | ``` -------------------------------------------------------------------------------- /.taskmaster/CLAUDE.md: -------------------------------------------------------------------------------- ```markdown 1 | # Task Master AI - Agent Integration Guide 2 | 3 | ## Essential Commands 4 | 5 | ### Core Workflow Commands 6 | 7 | ```bash 8 | # Project Setup 9 | task-master init # Initialize Task Master in current project 10 | task-master parse-prd .taskmaster/docs/prd.txt # Generate tasks from PRD document 11 | task-master models --setup # Configure AI models interactively 12 | 13 | # Daily Development Workflow 14 | task-master list # Show all tasks with status 15 | task-master next # Get next available task to work on 16 | task-master show <id> # View detailed task information (e.g., task-master show 1.2) 17 | task-master set-status --id=<id> --status=done # Mark task complete 18 | 19 | # Task Management 20 | task-master add-task --prompt="description" --research # Add new task with AI assistance 21 | task-master expand --id=<id> --research --force # Break task into subtasks 22 | task-master update-task --id=<id> --prompt="changes" # Update specific task 23 | task-master update --from=<id> --prompt="changes" # Update multiple tasks from ID onwards 24 | task-master update-subtask --id=<id> --prompt="notes" # Add implementation notes to subtask 25 | 26 | # Analysis & Planning 27 | task-master analyze-complexity --research # Analyze task complexity 28 | task-master complexity-report # View complexity analysis 29 | task-master expand --all --research # Expand all eligible tasks 30 | 31 | # Dependencies & Organization 32 | task-master add-dependency --id=<id> --depends-on=<id> # Add task dependency 33 | task-master move --from=<id> --to=<id> # Reorganize task hierarchy 34 | task-master validate-dependencies # Check for dependency issues 35 | task-master generate # Update task markdown files (usually auto-called) 36 | ``` 37 | 38 | ## Key Files & Project Structure 39 | 40 | ### Core Files 41 | 42 | - `.taskmaster/tasks/tasks.json` - Main task data file (auto-managed) 43 | - `.taskmaster/config.json` - AI model configuration (use `task-master models` to modify) 44 | - `.taskmaster/docs/prd.txt` - Product Requirements Document for parsing 45 | - `.taskmaster/tasks/*.txt` - Individual task files (auto-generated from tasks.json) 46 | - `.env` - API keys for CLI usage 47 | 48 | ### Claude Code Integration Files 49 | 50 | - `CLAUDE.md` - Auto-loaded context for Claude Code (this file) 51 | - `.claude/settings.json` - Claude Code tool allowlist and preferences 52 | - `.claude/commands/` - Custom slash commands for repeated workflows 53 | - `.mcp.json` - MCP server configuration (project-specific) 54 | 55 | ### Directory Structure 56 | 57 | ``` 58 | project/ 59 | ├── .taskmaster/ 60 | │ ├── tasks/ # Task files directory 61 | │ │ ├── tasks.json # Main task database 62 | │ │ ├── task-1.md # Individual task files 63 | │ │ └── task-2.md 64 | │ ├── docs/ # Documentation directory 65 | │ │ ├── prd.txt # Product requirements 66 | │ ├── reports/ # Analysis reports directory 67 | │ │ └── task-complexity-report.json 68 | │ ├── templates/ # Template files 69 | │ │ └── example_prd.txt # Example PRD template 70 | │ └── config.json # AI models & settings 71 | ├── .claude/ 72 | │ ├── settings.json # Claude Code configuration 73 | │ └── commands/ # Custom slash commands 74 | ├── .env # API keys 75 | ├── .mcp.json # MCP configuration 76 | └── CLAUDE.md # This file - auto-loaded by Claude Code 77 | ``` 78 | 79 | ## MCP Integration 80 | 81 | Task Master provides an MCP server that Claude Code can connect to. Configure in `.mcp.json`: 82 | 83 | ```json 84 | { 85 | "mcpServers": { 86 | "task-master-ai": { 87 | "command": "npx", 88 | "args": ["-y", "task-master-ai"], 89 | "env": { 90 | "ANTHROPIC_API_KEY": "your_key_here", 91 | "PERPLEXITY_API_KEY": "your_key_here", 92 | "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", 93 | "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", 94 | "XAI_API_KEY": "XAI_API_KEY_HERE", 95 | "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", 96 | "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", 97 | "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", 98 | "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE" 99 | } 100 | } 101 | } 102 | } 103 | ``` 104 | 105 | ### Essential MCP Tools 106 | 107 | ```javascript 108 | help; // = shows available taskmaster commands 109 | // Project setup 110 | initialize_project; // = task-master init 111 | parse_prd; // = task-master parse-prd 112 | 113 | // Daily workflow 114 | get_tasks; // = task-master list 115 | next_task; // = task-master next 116 | get_task; // = task-master show <id> 117 | set_task_status; // = task-master set-status 118 | 119 | // Task management 120 | add_task; // = task-master add-task 121 | expand_task; // = task-master expand 122 | update_task; // = task-master update-task 123 | update_subtask; // = task-master update-subtask 124 | update; // = task-master update 125 | 126 | // Analysis 127 | analyze_project_complexity; // = task-master analyze-complexity 128 | complexity_report; // = task-master complexity-report 129 | ``` 130 | 131 | ## Claude Code Workflow Integration 132 | 133 | ### Standard Development Workflow 134 | 135 | #### 1. Project Initialization 136 | 137 | ```bash 138 | # Initialize Task Master 139 | task-master init 140 | 141 | # Create or obtain PRD, then parse it 142 | task-master parse-prd .taskmaster/docs/prd.txt 143 | 144 | # Analyze complexity and expand tasks 145 | task-master analyze-complexity --research 146 | task-master expand --all --research 147 | ``` 148 | 149 | If tasks already exist, another PRD can be parsed (with new information only!) using parse-prd with --append flag. This will add the generated tasks to the existing list of tasks.. 150 | 151 | #### 2. Daily Development Loop 152 | 153 | ```bash 154 | # Start each session 155 | task-master next # Find next available task 156 | task-master show <id> # Review task details 157 | 158 | # During implementation, check in code context into the tasks and subtasks 159 | task-master update-subtask --id=<id> --prompt="implementation notes..." 160 | 161 | # Complete tasks 162 | task-master set-status --id=<id> --status=done 163 | ``` 164 | 165 | #### 3. Multi-Claude Workflows 166 | 167 | For complex projects, use multiple Claude Code sessions: 168 | 169 | ```bash 170 | # Terminal 1: Main implementation 171 | cd project && claude 172 | 173 | # Terminal 2: Testing and validation 174 | cd project-test-worktree && claude 175 | 176 | # Terminal 3: Documentation updates 177 | cd project-docs-worktree && claude 178 | ``` 179 | 180 | ### Custom Slash Commands 181 | 182 | Create `.claude/commands/taskmaster-next.md`: 183 | 184 | ```markdown 185 | Find the next available Task Master task and show its details. 186 | 187 | Steps: 188 | 189 | 1. Run `task-master next` to get the next task 190 | 2. If a task is available, run `task-master show <id>` for full details 191 | 3. Provide a summary of what needs to be implemented 192 | 4. Suggest the first implementation step 193 | ``` 194 | 195 | Create `.claude/commands/taskmaster-complete.md`: 196 | 197 | ```markdown 198 | Complete a Task Master task: $ARGUMENTS 199 | 200 | Steps: 201 | 202 | 1. Review the current task with `task-master show $ARGUMENTS` 203 | 2. Verify all implementation is complete 204 | 3. Run any tests related to this task 205 | 4. Mark as complete: `task-master set-status --id=$ARGUMENTS --status=done` 206 | 5. Show the next available task with `task-master next` 207 | ``` 208 | 209 | ## Tool Allowlist Recommendations 210 | 211 | Add to `.claude/settings.json`: 212 | 213 | ```json 214 | { 215 | "allowedTools": [ 216 | "Edit", 217 | "Bash(task-master *)", 218 | "Bash(git commit:*)", 219 | "Bash(git add:*)", 220 | "Bash(npm run *)", 221 | "mcp__task_master_ai__*" 222 | ] 223 | } 224 | ``` 225 | 226 | ## Configuration & Setup 227 | 228 | ### API Keys Required 229 | 230 | At least **one** of these API keys must be configured: 231 | 232 | - `ANTHROPIC_API_KEY` (Claude models) - **Recommended** 233 | - `PERPLEXITY_API_KEY` (Research features) - **Highly recommended** 234 | - `OPENAI_API_KEY` (GPT models) 235 | - `GOOGLE_API_KEY` (Gemini models) 236 | - `MISTRAL_API_KEY` (Mistral models) 237 | - `OPENROUTER_API_KEY` (Multiple models) 238 | - `XAI_API_KEY` (Grok models) 239 | 240 | An API key is required for any provider used across any of the 3 roles defined in the `models` command. 241 | 242 | ### Model Configuration 243 | 244 | ```bash 245 | # Interactive setup (recommended) 246 | task-master models --setup 247 | 248 | # Set specific models 249 | task-master models --set-main claude-3-5-sonnet-20241022 250 | task-master models --set-research perplexity-llama-3.1-sonar-large-128k-online 251 | task-master models --set-fallback gpt-4o-mini 252 | ``` 253 | 254 | ## Task Structure & IDs 255 | 256 | ### Task ID Format 257 | 258 | - Main tasks: `1`, `2`, `3`, etc. 259 | - Subtasks: `1.1`, `1.2`, `2.1`, etc. 260 | - Sub-subtasks: `1.1.1`, `1.1.2`, etc. 261 | 262 | ### Task Status Values 263 | 264 | - `pending` - Ready to work on 265 | - `in-progress` - Currently being worked on 266 | - `done` - Completed and verified 267 | - `deferred` - Postponed 268 | - `cancelled` - No longer needed 269 | - `blocked` - Waiting on external factors 270 | 271 | ### Task Fields 272 | 273 | ```json 274 | { 275 | "id": "1.2", 276 | "title": "Implement user authentication", 277 | "description": "Set up JWT-based auth system", 278 | "status": "pending", 279 | "priority": "high", 280 | "dependencies": ["1.1"], 281 | "details": "Use bcrypt for hashing, JWT for tokens...", 282 | "testStrategy": "Unit tests for auth functions, integration tests for login flow", 283 | "subtasks": [] 284 | } 285 | ``` 286 | 287 | ## Claude Code Best Practices with Task Master 288 | 289 | ### Context Management 290 | 291 | - Use `/clear` between different tasks to maintain focus 292 | - This CLAUDE.md file is automatically loaded for context 293 | - Use `task-master show <id>` to pull specific task context when needed 294 | 295 | ### Iterative Implementation 296 | 297 | 1. `task-master show <subtask-id>` - Understand requirements 298 | 2. Explore codebase and plan implementation 299 | 3. `task-master update-subtask --id=<id> --prompt="detailed plan"` - Log plan 300 | 4. `task-master set-status --id=<id> --status=in-progress` - Start work 301 | 5. Implement code following logged plan 302 | 6. `task-master update-subtask --id=<id> --prompt="what worked/didn't work"` - Log progress 303 | 7. `task-master set-status --id=<id> --status=done` - Complete task 304 | 305 | ### Complex Workflows with Checklists 306 | 307 | For large migrations or multi-step processes: 308 | 309 | 1. Create a markdown PRD file describing the new changes: `touch task-migration-checklist.md` (prds can be .txt or .md) 310 | 2. Use Taskmaster to parse the new prd with `task-master parse-prd --append` (also available in MCP) 311 | 3. Use Taskmaster to expand the newly generated tasks into subtasks. Consdier using `analyze-complexity` with the correct --to and --from IDs (the new ids) to identify the ideal subtask amounts for each task. Then expand them. 312 | 4. Work through items systematically, checking them off as completed 313 | 5. Use `task-master update-subtask` to log progress on each task/subtask and/or updating/researching them before/during implementation if getting stuck 314 | 315 | ### Git Integration 316 | 317 | Task Master works well with `gh` CLI: 318 | 319 | ```bash 320 | # Create PR for completed task 321 | gh pr create --title "Complete task 1.2: User authentication" --body "Implements JWT auth system as specified in task 1.2" 322 | 323 | # Reference task in commits 324 | git commit -m "feat: implement JWT auth (task 1.2)" 325 | ``` 326 | 327 | ### Parallel Development with Git Worktrees 328 | 329 | ```bash 330 | # Create worktrees for parallel task development 331 | git worktree add ../project-auth feature/auth-system 332 | git worktree add ../project-api feature/api-refactor 333 | 334 | # Run Claude Code in each worktree 335 | cd ../project-auth && claude # Terminal 1: Auth work 336 | cd ../project-api && claude # Terminal 2: API work 337 | ``` 338 | 339 | ## Troubleshooting 340 | 341 | ### AI Commands Failing 342 | 343 | ```bash 344 | # Check API keys are configured 345 | cat .env # For CLI usage 346 | 347 | # Verify model configuration 348 | task-master models 349 | 350 | # Test with different model 351 | task-master models --set-fallback gpt-4o-mini 352 | ``` 353 | 354 | ### MCP Connection Issues 355 | 356 | - Check `.mcp.json` configuration 357 | - Verify Node.js installation 358 | - Use `--mcp-debug` flag when starting Claude Code 359 | - Use CLI as fallback if MCP unavailable 360 | 361 | ### Task File Sync Issues 362 | 363 | ```bash 364 | # Regenerate task files from tasks.json 365 | task-master generate 366 | 367 | # Fix dependency issues 368 | task-master fix-dependencies 369 | ``` 370 | 371 | DO NOT RE-INITIALIZE. That will not do anything beyond re-adding the same Taskmaster core files. 372 | 373 | ## Important Notes 374 | 375 | ### AI-Powered Operations 376 | 377 | These commands make AI calls and may take up to a minute: 378 | 379 | - `parse_prd` / `task-master parse-prd` 380 | - `analyze_project_complexity` / `task-master analyze-complexity` 381 | - `expand_task` / `task-master expand` 382 | - `expand_all` / `task-master expand --all` 383 | - `add_task` / `task-master add-task` 384 | - `update` / `task-master update` 385 | - `update_task` / `task-master update-task` 386 | - `update_subtask` / `task-master update-subtask` 387 | 388 | ### File Management 389 | 390 | - Never manually edit `tasks.json` - use commands instead 391 | - Never manually edit `.taskmaster/config.json` - use `task-master models` 392 | - Task markdown files in `tasks/` are auto-generated 393 | - Run `task-master generate` after manual changes to tasks.json 394 | 395 | ### Claude Code Session Management 396 | 397 | - Use `/clear` frequently to maintain focused context 398 | - Create custom slash commands for repeated Task Master workflows 399 | - Configure tool allowlist to streamline permissions 400 | - Use headless mode for automation: `claude -p "task-master next"` 401 | 402 | ### Multi-Task Updates 403 | 404 | - Use `update --from=<id>` to update multiple future tasks 405 | - Use `update-task --id=<id>` for single task updates 406 | - Use `update-subtask --id=<id>` for implementation logging 407 | 408 | ### Research Mode 409 | 410 | - Add `--research` flag for research-based AI enhancement 411 | - Requires a research model API key like Perplexity (`PERPLEXITY_API_KEY`) in environment 412 | - Provides more informed task creation and updates 413 | - Recommended for complex technical tasks 414 | 415 | --- 416 | 417 | _This guide ensures Claude Code has immediate access to Task Master's essential functionality for agentic development workflows._ 418 | ``` -------------------------------------------------------------------------------- /assets/AGENTS.md: -------------------------------------------------------------------------------- ```markdown 1 | # Task Master AI - Agent Integration Guide 2 | 3 | ## Essential Commands 4 | 5 | ### Core Workflow Commands 6 | 7 | ```bash 8 | # Project Setup 9 | task-master init # Initialize Task Master in current project 10 | task-master parse-prd .taskmaster/docs/prd.txt # Generate tasks from PRD document 11 | task-master models --setup # Configure AI models interactively 12 | 13 | # Daily Development Workflow 14 | task-master list # Show all tasks with status 15 | task-master next # Get next available task to work on 16 | task-master show <id> # View detailed task information (e.g., task-master show 1.2) 17 | task-master set-status --id=<id> --status=done # Mark task complete 18 | 19 | # Task Management 20 | task-master add-task --prompt="description" --research # Add new task with AI assistance 21 | task-master expand --id=<id> --research --force # Break task into subtasks 22 | task-master update-task --id=<id> --prompt="changes" # Update specific task 23 | task-master update --from=<id> --prompt="changes" # Update multiple tasks from ID onwards 24 | task-master update-subtask --id=<id> --prompt="notes" # Add implementation notes to subtask 25 | 26 | # Analysis & Planning 27 | task-master analyze-complexity --research # Analyze task complexity 28 | task-master complexity-report # View complexity analysis 29 | task-master expand --all --research # Expand all eligible tasks 30 | 31 | # Dependencies & Organization 32 | task-master add-dependency --id=<id> --depends-on=<id> # Add task dependency 33 | task-master move --from=<id> --to=<id> # Reorganize task hierarchy 34 | task-master validate-dependencies # Check for dependency issues 35 | task-master generate # Update task markdown files (usually auto-called) 36 | ``` 37 | 38 | ## Key Files & Project Structure 39 | 40 | ### Core Files 41 | 42 | - `.taskmaster/tasks/tasks.json` - Main task data file (auto-managed) 43 | - `.taskmaster/config.json` - AI model configuration (use `task-master models` to modify) 44 | - `.taskmaster/docs/prd.txt` - Product Requirements Document for parsing 45 | - `.taskmaster/tasks/*.txt` - Individual task files (auto-generated from tasks.json) 46 | - `.env` - API keys for CLI usage 47 | 48 | ### Claude Code Integration Files 49 | 50 | - `CLAUDE.md` - Auto-loaded context for Claude Code (this file) 51 | - `.claude/settings.json` - Claude Code tool allowlist and preferences 52 | - `.claude/commands/` - Custom slash commands for repeated workflows 53 | - `.mcp.json` - MCP server configuration (project-specific) 54 | 55 | ### Directory Structure 56 | 57 | ``` 58 | project/ 59 | ├── .taskmaster/ 60 | │ ├── tasks/ # Task files directory 61 | │ │ ├── tasks.json # Main task database 62 | │ │ ├── task-1.md # Individual task files 63 | │ │ └── task-2.md 64 | │ ├── docs/ # Documentation directory 65 | │ │ ├── prd.txt # Product requirements 66 | │ ├── reports/ # Analysis reports directory 67 | │ │ └── task-complexity-report.json 68 | │ ├── templates/ # Template files 69 | │ │ └── example_prd.txt # Example PRD template 70 | │ └── config.json # AI models & settings 71 | ├── .claude/ 72 | │ ├── settings.json # Claude Code configuration 73 | │ └── commands/ # Custom slash commands 74 | ├── .env # API keys 75 | ├── .mcp.json # MCP configuration 76 | └── CLAUDE.md # This file - auto-loaded by Claude Code 77 | ``` 78 | 79 | ## MCP Integration 80 | 81 | Task Master provides an MCP server that Claude Code can connect to. Configure in `.mcp.json`: 82 | 83 | ```json 84 | { 85 | "mcpServers": { 86 | "task-master-ai": { 87 | "command": "npx", 88 | "args": ["-y", "task-master-ai"], 89 | "env": { 90 | "ANTHROPIC_API_KEY": "your_key_here", 91 | "PERPLEXITY_API_KEY": "your_key_here", 92 | "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", 93 | "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", 94 | "XAI_API_KEY": "XAI_API_KEY_HERE", 95 | "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", 96 | "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", 97 | "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", 98 | "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE" 99 | } 100 | } 101 | } 102 | } 103 | ``` 104 | 105 | ### Essential MCP Tools 106 | 107 | ```javascript 108 | help; // = shows available taskmaster commands 109 | // Project setup 110 | initialize_project; // = task-master init 111 | parse_prd; // = task-master parse-prd 112 | 113 | // Daily workflow 114 | get_tasks; // = task-master list 115 | next_task; // = task-master next 116 | get_task; // = task-master show <id> 117 | set_task_status; // = task-master set-status 118 | 119 | // Task management 120 | add_task; // = task-master add-task 121 | expand_task; // = task-master expand 122 | update_task; // = task-master update-task 123 | update_subtask; // = task-master update-subtask 124 | update; // = task-master update 125 | 126 | // Analysis 127 | analyze_project_complexity; // = task-master analyze-complexity 128 | complexity_report; // = task-master complexity-report 129 | ``` 130 | 131 | ## Claude Code Workflow Integration 132 | 133 | ### Standard Development Workflow 134 | 135 | #### 1. Project Initialization 136 | 137 | ```bash 138 | # Initialize Task Master 139 | task-master init 140 | 141 | # Create or obtain PRD, then parse it 142 | task-master parse-prd .taskmaster/docs/prd.txt 143 | 144 | # Analyze complexity and expand tasks 145 | task-master analyze-complexity --research 146 | task-master expand --all --research 147 | ``` 148 | 149 | If tasks already exist, another PRD can be parsed (with new information only!) using parse-prd with --append flag. This will add the generated tasks to the existing list of tasks.. 150 | 151 | #### 2. Daily Development Loop 152 | 153 | ```bash 154 | # Start each session 155 | task-master next # Find next available task 156 | task-master show <id> # Review task details 157 | 158 | # During implementation, check in code context into the tasks and subtasks 159 | task-master update-subtask --id=<id> --prompt="implementation notes..." 160 | 161 | # Complete tasks 162 | task-master set-status --id=<id> --status=done 163 | ``` 164 | 165 | #### 3. Multi-Claude Workflows 166 | 167 | For complex projects, use multiple Claude Code sessions: 168 | 169 | ```bash 170 | # Terminal 1: Main implementation 171 | cd project && claude 172 | 173 | # Terminal 2: Testing and validation 174 | cd project-test-worktree && claude 175 | 176 | # Terminal 3: Documentation updates 177 | cd project-docs-worktree && claude 178 | ``` 179 | 180 | ### Custom Slash Commands 181 | 182 | Create `.claude/commands/taskmaster-next.md`: 183 | 184 | ```markdown 185 | Find the next available Task Master task and show its details. 186 | 187 | Steps: 188 | 189 | 1. Run `task-master next` to get the next task 190 | 2. If a task is available, run `task-master show <id>` for full details 191 | 3. Provide a summary of what needs to be implemented 192 | 4. Suggest the first implementation step 193 | ``` 194 | 195 | Create `.claude/commands/taskmaster-complete.md`: 196 | 197 | ```markdown 198 | Complete a Task Master task: $ARGUMENTS 199 | 200 | Steps: 201 | 202 | 1. Review the current task with `task-master show $ARGUMENTS` 203 | 2. Verify all implementation is complete 204 | 3. Run any tests related to this task 205 | 4. Mark as complete: `task-master set-status --id=$ARGUMENTS --status=done` 206 | 5. Show the next available task with `task-master next` 207 | ``` 208 | 209 | ## Tool Allowlist Recommendations 210 | 211 | Add to `.claude/settings.json`: 212 | 213 | ```json 214 | { 215 | "allowedTools": [ 216 | "Edit", 217 | "Bash(task-master *)", 218 | "Bash(git commit:*)", 219 | "Bash(git add:*)", 220 | "Bash(npm run *)", 221 | "mcp__task_master_ai__*" 222 | ] 223 | } 224 | ``` 225 | 226 | ## Configuration & Setup 227 | 228 | ### API Keys Required 229 | 230 | At least **one** of these API keys must be configured: 231 | 232 | - `ANTHROPIC_API_KEY` (Claude models) - **Recommended** 233 | - `PERPLEXITY_API_KEY` (Research features) - **Highly recommended** 234 | - `OPENAI_API_KEY` (GPT models) 235 | - `GOOGLE_API_KEY` (Gemini models) 236 | - `MISTRAL_API_KEY` (Mistral models) 237 | - `OPENROUTER_API_KEY` (Multiple models) 238 | - `XAI_API_KEY` (Grok models) 239 | 240 | An API key is required for any provider used across any of the 3 roles defined in the `models` command. 241 | 242 | ### Model Configuration 243 | 244 | ```bash 245 | # Interactive setup (recommended) 246 | task-master models --setup 247 | 248 | # Set specific models 249 | task-master models --set-main claude-3-5-sonnet-20241022 250 | task-master models --set-research perplexity-llama-3.1-sonar-large-128k-online 251 | task-master models --set-fallback gpt-4o-mini 252 | ``` 253 | 254 | ## Task Structure & IDs 255 | 256 | ### Task ID Format 257 | 258 | - Main tasks: `1`, `2`, `3`, etc. 259 | - Subtasks: `1.1`, `1.2`, `2.1`, etc. 260 | - Sub-subtasks: `1.1.1`, `1.1.2`, etc. 261 | 262 | ### Task Status Values 263 | 264 | - `pending` - Ready to work on 265 | - `in-progress` - Currently being worked on 266 | - `done` - Completed and verified 267 | - `deferred` - Postponed 268 | - `cancelled` - No longer needed 269 | - `blocked` - Waiting on external factors 270 | 271 | ### Task Fields 272 | 273 | ```json 274 | { 275 | "id": "1.2", 276 | "title": "Implement user authentication", 277 | "description": "Set up JWT-based auth system", 278 | "status": "pending", 279 | "priority": "high", 280 | "dependencies": ["1.1"], 281 | "details": "Use bcrypt for hashing, JWT for tokens...", 282 | "testStrategy": "Unit tests for auth functions, integration tests for login flow", 283 | "subtasks": [] 284 | } 285 | ``` 286 | 287 | ## Claude Code Best Practices with Task Master 288 | 289 | ### Context Management 290 | 291 | - Use `/clear` between different tasks to maintain focus 292 | - This CLAUDE.md file is automatically loaded for context 293 | - Use `task-master show <id>` to pull specific task context when needed 294 | 295 | ### Iterative Implementation 296 | 297 | 1. `task-master show <subtask-id>` - Understand requirements 298 | 2. Explore codebase and plan implementation 299 | 3. `task-master update-subtask --id=<id> --prompt="detailed plan"` - Log plan 300 | 4. `task-master set-status --id=<id> --status=in-progress` - Start work 301 | 5. Implement code following logged plan 302 | 6. `task-master update-subtask --id=<id> --prompt="what worked/didn't work"` - Log progress 303 | 7. `task-master set-status --id=<id> --status=done` - Complete task 304 | 305 | ### Complex Workflows with Checklists 306 | 307 | For large migrations or multi-step processes: 308 | 309 | 1. Create a markdown PRD file describing the new changes: `touch task-migration-checklist.md` (prds can be .txt or .md) 310 | 2. Use Taskmaster to parse the new prd with `task-master parse-prd --append` (also available in MCP) 311 | 3. Use Taskmaster to expand the newly generated tasks into subtasks. Consdier using `analyze-complexity` with the correct --to and --from IDs (the new ids) to identify the ideal subtask amounts for each task. Then expand them. 312 | 4. Work through items systematically, checking them off as completed 313 | 5. Use `task-master update-subtask` to log progress on each task/subtask and/or updating/researching them before/during implementation if getting stuck 314 | 315 | ### Git Integration 316 | 317 | Task Master works well with `gh` CLI: 318 | 319 | ```bash 320 | # Create PR for completed task 321 | gh pr create --title "Complete task 1.2: User authentication" --body "Implements JWT auth system as specified in task 1.2" 322 | 323 | # Reference task in commits 324 | git commit -m "feat: implement JWT auth (task 1.2)" 325 | ``` 326 | 327 | ### Parallel Development with Git Worktrees 328 | 329 | ```bash 330 | # Create worktrees for parallel task development 331 | git worktree add ../project-auth feature/auth-system 332 | git worktree add ../project-api feature/api-refactor 333 | 334 | # Run Claude Code in each worktree 335 | cd ../project-auth && claude # Terminal 1: Auth work 336 | cd ../project-api && claude # Terminal 2: API work 337 | ``` 338 | 339 | ## Troubleshooting 340 | 341 | ### AI Commands Failing 342 | 343 | ```bash 344 | # Check API keys are configured 345 | cat .env # For CLI usage 346 | 347 | # Verify model configuration 348 | task-master models 349 | 350 | # Test with different model 351 | task-master models --set-fallback gpt-4o-mini 352 | ``` 353 | 354 | ### MCP Connection Issues 355 | 356 | - Check `.mcp.json` configuration 357 | - Verify Node.js installation 358 | - Use `--mcp-debug` flag when starting Claude Code 359 | - Use CLI as fallback if MCP unavailable 360 | 361 | ### Task File Sync Issues 362 | 363 | ```bash 364 | # Regenerate task files from tasks.json 365 | task-master generate 366 | 367 | # Fix dependency issues 368 | task-master fix-dependencies 369 | ``` 370 | 371 | DO NOT RE-INITIALIZE. That will not do anything beyond re-adding the same Taskmaster core files. 372 | 373 | ## Important Notes 374 | 375 | ### AI-Powered Operations 376 | 377 | These commands make AI calls and may take up to a minute: 378 | 379 | - `parse_prd` / `task-master parse-prd` 380 | - `analyze_project_complexity` / `task-master analyze-complexity` 381 | - `expand_task` / `task-master expand` 382 | - `expand_all` / `task-master expand --all` 383 | - `add_task` / `task-master add-task` 384 | - `update` / `task-master update` 385 | - `update_task` / `task-master update-task` 386 | - `update_subtask` / `task-master update-subtask` 387 | 388 | ### File Management 389 | 390 | - Never manually edit `tasks.json` - use commands instead 391 | - Never manually edit `.taskmaster/config.json` - use `task-master models` 392 | - Task markdown files in `tasks/` are auto-generated 393 | - Run `task-master generate` after manual changes to tasks.json 394 | 395 | ### Claude Code Session Management 396 | 397 | - Use `/clear` frequently to maintain focused context 398 | - Create custom slash commands for repeated Task Master workflows 399 | - Configure tool allowlist to streamline permissions 400 | - Use headless mode for automation: `claude -p "task-master next"` 401 | 402 | ### Multi-Task Updates 403 | 404 | - Use `update --from=<id>` to update multiple future tasks 405 | - Use `update-task --id=<id>` for single task updates 406 | - Use `update-subtask --id=<id>` for implementation logging 407 | 408 | ### Research Mode 409 | 410 | - Add `--research` flag for research-based AI enhancement 411 | - Requires a research model API key like Perplexity (`PERPLEXITY_API_KEY`) in environment 412 | - Provides more informed task creation and updates 413 | - Recommended for complex technical tasks 414 | 415 | --- 416 | 417 | _This guide ensures Claude Code has immediate access to Task Master's essential functionality for agentic development workflows._ 418 | ``` -------------------------------------------------------------------------------- /test-tag-functions.js: -------------------------------------------------------------------------------- ```javascript 1 | ``` -------------------------------------------------------------------------------- /apps/extension/src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | console.log('hello world'); 2 | ``` -------------------------------------------------------------------------------- /packages/build-config/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown 1 | # @tm/build-config 2 | 3 | ## null 4 | 5 | ## 1.0.1 6 | ``` -------------------------------------------------------------------------------- /apps/docs/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown 1 | # docs 2 | 3 | ## 0.0.4 4 | 5 | ## 0.0.3 6 | 7 | ## 0.0.2 8 | 9 | ## 0.0.1 10 | ``` -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "recommendations": ["esbenp.prettier-vscode"] 3 | } 4 | ``` -------------------------------------------------------------------------------- /output.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "key": "value", 3 | "nested": { 4 | "prop": true 5 | } 6 | } 7 | ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/moving-forward.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: Moving Forward 3 | sidebarTitle: "Moving Forward" 4 | --- ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/rules-quick.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: Rules and Context 3 | sidebarTitle: "Rules and Context" 4 | --- ``` -------------------------------------------------------------------------------- /packages/tm-core/src/clients/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Client exports 3 | */ 4 | 5 | export { SupabaseAuthClient } from './supabase-client.js'; 6 | ``` -------------------------------------------------------------------------------- /apps/docs/whats-new.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: "What's New" 3 | sidebarTitle: "What's New" 4 | --- 5 | 6 | An easy way to see the latest releases ``` -------------------------------------------------------------------------------- /scripts/modules/task-manager/parse-prd/index.js: -------------------------------------------------------------------------------- ```javascript 1 | // Main entry point for parse-prd module 2 | export { default } from './parse-prd.js'; 3 | export { default as parsePRD } from './parse-prd.js'; 4 | ``` -------------------------------------------------------------------------------- /apps/extension/src/lib/utils.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | ``` -------------------------------------------------------------------------------- /tests/fixture/test-tasks.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "tasks": [ 3 | { 4 | "id": 1, 5 | "dependencies": [], 6 | "subtasks": [ 7 | { 8 | "id": 1, 9 | "dependencies": [] 10 | } 11 | ] 12 | } 13 | ] 14 | } ``` -------------------------------------------------------------------------------- /.taskmaster/docs/test-prd.txt: -------------------------------------------------------------------------------- ``` 1 | Simple Todo App PRD 2 | 3 | Create a basic todo list application with the following features: 4 | 1. Add new todos 5 | 2. Mark todos as complete 6 | 3. Delete todos 7 | 8 | That's it. Keep it simple. ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Main UI exports 3 | */ 4 | 5 | // Export all components 6 | export * from './components/index.js'; 7 | 8 | // Re-export existing UI utilities 9 | export * from '../utils/ui.js'; 10 | ``` -------------------------------------------------------------------------------- /.taskmaster/state.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "currentTag": "master", 3 | "lastSwitched": "2025-09-12T22:25:27.535Z", 4 | "branchTagMapping": { 5 | "v017-adds": "v017-adds", 6 | "next": "next" 7 | }, 8 | "migrationNoticeShown": true 9 | } 10 | ``` -------------------------------------------------------------------------------- /apps/docs/best-practices/index.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: Intro to Advanced Usage 3 | sidebarTitle: "Advanced Usage" 4 | --- 5 | 6 | # Best Practices 7 | 8 | Explore advanced tips, recommended workflows, and best practices for getting the most out of Task Master. ``` -------------------------------------------------------------------------------- /packages/tm-core/src/providers/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Barrel export for provider modules 3 | */ 4 | 5 | // Export all from AI module 6 | export * from './ai/index.js'; 7 | 8 | // Storage providers will be exported here when implemented 9 | // export * from './storage/index.js'; 10 | ``` -------------------------------------------------------------------------------- /apps/docs/vercel.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "rewrites": [ 3 | { 4 | "source": "/", 5 | "destination": "https://taskmaster-49ce32d5.mintlify.dev/docs" 6 | }, 7 | { 8 | "source": "/:match*", 9 | "destination": "https://taskmaster-49ce32d5.mintlify.dev/docs/:match*" 10 | } 11 | ] 12 | } 13 | ``` -------------------------------------------------------------------------------- /apps/docs/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "docs", 3 | "version": "0.0.4", 4 | "private": true, 5 | "description": "Task Master documentation powered by Mintlify", 6 | "scripts": { 7 | "dev": "mintlify dev", 8 | "preview": "mintlify preview" 9 | }, 10 | "devDependencies": { 11 | "mintlify": "^4.2.111" 12 | } 13 | } 14 | ``` -------------------------------------------------------------------------------- /scripts/modules/index.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * index.js 3 | * Main export point for all Task Master CLI modules 4 | */ 5 | 6 | // Export all modules 7 | export * from './ui.js'; 8 | export * from './utils.js'; 9 | export * from './commands.js'; 10 | export * from './task-manager.js'; 11 | export * from './prompt-manager.js'; 12 | ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/components/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview UI components exports 3 | */ 4 | 5 | export * from './header.component.js'; 6 | export * from './dashboard.component.js'; 7 | export * from './next-task.component.js'; 8 | export * from './suggested-steps.component.js'; 9 | export * from './task-detail.component.js'; 10 | ``` -------------------------------------------------------------------------------- /test-prd.txt: -------------------------------------------------------------------------------- ``` 1 | # Test PRD 2 | 3 | ## Project Overview 4 | This is a simple test project to verify parse-prd functionality. 5 | 6 | ## Features 7 | - Feature A: Basic setup 8 | - Feature B: Core functionality 9 | - Feature C: Testing 10 | 11 | ## Requirements 12 | - Use Node.js 13 | - Include basic tests 14 | - Simple CLI interface ``` -------------------------------------------------------------------------------- /packages/tm-core/src/types/legacy.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Legacy type definitions for backwards compatibility 3 | * These types are deprecated and will be removed in future versions 4 | */ 5 | 6 | /** 7 | * @deprecated Use string directly instead. This will be removed in a future version. 8 | */ 9 | export type TaskId = string; 10 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/services/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Services module exports 3 | * Provides business logic and service layer functionality 4 | */ 5 | 6 | export { TaskService } from './task-service.js'; 7 | export { OrganizationService } from './organization.service.js'; 8 | export type { Organization, Brief } from './organization.service.js'; 9 | ``` -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "$schema": "https://unpkg.com/@changesets/[email protected]/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { 6 | "repo": "eyaltoledano/claude-task-master" 7 | } 8 | ], 9 | "commit": false, 10 | "fixed": [], 11 | "access": "public", 12 | "baseBranch": "main", 13 | "ignore": [ 14 | "docs" 15 | ] 16 | } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/logger/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Logger package for Task Master 3 | * Provides centralized logging with support for different modes and levels 4 | */ 5 | 6 | export { Logger, LogLevel } from './logger.js'; 7 | export type { LoggerConfig } from './logger.js'; 8 | export { createLogger, getLogger, setGlobalLogger } from './factory.js'; 9 | ``` -------------------------------------------------------------------------------- /src/constants/commands.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * Command related constants 3 | * Defines which commands trigger AI processing 4 | */ 5 | 6 | // Command names that trigger AI processing 7 | export const AI_COMMAND_NAMES = [ 8 | 'add-task', 9 | 'analyze-complexity', 10 | 'expand-task', 11 | 'parse-prd', 12 | 'research', 13 | 'research-save', 14 | 'update-subtask', 15 | 'update-task', 16 | 'update-tasks' 17 | ]; 18 | ``` -------------------------------------------------------------------------------- /src/profiles/trae.js: -------------------------------------------------------------------------------- ```javascript 1 | // Trae conversion profile for rule-transformer 2 | import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; 3 | 4 | // Create and export trae profile using the base factory 5 | export const traeProfile = createProfile({ 6 | name: 'trae', 7 | displayName: 'Trae', 8 | url: 'trae.ai', 9 | docsUrl: 'docs.trae.ai', 10 | mcpConfig: false 11 | }); 12 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/executors/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Public API for the executors module 3 | */ 4 | 5 | export * from './types.js'; 6 | export { BaseExecutor } from './base-executor.js'; 7 | export { ClaudeExecutor } from './claude-executor.js'; 8 | export { ExecutorFactory } from './executor-factory.js'; 9 | export { 10 | ExecutorService, 11 | type ExecutorServiceOptions 12 | } from './executor-service.js'; 13 | ``` -------------------------------------------------------------------------------- /src/profiles/windsurf.js: -------------------------------------------------------------------------------- ```javascript 1 | // Windsurf conversion profile for rule-transformer 2 | import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; 3 | 4 | // Create and export windsurf profile using the base factory 5 | export const windsurfProfile = createProfile({ 6 | name: 'windsurf', 7 | displayName: 'Windsurf', 8 | url: 'windsurf.com', 9 | docsUrl: 'docs.windsurf.com' 10 | }); 11 | ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/faq.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: FAQ 3 | sidebarTitle: "FAQ" 4 | --- 5 | 6 | Coming soon. 7 | 8 | ## 💬 Getting Help 9 | 10 | - **Discord**: [Join our community](https://discord.gg/taskmasterai) 11 | - **Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) 12 | - **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) ``` -------------------------------------------------------------------------------- /src/utils/getVersion.js: -------------------------------------------------------------------------------- ```javascript 1 | import packageJson from '../../package.json' with { type: 'json' }; 2 | 3 | /** 4 | * Reads the version from the nearest package.json relative to this file. 5 | * Returns 'unknown' if not found or on error. 6 | * @returns {string} The version string or 'unknown'. 7 | */ 8 | export function getTaskMasterVersion() { 9 | return packageJson.version || 'unknown'; 10 | } 11 | ``` -------------------------------------------------------------------------------- /apps/docs/style.css: -------------------------------------------------------------------------------- ```css 1 | /* 2 | * This file is used to override the default logo style of the docs theme. 3 | * It is not used for the actual documentation content. 4 | */ 5 | 6 | #navbar img { 7 | height: auto !important; /* Let intrinsic SVG size determine height */ 8 | width: 200px !important; /* Control width */ 9 | margin-top: 5px !important; /* Add some space above the logo */ 10 | } 11 | ``` -------------------------------------------------------------------------------- /apps/extension/components.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/webview/index.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib" 16 | }, 17 | "iconLibrary": "lucide-react" 18 | } 19 | ``` -------------------------------------------------------------------------------- /src/utils/format.js: -------------------------------------------------------------------------------- ```javascript 1 | // src/utils/format.js 2 | 3 | /** 4 | * Formats elapsed time as 0m 00s. 5 | * @param {number} seconds - Elapsed time in seconds 6 | * @returns {string} Formatted time string 7 | */ 8 | export function formatElapsedTime(seconds) { 9 | const minutes = Math.floor(seconds / 60); 10 | const remainingSeconds = Math.floor(seconds % 60); 11 | return `${minutes}m ${remainingSeconds.toString().padStart(2, '0')}s`; 12 | } 13 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/storage/file-storage/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Exports for file storage components 3 | */ 4 | 5 | export { 6 | FormatHandler, 7 | type FileStorageData, 8 | type FileFormat 9 | } from './format-handler.js'; 10 | export { FileOperations } from './file-operations.js'; 11 | export { PathResolver } from './path-resolver.js'; 12 | 13 | // Main FileStorage class - primary export 14 | export { FileStorage as default, FileStorage } from './file-storage.js'; 15 | ``` -------------------------------------------------------------------------------- /src/profiles/cline.js: -------------------------------------------------------------------------------- ```javascript 1 | // Cline conversion profile for rule-transformer 2 | import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; 3 | 4 | // Create and export cline profile using the base factory 5 | export const clineProfile = createProfile({ 6 | name: 'cline', 7 | displayName: 'Cline', 8 | url: 'cline.bot', 9 | docsUrl: 'docs.cline.bot', 10 | profileDir: '.clinerules', 11 | rulesDir: '.clinerules', 12 | mcpConfig: false 13 | }); 14 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/sidebar.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import { SidebarView } from './components/SidebarView'; 4 | 5 | const rootElement = document.getElementById('root'); 6 | 7 | if (!rootElement) { 8 | console.error('Sidebar: Root element not found'); 9 | } else { 10 | const root = ReactDOM.createRoot(rootElement); 11 | root.render( 12 | <React.StrictMode> 13 | <SidebarView /> 14 | </React.StrictMode> 15 | ); 16 | } 17 | ``` -------------------------------------------------------------------------------- /.github/workflows/release-check.yml: -------------------------------------------------------------------------------- ```yaml 1 | name: Release Check 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | 8 | concurrency: 9 | group: release-check-${{ github.head_ref }} 10 | cancel-in-progress: true 11 | 12 | jobs: 13 | check-release-mode: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 0 19 | 20 | - name: Check release mode 21 | run: node ./.github/scripts/check-pre-release-mode.mjs "pull_request" 22 | ``` -------------------------------------------------------------------------------- /src/profiles/cursor.js: -------------------------------------------------------------------------------- ```javascript 1 | // Cursor conversion profile for rule-transformer 2 | import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; 3 | 4 | // Create and export cursor profile using the base factory 5 | export const cursorProfile = createProfile({ 6 | name: 'cursor', 7 | displayName: 'Cursor', 8 | url: 'cursor.so', 9 | docsUrl: 'docs.cursor.com', 10 | targetExtension: '.mdc', // Cursor keeps .mdc extension 11 | supportsRulesSubdirectories: true 12 | }); 13 | ``` -------------------------------------------------------------------------------- /apps/extension/src/test/extension.test.ts: -------------------------------------------------------------------------------- ```typescript 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5)); 13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | ``` -------------------------------------------------------------------------------- /docs/licensing.md: -------------------------------------------------------------------------------- ```markdown 1 | # Licensing 2 | 3 | Task Master is licensed under the MIT License with Commons Clause. This means you can: 4 | 5 | ## ✅ Allowed: 6 | 7 | - Use Task Master for any purpose (personal, commercial, academic) 8 | - Modify the code 9 | - Distribute copies 10 | - Create and sell products built using Task Master 11 | 12 | ## ❌ Not Allowed: 13 | 14 | - Sell Task Master itself 15 | - Offer Task Master as a hosted service 16 | - Create competing products based on Task Master 17 | 18 | See the [LICENSE](../LICENSE) file for the complete license text. 19 | ``` -------------------------------------------------------------------------------- /packages/build-config/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2022"], 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "esModuleInterop": true, 9 | "baseUrl": ".", 10 | "outDir": "dist", 11 | "allowJs": true, 12 | "strict": true, 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "declaration": true, 16 | "skipLibCheck": true, 17 | "forceConsistentCasingInFileNames": true 18 | }, 19 | "include": ["src/**/*"], 20 | "exclude": ["node_modules", "dist"] 21 | } 22 | ``` -------------------------------------------------------------------------------- /apps/docs/licensing.md: -------------------------------------------------------------------------------- ```markdown 1 | # Licensing 2 | 3 | Task Master is licensed under the MIT License with Commons Clause. This means you can: 4 | 5 | ## ✅ Allowed: 6 | 7 | - Use Task Master for any purpose (personal, commercial, academic) 8 | - Modify the code 9 | - Distribute copies 10 | - Create and sell products built using Task Master 11 | 12 | ## ❌ Not Allowed: 13 | 14 | - Sell Task Master itself 15 | - Offer Task Master as a hosted service 16 | - Create competing products based on Task Master 17 | 18 | {/* See the [LICENSE](../LICENSE) file for the complete license text. */} 19 | ``` -------------------------------------------------------------------------------- /jest.resolver.cjs: -------------------------------------------------------------------------------- ``` 1 | const { defaultResolver } = require('jest-resolve'); 2 | module.exports = function customResolver(request, options) { 3 | const resolve = options.defaultResolver || defaultResolver; 4 | 5 | try { 6 | return resolve(request, options); 7 | } catch (error) { 8 | if (request.startsWith('.') && request.endsWith('.js')) { 9 | try { 10 | return resolve(request.replace(/\.js$/, '.ts'), options); 11 | } catch (tsError) { 12 | tsError.cause = tsError.cause ?? error; 13 | throw tsError; 14 | } 15 | } 16 | 17 | throw error; 18 | } 19 | }; 20 | ``` -------------------------------------------------------------------------------- /packages/tm-core/tests/setup.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Vitest test setup file 3 | */ 4 | 5 | import { afterAll, beforeAll, vi } from 'vitest'; 6 | 7 | // Setup any global test configuration here 8 | // For example, increase timeout for slow CI environments 9 | if (process.env.CI) { 10 | // Vitest timeout is configured in vitest.config.ts 11 | } 12 | 13 | // Suppress console errors during tests unless explicitly testing them 14 | const originalError = console.error; 15 | beforeAll(() => { 16 | console.error = vi.fn(); 17 | }); 18 | 19 | afterAll(() => { 20 | console.error = originalError; 21 | }); 22 | ``` -------------------------------------------------------------------------------- /src/profiles/codex.js: -------------------------------------------------------------------------------- ```javascript 1 | // Codex profile for rule-transformer 2 | import { createProfile } from './base-profile.js'; 3 | 4 | // Create and export codex profile using the base factory 5 | export const codexProfile = createProfile({ 6 | name: 'codex', 7 | displayName: 'Codex', 8 | url: 'codex.ai', 9 | docsUrl: 'platform.openai.com/docs/codex', 10 | profileDir: '.', // Root directory 11 | rulesDir: '.', // No specific rules directory needed 12 | mcpConfig: false, 13 | mcpConfigName: null, 14 | includeDefaultRules: false, 15 | fileMap: { 16 | 'AGENTS.md': 'AGENTS.md' 17 | } 18 | }); 19 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/interfaces/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Interface definitions index for the tm-core package 3 | * This file exports all interface definitions from their respective modules 4 | */ 5 | 6 | // Storage interfaces 7 | export type * from './storage.interface.js'; 8 | export * from './storage.interface.js'; 9 | 10 | // AI Provider interfaces 11 | export type * from './ai-provider.interface.js'; 12 | export * from './ai-provider.interface.js'; 13 | 14 | // Configuration interfaces 15 | export type * from './configuration.interface.js'; 16 | export * from './configuration.interface.js'; 17 | ``` -------------------------------------------------------------------------------- /apps/docs/favicon.svg: -------------------------------------------------------------------------------- ``` 1 | <svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> 2 | <!-- Blue form with check from logo --> 3 | <rect x="16" y="10" width="68" height="80" rx="9" fill="#3366CC"/> 4 | <polyline points="33,44 41,55 56,29" fill="none" stroke="#FFFFFF" stroke-width="6"/> 5 | <circle cx="33" cy="64" r="4" fill="#FFFFFF"/> 6 | <rect x="43" y="61" width="27" height="6" fill="#FFFFFF"/> 7 | <circle cx="33" cy="77" r="4" fill="#FFFFFF"/> 8 | <rect x="43" y="75" width="27" height="6" fill="#FFFFFF"/> 9 | </svg> 10 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/config/services/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Configuration services exports 3 | * Export all configuration-related services 4 | */ 5 | 6 | export { ConfigLoader } from './config-loader.service.js'; 7 | export { 8 | ConfigMerger, 9 | CONFIG_PRECEDENCE, 10 | type ConfigSource 11 | } from './config-merger.service.js'; 12 | export { 13 | RuntimeStateManager, 14 | type RuntimeState 15 | } from './runtime-state-manager.service.js'; 16 | export { 17 | ConfigPersistence, 18 | type PersistenceOptions 19 | } from './config-persistence.service.js'; 20 | export { EnvironmentConfigProvider } from './environment-config-provider.service.js'; 21 | ``` -------------------------------------------------------------------------------- /src/constants/rules-actions.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * @typedef {'add' | 'remove'} RulesAction 3 | */ 4 | 5 | /** 6 | * Individual rules action constants 7 | */ 8 | export const RULES_ACTIONS = { 9 | ADD: 'add', 10 | REMOVE: 'remove' 11 | }; 12 | 13 | /** 14 | * Special rules command (not a CRUD operation) 15 | */ 16 | export const RULES_SETUP_ACTION = 'setup'; 17 | 18 | /** 19 | * Check if a given action is a valid rules action 20 | * @param {string} action - The action to check 21 | * @returns {boolean} True if the action is valid, false otherwise 22 | */ 23 | export function isValidRulesAction(action) { 24 | return Object.values(RULES_ACTIONS).includes(action); 25 | } 26 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/providers/ai/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Barrel export for AI provider modules 3 | */ 4 | 5 | export { BaseProvider } from './base-provider.js'; 6 | export type { BaseProviderConfig, CompletionResult } from './base-provider.js'; 7 | 8 | // Export provider factory when implemented 9 | // export { ProviderFactory } from './provider-factory.js'; 10 | 11 | // Export concrete providers when implemented 12 | // export { AnthropicProvider } from './adapters/anthropic-provider.js'; 13 | // export { OpenAIProvider } from './adapters/openai-provider.js'; 14 | // export { GoogleProvider } from './adapters/google-provider.js'; 15 | ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/config.yml: -------------------------------------------------------------------------------- ```yaml 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 🐛 Bug Fix 4 | url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=bugfix.md 5 | about: Fix a bug in Task Master 6 | - name: ✨ New Feature 7 | url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=feature.md 8 | about: Add a new feature to Task Master 9 | - name: 🔌 New Integration 10 | url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=integration.md 11 | about: Add support for a new tool, IDE, or platform ``` -------------------------------------------------------------------------------- /src/profiles/gemini.js: -------------------------------------------------------------------------------- ```javascript 1 | // Gemini profile for rule-transformer 2 | import { createProfile } from './base-profile.js'; 3 | 4 | // Create and export gemini profile using the base factory 5 | export const geminiProfile = createProfile({ 6 | name: 'gemini', 7 | displayName: 'Gemini', 8 | url: 'codeassist.google', 9 | docsUrl: 'github.com/google-gemini/gemini-cli', 10 | profileDir: '.gemini', // Keep .gemini for settings.json 11 | rulesDir: '.', // Root directory for GEMINI.md 12 | mcpConfigName: 'settings.json', // Override default 'mcp.json' 13 | includeDefaultRules: false, 14 | fileMap: { 15 | 'AGENTS.md': 'GEMINI.md' 16 | } 17 | }); 18 | ``` -------------------------------------------------------------------------------- /scripts/dev.js: -------------------------------------------------------------------------------- ```javascript 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * dev.js 5 | * Task Master CLI - AI-driven development task management 6 | * 7 | * This is the refactored entry point that uses the modular architecture. 8 | * It imports functionality from the modules directory and provides a CLI. 9 | */ 10 | 11 | import dotenv from 'dotenv'; 12 | dotenv.config(); 13 | 14 | // Add at the very beginning of the file 15 | if (process.env.DEBUG === '1') { 16 | console.error('DEBUG - dev.js received args:', process.argv.slice(2)); 17 | } 18 | 19 | import { runCLI } from './modules/commands.js'; 20 | 21 | // Run the CLI with the process arguments 22 | runCLI(process.argv); 23 | ``` -------------------------------------------------------------------------------- /.kiro/settings/mcp.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "mcpServers": { 3 | "task-master-ai": { 4 | "command": "npx", 5 | "args": ["-y", "task-master-ai"], 6 | "env": { 7 | "ANTHROPIC_API_KEY": "YOUR_ANTHROPIC_API_KEY_HERE", 8 | "PERPLEXITY_API_KEY": "YOUR_PERPLEXITY_API_KEY_HERE", 9 | "OPENAI_API_KEY": "YOUR_OPENAI_KEY_HERE", 10 | "GOOGLE_API_KEY": "YOUR_GOOGLE_KEY_HERE", 11 | "XAI_API_KEY": "YOUR_XAI_KEY_HERE", 12 | "OPENROUTER_API_KEY": "YOUR_OPENROUTER_KEY_HERE", 13 | "MISTRAL_API_KEY": "YOUR_MISTRAL_KEY_HERE", 14 | "AZURE_OPENAI_API_KEY": "YOUR_AZURE_KEY_HERE", 15 | "OLLAMA_API_KEY": "YOUR_OLLAMA_API_KEY_HERE" 16 | } 17 | } 18 | } 19 | } 20 | ``` -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "json.schemas": [ 3 | { 4 | "fileMatch": ["src/prompts/*.json"], 5 | "url": "./src/prompts/schemas/prompt-template.schema.json" 6 | } 7 | ], 8 | "files.associations": { 9 | "src/prompts/*.json": "json" 10 | }, 11 | 12 | "json.format.enable": true, 13 | "json.validate.enable": true, 14 | "typescript.tsdk": "node_modules/typescript/lib", 15 | "[typescript]": { 16 | "editor.defaultFormatter": "biomejs.biome" 17 | }, 18 | "[typescriptreact]": { 19 | "editor.defaultFormatter": "biomejs.biome" 20 | }, 21 | "[javascript]": { 22 | "editor.defaultFormatter": "biomejs.biome" 23 | }, 24 | "[json]": { 25 | "editor.defaultFormatter": "biomejs.biome" 26 | } 27 | } 28 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/label.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import * as LabelPrimitive from '@radix-ui/react-label'; 2 | import type * as React from 'react'; 3 | 4 | import { cn } from '@/lib/utils'; 5 | 6 | function Label({ 7 | className, 8 | ...props 9 | }: React.ComponentProps<typeof LabelPrimitive.Root>) { 10 | return ( 11 | <LabelPrimitive.Root 12 | data-slot="label" 13 | className={cn( 14 | 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50', 15 | className 16 | )} 17 | {...props} 18 | /> 19 | ); 20 | } 21 | 22 | export { Label }; 23 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/index.tsx: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Webview Entry Point 3 | */ 4 | 5 | import React from 'react'; 6 | import { createRoot } from 'react-dom/client'; 7 | import { App } from './App'; 8 | // CSS is built separately by Tailwind 9 | 10 | // VS Code API declaration 11 | declare global { 12 | interface Window { 13 | acquireVsCodeApi?: () => { 14 | postMessage: (message: any) => void; 15 | setState: (state: any) => void; 16 | getState: () => any; 17 | }; 18 | } 19 | } 20 | 21 | // Initialize React app 22 | const container = document.getElementById('root'); 23 | if (container) { 24 | const root = createRoot(container); 25 | root.render(<App />); 26 | } else { 27 | console.error('❌ Root container not found'); 28 | } 29 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/auth/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Authentication module exports 3 | */ 4 | 5 | export { AuthManager } from './auth-manager.js'; 6 | export { CredentialStore } from './credential-store.js'; 7 | export { OAuthService } from './oauth-service.js'; 8 | export { SupabaseSessionStorage } from './supabase-session-storage.js'; 9 | export type { 10 | Organization, 11 | Brief, 12 | RemoteTask 13 | } from '../services/organization.service.js'; 14 | 15 | export type { 16 | AuthCredentials, 17 | OAuthFlowOptions, 18 | AuthConfig, 19 | CliData, 20 | UserContext 21 | } from './types.js'; 22 | 23 | export { AuthenticationError } from './types.js'; 24 | 25 | export { 26 | DEFAULT_AUTH_CONFIG, 27 | getAuthConfig 28 | } from './config.js'; 29 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/PriorityBadge.tsx: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Priority Badge Component 3 | */ 4 | 5 | import React from 'react'; 6 | import { Badge } from '@/components/ui/badge'; 7 | import type { TaskMasterTask } from '../types'; 8 | 9 | interface PriorityBadgeProps { 10 | priority: TaskMasterTask['priority']; 11 | } 12 | 13 | export const PriorityBadge: React.FC<PriorityBadgeProps> = ({ priority }) => { 14 | if (!priority) return null; 15 | 16 | const variants = { 17 | high: 'destructive' as const, 18 | medium: 'default' as const, 19 | low: 'secondary' as const 20 | }; 21 | 22 | return ( 23 | <Badge 24 | variant={variants[priority] || 'secondary'} 25 | className="text-xs font-normal px-2 py-0.5" 26 | > 27 | {priority} 28 | </Badge> 29 | ); 30 | }; 31 | ``` -------------------------------------------------------------------------------- /packages/build-config/package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "@tm/build-config", 3 | "description": "Shared build configuration for Task Master monorepo", 4 | "type": "module", 5 | "private": true, 6 | "main": "./dist/tsdown.base.js", 7 | "types": "./src/tsdown.base.ts", 8 | "exports": { 9 | ".": { 10 | "types": "./src/tsdown.base.ts", 11 | "import": "./dist/tsdown.base.js" 12 | } 13 | }, 14 | "files": ["dist", "src"], 15 | "keywords": ["build-config", "tsup", "monorepo"], 16 | "author": "", 17 | "license": "MIT", 18 | "scripts": { 19 | "build": "tsc", 20 | "typecheck": "tsc --noEmit" 21 | }, 22 | "devDependencies": { 23 | "dotenv-mono": "^1.5.1", 24 | "typescript": "^5.7.3" 25 | }, 26 | "dependencies": { 27 | "tsup": "^8.5.0" 28 | } 29 | } 30 | ``` -------------------------------------------------------------------------------- /.cursor/mcp.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "mcpServers": { 3 | "task-master-ai": { 4 | "command": "node", 5 | "args": ["./dist/mcp-server.js"], 6 | "env": { 7 | "ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY_HERE", 8 | "PERPLEXITY_API_KEY": "PERPLEXITY_API_KEY_HERE", 9 | "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", 10 | "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", 11 | "GROQ_API_KEY": "GROQ_API_KEY_HERE", 12 | "XAI_API_KEY": "XAI_API_KEY_HERE", 13 | "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", 14 | "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", 15 | "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", 16 | "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE", 17 | "GITHUB_API_KEY": "GITHUB_API_KEY_HERE" 18 | } 19 | } 20 | } 21 | } 22 | ``` -------------------------------------------------------------------------------- /src/profiles/index.js: -------------------------------------------------------------------------------- ```javascript 1 | // Profile exports for centralized importing 2 | export { ampProfile } from './amp.js'; 3 | export { claudeProfile } from './claude.js'; 4 | export { clineProfile } from './cline.js'; 5 | export { codexProfile } from './codex.js'; 6 | export { cursorProfile } from './cursor.js'; 7 | export { geminiProfile } from './gemini.js'; 8 | export { kiloProfile } from './kilo.js'; 9 | export { kiroProfile } from './kiro.js'; 10 | export { opencodeProfile } from './opencode.js'; 11 | export { rooProfile } from './roo.js'; 12 | export { traeProfile } from './trae.js'; 13 | export { vscodeProfile } from './vscode.js'; 14 | export { windsurfProfile } from './windsurf.js'; 15 | export { zedProfile } from './zed.js'; 16 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/setup/quick-install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown 1 | Quick install Task Master globally if not already installed. 2 | 3 | Execute this streamlined installation: 4 | 5 | ```bash 6 | # Check and install in one command 7 | task-master --version 2>/dev/null || npm install -g task-master-ai 8 | 9 | # Verify installation 10 | task-master --version 11 | 12 | # Quick setup check 13 | task-master models --status || echo "Note: You'll need to set up an AI provider API key" 14 | ``` 15 | 16 | If you see "command not found" after installation, you may need to: 17 | 1. Restart your terminal 18 | 2. Or add npm global bin to PATH: `export PATH=$(npm bin -g):$PATH` 19 | 20 | Once installed, you can use all the Task Master commands! 21 | 22 | Quick test: Run `/project:help` to see all available commands. ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/setup/quick-install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown 1 | Quick install Task Master globally if not already installed. 2 | 3 | Execute this streamlined installation: 4 | 5 | ```bash 6 | # Check and install in one command 7 | task-master --version 2>/dev/null || npm install -g task-master-ai 8 | 9 | # Verify installation 10 | task-master --version 11 | 12 | # Quick setup check 13 | task-master models --status || echo "Note: You'll need to set up an AI provider API key" 14 | ``` 15 | 16 | If you see "command not found" after installation, you may need to: 17 | 1. Restart your terminal 18 | 2. Or add npm global bin to PATH: `export PATH=$(npm bin -g):$PATH` 19 | 20 | Once installed, you can use all the Task Master commands! 21 | 22 | Quick test: Run `/project:help` to see all available commands. ``` -------------------------------------------------------------------------------- /mcp-server/server.js: -------------------------------------------------------------------------------- ```javascript 1 | #!/usr/bin/env node 2 | 3 | import TaskMasterMCPServer from './src/index.js'; 4 | import dotenv from 'dotenv'; 5 | import logger from './src/logger.js'; 6 | 7 | // Load environment variables 8 | dotenv.config(); 9 | 10 | /** 11 | * Start the MCP server 12 | */ 13 | async function startServer() { 14 | const server = new TaskMasterMCPServer(); 15 | 16 | // Handle graceful shutdown 17 | process.on('SIGINT', async () => { 18 | await server.stop(); 19 | process.exit(0); 20 | }); 21 | 22 | process.on('SIGTERM', async () => { 23 | await server.stop(); 24 | process.exit(0); 25 | }); 26 | 27 | try { 28 | await server.start(); 29 | } catch (error) { 30 | logger.error(`Failed to start MCP server: ${error.message}`); 31 | process.exit(1); 32 | } 33 | } 34 | 35 | // Start the server 36 | startServer(); 37 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/separator.tsx: -------------------------------------------------------------------------------- ```typescript 1 | 'use client'; 2 | 3 | import * as SeparatorPrimitive from '@radix-ui/react-separator'; 4 | import type * as React from 'react'; 5 | 6 | import { cn } from '@/lib/utils'; 7 | 8 | function Separator({ 9 | className, 10 | orientation = 'horizontal', 11 | decorative = true, 12 | ...props 13 | }: React.ComponentProps<typeof SeparatorPrimitive.Root>) { 14 | return ( 15 | <SeparatorPrimitive.Root 16 | data-slot="separator" 17 | decorative={decorative} 18 | orientation={orientation} 19 | className={cn( 20 | 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', 21 | className 22 | )} 23 | {...props} 24 | /> 25 | ); 26 | } 27 | 28 | export { Separator }; 29 | ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feedback.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | name: Feedback 3 | about: Give us specific feedback on the product/approach/tech 4 | title: 'feedback: ' 5 | labels: feedback 6 | assignees: '' 7 | --- 8 | 9 | ### Feedback Summary 10 | 11 | Provide a clear summary or direct quote from user feedback. 12 | 13 | ### User Context 14 | 15 | Explain the user's context or scenario in which this feedback was provided. 16 | 17 | ### User Impact 18 | 19 | Describe how this feedback affects the user experience or workflow. 20 | 21 | ### Suggestions 22 | 23 | Provide any initial thoughts, potential solutions, or improvements based on the feedback. 24 | 25 | ### Relevant Screenshots or Examples 26 | 27 | Attach screenshots, logs, or examples that illustrate the feedback. 28 | 29 | ### Additional Notes 30 | 31 | Any additional context or related information. 32 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/constants.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Shared constants for TaskDetails components 3 | */ 4 | 5 | /** 6 | * Status color definitions for visual indicators 7 | */ 8 | export const STATUS_DOT_COLORS = { 9 | done: '#22c55e', // Green 10 | 'in-progress': '#3b82f6', // Blue 11 | review: '#a855f7', // Purple 12 | deferred: '#ef4444', // Red 13 | cancelled: '#6b7280', // Gray 14 | pending: '#eab308' // Yellow (default) 15 | } as const; 16 | 17 | export type TaskStatus = keyof typeof STATUS_DOT_COLORS; 18 | 19 | /** 20 | * Get the color for a status dot indicator 21 | * @param status - The task status 22 | * @returns The hex color code for the status 23 | */ 24 | export function getStatusDotColor(status: string): string { 25 | return STATUS_DOT_COLORS[status as TaskStatus] || STATUS_DOT_COLORS.pending; 26 | } 27 | ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/bugfix.md: -------------------------------------------------------------------------------- ```markdown 1 | ## 🐛 Bug Fix 2 | 3 | ### 🔍 Bug Description 4 | <!-- Describe the bug --> 5 | 6 | ### 🔗 Related Issues 7 | <!-- Fixes #123 --> 8 | 9 | ### ✨ Solution 10 | <!-- How does this PR fix the bug? --> 11 | 12 | ## How to Test 13 | 14 | ### Steps that caused the bug: 15 | 1. 16 | 2. 17 | 18 | **Before fix:** 19 | **After fix:** 20 | 21 | ### Quick verification: 22 | ```bash 23 | # Commands to verify the fix 24 | ``` 25 | 26 | ## Contributor Checklist 27 | - [ ] Created changeset: `npm run changeset` 28 | - [ ] Tests pass: `npm test` 29 | - [ ] Format check passes: `npm run format-check` 30 | - [ ] Addressed CodeRabbit comments 31 | - [ ] Added unit tests (if applicable) 32 | - [ ] Manually verified the fix works 33 | 34 | --- 35 | 36 | ### For Maintainers 37 | - [ ] Root cause identified 38 | - [ ] Fix doesn't introduce new issues 39 | - [ ] CI passes ``` -------------------------------------------------------------------------------- /apps/extension/tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ES2022", 5 | "outDir": "out", 6 | "lib": ["ES2022", "DOM"], 7 | "sourceMap": true, 8 | "rootDir": "src", 9 | "strict": true /* enable all strict type-checking options */, 10 | "moduleResolution": "Node", 11 | "esModuleInterop": true, 12 | "skipLibCheck": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "jsx": "react-jsx", 15 | "allowSyntheticDefaultImports": true, 16 | "resolveJsonModule": true, 17 | "declaration": false, 18 | "declarationMap": false, 19 | "baseUrl": ".", 20 | "paths": { 21 | "@/*": ["./src/*"], 22 | "@/components/*": ["./src/components/*"], 23 | "@/lib/*": ["./src/lib/*"], 24 | "@tm/core": ["../core/src"] 25 | } 26 | }, 27 | "exclude": ["node_modules", ".vscode-test", "out", "dist"] 28 | } 29 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/ToastContainer.tsx: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Toast Container Component 3 | */ 4 | 5 | import React from 'react'; 6 | import { ToastNotification } from './ToastNotification'; 7 | import type { ToastNotification as ToastType } from '../types'; 8 | 9 | interface ToastContainerProps { 10 | notifications: ToastType[]; 11 | onDismiss: (id: string) => void; 12 | } 13 | 14 | export const ToastContainer: React.FC<ToastContainerProps> = ({ 15 | notifications, 16 | onDismiss 17 | }) => { 18 | return ( 19 | <div className="fixed top-4 right-4 z-50 pointer-events-none"> 20 | <div className="flex flex-col items-end pointer-events-auto"> 21 | {notifications.map((notification) => ( 22 | <ToastNotification 23 | key={notification.id} 24 | notification={notification} 25 | onDismiss={onDismiss} 26 | /> 27 | ))} 28 | </div> 29 | </div> 30 | ); 31 | }; 32 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-pending.md: -------------------------------------------------------------------------------- ```markdown 1 | Set a task's status to pending. 2 | 3 | Arguments: $ARGUMENTS (task ID) 4 | 5 | ## Setting Task to Pending 6 | 7 | This moves a task back to the pending state, useful for: 8 | - Resetting erroneously started tasks 9 | - Deferring work that was prematurely begun 10 | - Reorganizing sprint priorities 11 | 12 | ## Execution 13 | 14 | ```bash 15 | task-master set-status --id=$ARGUMENTS --status=pending 16 | ``` 17 | 18 | ## Validation 19 | 20 | Before setting to pending: 21 | - Warn if task is currently in-progress 22 | - Check if this will block other tasks 23 | - Suggest documenting why it's being reset 24 | - Preserve any work already done 25 | 26 | ## Smart Actions 27 | 28 | After setting to pending: 29 | - Update sprint planning if needed 30 | - Notify about freed resources 31 | - Suggest priority reassessment 32 | - Log the status change with context ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-pending.md: -------------------------------------------------------------------------------- ```markdown 1 | Set a task's status to pending. 2 | 3 | Arguments: $ARGUMENTS (task ID) 4 | 5 | ## Setting Task to Pending 6 | 7 | This moves a task back to the pending state, useful for: 8 | - Resetting erroneously started tasks 9 | - Deferring work that was prematurely begun 10 | - Reorganizing sprint priorities 11 | 12 | ## Execution 13 | 14 | ```bash 15 | task-master set-status --id=$ARGUMENTS --status=pending 16 | ``` 17 | 18 | ## Validation 19 | 20 | Before setting to pending: 21 | - Warn if task is currently in-progress 22 | - Check if this will block other tasks 23 | - Suggest documenting why it's being reset 24 | - Preserve any work already done 25 | 26 | ## Smart Actions 27 | 28 | After setting to pending: 29 | - Update sprint planning if needed 30 | - Notify about freed resources 31 | - Suggest priority reassessment 32 | - Log the status change with context ``` -------------------------------------------------------------------------------- /mcp-server/src/core/direct-functions/cache-stats.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * cache-stats.js 3 | * Direct function implementation for retrieving cache statistics 4 | */ 5 | 6 | import { contextManager } from '../context-manager.js'; 7 | 8 | /** 9 | * Get cache statistics for monitoring 10 | * @param {Object} args - Command arguments 11 | * @param {Object} log - Logger object 12 | * @returns {Object} - Cache statistics 13 | */ 14 | export async function getCacheStatsDirect(args, log) { 15 | try { 16 | log.info('Retrieving cache statistics'); 17 | const stats = contextManager.getStats(); 18 | return { 19 | success: true, 20 | data: stats 21 | }; 22 | } catch (error) { 23 | log.error(`Error getting cache stats: ${error.message}`); 24 | return { 25 | success: false, 26 | error: { 27 | code: 'CACHE_STATS_ERROR', 28 | message: error.message || 'Unknown error occurred' 29 | } 30 | }; 31 | } 32 | } 33 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import type * as React from 'react'; 2 | 3 | import { cn } from '@/lib/utils'; 4 | 5 | function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) { 6 | return ( 7 | <textarea 8 | data-slot="textarea" 9 | className={cn( 10 | 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', 11 | className 12 | )} 13 | {...props} 14 | /> 15 | ); 16 | } 17 | 18 | export { Textarea }; 19 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'; 2 | 3 | function Collapsible({ 4 | ...props 5 | }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) { 6 | return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />; 7 | } 8 | 9 | function CollapsibleTrigger({ 10 | ...props 11 | }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) { 12 | return ( 13 | <CollapsiblePrimitive.CollapsibleTrigger 14 | data-slot="collapsible-trigger" 15 | {...props} 16 | /> 17 | ); 18 | } 19 | 20 | function CollapsibleContent({ 21 | ...props 22 | }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) { 23 | return ( 24 | <CollapsiblePrimitive.CollapsibleContent 25 | data-slot="collapsible-content" 26 | {...props} 27 | /> 28 | ); 29 | } 30 | 31 | export { Collapsible, CollapsibleTrigger, CollapsibleContent }; 32 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/list/list-tasks-with-subtasks.md: -------------------------------------------------------------------------------- ```markdown 1 | List all tasks including their subtasks in a hierarchical view. 2 | 3 | This command shows all tasks with their nested subtasks, providing a complete project overview. 4 | 5 | ## Execution 6 | 7 | Run the Task Master list command with subtasks flag: 8 | ```bash 9 | task-master list --with-subtasks 10 | ``` 11 | 12 | ## Enhanced Display 13 | 14 | I'll organize the output to show: 15 | - Parent tasks with clear indicators 16 | - Nested subtasks with proper indentation 17 | - Status badges for quick scanning 18 | - Dependencies and blockers highlighted 19 | - Progress indicators for tasks with subtasks 20 | 21 | ## Smart Filtering 22 | 23 | Based on the task hierarchy: 24 | - Show completion percentage for parent tasks 25 | - Highlight blocked subtask chains 26 | - Group by functional areas 27 | - Indicate critical path items 28 | 29 | This gives you a complete tree view of your project structure. ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/list/list-tasks-with-subtasks.md: -------------------------------------------------------------------------------- ```markdown 1 | List all tasks including their subtasks in a hierarchical view. 2 | 3 | This command shows all tasks with their nested subtasks, providing a complete project overview. 4 | 5 | ## Execution 6 | 7 | Run the Task Master list command with subtasks flag: 8 | ```bash 9 | task-master list --with-subtasks 10 | ``` 11 | 12 | ## Enhanced Display 13 | 14 | I'll organize the output to show: 15 | - Parent tasks with clear indicators 16 | - Nested subtasks with proper indentation 17 | - Status badges for quick scanning 18 | - Dependencies and blockers highlighted 19 | - Progress indicators for tasks with subtasks 20 | 21 | ## Smart Filtering 22 | 23 | Based on the task hierarchy: 24 | - Show completion percentage for parent tasks 25 | - Highlight blocked subtask chains 26 | - Group by functional areas 27 | - Indicate critical path items 28 | 29 | This gives you a complete tree view of your project structure. ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: 'bug: ' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | ### Description 10 | 11 | Detailed description of the problem, including steps to reproduce the issue. 12 | 13 | ### Steps to Reproduce 14 | 15 | 1. Step-by-step instructions to reproduce the issue 16 | 2. Include command examples or UI interactions 17 | 18 | ### Expected Behavior 19 | 20 | Describe clearly what the expected outcome or behavior should be. 21 | 22 | ### Actual Behavior 23 | 24 | Describe clearly what the actual outcome or behavior is. 25 | 26 | ### Screenshots or Logs 27 | 28 | Provide screenshots, logs, or error messages if applicable. 29 | 30 | ### Environment 31 | 32 | - Task Master version: 33 | - Node.js version: 34 | - Operating system: 35 | - IDE (if applicable): 36 | 37 | ### Additional Context 38 | 39 | Any additional information or context that might help diagnose the issue. 40 | ``` -------------------------------------------------------------------------------- /src/ai-providers/index.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * src/ai-providers/index.js 3 | * Central export point for all AI provider classes 4 | */ 5 | 6 | export { AnthropicAIProvider } from './anthropic.js'; 7 | export { PerplexityAIProvider } from './perplexity.js'; 8 | export { GoogleAIProvider } from './google.js'; 9 | export { OpenAIProvider } from './openai.js'; 10 | export { XAIProvider } from './xai.js'; 11 | export { GroqProvider } from './groq.js'; 12 | export { OpenRouterAIProvider } from './openrouter.js'; 13 | export { OllamaAIProvider } from './ollama.js'; 14 | export { BedrockAIProvider } from './bedrock.js'; 15 | export { AzureProvider } from './azure.js'; 16 | export { VertexAIProvider } from './google-vertex.js'; 17 | export { ClaudeCodeProvider } from './claude-code.js'; 18 | export { GeminiCliProvider } from './gemini-cli.js'; 19 | export { GrokCliProvider } from './grok-cli.js'; 20 | ``` -------------------------------------------------------------------------------- /assets/config.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "models": { 3 | "main": { 4 | "provider": "anthropic", 5 | "modelId": "claude-3-7-sonnet-20250219", 6 | "maxTokens": 100000, 7 | "temperature": 0.2 8 | }, 9 | "research": { 10 | "provider": "perplexity", 11 | "modelId": "sonar-pro", 12 | "maxTokens": 8700, 13 | "temperature": 0.1 14 | }, 15 | "fallback": { 16 | "provider": "anthropic", 17 | "modelId": "claude-3-7-sonnet-20250219", 18 | "maxTokens": 8192, 19 | "temperature": 0.2 20 | } 21 | }, 22 | "global": { 23 | "logLevel": "info", 24 | "debug": false, 25 | "defaultSubtasks": 5, 26 | "defaultPriority": "medium", 27 | "projectName": "Taskmaster", 28 | "defaultTag": "master", 29 | "ollamaBaseURL": "http://localhost:11434/api", 30 | "azureOpenaiBaseURL": "https://your-endpoint.openai.azure.com/", 31 | "bedrockBaseURL": "https://bedrock.us-east-1.amazonaws.com", 32 | "responseLanguage": "English" 33 | } 34 | } 35 | ``` -------------------------------------------------------------------------------- /apps/extension/src/utils/event-emitter.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Simple Event Emitter 3 | * Lightweight alternative to complex event bus 4 | */ 5 | 6 | export type EventHandler = (...args: any[]) => void | Promise<void>; 7 | 8 | export class EventEmitter { 9 | private handlers = new Map<string, Set<EventHandler>>(); 10 | 11 | on(event: string, handler: EventHandler): () => void { 12 | if (!this.handlers.has(event)) { 13 | this.handlers.set(event, new Set()); 14 | } 15 | this.handlers.get(event)?.add(handler); 16 | 17 | // Return unsubscribe function 18 | return () => this.off(event, handler); 19 | } 20 | 21 | off(event: string, handler: EventHandler): void { 22 | this.handlers.get(event)?.delete(handler); 23 | } 24 | 25 | emit(event: string, ...args: any[]): void { 26 | this.handlers.get(event)?.forEach((handler) => { 27 | try { 28 | handler(...args); 29 | } catch (error) { 30 | console.error(`Error in event handler for ${event}:`, error); 31 | } 32 | }); 33 | } 34 | } 35 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/utils/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Utility functions for the tm-core package 3 | * This file exports all utility functions and helper classes 4 | */ 5 | 6 | // Export ID generation utilities 7 | export { 8 | generateTaskId as generateId, // Alias for backward compatibility 9 | generateTaskId, 10 | generateSubtaskId, 11 | isValidTaskId, 12 | isValidSubtaskId, 13 | getParentTaskId 14 | } from './id-generator.js'; 15 | 16 | // Additional utility exports 17 | 18 | /** 19 | * Formats a date for task timestamps 20 | * @deprecated This is a placeholder function that will be properly implemented in later tasks 21 | */ 22 | export function formatDate(date: Date = new Date()): string { 23 | return date.toISOString(); 24 | } 25 | 26 | /** 27 | * Deep clones an object 28 | * @deprecated This is a placeholder function that will be properly implemented in later tasks 29 | */ 30 | export function deepClone<T>(obj: T): T { 31 | return JSON.parse(JSON.stringify(obj)); 32 | } 33 | ``` -------------------------------------------------------------------------------- /bin/task-master.js: -------------------------------------------------------------------------------- ```javascript 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Task Master 5 | * Copyright (c) 2025 Eyal Toledano, Ralph Khreish 6 | * 7 | * This software is licensed under the MIT License with Commons Clause. 8 | * You may use this software for any purpose, including commercial applications, 9 | * and modify and redistribute it freely, subject to the following restrictions: 10 | * 11 | * 1. You may not sell this software or offer it as a service. 12 | * 2. The origin of this software must not be misrepresented. 13 | * 3. Altered source versions must be plainly marked as such. 14 | * 15 | * For the full license text, see the LICENSE file in the root directory. 16 | */ 17 | 18 | /** 19 | * Claude Task Master CLI 20 | * Main entry point for globally installed package 21 | */ 22 | 23 | // Direct imports instead of spawning child processes 24 | import { runCLI } from '../scripts/modules/commands.js'; 25 | 26 | // Simply run the CLI directly 27 | runCLI(); 28 | ``` -------------------------------------------------------------------------------- /src/constants/task-status.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * @typedef {'pending' | 'done' | 'in-progress' | 'review' | 'deferred' | 'cancelled'} TaskStatus 3 | */ 4 | 5 | /** 6 | * Task status options list 7 | * @type {TaskStatus[]} 8 | * @description Defines possible task statuses: 9 | * - pending: Task waiting to start 10 | * - done: Task completed 11 | * - in-progress: Task in progress 12 | * - review: Task completed and waiting for review 13 | * - deferred: Task postponed or paused 14 | * - cancelled: Task cancelled and will not be completed 15 | */ 16 | export const TASK_STATUS_OPTIONS = [ 17 | 'pending', 18 | 'done', 19 | 'in-progress', 20 | 'review', 21 | 'deferred', 22 | 'cancelled' 23 | ]; 24 | 25 | /** 26 | * Check if a given status is a valid task status 27 | * @param {string} status - The status to check 28 | * @returns {boolean} True if the status is valid, false otherwise 29 | */ 30 | export function isValidTaskStatus(status) { 31 | return TASK_STATUS_OPTIONS.includes(status); 32 | } 33 | ``` -------------------------------------------------------------------------------- /src/constants/providers.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * Provider validation constants 3 | * Defines which providers should be validated against the supported-models.json file 4 | */ 5 | 6 | // Providers that have predefined model lists and should be validated 7 | export const VALIDATED_PROVIDERS = [ 8 | 'anthropic', 9 | 'openai', 10 | 'google', 11 | 'perplexity', 12 | 'xai', 13 | 'groq', 14 | 'mistral' 15 | ]; 16 | 17 | // Custom providers object for easy named access 18 | export const CUSTOM_PROVIDERS = { 19 | AZURE: 'azure', 20 | VERTEX: 'vertex', 21 | BEDROCK: 'bedrock', 22 | OPENROUTER: 'openrouter', 23 | OLLAMA: 'ollama', 24 | CLAUDE_CODE: 'claude-code', 25 | MCP: 'mcp', 26 | GEMINI_CLI: 'gemini-cli', 27 | GROK_CLI: 'grok-cli' 28 | }; 29 | 30 | // Custom providers array (for backward compatibility and iteration) 31 | export const CUSTOM_PROVIDERS_ARRAY = Object.values(CUSTOM_PROVIDERS); 32 | 33 | // All known providers (for reference) 34 | export const ALL_PROVIDERS = [ 35 | ...VALIDATED_PROVIDERS, 36 | ...CUSTOM_PROVIDERS_ARRAY 37 | ]; 38 | ``` -------------------------------------------------------------------------------- /apps/cli/src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Main entry point for @tm/cli package 3 | * Exports all public APIs for the CLI presentation layer 4 | */ 5 | 6 | // Commands 7 | export { ListTasksCommand } from './commands/list.command.js'; 8 | export { ShowCommand } from './commands/show.command.js'; 9 | export { AuthCommand } from './commands/auth.command.js'; 10 | export { ContextCommand } from './commands/context.command.js'; 11 | export { StartCommand } from './commands/start.command.js'; 12 | export { SetStatusCommand } from './commands/set-status.command.js'; 13 | 14 | // UI utilities (for other commands to use) 15 | export * as ui from './utils/ui.js'; 16 | 17 | // Auto-update utilities 18 | export { 19 | checkForUpdate, 20 | performAutoUpdate, 21 | displayUpgradeNotification, 22 | compareVersions 23 | } from './utils/auto-update.js'; 24 | 25 | // Re-export commonly used types from tm-core 26 | export type { 27 | Task, 28 | TaskStatus, 29 | TaskPriority, 30 | TaskMasterCore 31 | } from '@tm/core'; 32 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/init/init-project-quick.md: -------------------------------------------------------------------------------- ```markdown 1 | Quick initialization with auto-confirmation. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Initialize a Task Master project without prompts, accepting all defaults. 6 | 7 | ## Quick Setup 8 | 9 | ```bash 10 | task-master init -y 11 | ``` 12 | 13 | ## What It Does 14 | 15 | 1. Creates `.taskmaster/` directory structure 16 | 2. Initializes empty `tasks.json` 17 | 3. Sets up default configuration 18 | 4. Uses directory name as project name 19 | 5. Skips all confirmation prompts 20 | 21 | ## Smart Defaults 22 | 23 | - Project name: Current directory name 24 | - Description: "Task Master Project" 25 | - Model config: Existing environment vars 26 | - Task structure: Standard format 27 | 28 | ## Next Steps 29 | 30 | After quick init: 31 | 1. Configure AI models if needed: 32 | ``` 33 | /project:tm/models/setup 34 | ``` 35 | 36 | 2. Parse PRD if available: 37 | ``` 38 | /project:tm/parse-prd <file> 39 | ``` 40 | 41 | 3. Or create first task: 42 | ``` 43 | /project:tm/add-task create initial setup 44 | ``` 45 | 46 | Perfect for rapid project setup! ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/init/init-project-quick.md: -------------------------------------------------------------------------------- ```markdown 1 | Quick initialization with auto-confirmation. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Initialize a Task Master project without prompts, accepting all defaults. 6 | 7 | ## Quick Setup 8 | 9 | ```bash 10 | task-master init -y 11 | ``` 12 | 13 | ## What It Does 14 | 15 | 1. Creates `.taskmaster/` directory structure 16 | 2. Initializes empty `tasks.json` 17 | 3. Sets up default configuration 18 | 4. Uses directory name as project name 19 | 5. Skips all confirmation prompts 20 | 21 | ## Smart Defaults 22 | 23 | - Project name: Current directory name 24 | - Description: "Task Master Project" 25 | - Model config: Existing environment vars 26 | - Task structure: Standard format 27 | 28 | ## Next Steps 29 | 30 | After quick init: 31 | 1. Configure AI models if needed: 32 | ``` 33 | /project:tm/models/setup 34 | ``` 35 | 36 | 2. Parse PRD if available: 37 | ``` 38 | /project:tm/parse-prd <file> 39 | ``` 40 | 41 | 3. Or create first task: 42 | ``` 43 | /project:tm/add-task create initial setup 44 | ``` 45 | 46 | Perfect for rapid project setup! ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/constants/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Application constants 3 | */ 4 | 5 | import type { Status } from '@/components/ui/shadcn-io/kanban'; 6 | 7 | export const kanbanStatuses = [ 8 | { 9 | id: 'pending', 10 | title: 'Pending', 11 | color: 'yellow', 12 | className: 'text-yellow-600 border-yellow-600/20' 13 | }, 14 | { 15 | id: 'in-progress', 16 | title: 'In Progress', 17 | color: 'blue', 18 | className: 'text-blue-600 border-blue-600/20' 19 | }, 20 | { 21 | id: 'review', 22 | title: 'Review', 23 | color: 'purple', 24 | className: 'text-purple-600 border-purple-600/20' 25 | }, 26 | { 27 | id: 'done', 28 | title: 'Done', 29 | color: 'green', 30 | className: 'text-green-600 border-green-600/20' 31 | }, 32 | { 33 | id: 'deferred', 34 | title: 'Deferred', 35 | color: 'gray', 36 | className: 'text-gray-600 border-gray-600/20' 37 | } 38 | ] as const; 39 | 40 | export const CACHE_DURATION = 30000; // 30 seconds 41 | export const REQUEST_TIMEOUT = 30000; // 30 seconds 42 | export const HEADER_HEIGHT = 73; // Header with padding and border 43 | ``` -------------------------------------------------------------------------------- /.taskmaster/tasks/task_002_tm-start.txt: -------------------------------------------------------------------------------- ``` 1 | # Task ID: 2 2 | # Title: Register start command in CLI 3 | # Status: pending 4 | # Dependencies: 7 5 | # Priority: high 6 | # Description: Register the start command in the CLI application 7 | # Details: 8 | Update the CLI application to register the new start command. This involves importing the StartCommand class and adding it to the commands array in the CLI initialization. 9 | 10 | In `apps/cli/src/index.ts` or the appropriate file where commands are registered: 11 | 12 | ```typescript 13 | import { StartCommand } from './commands/start.command'; 14 | 15 | // Add StartCommand to the commands array 16 | const commands = [ 17 | // ... existing commands 18 | new StartCommand(), 19 | ]; 20 | 21 | // Register all commands 22 | commands.forEach(command => command.register(program)); 23 | ``` 24 | 25 | # Test Strategy: 26 | Verify the command is correctly registered by running the CLI with --help and checking that the start command appears in the list of available commands. 27 | ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/components/suggested-steps.component.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Suggested next steps component 3 | * Displays helpful command suggestions at the end of the list 4 | */ 5 | 6 | import chalk from 'chalk'; 7 | import boxen from 'boxen'; 8 | 9 | /** 10 | * Display suggested next steps section 11 | */ 12 | export function displaySuggestedNextSteps(): void { 13 | const steps = [ 14 | `${chalk.cyan('1.')} Run ${chalk.yellow('task-master next')} to see what to work on next`, 15 | `${chalk.cyan('2.')} Run ${chalk.yellow('task-master expand --id=<id>')} to break down a task into subtasks`, 16 | `${chalk.cyan('3.')} Run ${chalk.yellow('task-master set-status --id=<id> --status=done')} to mark a task as complete` 17 | ]; 18 | 19 | console.log( 20 | boxen( 21 | chalk.white.bold('Suggested Next Steps:') + '\n\n' + steps.join('\n'), 22 | { 23 | padding: 1, 24 | margin: { top: 0, bottom: 1 }, 25 | borderStyle: 'round', 26 | borderColor: 'gray', 27 | width: process.stdout.columns * 0.97 28 | } 29 | ) 30 | ); 31 | } 32 | ``` -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "ESNext", 5 | "moduleResolution": "bundler", 6 | "lib": ["ES2022"], 7 | "types": ["node"], 8 | "allowJs": true, 9 | "resolveJsonModule": true, 10 | "esModuleInterop": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "strict": true, 13 | "skipLibCheck": true, 14 | "noEmit": true, 15 | "baseUrl": ".", 16 | "paths": { 17 | "@tm/core": ["./packages/tm-core/src/index.ts"], 18 | "@tm/core/*": ["./packages/tm-core/src/*"], 19 | "@tm/cli": ["./apps/cli/src/index.ts"], 20 | "@tm/cli/*": ["./apps/cli/src/*"], 21 | "@tm/build-config": ["./packages/build-config/src/index.ts"], 22 | "@tm/build-config/*": ["./packages/build-config/src/*"] 23 | } 24 | }, 25 | "tsx": { 26 | "tsconfig": { 27 | "allowImportingTsExtensions": false 28 | } 29 | }, 30 | "include": [ 31 | "bin/**/*", 32 | "scripts/**/*", 33 | "packages/*/src/**/*", 34 | "apps/*/src/**/*" 35 | ], 36 | "exclude": ["node_modules", "dist", "**/dist"] 37 | } 38 | ``` -------------------------------------------------------------------------------- /.github/workflows/auto-close-duplicates.yml: -------------------------------------------------------------------------------- ```yaml 1 | name: Auto-close duplicate issues 2 | # description: Auto-closes issues that are duplicates of existing issues 3 | 4 | on: 5 | schedule: 6 | - cron: "0 9 * * *" # Runs daily at 9 AM UTC 7 | workflow_dispatch: 8 | 9 | jobs: 10 | auto-close-duplicates: 11 | runs-on: ubuntu-latest 12 | timeout-minutes: 10 13 | permissions: 14 | contents: read 15 | issues: write # Need write permission to close issues and add comments 16 | 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Setup Node.js 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version: 20 25 | 26 | - name: Auto-close duplicate issues 27 | run: node .github/scripts/auto-close-duplicates.mjs 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} 31 | GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }} 32 | ``` -------------------------------------------------------------------------------- /apps/cli/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown 1 | # @tm/cli 2 | 3 | ## null 4 | 5 | ### Patch Changes 6 | 7 | - Updated dependencies []: 8 | - @tm/core@null 9 | 10 | ## 0.27.0 11 | 12 | ### Patch Changes 13 | 14 | - Updated dependencies []: 15 | - @tm/[email protected] 16 | 17 | ## 0.27.0-rc.0 18 | 19 | ### Minor Changes 20 | 21 | - [#1213](https://github.com/eyaltoledano/claude-task-master/pull/1213) [`137ef36`](https://github.com/eyaltoledano/claude-task-master/commit/137ef362789a9cdfdb1925e35e0438c1fa6c69ee) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - testing this stuff out to see how the release candidate works with monorepo 22 | 23 | ## 1.1.0-rc.0 24 | 25 | ### Minor Changes 26 | 27 | - [#1213](https://github.com/eyaltoledano/claude-task-master/pull/1213) [`cd90b4d`](https://github.com/eyaltoledano/claude-task-master/commit/cd90b4d65fc2f04bdad9fb73aba320b58a124240) Thanks [@Crunchyman-ralph](https://github.com/Crunchyman-ralph)! - testing this stuff out to see how the release candidate works with monorepo 28 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/providers/QueryProvider.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from 'react'; 2 | import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; 3 | 4 | // Create a stable query client 5 | const queryClient = new QueryClient({ 6 | defaultOptions: { 7 | queries: { 8 | // Don't refetch on window focus by default 9 | refetchOnWindowFocus: false, 10 | // Keep data fresh for 30 seconds 11 | staleTime: 30 * 1000, 12 | // Cache data for 5 minutes 13 | gcTime: 5 * 60 * 1000, 14 | // Retry failed requests 3 times 15 | retry: 3, 16 | // Retry delay exponentially backs off 17 | retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000) 18 | }, 19 | mutations: { 20 | // Don't retry mutations by default 21 | retry: false 22 | } 23 | } 24 | }); 25 | 26 | interface QueryProviderProps { 27 | children: React.ReactNode; 28 | } 29 | 30 | export const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => { 31 | return ( 32 | <QueryClientProvider client={queryClient}>{children}</QueryClientProvider> 33 | ); 34 | }; 35 | ``` -------------------------------------------------------------------------------- /packages/tm-core/src/storage/file-storage/path-resolver.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * @fileoverview Path resolution utilities for single tasks.json file 3 | */ 4 | 5 | import path from 'node:path'; 6 | 7 | /** 8 | * Handles path resolution for the single tasks.json file storage 9 | */ 10 | export class PathResolver { 11 | private readonly basePath: string; 12 | private readonly tasksDir: string; 13 | private readonly tasksFilePath: string; 14 | 15 | constructor(projectPath: string) { 16 | this.basePath = path.join(projectPath, '.taskmaster'); 17 | this.tasksDir = path.join(this.basePath, 'tasks'); 18 | this.tasksFilePath = path.join(this.tasksDir, 'tasks.json'); 19 | } 20 | 21 | /** 22 | * Get the base storage directory path 23 | */ 24 | getBasePath(): string { 25 | return this.basePath; 26 | } 27 | 28 | /** 29 | * Get the tasks directory path 30 | */ 31 | getTasksDir(): string { 32 | return this.tasksDir; 33 | } 34 | 35 | /** 36 | * Get the path to the single tasks.json file 37 | * All tags are stored in this one file 38 | */ 39 | getTasksPath(): string { 40 | return this.tasksFilePath; 41 | } 42 | } 43 | ```