This is page 2 of 38. Use http://codebase.md/eyaltoledano/claude-task-master?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 -------------------------------------------------------------------------------- /assets/AGENTS.md: -------------------------------------------------------------------------------- ```markdown # Task Master AI - Agent Integration Guide ## Essential Commands ### Core Workflow Commands ```bash # Project Setup task-master init # Initialize Task Master in current project task-master parse-prd .taskmaster/docs/prd.txt # Generate tasks from PRD document task-master models --setup # Configure AI models interactively # Daily Development Workflow task-master list # Show all tasks with status task-master next # Get next available task to work on task-master show <id> # View detailed task information (e.g., task-master show 1.2) task-master set-status --id=<id> --status=done # Mark task complete # Task Management task-master add-task --prompt="description" --research # Add new task with AI assistance task-master expand --id=<id> --research --force # Break task into subtasks task-master update-task --id=<id> --prompt="changes" # Update specific task task-master update --from=<id> --prompt="changes" # Update multiple tasks from ID onwards task-master update-subtask --id=<id> --prompt="notes" # Add implementation notes to subtask # Analysis & Planning task-master analyze-complexity --research # Analyze task complexity task-master complexity-report # View complexity analysis task-master expand --all --research # Expand all eligible tasks # Dependencies & Organization task-master add-dependency --id=<id> --depends-on=<id> # Add task dependency task-master move --from=<id> --to=<id> # Reorganize task hierarchy task-master validate-dependencies # Check for dependency issues task-master generate # Update task markdown files (usually auto-called) ``` ## Key Files & Project Structure ### Core Files - `.taskmaster/tasks/tasks.json` - Main task data file (auto-managed) - `.taskmaster/config.json` - AI model configuration (use `task-master models` to modify) - `.taskmaster/docs/prd.txt` - Product Requirements Document for parsing - `.taskmaster/tasks/*.txt` - Individual task files (auto-generated from tasks.json) - `.env` - API keys for CLI usage ### Claude Code Integration Files - `CLAUDE.md` - Auto-loaded context for Claude Code (this file) - `.claude/settings.json` - Claude Code tool allowlist and preferences - `.claude/commands/` - Custom slash commands for repeated workflows - `.mcp.json` - MCP server configuration (project-specific) ### Directory Structure ``` project/ ├── .taskmaster/ │ ├── tasks/ # Task files directory │ │ ├── tasks.json # Main task database │ │ ├── task-1.md # Individual task files │ │ └── task-2.md │ ├── docs/ # Documentation directory │ │ ├── prd.txt # Product requirements │ ├── reports/ # Analysis reports directory │ │ └── task-complexity-report.json │ ├── templates/ # Template files │ │ └── example_prd.txt # Example PRD template │ └── config.json # AI models & settings ├── .claude/ │ ├── settings.json # Claude Code configuration │ └── commands/ # Custom slash commands ├── .env # API keys ├── .mcp.json # MCP configuration └── CLAUDE.md # This file - auto-loaded by Claude Code ``` ## MCP Integration Task Master provides an MCP server that Claude Code can connect to. Configure in `.mcp.json`: ```json { "mcpServers": { "task-master-ai": { "command": "npx", "args": ["-y", "task-master-ai"], "env": { "ANTHROPIC_API_KEY": "your_key_here", "PERPLEXITY_API_KEY": "your_key_here", "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", "XAI_API_KEY": "XAI_API_KEY_HERE", "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE" } } } } ``` ### Essential MCP Tools ```javascript help; // = shows available taskmaster commands // Project setup initialize_project; // = task-master init parse_prd; // = task-master parse-prd // Daily workflow get_tasks; // = task-master list next_task; // = task-master next get_task; // = task-master show <id> set_task_status; // = task-master set-status // Task management add_task; // = task-master add-task expand_task; // = task-master expand update_task; // = task-master update-task update_subtask; // = task-master update-subtask update; // = task-master update // Analysis analyze_project_complexity; // = task-master analyze-complexity complexity_report; // = task-master complexity-report ``` ## Claude Code Workflow Integration ### Standard Development Workflow #### 1. Project Initialization ```bash # Initialize Task Master task-master init # Create or obtain PRD, then parse it task-master parse-prd .taskmaster/docs/prd.txt # Analyze complexity and expand tasks task-master analyze-complexity --research task-master expand --all --research ``` 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.. #### 2. Daily Development Loop ```bash # Start each session task-master next # Find next available task task-master show <id> # Review task details # During implementation, check in code context into the tasks and subtasks task-master update-subtask --id=<id> --prompt="implementation notes..." # Complete tasks task-master set-status --id=<id> --status=done ``` #### 3. Multi-Claude Workflows For complex projects, use multiple Claude Code sessions: ```bash # Terminal 1: Main implementation cd project && claude # Terminal 2: Testing and validation cd project-test-worktree && claude # Terminal 3: Documentation updates cd project-docs-worktree && claude ``` ### Custom Slash Commands Create `.claude/commands/taskmaster-next.md`: ```markdown Find the next available Task Master task and show its details. Steps: 1. Run `task-master next` to get the next task 2. If a task is available, run `task-master show <id>` for full details 3. Provide a summary of what needs to be implemented 4. Suggest the first implementation step ``` Create `.claude/commands/taskmaster-complete.md`: ```markdown Complete a Task Master task: $ARGUMENTS Steps: 1. Review the current task with `task-master show $ARGUMENTS` 2. Verify all implementation is complete 3. Run any tests related to this task 4. Mark as complete: `task-master set-status --id=$ARGUMENTS --status=done` 5. Show the next available task with `task-master next` ``` ## Tool Allowlist Recommendations Add to `.claude/settings.json`: ```json { "allowedTools": [ "Edit", "Bash(task-master *)", "Bash(git commit:*)", "Bash(git add:*)", "Bash(npm run *)", "mcp__task_master_ai__*" ] } ``` ## Configuration & Setup ### API Keys Required At least **one** of these API keys must be configured: - `ANTHROPIC_API_KEY` (Claude models) - **Recommended** - `PERPLEXITY_API_KEY` (Research features) - **Highly recommended** - `OPENAI_API_KEY` (GPT models) - `GOOGLE_API_KEY` (Gemini models) - `MISTRAL_API_KEY` (Mistral models) - `OPENROUTER_API_KEY` (Multiple models) - `XAI_API_KEY` (Grok models) An API key is required for any provider used across any of the 3 roles defined in the `models` command. ### Model Configuration ```bash # Interactive setup (recommended) task-master models --setup # Set specific models task-master models --set-main claude-3-5-sonnet-20241022 task-master models --set-research perplexity-llama-3.1-sonar-large-128k-online task-master models --set-fallback gpt-4o-mini ``` ## Task Structure & IDs ### Task ID Format - Main tasks: `1`, `2`, `3`, etc. - Subtasks: `1.1`, `1.2`, `2.1`, etc. - Sub-subtasks: `1.1.1`, `1.1.2`, etc. ### Task Status Values - `pending` - Ready to work on - `in-progress` - Currently being worked on - `done` - Completed and verified - `deferred` - Postponed - `cancelled` - No longer needed - `blocked` - Waiting on external factors ### Task Fields ```json { "id": "1.2", "title": "Implement user authentication", "description": "Set up JWT-based auth system", "status": "pending", "priority": "high", "dependencies": ["1.1"], "details": "Use bcrypt for hashing, JWT for tokens...", "testStrategy": "Unit tests for auth functions, integration tests for login flow", "subtasks": [] } ``` ## Claude Code Best Practices with Task Master ### Context Management - Use `/clear` between different tasks to maintain focus - This CLAUDE.md file is automatically loaded for context - Use `task-master show <id>` to pull specific task context when needed ### Iterative Implementation 1. `task-master show <subtask-id>` - Understand requirements 2. Explore codebase and plan implementation 3. `task-master update-subtask --id=<id> --prompt="detailed plan"` - Log plan 4. `task-master set-status --id=<id> --status=in-progress` - Start work 5. Implement code following logged plan 6. `task-master update-subtask --id=<id> --prompt="what worked/didn't work"` - Log progress 7. `task-master set-status --id=<id> --status=done` - Complete task ### Complex Workflows with Checklists For large migrations or multi-step processes: 1. Create a markdown PRD file describing the new changes: `touch task-migration-checklist.md` (prds can be .txt or .md) 2. Use Taskmaster to parse the new prd with `task-master parse-prd --append` (also available in MCP) 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. 4. Work through items systematically, checking them off as completed 5. Use `task-master update-subtask` to log progress on each task/subtask and/or updating/researching them before/during implementation if getting stuck ### Git Integration Task Master works well with `gh` CLI: ```bash # Create PR for completed task gh pr create --title "Complete task 1.2: User authentication" --body "Implements JWT auth system as specified in task 1.2" # Reference task in commits git commit -m "feat: implement JWT auth (task 1.2)" ``` ### Parallel Development with Git Worktrees ```bash # Create worktrees for parallel task development git worktree add ../project-auth feature/auth-system git worktree add ../project-api feature/api-refactor # Run Claude Code in each worktree cd ../project-auth && claude # Terminal 1: Auth work cd ../project-api && claude # Terminal 2: API work ``` ## Troubleshooting ### AI Commands Failing ```bash # Check API keys are configured cat .env # For CLI usage # Verify model configuration task-master models # Test with different model task-master models --set-fallback gpt-4o-mini ``` ### MCP Connection Issues - Check `.mcp.json` configuration - Verify Node.js installation - Use `--mcp-debug` flag when starting Claude Code - Use CLI as fallback if MCP unavailable ### Task File Sync Issues ```bash # Regenerate task files from tasks.json task-master generate # Fix dependency issues task-master fix-dependencies ``` DO NOT RE-INITIALIZE. That will not do anything beyond re-adding the same Taskmaster core files. ## Important Notes ### AI-Powered Operations These commands make AI calls and may take up to a minute: - `parse_prd` / `task-master parse-prd` - `analyze_project_complexity` / `task-master analyze-complexity` - `expand_task` / `task-master expand` - `expand_all` / `task-master expand --all` - `add_task` / `task-master add-task` - `update` / `task-master update` - `update_task` / `task-master update-task` - `update_subtask` / `task-master update-subtask` ### File Management - Never manually edit `tasks.json` - use commands instead - Never manually edit `.taskmaster/config.json` - use `task-master models` - Task markdown files in `tasks/` are auto-generated - Run `task-master generate` after manual changes to tasks.json ### Claude Code Session Management - Use `/clear` frequently to maintain focused context - Create custom slash commands for repeated Task Master workflows - Configure tool allowlist to streamline permissions - Use headless mode for automation: `claude -p "task-master next"` ### Multi-Task Updates - Use `update --from=<id>` to update multiple future tasks - Use `update-task --id=<id>` for single task updates - Use `update-subtask --id=<id>` for implementation logging ### Research Mode - Add `--research` flag for research-based AI enhancement - Requires a research model API key like Perplexity (`PERPLEXITY_API_KEY`) in environment - Provides more informed task creation and updates - Recommended for complex technical tasks --- _This guide ensures Claude Code has immediate access to Task Master's essential functionality for agentic development workflows._ ``` -------------------------------------------------------------------------------- /test-tag-functions.js: -------------------------------------------------------------------------------- ```javascript ``` -------------------------------------------------------------------------------- /apps/extension/src/index.ts: -------------------------------------------------------------------------------- ```typescript console.log('hello world'); ``` -------------------------------------------------------------------------------- /packages/build-config/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown # @tm/build-config ## null ## 1.0.1 ``` -------------------------------------------------------------------------------- /apps/docs/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown # docs ## 0.0.4 ## 0.0.3 ## 0.0.2 ## 0.0.1 ``` -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- ```json { "recommendations": ["esbenp.prettier-vscode"] } ``` -------------------------------------------------------------------------------- /output.json: -------------------------------------------------------------------------------- ```json { "key": "value", "nested": { "prop": true } } ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/moving-forward.mdx: -------------------------------------------------------------------------------- ```markdown --- title: Moving Forward sidebarTitle: "Moving Forward" --- ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/rules-quick.mdx: -------------------------------------------------------------------------------- ```markdown --- title: Rules and Context sidebarTitle: "Rules and Context" --- ``` -------------------------------------------------------------------------------- /packages/tm-core/src/clients/index.ts: -------------------------------------------------------------------------------- ```typescript /** * Client exports */ export { SupabaseAuthClient } from './supabase-client.js'; ``` -------------------------------------------------------------------------------- /apps/docs/whats-new.mdx: -------------------------------------------------------------------------------- ```markdown --- title: "What's New" sidebarTitle: "What's New" --- An easy way to see the latest releases ``` -------------------------------------------------------------------------------- /scripts/modules/task-manager/parse-prd/index.js: -------------------------------------------------------------------------------- ```javascript // Main entry point for parse-prd module export { default } from './parse-prd.js'; export { default as parsePRD } from './parse-prd.js'; ``` -------------------------------------------------------------------------------- /apps/extension/src/lib/utils.ts: -------------------------------------------------------------------------------- ```typescript import { type ClassValue, clsx } from 'clsx'; import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } ``` -------------------------------------------------------------------------------- /tests/fixture/test-tasks.json: -------------------------------------------------------------------------------- ```json { "tasks": [ { "id": 1, "dependencies": [], "subtasks": [ { "id": 1, "dependencies": [] } ] } ] } ``` -------------------------------------------------------------------------------- /.taskmaster/docs/test-prd.txt: -------------------------------------------------------------------------------- ``` Simple Todo App PRD Create a basic todo list application with the following features: 1. Add new todos 2. Mark todos as complete 3. Delete todos That's it. Keep it simple. ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Main UI exports */ // Export all components export * from './components/index.js'; // Re-export existing UI utilities export * from '../utils/ui.js'; ``` -------------------------------------------------------------------------------- /.taskmaster/state.json: -------------------------------------------------------------------------------- ```json { "currentTag": "master", "lastSwitched": "2025-09-12T22:25:27.535Z", "branchTagMapping": { "v017-adds": "v017-adds", "next": "next" }, "migrationNoticeShown": true } ``` -------------------------------------------------------------------------------- /apps/docs/best-practices/index.mdx: -------------------------------------------------------------------------------- ```markdown --- title: Intro to Advanced Usage sidebarTitle: "Advanced Usage" --- # Best Practices Explore advanced tips, recommended workflows, and best practices for getting the most out of Task Master. ``` -------------------------------------------------------------------------------- /packages/tm-core/src/providers/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Barrel export for provider modules */ // Export all from AI module export * from './ai/index.js'; // Storage providers will be exported here when implemented // export * from './storage/index.js'; ``` -------------------------------------------------------------------------------- /apps/docs/vercel.json: -------------------------------------------------------------------------------- ```json { "rewrites": [ { "source": "/", "destination": "https://taskmaster-49ce32d5.mintlify.dev/docs" }, { "source": "/:match*", "destination": "https://taskmaster-49ce32d5.mintlify.dev/docs/:match*" } ] } ``` -------------------------------------------------------------------------------- /apps/docs/package.json: -------------------------------------------------------------------------------- ```json { "name": "docs", "version": "0.0.4", "private": true, "description": "Task Master documentation powered by Mintlify", "scripts": { "dev": "mintlify dev", "preview": "mintlify preview" }, "devDependencies": { "mintlify": "^4.2.111" } } ``` -------------------------------------------------------------------------------- /scripts/modules/index.js: -------------------------------------------------------------------------------- ```javascript /** * index.js * Main export point for all Task Master CLI modules */ // Export all modules export * from './ui.js'; export * from './utils.js'; export * from './commands.js'; export * from './task-manager.js'; export * from './prompt-manager.js'; ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/components/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview UI components exports */ export * from './header.component.js'; export * from './dashboard.component.js'; export * from './next-task.component.js'; export * from './suggested-steps.component.js'; export * from './task-detail.component.js'; ``` -------------------------------------------------------------------------------- /test-prd.txt: -------------------------------------------------------------------------------- ``` # Test PRD ## Project Overview This is a simple test project to verify parse-prd functionality. ## Features - Feature A: Basic setup - Feature B: Core functionality - Feature C: Testing ## Requirements - Use Node.js - Include basic tests - Simple CLI interface ``` -------------------------------------------------------------------------------- /packages/tm-core/src/types/legacy.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Legacy type definitions for backwards compatibility * These types are deprecated and will be removed in future versions */ /** * @deprecated Use string directly instead. This will be removed in a future version. */ export type TaskId = string; ``` -------------------------------------------------------------------------------- /packages/tm-core/src/services/index.ts: -------------------------------------------------------------------------------- ```typescript /** * Services module exports * Provides business logic and service layer functionality */ export { TaskService } from './task-service.js'; export { OrganizationService } from './organization.service.js'; export type { Organization, Brief } from './organization.service.js'; ``` -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- ```json { "$schema": "https://unpkg.com/@changesets/[email protected]/schema.json", "changelog": [ "@changesets/changelog-github", { "repo": "eyaltoledano/claude-task-master" } ], "commit": false, "fixed": [], "access": "public", "baseBranch": "main", "ignore": [ "docs" ] } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/logger/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Logger package for Task Master * Provides centralized logging with support for different modes and levels */ export { Logger, LogLevel } from './logger.js'; export type { LoggerConfig } from './logger.js'; export { createLogger, getLogger, setGlobalLogger } from './factory.js'; ``` -------------------------------------------------------------------------------- /src/constants/commands.js: -------------------------------------------------------------------------------- ```javascript /** * Command related constants * Defines which commands trigger AI processing */ // Command names that trigger AI processing export const AI_COMMAND_NAMES = [ 'add-task', 'analyze-complexity', 'expand-task', 'parse-prd', 'research', 'research-save', 'update-subtask', 'update-task', 'update-tasks' ]; ``` -------------------------------------------------------------------------------- /src/profiles/trae.js: -------------------------------------------------------------------------------- ```javascript // Trae conversion profile for rule-transformer import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; // Create and export trae profile using the base factory export const traeProfile = createProfile({ name: 'trae', displayName: 'Trae', url: 'trae.ai', docsUrl: 'docs.trae.ai', mcpConfig: false }); ``` -------------------------------------------------------------------------------- /packages/tm-core/src/executors/index.ts: -------------------------------------------------------------------------------- ```typescript /** * Public API for the executors module */ export * from './types.js'; export { BaseExecutor } from './base-executor.js'; export { ClaudeExecutor } from './claude-executor.js'; export { ExecutorFactory } from './executor-factory.js'; export { ExecutorService, type ExecutorServiceOptions } from './executor-service.js'; ``` -------------------------------------------------------------------------------- /src/profiles/windsurf.js: -------------------------------------------------------------------------------- ```javascript // Windsurf conversion profile for rule-transformer import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; // Create and export windsurf profile using the base factory export const windsurfProfile = createProfile({ name: 'windsurf', displayName: 'Windsurf', url: 'windsurf.com', docsUrl: 'docs.windsurf.com' }); ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/faq.mdx: -------------------------------------------------------------------------------- ```markdown --- title: FAQ sidebarTitle: "FAQ" --- Coming soon. ## 💬 Getting Help - **Discord**: [Join our community](https://discord.gg/taskmasterai) - **Issues**: [GitHub Issues](https://github.com/eyaltoledano/claude-task-master/issues) - **Discussions**: [GitHub Discussions](https://github.com/eyaltoledano/claude-task-master/discussions) ``` -------------------------------------------------------------------------------- /src/utils/getVersion.js: -------------------------------------------------------------------------------- ```javascript import packageJson from '../../package.json' with { type: 'json' }; /** * Reads the version from the nearest package.json relative to this file. * Returns 'unknown' if not found or on error. * @returns {string} The version string or 'unknown'. */ export function getTaskMasterVersion() { return packageJson.version || 'unknown'; } ``` -------------------------------------------------------------------------------- /apps/docs/style.css: -------------------------------------------------------------------------------- ```css /* * This file is used to override the default logo style of the docs theme. * It is not used for the actual documentation content. */ #navbar img { height: auto !important; /* Let intrinsic SVG size determine height */ width: 200px !important; /* Control width */ margin-top: 5px !important; /* Add some space above the logo */ } ``` -------------------------------------------------------------------------------- /apps/extension/components.json: -------------------------------------------------------------------------------- ```json { "$schema": "https://ui.shadcn.com/schema.json", "style": "default", "rsc": false, "tsx": true, "tailwind": { "config": "tailwind.config.js", "css": "src/webview/index.css", "baseColor": "slate", "cssVariables": true, "prefix": "" }, "aliases": { "components": "@/components", "utils": "@/lib" }, "iconLibrary": "lucide-react" } ``` -------------------------------------------------------------------------------- /src/utils/format.js: -------------------------------------------------------------------------------- ```javascript // src/utils/format.js /** * Formats elapsed time as 0m 00s. * @param {number} seconds - Elapsed time in seconds * @returns {string} Formatted time string */ export function formatElapsedTime(seconds) { const minutes = Math.floor(seconds / 60); const remainingSeconds = Math.floor(seconds % 60); return `${minutes}m ${remainingSeconds.toString().padStart(2, '0')}s`; } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/storage/file-storage/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Exports for file storage components */ export { FormatHandler, type FileStorageData, type FileFormat } from './format-handler.js'; export { FileOperations } from './file-operations.js'; export { PathResolver } from './path-resolver.js'; // Main FileStorage class - primary export export { FileStorage as default, FileStorage } from './file-storage.js'; ``` -------------------------------------------------------------------------------- /src/profiles/cline.js: -------------------------------------------------------------------------------- ```javascript // Cline conversion profile for rule-transformer import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; // Create and export cline profile using the base factory export const clineProfile = createProfile({ name: 'cline', displayName: 'Cline', url: 'cline.bot', docsUrl: 'docs.cline.bot', profileDir: '.clinerules', rulesDir: '.clinerules', mcpConfig: false }); ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/sidebar.tsx: -------------------------------------------------------------------------------- ```typescript import React from 'react'; import ReactDOM from 'react-dom/client'; import { SidebarView } from './components/SidebarView'; const rootElement = document.getElementById('root'); if (!rootElement) { console.error('Sidebar: Root element not found'); } else { const root = ReactDOM.createRoot(rootElement); root.render( <React.StrictMode> <SidebarView /> </React.StrictMode> ); } ``` -------------------------------------------------------------------------------- /.github/workflows/release-check.yml: -------------------------------------------------------------------------------- ```yaml name: Release Check on: pull_request: branches: - main concurrency: group: release-check-${{ github.head_ref }} cancel-in-progress: true jobs: check-release-mode: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Check release mode run: node ./.github/scripts/check-pre-release-mode.mjs "pull_request" ``` -------------------------------------------------------------------------------- /src/profiles/cursor.js: -------------------------------------------------------------------------------- ```javascript // Cursor conversion profile for rule-transformer import { createProfile, COMMON_TOOL_MAPPINGS } from './base-profile.js'; // Create and export cursor profile using the base factory export const cursorProfile = createProfile({ name: 'cursor', displayName: 'Cursor', url: 'cursor.so', docsUrl: 'docs.cursor.com', targetExtension: '.mdc', // Cursor keeps .mdc extension supportsRulesSubdirectories: true }); ``` -------------------------------------------------------------------------------- /apps/extension/src/test/extension.test.ts: -------------------------------------------------------------------------------- ```typescript import * as assert from 'assert'; // You can import and use all API from the 'vscode' module // as well as import your extension to test it import * as vscode from 'vscode'; // import * as myExtension from '../../extension'; suite('Extension Test Suite', () => { vscode.window.showInformationMessage('Start all tests.'); test('Sample test', () => { assert.strictEqual(-1, [1, 2, 3].indexOf(5)); assert.strictEqual(-1, [1, 2, 3].indexOf(0)); }); }); ``` -------------------------------------------------------------------------------- /docs/licensing.md: -------------------------------------------------------------------------------- ```markdown # Licensing Task Master is licensed under the MIT License with Commons Clause. This means you can: ## ✅ Allowed: - Use Task Master for any purpose (personal, commercial, academic) - Modify the code - Distribute copies - Create and sell products built using Task Master ## ❌ Not Allowed: - Sell Task Master itself - Offer Task Master as a hosted service - Create competing products based on Task Master See the [LICENSE](../LICENSE) file for the complete license text. ``` -------------------------------------------------------------------------------- /packages/build-config/tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", "lib": ["ES2022"], "module": "ESNext", "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, "esModuleInterop": true, "baseUrl": ".", "outDir": "dist", "allowJs": true, "strict": true, "resolveJsonModule": true, "isolatedModules": true, "declaration": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } ``` -------------------------------------------------------------------------------- /apps/docs/licensing.md: -------------------------------------------------------------------------------- ```markdown # Licensing Task Master is licensed under the MIT License with Commons Clause. This means you can: ## ✅ Allowed: - Use Task Master for any purpose (personal, commercial, academic) - Modify the code - Distribute copies - Create and sell products built using Task Master ## ❌ Not Allowed: - Sell Task Master itself - Offer Task Master as a hosted service - Create competing products based on Task Master {/* See the [LICENSE](../LICENSE) file for the complete license text. */} ``` -------------------------------------------------------------------------------- /jest.resolver.cjs: -------------------------------------------------------------------------------- ``` const { defaultResolver } = require('jest-resolve'); module.exports = function customResolver(request, options) { const resolve = options.defaultResolver || defaultResolver; try { return resolve(request, options); } catch (error) { if (request.startsWith('.') && request.endsWith('.js')) { try { return resolve(request.replace(/\.js$/, '.ts'), options); } catch (tsError) { tsError.cause = tsError.cause ?? error; throw tsError; } } throw error; } }; ``` -------------------------------------------------------------------------------- /packages/tm-core/tests/setup.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Vitest test setup file */ import { afterAll, beforeAll, vi } from 'vitest'; // Setup any global test configuration here // For example, increase timeout for slow CI environments if (process.env.CI) { // Vitest timeout is configured in vitest.config.ts } // Suppress console errors during tests unless explicitly testing them const originalError = console.error; beforeAll(() => { console.error = vi.fn(); }); afterAll(() => { console.error = originalError; }); ``` -------------------------------------------------------------------------------- /src/profiles/codex.js: -------------------------------------------------------------------------------- ```javascript // Codex profile for rule-transformer import { createProfile } from './base-profile.js'; // Create and export codex profile using the base factory export const codexProfile = createProfile({ name: 'codex', displayName: 'Codex', url: 'codex.ai', docsUrl: 'platform.openai.com/docs/codex', profileDir: '.', // Root directory rulesDir: '.', // No specific rules directory needed mcpConfig: false, mcpConfigName: null, includeDefaultRules: false, fileMap: { 'AGENTS.md': 'AGENTS.md' } }); ``` -------------------------------------------------------------------------------- /packages/tm-core/src/interfaces/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Interface definitions index for the tm-core package * This file exports all interface definitions from their respective modules */ // Storage interfaces export type * from './storage.interface.js'; export * from './storage.interface.js'; // AI Provider interfaces export type * from './ai-provider.interface.js'; export * from './ai-provider.interface.js'; // Configuration interfaces export type * from './configuration.interface.js'; export * from './configuration.interface.js'; ``` -------------------------------------------------------------------------------- /apps/docs/favicon.svg: -------------------------------------------------------------------------------- ``` <svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <!-- Blue form with check from logo --> <rect x="16" y="10" width="68" height="80" rx="9" fill="#3366CC"/> <polyline points="33,44 41,55 56,29" fill="none" stroke="#FFFFFF" stroke-width="6"/> <circle cx="33" cy="64" r="4" fill="#FFFFFF"/> <rect x="43" y="61" width="27" height="6" fill="#FFFFFF"/> <circle cx="33" cy="77" r="4" fill="#FFFFFF"/> <rect x="43" y="75" width="27" height="6" fill="#FFFFFF"/> </svg> ``` -------------------------------------------------------------------------------- /packages/tm-core/src/config/services/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Configuration services exports * Export all configuration-related services */ export { ConfigLoader } from './config-loader.service.js'; export { ConfigMerger, CONFIG_PRECEDENCE, type ConfigSource } from './config-merger.service.js'; export { RuntimeStateManager, type RuntimeState } from './runtime-state-manager.service.js'; export { ConfigPersistence, type PersistenceOptions } from './config-persistence.service.js'; export { EnvironmentConfigProvider } from './environment-config-provider.service.js'; ``` -------------------------------------------------------------------------------- /src/constants/rules-actions.js: -------------------------------------------------------------------------------- ```javascript /** * @typedef {'add' | 'remove'} RulesAction */ /** * Individual rules action constants */ export const RULES_ACTIONS = { ADD: 'add', REMOVE: 'remove' }; /** * Special rules command (not a CRUD operation) */ export const RULES_SETUP_ACTION = 'setup'; /** * Check if a given action is a valid rules action * @param {string} action - The action to check * @returns {boolean} True if the action is valid, false otherwise */ export function isValidRulesAction(action) { return Object.values(RULES_ACTIONS).includes(action); } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/providers/ai/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Barrel export for AI provider modules */ export { BaseProvider } from './base-provider.js'; export type { BaseProviderConfig, CompletionResult } from './base-provider.js'; // Export provider factory when implemented // export { ProviderFactory } from './provider-factory.js'; // Export concrete providers when implemented // export { AnthropicProvider } from './adapters/anthropic-provider.js'; // export { OpenAIProvider } from './adapters/openai-provider.js'; // export { GoogleProvider } from './adapters/google-provider.js'; ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/config.yml: -------------------------------------------------------------------------------- ```yaml blank_issues_enabled: false contact_links: - name: 🐛 Bug Fix url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=bugfix.md about: Fix a bug in Task Master - name: ✨ New Feature url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=feature.md about: Add a new feature to Task Master - name: 🔌 New Integration url: https://github.com/eyaltoledano/claude-task-master/compare/next...HEAD?template=integration.md about: Add support for a new tool, IDE, or platform ``` -------------------------------------------------------------------------------- /src/profiles/gemini.js: -------------------------------------------------------------------------------- ```javascript // Gemini profile for rule-transformer import { createProfile } from './base-profile.js'; // Create and export gemini profile using the base factory export const geminiProfile = createProfile({ name: 'gemini', displayName: 'Gemini', url: 'codeassist.google', docsUrl: 'github.com/google-gemini/gemini-cli', profileDir: '.gemini', // Keep .gemini for settings.json rulesDir: '.', // Root directory for GEMINI.md mcpConfigName: 'settings.json', // Override default 'mcp.json' includeDefaultRules: false, fileMap: { 'AGENTS.md': 'GEMINI.md' } }); ``` -------------------------------------------------------------------------------- /scripts/dev.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * dev.js * Task Master CLI - AI-driven development task management * * This is the refactored entry point that uses the modular architecture. * It imports functionality from the modules directory and provides a CLI. */ import dotenv from 'dotenv'; dotenv.config(); // Add at the very beginning of the file if (process.env.DEBUG === '1') { console.error('DEBUG - dev.js received args:', process.argv.slice(2)); } import { runCLI } from './modules/commands.js'; // Run the CLI with the process arguments runCLI(process.argv); ``` -------------------------------------------------------------------------------- /.kiro/settings/mcp.json: -------------------------------------------------------------------------------- ```json { "mcpServers": { "task-master-ai": { "command": "npx", "args": ["-y", "task-master-ai"], "env": { "ANTHROPIC_API_KEY": "YOUR_ANTHROPIC_API_KEY_HERE", "PERPLEXITY_API_KEY": "YOUR_PERPLEXITY_API_KEY_HERE", "OPENAI_API_KEY": "YOUR_OPENAI_KEY_HERE", "GOOGLE_API_KEY": "YOUR_GOOGLE_KEY_HERE", "XAI_API_KEY": "YOUR_XAI_KEY_HERE", "OPENROUTER_API_KEY": "YOUR_OPENROUTER_KEY_HERE", "MISTRAL_API_KEY": "YOUR_MISTRAL_KEY_HERE", "AZURE_OPENAI_API_KEY": "YOUR_AZURE_KEY_HERE", "OLLAMA_API_KEY": "YOUR_OLLAMA_API_KEY_HERE" } } } } ``` -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- ```json { "json.schemas": [ { "fileMatch": ["src/prompts/*.json"], "url": "./src/prompts/schemas/prompt-template.schema.json" } ], "files.associations": { "src/prompts/*.json": "json" }, "json.format.enable": true, "json.validate.enable": true, "typescript.tsdk": "node_modules/typescript/lib", "[typescript]": { "editor.defaultFormatter": "biomejs.biome" }, "[typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" }, "[javascript]": { "editor.defaultFormatter": "biomejs.biome" }, "[json]": { "editor.defaultFormatter": "biomejs.biome" } } ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/label.tsx: -------------------------------------------------------------------------------- ```typescript import * as LabelPrimitive from '@radix-ui/react-label'; import type * as React from 'react'; import { cn } from '@/lib/utils'; function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) { return ( <LabelPrimitive.Root data-slot="label" className={cn( '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', className )} {...props} /> ); } export { Label }; ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/index.tsx: -------------------------------------------------------------------------------- ```typescript /** * Webview Entry Point */ import React from 'react'; import { createRoot } from 'react-dom/client'; import { App } from './App'; // CSS is built separately by Tailwind // VS Code API declaration declare global { interface Window { acquireVsCodeApi?: () => { postMessage: (message: any) => void; setState: (state: any) => void; getState: () => any; }; } } // Initialize React app const container = document.getElementById('root'); if (container) { const root = createRoot(container); root.render(<App />); } else { console.error('❌ Root container not found'); } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/auth/index.ts: -------------------------------------------------------------------------------- ```typescript /** * Authentication module exports */ export { AuthManager } from './auth-manager.js'; export { CredentialStore } from './credential-store.js'; export { OAuthService } from './oauth-service.js'; export { SupabaseSessionStorage } from './supabase-session-storage.js'; export type { Organization, Brief, RemoteTask } from '../services/organization.service.js'; export type { AuthCredentials, OAuthFlowOptions, AuthConfig, CliData, UserContext } from './types.js'; export { AuthenticationError } from './types.js'; export { DEFAULT_AUTH_CONFIG, getAuthConfig } from './config.js'; ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/PriorityBadge.tsx: -------------------------------------------------------------------------------- ```typescript /** * Priority Badge Component */ import React from 'react'; import { Badge } from '@/components/ui/badge'; import type { TaskMasterTask } from '../types'; interface PriorityBadgeProps { priority: TaskMasterTask['priority']; } export const PriorityBadge: React.FC<PriorityBadgeProps> = ({ priority }) => { if (!priority) return null; const variants = { high: 'destructive' as const, medium: 'default' as const, low: 'secondary' as const }; return ( <Badge variant={variants[priority] || 'secondary'} className="text-xs font-normal px-2 py-0.5" > {priority} </Badge> ); }; ``` -------------------------------------------------------------------------------- /packages/build-config/package.json: -------------------------------------------------------------------------------- ```json { "name": "@tm/build-config", "description": "Shared build configuration for Task Master monorepo", "type": "module", "private": true, "main": "./dist/tsdown.base.js", "types": "./src/tsdown.base.ts", "exports": { ".": { "types": "./src/tsdown.base.ts", "import": "./dist/tsdown.base.js" } }, "files": ["dist", "src"], "keywords": ["build-config", "tsup", "monorepo"], "author": "", "license": "MIT", "scripts": { "build": "tsc", "typecheck": "tsc --noEmit" }, "devDependencies": { "dotenv-mono": "^1.5.1", "typescript": "^5.7.3" }, "dependencies": { "tsup": "^8.5.0" } } ``` -------------------------------------------------------------------------------- /.cursor/mcp.json: -------------------------------------------------------------------------------- ```json { "mcpServers": { "task-master-ai": { "command": "node", "args": ["./dist/mcp-server.js"], "env": { "ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY_HERE", "PERPLEXITY_API_KEY": "PERPLEXITY_API_KEY_HERE", "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", "GROQ_API_KEY": "GROQ_API_KEY_HERE", "XAI_API_KEY": "XAI_API_KEY_HERE", "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE", "GITHUB_API_KEY": "GITHUB_API_KEY_HERE" } } } } ``` -------------------------------------------------------------------------------- /src/profiles/index.js: -------------------------------------------------------------------------------- ```javascript // Profile exports for centralized importing export { ampProfile } from './amp.js'; export { claudeProfile } from './claude.js'; export { clineProfile } from './cline.js'; export { codexProfile } from './codex.js'; export { cursorProfile } from './cursor.js'; export { geminiProfile } from './gemini.js'; export { kiloProfile } from './kilo.js'; export { kiroProfile } from './kiro.js'; export { opencodeProfile } from './opencode.js'; export { rooProfile } from './roo.js'; export { traeProfile } from './trae.js'; export { vscodeProfile } from './vscode.js'; export { windsurfProfile } from './windsurf.js'; export { zedProfile } from './zed.js'; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/setup/quick-install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown Quick install Task Master globally if not already installed. Execute this streamlined installation: ```bash # Check and install in one command task-master --version 2>/dev/null || npm install -g task-master-ai # Verify installation task-master --version # Quick setup check task-master models --status || echo "Note: You'll need to set up an AI provider API key" ``` If you see "command not found" after installation, you may need to: 1. Restart your terminal 2. Or add npm global bin to PATH: `export PATH=$(npm bin -g):$PATH` Once installed, you can use all the Task Master commands! Quick test: Run `/project:help` to see all available commands. ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/setup/quick-install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown Quick install Task Master globally if not already installed. Execute this streamlined installation: ```bash # Check and install in one command task-master --version 2>/dev/null || npm install -g task-master-ai # Verify installation task-master --version # Quick setup check task-master models --status || echo "Note: You'll need to set up an AI provider API key" ``` If you see "command not found" after installation, you may need to: 1. Restart your terminal 2. Or add npm global bin to PATH: `export PATH=$(npm bin -g):$PATH` Once installed, you can use all the Task Master commands! Quick test: Run `/project:help` to see all available commands. ``` -------------------------------------------------------------------------------- /mcp-server/server.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node import TaskMasterMCPServer from './src/index.js'; import dotenv from 'dotenv'; import logger from './src/logger.js'; // Load environment variables dotenv.config(); /** * Start the MCP server */ async function startServer() { const server = new TaskMasterMCPServer(); // Handle graceful shutdown process.on('SIGINT', async () => { await server.stop(); process.exit(0); }); process.on('SIGTERM', async () => { await server.stop(); process.exit(0); }); try { await server.start(); } catch (error) { logger.error(`Failed to start MCP server: ${error.message}`); process.exit(1); } } // Start the server startServer(); ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/separator.tsx: -------------------------------------------------------------------------------- ```typescript 'use client'; import * as SeparatorPrimitive from '@radix-ui/react-separator'; import type * as React from 'react'; import { cn } from '@/lib/utils'; function Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) { return ( <SeparatorPrimitive.Root data-slot="separator" decorative={decorative} orientation={orientation} className={cn( 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', className )} {...props} /> ); } export { Separator }; ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feedback.md: -------------------------------------------------------------------------------- ```markdown --- name: Feedback about: Give us specific feedback on the product/approach/tech title: 'feedback: ' labels: feedback assignees: '' --- ### Feedback Summary Provide a clear summary or direct quote from user feedback. ### User Context Explain the user's context or scenario in which this feedback was provided. ### User Impact Describe how this feedback affects the user experience or workflow. ### Suggestions Provide any initial thoughts, potential solutions, or improvements based on the feedback. ### Relevant Screenshots or Examples Attach screenshots, logs, or examples that illustrate the feedback. ### Additional Notes Any additional context or related information. ``` -------------------------------------------------------------------------------- /apps/extension/src/components/constants.ts: -------------------------------------------------------------------------------- ```typescript /** * Shared constants for TaskDetails components */ /** * Status color definitions for visual indicators */ export const STATUS_DOT_COLORS = { done: '#22c55e', // Green 'in-progress': '#3b82f6', // Blue review: '#a855f7', // Purple deferred: '#ef4444', // Red cancelled: '#6b7280', // Gray pending: '#eab308' // Yellow (default) } as const; export type TaskStatus = keyof typeof STATUS_DOT_COLORS; /** * Get the color for a status dot indicator * @param status - The task status * @returns The hex color code for the status */ export function getStatusDotColor(status: string): string { return STATUS_DOT_COLORS[status as TaskStatus] || STATUS_DOT_COLORS.pending; } ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/bugfix.md: -------------------------------------------------------------------------------- ```markdown ## 🐛 Bug Fix ### 🔍 Bug Description <!-- Describe the bug --> ### 🔗 Related Issues <!-- Fixes #123 --> ### ✨ Solution <!-- How does this PR fix the bug? --> ## How to Test ### Steps that caused the bug: 1. 2. **Before fix:** **After fix:** ### Quick verification: ```bash # Commands to verify the fix ``` ## Contributor Checklist - [ ] Created changeset: `npm run changeset` - [ ] Tests pass: `npm test` - [ ] Format check passes: `npm run format-check` - [ ] Addressed CodeRabbit comments - [ ] Added unit tests (if applicable) - [ ] Manually verified the fix works --- ### For Maintainers - [ ] Root cause identified - [ ] Fix doesn't introduce new issues - [ ] CI passes ``` -------------------------------------------------------------------------------- /apps/extension/tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "module": "ESNext", "target": "ES2022", "outDir": "out", "lib": ["ES2022", "DOM"], "sourceMap": true, "rootDir": "src", "strict": true /* enable all strict type-checking options */, "moduleResolution": "Node", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "jsx": "react-jsx", "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "declaration": false, "declarationMap": false, "baseUrl": ".", "paths": { "@/*": ["./src/*"], "@/components/*": ["./src/components/*"], "@/lib/*": ["./src/lib/*"], "@tm/core": ["../core/src"] } }, "exclude": ["node_modules", ".vscode-test", "out", "dist"] } ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/ToastContainer.tsx: -------------------------------------------------------------------------------- ```typescript /** * Toast Container Component */ import React from 'react'; import { ToastNotification } from './ToastNotification'; import type { ToastNotification as ToastType } from '../types'; interface ToastContainerProps { notifications: ToastType[]; onDismiss: (id: string) => void; } export const ToastContainer: React.FC<ToastContainerProps> = ({ notifications, onDismiss }) => { return ( <div className="fixed top-4 right-4 z-50 pointer-events-none"> <div className="flex flex-col items-end pointer-events-auto"> {notifications.map((notification) => ( <ToastNotification key={notification.id} notification={notification} onDismiss={onDismiss} /> ))} </div> </div> ); }; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-pending.md: -------------------------------------------------------------------------------- ```markdown Set a task's status to pending. Arguments: $ARGUMENTS (task ID) ## Setting Task to Pending This moves a task back to the pending state, useful for: - Resetting erroneously started tasks - Deferring work that was prematurely begun - Reorganizing sprint priorities ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=pending ``` ## Validation Before setting to pending: - Warn if task is currently in-progress - Check if this will block other tasks - Suggest documenting why it's being reset - Preserve any work already done ## Smart Actions After setting to pending: - Update sprint planning if needed - Notify about freed resources - Suggest priority reassessment - Log the status change with context ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-pending.md: -------------------------------------------------------------------------------- ```markdown Set a task's status to pending. Arguments: $ARGUMENTS (task ID) ## Setting Task to Pending This moves a task back to the pending state, useful for: - Resetting erroneously started tasks - Deferring work that was prematurely begun - Reorganizing sprint priorities ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=pending ``` ## Validation Before setting to pending: - Warn if task is currently in-progress - Check if this will block other tasks - Suggest documenting why it's being reset - Preserve any work already done ## Smart Actions After setting to pending: - Update sprint planning if needed - Notify about freed resources - Suggest priority reassessment - Log the status change with context ``` -------------------------------------------------------------------------------- /mcp-server/src/core/direct-functions/cache-stats.js: -------------------------------------------------------------------------------- ```javascript /** * cache-stats.js * Direct function implementation for retrieving cache statistics */ import { contextManager } from '../context-manager.js'; /** * Get cache statistics for monitoring * @param {Object} args - Command arguments * @param {Object} log - Logger object * @returns {Object} - Cache statistics */ export async function getCacheStatsDirect(args, log) { try { log.info('Retrieving cache statistics'); const stats = contextManager.getStats(); return { success: true, data: stats }; } catch (error) { log.error(`Error getting cache stats: ${error.message}`); return { success: false, error: { code: 'CACHE_STATS_ERROR', message: error.message || 'Unknown error occurred' } }; } } ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- ```typescript import type * as React from 'react'; import { cn } from '@/lib/utils'; function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) { return ( <textarea data-slot="textarea" className={cn( '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', className )} {...props} /> ); } export { Textarea }; ``` -------------------------------------------------------------------------------- /apps/extension/src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- ```typescript import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'; function Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) { return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />; } function CollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) { return ( <CollapsiblePrimitive.CollapsibleTrigger data-slot="collapsible-trigger" {...props} /> ); } function CollapsibleContent({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) { return ( <CollapsiblePrimitive.CollapsibleContent data-slot="collapsible-content" {...props} /> ); } export { Collapsible, CollapsibleTrigger, CollapsibleContent }; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/list/list-tasks-with-subtasks.md: -------------------------------------------------------------------------------- ```markdown List all tasks including their subtasks in a hierarchical view. This command shows all tasks with their nested subtasks, providing a complete project overview. ## Execution Run the Task Master list command with subtasks flag: ```bash task-master list --with-subtasks ``` ## Enhanced Display I'll organize the output to show: - Parent tasks with clear indicators - Nested subtasks with proper indentation - Status badges for quick scanning - Dependencies and blockers highlighted - Progress indicators for tasks with subtasks ## Smart Filtering Based on the task hierarchy: - Show completion percentage for parent tasks - Highlight blocked subtask chains - Group by functional areas - Indicate critical path items This gives you a complete tree view of your project structure. ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/list/list-tasks-with-subtasks.md: -------------------------------------------------------------------------------- ```markdown List all tasks including their subtasks in a hierarchical view. This command shows all tasks with their nested subtasks, providing a complete project overview. ## Execution Run the Task Master list command with subtasks flag: ```bash task-master list --with-subtasks ``` ## Enhanced Display I'll organize the output to show: - Parent tasks with clear indicators - Nested subtasks with proper indentation - Status badges for quick scanning - Dependencies and blockers highlighted - Progress indicators for tasks with subtasks ## Smart Filtering Based on the task hierarchy: - Show completion percentage for parent tasks - Highlight blocked subtask chains - Group by functional areas - Indicate critical path items This gives you a complete tree view of your project structure. ``` -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- ```markdown --- name: Bug report about: Create a report to help us improve title: 'bug: ' labels: bug assignees: '' --- ### Description Detailed description of the problem, including steps to reproduce the issue. ### Steps to Reproduce 1. Step-by-step instructions to reproduce the issue 2. Include command examples or UI interactions ### Expected Behavior Describe clearly what the expected outcome or behavior should be. ### Actual Behavior Describe clearly what the actual outcome or behavior is. ### Screenshots or Logs Provide screenshots, logs, or error messages if applicable. ### Environment - Task Master version: - Node.js version: - Operating system: - IDE (if applicable): ### Additional Context Any additional information or context that might help diagnose the issue. ``` -------------------------------------------------------------------------------- /src/ai-providers/index.js: -------------------------------------------------------------------------------- ```javascript /** * src/ai-providers/index.js * Central export point for all AI provider classes */ export { AnthropicAIProvider } from './anthropic.js'; export { PerplexityAIProvider } from './perplexity.js'; export { GoogleAIProvider } from './google.js'; export { OpenAIProvider } from './openai.js'; export { XAIProvider } from './xai.js'; export { GroqProvider } from './groq.js'; export { OpenRouterAIProvider } from './openrouter.js'; export { OllamaAIProvider } from './ollama.js'; export { BedrockAIProvider } from './bedrock.js'; export { AzureProvider } from './azure.js'; export { VertexAIProvider } from './google-vertex.js'; export { ClaudeCodeProvider } from './claude-code.js'; export { GeminiCliProvider } from './gemini-cli.js'; export { GrokCliProvider } from './grok-cli.js'; ``` -------------------------------------------------------------------------------- /assets/config.json: -------------------------------------------------------------------------------- ```json { "models": { "main": { "provider": "anthropic", "modelId": "claude-3-7-sonnet-20250219", "maxTokens": 100000, "temperature": 0.2 }, "research": { "provider": "perplexity", "modelId": "sonar-pro", "maxTokens": 8700, "temperature": 0.1 }, "fallback": { "provider": "anthropic", "modelId": "claude-3-7-sonnet-20250219", "maxTokens": 8192, "temperature": 0.2 } }, "global": { "logLevel": "info", "debug": false, "defaultSubtasks": 5, "defaultPriority": "medium", "projectName": "Taskmaster", "defaultTag": "master", "ollamaBaseURL": "http://localhost:11434/api", "azureOpenaiBaseURL": "https://your-endpoint.openai.azure.com/", "bedrockBaseURL": "https://bedrock.us-east-1.amazonaws.com", "responseLanguage": "English" } } ``` -------------------------------------------------------------------------------- /apps/extension/src/utils/event-emitter.ts: -------------------------------------------------------------------------------- ```typescript /** * Simple Event Emitter * Lightweight alternative to complex event bus */ export type EventHandler = (...args: any[]) => void | Promise<void>; export class EventEmitter { private handlers = new Map<string, Set<EventHandler>>(); on(event: string, handler: EventHandler): () => void { if (!this.handlers.has(event)) { this.handlers.set(event, new Set()); } this.handlers.get(event)?.add(handler); // Return unsubscribe function return () => this.off(event, handler); } off(event: string, handler: EventHandler): void { this.handlers.get(event)?.delete(handler); } emit(event: string, ...args: any[]): void { this.handlers.get(event)?.forEach((handler) => { try { handler(...args); } catch (error) { console.error(`Error in event handler for ${event}:`, error); } }); } } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/utils/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Utility functions for the tm-core package * This file exports all utility functions and helper classes */ // Export ID generation utilities export { generateTaskId as generateId, // Alias for backward compatibility generateTaskId, generateSubtaskId, isValidTaskId, isValidSubtaskId, getParentTaskId } from './id-generator.js'; // Additional utility exports /** * Formats a date for task timestamps * @deprecated This is a placeholder function that will be properly implemented in later tasks */ export function formatDate(date: Date = new Date()): string { return date.toISOString(); } /** * Deep clones an object * @deprecated This is a placeholder function that will be properly implemented in later tasks */ export function deepClone<T>(obj: T): T { return JSON.parse(JSON.stringify(obj)); } ``` -------------------------------------------------------------------------------- /bin/task-master.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Task Master * Copyright (c) 2025 Eyal Toledano, Ralph Khreish * * This software is licensed under the MIT License with Commons Clause. * You may use this software for any purpose, including commercial applications, * and modify and redistribute it freely, subject to the following restrictions: * * 1. You may not sell this software or offer it as a service. * 2. The origin of this software must not be misrepresented. * 3. Altered source versions must be plainly marked as such. * * For the full license text, see the LICENSE file in the root directory. */ /** * Claude Task Master CLI * Main entry point for globally installed package */ // Direct imports instead of spawning child processes import { runCLI } from '../scripts/modules/commands.js'; // Simply run the CLI directly runCLI(); ``` -------------------------------------------------------------------------------- /src/constants/task-status.js: -------------------------------------------------------------------------------- ```javascript /** * @typedef {'pending' | 'done' | 'in-progress' | 'review' | 'deferred' | 'cancelled'} TaskStatus */ /** * Task status options list * @type {TaskStatus[]} * @description Defines possible task statuses: * - pending: Task waiting to start * - done: Task completed * - in-progress: Task in progress * - review: Task completed and waiting for review * - deferred: Task postponed or paused * - cancelled: Task cancelled and will not be completed */ export const TASK_STATUS_OPTIONS = [ 'pending', 'done', 'in-progress', 'review', 'deferred', 'cancelled' ]; /** * Check if a given status is a valid task status * @param {string} status - The status to check * @returns {boolean} True if the status is valid, false otherwise */ export function isValidTaskStatus(status) { return TASK_STATUS_OPTIONS.includes(status); } ``` -------------------------------------------------------------------------------- /src/constants/providers.js: -------------------------------------------------------------------------------- ```javascript /** * Provider validation constants * Defines which providers should be validated against the supported-models.json file */ // Providers that have predefined model lists and should be validated export const VALIDATED_PROVIDERS = [ 'anthropic', 'openai', 'google', 'perplexity', 'xai', 'groq', 'mistral' ]; // Custom providers object for easy named access export const CUSTOM_PROVIDERS = { AZURE: 'azure', VERTEX: 'vertex', BEDROCK: 'bedrock', OPENROUTER: 'openrouter', OLLAMA: 'ollama', CLAUDE_CODE: 'claude-code', MCP: 'mcp', GEMINI_CLI: 'gemini-cli', GROK_CLI: 'grok-cli' }; // Custom providers array (for backward compatibility and iteration) export const CUSTOM_PROVIDERS_ARRAY = Object.values(CUSTOM_PROVIDERS); // All known providers (for reference) export const ALL_PROVIDERS = [ ...VALIDATED_PROVIDERS, ...CUSTOM_PROVIDERS_ARRAY ]; ``` -------------------------------------------------------------------------------- /apps/cli/src/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Main entry point for @tm/cli package * Exports all public APIs for the CLI presentation layer */ // Commands export { ListTasksCommand } from './commands/list.command.js'; export { ShowCommand } from './commands/show.command.js'; export { AuthCommand } from './commands/auth.command.js'; export { ContextCommand } from './commands/context.command.js'; export { StartCommand } from './commands/start.command.js'; export { SetStatusCommand } from './commands/set-status.command.js'; // UI utilities (for other commands to use) export * as ui from './utils/ui.js'; // Auto-update utilities export { checkForUpdate, performAutoUpdate, displayUpgradeNotification, compareVersions } from './utils/auto-update.js'; // Re-export commonly used types from tm-core export type { Task, TaskStatus, TaskPriority, TaskMasterCore } from '@tm/core'; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/init/init-project-quick.md: -------------------------------------------------------------------------------- ```markdown Quick initialization with auto-confirmation. Arguments: $ARGUMENTS Initialize a Task Master project without prompts, accepting all defaults. ## Quick Setup ```bash task-master init -y ``` ## What It Does 1. Creates `.taskmaster/` directory structure 2. Initializes empty `tasks.json` 3. Sets up default configuration 4. Uses directory name as project name 5. Skips all confirmation prompts ## Smart Defaults - Project name: Current directory name - Description: "Task Master Project" - Model config: Existing environment vars - Task structure: Standard format ## Next Steps After quick init: 1. Configure AI models if needed: ``` /project:tm/models/setup ``` 2. Parse PRD if available: ``` /project:tm/parse-prd <file> ``` 3. Or create first task: ``` /project:tm/add-task create initial setup ``` Perfect for rapid project setup! ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/init/init-project-quick.md: -------------------------------------------------------------------------------- ```markdown Quick initialization with auto-confirmation. Arguments: $ARGUMENTS Initialize a Task Master project without prompts, accepting all defaults. ## Quick Setup ```bash task-master init -y ``` ## What It Does 1. Creates `.taskmaster/` directory structure 2. Initializes empty `tasks.json` 3. Sets up default configuration 4. Uses directory name as project name 5. Skips all confirmation prompts ## Smart Defaults - Project name: Current directory name - Description: "Task Master Project" - Model config: Existing environment vars - Task structure: Standard format ## Next Steps After quick init: 1. Configure AI models if needed: ``` /project:tm/models/setup ``` 2. Parse PRD if available: ``` /project:tm/parse-prd <file> ``` 3. Or create first task: ``` /project:tm/add-task create initial setup ``` Perfect for rapid project setup! ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/constants/index.ts: -------------------------------------------------------------------------------- ```typescript /** * Application constants */ import type { Status } from '@/components/ui/shadcn-io/kanban'; export const kanbanStatuses = [ { id: 'pending', title: 'Pending', color: 'yellow', className: 'text-yellow-600 border-yellow-600/20' }, { id: 'in-progress', title: 'In Progress', color: 'blue', className: 'text-blue-600 border-blue-600/20' }, { id: 'review', title: 'Review', color: 'purple', className: 'text-purple-600 border-purple-600/20' }, { id: 'done', title: 'Done', color: 'green', className: 'text-green-600 border-green-600/20' }, { id: 'deferred', title: 'Deferred', color: 'gray', className: 'text-gray-600 border-gray-600/20' } ] as const; export const CACHE_DURATION = 30000; // 30 seconds export const REQUEST_TIMEOUT = 30000; // 30 seconds export const HEADER_HEIGHT = 73; // Header with padding and border ``` -------------------------------------------------------------------------------- /.taskmaster/tasks/task_002_tm-start.txt: -------------------------------------------------------------------------------- ``` # Task ID: 2 # Title: Register start command in CLI # Status: pending # Dependencies: 7 # Priority: high # Description: Register the start command in the CLI application # Details: 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. In `apps/cli/src/index.ts` or the appropriate file where commands are registered: ```typescript import { StartCommand } from './commands/start.command'; // Add StartCommand to the commands array const commands = [ // ... existing commands new StartCommand(), ]; // Register all commands commands.forEach(command => command.register(program)); ``` # Test Strategy: 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. ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/components/suggested-steps.component.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Suggested next steps component * Displays helpful command suggestions at the end of the list */ import chalk from 'chalk'; import boxen from 'boxen'; /** * Display suggested next steps section */ export function displaySuggestedNextSteps(): void { const steps = [ `${chalk.cyan('1.')} Run ${chalk.yellow('task-master next')} to see what to work on next`, `${chalk.cyan('2.')} Run ${chalk.yellow('task-master expand --id=<id>')} to break down a task into subtasks`, `${chalk.cyan('3.')} Run ${chalk.yellow('task-master set-status --id=<id> --status=done')} to mark a task as complete` ]; console.log( boxen( chalk.white.bold('Suggested Next Steps:') + '\n\n' + steps.join('\n'), { padding: 1, margin: { top: 0, bottom: 1 }, borderStyle: 'round', borderColor: 'gray', width: process.stdout.columns * 0.97 } ) ); } ``` -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "lib": ["ES2022"], "types": ["node"], "allowJs": true, "resolveJsonModule": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "noEmit": true, "baseUrl": ".", "paths": { "@tm/core": ["./packages/tm-core/src/index.ts"], "@tm/core/*": ["./packages/tm-core/src/*"], "@tm/cli": ["./apps/cli/src/index.ts"], "@tm/cli/*": ["./apps/cli/src/*"], "@tm/build-config": ["./packages/build-config/src/index.ts"], "@tm/build-config/*": ["./packages/build-config/src/*"] } }, "tsx": { "tsconfig": { "allowImportingTsExtensions": false } }, "include": [ "bin/**/*", "scripts/**/*", "packages/*/src/**/*", "apps/*/src/**/*" ], "exclude": ["node_modules", "dist", "**/dist"] } ``` -------------------------------------------------------------------------------- /.github/workflows/auto-close-duplicates.yml: -------------------------------------------------------------------------------- ```yaml name: Auto-close duplicate issues # description: Auto-closes issues that are duplicates of existing issues on: schedule: - cron: "0 9 * * *" # Runs daily at 9 AM UTC workflow_dispatch: jobs: auto-close-duplicates: runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read issues: write # Need write permission to close issues and add comments steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Auto-close duplicate issues run: node .github/scripts/auto-close-duplicates.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }} ``` -------------------------------------------------------------------------------- /apps/cli/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown # @tm/cli ## null ### Patch Changes - Updated dependencies []: - @tm/core@null ## 0.27.0 ### Patch Changes - Updated dependencies []: - @tm/[email protected] ## 0.27.0-rc.0 ### Minor Changes - [#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 ## 1.1.0-rc.0 ### Minor Changes - [#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 ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/providers/QueryProvider.tsx: -------------------------------------------------------------------------------- ```typescript import React from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; // Create a stable query client const queryClient = new QueryClient({ defaultOptions: { queries: { // Don't refetch on window focus by default refetchOnWindowFocus: false, // Keep data fresh for 30 seconds staleTime: 30 * 1000, // Cache data for 5 minutes gcTime: 5 * 60 * 1000, // Retry failed requests 3 times retry: 3, // Retry delay exponentially backs off retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000) }, mutations: { // Don't retry mutations by default retry: false } } }); interface QueryProviderProps { children: React.ReactNode; } export const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => { return ( <QueryClientProvider client={queryClient}>{children}</QueryClientProvider> ); }; ``` -------------------------------------------------------------------------------- /packages/tm-core/src/storage/file-storage/path-resolver.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Path resolution utilities for single tasks.json file */ import path from 'node:path'; /** * Handles path resolution for the single tasks.json file storage */ export class PathResolver { private readonly basePath: string; private readonly tasksDir: string; private readonly tasksFilePath: string; constructor(projectPath: string) { this.basePath = path.join(projectPath, '.taskmaster'); this.tasksDir = path.join(this.basePath, 'tasks'); this.tasksFilePath = path.join(this.tasksDir, 'tasks.json'); } /** * Get the base storage directory path */ getBasePath(): string { return this.basePath; } /** * Get the tasks directory path */ getTasksDir(): string { return this.tasksDir; } /** * Get the path to the single tasks.json file * All tags are stored in this one file */ getTasksPath(): string { return this.tasksFilePath; } } ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-in-progress.md: -------------------------------------------------------------------------------- ```markdown Start working on a task by setting its status to in-progress. Arguments: $ARGUMENTS (task ID) ## Starting Work on Task This command does more than just change status - it prepares your environment for productive work. ## Pre-Start Checks 1. Verify dependencies are met 2. Check if another task is already in-progress 3. Ensure task details are complete 4. Validate test strategy exists ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=in-progress ``` ## Environment Setup After setting to in-progress: 1. Create/checkout appropriate git branch 2. Open relevant documentation 3. Set up test watchers if applicable 4. Display task details and acceptance criteria 5. Show similar completed tasks for reference ## Smart Suggestions - Estimated completion time based on complexity - Related files from similar tasks - Potential blockers to watch for - Recommended first steps ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-in-progress.md: -------------------------------------------------------------------------------- ```markdown Start working on a task by setting its status to in-progress. Arguments: $ARGUMENTS (task ID) ## Starting Work on Task This command does more than just change status - it prepares your environment for productive work. ## Pre-Start Checks 1. Verify dependencies are met 2. Check if another task is already in-progress 3. Ensure task details are complete 4. Validate test strategy exists ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=in-progress ``` ## Environment Setup After setting to in-progress: 1. Create/checkout appropriate git branch 2. Open relevant documentation 3. Set up test watchers if applicable 4. Display task details and acceptance criteria 5. Show similar completed tasks for reference ## Smart Suggestions - Estimated completion time based on complexity - Related files from similar tasks - Potential blockers to watch for - Recommended first steps ``` -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- ```json { "$schema": "https://turbo.build/schema.json", "extends": ["//"], "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"], "outputLogs": "new-only" }, "dev": { "cache": false, "persistent": true, "inputs": [ "$TURBO_DEFAULT$", "!{packages,apps}/**/dist/**", "!{packages,apps}/**/node_modules/**" ] }, "test:watch": { "cache": false, "persistent": true, "dependsOn": ["^build"] }, "lint": { "dependsOn": ["^build"], "inputs": [ "$TURBO_DEFAULT$", "!{packages,apps}/**/dist/**", "!{packages,apps}/**/node_modules/**" ], "outputLogs": "new-only" }, "typecheck": { "dependsOn": ["^build"], "inputs": [ "$TURBO_DEFAULT$", "!{packages,apps}/**/dist/**", "!{packages,apps}/**/node_modules/**" ], "outputLogs": "new-only" } }, "globalDependencies": ["turbo.json", "tsconfig.json", ".env*"] } ``` -------------------------------------------------------------------------------- /mcp-server/src/core/direct-functions/response-language.js: -------------------------------------------------------------------------------- ```javascript /** * response-language.js * Direct function for managing response language via MCP */ import { setResponseLanguage } from '../../../../scripts/modules/task-manager.js'; import { enableSilentMode, disableSilentMode } from '../../../../scripts/modules/utils.js'; import { createLogWrapper } from '../../tools/utils.js'; export async function responseLanguageDirect(args, log, context = {}) { const { projectRoot, language } = args; const mcpLog = createLogWrapper(log); log.info( `Executing response-language_direct with args: ${JSON.stringify(args)}` ); log.info(`Using project root: ${projectRoot}`); try { enableSilentMode(); return setResponseLanguage(language, { mcpLog, projectRoot }); } catch (error) { return { success: false, error: { code: 'DIRECT_FUNCTION_ERROR', message: error.message, details: error.stack } }; } finally { disableSilentMode(); } } ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/integration.md: -------------------------------------------------------------------------------- ```markdown # 🔌 New Integration ## What tool/IDE is being integrated? <!-- Name and brief description --> ## What can users do with it? <!-- Key benefits --> ## How to Enable ### Setup ```bash task-master rules add [name] # Any other setup steps ``` ### Example Usage <!-- Show it in action --> ```bash # Real example ``` ### Natural Language Hooks (if applicable) ``` "When tests pass, mark task as done" # Other examples ``` ## Contributor Checklist - [ ] Created changeset: `npm run changeset` - [ ] Tests pass: `npm test` - [ ] Format check passes: `npm run format-check` - [ ] Addressed CodeRabbit comments - [ ] Integration fully tested with target tool/IDE - [ ] Error scenarios tested - [ ] Added integration tests - [ ] Documentation includes setup guide - [ ] Examples are working and clear --- ## For Maintainers - [ ] Integration stability verified - [ ] Documentation comprehensive - [ ] Examples working ``` -------------------------------------------------------------------------------- /scripts/task-complexity-report.json: -------------------------------------------------------------------------------- ```json { "meta": { "generatedAt": "2025-06-14T02:15:51.082Z", "tasksAnalyzed": 2, "totalTasks": 3, "analysisCount": 5, "thresholdScore": 5, "projectName": "Test Project", "usedResearch": false }, "complexityAnalysis": [ { "id": 1, "complexity": 3, "subtaskCount": 2 }, { "id": 2, "complexity": 7, "subtaskCount": 5 }, { "id": 3, "complexity": 9, "subtaskCount": 8 }, { "taskId": 1, "taskTitle": "Task 1", "complexityScore": 5, "recommendedSubtasks": 3, "expansionPrompt": "Break down this task with a focus on task 1.", "reasoning": "Automatically added due to missing analysis in AI response." }, { "taskId": 2, "taskTitle": "Task 2", "complexityScore": 5, "recommendedSubtasks": 3, "expansionPrompt": "Break down this task with a focus on task 2.", "reasoning": "Automatically added due to missing analysis in AI response." } ] } ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-done.md: -------------------------------------------------------------------------------- ```markdown Mark a task as completed. Arguments: $ARGUMENTS (task ID) ## Completing a Task This command validates task completion and updates project state intelligently. ## Pre-Completion Checks 1. Verify test strategy was followed 2. Check if all subtasks are complete 3. Validate acceptance criteria met 4. Ensure code is committed ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=done ``` ## Post-Completion Actions 1. **Update Dependencies** - Identify newly unblocked tasks - Update sprint progress - Recalculate project timeline 2. **Documentation** - Generate completion summary - Update CLAUDE.md with learnings - Log implementation approach 3. **Next Steps** - Show newly available tasks - Suggest logical next task - Update velocity metrics ## Celebration & Learning - Show impact of completion - Display unblocked work - Recognize achievement - Capture lessons learned ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-done.md: -------------------------------------------------------------------------------- ```markdown Mark a task as completed. Arguments: $ARGUMENTS (task ID) ## Completing a Task This command validates task completion and updates project state intelligently. ## Pre-Completion Checks 1. Verify test strategy was followed 2. Check if all subtasks are complete 3. Validate acceptance criteria met 4. Ensure code is committed ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=done ``` ## Post-Completion Actions 1. **Update Dependencies** - Identify newly unblocked tasks - Update sprint progress - Recalculate project timeline 2. **Documentation** - Generate completion summary - Update CLAUDE.md with learnings - Log implementation approach 3. **Next Steps** - Show newly available tasks - Suggest logical next task - Update velocity metrics ## Celebration & Learning - Show impact of completion - Display unblocked work - Recognize achievement - Capture lessons learned ``` -------------------------------------------------------------------------------- /apps/docs/logo/dark.svg: -------------------------------------------------------------------------------- ``` <svg width="800" height="240" viewBox="0 0 800 240" xmlns="http://www.w3.org/2000/svg"> <!-- Background --> <rect width="800" height="240" fill="transparent"/> <!-- Curly braces --> <text x="40" y="156" font-size="140" fill="white" font-family="monospace">{</text> <text x="230" y="156" font-size="140" fill="white" font-family="monospace">}</text> <!-- Blue form with check --> <rect x="120" y="50" width="120" height="140" rx="16" fill="#3366CC"/> <polyline points="150,110 164,128 190,84" fill="none" stroke="white" stroke-width="10"/> <circle cx="150" cy="144" r="7" fill="white"/> <rect x="168" y="140" width="48" height="10" fill="white"/> <circle cx="150" cy="168" r="7" fill="white"/> <rect x="168" y="164" width="48" height="10" fill="white"/> <!-- Text --> <text x="340" y="156" font-family="Arial, sans-serif" font-size="76" font-weight="bold" fill="white">Task Master</text> </svg> ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/AppContent.tsx: -------------------------------------------------------------------------------- ```typescript import React from 'react'; import { TaskMasterKanban } from './TaskMasterKanban'; import TaskDetailsView from '@/components/TaskDetailsView'; import { ConfigView } from '@/components/ConfigView'; import { useVSCodeContext } from '../contexts/VSCodeContext'; export const AppContent: React.FC = () => { const { state, dispatch, sendMessage } = useVSCodeContext(); if (state.currentView === 'config') { return ( <ConfigView sendMessage={sendMessage} onNavigateBack={() => dispatch({ type: 'NAVIGATE_TO_KANBAN' })} /> ); } if (state.currentView === 'task-details' && state.selectedTaskId) { return ( <TaskDetailsView taskId={state.selectedTaskId} onNavigateBack={() => dispatch({ type: 'NAVIGATE_TO_KANBAN' })} onNavigateToTask={(taskId: string) => dispatch({ type: 'NAVIGATE_TO_TASK', payload: taskId }) } /> ); } // Default to Kanban view return <TaskMasterKanban />; }; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-review.md: -------------------------------------------------------------------------------- ```markdown Set a task's status to review. Arguments: $ARGUMENTS (task ID) ## Marking Task for Review This status indicates work is complete but needs verification before final approval. ## When to Use Review Status - Code complete but needs peer review - Implementation done but needs testing - Documentation written but needs proofreading - Design complete but needs stakeholder approval ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=review ``` ## Review Preparation When setting to review: 1. **Generate Review Checklist** - Link to PR/MR if applicable - Highlight key changes - Note areas needing attention - Include test results 2. **Documentation** - Update task with review notes - Link relevant artifacts - Specify reviewers if known 3. **Smart Actions** - Create review reminders - Track review duration - Suggest reviewers based on expertise - Prepare rollback plan if needed ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-review.md: -------------------------------------------------------------------------------- ```markdown Set a task's status to review. Arguments: $ARGUMENTS (task ID) ## Marking Task for Review This status indicates work is complete but needs verification before final approval. ## When to Use Review Status - Code complete but needs peer review - Implementation done but needs testing - Documentation written but needs proofreading - Design complete but needs stakeholder approval ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=review ``` ## Review Preparation When setting to review: 1. **Generate Review Checklist** - Link to PR/MR if applicable - Highlight key changes - Note areas needing attention - Include test results 2. **Documentation** - Update task with review notes - Link relevant artifacts - Specify reviewers if known 3. **Smart Actions** - Create review reminders - Track review duration - Suggest reviewers based on expertise - Prepare rollback plan if needed ``` -------------------------------------------------------------------------------- /apps/docs/logo/light.svg: -------------------------------------------------------------------------------- ``` <svg width="800" height="240" viewBox="0 0 800 240" xmlns="http://www.w3.org/2000/svg"> <!-- Background --> <rect width="800" height="240" fill="transparent"/> <!-- Curly braces --> <text x="40" y="156" font-size="140" fill="#000000" font-family="monospace">{</text> <text x="230" y="156" font-size="140" fill="#000000" font-family="monospace">}</text> <!-- Blue form with check --> <rect x="120" y="50" width="120" height="140" rx="16" fill="#3366CC"/> <polyline points="150,110 164,128 190,84" fill="none" stroke="#FFFFFF" stroke-width="10"/> <circle cx="150" cy="144" r="7" fill="#FFFFFF"/> <rect x="168" y="140" width="48" height="10" fill="#FFFFFF"/> <circle cx="150" cy="168" r="7" fill="#FFFFFF"/> <rect x="168" y="164" width="48" height="10" fill="#FFFFFF"/> <!-- Text --> <text x="340" y="156" font-family="Arial, sans-serif" font-size="76" font-weight="bold" fill="#000000">Task Master</text> </svg> ``` -------------------------------------------------------------------------------- /apps/cli/tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", "module": "NodeNext", "lib": ["ES2022"], "declaration": true, "declarationMap": true, "sourceMap": true, "outDir": "./dist", "baseUrl": ".", "rootDir": "./src", "strict": true, "noImplicitAny": true, "strictNullChecks": true, "strictFunctionTypes": true, "strictBindCallApply": true, "strictPropertyInitialization": true, "noImplicitThis": true, "alwaysStrict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "NodeNext", "moduleDetection": "force", "types": ["node"], "resolveJsonModule": true, "isolatedModules": true, "allowImportingTsExtensions": false }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests", "**/*.test.ts", "**/*.spec.ts"] } ``` -------------------------------------------------------------------------------- /packages/tm-core/tsconfig.json: -------------------------------------------------------------------------------- ```json { "compilerOptions": { "target": "ES2022", "module": "NodeNext", "lib": ["ES2022"], "declaration": true, "declarationMap": true, "sourceMap": true, "outDir": "./dist", "baseUrl": ".", "rootDir": "./src", "strict": true, "noImplicitAny": true, "strictNullChecks": true, "strictFunctionTypes": true, "strictBindCallApply": true, "strictPropertyInitialization": true, "noImplicitThis": true, "alwaysStrict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "NodeNext", "moduleDetection": "force", "types": ["node"], "resolveJsonModule": true, "isolatedModules": true, "allowImportingTsExtensions": false }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests", "**/*.test.ts", "**/*.spec.ts"] } ``` -------------------------------------------------------------------------------- /apps/cli/src/ui/components/header.component.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Task Master header component * Displays the banner, version, project info, and file path */ import chalk from 'chalk'; /** * Header configuration options */ export interface HeaderOptions { title?: string; tag?: string; filePath?: string; } /** * Display the Task Master header with project info */ export function displayHeader(options: HeaderOptions = {}): void { const { filePath, tag } = options; // Display tag and file path info if (tag) { let tagInfo = ''; if (tag && tag !== 'master') { tagInfo = `🏷 tag: ${chalk.cyan(tag)}`; } else { tagInfo = `🏷 tag: ${chalk.cyan('master')}`; } console.log(tagInfo); if (filePath) { // Convert to absolute path if it's relative const absolutePath = filePath.startsWith('/') ? filePath : `${process.cwd()}/${filePath}`; console.log(`Listing tasks from: ${chalk.dim(absolutePath)}`); } console.log(); // Empty line for spacing } } ``` -------------------------------------------------------------------------------- /.claude/commands/tm/list/list-tasks-by-status.md: -------------------------------------------------------------------------------- ```markdown List tasks filtered by a specific status. Arguments: $ARGUMENTS Parse the status from arguments and list only tasks matching that status. ## Status Options - `pending` - Not yet started - `in-progress` - Currently being worked on - `done` - Completed - `review` - Awaiting review - `deferred` - Postponed - `cancelled` - Cancelled ## Execution Based on $ARGUMENTS, run: ```bash task-master list --status=$ARGUMENTS ``` ## Enhanced Display For the filtered results: - Group by priority within the status - Show time in current status - Highlight tasks approaching deadlines - Display blockers and dependencies - Suggest next actions for each status group ## Intelligent Insights Based on the status filter: - **Pending**: Show recommended start order - **In-Progress**: Display idle time warnings - **Done**: Show newly unblocked tasks - **Review**: Indicate review duration - **Deferred**: Show reactivation criteria - **Cancelled**: Display impact analysis ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/list/list-tasks-by-status.md: -------------------------------------------------------------------------------- ```markdown List tasks filtered by a specific status. Arguments: $ARGUMENTS Parse the status from arguments and list only tasks matching that status. ## Status Options - `pending` - Not yet started - `in-progress` - Currently being worked on - `done` - Completed - `review` - Awaiting review - `deferred` - Postponed - `cancelled` - Cancelled ## Execution Based on $ARGUMENTS, run: ```bash task-master list --status=$ARGUMENTS ``` ## Enhanced Display For the filtered results: - Group by priority within the status - Show time in current status - Highlight tasks approaching deadlines - Display blockers and dependencies - Suggest next actions for each status group ## Intelligent Insights Based on the status filter: - **Pending**: Show recommended start order - **In-Progress**: Display idle time warnings - **Done**: Show newly unblocked tasks - **Review**: Indicate review duration - **Deferred**: Show reactivation criteria - **Cancelled**: Display impact analysis ``` -------------------------------------------------------------------------------- /apps/docs/introduction.mdx: -------------------------------------------------------------------------------- ```markdown <Tip> Welcome to v1 of the Task Master Docs. Expect weekly updates as we expand and refine each section. </Tip> We've organized the docs into three sections depending on your experience level and goals: ### Getting Started - Jump in to [Quick Start](/docs/getting-started/quick-start) Designed for first-time users. Get set up, create your first PRD, and run your first task. ### Best Practices Covers common workflows, strategic usage of commands, model configuration tips, and real-world usage patterns. Recommended for active users. ### Technical Capabilities A detailed glossary of every root command and available capability — meant for power users and contributors. --- Thanks for being here early. If you spot something broken or want to contribute, check out the [GitHub repo](https://github.com/eyaltoledano/claude-task-master). Have questions? Join our [Discord community](https://discord.gg/fWJkU7rf) to connect with other users and get help from the team. ``` -------------------------------------------------------------------------------- /.taskmaster/config.json: -------------------------------------------------------------------------------- ```json { "models": { "main": { "provider": "anthropic", "modelId": "claude-sonnet-4-20250514", "maxTokens": 64000, "temperature": 0.2 }, "research": { "provider": "perplexity", "modelId": "sonar", "maxTokens": 8700, "temperature": 0.1 }, "fallback": { "provider": "anthropic", "modelId": "claude-3-7-sonnet-20250219", "maxTokens": 120000, "temperature": 0.2 } }, "global": { "logLevel": "info", "debug": false, "defaultNumTasks": 10, "defaultSubtasks": 5, "defaultPriority": "medium", "projectName": "Taskmaster", "ollamaBaseURL": "http://localhost:11434/api", "bedrockBaseURL": "https://bedrock.us-east-1.amazonaws.com", "responseLanguage": "English", "enableCodebaseAnalysis": true, "userId": "1234567890", "azureBaseURL": "https://your-endpoint.azure.com/", "defaultTag": "master" }, "claudeCode": {}, "grokCli": { "timeout": 120000, "workingDirectory": null, "defaultModel": "grok-4-latest" } } ``` -------------------------------------------------------------------------------- /.github/scripts/tag-extension.mjs: -------------------------------------------------------------------------------- ``` #!/usr/bin/env node import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { findRootDir, createAndPushTag } from './utils.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const rootDir = findRootDir(__dirname); // Read the extension's package.json const extensionDir = join(rootDir, 'apps', 'extension'); const pkgPath = join(extensionDir, 'package.json'); let pkg; try { const pkgContent = readFileSync(pkgPath, 'utf8'); pkg = JSON.parse(pkgContent); } catch (error) { console.error('Failed to read package.json:', error.message); process.exit(1); } // Ensure we have required fields assert(pkg.name, 'package.json must have a name field'); assert(pkg.version, 'package.json must have a version field'); const tag = `${pkg.name}@${pkg.version}`; // Create and push the tag if it doesn't exist createAndPushTag(tag); ``` -------------------------------------------------------------------------------- /packages/tm-core/src/config/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Configuration module exports * Exports the main ConfigManager and all configuration services */ // Export the main ConfigManager export { ConfigManager } from './config-manager.js'; // Export all configuration services for advanced usage export { ConfigLoader, ConfigMerger, CONFIG_PRECEDENCE, RuntimeStateManager, ConfigPersistence, EnvironmentConfigProvider, type ConfigSource, type RuntimeState, type PersistenceOptions } from './services/index.js'; // Re-export configuration interfaces export type { IConfiguration, PartialConfiguration, ModelConfig, ProviderConfig, TaskSettings, TagSettings, StorageSettings, RetrySettings, LoggingSettings, SecuritySettings, ConfigValidationResult, EnvironmentConfig, ConfigSchema, ConfigProperty, IConfigurationFactory, IConfigurationManager } from '../interfaces/configuration.interface.js'; // Re-export default values export { DEFAULT_CONFIG_VALUES } from '../interfaces/configuration.interface.js'; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/expand/expand-all-tasks.md: -------------------------------------------------------------------------------- ```markdown Expand all pending tasks that need subtasks. ## Bulk Task Expansion Intelligently expands all tasks that would benefit from breakdown. ## Execution ```bash task-master expand --all ``` ## Smart Selection Only expands tasks that: - Are marked as pending - Have high complexity (>5) - Lack existing subtasks - Would benefit from breakdown ## Expansion Process 1. **Analysis Phase** - Identify expansion candidates - Group related tasks - Plan expansion strategy 2. **Batch Processing** - Expand tasks in logical order - Maintain consistency - Preserve relationships - Optimize for parallelism 3. **Quality Control** - Ensure subtask quality - Avoid over-decomposition - Maintain task coherence - Update dependencies ## Options - Add `force` to expand all regardless of complexity - Add `research` for enhanced AI analysis ## Results After bulk expansion: - Summary of tasks expanded - New subtask count - Updated complexity metrics - Suggested task order ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/expand/expand-all-tasks.md: -------------------------------------------------------------------------------- ```markdown Expand all pending tasks that need subtasks. ## Bulk Task Expansion Intelligently expands all tasks that would benefit from breakdown. ## Execution ```bash task-master expand --all ``` ## Smart Selection Only expands tasks that: - Are marked as pending - Have high complexity (>5) - Lack existing subtasks - Would benefit from breakdown ## Expansion Process 1. **Analysis Phase** - Identify expansion candidates - Group related tasks - Plan expansion strategy 2. **Batch Processing** - Expand tasks in logical order - Maintain consistency - Preserve relationships - Optimize for parallelism 3. **Quality Control** - Ensure subtask quality - Avoid over-decomposition - Maintain task coherence - Update dependencies ## Options - Add `force` to expand all regardless of complexity - Add `research` for enhanced AI analysis ## Results After bulk expansion: - Summary of tasks expanded - New subtask count - Updated complexity metrics - Suggested task order ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/feature.md: -------------------------------------------------------------------------------- ```markdown ## ✨ New Feature ### 📋 Feature Description <!-- Brief description --> ### 🎯 Problem Statement <!-- What problem does this feature solve? Why is it needed? --> ### 💡 Solution <!-- How does this feature solve the problem? What's the approach? --> ### 🔗 Related Issues <!-- Link related issues: Fixes #123, Part of #456 --> ## How to Use It ### Quick Start ```bash # Basic usage example ``` ### Example <!-- Show a real use case --> ```bash # Practical example ``` **What you should see:** <!-- Expected behavior --> ## Contributor Checklist - [ ] Created changeset: `npm run changeset` - [ ] Tests pass: `npm test` - [ ] Format check passes: `npm run format-check` - [ ] Addressed CodeRabbit comments - [ ] Added tests for new functionality - [ ] Manually tested in CLI mode - [ ] Manually tested in MCP mode (if applicable) ## Changelog Entry <!-- One-liner for release notes --> --- ### For Maintainers - [ ] Feature aligns with project vision - [ ] CIs pass - [ ] Changeset file exists ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-deferred.md: -------------------------------------------------------------------------------- ```markdown Defer a task for later consideration. Arguments: $ARGUMENTS (task ID) ## Deferring a Task This status indicates a task is valid but not currently actionable or prioritized. ## Valid Reasons for Deferral - Waiting for external dependencies - Reprioritized for future sprint - Blocked by technical limitations - Resource constraints - Strategic timing considerations ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=deferred ``` ## Deferral Management When deferring: 1. **Document Reason** - Capture why it's being deferred - Set reactivation criteria - Note any partial work completed 2. **Impact Analysis** - Check dependent tasks - Update project timeline - Notify affected stakeholders 3. **Future Planning** - Set review reminders - Tag for specific milestone - Preserve context for reactivation - Link to blocking issues ## Smart Tracking - Monitor deferral duration - Alert when criteria met - Prevent scope creep - Regular review cycles ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-deferred.md: -------------------------------------------------------------------------------- ```markdown Defer a task for later consideration. Arguments: $ARGUMENTS (task ID) ## Deferring a Task This status indicates a task is valid but not currently actionable or prioritized. ## Valid Reasons for Deferral - Waiting for external dependencies - Reprioritized for future sprint - Blocked by technical limitations - Resource constraints - Strategic timing considerations ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=deferred ``` ## Deferral Management When deferring: 1. **Document Reason** - Capture why it's being deferred - Set reactivation criteria - Note any partial work completed 2. **Impact Analysis** - Check dependent tasks - Update project timeline - Notify affected stakeholders 3. **Future Planning** - Set review reminders - Tag for specific milestone - Preserve context for reactivation - Link to blocking issues ## Smart Tracking - Monitor deferral duration - Alert when criteria met - Prevent scope creep - Regular review cycles ``` -------------------------------------------------------------------------------- /packages/tm-core/src/auth/config.ts: -------------------------------------------------------------------------------- ```typescript /** * Centralized authentication configuration */ import os from 'os'; import path from 'path'; import { AuthConfig } from './types.js'; // Single base domain for all URLs // Build-time: process.env.TM_PUBLIC_BASE_DOMAIN gets replaced by tsup's env option // Default: https://tryhamster.com for production const BASE_DOMAIN = process.env.TM_PUBLIC_BASE_DOMAIN || // This gets replaced at build time by tsup 'https://tryhamster.com'; /** * Default authentication configuration * All URL configuration is derived from the single BASE_DOMAIN */ export const DEFAULT_AUTH_CONFIG: AuthConfig = { // Base domain for all services baseUrl: BASE_DOMAIN, // Configuration directory and file paths configDir: path.join(os.homedir(), '.taskmaster'), configFile: path.join(os.homedir(), '.taskmaster', 'auth.json') }; /** * Get merged configuration with optional overrides */ export function getAuthConfig(overrides?: Partial<AuthConfig>): AuthConfig { return { ...DEFAULT_AUTH_CONFIG, ...overrides }; } ``` -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- ```markdown # What type of PR is this? <!-- Check one --> - [ ] 🐛 Bug fix - [ ] ✨ Feature - [ ] 🔌 Integration - [ ] 📝 Docs - [ ] 🧹 Refactor - [ ] Other: ## Description <!-- What does this PR do? --> ## Related Issues <!-- Link issues: Fixes #123 --> ## How to Test This <!-- Quick steps to verify the changes work --> ```bash # Example commands or steps ``` **Expected result:** <!-- What should happen? --> ## Contributor Checklist - [ ] Created changeset: `npm run changeset` - [ ] Tests pass: `npm test` - [ ] Format check passes: `npm run format-check` (or `npm run format` to fix) - [ ] Addressed CodeRabbit comments (if any) - [ ] Linked related issues (if any) - [ ] Manually tested the changes ## Changelog Entry <!-- One line describing the change for users --> <!-- Example: "Added Kiro IDE integration with automatic task status updates" --> --- ### For Maintainers - [ ] PR title follows conventional commits - [ ] Target branch correct - [ ] Labels added - [ ] Milestone assigned (if applicable) ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/quick-start.mdx: -------------------------------------------------------------------------------- ```markdown --- title: Quick Start sidebarTitle: "Quick Start" --- This guide is for new users who want to start using Task Master with minimal setup time. It covers: - [Requirements](/docs/getting-started/quick-start/requirements): You will need Node.js and an AI model API Key. - [Installation](/docs/getting-started/quick-start/installation): How to Install Task Master. - [Configuration](/docs/getting-started/quick-start/configuration-quick): Setting up your API Key, MCP, and more. - [PRD](/docs/getting-started/quick-start/prd-quick): Writing and parsing your first PRD. - [Task Setup](/docs/getting-started/quick-start/tasks-quick): Preparing your tasks for execution. - [Executing Tasks](/docs/getting-started/quick-start/execute-quick): Using Task Master to execute tasks. - [Rules & Context](/docs/getting-started/quick-start/rules-quick): Learn how and why to build context in your project over time. <Tip> By the end of this guide, you'll have everything you need to begin working productively with Task Master. </Tip> ``` -------------------------------------------------------------------------------- /.claude/commands/tm/init/init-project.md: -------------------------------------------------------------------------------- ```markdown Initialize a new Task Master project. Arguments: $ARGUMENTS Parse arguments to determine initialization preferences. ## Initialization Process 1. **Parse Arguments** - PRD file path (if provided) - Project name - Auto-confirm flag (-y) 2. **Project Setup** ```bash task-master init ``` 3. **Smart Initialization** - Detect existing project files - Suggest project name from directory - Check for git repository - Verify AI provider configuration ## Configuration Options Based on arguments: - `quick` / `-y` → Skip confirmations - `<file.md>` → Use as PRD after init - `--name=<name>` → Set project name - `--description=<desc>` → Set description ## Post-Initialization After successful init: 1. Show project structure created 2. Verify AI models configured 3. Suggest next steps: - Parse PRD if available - Configure AI providers - Set up git hooks - Create first tasks ## Integration If PRD file provided: ``` /project:tm/init my-prd.md → Automatically runs parse-prd after init ``` ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/init/init-project.md: -------------------------------------------------------------------------------- ```markdown Initialize a new Task Master project. Arguments: $ARGUMENTS Parse arguments to determine initialization preferences. ## Initialization Process 1. **Parse Arguments** - PRD file path (if provided) - Project name - Auto-confirm flag (-y) 2. **Project Setup** ```bash task-master init ``` 3. **Smart Initialization** - Detect existing project files - Suggest project name from directory - Check for git repository - Verify AI provider configuration ## Configuration Options Based on arguments: - `quick` / `-y` → Skip confirmations - `<file.md>` → Use as PRD after init - `--name=<name>` → Set project name - `--description=<desc>` → Set description ## Post-Initialization After successful init: 1. Show project structure created 2. Verify AI models configured 3. Suggest next steps: - Parse PRD if available - Configure AI providers - Set up git hooks - Create first tasks ## Integration If PRD file provided: ``` /project:tm/init my-prd.md → Automatically runs parse-prd after init ``` ``` -------------------------------------------------------------------------------- /.github/scripts/release.mjs: -------------------------------------------------------------------------------- ``` #!/usr/bin/env node import { existsSync, unlinkSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { findRootDir, runCommand } from './utils.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const rootDir = findRootDir(__dirname); console.log('🚀 Starting release process...'); // Double-check we're not in pre-release mode (safety net) const preJsonPath = join(rootDir, '.changeset', 'pre.json'); if (existsSync(preJsonPath)) { console.log('⚠️ Warning: pre.json still exists. Removing it...'); unlinkSync(preJsonPath); } // Check if the extension version has changed and tag it // This prevents changeset from trying to publish the private package runCommand('node', [join(__dirname, 'tag-extension.mjs')]); // Run changeset publish for npm packages runCommand('npx', ['changeset', 'publish']); console.log('✅ Release process completed!'); // The extension tag (if created) will trigger the extension-release workflow ``` -------------------------------------------------------------------------------- /.claude/commands/tm/expand/expand-task.md: -------------------------------------------------------------------------------- ```markdown Break down a complex task into subtasks. Arguments: $ARGUMENTS (task ID) ## Intelligent Task Expansion Analyzes a task and creates detailed subtasks for better manageability. ## Execution ```bash task-master expand --id=$ARGUMENTS ``` ## Expansion Process 1. **Task Analysis** - Review task complexity - Identify components - Detect technical challenges - Estimate time requirements 2. **Subtask Generation** - Create 3-7 subtasks typically - Each subtask 1-4 hours - Logical implementation order - Clear acceptance criteria 3. **Smart Breakdown** - Setup/configuration tasks - Core implementation - Testing components - Integration steps - Documentation updates ## Enhanced Features Based on task type: - **Feature**: Setup → Implement → Test → Integrate - **Bug Fix**: Reproduce → Diagnose → Fix → Verify - **Refactor**: Analyze → Plan → Refactor → Validate ## Post-Expansion After expansion: 1. Show subtask hierarchy 2. Update time estimates 3. Suggest implementation order 4. Highlight critical path ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/expand/expand-task.md: -------------------------------------------------------------------------------- ```markdown Break down a complex task into subtasks. Arguments: $ARGUMENTS (task ID) ## Intelligent Task Expansion Analyzes a task and creates detailed subtasks for better manageability. ## Execution ```bash task-master expand --id=$ARGUMENTS ``` ## Expansion Process 1. **Task Analysis** - Review task complexity - Identify components - Detect technical challenges - Estimate time requirements 2. **Subtask Generation** - Create 3-7 subtasks typically - Each subtask 1-4 hours - Logical implementation order - Clear acceptance criteria 3. **Smart Breakdown** - Setup/configuration tasks - Core implementation - Testing components - Integration steps - Documentation updates ## Enhanced Features Based on task type: - **Feature**: Setup → Implement → Test → Integrate - **Bug Fix**: Reproduce → Diagnose → Fix → Verify - **Refactor**: Analyze → Plan → Refactor → Validate ## Post-Expansion After expansion: 1. Show subtask hierarchy 2. Update time estimates 3. Suggest implementation order 4. Highlight critical path ``` -------------------------------------------------------------------------------- /.claude/commands/tm/parse-prd/parse-prd.md: -------------------------------------------------------------------------------- ```markdown Parse a PRD document to generate tasks. Arguments: $ARGUMENTS (PRD file path) ## Intelligent PRD Parsing Analyzes your requirements document and generates a complete task breakdown. ## Execution ```bash task-master parse-prd --input=$ARGUMENTS ``` ## Parsing Process 1. **Document Analysis** - Extract key requirements - Identify technical components - Detect dependencies - Estimate complexity 2. **Task Generation** - Create 10-15 tasks by default - Include implementation tasks - Add testing tasks - Include documentation tasks - Set logical dependencies 3. **Smart Enhancements** - Group related functionality - Set appropriate priorities - Add acceptance criteria - Include test strategies ## Options Parse arguments for modifiers: - Number after filename → `--num-tasks` - `research` → Use research mode - `comprehensive` → Generate more tasks ## Post-Generation After parsing: 1. Display task summary 2. Show dependency graph 3. Suggest task expansion for complex items 4. Recommend sprint planning ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/parse-prd/parse-prd.md: -------------------------------------------------------------------------------- ```markdown Parse a PRD document to generate tasks. Arguments: $ARGUMENTS (PRD file path) ## Intelligent PRD Parsing Analyzes your requirements document and generates a complete task breakdown. ## Execution ```bash task-master parse-prd --input=$ARGUMENTS ``` ## Parsing Process 1. **Document Analysis** - Extract key requirements - Identify technical components - Detect dependencies - Estimate complexity 2. **Task Generation** - Create 10-15 tasks by default - Include implementation tasks - Add testing tasks - Include documentation tasks - Set logical dependencies 3. **Smart Enhancements** - Group related functionality - Set appropriate priorities - Add acceptance criteria - Include test strategies ## Options Parse arguments for modifiers: - Number after filename → `--num-tasks` - `research` → Use research mode - `comprehensive` → Generate more tasks ## Post-Generation After parsing: 1. Display task summary 2. Show dependency graph 3. Suggest task expansion for complex items 4. Recommend sprint planning ``` -------------------------------------------------------------------------------- /.claude/commands/tm/parse-prd/parse-prd-with-research.md: -------------------------------------------------------------------------------- ```markdown Parse PRD with enhanced research mode for better task generation. Arguments: $ARGUMENTS (PRD file path) ## Research-Enhanced Parsing Uses the research AI provider (typically Perplexity) for more comprehensive task generation with current best practices. ## Execution ```bash task-master parse-prd --input=$ARGUMENTS --research ``` ## Research Benefits 1. **Current Best Practices** - Latest framework patterns - Security considerations - Performance optimizations - Accessibility requirements 2. **Technical Deep Dive** - Implementation approaches - Library recommendations - Architecture patterns - Testing strategies 3. **Comprehensive Coverage** - Edge cases consideration - Error handling tasks - Monitoring setup - Deployment tasks ## Enhanced Output Research mode typically: - Generates more detailed tasks - Includes industry standards - Adds compliance considerations - Suggests modern tooling ## When to Use - New technology domains - Complex requirements - Regulatory compliance needed - Best practices crucial ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/parse-prd/parse-prd-with-research.md: -------------------------------------------------------------------------------- ```markdown Parse PRD with enhanced research mode for better task generation. Arguments: $ARGUMENTS (PRD file path) ## Research-Enhanced Parsing Uses the research AI provider (typically Perplexity) for more comprehensive task generation with current best practices. ## Execution ```bash task-master parse-prd --input=$ARGUMENTS --research ``` ## Research Benefits 1. **Current Best Practices** - Latest framework patterns - Security considerations - Performance optimizations - Accessibility requirements 2. **Technical Deep Dive** - Implementation approaches - Library recommendations - Architecture patterns - Testing strategies 3. **Comprehensive Coverage** - Edge cases consideration - Error handling tasks - Monitoring setup - Deployment tasks ## Enhanced Output Research mode typically: - Generates more detailed tasks - Includes industry standards - Adds compliance considerations - Suggests modern tooling ## When to Use - New technology domains - Complex requirements - Regulatory compliance needed - Best practices crucial ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/hooks/useWebviewHeight.ts: -------------------------------------------------------------------------------- ```typescript /** * Hook for managing webview height */ import { useState, useEffect, useCallback } from 'react'; export const useWebviewHeight = () => { const [availableHeight, setAvailableHeight] = useState<number>( window.innerHeight ); const updateAvailableHeight = useCallback(() => { const height = window.innerHeight; console.log('📏 Available height updated:', height); setAvailableHeight(height); }, []); useEffect(() => { updateAvailableHeight(); const handleResize = () => { updateAvailableHeight(); }; window.addEventListener('resize', handleResize); // Also listen for VS Code specific events if available const handleVisibilityChange = () => { // Small delay to ensure VS Code has finished resizing setTimeout(updateAvailableHeight, 100); }; document.addEventListener('visibilitychange', handleVisibilityChange); return () => { window.removeEventListener('resize', handleResize); document.removeEventListener('visibilitychange', handleVisibilityChange); }; }, [updateAvailableHeight]); return availableHeight; }; ``` -------------------------------------------------------------------------------- /.claude/commands/tm/models/setup-models.md: -------------------------------------------------------------------------------- ```markdown Run interactive setup to configure AI models. ## Interactive Model Configuration Guides you through setting up AI providers for Task Master. ## Execution ```bash task-master models --setup ``` ## Setup Process 1. **Environment Check** - Detect existing API keys - Show current configuration - Identify missing providers 2. **Provider Selection** - Choose main provider (required) - Select research provider (recommended) - Configure fallback (optional) 3. **API Key Configuration** - Prompt for missing keys - Validate key format - Test connectivity - Save configuration ## Smart Recommendations Based on your needs: - **For best results**: Claude + Perplexity - **Budget conscious**: GPT-3.5 + Perplexity - **Maximum capability**: GPT-4 + Perplexity + Claude fallback ## Configuration Storage Keys can be stored in: 1. Environment variables (recommended) 2. `.env` file in project 3. Global `.taskmaster/config` ## Post-Setup After configuration: - Test each provider - Show usage examples - Suggest next steps - Verify parse-prd works ``` -------------------------------------------------------------------------------- /.github/workflows/update-models-md.yml: -------------------------------------------------------------------------------- ```yaml name: Update models.md from supported-models.json on: push: branches: - main - next paths: - 'scripts/modules/supported-models.json' - 'docs/scripts/models-json-to-markdown.js' jobs: update_markdown: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Run transformation script run: node docs/scripts/models-json-to-markdown.js - name: Format Markdown with Prettier run: npx prettier --write docs/models.md - name: Stage docs/models.md run: git add docs/models.md - name: Commit & Push docs/models.md uses: actions-js/push@master with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: ${{ github.ref_name }} message: 'docs: Auto-update and format models.md' author_name: 'github-actions[bot]' author_email: 'github-actions[bot]@users.noreply.github.com' ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/models/setup-models.md: -------------------------------------------------------------------------------- ```markdown Run interactive setup to configure AI models. ## Interactive Model Configuration Guides you through setting up AI providers for Task Master. ## Execution ```bash task-master models --setup ``` ## Setup Process 1. **Environment Check** - Detect existing API keys - Show current configuration - Identify missing providers 2. **Provider Selection** - Choose main provider (required) - Select research provider (recommended) - Configure fallback (optional) 3. **API Key Configuration** - Prompt for missing keys - Validate key format - Test connectivity - Save configuration ## Smart Recommendations Based on your needs: - **For best results**: Claude + Perplexity - **Budget conscious**: GPT-3.5 + Perplexity - **Maximum capability**: GPT-4 + Perplexity + Claude fallback ## Configuration Storage Keys can be stored in: 1. Environment variables (recommended) 2. `.env` file in project 3. Global `.taskmaster/config` ## Post-Setup After configuration: - Test each provider - Show usage examples - Suggest next steps - Verify parse-prd works ``` -------------------------------------------------------------------------------- /src/prompts/schemas/variant.schema.json: -------------------------------------------------------------------------------- ```json { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://github.com/eyaltoledano/claude-task-master/blob/main/src/prompts/schemas/variant.schema.json", "version": "1.0.0", "title": "Task Master Prompt Variant", "description": "Schema for prompt template variants", "type": "object", "required": ["system", "user"], "properties": { "system": { "type": "string", "minLength": 1, "description": "System prompt template with variable placeholders" }, "user": { "type": "string", "minLength": 1, "description": "User prompt template with variable placeholders" }, "condition": { "type": "string", "description": "JavaScript expression for variant selection (optional, only for non-default variants)" }, "metadata": { "type": "object", "properties": { "description": { "type": "string", "description": "Description of when this variant should be used" }, "tags": { "type": "array", "items": { "type": "string" }, "description": "Tags for categorizing this variant" } } } } } ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/contexts/VSCodeContext.tsx: -------------------------------------------------------------------------------- ```typescript /** * VS Code API Context * Provides access to VS Code API and webview state */ import React, { createContext, useContext } from 'react'; import type { AppState, AppAction, ToastNotification } from '../types'; export interface VSCodeContextValue { vscode?: ReturnType<NonNullable<typeof window.acquireVsCodeApi>>; state: AppState; dispatch: React.Dispatch<AppAction>; sendMessage: (message: any) => Promise<any>; availableHeight: number; // Toast notification functions showSuccessToast: (title: string, message: string, duration?: number) => void; showInfoToast: (title: string, message: string, duration?: number) => void; showWarningToast: (title: string, message: string, duration?: number) => void; showErrorToast: (title: string, message: string, duration?: number) => void; } export const VSCodeContext = createContext<VSCodeContextValue | undefined>( undefined ); export const useVSCodeContext = () => { const context = useContext(VSCodeContext); if (!context) { throw new Error('useVSCodeContext must be used within VSCodeProvider'); } return context; }; ``` -------------------------------------------------------------------------------- /packages/tm-core/src/logger/factory.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Logger factory and singleton management */ import { Logger, type LoggerConfig } from './logger.js'; // Global logger instance let globalLogger: Logger | null = null; // Named logger instances const loggers = new Map<string, Logger>(); /** * Create a new logger instance */ export function createLogger(config?: LoggerConfig): Logger { return new Logger(config); } /** * Get or create a named logger instance */ export function getLogger(name?: string, config?: LoggerConfig): Logger { // If no name provided, return global logger if (!name) { if (!globalLogger) { globalLogger = createLogger(config); } return globalLogger; } // Check if named logger exists if (!loggers.has(name)) { loggers.set( name, createLogger({ prefix: name, ...config }) ); } return loggers.get(name)!; } /** * Set the global logger instance */ export function setGlobalLogger(logger: Logger): void { globalLogger = logger; } /** * Clear all logger instances (useful for testing) */ export function clearLoggers(): void { globalLogger = null; loggers.clear(); } ``` -------------------------------------------------------------------------------- /packages/tm-core/src/repositories/task-repository.interface.ts: -------------------------------------------------------------------------------- ```typescript import { Task, TaskTag } from '../types/index.js'; export interface TaskRepository { // Task operations getTasks(projectId: string): Promise<Task[]>; getTask(projectId: string, taskId: string): Promise<Task | null>; createTask(projectId: string, task: Omit<Task, 'id'>): Promise<Task>; updateTask( projectId: string, taskId: string, updates: Partial<Task> ): Promise<Task>; deleteTask(projectId: string, taskId: string): Promise<void>; // Tag operations getTags(projectId: string): Promise<TaskTag[]>; getTag(projectId: string, tagName: string): Promise<TaskTag | null>; createTag(projectId: string, tag: TaskTag): Promise<TaskTag>; updateTag( projectId: string, tagName: string, updates: Partial<TaskTag> ): Promise<TaskTag>; deleteTag(projectId: string, tagName: string): Promise<void>; // Bulk operations bulkCreateTasks( projectId: string, tasks: Omit<Task, 'id'>[] ): Promise<Task[]>; bulkUpdateTasks( projectId: string, updates: Array<{ id: string; updates: Partial<Task> }> ): Promise<Task[]>; bulkDeleteTasks(projectId: string, taskIds: string[]): Promise<void>; } ``` -------------------------------------------------------------------------------- /.claude/commands/tm/set-status/to-cancelled.md: -------------------------------------------------------------------------------- ```markdown Cancel a task permanently. Arguments: $ARGUMENTS (task ID) ## Cancelling a Task This status indicates a task is no longer needed and won't be completed. ## Valid Reasons for Cancellation - Requirements changed - Feature deprecated - Duplicate of another task - Strategic pivot - Technical approach invalidated ## Pre-Cancellation Checks 1. Confirm no critical dependencies 2. Check for partial implementation 3. Verify cancellation rationale 4. Document lessons learned ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=cancelled ``` ## Cancellation Impact When cancelling: 1. **Dependency Updates** - Notify dependent tasks - Update project scope - Recalculate timelines 2. **Clean-up Actions** - Remove related branches - Archive any work done - Update documentation - Close related issues 3. **Learning Capture** - Document why cancelled - Note what was learned - Update estimation models - Prevent future duplicates ## Historical Preservation - Keep for reference - Tag with cancellation reason - Link to replacement if any - Maintain audit trail ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/set-status/to-cancelled.md: -------------------------------------------------------------------------------- ```markdown Cancel a task permanently. Arguments: $ARGUMENTS (task ID) ## Cancelling a Task This status indicates a task is no longer needed and won't be completed. ## Valid Reasons for Cancellation - Requirements changed - Feature deprecated - Duplicate of another task - Strategic pivot - Technical approach invalidated ## Pre-Cancellation Checks 1. Confirm no critical dependencies 2. Check for partial implementation 3. Verify cancellation rationale 4. Document lessons learned ## Execution ```bash task-master set-status --id=$ARGUMENTS --status=cancelled ``` ## Cancellation Impact When cancelling: 1. **Dependency Updates** - Notify dependent tasks - Update project scope - Recalculate timelines 2. **Clean-up Actions** - Remove related branches - Archive any work done - Update documentation - Close related issues 3. **Learning Capture** - Document why cancelled - Note what was learned - Update estimation models - Prevent future duplicates ## Historical Preservation - Keep for reference - Tag with cancellation reason - Link to replacement if any - Maintain audit trail ``` -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- ```json { "files": { "ignore": [ "build", "coverage", ".changeset", "tasks", "package-lock.json", "tests/fixture/*.json", "dist" ] }, "formatter": { "bracketSpacing": true, "enabled": true, "indentStyle": "tab", "lineWidth": 80 }, "javascript": { "formatter": { "arrowParentheses": "always", "quoteStyle": "single", "trailingCommas": "none" } }, "linter": { "enabled": true, "include": ["apps/extension/**/*.ts", "apps/extension/**/*.tsx"], "ignore": ["**/*", "!apps/extension/**/*"], "rules": { "recommended": true, "complexity": { "noForEach": "off", "useOptionalChain": "off", "useArrowFunction": "off" }, "correctness": { "noConstantCondition": "off", "noUnreachable": "off" }, "suspicious": { "noDuplicateTestHooks": "off", "noPrototypeBuiltins": "off" }, "style": { "noUselessElse": "off", "useNodejsImportProtocol": "off", "useNumberNamespace": "off", "noParameterAssign": "off", "useTemplate": "off", "noUnusedTemplateLiteral": "off", "noNonNullAssertion": "warn" } } } } ``` -------------------------------------------------------------------------------- /.github/workflows/claude.yml: -------------------------------------------------------------------------------- ```yaml name: Claude Code on: issue_comment: types: [created] pull_request_review_comment: types: [created] issues: types: [opened, assigned] pull_request_review: types: [submitted] jobs: claude: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) runs-on: ubuntu-latest permissions: contents: read pull-requests: read issues: read id-token: write steps: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: fetch-depth: 1 - name: Run Claude Code id: claude uses: anthropics/claude-code-action@beta with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} ``` -------------------------------------------------------------------------------- /src/constants/task-priority.js: -------------------------------------------------------------------------------- ```javascript /** * @typedef {'high' | 'medium' | 'low'} TaskPriority */ /** * Task priority options * @type {TaskPriority[]} * @description Defines possible task priorities: * - high: Critical tasks that need immediate attention * - medium: Standard priority tasks (default) * - low: Tasks that can be deferred or are nice-to-have */ export const TASK_PRIORITY_OPTIONS = ['high', 'medium', 'low']; /** * Default task priority * @type {TaskPriority} */ export const DEFAULT_TASK_PRIORITY = 'medium'; /** * Check if a given priority is valid * @param {string} priority - The priority to check * @returns {boolean} True if the priority is valid, false otherwise */ export function isValidTaskPriority(priority) { return TASK_PRIORITY_OPTIONS.includes(priority?.toLowerCase()); } /** * Normalize a priority value to lowercase * @param {string} priority - The priority to normalize * @returns {TaskPriority|null} The normalized priority or null if invalid */ export function normalizeTaskPriority(priority) { if (!priority) return null; const normalized = priority.toLowerCase(); return isValidTaskPriority(normalized) ? normalized : null; } ``` -------------------------------------------------------------------------------- /src/ai-providers/xai.js: -------------------------------------------------------------------------------- ```javascript /** * xai.js * AI provider implementation for xAI models using Vercel AI SDK. */ import { createXai } from '@ai-sdk/xai'; import { BaseAIProvider } from './base-provider.js'; export class XAIProvider extends BaseAIProvider { constructor() { super(); this.name = 'xAI'; } /** * Returns the environment variable name required for this provider's API key. * @returns {string} The environment variable name for the xAI API key */ getRequiredApiKeyName() { return 'XAI_API_KEY'; } /** * Creates and returns an xAI client instance. * @param {object} params - Parameters for client initialization * @param {string} params.apiKey - xAI API key * @param {string} [params.baseURL] - Optional custom API endpoint * @returns {Function} xAI client function * @throws {Error} If API key is missing or initialization fails */ getClient(params) { try { const { apiKey, baseURL } = params; if (!apiKey) { throw new Error('xAI API key is required.'); } return createXai({ apiKey, baseURL: baseURL || 'https://api.x.ai/v1' }); } catch (error) { this.handleError('client initialization', error); } } } ``` -------------------------------------------------------------------------------- /scripts/modules/task-manager/task-exists.js: -------------------------------------------------------------------------------- ```javascript /** * Checks if a task with the given ID exists * @param {Array} tasks - Array of tasks to search * @param {string|number} taskId - ID of task or subtask to check * @returns {boolean} Whether the task exists */ function taskExists(tasks, taskId) { // Handle subtask IDs (e.g., "1.2") if (typeof taskId === 'string' && taskId.includes('.')) { const parts = taskId.split('.'); // Validate that it's a proper subtask format (parentId.subtaskId) if (parts.length !== 2 || !parts[0] || !parts[1]) { // Invalid format - treat as regular task ID const id = parseInt(taskId, 10); return tasks.some((t) => t.id === id); } const [parentIdStr, subtaskIdStr] = parts; const parentId = parseInt(parentIdStr, 10); const subtaskId = parseInt(subtaskIdStr, 10); // Find the parent task const parentTask = tasks.find((t) => t.id === parentId); // If parent exists, check if subtask exists return ( parentTask && parentTask.subtasks && parentTask.subtasks.some((st) => st.id === subtaskId) ); } // Handle regular task IDs const id = parseInt(taskId, 10); return tasks.some((t) => t.id === id); } export default taskExists; ``` -------------------------------------------------------------------------------- /scripts/modules/task-manager/is-task-dependent.js: -------------------------------------------------------------------------------- ```javascript /** * Check if a task is dependent on another task (directly or indirectly) * Used to prevent circular dependencies * @param {Array} allTasks - Array of all tasks * @param {Object} task - The task to check * @param {number} targetTaskId - The task ID to check dependency against * @returns {boolean} Whether the task depends on the target task */ function isTaskDependentOn(allTasks, task, targetTaskId) { // If the task is a subtask, check if its parent is the target if (task.parentTaskId === targetTaskId) { return true; } // Check direct dependencies if (task.dependencies && task.dependencies.includes(targetTaskId)) { return true; } // Check dependencies of dependencies (recursive) if (task.dependencies) { for (const depId of task.dependencies) { const depTask = allTasks.find((t) => t.id === depId); if (depTask && isTaskDependentOn(allTasks, depTask, targetTaskId)) { return true; } } } // Check subtasks for dependencies if (task.subtasks) { for (const subtask of task.subtasks) { if (isTaskDependentOn(allTasks, subtask, targetTaskId)) { return true; } } } return false; } export default isTaskDependentOn; ``` -------------------------------------------------------------------------------- /packages/tm-core/src/parser/index.ts: -------------------------------------------------------------------------------- ```typescript /** * @fileoverview Task parsing functionality for the tm-core package * This file exports all parsing-related classes and functions */ import type { PlaceholderTask } from '../types/index.js'; // Parser implementations will be defined here // export * from './prd-parser.js'; // export * from './task-parser.js'; // export * from './markdown-parser.js'; // Placeholder exports - these will be implemented in later tasks export interface TaskParser { parse(content: string): Promise<PlaceholderTask[]>; validate(content: string): Promise<boolean>; } /** * @deprecated This is a placeholder class that will be properly implemented in later tasks */ export class PlaceholderParser implements TaskParser { async parse(content: string): Promise<PlaceholderTask[]> { // Simple placeholder parsing logic const lines = content .split('\n') .filter((line) => line.trim().startsWith('-')); return lines.map((line, index) => ({ id: `task-${index + 1}`, title: line.trim().replace(/^-\s*/, ''), status: 'pending' as const, priority: 'medium' as const })); } async validate(content: string): Promise<boolean> { return content.trim().length > 0; } } ``` -------------------------------------------------------------------------------- /test-version-check.js: -------------------------------------------------------------------------------- ```javascript import { displayUpgradeNotification, compareVersions } from './scripts/modules/commands.js'; // Simulate different version scenarios console.log('=== Simulating version check ===\n'); // 1. Current version is older than latest (should show update notice) console.log('Scenario 1: Current version older than latest'); displayUpgradeNotification('0.9.30', '1.0.0'); // 2. Current version same as latest (no update needed) console.log( '\nScenario 2: Current version same as latest (this would not normally show a notice)' ); console.log('Current: 1.0.0, Latest: 1.0.0'); console.log('compareVersions result:', compareVersions('1.0.0', '1.0.0')); console.log( 'Update needed:', compareVersions('1.0.0', '1.0.0') < 0 ? 'Yes' : 'No' ); // 3. Current version newer than latest (e.g., development version, would not show notice) console.log( '\nScenario 3: Current version newer than latest (this would not normally show a notice)' ); console.log('Current: 1.1.0, Latest: 1.0.0'); console.log('compareVersions result:', compareVersions('1.1.0', '1.0.0')); console.log( 'Update needed:', compareVersions('1.1.0', '1.0.0') < 0 ? 'Yes' : 'No' ); console.log('\n=== Test complete ==='); ``` -------------------------------------------------------------------------------- /src/ai-providers/groq.js: -------------------------------------------------------------------------------- ```javascript /** * src/ai-providers/groq.js * * Implementation for interacting with Groq models * using the Vercel AI SDK. */ import { createGroq } from '@ai-sdk/groq'; import { BaseAIProvider } from './base-provider.js'; export class GroqProvider extends BaseAIProvider { constructor() { super(); this.name = 'Groq'; } /** * Returns the environment variable name required for this provider's API key. * @returns {string} The environment variable name for the Groq API key */ getRequiredApiKeyName() { return 'GROQ_API_KEY'; } /** * Creates and returns a Groq client instance. * @param {object} params - Parameters for client initialization * @param {string} params.apiKey - Groq API key * @param {string} [params.baseURL] - Optional custom API endpoint * @returns {Function} Groq client function * @throws {Error} If API key is missing or initialization fails */ getClient(params) { try { const { apiKey, baseURL } = params; if (!apiKey) { throw new Error('Groq API key is required.'); } return createGroq({ apiKey, ...(baseURL && { baseURL }) }); } catch (error) { this.handleError('client initialization', error); } } } ``` -------------------------------------------------------------------------------- /src/ai-providers/google.js: -------------------------------------------------------------------------------- ```javascript /** * google.js * AI provider implementation for Google AI models using Vercel AI SDK. */ import { createGoogleGenerativeAI } from '@ai-sdk/google'; import { BaseAIProvider } from './base-provider.js'; export class GoogleAIProvider extends BaseAIProvider { constructor() { super(); this.name = 'Google'; } /** * Returns the environment variable name required for this provider's API key. * @returns {string} The environment variable name for the Google API key */ getRequiredApiKeyName() { return 'GOOGLE_API_KEY'; } /** * Creates and returns a Google AI client instance. * @param {object} params - Parameters for client initialization * @param {string} params.apiKey - Google API key * @param {string} [params.baseURL] - Optional custom API endpoint * @returns {Function} Google AI client function * @throws {Error} If API key is missing or initialization fails */ getClient(params) { try { const { apiKey, baseURL } = params; if (!apiKey) { throw new Error('Google API key is required.'); } return createGoogleGenerativeAI({ apiKey, ...(baseURL && { baseURL }) }); } catch (error) { this.handleError('client initialization', error); } } } ``` -------------------------------------------------------------------------------- /src/ai-providers/bedrock.js: -------------------------------------------------------------------------------- ```javascript import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock'; import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; import { BaseAIProvider } from './base-provider.js'; export class BedrockAIProvider extends BaseAIProvider { constructor() { super(); this.name = 'Bedrock'; } isRequiredApiKey() { return false; } /** * Returns the required API key environment variable name for Bedrock. * Bedrock uses AWS credentials, so we return the AWS access key identifier. * @returns {string} The environment variable name */ getRequiredApiKeyName() { return 'AWS_ACCESS_KEY_ID'; } /** * Override auth validation - Bedrock uses AWS credentials instead of API keys * @param {object} params - Parameters to validate */ validateAuth(params) {} /** * Creates and returns a Bedrock client instance. * See https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html * for AWS SDK environment variables and configuration options. */ getClient(params) { try { const credentialProvider = fromNodeProviderChain(); return createAmazonBedrock({ credentialProvider }); } catch (error) { this.handleError('client initialization', error); } } } ``` -------------------------------------------------------------------------------- /.claude/commands/tm/add-dependency/add-dependency.md: -------------------------------------------------------------------------------- ```markdown Add a dependency between tasks. Arguments: $ARGUMENTS Parse the task IDs to establish dependency relationship. ## Adding Dependencies Creates a dependency where one task must be completed before another can start. ## Argument Parsing Parse natural language or IDs: - "make 5 depend on 3" → task 5 depends on task 3 - "5 needs 3" → task 5 depends on task 3 - "5 3" → task 5 depends on task 3 - "5 after 3" → task 5 depends on task 3 ## Execution ```bash task-master add-dependency --id=<task-id> --depends-on=<dependency-id> ``` ## Validation Before adding: 1. **Verify both tasks exist** 2. **Check for circular dependencies** 3. **Ensure dependency makes logical sense** 4. **Warn if creating complex chains** ## Smart Features - Detect if dependency already exists - Suggest related dependencies - Show impact on task flow - Update task priorities if needed ## Post-Addition After adding dependency: 1. Show updated dependency graph 2. Identify any newly blocked tasks 3. Suggest task order changes 4. Update project timeline ## Example Flows ``` /project:tm/add-dependency 5 needs 3 → Task #5 now depends on Task #3 → Task #5 is now blocked until #3 completes → Suggested: Also consider if #5 needs #4 ``` ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/add-dependency/add-dependency.md: -------------------------------------------------------------------------------- ```markdown Add a dependency between tasks. Arguments: $ARGUMENTS Parse the task IDs to establish dependency relationship. ## Adding Dependencies Creates a dependency where one task must be completed before another can start. ## Argument Parsing Parse natural language or IDs: - "make 5 depend on 3" → task 5 depends on task 3 - "5 needs 3" → task 5 depends on task 3 - "5 3" → task 5 depends on task 3 - "5 after 3" → task 5 depends on task 3 ## Execution ```bash task-master add-dependency --id=<task-id> --depends-on=<dependency-id> ``` ## Validation Before adding: 1. **Verify both tasks exist** 2. **Check for circular dependencies** 3. **Ensure dependency makes logical sense** 4. **Warn if creating complex chains** ## Smart Features - Detect if dependency already exists - Suggest related dependencies - Show impact on task flow - Update task priorities if needed ## Post-Addition After adding dependency: 1. Show updated dependency graph 2. Identify any newly blocked tasks 3. Suggest task order changes 4. Update project timeline ## Example Flows ``` /project:tm/add-dependency 5 needs 3 → Task #5 now depends on Task #3 → Task #5 is now blocked until #3 completes → Suggested: Also consider if #5 needs #4 ``` ``` -------------------------------------------------------------------------------- /apps/cli/package.json: -------------------------------------------------------------------------------- ```json { "name": "@tm/cli", "description": "Task Master CLI - Command line interface for task management", "type": "module", "private": true, "main": "./dist/index.js", "types": "./src/index.ts", "exports": { ".": "./src/index.ts" }, "files": ["dist", "README.md"], "scripts": { "typecheck": "tsc --noEmit", "lint": "biome check src", "format": "biome format --write src", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", "test:unit": "vitest run -t unit", "test:integration": "vitest run -t integration", "test:e2e": "vitest run --dir tests/e2e", "test:ci": "vitest run --coverage --reporter=dot" }, "dependencies": { "@tm/core": "*", "boxen": "^8.0.1", "chalk": "5.6.2", "cli-table3": "^0.6.5", "commander": "^12.1.0", "inquirer": "^12.5.0", "ora": "^8.2.0" }, "devDependencies": { "@biomejs/biome": "^1.9.4", "@types/inquirer": "^9.0.3", "@types/node": "^22.10.5", "tsx": "^4.20.4", "typescript": "^5.7.3", "vitest": "^2.1.8" }, "engines": { "node": ">=18.0.0" }, "keywords": ["task-master", "cli", "task-management", "productivity"], "author": "", "license": "MIT", "typesVersions": { "*": { "*": ["src/*"] } } } ``` -------------------------------------------------------------------------------- /packages/build-config/src/tsdown.base.ts: -------------------------------------------------------------------------------- ```typescript /** * Base tsdown configuration for Task Master monorepo * Provides shared configuration that can be extended by individual packages */ import type { UserConfig } from 'tsdown'; const isProduction = process.env.NODE_ENV === 'production'; const isDevelopment = !isProduction; /** * Environment helpers */ export const env = { isProduction, isDevelopment, NODE_ENV: process.env.NODE_ENV || 'development' }; /** * Base tsdown configuration for all packages * Since everything gets bundled into root dist/ anyway, use consistent settings */ export const baseConfig: Partial<UserConfig> = { sourcemap: isDevelopment, format: 'esm', platform: 'node', dts: isDevelopment, minify: isProduction, treeshake: isProduction, // Better debugging in development ...(isDevelopment && { keepNames: true, splitting: false // Disable code splitting for better stack traces }), // Keep all npm dependencies external (available via node_modules) external: [/^[^@./]/, /^@(?!tm\/)/] }; /** * Utility function to merge configurations * Simplified for tsdown usage */ export function mergeConfig( base: Partial<UserConfig>, overrides: Partial<UserConfig> ): Partial<UserConfig> { return { ...base, ...overrides }; } ``` -------------------------------------------------------------------------------- /tsdown.config.ts: -------------------------------------------------------------------------------- ```typescript import { defineConfig } from 'tsdown'; import { baseConfig, mergeConfig } from '@tm/build-config'; import { load as dotenvLoad } from 'dotenv-mono'; dotenvLoad(); // Get all TM_PUBLIC_* env variables for build-time injection const getBuildTimeEnvs = () => { const envs: Record<string, string> = {}; // Inject package.json version at build time try { const packageJson = JSON.parse( require('fs').readFileSync('package.json', 'utf8') ); envs['TM_PUBLIC_VERSION'] = packageJson.version || 'unknown'; } catch (error) { console.warn('Could not read package.json version during build:', error); envs['TM_PUBLIC_VERSION'] = 'unknown'; } for (const [key, value] of Object.entries(process.env)) { if (key.startsWith('TM_PUBLIC_')) { // Return the actual value, not JSON.stringify'd envs[key] = value || ''; } } return envs; }; export default defineConfig( mergeConfig(baseConfig, { entry: { 'task-master': 'scripts/dev.js', 'mcp-server': 'mcp-server/server.js' }, outDir: 'dist', copy: ['assets'], ignoreWatch: ['node_modules', 'dist', 'tests', 'apps/extension'], // Bundle only our workspace packages, keep npm dependencies external noExternal: [/^@tm\//], env: getBuildTimeEnvs() }) ); ``` -------------------------------------------------------------------------------- /src/ai-providers/openrouter.js: -------------------------------------------------------------------------------- ```javascript /** * openrouter.js * AI provider implementation for OpenRouter models using Vercel AI SDK. */ import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { BaseAIProvider } from './base-provider.js'; export class OpenRouterAIProvider extends BaseAIProvider { constructor() { super(); this.name = 'OpenRouter'; } /** * Returns the environment variable name required for this provider's API key. * @returns {string} The environment variable name for the OpenRouter API key */ getRequiredApiKeyName() { return 'OPENROUTER_API_KEY'; } /** * Creates and returns an OpenRouter client instance. * @param {object} params - Parameters for client initialization * @param {string} params.apiKey - OpenRouter API key * @param {string} [params.baseURL] - Optional custom API endpoint * @returns {Function} OpenRouter client function * @throws {Error} If API key is missing or initialization fails */ getClient(params) { try { const { apiKey, baseURL } = params; if (!apiKey) { throw new Error('OpenRouter API key is required.'); } return createOpenRouter({ apiKey, ...(baseURL && { baseURL }) }); } catch (error) { this.handleError('client initialization', error); } } } ``` -------------------------------------------------------------------------------- /src/utils/logger-utils.js: -------------------------------------------------------------------------------- ```javascript /** * Logger utility functions for Task Master * Provides standardized logging patterns for both CLI and utility contexts */ import { log as utilLog } from '../../scripts/modules/utils.js'; /** * Creates a standard logger object that wraps the utility log function * This provides a consistent logger interface across different parts of the application * @returns {Object} A logger object with standard logging methods (info, warn, error, debug, success) */ export function createStandardLogger() { return { info: (msg, ...args) => utilLog('info', msg, ...args), warn: (msg, ...args) => utilLog('warn', msg, ...args), error: (msg, ...args) => utilLog('error', msg, ...args), debug: (msg, ...args) => utilLog('debug', msg, ...args), success: (msg, ...args) => utilLog('success', msg, ...args) }; } /** * Creates a logger using either the provided logger or a default standard logger * This is the recommended pattern for functions that accept an optional logger parameter * @param {Object|null} providedLogger - Optional logger object passed from caller * @returns {Object} A logger object with standard logging methods */ export function getLoggerOrDefault(providedLogger = null) { return providedLogger || createStandardLogger(); } ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/response-language.js: -------------------------------------------------------------------------------- ```javascript import { z } from 'zod'; import { createErrorResponse, handleApiResult, withNormalizedProjectRoot } from './utils.js'; import { responseLanguageDirect } from '../core/direct-functions/response-language.js'; export function registerResponseLanguageTool(server) { server.addTool({ name: 'response-language', description: 'Get or set the response language for the project', parameters: z.object({ projectRoot: z .string() .describe( 'The root directory for the project. ALWAYS SET THIS TO THE PROJECT ROOT DIRECTORY. IF NOT SET, THE TOOL WILL NOT WORK.' ), language: z .string() .describe( 'The new response language to set. like "中文" "English" or "español".' ) }), execute: withNormalizedProjectRoot(async (args, { log, session }) => { try { log.info( `Executing response-language tool with args: ${JSON.stringify(args)}` ); const result = await responseLanguageDirect( { ...args, projectRoot: args.projectRoot }, log, { session } ); return handleApiResult(result, log, 'Error setting response language'); } catch (error) { log.error(`Error in response-language tool: ${error.message}`); return createErrorResponse(error.message); } }) }); } ``` -------------------------------------------------------------------------------- /.github/workflows/backfill-duplicate-comments.yml: -------------------------------------------------------------------------------- ```yaml name: Backfill Duplicate Comments # description: Triggers duplicate detection for old issues that don't have duplicate comments on: workflow_dispatch: inputs: days_back: description: "How many days back to look for old issues" required: false default: "90" type: string dry_run: description: "Dry run mode (true to only log what would be done)" required: false default: "true" type: choice options: - "true" - "false" jobs: backfill-duplicate-comments: runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read issues: read actions: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Backfill duplicate comments run: node .github/scripts/backfill-duplicate-comments.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }} DAYS_BACK: ${{ inputs.days_back }} DRY_RUN: ${{ inputs.dry_run }} ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/utils/toast.ts: -------------------------------------------------------------------------------- ```typescript /** * Toast notification utilities */ import type { ToastNotification, AppAction } from '../types'; let toastIdCounter = 0; export const createToast = ( type: ToastNotification['type'], title: string, message: string, duration?: number ): ToastNotification => ({ id: `toast-${++toastIdCounter}`, type, title, message, duration }); export const showSuccessToast = (dispatch: React.Dispatch<AppAction>) => (title: string, message: string, duration?: number) => { dispatch({ type: 'ADD_TOAST', payload: createToast('success', title, message, duration) }); }; export const showInfoToast = (dispatch: React.Dispatch<AppAction>) => (title: string, message: string, duration?: number) => { dispatch({ type: 'ADD_TOAST', payload: createToast('info', title, message, duration) }); }; export const showWarningToast = (dispatch: React.Dispatch<AppAction>) => (title: string, message: string, duration?: number) => { dispatch({ type: 'ADD_TOAST', payload: createToast('warning', title, message, duration) }); }; export const showErrorToast = (dispatch: React.Dispatch<AppAction>) => (title: string, message: string, duration?: number) => { dispatch({ type: 'ADD_TOAST', payload: createToast('error', title, message, duration) }); }; ```