This is page 6 of 52. Use http://codebase.md/eyaltoledano/claude-task-master?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .changeset │ ├── config.json │ └── README.md ├── .claude │ ├── agents │ │ ├── task-checker.md │ │ ├── task-executor.md │ │ └── task-orchestrator.md │ ├── commands │ │ ├── dedupe.md │ │ └── tm │ │ ├── add-dependency │ │ │ └── add-dependency.md │ │ ├── add-subtask │ │ │ ├── add-subtask.md │ │ │ └── convert-task-to-subtask.md │ │ ├── add-task │ │ │ └── add-task.md │ │ ├── analyze-complexity │ │ │ └── analyze-complexity.md │ │ ├── complexity-report │ │ │ └── complexity-report.md │ │ ├── expand │ │ │ ├── expand-all-tasks.md │ │ │ └── expand-task.md │ │ ├── fix-dependencies │ │ │ └── fix-dependencies.md │ │ ├── generate │ │ │ └── generate-tasks.md │ │ ├── help.md │ │ ├── init │ │ │ ├── init-project-quick.md │ │ │ └── init-project.md │ │ ├── learn.md │ │ ├── list │ │ │ ├── list-tasks-by-status.md │ │ │ ├── list-tasks-with-subtasks.md │ │ │ └── list-tasks.md │ │ ├── models │ │ │ ├── setup-models.md │ │ │ └── view-models.md │ │ ├── next │ │ │ └── next-task.md │ │ ├── parse-prd │ │ │ ├── parse-prd-with-research.md │ │ │ └── parse-prd.md │ │ ├── remove-dependency │ │ │ └── remove-dependency.md │ │ ├── remove-subtask │ │ │ └── remove-subtask.md │ │ ├── remove-subtasks │ │ │ ├── remove-all-subtasks.md │ │ │ └── remove-subtasks.md │ │ ├── remove-task │ │ │ └── remove-task.md │ │ ├── set-status │ │ │ ├── to-cancelled.md │ │ │ ├── to-deferred.md │ │ │ ├── to-done.md │ │ │ ├── to-in-progress.md │ │ │ ├── to-pending.md │ │ │ └── to-review.md │ │ ├── setup │ │ │ ├── install-taskmaster.md │ │ │ └── quick-install-taskmaster.md │ │ ├── show │ │ │ └── show-task.md │ │ ├── status │ │ │ └── project-status.md │ │ ├── sync-readme │ │ │ └── sync-readme.md │ │ ├── tm-main.md │ │ ├── update │ │ │ ├── update-single-task.md │ │ │ ├── update-task.md │ │ │ └── update-tasks-from-id.md │ │ ├── utils │ │ │ └── analyze-project.md │ │ ├── validate-dependencies │ │ │ └── validate-dependencies.md │ │ └── workflows │ │ ├── auto-implement-tasks.md │ │ ├── command-pipeline.md │ │ └── smart-workflow.md │ └── TM_COMMANDS_GUIDE.md ├── .coderabbit.yaml ├── .cursor │ ├── mcp.json │ └── rules │ ├── ai_providers.mdc │ ├── ai_services.mdc │ ├── architecture.mdc │ ├── changeset.mdc │ ├── commands.mdc │ ├── context_gathering.mdc │ ├── cursor_rules.mdc │ ├── dependencies.mdc │ ├── dev_workflow.mdc │ ├── git_workflow.mdc │ ├── glossary.mdc │ ├── mcp.mdc │ ├── new_features.mdc │ ├── self_improve.mdc │ ├── tags.mdc │ ├── taskmaster.mdc │ ├── tasks.mdc │ ├── telemetry.mdc │ ├── test_workflow.mdc │ ├── tests.mdc │ ├── ui.mdc │ └── utilities.mdc ├── .cursorignore ├── .env.example ├── .github │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.md │ │ ├── enhancements---feature-requests.md │ │ └── feedback.md │ ├── PULL_REQUEST_TEMPLATE │ │ ├── bugfix.md │ │ ├── config.yml │ │ ├── feature.md │ │ └── integration.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── scripts │ │ ├── auto-close-duplicates.mjs │ │ ├── backfill-duplicate-comments.mjs │ │ ├── check-pre-release-mode.mjs │ │ ├── parse-metrics.mjs │ │ ├── release.mjs │ │ ├── tag-extension.mjs │ │ └── utils.mjs │ └── workflows │ ├── auto-close-duplicates.yml │ ├── backfill-duplicate-comments.yml │ ├── ci.yml │ ├── claude-dedupe-issues.yml │ ├── claude-docs-trigger.yml │ ├── claude-docs-updater.yml │ ├── claude-issue-triage.yml │ ├── claude.yml │ ├── extension-ci.yml │ ├── extension-release.yml │ ├── log-issue-events.yml │ ├── pre-release.yml │ ├── release-check.yml │ ├── release.yml │ ├── update-models-md.yml │ └── weekly-metrics-discord.yml ├── .gitignore ├── .kiro │ ├── hooks │ │ ├── tm-code-change-task-tracker.kiro.hook │ │ ├── tm-complexity-analyzer.kiro.hook │ │ ├── tm-daily-standup-assistant.kiro.hook │ │ ├── tm-git-commit-task-linker.kiro.hook │ │ ├── tm-pr-readiness-checker.kiro.hook │ │ ├── tm-task-dependency-auto-progression.kiro.hook │ │ └── tm-test-success-task-completer.kiro.hook │ ├── settings │ │ └── mcp.json │ └── steering │ ├── dev_workflow.md │ ├── kiro_rules.md │ ├── self_improve.md │ ├── taskmaster_hooks_workflow.md │ └── taskmaster.md ├── .manypkg.json ├── .mcp.json ├── .npmignore ├── .nvmrc ├── .taskmaster │ ├── CLAUDE.md │ ├── config.json │ ├── docs │ │ ├── MIGRATION-ROADMAP.md │ │ ├── prd-tm-start.txt │ │ ├── prd.txt │ │ ├── README.md │ │ ├── research │ │ │ ├── 2025-06-14_how-can-i-improve-the-scope-up-and-scope-down-comm.md │ │ │ ├── 2025-06-14_should-i-be-using-any-specific-libraries-for-this.md │ │ │ ├── 2025-06-14_test-save-functionality.md │ │ │ ├── 2025-06-14_test-the-fix-for-duplicate-saves-final-test.md │ │ │ └── 2025-08-01_do-we-need-to-add-new-commands-or-can-we-just-weap.md │ │ ├── task-template-importing-prd.txt │ │ ├── test-prd.txt │ │ └── tm-core-phase-1.txt │ ├── reports │ │ ├── task-complexity-report_cc-kiro-hooks.json │ │ ├── task-complexity-report_test-prd-tag.json │ │ ├── task-complexity-report_tm-core-phase-1.json │ │ ├── task-complexity-report.json │ │ └── tm-core-complexity.json │ ├── state.json │ ├── tasks │ │ ├── task_001_tm-start.txt │ │ ├── task_002_tm-start.txt │ │ ├── task_003_tm-start.txt │ │ ├── task_004_tm-start.txt │ │ ├── task_007_tm-start.txt │ │ └── tasks.json │ └── templates │ └── example_prd.txt ├── .vscode │ ├── extensions.json │ └── settings.json ├── apps │ ├── cli │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ ├── commands │ │ │ │ ├── auth.command.ts │ │ │ │ ├── context.command.ts │ │ │ │ ├── list.command.ts │ │ │ │ ├── set-status.command.ts │ │ │ │ ├── show.command.ts │ │ │ │ └── start.command.ts │ │ │ ├── index.ts │ │ │ ├── ui │ │ │ │ ├── components │ │ │ │ │ ├── dashboard.component.ts │ │ │ │ │ ├── header.component.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── next-task.component.ts │ │ │ │ │ ├── suggested-steps.component.ts │ │ │ │ │ └── task-detail.component.ts │ │ │ │ └── index.ts │ │ │ └── utils │ │ │ ├── auto-update.ts │ │ │ └── ui.ts │ │ └── tsconfig.json │ ├── docs │ │ ├── archive │ │ │ ├── ai-client-utils-example.mdx │ │ │ ├── ai-development-workflow.mdx │ │ │ ├── command-reference.mdx │ │ │ ├── configuration.mdx │ │ │ ├── cursor-setup.mdx │ │ │ ├── examples.mdx │ │ │ └── Installation.mdx │ │ ├── best-practices │ │ │ ├── advanced-tasks.mdx │ │ │ ├── configuration-advanced.mdx │ │ │ └── index.mdx │ │ ├── capabilities │ │ │ ├── cli-root-commands.mdx │ │ │ ├── index.mdx │ │ │ ├── mcp.mdx │ │ │ └── task-structure.mdx │ │ ├── CHANGELOG.md │ │ ├── docs.json │ │ ├── favicon.svg │ │ ├── getting-started │ │ │ ├── contribute.mdx │ │ │ ├── faq.mdx │ │ │ └── quick-start │ │ │ ├── configuration-quick.mdx │ │ │ ├── execute-quick.mdx │ │ │ ├── installation.mdx │ │ │ ├── moving-forward.mdx │ │ │ ├── prd-quick.mdx │ │ │ ├── quick-start.mdx │ │ │ ├── requirements.mdx │ │ │ ├── rules-quick.mdx │ │ │ └── tasks-quick.mdx │ │ ├── introduction.mdx │ │ ├── licensing.md │ │ ├── logo │ │ │ ├── dark.svg │ │ │ ├── light.svg │ │ │ └── task-master-logo.png │ │ ├── package.json │ │ ├── README.md │ │ ├── style.css │ │ ├── vercel.json │ │ └── whats-new.mdx │ └── extension │ ├── .vscodeignore │ ├── assets │ │ ├── banner.png │ │ ├── icon-dark.svg │ │ ├── icon-light.svg │ │ ├── icon.png │ │ ├── screenshots │ │ │ ├── kanban-board.png │ │ │ └── task-details.png │ │ └── sidebar-icon.svg │ ├── CHANGELOG.md │ ├── components.json │ ├── docs │ │ ├── extension-CI-setup.md │ │ └── extension-development-guide.md │ ├── esbuild.js │ ├── LICENSE │ ├── package.json │ ├── package.mjs │ ├── package.publish.json │ ├── README.md │ ├── src │ │ ├── components │ │ │ ├── ConfigView.tsx │ │ │ ├── constants.ts │ │ │ ├── TaskDetails │ │ │ │ ├── AIActionsSection.tsx │ │ │ │ ├── DetailsSection.tsx │ │ │ │ ├── PriorityBadge.tsx │ │ │ │ ├── SubtasksSection.tsx │ │ │ │ ├── TaskMetadataSidebar.tsx │ │ │ │ └── useTaskDetails.ts │ │ │ ├── TaskDetailsView.tsx │ │ │ ├── TaskMasterLogo.tsx │ │ │ └── ui │ │ │ ├── badge.tsx │ │ │ ├── breadcrumb.tsx │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── collapsible.tsx │ │ │ ├── CollapsibleSection.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── label.tsx │ │ │ ├── scroll-area.tsx │ │ │ ├── separator.tsx │ │ │ ├── shadcn-io │ │ │ │ └── kanban │ │ │ │ └── index.tsx │ │ │ └── textarea.tsx │ │ ├── extension.ts │ │ ├── index.ts │ │ ├── lib │ │ │ └── utils.ts │ │ ├── services │ │ │ ├── config-service.ts │ │ │ ├── error-handler.ts │ │ │ ├── notification-preferences.ts │ │ │ ├── polling-service.ts │ │ │ ├── polling-strategies.ts │ │ │ ├── sidebar-webview-manager.ts │ │ │ ├── task-repository.ts │ │ │ ├── terminal-manager.ts │ │ │ └── webview-manager.ts │ │ ├── test │ │ │ └── extension.test.ts │ │ ├── utils │ │ │ ├── configManager.ts │ │ │ ├── connectionManager.ts │ │ │ ├── errorHandler.ts │ │ │ ├── event-emitter.ts │ │ │ ├── logger.ts │ │ │ ├── mcpClient.ts │ │ │ ├── notificationPreferences.ts │ │ │ └── task-master-api │ │ │ ├── cache │ │ │ │ └── cache-manager.ts │ │ │ ├── index.ts │ │ │ ├── mcp-client.ts │ │ │ ├── transformers │ │ │ │ └── task-transformer.ts │ │ │ └── types │ │ │ └── index.ts │ │ └── webview │ │ ├── App.tsx │ │ ├── components │ │ │ ├── AppContent.tsx │ │ │ ├── EmptyState.tsx │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── PollingStatus.tsx │ │ │ ├── PriorityBadge.tsx │ │ │ ├── SidebarView.tsx │ │ │ ├── TagDropdown.tsx │ │ │ ├── TaskCard.tsx │ │ │ ├── TaskEditModal.tsx │ │ │ ├── TaskMasterKanban.tsx │ │ │ ├── ToastContainer.tsx │ │ │ └── ToastNotification.tsx │ │ ├── constants │ │ │ └── index.ts │ │ ├── contexts │ │ │ └── VSCodeContext.tsx │ │ ├── hooks │ │ │ ├── useTaskQueries.ts │ │ │ ├── useVSCodeMessages.ts │ │ │ └── useWebviewHeight.ts │ │ ├── index.css │ │ ├── index.tsx │ │ ├── providers │ │ │ └── QueryProvider.tsx │ │ ├── reducers │ │ │ └── appReducer.ts │ │ ├── sidebar.tsx │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ ├── logger.ts │ │ └── toast.ts │ └── tsconfig.json ├── assets │ ├── .windsurfrules │ ├── AGENTS.md │ ├── claude │ │ ├── agents │ │ │ ├── task-checker.md │ │ │ ├── task-executor.md │ │ │ └── task-orchestrator.md │ │ ├── commands │ │ │ └── tm │ │ │ ├── add-dependency │ │ │ │ └── add-dependency.md │ │ │ ├── add-subtask │ │ │ │ ├── add-subtask.md │ │ │ │ └── convert-task-to-subtask.md │ │ │ ├── add-task │ │ │ │ └── add-task.md │ │ │ ├── analyze-complexity │ │ │ │ └── analyze-complexity.md │ │ │ ├── clear-subtasks │ │ │ │ ├── clear-all-subtasks.md │ │ │ │ └── clear-subtasks.md │ │ │ ├── complexity-report │ │ │ │ └── complexity-report.md │ │ │ ├── expand │ │ │ │ ├── expand-all-tasks.md │ │ │ │ └── expand-task.md │ │ │ ├── fix-dependencies │ │ │ │ └── fix-dependencies.md │ │ │ ├── generate │ │ │ │ └── generate-tasks.md │ │ │ ├── help.md │ │ │ ├── init │ │ │ │ ├── init-project-quick.md │ │ │ │ └── init-project.md │ │ │ ├── learn.md │ │ │ ├── list │ │ │ │ ├── list-tasks-by-status.md │ │ │ │ ├── list-tasks-with-subtasks.md │ │ │ │ └── list-tasks.md │ │ │ ├── models │ │ │ │ ├── setup-models.md │ │ │ │ └── view-models.md │ │ │ ├── next │ │ │ │ └── next-task.md │ │ │ ├── parse-prd │ │ │ │ ├── parse-prd-with-research.md │ │ │ │ └── parse-prd.md │ │ │ ├── remove-dependency │ │ │ │ └── remove-dependency.md │ │ │ ├── remove-subtask │ │ │ │ └── remove-subtask.md │ │ │ ├── remove-subtasks │ │ │ │ ├── remove-all-subtasks.md │ │ │ │ └── remove-subtasks.md │ │ │ ├── remove-task │ │ │ │ └── remove-task.md │ │ │ ├── set-status │ │ │ │ ├── to-cancelled.md │ │ │ │ ├── to-deferred.md │ │ │ │ ├── to-done.md │ │ │ │ ├── to-in-progress.md │ │ │ │ ├── to-pending.md │ │ │ │ └── to-review.md │ │ │ ├── setup │ │ │ │ ├── install-taskmaster.md │ │ │ │ └── quick-install-taskmaster.md │ │ │ ├── show │ │ │ │ └── show-task.md │ │ │ ├── status │ │ │ │ └── project-status.md │ │ │ ├── sync-readme │ │ │ │ └── sync-readme.md │ │ │ ├── tm-main.md │ │ │ ├── update │ │ │ │ ├── update-single-task.md │ │ │ │ ├── update-task.md │ │ │ │ └── update-tasks-from-id.md │ │ │ ├── utils │ │ │ │ └── analyze-project.md │ │ │ ├── validate-dependencies │ │ │ │ └── validate-dependencies.md │ │ │ └── workflows │ │ │ ├── auto-implement-tasks.md │ │ │ ├── command-pipeline.md │ │ │ └── smart-workflow.md │ │ └── TM_COMMANDS_GUIDE.md │ ├── config.json │ ├── env.example │ ├── example_prd.txt │ ├── gitignore │ ├── kiro-hooks │ │ ├── tm-code-change-task-tracker.kiro.hook │ │ ├── tm-complexity-analyzer.kiro.hook │ │ ├── tm-daily-standup-assistant.kiro.hook │ │ ├── tm-git-commit-task-linker.kiro.hook │ │ ├── tm-pr-readiness-checker.kiro.hook │ │ ├── tm-task-dependency-auto-progression.kiro.hook │ │ └── tm-test-success-task-completer.kiro.hook │ ├── roocode │ │ ├── .roo │ │ │ ├── rules-architect │ │ │ │ └── architect-rules │ │ │ ├── rules-ask │ │ │ │ └── ask-rules │ │ │ ├── rules-code │ │ │ │ └── code-rules │ │ │ ├── rules-debug │ │ │ │ └── debug-rules │ │ │ ├── rules-orchestrator │ │ │ │ └── orchestrator-rules │ │ │ └── rules-test │ │ │ └── test-rules │ │ └── .roomodes │ ├── rules │ │ ├── cursor_rules.mdc │ │ ├── dev_workflow.mdc │ │ ├── self_improve.mdc │ │ ├── taskmaster_hooks_workflow.mdc │ │ └── taskmaster.mdc │ └── scripts_README.md ├── bin │ └── task-master.js ├── biome.json ├── CHANGELOG.md ├── CLAUDE.md ├── context │ ├── chats │ │ ├── add-task-dependencies-1.md │ │ └── max-min-tokens.txt.md │ ├── fastmcp-core.txt │ ├── fastmcp-docs.txt │ ├── MCP_INTEGRATION.md │ ├── mcp-js-sdk-docs.txt │ ├── mcp-protocol-repo.txt │ ├── mcp-protocol-schema-03262025.json │ └── mcp-protocol-spec.txt ├── CONTRIBUTING.md ├── docs │ ├── CLI-COMMANDER-PATTERN.md │ ├── command-reference.md │ ├── configuration.md │ ├── contributor-docs │ │ └── testing-roo-integration.md │ ├── cross-tag-task-movement.md │ ├── examples │ │ └── claude-code-usage.md │ ├── examples.md │ ├── licensing.md │ ├── mcp-provider-guide.md │ ├── mcp-provider.md │ ├── migration-guide.md │ ├── models.md │ ├── providers │ │ └── gemini-cli.md │ ├── README.md │ ├── scripts │ │ └── models-json-to-markdown.js │ ├── task-structure.md │ └── tutorial.md ├── images │ └── logo.png ├── index.js ├── jest.config.js ├── jest.resolver.cjs ├── LICENSE ├── llms-install.md ├── mcp-server │ ├── server.js │ └── src │ ├── core │ │ ├── __tests__ │ │ │ └── context-manager.test.js │ │ ├── context-manager.js │ │ ├── direct-functions │ │ │ ├── add-dependency.js │ │ │ ├── add-subtask.js │ │ │ ├── add-tag.js │ │ │ ├── add-task.js │ │ │ ├── analyze-task-complexity.js │ │ │ ├── cache-stats.js │ │ │ ├── clear-subtasks.js │ │ │ ├── complexity-report.js │ │ │ ├── copy-tag.js │ │ │ ├── create-tag-from-branch.js │ │ │ ├── delete-tag.js │ │ │ ├── expand-all-tasks.js │ │ │ ├── expand-task.js │ │ │ ├── fix-dependencies.js │ │ │ ├── generate-task-files.js │ │ │ ├── initialize-project.js │ │ │ ├── list-tags.js │ │ │ ├── list-tasks.js │ │ │ ├── models.js │ │ │ ├── move-task-cross-tag.js │ │ │ ├── move-task.js │ │ │ ├── next-task.js │ │ │ ├── parse-prd.js │ │ │ ├── remove-dependency.js │ │ │ ├── remove-subtask.js │ │ │ ├── remove-task.js │ │ │ ├── rename-tag.js │ │ │ ├── research.js │ │ │ ├── response-language.js │ │ │ ├── rules.js │ │ │ ├── scope-down.js │ │ │ ├── scope-up.js │ │ │ ├── set-task-status.js │ │ │ ├── show-task.js │ │ │ ├── update-subtask-by-id.js │ │ │ ├── update-task-by-id.js │ │ │ ├── update-tasks.js │ │ │ ├── use-tag.js │ │ │ └── validate-dependencies.js │ │ ├── task-master-core.js │ │ └── utils │ │ ├── env-utils.js │ │ └── path-utils.js │ ├── custom-sdk │ │ ├── errors.js │ │ ├── index.js │ │ ├── json-extractor.js │ │ ├── language-model.js │ │ ├── message-converter.js │ │ └── schema-converter.js │ ├── index.js │ ├── logger.js │ ├── providers │ │ └── mcp-provider.js │ └── tools │ ├── add-dependency.js │ ├── add-subtask.js │ ├── add-tag.js │ ├── add-task.js │ ├── analyze.js │ ├── clear-subtasks.js │ ├── complexity-report.js │ ├── copy-tag.js │ ├── delete-tag.js │ ├── expand-all.js │ ├── expand-task.js │ ├── fix-dependencies.js │ ├── generate.js │ ├── get-operation-status.js │ ├── get-task.js │ ├── get-tasks.js │ ├── index.js │ ├── initialize-project.js │ ├── list-tags.js │ ├── models.js │ ├── move-task.js │ ├── next-task.js │ ├── parse-prd.js │ ├── remove-dependency.js │ ├── remove-subtask.js │ ├── remove-task.js │ ├── rename-tag.js │ ├── research.js │ ├── response-language.js │ ├── rules.js │ ├── scope-down.js │ ├── scope-up.js │ ├── set-task-status.js │ ├── update-subtask.js │ ├── update-task.js │ ├── update.js │ ├── use-tag.js │ ├── utils.js │ └── validate-dependencies.js ├── mcp-test.js ├── output.json ├── package-lock.json ├── package.json ├── packages │ ├── build-config │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ └── tsdown.base.ts │ │ └── tsconfig.json │ └── tm-core │ ├── .gitignore │ ├── CHANGELOG.md │ ├── docs │ │ └── listTasks-architecture.md │ ├── package.json │ ├── POC-STATUS.md │ ├── README.md │ ├── src │ │ ├── auth │ │ │ ├── auth-manager.test.ts │ │ │ ├── auth-manager.ts │ │ │ ├── config.ts │ │ │ ├── credential-store.test.ts │ │ │ ├── credential-store.ts │ │ │ ├── index.ts │ │ │ ├── oauth-service.ts │ │ │ ├── supabase-session-storage.ts │ │ │ └── types.ts │ │ ├── clients │ │ │ ├── index.ts │ │ │ └── supabase-client.ts │ │ ├── config │ │ │ ├── config-manager.spec.ts │ │ │ ├── config-manager.ts │ │ │ ├── index.ts │ │ │ └── services │ │ │ ├── config-loader.service.spec.ts │ │ │ ├── config-loader.service.ts │ │ │ ├── config-merger.service.spec.ts │ │ │ ├── config-merger.service.ts │ │ │ ├── config-persistence.service.spec.ts │ │ │ ├── config-persistence.service.ts │ │ │ ├── environment-config-provider.service.spec.ts │ │ │ ├── environment-config-provider.service.ts │ │ │ ├── index.ts │ │ │ ├── runtime-state-manager.service.spec.ts │ │ │ └── runtime-state-manager.service.ts │ │ ├── constants │ │ │ └── index.ts │ │ ├── entities │ │ │ └── task.entity.ts │ │ ├── errors │ │ │ ├── index.ts │ │ │ └── task-master-error.ts │ │ ├── executors │ │ │ ├── base-executor.ts │ │ │ ├── claude-executor.ts │ │ │ ├── executor-factory.ts │ │ │ ├── executor-service.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── index.ts │ │ ├── interfaces │ │ │ ├── ai-provider.interface.ts │ │ │ ├── configuration.interface.ts │ │ │ ├── index.ts │ │ │ └── storage.interface.ts │ │ ├── logger │ │ │ ├── factory.ts │ │ │ ├── index.ts │ │ │ └── logger.ts │ │ ├── mappers │ │ │ └── TaskMapper.ts │ │ ├── parser │ │ │ └── index.ts │ │ ├── providers │ │ │ ├── ai │ │ │ │ ├── base-provider.ts │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── repositories │ │ │ ├── supabase-task-repository.ts │ │ │ └── task-repository.interface.ts │ │ ├── services │ │ │ ├── index.ts │ │ │ ├── organization.service.ts │ │ │ ├── task-execution-service.ts │ │ │ └── task-service.ts │ │ ├── storage │ │ │ ├── api-storage.ts │ │ │ ├── file-storage │ │ │ │ ├── file-operations.ts │ │ │ │ ├── file-storage.ts │ │ │ │ ├── format-handler.ts │ │ │ │ ├── index.ts │ │ │ │ └── path-resolver.ts │ │ │ ├── index.ts │ │ │ └── storage-factory.ts │ │ ├── subpath-exports.test.ts │ │ ├── task-master-core.ts │ │ ├── types │ │ │ ├── database.types.ts │ │ │ ├── index.ts │ │ │ └── legacy.ts │ │ └── utils │ │ ├── id-generator.ts │ │ └── index.ts │ ├── tests │ │ ├── integration │ │ │ └── list-tasks.test.ts │ │ ├── mocks │ │ │ └── mock-provider.ts │ │ ├── setup.ts │ │ └── unit │ │ ├── base-provider.test.ts │ │ ├── executor.test.ts │ │ └── smoke.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── README-task-master.md ├── README.md ├── scripts │ ├── dev.js │ ├── init.js │ ├── modules │ │ ├── ai-services-unified.js │ │ ├── commands.js │ │ ├── config-manager.js │ │ ├── dependency-manager.js │ │ ├── index.js │ │ ├── prompt-manager.js │ │ ├── supported-models.json │ │ ├── sync-readme.js │ │ ├── task-manager │ │ │ ├── add-subtask.js │ │ │ ├── add-task.js │ │ │ ├── analyze-task-complexity.js │ │ │ ├── clear-subtasks.js │ │ │ ├── expand-all-tasks.js │ │ │ ├── expand-task.js │ │ │ ├── find-next-task.js │ │ │ ├── generate-task-files.js │ │ │ ├── is-task-dependent.js │ │ │ ├── list-tasks.js │ │ │ ├── migrate.js │ │ │ ├── models.js │ │ │ ├── move-task.js │ │ │ ├── parse-prd │ │ │ │ ├── index.js │ │ │ │ ├── parse-prd-config.js │ │ │ │ ├── parse-prd-helpers.js │ │ │ │ ├── parse-prd-non-streaming.js │ │ │ │ ├── parse-prd-streaming.js │ │ │ │ └── parse-prd.js │ │ │ ├── remove-subtask.js │ │ │ ├── remove-task.js │ │ │ ├── research.js │ │ │ ├── response-language.js │ │ │ ├── scope-adjustment.js │ │ │ ├── set-task-status.js │ │ │ ├── tag-management.js │ │ │ ├── task-exists.js │ │ │ ├── update-single-task-status.js │ │ │ ├── update-subtask-by-id.js │ │ │ ├── update-task-by-id.js │ │ │ └── update-tasks.js │ │ ├── task-manager.js │ │ ├── ui.js │ │ ├── update-config-tokens.js │ │ ├── utils │ │ │ ├── contextGatherer.js │ │ │ ├── fuzzyTaskSearch.js │ │ │ └── git-utils.js │ │ └── utils.js │ ├── task-complexity-report.json │ ├── test-claude-errors.js │ └── test-claude.js ├── src │ ├── ai-providers │ │ ├── anthropic.js │ │ ├── azure.js │ │ ├── base-provider.js │ │ ├── bedrock.js │ │ ├── claude-code.js │ │ ├── custom-sdk │ │ │ ├── claude-code │ │ │ │ ├── errors.js │ │ │ │ ├── index.js │ │ │ │ ├── json-extractor.js │ │ │ │ ├── language-model.js │ │ │ │ ├── message-converter.js │ │ │ │ └── types.js │ │ │ └── grok-cli │ │ │ ├── errors.js │ │ │ ├── index.js │ │ │ ├── json-extractor.js │ │ │ ├── language-model.js │ │ │ ├── message-converter.js │ │ │ └── types.js │ │ ├── gemini-cli.js │ │ ├── google-vertex.js │ │ ├── google.js │ │ ├── grok-cli.js │ │ ├── groq.js │ │ ├── index.js │ │ ├── ollama.js │ │ ├── openai.js │ │ ├── openrouter.js │ │ ├── perplexity.js │ │ └── xai.js │ ├── constants │ │ ├── commands.js │ │ ├── paths.js │ │ ├── profiles.js │ │ ├── providers.js │ │ ├── rules-actions.js │ │ ├── task-priority.js │ │ └── task-status.js │ ├── profiles │ │ ├── amp.js │ │ ├── base-profile.js │ │ ├── claude.js │ │ ├── cline.js │ │ ├── codex.js │ │ ├── cursor.js │ │ ├── gemini.js │ │ ├── index.js │ │ ├── kilo.js │ │ ├── kiro.js │ │ ├── opencode.js │ │ ├── roo.js │ │ ├── trae.js │ │ ├── vscode.js │ │ ├── windsurf.js │ │ └── zed.js │ ├── progress │ │ ├── base-progress-tracker.js │ │ ├── cli-progress-factory.js │ │ ├── parse-prd-tracker.js │ │ ├── progress-tracker-builder.js │ │ └── tracker-ui.js │ ├── prompts │ │ ├── add-task.json │ │ ├── analyze-complexity.json │ │ ├── expand-task.json │ │ ├── parse-prd.json │ │ ├── README.md │ │ ├── research.json │ │ ├── schemas │ │ │ ├── parameter.schema.json │ │ │ ├── prompt-template.schema.json │ │ │ ├── README.md │ │ │ └── variant.schema.json │ │ ├── update-subtask.json │ │ ├── update-task.json │ │ └── update-tasks.json │ ├── provider-registry │ │ └── index.js │ ├── task-master.js │ ├── ui │ │ ├── confirm.js │ │ ├── indicators.js │ │ └── parse-prd.js │ └── utils │ ├── asset-resolver.js │ ├── create-mcp-config.js │ ├── format.js │ ├── getVersion.js │ ├── logger-utils.js │ ├── manage-gitignore.js │ ├── path-utils.js │ ├── profiles.js │ ├── rule-transformer.js │ ├── stream-parser.js │ └── timeout-manager.js ├── test-clean-tags.js ├── test-config-manager.js ├── test-prd.txt ├── test-tag-functions.js ├── test-version-check-full.js ├── test-version-check.js ├── tests │ ├── e2e │ │ ├── e2e_helpers.sh │ │ ├── parse_llm_output.cjs │ │ ├── run_e2e.sh │ │ ├── run_fallback_verification.sh │ │ └── test_llm_analysis.sh │ ├── fixture │ │ └── test-tasks.json │ ├── fixtures │ │ ├── .taskmasterconfig │ │ ├── sample-claude-response.js │ │ ├── sample-prd.txt │ │ └── sample-tasks.js │ ├── integration │ │ ├── claude-code-optional.test.js │ │ ├── cli │ │ │ ├── commands.test.js │ │ │ ├── complex-cross-tag-scenarios.test.js │ │ │ └── move-cross-tag.test.js │ │ ├── manage-gitignore.test.js │ │ ├── mcp-server │ │ │ └── direct-functions.test.js │ │ ├── move-task-cross-tag.integration.test.js │ │ ├── move-task-simple.integration.test.js │ │ └── profiles │ │ ├── amp-init-functionality.test.js │ │ ├── claude-init-functionality.test.js │ │ ├── cline-init-functionality.test.js │ │ ├── codex-init-functionality.test.js │ │ ├── cursor-init-functionality.test.js │ │ ├── gemini-init-functionality.test.js │ │ ├── opencode-init-functionality.test.js │ │ ├── roo-files-inclusion.test.js │ │ ├── roo-init-functionality.test.js │ │ ├── rules-files-inclusion.test.js │ │ ├── trae-init-functionality.test.js │ │ ├── vscode-init-functionality.test.js │ │ └── windsurf-init-functionality.test.js │ ├── manual │ │ ├── progress │ │ │ ├── parse-prd-analysis.js │ │ │ ├── test-parse-prd.js │ │ │ └── TESTING_GUIDE.md │ │ └── prompts │ │ ├── prompt-test.js │ │ └── README.md │ ├── README.md │ ├── setup.js │ └── unit │ ├── ai-providers │ │ ├── claude-code.test.js │ │ ├── custom-sdk │ │ │ └── claude-code │ │ │ └── language-model.test.js │ │ ├── gemini-cli.test.js │ │ ├── mcp-components.test.js │ │ └── openai.test.js │ ├── ai-services-unified.test.js │ ├── commands.test.js │ ├── config-manager.test.js │ ├── config-manager.test.mjs │ ├── dependency-manager.test.js │ ├── init.test.js │ ├── initialize-project.test.js │ ├── kebab-case-validation.test.js │ ├── manage-gitignore.test.js │ ├── mcp │ │ └── tools │ │ ├── __mocks__ │ │ │ └── move-task.js │ │ ├── add-task.test.js │ │ ├── analyze-complexity.test.js │ │ ├── expand-all.test.js │ │ ├── get-tasks.test.js │ │ ├── initialize-project.test.js │ │ ├── move-task-cross-tag-options.test.js │ │ ├── move-task-cross-tag.test.js │ │ └── remove-task.test.js │ ├── mcp-providers │ │ ├── mcp-components.test.js │ │ └── mcp-provider.test.js │ ├── parse-prd.test.js │ ├── profiles │ │ ├── amp-integration.test.js │ │ ├── claude-integration.test.js │ │ ├── cline-integration.test.js │ │ ├── codex-integration.test.js │ │ ├── cursor-integration.test.js │ │ ├── gemini-integration.test.js │ │ ├── kilo-integration.test.js │ │ ├── kiro-integration.test.js │ │ ├── mcp-config-validation.test.js │ │ ├── opencode-integration.test.js │ │ ├── profile-safety-check.test.js │ │ ├── roo-integration.test.js │ │ ├── rule-transformer-cline.test.js │ │ ├── rule-transformer-cursor.test.js │ │ ├── rule-transformer-gemini.test.js │ │ ├── rule-transformer-kilo.test.js │ │ ├── rule-transformer-kiro.test.js │ │ ├── rule-transformer-opencode.test.js │ │ ├── rule-transformer-roo.test.js │ │ ├── rule-transformer-trae.test.js │ │ ├── rule-transformer-vscode.test.js │ │ ├── rule-transformer-windsurf.test.js │ │ ├── rule-transformer-zed.test.js │ │ ├── rule-transformer.test.js │ │ ├── selective-profile-removal.test.js │ │ ├── subdirectory-support.test.js │ │ ├── trae-integration.test.js │ │ ├── vscode-integration.test.js │ │ ├── windsurf-integration.test.js │ │ └── zed-integration.test.js │ ├── progress │ │ └── base-progress-tracker.test.js │ ├── prompt-manager.test.js │ ├── prompts │ │ └── expand-task-prompt.test.js │ ├── providers │ │ └── provider-registry.test.js │ ├── scripts │ │ └── modules │ │ ├── commands │ │ │ ├── move-cross-tag.test.js │ │ │ └── README.md │ │ ├── dependency-manager │ │ │ ├── circular-dependencies.test.js │ │ │ ├── cross-tag-dependencies.test.js │ │ │ └── fix-dependencies-command.test.js │ │ ├── task-manager │ │ │ ├── add-subtask.test.js │ │ │ ├── add-task.test.js │ │ │ ├── analyze-task-complexity.test.js │ │ │ ├── clear-subtasks.test.js │ │ │ ├── complexity-report-tag-isolation.test.js │ │ │ ├── expand-all-tasks.test.js │ │ │ ├── expand-task.test.js │ │ │ ├── find-next-task.test.js │ │ │ ├── generate-task-files.test.js │ │ │ ├── list-tasks.test.js │ │ │ ├── move-task-cross-tag.test.js │ │ │ ├── move-task.test.js │ │ │ ├── parse-prd.test.js │ │ │ ├── remove-subtask.test.js │ │ │ ├── remove-task.test.js │ │ │ ├── research.test.js │ │ │ ├── scope-adjustment.test.js │ │ │ ├── set-task-status.test.js │ │ │ ├── setup.js │ │ │ ├── update-single-task-status.test.js │ │ │ ├── update-subtask-by-id.test.js │ │ │ ├── update-task-by-id.test.js │ │ │ └── update-tasks.test.js │ │ ├── ui │ │ │ └── cross-tag-error-display.test.js │ │ └── utils-tag-aware-paths.test.js │ ├── task-finder.test.js │ ├── task-manager │ │ ├── clear-subtasks.test.js │ │ ├── move-task.test.js │ │ ├── tag-boundary.test.js │ │ └── tag-management.test.js │ ├── task-master.test.js │ ├── ui │ │ └── indicators.test.js │ ├── ui.test.js │ ├── utils-strip-ansi.test.js │ └── utils.test.js ├── tsconfig.json ├── tsdown.config.ts └── turbo.json ``` # Files -------------------------------------------------------------------------------- /.claude/commands/tm/update/update-tasks-from-id.md: -------------------------------------------------------------------------------- ```markdown 1 | Update multiple tasks starting from a specific ID. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Parse starting task ID and update context. 6 | 7 | ## Bulk Task Updates 8 | 9 | Update multiple related tasks based on new requirements or context changes. 10 | 11 | ## Argument Parsing 12 | 13 | - "from 5: add security requirements" 14 | - "5 onwards: update API endpoints" 15 | - "starting at 5: change to use new framework" 16 | 17 | ## Execution 18 | 19 | ```bash 20 | task-master update --from=<id> --prompt="<context>" 21 | ``` 22 | 23 | ## Update Process 24 | 25 | ### 1. **Task Selection** 26 | Starting from specified ID: 27 | - Include the task itself 28 | - Include all dependent tasks 29 | - Include related subtasks 30 | - Smart boundary detection 31 | 32 | ### 2. **Context Application** 33 | AI analyzes the update context and: 34 | - Identifies what needs changing 35 | - Maintains consistency 36 | - Preserves completed work 37 | - Updates related information 38 | 39 | ### 3. **Intelligent Updates** 40 | - Modify descriptions appropriately 41 | - Update test strategies 42 | - Adjust time estimates 43 | - Revise dependencies if needed 44 | 45 | ## Smart Features 46 | 47 | 1. **Scope Detection** 48 | - Find natural task groupings 49 | - Identify related features 50 | - Stop at logical boundaries 51 | - Avoid over-updating 52 | 53 | 2. **Consistency Maintenance** 54 | - Keep naming conventions 55 | - Preserve relationships 56 | - Update cross-references 57 | - Maintain task flow 58 | 59 | 3. **Change Preview** 60 | ``` 61 | Bulk Update Preview 62 | ━━━━━━━━━━━━━━━━━━ 63 | Starting from: Task #5 64 | Tasks to update: 8 tasks + 12 subtasks 65 | 66 | Context: "add security requirements" 67 | 68 | Changes will include: 69 | - Add security sections to descriptions 70 | - Update test strategies for security 71 | - Add security-related subtasks where needed 72 | - Adjust time estimates (+20% average) 73 | 74 | Continue? (y/n) 75 | ``` 76 | 77 | ## Example Updates 78 | 79 | ``` 80 | /project:tm/update/from-id 5: change database to PostgreSQL 81 | → Analyzing impact starting from task #5 82 | → Found 6 related tasks to update 83 | → Updates will maintain consistency 84 | → Preview changes? (y/n) 85 | 86 | Applied updates: 87 | ✓ Task #5: Updated connection logic references 88 | ✓ Task #6: Changed migration approach 89 | ✓ Task #7: Updated query syntax notes 90 | ✓ Task #8: Revised testing strategy 91 | ✓ Task #9: Updated deployment steps 92 | ✓ Task #12: Changed backup procedures 93 | ``` 94 | 95 | ## Safety Features 96 | 97 | - Preview all changes 98 | - Selective confirmation 99 | - Rollback capability 100 | - Change logging 101 | - Validation checks 102 | 103 | ## Post-Update 104 | 105 | - Summary of changes 106 | - Consistency verification 107 | - Suggest review tasks 108 | - Update timeline if needed ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/update/update-tasks-from-id.md: -------------------------------------------------------------------------------- ```markdown 1 | Update multiple tasks starting from a specific ID. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Parse starting task ID and update context. 6 | 7 | ## Bulk Task Updates 8 | 9 | Update multiple related tasks based on new requirements or context changes. 10 | 11 | ## Argument Parsing 12 | 13 | - "from 5: add security requirements" 14 | - "5 onwards: update API endpoints" 15 | - "starting at 5: change to use new framework" 16 | 17 | ## Execution 18 | 19 | ```bash 20 | task-master update --from=<id> --prompt="<context>" 21 | ``` 22 | 23 | ## Update Process 24 | 25 | ### 1. **Task Selection** 26 | Starting from specified ID: 27 | - Include the task itself 28 | - Include all dependent tasks 29 | - Include related subtasks 30 | - Smart boundary detection 31 | 32 | ### 2. **Context Application** 33 | AI analyzes the update context and: 34 | - Identifies what needs changing 35 | - Maintains consistency 36 | - Preserves completed work 37 | - Updates related information 38 | 39 | ### 3. **Intelligent Updates** 40 | - Modify descriptions appropriately 41 | - Update test strategies 42 | - Adjust time estimates 43 | - Revise dependencies if needed 44 | 45 | ## Smart Features 46 | 47 | 1. **Scope Detection** 48 | - Find natural task groupings 49 | - Identify related features 50 | - Stop at logical boundaries 51 | - Avoid over-updating 52 | 53 | 2. **Consistency Maintenance** 54 | - Keep naming conventions 55 | - Preserve relationships 56 | - Update cross-references 57 | - Maintain task flow 58 | 59 | 3. **Change Preview** 60 | ``` 61 | Bulk Update Preview 62 | ━━━━━━━━━━━━━━━━━━ 63 | Starting from: Task #5 64 | Tasks to update: 8 tasks + 12 subtasks 65 | 66 | Context: "add security requirements" 67 | 68 | Changes will include: 69 | - Add security sections to descriptions 70 | - Update test strategies for security 71 | - Add security-related subtasks where needed 72 | - Adjust time estimates (+20% average) 73 | 74 | Continue? (y/n) 75 | ``` 76 | 77 | ## Example Updates 78 | 79 | ``` 80 | /project:tm/update/from-id 5: change database to PostgreSQL 81 | → Analyzing impact starting from task #5 82 | → Found 6 related tasks to update 83 | → Updates will maintain consistency 84 | → Preview changes? (y/n) 85 | 86 | Applied updates: 87 | ✓ Task #5: Updated connection logic references 88 | ✓ Task #6: Changed migration approach 89 | ✓ Task #7: Updated query syntax notes 90 | ✓ Task #8: Revised testing strategy 91 | ✓ Task #9: Updated deployment steps 92 | ✓ Task #12: Changed backup procedures 93 | ``` 94 | 95 | ## Safety Features 96 | 97 | - Preview all changes 98 | - Selective confirmation 99 | - Rollback capability 100 | - Change logging 101 | - Validation checks 102 | 103 | ## Post-Update 104 | 105 | - Summary of changes 106 | - Consistency verification 107 | - Suggest review tasks 108 | - Update timeline if needed ``` -------------------------------------------------------------------------------- /.claude/commands/tm/generate/generate-tasks.md: -------------------------------------------------------------------------------- ```markdown 1 | Generate individual task files from tasks.json. 2 | 3 | ## Task File Generation 4 | 5 | Creates separate markdown files for each task, perfect for AI agents or documentation. 6 | 7 | ## Execution 8 | 9 | ```bash 10 | task-master generate 11 | ``` 12 | 13 | ## What It Creates 14 | 15 | For each task, generates a file like `task_001.txt`: 16 | 17 | ``` 18 | Task ID: 1 19 | Title: Implement user authentication 20 | Status: pending 21 | Priority: high 22 | Dependencies: [] 23 | Created: 2024-01-15 24 | Complexity: 7 25 | 26 | ## Description 27 | Create a secure user authentication system with login, logout, and session management. 28 | 29 | ## Details 30 | - Use JWT tokens for session management 31 | - Implement secure password hashing 32 | - Add remember me functionality 33 | - Include password reset flow 34 | 35 | ## Test Strategy 36 | - Unit tests for auth functions 37 | - Integration tests for login flow 38 | - Security testing for vulnerabilities 39 | - Performance tests for concurrent logins 40 | 41 | ## Subtasks 42 | 1.1 Setup authentication framework (pending) 43 | 1.2 Create login endpoints (pending) 44 | 1.3 Implement session management (pending) 45 | 1.4 Add password reset (pending) 46 | ``` 47 | 48 | ## File Organization 49 | 50 | Creates structure: 51 | ``` 52 | .taskmaster/ 53 | └── tasks/ 54 | ├── task_001.txt 55 | ├── task_002.txt 56 | ├── task_003.txt 57 | └── ... 58 | ``` 59 | 60 | ## Smart Features 61 | 62 | 1. **Consistent Formatting** 63 | - Standardized structure 64 | - Clear sections 65 | - AI-readable format 66 | - Markdown compatible 67 | 68 | 2. **Contextual Information** 69 | - Full task details 70 | - Related task references 71 | - Progress indicators 72 | - Implementation notes 73 | 74 | 3. **Incremental Updates** 75 | - Only regenerate changed tasks 76 | - Preserve custom additions 77 | - Track generation timestamp 78 | - Version control friendly 79 | 80 | ## Use Cases 81 | 82 | - **AI Context**: Provide task context to AI assistants 83 | - **Documentation**: Standalone task documentation 84 | - **Archival**: Task history preservation 85 | - **Sharing**: Send specific tasks to team members 86 | - **Review**: Easier task review process 87 | 88 | ## Generation Options 89 | 90 | Based on arguments: 91 | - Filter by status 92 | - Include/exclude completed 93 | - Custom templates 94 | - Different formats 95 | 96 | ## Post-Generation 97 | 98 | ``` 99 | Task File Generation Complete 100 | ━━━━━━━━━━━━━━━━━━━━━━━━━━ 101 | Generated: 45 task files 102 | Location: .taskmaster/tasks/ 103 | Total size: 156 KB 104 | 105 | New files: 5 106 | Updated files: 12 107 | Unchanged: 28 108 | 109 | Ready for: 110 | - AI agent consumption 111 | - Version control 112 | - Team distribution 113 | ``` 114 | 115 | ## Integration Benefits 116 | 117 | - Git-trackable task history 118 | - Easy task sharing 119 | - AI tool compatibility 120 | - Offline task access 121 | - Backup redundancy ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/generate/generate-tasks.md: -------------------------------------------------------------------------------- ```markdown 1 | Generate individual task files from tasks.json. 2 | 3 | ## Task File Generation 4 | 5 | Creates separate markdown files for each task, perfect for AI agents or documentation. 6 | 7 | ## Execution 8 | 9 | ```bash 10 | task-master generate 11 | ``` 12 | 13 | ## What It Creates 14 | 15 | For each task, generates a file like `task_001.txt`: 16 | 17 | ``` 18 | Task ID: 1 19 | Title: Implement user authentication 20 | Status: pending 21 | Priority: high 22 | Dependencies: [] 23 | Created: 2024-01-15 24 | Complexity: 7 25 | 26 | ## Description 27 | Create a secure user authentication system with login, logout, and session management. 28 | 29 | ## Details 30 | - Use JWT tokens for session management 31 | - Implement secure password hashing 32 | - Add remember me functionality 33 | - Include password reset flow 34 | 35 | ## Test Strategy 36 | - Unit tests for auth functions 37 | - Integration tests for login flow 38 | - Security testing for vulnerabilities 39 | - Performance tests for concurrent logins 40 | 41 | ## Subtasks 42 | 1.1 Setup authentication framework (pending) 43 | 1.2 Create login endpoints (pending) 44 | 1.3 Implement session management (pending) 45 | 1.4 Add password reset (pending) 46 | ``` 47 | 48 | ## File Organization 49 | 50 | Creates structure: 51 | ``` 52 | .taskmaster/ 53 | └── tasks/ 54 | ├── task_001.txt 55 | ├── task_002.txt 56 | ├── task_003.txt 57 | └── ... 58 | ``` 59 | 60 | ## Smart Features 61 | 62 | 1. **Consistent Formatting** 63 | - Standardized structure 64 | - Clear sections 65 | - AI-readable format 66 | - Markdown compatible 67 | 68 | 2. **Contextual Information** 69 | - Full task details 70 | - Related task references 71 | - Progress indicators 72 | - Implementation notes 73 | 74 | 3. **Incremental Updates** 75 | - Only regenerate changed tasks 76 | - Preserve custom additions 77 | - Track generation timestamp 78 | - Version control friendly 79 | 80 | ## Use Cases 81 | 82 | - **AI Context**: Provide task context to AI assistants 83 | - **Documentation**: Standalone task documentation 84 | - **Archival**: Task history preservation 85 | - **Sharing**: Send specific tasks to team members 86 | - **Review**: Easier task review process 87 | 88 | ## Generation Options 89 | 90 | Based on arguments: 91 | - Filter by status 92 | - Include/exclude completed 93 | - Custom templates 94 | - Different formats 95 | 96 | ## Post-Generation 97 | 98 | ``` 99 | Task File Generation Complete 100 | ━━━━━━━━━━━━━━━━━━━━━━━━━━ 101 | Generated: 45 task files 102 | Location: .taskmaster/tasks/ 103 | Total size: 156 KB 104 | 105 | New files: 5 106 | Updated files: 12 107 | Unchanged: 28 108 | 109 | Ready for: 110 | - AI agent consumption 111 | - Version control 112 | - Team distribution 113 | ``` 114 | 115 | ## Integration Benefits 116 | 117 | - Git-trackable task history 118 | - Easy task sharing 119 | - AI tool compatibility 120 | - Offline task access 121 | - Backup redundancy ``` -------------------------------------------------------------------------------- /tests/integration/profiles/cursor-init-functionality.test.js: -------------------------------------------------------------------------------- ```javascript 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { cursorProfile } from '../../../src/profiles/cursor.js'; 4 | 5 | describe('Cursor Profile Initialization Functionality', () => { 6 | let cursorProfileContent; 7 | 8 | beforeAll(() => { 9 | const cursorJsPath = path.join( 10 | process.cwd(), 11 | 'src', 12 | 'profiles', 13 | 'cursor.js' 14 | ); 15 | cursorProfileContent = fs.readFileSync(cursorJsPath, 'utf8'); 16 | }); 17 | 18 | test('cursor.js uses factory pattern with correct configuration', () => { 19 | // Check for explicit, non-default values in the source file 20 | expect(cursorProfileContent).toContain("name: 'cursor'"); 21 | expect(cursorProfileContent).toContain("displayName: 'Cursor'"); 22 | expect(cursorProfileContent).toContain("url: 'cursor.so'"); 23 | expect(cursorProfileContent).toContain("docsUrl: 'docs.cursor.com'"); 24 | expect(cursorProfileContent).toContain("targetExtension: '.mdc'"); // non-default 25 | 26 | // Check the final computed properties on the profile object 27 | expect(cursorProfile.profileName).toBe('cursor'); 28 | expect(cursorProfile.displayName).toBe('Cursor'); 29 | expect(cursorProfile.profileDir).toBe('.cursor'); // default 30 | expect(cursorProfile.rulesDir).toBe('.cursor/rules'); // default 31 | expect(cursorProfile.mcpConfig).toBe(true); // default 32 | expect(cursorProfile.mcpConfigName).toBe('mcp.json'); // default 33 | }); 34 | 35 | test('cursor.js preserves .mdc extension in both input and output', () => { 36 | // Check that the profile object has the correct file mapping behavior (cursor keeps .mdc) 37 | expect(cursorProfile.fileMap['rules/cursor_rules.mdc']).toBe( 38 | 'cursor_rules.mdc' 39 | ); 40 | // Also check that targetExtension is explicitly set in the file 41 | expect(cursorProfileContent).toContain("targetExtension: '.mdc'"); 42 | }); 43 | 44 | test('cursor.js uses standard tool mappings (no tool renaming)', () => { 45 | // Check that the profile uses default tool mappings (equivalent to COMMON_TOOL_MAPPINGS.STANDARD) 46 | // This verifies the architectural pattern: no custom toolMappings = standard tool names 47 | expect(cursorProfileContent).not.toContain('toolMappings:'); 48 | expect(cursorProfileContent).not.toContain('apply_diff'); 49 | expect(cursorProfileContent).not.toContain('search_files'); 50 | 51 | // Verify the result: default mappings means tools keep their original names 52 | expect(cursorProfile.conversionConfig.toolNames.edit_file).toBe( 53 | 'edit_file' 54 | ); 55 | expect(cursorProfile.conversionConfig.toolNames.search).toBe('search'); 56 | }); 57 | }); 58 | ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/validate-dependencies.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * tools/validate-dependencies.js 3 | * Tool for validating task dependencies 4 | */ 5 | 6 | import { z } from 'zod'; 7 | import { 8 | handleApiResult, 9 | createErrorResponse, 10 | withNormalizedProjectRoot 11 | } from './utils.js'; 12 | import { validateDependenciesDirect } from '../core/task-master-core.js'; 13 | import { findTasksPath } from '../core/utils/path-utils.js'; 14 | import { resolveTag } from '../../../scripts/modules/utils.js'; 15 | 16 | /** 17 | * Register the validateDependencies tool with the MCP server 18 | * @param {Object} server - FastMCP server instance 19 | */ 20 | export function registerValidateDependenciesTool(server) { 21 | server.addTool({ 22 | name: 'validate_dependencies', 23 | description: 24 | 'Check tasks for dependency issues (like circular references or links to non-existent tasks) without making changes.', 25 | parameters: z.object({ 26 | file: z.string().optional().describe('Absolute path to the tasks file'), 27 | projectRoot: z 28 | .string() 29 | .describe('The directory of the project. Must be an absolute path.'), 30 | tag: z.string().optional().describe('Tag context to operate on') 31 | }), 32 | execute: withNormalizedProjectRoot(async (args, { log, session }) => { 33 | try { 34 | const resolvedTag = resolveTag({ 35 | projectRoot: args.projectRoot, 36 | tag: args.tag 37 | }); 38 | log.info(`Validating dependencies with args: ${JSON.stringify(args)}`); 39 | 40 | // Use args.projectRoot directly (guaranteed by withNormalizedProjectRoot) 41 | let tasksJsonPath; 42 | try { 43 | tasksJsonPath = findTasksPath( 44 | { projectRoot: args.projectRoot, file: args.file }, 45 | log 46 | ); 47 | } catch (error) { 48 | log.error(`Error finding tasks.json: ${error.message}`); 49 | return createErrorResponse( 50 | `Failed to find tasks.json: ${error.message}` 51 | ); 52 | } 53 | 54 | const result = await validateDependenciesDirect( 55 | { 56 | tasksJsonPath: tasksJsonPath, 57 | projectRoot: args.projectRoot, 58 | tag: resolvedTag 59 | }, 60 | log 61 | ); 62 | 63 | if (result.success) { 64 | log.info( 65 | `Successfully validated dependencies: ${result.data.message}` 66 | ); 67 | } else { 68 | log.error(`Failed to validate dependencies: ${result.error.message}`); 69 | } 70 | 71 | return handleApiResult( 72 | result, 73 | log, 74 | 'Error validating dependencies', 75 | undefined, 76 | args.projectRoot 77 | ); 78 | } catch (error) { 79 | log.error(`Error in validateDependencies tool: ${error.message}`); 80 | return createErrorResponse(error.message); 81 | } 82 | }) 83 | }); 84 | } 85 | ``` -------------------------------------------------------------------------------- /apps/extension/src/webview/components/TaskCard.tsx: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * Task Card Component for Kanban Board 3 | */ 4 | 5 | import React from 'react'; 6 | import { KanbanCard } from '@/components/ui/shadcn-io/kanban'; 7 | import { PriorityBadge } from './PriorityBadge'; 8 | import type { TaskMasterTask } from '../types'; 9 | 10 | interface TaskCardProps { 11 | task: TaskMasterTask; 12 | dragging?: boolean; 13 | onViewDetails?: (taskId: string) => void; 14 | } 15 | 16 | export const TaskCard: React.FC<TaskCardProps> = ({ 17 | task, 18 | dragging, 19 | onViewDetails 20 | }) => { 21 | const handleCardClick = (e: React.MouseEvent) => { 22 | e.preventDefault(); 23 | onViewDetails?.(task.id); 24 | }; 25 | 26 | return ( 27 | <KanbanCard 28 | id={task.id} 29 | name={task.title} 30 | index={0} // Index is not used in our implementation 31 | parent={task.status} 32 | className="cursor-pointer p-3 transition-shadow hover:shadow-md bg-vscode-editor-background border-vscode-border group" 33 | onClick={handleCardClick} 34 | > 35 | <div className="space-y-3 h-full flex flex-col"> 36 | <div className="flex items-start justify-between gap-2 flex-shrink-0"> 37 | <h3 className="font-medium text-sm leading-tight flex-1 min-w-0 text-vscode-foreground"> 38 | {task.title} 39 | </h3> 40 | <div className="flex items-center gap-1 flex-shrink-0"> 41 | <PriorityBadge priority={task.priority} /> 42 | </div> 43 | </div> 44 | 45 | {task.description && ( 46 | <p className="text-xs text-vscode-foreground/70 line-clamp-3 leading-relaxed flex-1 min-h-0"> 47 | {task.description} 48 | </p> 49 | )} 50 | 51 | <div className="flex items-center justify-between text-xs mt-auto pt-2 flex-shrink-0 border-t border-vscode-border/20"> 52 | <span className="font-mono text-vscode-foreground/50 flex-shrink-0"> 53 | #{task.id} 54 | </span> 55 | {task.dependencies && task.dependencies.length > 0 && ( 56 | <div className="flex items-center gap-1 text-vscode-foreground/50 flex-shrink-0 ml-2"> 57 | <span>Deps:</span> 58 | <div className="flex items-center gap-1"> 59 | {task.dependencies.map((depId, index) => ( 60 | <React.Fragment key={depId}> 61 | <button 62 | className="font-mono hover:text-vscode-link-activeForeground hover:underline transition-colors" 63 | onClick={(e) => { 64 | e.stopPropagation(); 65 | onViewDetails?.(depId); 66 | }} 67 | > 68 | #{depId} 69 | </button> 70 | {index < task.dependencies!.length - 1 && <span>,</span>} 71 | </React.Fragment> 72 | ))} 73 | </div> 74 | </div> 75 | )} 76 | </div> 77 | </div> 78 | </KanbanCard> 79 | ); 80 | }; 81 | ``` -------------------------------------------------------------------------------- /apps/extension/assets/icon-dark.svg: -------------------------------------------------------------------------------- ``` 1 | <svg viewBox="0 0 224 291" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M101.635 286.568L71.4839 256.414C65.6092 250.539 65.6092 241.03 71.4839 235.155L142.52 164.11C144.474 162.156 147.643 162.156 149.61 164.11L176.216 190.719C178.17 192.673 181.339 192.673 183.305 190.719L189.719 184.305C191.673 182.35 191.673 179.181 189.719 177.214L163.113 150.605C161.159 148.651 161.159 145.481 163.113 143.514L191.26 115.365C193.214 113.41 193.214 110.241 191.26 108.274L182.316 99.3291C180.362 97.3748 177.193 97.3748 175.226 99.3291L55.8638 218.706C49.989 224.581 40.4816 224.581 34.6068 218.706L4.4061 188.501C-1.4687 182.626 -1.4687 173.117 4.4061 167.242L23.8342 147.811C25.7883 145.857 25.7883 142.688 23.8342 140.721L4.78187 121.666C-1.09293 115.791 -1.09293 106.282 4.78187 100.406L34.7195 70.4527C40.5943 64.5772 50.1017 64.5772 55.9765 70.4527L75.555 90.0335C77.5091 91.9879 80.6782 91.9879 82.6448 90.0335L124.144 48.5292C126.098 46.5749 126.098 43.4054 124.144 41.4385L115.463 32.7568C113.509 30.8025 110.34 30.8025 108.374 32.7568L99.8683 41.2632C97.9143 43.2175 94.7451 43.2175 92.7785 41.2632L82.1438 30.6271C80.1897 28.6728 80.1897 25.5033 82.1438 23.5364L101.271 4.40662C107.146 -1.46887 116.653 -1.46887 122.528 4.40662L152.478 34.3604C158.353 40.2359 158.353 49.7444 152.478 55.6199L82.6323 125.474C80.6782 127.429 77.5091 127.429 75.5425 125.474L48.8741 98.8029C46.9201 96.8486 43.7509 96.8486 41.7843 98.8029L33.1036 107.485C31.1496 109.439 31.1496 112.608 33.1036 114.575L59.2458 140.721C61.1999 142.675 61.1999 145.844 59.2458 147.811L32.7404 174.32C30.7863 176.274 30.7863 179.444 32.7404 181.411L41.6841 190.355C43.6382 192.31 46.8073 192.31 48.7739 190.355L168.136 70.9789C174.011 65.1034 183.518 65.1034 189.393 70.9789L219.594 101.183C225.469 107.059 225.469 116.567 219.594 122.443L198.537 143.502C196.583 145.456 196.583 148.626 198.537 150.592L218.053 170.111C223.928 175.986 223.928 185.495 218.053 191.37L190.37 219.056C184.495 224.932 174.988 224.932 169.113 219.056L149.597 199.538C147.643 197.584 144.474 197.584 142.508 199.538L99.8057 242.245C97.8516 244.2 97.8516 247.369 99.8057 249.336L108.699 258.231C110.653 260.185 113.823 260.185 115.789 258.231L122.954 251.065C124.908 249.11 128.077 249.11 130.044 251.065L140.679 261.701C142.633 263.655 142.633 266.825 140.679 268.791L122.879 286.593C117.004 292.469 107.497 292.469 101.622 286.593L101.635 286.568Z" fill="#CCCCCC"/> 3 | </svg> ``` -------------------------------------------------------------------------------- /apps/extension/assets/icon-light.svg: -------------------------------------------------------------------------------- ``` 1 | <svg viewBox="0 0 224 291" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M101.635 286.568L71.4839 256.414C65.6092 250.539 65.6092 241.03 71.4839 235.155L142.52 164.11C144.474 162.156 147.643 162.156 149.61 164.11L176.216 190.719C178.17 192.673 181.339 192.673 183.305 190.719L189.719 184.305C191.673 182.35 191.673 179.181 189.719 177.214L163.113 150.605C161.159 148.651 161.159 145.481 163.113 143.514L191.26 115.365C193.214 113.41 193.214 110.241 191.26 108.274L182.316 99.3291C180.362 97.3748 177.193 97.3748 175.226 99.3291L55.8638 218.706C49.989 224.581 40.4816 224.581 34.6068 218.706L4.4061 188.501C-1.4687 182.626 -1.4687 173.117 4.4061 167.242L23.8342 147.811C25.7883 145.857 25.7883 142.688 23.8342 140.721L4.78187 121.666C-1.09293 115.791 -1.09293 106.282 4.78187 100.406L34.7195 70.4527C40.5943 64.5772 50.1017 64.5772 55.9765 70.4527L75.555 90.0335C77.5091 91.9879 80.6782 91.9879 82.6448 90.0335L124.144 48.5292C126.098 46.5749 126.098 43.4054 124.144 41.4385L115.463 32.7568C113.509 30.8025 110.34 30.8025 108.374 32.7568L99.8683 41.2632C97.9143 43.2175 94.7451 43.2175 92.7785 41.2632L82.1438 30.6271C80.1897 28.6728 80.1897 25.5033 82.1438 23.5364L101.271 4.40662C107.146 -1.46887 116.653 -1.46887 122.528 4.40662L152.478 34.3604C158.353 40.2359 158.353 49.7444 152.478 55.6199L82.6323 125.474C80.6782 127.429 77.5091 127.429 75.5425 125.474L48.8741 98.8029C46.9201 96.8486 43.7509 96.8486 41.7843 98.8029L33.1036 107.485C31.1496 109.439 31.1496 112.608 33.1036 114.575L59.2458 140.721C61.1999 142.675 61.1999 145.844 59.2458 147.811L32.7404 174.32C30.7863 176.274 30.7863 179.444 32.7404 181.411L41.6841 190.355C43.6382 192.31 46.8073 192.31 48.7739 190.355L168.136 70.9789C174.011 65.1034 183.518 65.1034 189.393 70.9789L219.594 101.183C225.469 107.059 225.469 116.567 219.594 122.443L198.537 143.502C196.583 145.456 196.583 148.626 198.537 150.592L218.053 170.111C223.928 175.986 223.928 185.495 218.053 191.37L190.37 219.056C184.495 224.932 174.988 224.932 169.113 219.056L149.597 199.538C147.643 197.584 144.474 197.584 142.508 199.538L99.8057 242.245C97.8516 244.2 97.8516 247.369 99.8057 249.336L108.699 258.231C110.653 260.185 113.823 260.185 115.789 258.231L122.954 251.065C124.908 249.11 128.077 249.11 130.044 251.065L140.679 261.701C142.633 263.655 142.633 266.825 140.679 268.791L122.879 286.593C117.004 292.469 107.497 292.469 101.622 286.593L101.635 286.568Z" fill="#424242"/> 3 | </svg> ``` -------------------------------------------------------------------------------- /apps/extension/assets/sidebar-icon.svg: -------------------------------------------------------------------------------- ``` 1 | <svg viewBox="0 0 224 291" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M101.635 286.568L71.4839 256.414C65.6092 250.539 65.6092 241.03 71.4839 235.155L142.52 164.11C144.474 162.156 147.643 162.156 149.61 164.11L176.216 190.719C178.17 192.673 181.339 192.673 183.305 190.719L189.719 184.305C191.673 182.35 191.673 179.181 189.719 177.214L163.113 150.605C161.159 148.651 161.159 145.481 163.113 143.514L191.26 115.365C193.214 113.41 193.214 110.241 191.26 108.274L182.316 99.3291C180.362 97.3748 177.193 97.3748 175.226 99.3291L55.8638 218.706C49.989 224.581 40.4816 224.581 34.6068 218.706L4.4061 188.501C-1.4687 182.626 -1.4687 173.117 4.4061 167.242L23.8342 147.811C25.7883 145.857 25.7883 142.688 23.8342 140.721L4.78187 121.666C-1.09293 115.791 -1.09293 106.282 4.78187 100.406L34.7195 70.4527C40.5943 64.5772 50.1017 64.5772 55.9765 70.4527L75.555 90.0335C77.5091 91.9879 80.6782 91.9879 82.6448 90.0335L124.144 48.5292C126.098 46.5749 126.098 43.4054 124.144 41.4385L115.463 32.7568C113.509 30.8025 110.34 30.8025 108.374 32.7568L99.8683 41.2632C97.9143 43.2175 94.7451 43.2175 92.7785 41.2632L82.1438 30.6271C80.1897 28.6728 80.1897 25.5033 82.1438 23.5364L101.271 4.40662C107.146 -1.46887 116.653 -1.46887 122.528 4.40662L152.478 34.3604C158.353 40.2359 158.353 49.7444 152.478 55.6199L82.6323 125.474C80.6782 127.429 77.5091 127.429 75.5425 125.474L48.8741 98.8029C46.9201 96.8486 43.7509 96.8486 41.7843 98.8029L33.1036 107.485C31.1496 109.439 31.1496 112.608 33.1036 114.575L59.2458 140.721C61.1999 142.675 61.1999 145.844 59.2458 147.811L32.7404 174.32C30.7863 176.274 30.7863 179.444 32.7404 181.411L41.6841 190.355C43.6382 192.31 46.8073 192.31 48.7739 190.355L168.136 70.9789C174.011 65.1034 183.518 65.1034 189.393 70.9789L219.594 101.183C225.469 107.059 225.469 116.567 219.594 122.443L198.537 143.502C196.583 145.456 196.583 148.626 198.537 150.592L218.053 170.111C223.928 175.986 223.928 185.495 218.053 191.37L190.37 219.056C184.495 224.932 174.988 224.932 169.113 219.056L149.597 199.538C147.643 197.584 144.474 197.584 142.508 199.538L99.8057 242.245C97.8516 244.2 97.8516 247.369 99.8057 249.336L108.699 258.231C110.653 260.185 113.823 260.185 115.789 258.231L122.954 251.065C124.908 249.11 128.077 249.11 130.044 251.065L140.679 261.701C142.633 263.655 142.633 266.825 140.679 268.791L122.879 286.593C117.004 292.469 107.497 292.469 101.622 286.593L101.635 286.568Z" fill="currentColor"/> 3 | </svg> ``` -------------------------------------------------------------------------------- /packages/tm-core/CHANGELOG.md: -------------------------------------------------------------------------------- ```markdown 1 | # Changelog 2 | 3 | ## null 4 | 5 | ## 0.26.1 6 | 7 | All notable changes to the @task-master/tm-core package will be documented in this file. 8 | 9 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 10 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 11 | 12 | ## [Unreleased] 13 | 14 | ### Added 15 | 16 | - Initial package structure and configuration 17 | - TypeScript support with strict mode 18 | - Dual ESM/CJS build system with tsup 19 | - Jest testing framework with TypeScript support 20 | - ESLint and Prettier for code quality 21 | - Modular architecture with barrel exports 22 | - Placeholder implementations for all modules 23 | - Comprehensive documentation and README 24 | 25 | ### Development Infrastructure 26 | 27 | - tsup configuration for dual format builds 28 | - Jest configuration with ESM support 29 | - ESLint configuration with TypeScript rules 30 | - Prettier configuration for consistent formatting 31 | - Complete package.json with all required fields 32 | - TypeScript configuration with strict settings 33 | - .gitignore for development files 34 | 35 | ### Package Structure 36 | 37 | - `src/types/` - TypeScript type definitions (placeholder) 38 | - `src/providers/` - AI provider implementations (placeholder) 39 | - `src/storage/` - Storage layer abstractions (placeholder) 40 | - `src/parser/` - Task parsing utilities (placeholder) 41 | - `src/utils/` - Common utility functions (placeholder) 42 | - `src/errors/` - Custom error classes (placeholder) 43 | - `tests/` - Test directories and setup 44 | 45 | ## [1.0.0] - TBD 46 | 47 | ### Planned Features 48 | 49 | - Complete TypeScript type system 50 | - AI provider implementations 51 | - Storage adapters 52 | - Task parsing capabilities 53 | - Comprehensive utility functions 54 | - Custom error handling 55 | - Full test coverage 56 | - Complete documentation 57 | 58 | --- 59 | 60 | ## Release Notes 61 | 62 | ### Version 1.0.0 (Coming Soon) 63 | 64 | This will be the first stable release of tm-core with complete implementations of all modules. Currently, all modules contain placeholder implementations to establish the package structure and enable development of dependent packages. 65 | 66 | ### Development Status 67 | 68 | - ✅ Package structure and configuration 69 | - ✅ Build and test infrastructure 70 | - ✅ Development tooling setup 71 | - 🚧 TypeScript types implementation (Task 116) 72 | - 🚧 AI provider system (Task 117) 73 | - 🚧 Storage layer (Task 118) 74 | - 🚧 Task parser (Task 119) 75 | - 🚧 Utility functions (Task 120) 76 | - 🚧 Error handling (Task 121) 77 | - 🚧 Configuration system (Task 122) 78 | - 🚧 Testing infrastructure (Task 123) 79 | - 🚧 Documentation (Task 124) 80 | - 🚧 Package finalization (Task 125) 81 | ``` -------------------------------------------------------------------------------- /tests/integration/profiles/vscode-init-functionality.test.js: -------------------------------------------------------------------------------- ```javascript 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { vscodeProfile } from '../../../src/profiles/vscode.js'; 4 | 5 | describe('VSCode Profile Initialization Functionality', () => { 6 | let vscodeProfileContent; 7 | 8 | beforeAll(() => { 9 | const vscodeJsPath = path.join( 10 | process.cwd(), 11 | 'src', 12 | 'profiles', 13 | 'vscode.js' 14 | ); 15 | vscodeProfileContent = fs.readFileSync(vscodeJsPath, 'utf8'); 16 | }); 17 | 18 | test('vscode.js uses factory pattern with correct configuration', () => { 19 | // Check for explicit, non-default values in the source file 20 | expect(vscodeProfileContent).toContain("name: 'vscode'"); 21 | expect(vscodeProfileContent).toContain("displayName: 'VS Code'"); 22 | expect(vscodeProfileContent).toContain("url: 'code.visualstudio.com'"); 23 | expect(vscodeProfileContent).toContain( 24 | "docsUrl: 'code.visualstudio.com/docs'" 25 | ); 26 | expect(vscodeProfileContent).toContain("rulesDir: '.github/instructions'"); // non-default 27 | expect(vscodeProfileContent).toContain('customReplacements'); // non-default 28 | 29 | // Check the final computed properties on the profile object 30 | expect(vscodeProfile.profileName).toBe('vscode'); 31 | expect(vscodeProfile.displayName).toBe('VS Code'); 32 | expect(vscodeProfile.profileDir).toBe('.vscode'); // default 33 | expect(vscodeProfile.rulesDir).toBe('.github/instructions'); // non-default 34 | expect(vscodeProfile.globalReplacements).toBeDefined(); // computed from customReplacements 35 | expect(Array.isArray(vscodeProfile.globalReplacements)).toBe(true); 36 | }); 37 | 38 | test('vscode.js configures .mdc to .instructions.md extension mapping', () => { 39 | // Check that the profile object has the correct file mapping behavior (vscode converts to .md) 40 | expect(vscodeProfile.fileMap['rules/cursor_rules.mdc']).toBe( 41 | 'vscode_rules.instructions.md' 42 | ); 43 | }); 44 | 45 | test('vscode.js uses standard tool mappings', () => { 46 | // Check that the profile uses default tool mappings (equivalent to COMMON_TOOL_MAPPINGS.STANDARD) 47 | // This verifies the architectural pattern: no custom toolMappings = standard tool names 48 | expect(vscodeProfileContent).not.toContain('toolMappings:'); 49 | expect(vscodeProfileContent).not.toContain('apply_diff'); 50 | expect(vscodeProfileContent).not.toContain('search_files'); 51 | 52 | // Verify the result: default mappings means tools keep their original names 53 | expect(vscodeProfile.conversionConfig.toolNames.edit_file).toBe( 54 | 'edit_file' 55 | ); 56 | expect(vscodeProfile.conversionConfig.toolNames.search).toBe('search'); 57 | }); 58 | }); 59 | ``` -------------------------------------------------------------------------------- /mcp-server/src/custom-sdk/errors.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * src/ai-providers/custom-sdk/mcp/errors.js 3 | * 4 | * Error handling utilities for MCP AI SDK provider. 5 | * Maps MCP errors to AI SDK compatible error types. 6 | */ 7 | 8 | /** 9 | * MCP-specific error class 10 | */ 11 | export class MCPError extends Error { 12 | constructor(message, options = {}) { 13 | super(message); 14 | this.name = 'MCPError'; 15 | this.code = options.code; 16 | this.cause = options.cause; 17 | this.mcpResponse = options.mcpResponse; 18 | } 19 | } 20 | 21 | /** 22 | * Session-related error 23 | */ 24 | export class MCPSessionError extends MCPError { 25 | constructor(message, options = {}) { 26 | super(message, options); 27 | this.name = 'MCPSessionError'; 28 | } 29 | } 30 | 31 | /** 32 | * Sampling-related error 33 | */ 34 | export class MCPSamplingError extends MCPError { 35 | constructor(message, options = {}) { 36 | super(message, options); 37 | this.name = 'MCPSamplingError'; 38 | } 39 | } 40 | 41 | /** 42 | * Map MCP errors to AI SDK compatible error types 43 | * @param {Error} error - Original error 44 | * @returns {Error} Mapped error 45 | */ 46 | export function mapMCPError(error) { 47 | // If already an MCP error, return as-is 48 | if (error instanceof MCPError) { 49 | return error; 50 | } 51 | 52 | const message = error.message || 'Unknown MCP error'; 53 | const originalError = error; 54 | 55 | // Map common error patterns 56 | if (message.includes('session') || message.includes('connection')) { 57 | return new MCPSessionError(message, { 58 | cause: originalError, 59 | code: 'SESSION_ERROR' 60 | }); 61 | } 62 | 63 | if (message.includes('sampling') || message.includes('timeout')) { 64 | return new MCPSamplingError(message, { 65 | cause: originalError, 66 | code: 'SAMPLING_ERROR' 67 | }); 68 | } 69 | 70 | if (message.includes('capabilities') || message.includes('not supported')) { 71 | return new MCPSessionError(message, { 72 | cause: originalError, 73 | code: 'CAPABILITY_ERROR' 74 | }); 75 | } 76 | 77 | // Default to generic MCP error 78 | return new MCPError(message, { 79 | cause: originalError, 80 | code: 'UNKNOWN_ERROR' 81 | }); 82 | } 83 | 84 | /** 85 | * Check if error is retryable 86 | * @param {Error} error - Error to check 87 | * @returns {boolean} True if error might be retryable 88 | */ 89 | export function isRetryableError(error) { 90 | if (error instanceof MCPSamplingError && error.code === 'SAMPLING_ERROR') { 91 | return true; 92 | } 93 | 94 | if (error instanceof MCPSessionError && error.code === 'SESSION_ERROR') { 95 | // Session errors are generally not retryable 96 | return false; 97 | } 98 | 99 | // Check for common retryable patterns 100 | const message = error.message?.toLowerCase() || ''; 101 | return ( 102 | message.includes('timeout') || 103 | message.includes('network') || 104 | message.includes('temporary') 105 | ); 106 | } 107 | ``` -------------------------------------------------------------------------------- /tests/unit/mcp-providers/mcp-provider.test.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * tests/unit/mcp-providers/mcp-provider.test.js 3 | * Unit tests for MCP provider 4 | */ 5 | 6 | import { jest } from '@jest/globals'; 7 | 8 | describe('MCPProvider', () => { 9 | let MCPProvider; 10 | let provider; 11 | 12 | beforeAll(async () => { 13 | // Dynamic import to avoid circular dependency issues 14 | const module = await import( 15 | '../../../mcp-server/src/providers/mcp-provider.js' 16 | ); 17 | MCPProvider = module.MCPProvider; 18 | }); 19 | 20 | beforeEach(() => { 21 | provider = new MCPProvider(); 22 | }); 23 | 24 | describe('constructor', () => { 25 | it('should initialize with correct name', () => { 26 | expect(provider.name).toBe('mcp'); 27 | }); 28 | 29 | it('should initialize with null session', () => { 30 | expect(provider.session).toBeNull(); 31 | }); 32 | }); 33 | 34 | describe('isRequiredApiKey', () => { 35 | it('should return false (no API key required)', () => { 36 | expect(provider.isRequiredApiKey()).toBe(false); 37 | }); 38 | }); 39 | 40 | describe('validateAuth', () => { 41 | it('should throw error when no session', () => { 42 | expect(() => provider.validateAuth({})).toThrow( 43 | 'MCP Provider requires active MCP session' 44 | ); 45 | }); 46 | 47 | it('should throw error when session lacks sampling capabilities', () => { 48 | provider.session = { 49 | clientCapabilities: {} 50 | }; 51 | 52 | expect(() => provider.validateAuth({})).toThrow( 53 | 'MCP session must have client sampling capabilities' 54 | ); 55 | }); 56 | 57 | it('should pass validation with valid session', () => { 58 | provider.session = { 59 | clientCapabilities: { 60 | sampling: true 61 | } 62 | }; 63 | 64 | expect(() => provider.validateAuth({})).not.toThrow(); 65 | }); 66 | }); 67 | 68 | describe('setSession', () => { 69 | it('should set session when provided', () => { 70 | const mockSession = { 71 | clientCapabilities: { sampling: true } 72 | }; 73 | 74 | provider.setSession(mockSession); 75 | expect(provider.session).toBe(mockSession); 76 | }); 77 | 78 | it('should handle null session gracefully', () => { 79 | provider.setSession(null); 80 | expect(provider.session).toBeNull(); 81 | }); 82 | }); 83 | 84 | describe('hasValidSession', () => { 85 | it('should return false when no session', () => { 86 | expect(provider.hasValidSession()).toBe(false); 87 | }); 88 | 89 | it('should return false when session lacks sampling capabilities', () => { 90 | provider.session = { 91 | clientCapabilities: {} 92 | }; 93 | 94 | expect(provider.hasValidSession()).toBe(false); 95 | }); 96 | 97 | it('should return true with valid session', () => { 98 | provider.session = { 99 | clientCapabilities: { 100 | sampling: true 101 | } 102 | }; 103 | 104 | expect(provider.hasValidSession()).toBe(true); 105 | }); 106 | }); 107 | }); 108 | ``` -------------------------------------------------------------------------------- /scripts/modules/task-manager/parse-prd/parse-prd-non-streaming.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * Non-streaming handler for PRD parsing 3 | */ 4 | 5 | import ora from 'ora'; 6 | import { generateObjectService } from '../../ai-services-unified.js'; 7 | import { LoggingConfig, prdResponseSchema } from './parse-prd-config.js'; 8 | import { estimateTokens } from './parse-prd-helpers.js'; 9 | 10 | /** 11 | * Handle non-streaming AI service call 12 | * @param {Object} config - Configuration object 13 | * @param {Object} prompts - System and user prompts 14 | * @returns {Promise<Object>} Generated tasks and telemetry 15 | */ 16 | export async function handleNonStreamingService(config, prompts) { 17 | const logger = new LoggingConfig(config.mcpLog, config.reportProgress); 18 | const { systemPrompt, userPrompt } = prompts; 19 | const estimatedInputTokens = estimateTokens(systemPrompt + userPrompt); 20 | 21 | // Initialize spinner for CLI 22 | let spinner = null; 23 | if (config.outputFormat === 'text' && !config.isMCP) { 24 | spinner = ora('Parsing PRD and generating tasks...\n').start(); 25 | } 26 | 27 | try { 28 | // Call AI service 29 | logger.report( 30 | `Calling AI service to generate tasks from PRD${config.research ? ' with research-backed analysis' : ''}...`, 31 | 'info' 32 | ); 33 | 34 | const aiServiceResponse = await generateObjectService({ 35 | role: config.research ? 'research' : 'main', 36 | session: config.session, 37 | projectRoot: config.projectRoot, 38 | schema: prdResponseSchema, 39 | objectName: 'tasks_data', 40 | systemPrompt, 41 | prompt: userPrompt, 42 | commandName: 'parse-prd', 43 | outputType: config.isMCP ? 'mcp' : 'cli' 44 | }); 45 | 46 | // Extract generated data 47 | let generatedData = null; 48 | if (aiServiceResponse?.mainResult) { 49 | if ( 50 | typeof aiServiceResponse.mainResult === 'object' && 51 | aiServiceResponse.mainResult !== null && 52 | 'tasks' in aiServiceResponse.mainResult 53 | ) { 54 | generatedData = aiServiceResponse.mainResult; 55 | } else if ( 56 | typeof aiServiceResponse.mainResult.object === 'object' && 57 | aiServiceResponse.mainResult.object !== null && 58 | 'tasks' in aiServiceResponse.mainResult.object 59 | ) { 60 | generatedData = aiServiceResponse.mainResult.object; 61 | } 62 | } 63 | 64 | if (!generatedData || !Array.isArray(generatedData.tasks)) { 65 | throw new Error( 66 | 'AI service returned unexpected data structure after validation.' 67 | ); 68 | } 69 | 70 | if (spinner) { 71 | spinner.succeed('Tasks generated successfully!'); 72 | } 73 | 74 | return { 75 | parsedTasks: generatedData.tasks, 76 | aiServiceResponse, 77 | estimatedInputTokens 78 | }; 79 | } catch (error) { 80 | if (spinner) { 81 | spinner.fail(`Error parsing PRD: ${error.message}`); 82 | } 83 | throw error; 84 | } 85 | } 86 | ``` -------------------------------------------------------------------------------- /.github/scripts/utils.mjs: -------------------------------------------------------------------------------- ``` 1 | #!/usr/bin/env node 2 | import { spawnSync } from 'node:child_process'; 3 | import { readFileSync } from 'node:fs'; 4 | import { join, dirname, resolve } from 'node:path'; 5 | 6 | // Find the root directory by looking for package.json with task-master-ai 7 | export function findRootDir(startDir) { 8 | let currentDir = resolve(startDir); 9 | while (currentDir !== '/') { 10 | const pkgPath = join(currentDir, 'package.json'); 11 | try { 12 | const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')); 13 | if (pkg.name === 'task-master-ai' || pkg.repository) { 14 | return currentDir; 15 | } 16 | } catch {} 17 | currentDir = dirname(currentDir); 18 | } 19 | throw new Error('Could not find root directory'); 20 | } 21 | 22 | // Run a command with proper error handling 23 | export function runCommand(command, args = [], options = {}) { 24 | console.log(`Running: ${command} ${args.join(' ')}`); 25 | const result = spawnSync(command, args, { 26 | encoding: 'utf8', 27 | stdio: 'inherit', 28 | ...options 29 | }); 30 | 31 | if (result.status !== 0) { 32 | console.error(`Command failed with exit code ${result.status}`); 33 | process.exit(result.status); 34 | } 35 | 36 | return result; 37 | } 38 | 39 | // Get package version from a package.json file 40 | export function getPackageVersion(packagePath) { 41 | try { 42 | const pkg = JSON.parse(readFileSync(packagePath, 'utf8')); 43 | return pkg.version; 44 | } catch (error) { 45 | console.error( 46 | `Failed to read package version from ${packagePath}:`, 47 | error.message 48 | ); 49 | process.exit(1); 50 | } 51 | } 52 | 53 | // Check if a git tag exists on remote 54 | export function tagExistsOnRemote(tag, remote = 'origin') { 55 | const result = spawnSync('git', ['ls-remote', remote, tag], { 56 | encoding: 'utf8' 57 | }); 58 | 59 | return result.status === 0 && result.stdout.trim() !== ''; 60 | } 61 | 62 | // Create and push a git tag if it doesn't exist 63 | export function createAndPushTag(tag, remote = 'origin') { 64 | // Check if tag already exists 65 | if (tagExistsOnRemote(tag, remote)) { 66 | console.log(`Tag ${tag} already exists on remote, skipping`); 67 | return false; 68 | } 69 | 70 | console.log(`Creating new tag: ${tag}`); 71 | 72 | // Create the tag locally 73 | const tagResult = spawnSync('git', ['tag', tag]); 74 | if (tagResult.status !== 0) { 75 | console.error('Failed to create tag:', tagResult.error || tagResult.stderr); 76 | process.exit(1); 77 | } 78 | 79 | // Push the tag to remote 80 | const pushResult = spawnSync('git', ['push', remote, tag]); 81 | if (pushResult.status !== 0) { 82 | console.error('Failed to push tag:', pushResult.error || pushResult.stderr); 83 | process.exit(1); 84 | } 85 | 86 | console.log(`✅ Successfully created and pushed tag: ${tag}`); 87 | return true; 88 | } 89 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/complexity-report/complexity-report.md: -------------------------------------------------------------------------------- ```markdown 1 | Display the task complexity analysis report. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | View the detailed complexity analysis generated by analyze-complexity command. 6 | 7 | ## Viewing Complexity Report 8 | 9 | Shows comprehensive task complexity analysis with actionable insights. 10 | 11 | ## Execution 12 | 13 | ```bash 14 | task-master complexity-report [--file=<path>] 15 | ``` 16 | 17 | ## Report Location 18 | 19 | Default: `.taskmaster/reports/complexity-analysis.md` 20 | Custom: Specify with --file parameter 21 | 22 | ## Report Contents 23 | 24 | ### 1. **Executive Summary** 25 | ``` 26 | Complexity Analysis Summary 27 | ━━━━━━━━━━━━━━━━━━━━━━━━ 28 | Analysis Date: 2024-01-15 29 | Tasks Analyzed: 32 30 | High Complexity: 5 (16%) 31 | Medium Complexity: 12 (37%) 32 | Low Complexity: 15 (47%) 33 | 34 | Critical Findings: 35 | - 5 tasks need immediate expansion 36 | - 3 tasks have high technical risk 37 | - 2 tasks block critical path 38 | ``` 39 | 40 | ### 2. **Detailed Task Analysis** 41 | For each complex task: 42 | - Complexity score breakdown 43 | - Contributing factors 44 | - Specific risks identified 45 | - Expansion recommendations 46 | - Similar completed tasks 47 | 48 | ### 3. **Risk Matrix** 49 | Visual representation: 50 | ``` 51 | Risk vs Complexity Matrix 52 | ━━━━━━━━━━━━━━━━━━━━━━━ 53 | High Risk | #5(9) #12(8) | #23(6) 54 | Med Risk | #34(7) | #45(5) #67(5) 55 | Low Risk | #78(8) | [15 tasks] 56 | | High Complex | Med Complex 57 | ``` 58 | 59 | ### 4. **Recommendations** 60 | 61 | **Immediate Actions:** 62 | 1. Expand task #5 - Critical path + high complexity 63 | 2. Expand task #12 - High risk + dependencies 64 | 3. Review task #34 - Consider splitting 65 | 66 | **Sprint Planning:** 67 | - Don't schedule multiple high-complexity tasks together 68 | - Ensure expertise available for complex tasks 69 | - Build in buffer time for unknowns 70 | 71 | ## Interactive Features 72 | 73 | When viewing report: 74 | 1. **Quick Actions** 75 | - Press 'e' to expand a task 76 | - Press 'd' for task details 77 | - Press 'r' to refresh analysis 78 | 79 | 2. **Filtering** 80 | - View by complexity level 81 | - Filter by risk factors 82 | - Show only actionable items 83 | 84 | 3. **Export Options** 85 | - Markdown format 86 | - CSV for spreadsheets 87 | - JSON for tools 88 | 89 | ## Report Intelligence 90 | 91 | - Compares with historical data 92 | - Shows complexity trends 93 | - Identifies patterns 94 | - Suggests process improvements 95 | 96 | ## Integration 97 | 98 | Use report for: 99 | - Sprint planning sessions 100 | - Resource allocation 101 | - Risk assessment 102 | - Team discussions 103 | - Client updates 104 | 105 | ## Example Usage 106 | 107 | ``` 108 | /project:tm/complexity-report 109 | → Opens latest analysis 110 | 111 | /project:tm/complexity-report --file=archived/2024-01-01.md 112 | → View historical analysis 113 | 114 | After viewing: 115 | /project:tm/expand 5 116 | → Expand high-complexity task 117 | ``` ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/complexity-report/complexity-report.md: -------------------------------------------------------------------------------- ```markdown 1 | Display the task complexity analysis report. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | View the detailed complexity analysis generated by analyze-complexity command. 6 | 7 | ## Viewing Complexity Report 8 | 9 | Shows comprehensive task complexity analysis with actionable insights. 10 | 11 | ## Execution 12 | 13 | ```bash 14 | task-master complexity-report [--file=<path>] 15 | ``` 16 | 17 | ## Report Location 18 | 19 | Default: `.taskmaster/reports/complexity-analysis.md` 20 | Custom: Specify with --file parameter 21 | 22 | ## Report Contents 23 | 24 | ### 1. **Executive Summary** 25 | ``` 26 | Complexity Analysis Summary 27 | ━━━━━━━━━━━━━━━━━━━━━━━━ 28 | Analysis Date: 2024-01-15 29 | Tasks Analyzed: 32 30 | High Complexity: 5 (16%) 31 | Medium Complexity: 12 (37%) 32 | Low Complexity: 15 (47%) 33 | 34 | Critical Findings: 35 | - 5 tasks need immediate expansion 36 | - 3 tasks have high technical risk 37 | - 2 tasks block critical path 38 | ``` 39 | 40 | ### 2. **Detailed Task Analysis** 41 | For each complex task: 42 | - Complexity score breakdown 43 | - Contributing factors 44 | - Specific risks identified 45 | - Expansion recommendations 46 | - Similar completed tasks 47 | 48 | ### 3. **Risk Matrix** 49 | Visual representation: 50 | ``` 51 | Risk vs Complexity Matrix 52 | ━━━━━━━━━━━━━━━━━━━━━━━ 53 | High Risk | #5(9) #12(8) | #23(6) 54 | Med Risk | #34(7) | #45(5) #67(5) 55 | Low Risk | #78(8) | [15 tasks] 56 | | High Complex | Med Complex 57 | ``` 58 | 59 | ### 4. **Recommendations** 60 | 61 | **Immediate Actions:** 62 | 1. Expand task #5 - Critical path + high complexity 63 | 2. Expand task #12 - High risk + dependencies 64 | 3. Review task #34 - Consider splitting 65 | 66 | **Sprint Planning:** 67 | - Don't schedule multiple high-complexity tasks together 68 | - Ensure expertise available for complex tasks 69 | - Build in buffer time for unknowns 70 | 71 | ## Interactive Features 72 | 73 | When viewing report: 74 | 1. **Quick Actions** 75 | - Press 'e' to expand a task 76 | - Press 'd' for task details 77 | - Press 'r' to refresh analysis 78 | 79 | 2. **Filtering** 80 | - View by complexity level 81 | - Filter by risk factors 82 | - Show only actionable items 83 | 84 | 3. **Export Options** 85 | - Markdown format 86 | - CSV for spreadsheets 87 | - JSON for tools 88 | 89 | ## Report Intelligence 90 | 91 | - Compares with historical data 92 | - Shows complexity trends 93 | - Identifies patterns 94 | - Suggests process improvements 95 | 96 | ## Integration 97 | 98 | Use report for: 99 | - Sprint planning sessions 100 | - Resource allocation 101 | - Risk assessment 102 | - Team discussions 103 | - Client updates 104 | 105 | ## Example Usage 106 | 107 | ``` 108 | /project:tm/complexity-report 109 | → Opens latest analysis 110 | 111 | /project:tm/complexity-report --file=archived/2024-01-01.md 112 | → View historical analysis 113 | 114 | After viewing: 115 | /project:tm/expand 5 116 | → Expand high-complexity task 117 | ``` ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/initialize-project.js: -------------------------------------------------------------------------------- ```javascript 1 | import { z } from 'zod'; 2 | import { 3 | createErrorResponse, 4 | handleApiResult, 5 | withNormalizedProjectRoot 6 | } from './utils.js'; 7 | import { initializeProjectDirect } from '../core/task-master-core.js'; 8 | import { RULE_PROFILES } from '../../../src/constants/profiles.js'; 9 | 10 | export function registerInitializeProjectTool(server) { 11 | server.addTool({ 12 | name: 'initialize_project', 13 | description: 14 | 'Initializes a new Task Master project structure by calling the core initialization logic. Creates necessary folders and configuration files for Task Master in the current directory.', 15 | parameters: z.object({ 16 | skipInstall: z 17 | .boolean() 18 | .optional() 19 | .default(false) 20 | .describe( 21 | 'Skip installing dependencies automatically. Never do this unless you are sure the project is already installed.' 22 | ), 23 | addAliases: z 24 | .boolean() 25 | .optional() 26 | .default(true) 27 | .describe('Add shell aliases (tm, taskmaster) to shell config file.'), 28 | initGit: z 29 | .boolean() 30 | .optional() 31 | .default(true) 32 | .describe('Initialize Git repository in project root.'), 33 | storeTasksInGit: z 34 | .boolean() 35 | .optional() 36 | .default(true) 37 | .describe('Store tasks in Git (tasks.json and tasks/ directory).'), 38 | yes: z 39 | .boolean() 40 | .optional() 41 | .default(true) 42 | .describe( 43 | 'Skip prompts and use default values. Always set to true for MCP tools.' 44 | ), 45 | projectRoot: z 46 | .string() 47 | .describe( 48 | 'The root directory for the project. ALWAYS SET THIS TO THE PROJECT ROOT DIRECTORY. IF NOT SET, THE TOOL WILL NOT WORK.' 49 | ), 50 | rules: z 51 | .array(z.enum(RULE_PROFILES)) 52 | .optional() 53 | .describe( 54 | `List of rule profiles to include at initialization. If omitted, defaults to Cursor profile only. Available options: ${RULE_PROFILES.join(', ')}` 55 | ) 56 | }), 57 | execute: withNormalizedProjectRoot(async (args, context) => { 58 | const { log } = context; 59 | const session = context.session; 60 | 61 | try { 62 | log.info( 63 | `Executing initialize_project tool with args: ${JSON.stringify(args)}` 64 | ); 65 | 66 | const result = await initializeProjectDirect(args, log, { session }); 67 | 68 | return handleApiResult( 69 | result, 70 | log, 71 | 'Initialization failed', 72 | undefined, 73 | args.projectRoot 74 | ); 75 | } catch (error) { 76 | const errorMessage = `Project initialization tool failed: ${error.message || 'Unknown error'}`; 77 | log.error(errorMessage, error); 78 | return createErrorResponse(errorMessage, { details: error.stack }); 79 | } 80 | }) 81 | }); 82 | } 83 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/update/update-single-task.md: -------------------------------------------------------------------------------- ```markdown 1 | Update a single specific task with new information. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Parse task ID and update details. 6 | 7 | ## Single Task Update 8 | 9 | Precisely update one task with AI assistance to maintain consistency. 10 | 11 | ## Argument Parsing 12 | 13 | Natural language updates: 14 | - "5: add caching requirement" 15 | - "update 5 to include error handling" 16 | - "task 5 needs rate limiting" 17 | - "5 change priority to high" 18 | 19 | ## Execution 20 | 21 | ```bash 22 | task-master update-task --id=<id> --prompt="<context>" 23 | ``` 24 | 25 | ## Update Types 26 | 27 | ### 1. **Content Updates** 28 | - Enhance description 29 | - Add requirements 30 | - Clarify details 31 | - Update acceptance criteria 32 | 33 | ### 2. **Metadata Updates** 34 | - Change priority 35 | - Adjust time estimates 36 | - Update complexity 37 | - Modify dependencies 38 | 39 | ### 3. **Strategic Updates** 40 | - Revise approach 41 | - Change test strategy 42 | - Update implementation notes 43 | - Adjust subtask needs 44 | 45 | ## AI-Powered Updates 46 | 47 | The AI: 48 | 1. **Understands Context** 49 | - Reads current task state 50 | - Identifies update intent 51 | - Maintains consistency 52 | - Preserves important info 53 | 54 | 2. **Applies Changes** 55 | - Updates relevant fields 56 | - Keeps style consistent 57 | - Adds without removing 58 | - Enhances clarity 59 | 60 | 3. **Validates Results** 61 | - Checks coherence 62 | - Verifies completeness 63 | - Maintains relationships 64 | - Suggests related updates 65 | 66 | ## Example Updates 67 | 68 | ``` 69 | /project:tm/update/single 5: add rate limiting 70 | → Updating Task #5: "Implement API endpoints" 71 | 72 | Current: Basic CRUD endpoints 73 | Adding: Rate limiting requirements 74 | 75 | Updated sections: 76 | ✓ Description: Added rate limiting mention 77 | ✓ Details: Added specific limits (100/min) 78 | ✓ Test Strategy: Added rate limit tests 79 | ✓ Complexity: Increased from 5 to 6 80 | ✓ Time Estimate: Increased by 2 hours 81 | 82 | Suggestion: Also update task #6 (API Gateway) for consistency? 83 | ``` 84 | 85 | ## Smart Features 86 | 87 | 1. **Incremental Updates** 88 | - Adds without overwriting 89 | - Preserves work history 90 | - Tracks what changed 91 | - Shows diff view 92 | 93 | 2. **Consistency Checks** 94 | - Related task alignment 95 | - Subtask compatibility 96 | - Dependency validity 97 | - Timeline impact 98 | 99 | 3. **Update History** 100 | - Timestamp changes 101 | - Track who/what updated 102 | - Reason for update 103 | - Previous versions 104 | 105 | ## Field-Specific Updates 106 | 107 | Quick syntax for specific fields: 108 | - "5 priority:high" → Update priority only 109 | - "5 add-time:4h" → Add to time estimate 110 | - "5 status:review" → Change status 111 | - "5 depends:3,4" → Add dependencies 112 | 113 | ## Post-Update 114 | 115 | - Show updated task 116 | - Highlight changes 117 | - Check related tasks 118 | - Update suggestions 119 | - Timeline adjustments ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/update/update-single-task.md: -------------------------------------------------------------------------------- ```markdown 1 | Update a single specific task with new information. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Parse task ID and update details. 6 | 7 | ## Single Task Update 8 | 9 | Precisely update one task with AI assistance to maintain consistency. 10 | 11 | ## Argument Parsing 12 | 13 | Natural language updates: 14 | - "5: add caching requirement" 15 | - "update 5 to include error handling" 16 | - "task 5 needs rate limiting" 17 | - "5 change priority to high" 18 | 19 | ## Execution 20 | 21 | ```bash 22 | task-master update-task --id=<id> --prompt="<context>" 23 | ``` 24 | 25 | ## Update Types 26 | 27 | ### 1. **Content Updates** 28 | - Enhance description 29 | - Add requirements 30 | - Clarify details 31 | - Update acceptance criteria 32 | 33 | ### 2. **Metadata Updates** 34 | - Change priority 35 | - Adjust time estimates 36 | - Update complexity 37 | - Modify dependencies 38 | 39 | ### 3. **Strategic Updates** 40 | - Revise approach 41 | - Change test strategy 42 | - Update implementation notes 43 | - Adjust subtask needs 44 | 45 | ## AI-Powered Updates 46 | 47 | The AI: 48 | 1. **Understands Context** 49 | - Reads current task state 50 | - Identifies update intent 51 | - Maintains consistency 52 | - Preserves important info 53 | 54 | 2. **Applies Changes** 55 | - Updates relevant fields 56 | - Keeps style consistent 57 | - Adds without removing 58 | - Enhances clarity 59 | 60 | 3. **Validates Results** 61 | - Checks coherence 62 | - Verifies completeness 63 | - Maintains relationships 64 | - Suggests related updates 65 | 66 | ## Example Updates 67 | 68 | ``` 69 | /project:tm/update/single 5: add rate limiting 70 | → Updating Task #5: "Implement API endpoints" 71 | 72 | Current: Basic CRUD endpoints 73 | Adding: Rate limiting requirements 74 | 75 | Updated sections: 76 | ✓ Description: Added rate limiting mention 77 | ✓ Details: Added specific limits (100/min) 78 | ✓ Test Strategy: Added rate limit tests 79 | ✓ Complexity: Increased from 5 to 6 80 | ✓ Time Estimate: Increased by 2 hours 81 | 82 | Suggestion: Also update task #6 (API Gateway) for consistency? 83 | ``` 84 | 85 | ## Smart Features 86 | 87 | 1. **Incremental Updates** 88 | - Adds without overwriting 89 | - Preserves work history 90 | - Tracks what changed 91 | - Shows diff view 92 | 93 | 2. **Consistency Checks** 94 | - Related task alignment 95 | - Subtask compatibility 96 | - Dependency validity 97 | - Timeline impact 98 | 99 | 3. **Update History** 100 | - Timestamp changes 101 | - Track who/what updated 102 | - Reason for update 103 | - Previous versions 104 | 105 | ## Field-Specific Updates 106 | 107 | Quick syntax for specific fields: 108 | - "5 priority:high" → Update priority only 109 | - "5 add-time:4h" → Add to time estimate 110 | - "5 status:review" → Change status 111 | - "5 depends:3,4" → Add dependencies 112 | 113 | ## Post-Update 114 | 115 | - Show updated task 116 | - Highlight changes 117 | - Check related tasks 118 | - Update suggestions 119 | - Timeline adjustments ``` -------------------------------------------------------------------------------- /tests/manual/progress/TESTING_GUIDE.md: -------------------------------------------------------------------------------- ```markdown 1 | # Task Master Progress Testing Guide 2 | 3 | Quick reference for testing streaming/non-streaming functionality with token tracking. 4 | 5 | ## 🎯 Test Modes 6 | 7 | 1. **MCP Streaming** - Has `reportProgress` + `mcpLog`, shows emoji indicators (🔴🟠🟢) 8 | 2. **CLI Streaming** - No `reportProgress`, shows terminal progress bars 9 | 3. **Non-Streaming** - No progress reporting, single response 10 | 11 | ## 🚀 Quick Commands 12 | 13 | ```bash 14 | # Test Scripts (accept: mcp-streaming, cli-streaming, non-streaming, both, all) 15 | node test-parse-prd.js [mode] 16 | node test-analyze-complexity.js [mode] 17 | node test-expand.js [mode] [num_subtasks] 18 | node test-expand-all.js [mode] [num_subtasks] 19 | node parse-prd-analysis.js [accuracy|complexity|all] 20 | 21 | # CLI Commands 22 | node scripts/dev.js parse-prd test.txt # Local dev (streaming) 23 | node scripts/dev.js analyze-complexity --research 24 | node scripts/dev.js expand --id=1 --force 25 | node scripts/dev.js expand --all --force 26 | 27 | task-master [command] # Global CLI (non-streaming) 28 | ``` 29 | 30 | ## ✅ Success Indicators 31 | 32 | ### Indicators 33 | - **Priority**: 🔴🔴🔴 (high), 🟠🟠⚪ (medium), 🟢⚪⚪ (low) 34 | - **Complexity**: ●●● (7-10), ●●○ (4-6), ●○○ (1-3) 35 | 36 | ### Token Format 37 | `Tokens (I/O): 2,150/1,847 ($0.0423)` (~4 chars per token) 38 | 39 | ### Progress Bars 40 | ``` 41 | Single: Generating subtasks... |████████░░| 80% (4/5) 42 | Dual: Expanding 3 tasks | Task 2/3 |████████░░| 66% 43 | Generating 5 subtasks... |██████░░░░| 60% 44 | ``` 45 | 46 | ### Fractional Progress 47 | `(completedTasks + currentSubtask/totalSubtasks) / totalTasks` 48 | Example: 33% → 46% → 60% → 66% → 80% → 93% → 100% 49 | 50 | ## 🐛 Quick Fixes 51 | 52 | | Issue | Fix | 53 | |-------|-----| 54 | | No streaming | Check `reportProgress` is passed | 55 | | NaN% progress | Filter duplicate `subtask_progress` events | 56 | | Missing tokens | Check `.env` has API keys | 57 | | Broken bars | Terminal width > 80 | 58 | | projectRoot.split | Use `projectRoot` not `session` | 59 | 60 | ```bash 61 | # Debug 62 | TASKMASTER_DEBUG=true node test-expand.js 63 | npm run lint 64 | ``` 65 | 66 | ## 📊 Benchmarks 67 | - Single task: 10-20s (5 subtasks) 68 | - Expand all: 30-45s (3 tasks) 69 | - Streaming: ~10-20% faster 70 | - Updates: Every 2-5s 71 | 72 | ## 🔄 Test Workflow 73 | 74 | ```bash 75 | # Quick check 76 | node test-parse-prd.js both && npm test 77 | 78 | # Full suite (before release) 79 | for test in parse-prd analyze-complexity expand expand-all; do 80 | node test-$test.js all 81 | done 82 | node parse-prd-analysis.js all 83 | npm test 84 | ``` 85 | 86 | ## 🎯 MCP Tool Example 87 | 88 | ```javascript 89 | { 90 | "tool": "parse_prd", 91 | "args": { 92 | "input": "prd.txt", 93 | "numTasks": "8", 94 | "force": true, 95 | "projectRoot": "/path/to/project" 96 | } 97 | } 98 | ``` -------------------------------------------------------------------------------- /src/ai-providers/grok-cli.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * grok-cli.js 3 | * AI provider implementation for Grok models using Grok CLI. 4 | */ 5 | 6 | import { createGrokCli } from './custom-sdk/grok-cli/index.js'; 7 | import { BaseAIProvider } from './base-provider.js'; 8 | import { getGrokCliSettingsForCommand } from '../../scripts/modules/config-manager.js'; 9 | 10 | export class GrokCliProvider extends BaseAIProvider { 11 | constructor() { 12 | super(); 13 | this.name = 'Grok CLI'; 14 | } 15 | 16 | /** 17 | * Returns the environment variable name required for this provider's API key. 18 | * @returns {string} The environment variable name for the Grok API key 19 | */ 20 | getRequiredApiKeyName() { 21 | return 'GROK_CLI_API_KEY'; 22 | } 23 | 24 | /** 25 | * Override to indicate that API key is optional since Grok CLI can be configured separately 26 | * @returns {boolean} False since Grok CLI can use its own config 27 | */ 28 | isRequiredApiKey() { 29 | return false; // Grok CLI can use its own config file 30 | } 31 | 32 | /** 33 | * Override validateAuth to be more flexible with API key validation 34 | * @param {object} params - Parameters to validate 35 | */ 36 | validateAuth(params) { 37 | // Grok CLI can work with: 38 | // 1. API key passed in params 39 | // 2. Environment variable GROK_CLI_API_KEY 40 | // 3. Grok CLI's own config file (~/.grok/user-settings.json) 41 | // So we don't enforce API key requirement here 42 | // Suppress unused parameter warning 43 | void params; 44 | } 45 | 46 | /** 47 | * Creates and returns a Grok CLI client instance. 48 | * @param {object} params - Parameters for client initialization 49 | * @param {string} [params.apiKey] - Grok CLI API key (optional if configured in CLI) 50 | * @param {string} [params.baseURL] - Optional custom API endpoint 51 | * @param {string} [params.workingDirectory] - Working directory for CLI commands 52 | * @param {number} [params.timeout] - Timeout for CLI commands in milliseconds 53 | * @param {string} [params.commandName] - Name of the command invoking the service 54 | * @returns {Function} Grok CLI client function 55 | * @throws {Error} If initialization fails 56 | */ 57 | getClient(params) { 58 | try { 59 | const { apiKey, baseURL, workingDirectory, timeout, commandName } = 60 | params; 61 | 62 | // Get Grok CLI settings from config 63 | const grokCliSettings = getGrokCliSettingsForCommand(commandName); 64 | 65 | return createGrokCli({ 66 | defaultSettings: { 67 | apiKey, 68 | baseURL, 69 | workingDirectory: 70 | workingDirectory || grokCliSettings.workingDirectory, 71 | timeout: timeout || grokCliSettings.timeout, 72 | defaultModel: grokCliSettings.defaultModel 73 | } 74 | }); 75 | } catch (error) { 76 | this.handleError('client initialization', error); 77 | } 78 | } 79 | } 80 | ``` -------------------------------------------------------------------------------- /tests/unit/profiles/zed-integration.test.js: -------------------------------------------------------------------------------- ```javascript 1 | import { jest } from '@jest/globals'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | import os from 'os'; 5 | 6 | // Mock external modules 7 | jest.mock('child_process', () => ({ 8 | execSync: jest.fn() 9 | })); 10 | 11 | // Mock console methods 12 | jest.mock('console', () => ({ 13 | log: jest.fn(), 14 | info: jest.fn(), 15 | warn: jest.fn(), 16 | error: jest.fn(), 17 | clear: jest.fn() 18 | })); 19 | 20 | describe('Zed Integration', () => { 21 | let tempDir; 22 | 23 | beforeEach(() => { 24 | jest.clearAllMocks(); 25 | 26 | // Create a temporary directory for testing 27 | tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'task-master-test-')); 28 | 29 | // Spy on fs methods 30 | jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); 31 | jest.spyOn(fs, 'readFileSync').mockImplementation((filePath) => { 32 | if (filePath.toString().includes('settings.json')) { 33 | return JSON.stringify({ context_servers: {} }, null, 2); 34 | } 35 | return '{}'; 36 | }); 37 | jest.spyOn(fs, 'existsSync').mockImplementation(() => false); 38 | jest.spyOn(fs, 'mkdirSync').mockImplementation(() => {}); 39 | }); 40 | 41 | afterEach(() => { 42 | // Clean up the temporary directory 43 | try { 44 | fs.rmSync(tempDir, { recursive: true, force: true }); 45 | } catch (err) { 46 | console.error(`Error cleaning up: ${err.message}`); 47 | } 48 | }); 49 | 50 | // Test function that simulates the createProjectStructure behavior for Zed files 51 | function mockCreateZedStructure() { 52 | // Create main .zed directory 53 | fs.mkdirSync(path.join(tempDir, '.zed'), { recursive: true }); 54 | 55 | // Create MCP config file (settings.json) 56 | fs.writeFileSync( 57 | path.join(tempDir, '.zed', 'settings.json'), 58 | JSON.stringify({ context_servers: {} }, null, 2) 59 | ); 60 | 61 | // Create AGENTS.md in project root 62 | fs.writeFileSync( 63 | path.join(tempDir, 'AGENTS.md'), 64 | '# Task Master Instructions\n\nThis is the Task Master agents file.' 65 | ); 66 | } 67 | 68 | test('creates all required .zed directories', () => { 69 | // Act 70 | mockCreateZedStructure(); 71 | 72 | // Assert 73 | expect(fs.mkdirSync).toHaveBeenCalledWith(path.join(tempDir, '.zed'), { 74 | recursive: true 75 | }); 76 | }); 77 | 78 | test('creates Zed settings.json with context_servers format', () => { 79 | // Act 80 | mockCreateZedStructure(); 81 | 82 | // Assert 83 | expect(fs.writeFileSync).toHaveBeenCalledWith( 84 | path.join(tempDir, '.zed', 'settings.json'), 85 | JSON.stringify({ context_servers: {} }, null, 2) 86 | ); 87 | }); 88 | 89 | test('creates AGENTS.md in project root', () => { 90 | // Act 91 | mockCreateZedStructure(); 92 | 93 | // Assert 94 | expect(fs.writeFileSync).toHaveBeenCalledWith( 95 | path.join(tempDir, 'AGENTS.md'), 96 | '# Task Master Instructions\n\nThis is the Task Master agents file.' 97 | ); 98 | }); 99 | }); 100 | ``` -------------------------------------------------------------------------------- /apps/extension/src/services/sidebar-webview-manager.ts: -------------------------------------------------------------------------------- ```typescript 1 | import * as vscode from 'vscode'; 2 | import type { TaskMasterApi } from '../utils/task-master-api'; 3 | 4 | export class SidebarWebviewManager implements vscode.WebviewViewProvider { 5 | private webviewView?: vscode.WebviewView; 6 | private api?: TaskMasterApi; 7 | 8 | constructor(private readonly extensionUri: vscode.Uri) {} 9 | 10 | setApi(api: TaskMasterApi): void { 11 | this.api = api; 12 | // Update connection status if webview exists 13 | if (this.webviewView) { 14 | this.updateConnectionStatus(); 15 | } 16 | } 17 | 18 | resolveWebviewView( 19 | webviewView: vscode.WebviewView, 20 | context: vscode.WebviewViewResolveContext, 21 | token: vscode.CancellationToken 22 | ): void { 23 | this.webviewView = webviewView; 24 | 25 | webviewView.webview.options = { 26 | enableScripts: true, 27 | localResourceRoots: [ 28 | vscode.Uri.joinPath(this.extensionUri, 'dist'), 29 | vscode.Uri.joinPath(this.extensionUri, 'assets') 30 | ] 31 | }; 32 | 33 | webviewView.webview.html = this.getHtmlContent(webviewView.webview); 34 | 35 | // Handle messages from the webview 36 | webviewView.webview.onDidReceiveMessage((message) => { 37 | if (message.command === 'openBoard') { 38 | vscode.commands.executeCommand('tm.showKanbanBoard'); 39 | } 40 | }); 41 | 42 | // Update connection status on load 43 | this.updateConnectionStatus(); 44 | } 45 | 46 | updateConnectionStatus(): void { 47 | if (!this.webviewView || !this.api) return; 48 | 49 | const status = this.api.getConnectionStatus(); 50 | this.webviewView.webview.postMessage({ 51 | type: 'connectionStatus', 52 | data: status 53 | }); 54 | } 55 | 56 | private getHtmlContent(webview: vscode.Webview): string { 57 | const scriptUri = webview.asWebviewUri( 58 | vscode.Uri.joinPath(this.extensionUri, 'dist', 'sidebar.js') 59 | ); 60 | const styleUri = webview.asWebviewUri( 61 | vscode.Uri.joinPath(this.extensionUri, 'dist', 'index.css') 62 | ); 63 | const nonce = this.getNonce(); 64 | 65 | return `<!DOCTYPE html> 66 | <html lang="en"> 67 | <head> 68 | <meta charset="UTF-8"> 69 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> 70 | <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${webview.cspSource} https:; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';"> 71 | <link href="${styleUri}" rel="stylesheet"> 72 | <title>TaskMaster</title> 73 | </head> 74 | <body> 75 | <div id="root"></div> 76 | <script nonce="${nonce}" src="${scriptUri}"></script> 77 | </body> 78 | </html>`; 79 | } 80 | 81 | private getNonce(): string { 82 | let text = ''; 83 | const possible = 84 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 85 | for (let i = 0; i < 32; i++) { 86 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 87 | } 88 | return text; 89 | } 90 | } 91 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/setup/install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown 1 | Check if Task Master is installed and install it if needed. 2 | 3 | This command helps you get Task Master set up globally on your system. 4 | 5 | ## Detection and Installation Process 6 | 7 | 1. **Check Current Installation** 8 | ```bash 9 | # Check if task-master command exists 10 | which task-master || echo "Task Master not found" 11 | 12 | # Check npm global packages 13 | npm list -g task-master-ai 14 | ``` 15 | 16 | 2. **System Requirements Check** 17 | ```bash 18 | # Verify Node.js is installed 19 | node --version 20 | 21 | # Verify npm is installed 22 | npm --version 23 | 24 | # Check Node version (need 16+) 25 | ``` 26 | 27 | 3. **Install Task Master Globally** 28 | If not installed, run: 29 | ```bash 30 | npm install -g task-master-ai 31 | ``` 32 | 33 | 4. **Verify Installation** 34 | ```bash 35 | # Check version 36 | task-master --version 37 | 38 | # Verify command is available 39 | which task-master 40 | ``` 41 | 42 | 5. **Initial Setup** 43 | ```bash 44 | # Initialize in current directory 45 | task-master init 46 | ``` 47 | 48 | 6. **Configure AI Provider** 49 | Ensure you have at least one AI provider API key set: 50 | ```bash 51 | # Check current configuration 52 | task-master models --status 53 | 54 | # If no API keys found, guide setup 55 | echo "You'll need at least one API key:" 56 | echo "- ANTHROPIC_API_KEY for Claude" 57 | echo "- OPENAI_API_KEY for GPT models" 58 | echo "- PERPLEXITY_API_KEY for research" 59 | echo "" 60 | echo "Set them in your shell profile or .env file" 61 | ``` 62 | 63 | 7. **Quick Test** 64 | ```bash 65 | # Create a test PRD 66 | echo "Build a simple hello world API" > test-prd.txt 67 | 68 | # Try parsing it 69 | task-master parse-prd test-prd.txt -n 3 70 | ``` 71 | 72 | ## Troubleshooting 73 | 74 | If installation fails: 75 | 76 | **Permission Errors:** 77 | ```bash 78 | # Try with sudo (macOS/Linux) 79 | sudo npm install -g task-master-ai 80 | 81 | # Or fix npm permissions 82 | npm config set prefix ~/.npm-global 83 | export PATH=~/.npm-global/bin:$PATH 84 | ``` 85 | 86 | **Network Issues:** 87 | ```bash 88 | # Use different registry 89 | npm install -g task-master-ai --registry https://registry.npmjs.org/ 90 | ``` 91 | 92 | **Node Version Issues:** 93 | ```bash 94 | # Install Node 18+ via nvm 95 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 96 | nvm install 18 97 | nvm use 18 98 | ``` 99 | 100 | ## Success Confirmation 101 | 102 | Once installed, you should see: 103 | ``` 104 | ✅ Task Master v0.16.2 (or higher) installed 105 | ✅ Command 'task-master' available globally 106 | ✅ AI provider configured 107 | ✅ Ready to use slash commands! 108 | 109 | Try: /project:task-master:init your-prd.md 110 | ``` 111 | 112 | ## Next Steps 113 | 114 | After installation: 115 | 1. Run `/project:utils:check-health` to verify setup 116 | 2. Configure AI providers with `/project:task-master:models` 117 | 3. Start using Task Master commands! ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/setup/install-taskmaster.md: -------------------------------------------------------------------------------- ```markdown 1 | Check if Task Master is installed and install it if needed. 2 | 3 | This command helps you get Task Master set up globally on your system. 4 | 5 | ## Detection and Installation Process 6 | 7 | 1. **Check Current Installation** 8 | ```bash 9 | # Check if task-master command exists 10 | which task-master || echo "Task Master not found" 11 | 12 | # Check npm global packages 13 | npm list -g task-master-ai 14 | ``` 15 | 16 | 2. **System Requirements Check** 17 | ```bash 18 | # Verify Node.js is installed 19 | node --version 20 | 21 | # Verify npm is installed 22 | npm --version 23 | 24 | # Check Node version (need 16+) 25 | ``` 26 | 27 | 3. **Install Task Master Globally** 28 | If not installed, run: 29 | ```bash 30 | npm install -g task-master-ai 31 | ``` 32 | 33 | 4. **Verify Installation** 34 | ```bash 35 | # Check version 36 | task-master --version 37 | 38 | # Verify command is available 39 | which task-master 40 | ``` 41 | 42 | 5. **Initial Setup** 43 | ```bash 44 | # Initialize in current directory 45 | task-master init 46 | ``` 47 | 48 | 6. **Configure AI Provider** 49 | Ensure you have at least one AI provider API key set: 50 | ```bash 51 | # Check current configuration 52 | task-master models --status 53 | 54 | # If no API keys found, guide setup 55 | echo "You'll need at least one API key:" 56 | echo "- ANTHROPIC_API_KEY for Claude" 57 | echo "- OPENAI_API_KEY for GPT models" 58 | echo "- PERPLEXITY_API_KEY for research" 59 | echo "" 60 | echo "Set them in your shell profile or .env file" 61 | ``` 62 | 63 | 7. **Quick Test** 64 | ```bash 65 | # Create a test PRD 66 | echo "Build a simple hello world API" > test-prd.txt 67 | 68 | # Try parsing it 69 | task-master parse-prd test-prd.txt -n 3 70 | ``` 71 | 72 | ## Troubleshooting 73 | 74 | If installation fails: 75 | 76 | **Permission Errors:** 77 | ```bash 78 | # Try with sudo (macOS/Linux) 79 | sudo npm install -g task-master-ai 80 | 81 | # Or fix npm permissions 82 | npm config set prefix ~/.npm-global 83 | export PATH=~/.npm-global/bin:$PATH 84 | ``` 85 | 86 | **Network Issues:** 87 | ```bash 88 | # Use different registry 89 | npm install -g task-master-ai --registry https://registry.npmjs.org/ 90 | ``` 91 | 92 | **Node Version Issues:** 93 | ```bash 94 | # Install Node 18+ via nvm 95 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 96 | nvm install 18 97 | nvm use 18 98 | ``` 99 | 100 | ## Success Confirmation 101 | 102 | Once installed, you should see: 103 | ``` 104 | ✅ Task Master v0.16.2 (or higher) installed 105 | ✅ Command 'task-master' available globally 106 | ✅ AI provider configured 107 | ✅ Ready to use slash commands! 108 | 109 | Try: /project:task-master:init your-prd.md 110 | ``` 111 | 112 | ## Next Steps 113 | 114 | After installation: 115 | 1. Run `/project:utils:check-health` to verify setup 116 | 2. Configure AI providers with `/project:task-master:models` 117 | 3. Start using Task Master commands! ``` -------------------------------------------------------------------------------- /apps/extension/src/utils/task-master-api/mcp-client.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * MCP Client Wrapper 3 | * Handles MCP tool calls with retry logic 4 | */ 5 | 6 | import type { ExtensionLogger } from '../logger'; 7 | import type { MCPClientManager } from '../mcpClient'; 8 | 9 | export class MCPClient { 10 | constructor( 11 | private mcpClient: MCPClientManager, 12 | private logger: ExtensionLogger, 13 | private config: { timeout: number; retryAttempts: number } 14 | ) {} 15 | 16 | /** 17 | * Call MCP tool with retry logic 18 | */ 19 | async callTool( 20 | toolName: string, 21 | args: Record<string, unknown> 22 | ): Promise<any> { 23 | let lastError: Error | null = null; 24 | 25 | for (let attempt = 1; attempt <= this.config.retryAttempts; attempt++) { 26 | try { 27 | const rawResponse = await this.mcpClient.callTool(toolName, args); 28 | this.logger.debug( 29 | `Raw MCP response for ${toolName}:`, 30 | JSON.stringify(rawResponse, null, 2) 31 | ); 32 | 33 | // Parse MCP response format 34 | if ( 35 | rawResponse && 36 | rawResponse.content && 37 | Array.isArray(rawResponse.content) && 38 | rawResponse.content[0] 39 | ) { 40 | const contentItem = rawResponse.content[0]; 41 | if (contentItem.type === 'text' && contentItem.text) { 42 | try { 43 | const parsedData = JSON.parse(contentItem.text); 44 | this.logger.debug(`Parsed MCP data for ${toolName}:`, parsedData); 45 | return parsedData; 46 | } catch (parseError) { 47 | this.logger.error( 48 | `Failed to parse MCP response text for ${toolName}:`, 49 | parseError 50 | ); 51 | this.logger.error(`Raw text was:`, contentItem.text); 52 | return rawResponse; // Fall back to original response 53 | } 54 | } 55 | } 56 | 57 | // If not in expected format, return as-is 58 | this.logger.warn( 59 | `Unexpected MCP response format for ${toolName}, returning raw response` 60 | ); 61 | return rawResponse; 62 | } catch (error) { 63 | lastError = error instanceof Error ? error : new Error('Unknown error'); 64 | this.logger.warn( 65 | `Attempt ${attempt}/${this.config.retryAttempts} failed for ${toolName}:`, 66 | lastError.message 67 | ); 68 | 69 | if (attempt < this.config.retryAttempts) { 70 | // Exponential backoff 71 | const delay = Math.min(1000 * 2 ** (attempt - 1), 5000); 72 | await new Promise((resolve) => setTimeout(resolve, delay)); 73 | } 74 | } 75 | } 76 | 77 | throw ( 78 | lastError || 79 | new Error( 80 | `Failed to call ${toolName} after ${this.config.retryAttempts} attempts` 81 | ) 82 | ); 83 | } 84 | 85 | /** 86 | * Get connection status 87 | */ 88 | getStatus(): { isRunning: boolean; error?: string } { 89 | return this.mcpClient.getStatus(); 90 | } 91 | 92 | /** 93 | * Test connection 94 | */ 95 | async testConnection(): Promise<boolean> { 96 | return this.mcpClient.testConnection(); 97 | } 98 | } 99 | ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/add-tag.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * tools/add-tag.js 3 | * Tool to create a new tag 4 | */ 5 | 6 | import { z } from 'zod'; 7 | import { 8 | createErrorResponse, 9 | handleApiResult, 10 | withNormalizedProjectRoot 11 | } from './utils.js'; 12 | import { addTagDirect } from '../core/task-master-core.js'; 13 | import { findTasksPath } from '../core/utils/path-utils.js'; 14 | 15 | /** 16 | * Register the addTag tool with the MCP server 17 | * @param {Object} server - FastMCP server instance 18 | */ 19 | export function registerAddTagTool(server) { 20 | server.addTool({ 21 | name: 'add_tag', 22 | description: 'Create a new tag for organizing tasks in different contexts', 23 | parameters: z.object({ 24 | name: z.string().describe('Name of the new tag to create'), 25 | copyFromCurrent: z 26 | .boolean() 27 | .optional() 28 | .describe( 29 | 'Whether to copy tasks from the current tag (default: false)' 30 | ), 31 | copyFromTag: z 32 | .string() 33 | .optional() 34 | .describe('Specific tag to copy tasks from'), 35 | fromBranch: z 36 | .boolean() 37 | .optional() 38 | .describe( 39 | 'Create tag name from current git branch (ignores name parameter)' 40 | ), 41 | description: z 42 | .string() 43 | .optional() 44 | .describe('Optional description for the tag'), 45 | file: z 46 | .string() 47 | .optional() 48 | .describe('Path to the tasks file (default: tasks/tasks.json)'), 49 | projectRoot: z 50 | .string() 51 | .describe('The directory of the project. Must be an absolute path.') 52 | }), 53 | execute: withNormalizedProjectRoot(async (args, { log, session }) => { 54 | try { 55 | log.info(`Starting add-tag with args: ${JSON.stringify(args)}`); 56 | 57 | // Use args.projectRoot directly (guaranteed by withNormalizedProjectRoot) 58 | let tasksJsonPath; 59 | try { 60 | tasksJsonPath = findTasksPath( 61 | { projectRoot: args.projectRoot, file: args.file }, 62 | log 63 | ); 64 | } catch (error) { 65 | log.error(`Error finding tasks.json: ${error.message}`); 66 | return createErrorResponse( 67 | `Failed to find tasks.json: ${error.message}` 68 | ); 69 | } 70 | 71 | // Call the direct function 72 | const result = await addTagDirect( 73 | { 74 | tasksJsonPath: tasksJsonPath, 75 | name: args.name, 76 | copyFromCurrent: args.copyFromCurrent, 77 | copyFromTag: args.copyFromTag, 78 | fromBranch: args.fromBranch, 79 | description: args.description, 80 | projectRoot: args.projectRoot 81 | }, 82 | log, 83 | { session } 84 | ); 85 | 86 | return handleApiResult( 87 | result, 88 | log, 89 | 'Error creating tag', 90 | undefined, 91 | args.projectRoot 92 | ); 93 | } catch (error) { 94 | log.error(`Error in add-tag tool: ${error.message}`); 95 | return createErrorResponse(error.message); 96 | } 97 | }) 98 | }); 99 | } 100 | ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/remove-dependency.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * tools/remove-dependency.js 3 | * Tool for removing a dependency from a task 4 | */ 5 | 6 | import { z } from 'zod'; 7 | import { 8 | handleApiResult, 9 | createErrorResponse, 10 | withNormalizedProjectRoot 11 | } from './utils.js'; 12 | import { removeDependencyDirect } from '../core/task-master-core.js'; 13 | import { findTasksPath } from '../core/utils/path-utils.js'; 14 | import { resolveTag } from '../../../scripts/modules/utils.js'; 15 | 16 | /** 17 | * Register the removeDependency tool with the MCP server 18 | * @param {Object} server - FastMCP server instance 19 | */ 20 | export function registerRemoveDependencyTool(server) { 21 | server.addTool({ 22 | name: 'remove_dependency', 23 | description: 'Remove a dependency from a task', 24 | parameters: z.object({ 25 | id: z.string().describe('Task ID to remove dependency from'), 26 | dependsOn: z.string().describe('Task ID to remove as a dependency'), 27 | file: z 28 | .string() 29 | .optional() 30 | .describe( 31 | 'Absolute path to the tasks file (default: tasks/tasks.json)' 32 | ), 33 | projectRoot: z 34 | .string() 35 | .describe('The directory of the project. Must be an absolute path.'), 36 | tag: z.string().optional().describe('Tag context to operate on') 37 | }), 38 | execute: withNormalizedProjectRoot(async (args, { log, session }) => { 39 | try { 40 | const resolvedTag = resolveTag({ 41 | projectRoot: args.projectRoot, 42 | tag: args.tag 43 | }); 44 | log.info( 45 | `Removing dependency for task ${args.id} from ${args.dependsOn} with args: ${JSON.stringify(args)}` 46 | ); 47 | 48 | // Use args.projectRoot directly (guaranteed by withNormalizedProjectRoot) 49 | let tasksJsonPath; 50 | try { 51 | tasksJsonPath = findTasksPath( 52 | { projectRoot: args.projectRoot, file: args.file }, 53 | log 54 | ); 55 | } catch (error) { 56 | log.error(`Error finding tasks.json: ${error.message}`); 57 | return createErrorResponse( 58 | `Failed to find tasks.json: ${error.message}` 59 | ); 60 | } 61 | 62 | const result = await removeDependencyDirect( 63 | { 64 | tasksJsonPath: tasksJsonPath, 65 | id: args.id, 66 | dependsOn: args.dependsOn, 67 | projectRoot: args.projectRoot, 68 | tag: resolvedTag 69 | }, 70 | log 71 | ); 72 | 73 | if (result.success) { 74 | log.info(`Successfully removed dependency: ${result.data.message}`); 75 | } else { 76 | log.error(`Failed to remove dependency: ${result.error.message}`); 77 | } 78 | 79 | return handleApiResult( 80 | result, 81 | log, 82 | 'Error removing dependency', 83 | undefined, 84 | args.projectRoot 85 | ); 86 | } catch (error) { 87 | log.error(`Error in removeDependency tool: ${error.message}`); 88 | return createErrorResponse(error.message); 89 | } 90 | }) 91 | }); 92 | } 93 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/help.md: -------------------------------------------------------------------------------- ```markdown 1 | Show help for Task Master commands. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Display help for Task Master commands. If arguments provided, show specific command help. 6 | 7 | ## Task Master Command Help 8 | 9 | ### Quick Navigation 10 | 11 | Type `/project:tm/` and use tab completion to explore all commands. 12 | 13 | ### Command Categories 14 | 15 | #### 🚀 Setup & Installation 16 | - `/project:tm/setup/install` - Comprehensive installation guide 17 | - `/project:tm/setup/quick-install` - One-line global install 18 | 19 | #### 📋 Project Setup 20 | - `/project:tm/init` - Initialize new project 21 | - `/project:tm/init/quick` - Quick setup with auto-confirm 22 | - `/project:tm/models` - View AI configuration 23 | - `/project:tm/models/setup` - Configure AI providers 24 | 25 | #### 🎯 Task Generation 26 | - `/project:tm/parse-prd` - Generate tasks from PRD 27 | - `/project:tm/parse-prd/with-research` - Enhanced parsing 28 | - `/project:tm/generate` - Create task files 29 | 30 | #### 📝 Task Management 31 | - `/project:tm/list` - List tasks (natural language filters) 32 | - `/project:tm/show <id>` - Display task details 33 | - `/project:tm/add-task` - Create new task 34 | - `/project:tm/update` - Update tasks naturally 35 | - `/project:tm/next` - Get next task recommendation 36 | 37 | #### 🔄 Status Management 38 | - `/project:tm/set-status/to-pending <id>` 39 | - `/project:tm/set-status/to-in-progress <id>` 40 | - `/project:tm/set-status/to-done <id>` 41 | - `/project:tm/set-status/to-review <id>` 42 | - `/project:tm/set-status/to-deferred <id>` 43 | - `/project:tm/set-status/to-cancelled <id>` 44 | 45 | #### 🔍 Analysis & Breakdown 46 | - `/project:tm/analyze-complexity` - Analyze task complexity 47 | - `/project:tm/expand <id>` - Break down complex task 48 | - `/project:tm/expand/all` - Expand all eligible tasks 49 | 50 | #### 🔗 Dependencies 51 | - `/project:tm/add-dependency` - Add task dependency 52 | - `/project:tm/remove-dependency` - Remove dependency 53 | - `/project:tm/validate-dependencies` - Check for issues 54 | 55 | #### 🤖 Workflows 56 | - `/project:tm/workflows/smart-flow` - Intelligent workflows 57 | - `/project:tm/workflows/pipeline` - Command chaining 58 | - `/project:tm/workflows/auto-implement` - Auto-implementation 59 | 60 | #### 📊 Utilities 61 | - `/project:tm/utils/analyze` - Project analysis 62 | - `/project:tm/status` - Project dashboard 63 | - `/project:tm/learn` - Interactive learning 64 | 65 | ### Natural Language Examples 66 | 67 | ``` 68 | /project:tm/list pending high priority 69 | /project:tm/update mark all API tasks as done 70 | /project:tm/add-task create login system with OAuth 71 | /project:tm/show current 72 | ``` 73 | 74 | ### Getting Started 75 | 76 | 1. Install: `/project:tm/setup/quick-install` 77 | 2. Initialize: `/project:tm/init/quick` 78 | 3. Learn: `/project:tm/learn start` 79 | 4. Work: `/project:tm/workflows/smart-flow` 80 | 81 | For detailed command info: `/project:tm/help <command-name>` ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/help.md: -------------------------------------------------------------------------------- ```markdown 1 | Show help for Task Master commands. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | Display help for Task Master commands. If arguments provided, show specific command help. 6 | 7 | ## Task Master Command Help 8 | 9 | ### Quick Navigation 10 | 11 | Type `/project:tm/` and use tab completion to explore all commands. 12 | 13 | ### Command Categories 14 | 15 | #### 🚀 Setup & Installation 16 | - `/project:tm/setup/install` - Comprehensive installation guide 17 | - `/project:tm/setup/quick-install` - One-line global install 18 | 19 | #### 📋 Project Setup 20 | - `/project:tm/init` - Initialize new project 21 | - `/project:tm/init/quick` - Quick setup with auto-confirm 22 | - `/project:tm/models` - View AI configuration 23 | - `/project:tm/models/setup` - Configure AI providers 24 | 25 | #### 🎯 Task Generation 26 | - `/project:tm/parse-prd` - Generate tasks from PRD 27 | - `/project:tm/parse-prd/with-research` - Enhanced parsing 28 | - `/project:tm/generate` - Create task files 29 | 30 | #### 📝 Task Management 31 | - `/project:tm/list` - List tasks (natural language filters) 32 | - `/project:tm/show <id>` - Display task details 33 | - `/project:tm/add-task` - Create new task 34 | - `/project:tm/update` - Update tasks naturally 35 | - `/project:tm/next` - Get next task recommendation 36 | 37 | #### 🔄 Status Management 38 | - `/project:tm/set-status/to-pending <id>` 39 | - `/project:tm/set-status/to-in-progress <id>` 40 | - `/project:tm/set-status/to-done <id>` 41 | - `/project:tm/set-status/to-review <id>` 42 | - `/project:tm/set-status/to-deferred <id>` 43 | - `/project:tm/set-status/to-cancelled <id>` 44 | 45 | #### 🔍 Analysis & Breakdown 46 | - `/project:tm/analyze-complexity` - Analyze task complexity 47 | - `/project:tm/expand <id>` - Break down complex task 48 | - `/project:tm/expand/all` - Expand all eligible tasks 49 | 50 | #### 🔗 Dependencies 51 | - `/project:tm/add-dependency` - Add task dependency 52 | - `/project:tm/remove-dependency` - Remove dependency 53 | - `/project:tm/validate-dependencies` - Check for issues 54 | 55 | #### 🤖 Workflows 56 | - `/project:tm/workflows/smart-flow` - Intelligent workflows 57 | - `/project:tm/workflows/pipeline` - Command chaining 58 | - `/project:tm/workflows/auto-implement` - Auto-implementation 59 | 60 | #### 📊 Utilities 61 | - `/project:tm/utils/analyze` - Project analysis 62 | - `/project:tm/status` - Project dashboard 63 | - `/project:tm/learn` - Interactive learning 64 | 65 | ### Natural Language Examples 66 | 67 | ``` 68 | /project:tm/list pending high priority 69 | /project:tm/update mark all API tasks as done 70 | /project:tm/add-task create login system with OAuth 71 | /project:tm/show current 72 | ``` 73 | 74 | ### Getting Started 75 | 76 | 1. Install: `/project:tm/setup/quick-install` 77 | 2. Initialize: `/project:tm/init/quick` 78 | 3. Learn: `/project:tm/learn start` 79 | 4. Work: `/project:tm/workflows/smart-flow` 80 | 81 | For detailed command info: `/project:tm/help <command-name>` ``` -------------------------------------------------------------------------------- /tests/integration/profiles/claude-init-functionality.test.js: -------------------------------------------------------------------------------- ```javascript 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { claudeProfile } from '../../../src/profiles/claude.js'; 4 | 5 | describe('Claude Profile Initialization Functionality', () => { 6 | let claudeProfileContent; 7 | 8 | beforeAll(() => { 9 | const claudeJsPath = path.join( 10 | process.cwd(), 11 | 'src', 12 | 'profiles', 13 | 'claude.js' 14 | ); 15 | claudeProfileContent = fs.readFileSync(claudeJsPath, 'utf8'); 16 | }); 17 | 18 | test('claude.js has correct asset-only profile configuration', () => { 19 | // Check for explicit, non-default values in the source file 20 | expect(claudeProfileContent).toContain("name: 'claude'"); 21 | expect(claudeProfileContent).toContain("displayName: 'Claude Code'"); 22 | expect(claudeProfileContent).toContain("profileDir: '.'"); // non-default 23 | expect(claudeProfileContent).toContain("rulesDir: '.'"); // non-default 24 | expect(claudeProfileContent).toContain("mcpConfigName: '.mcp.json'"); // non-default 25 | expect(claudeProfileContent).toContain('includeDefaultRules: false'); // non-default 26 | expect(claudeProfileContent).toContain( 27 | "'AGENTS.md': '.taskmaster/CLAUDE.md'" 28 | ); 29 | 30 | // Check the final computed properties on the profile object 31 | expect(claudeProfile.profileName).toBe('claude'); 32 | expect(claudeProfile.displayName).toBe('Claude Code'); 33 | expect(claudeProfile.profileDir).toBe('.'); 34 | expect(claudeProfile.rulesDir).toBe('.'); 35 | expect(claudeProfile.mcpConfig).toBe(true); // default from base profile 36 | expect(claudeProfile.mcpConfigName).toBe('.mcp.json'); // explicitly set 37 | expect(claudeProfile.mcpConfigPath).toBe('.mcp.json'); // computed 38 | expect(claudeProfile.includeDefaultRules).toBe(false); 39 | expect(claudeProfile.fileMap['AGENTS.md']).toBe('.taskmaster/CLAUDE.md'); 40 | }); 41 | 42 | test('claude.js has lifecycle functions for file management', () => { 43 | expect(claudeProfileContent).toContain('function onAddRulesProfile'); 44 | expect(claudeProfileContent).toContain('function onRemoveRulesProfile'); 45 | expect(claudeProfileContent).toContain( 46 | 'function onPostConvertRulesProfile' 47 | ); 48 | }); 49 | 50 | test('claude.js handles .claude directory and .taskmaster/CLAUDE.md import in lifecycle functions', () => { 51 | expect(claudeProfileContent).toContain('.claude'); 52 | expect(claudeProfileContent).toContain('copyRecursiveSync'); 53 | expect(claudeProfileContent).toContain('.taskmaster/CLAUDE.md'); 54 | expect(claudeProfileContent).toContain('@./.taskmaster/CLAUDE.md'); 55 | }); 56 | 57 | test('claude.js has proper error handling in lifecycle functions', () => { 58 | expect(claudeProfileContent).toContain('try {'); 59 | expect(claudeProfileContent).toContain('} catch (err) {'); 60 | expect(claudeProfileContent).toContain("log('error'"); 61 | }); 62 | }); 63 | ``` -------------------------------------------------------------------------------- /mcp-server/src/tools/generate.js: -------------------------------------------------------------------------------- ```javascript 1 | /** 2 | * tools/generate.js 3 | * Tool to generate individual task files from tasks.json 4 | */ 5 | 6 | import { z } from 'zod'; 7 | import { 8 | handleApiResult, 9 | createErrorResponse, 10 | withNormalizedProjectRoot 11 | } from './utils.js'; 12 | import { generateTaskFilesDirect } from '../core/task-master-core.js'; 13 | import { findTasksPath } from '../core/utils/path-utils.js'; 14 | import { resolveTag } from '../../../scripts/modules/utils.js'; 15 | import path from 'path'; 16 | 17 | /** 18 | * Register the generate tool with the MCP server 19 | * @param {Object} server - FastMCP server instance 20 | */ 21 | export function registerGenerateTool(server) { 22 | server.addTool({ 23 | name: 'generate', 24 | description: 25 | 'Generates individual task files in tasks/ directory based on tasks.json', 26 | parameters: z.object({ 27 | file: z.string().optional().describe('Absolute path to the tasks file'), 28 | output: z 29 | .string() 30 | .optional() 31 | .describe('Output directory (default: same directory as tasks file)'), 32 | projectRoot: z 33 | .string() 34 | .describe('The directory of the project. Must be an absolute path.'), 35 | tag: z.string().optional().describe('Tag context to operate on') 36 | }), 37 | execute: withNormalizedProjectRoot(async (args, { log, session }) => { 38 | try { 39 | log.info(`Generating task files with args: ${JSON.stringify(args)}`); 40 | 41 | const resolvedTag = resolveTag({ 42 | projectRoot: args.projectRoot, 43 | tag: args.tag 44 | }); 45 | // Use args.projectRoot directly (guaranteed by withNormalizedProjectRoot) 46 | let tasksJsonPath; 47 | try { 48 | tasksJsonPath = findTasksPath( 49 | { projectRoot: args.projectRoot, file: args.file }, 50 | log 51 | ); 52 | } catch (error) { 53 | log.error(`Error finding tasks.json: ${error.message}`); 54 | return createErrorResponse( 55 | `Failed to find tasks.json: ${error.message}` 56 | ); 57 | } 58 | 59 | const outputDir = args.output 60 | ? path.resolve(args.projectRoot, args.output) 61 | : path.dirname(tasksJsonPath); 62 | 63 | const result = await generateTaskFilesDirect( 64 | { 65 | tasksJsonPath: tasksJsonPath, 66 | outputDir: outputDir, 67 | projectRoot: args.projectRoot, 68 | tag: resolvedTag 69 | }, 70 | log, 71 | { session } 72 | ); 73 | 74 | if (result.success) { 75 | log.info(`Successfully generated task files: ${result.data.message}`); 76 | } else { 77 | log.error( 78 | `Failed to generate task files: ${result.error?.message || 'Unknown error'}` 79 | ); 80 | } 81 | 82 | return handleApiResult( 83 | result, 84 | log, 85 | 'Error generating task files', 86 | undefined, 87 | args.projectRoot 88 | ); 89 | } catch (error) { 90 | log.error(`Error in generate tool: ${error.message}`); 91 | return createErrorResponse(error.message); 92 | } 93 | }) 94 | }); 95 | } 96 | ``` -------------------------------------------------------------------------------- /.claude/commands/tm/learn.md: -------------------------------------------------------------------------------- ```markdown 1 | Learn about Task Master capabilities through interactive exploration. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | ## Interactive Task Master Learning 6 | 7 | Based on your input, I'll help you discover capabilities: 8 | 9 | ### 1. **What are you trying to do?** 10 | 11 | If $ARGUMENTS contains: 12 | - "start" / "begin" → Show project initialization workflows 13 | - "manage" / "organize" → Show task management commands 14 | - "automate" / "auto" → Show automation workflows 15 | - "analyze" / "report" → Show analysis tools 16 | - "fix" / "problem" → Show troubleshooting commands 17 | - "fast" / "quick" → Show efficiency shortcuts 18 | 19 | ### 2. **Intelligent Suggestions** 20 | 21 | Based on your project state: 22 | 23 | **No tasks yet?** 24 | ``` 25 | You'll want to start with: 26 | 1. /project:task-master:init <prd-file> 27 | → Creates tasks from requirements 28 | 29 | 2. /project:task-master:parse-prd <file> 30 | → Alternative task generation 31 | 32 | Try: /project:task-master:init demo-prd.md 33 | ``` 34 | 35 | **Have tasks?** 36 | Let me analyze what you might need... 37 | - Many pending tasks? → Learn sprint planning 38 | - Complex tasks? → Learn task expansion 39 | - Daily work? → Learn workflow automation 40 | 41 | ### 3. **Command Discovery** 42 | 43 | **By Category:** 44 | - 📋 Task Management: list, show, add, update, complete 45 | - 🔄 Workflows: auto-implement, sprint-plan, daily-standup 46 | - 🛠️ Utilities: check-health, complexity-report, sync-memory 47 | - 🔍 Analysis: validate-deps, show dependencies 48 | 49 | **By Scenario:** 50 | - "I want to see what to work on" → `/project:task-master:next` 51 | - "I need to break this down" → `/project:task-master:expand <id>` 52 | - "Show me everything" → `/project:task-master:status` 53 | - "Just do it for me" → `/project:workflows:auto-implement` 54 | 55 | ### 4. **Power User Patterns** 56 | 57 | **Command Chaining:** 58 | ``` 59 | /project:task-master:next 60 | /project:task-master:start <id> 61 | /project:workflows:auto-implement 62 | ``` 63 | 64 | **Smart Filters:** 65 | ``` 66 | /project:task-master:list pending high 67 | /project:task-master:list blocked 68 | /project:task-master:list 1-5 tree 69 | ``` 70 | 71 | **Automation:** 72 | ``` 73 | /project:workflows:pipeline init → expand-all → sprint-plan 74 | ``` 75 | 76 | ### 5. **Learning Path** 77 | 78 | Based on your experience level: 79 | 80 | **Beginner Path:** 81 | 1. init → Create project 82 | 2. status → Understand state 83 | 3. next → Find work 84 | 4. complete → Finish task 85 | 86 | **Intermediate Path:** 87 | 1. expand → Break down complex tasks 88 | 2. sprint-plan → Organize work 89 | 3. complexity-report → Understand difficulty 90 | 4. validate-deps → Ensure consistency 91 | 92 | **Advanced Path:** 93 | 1. pipeline → Chain operations 94 | 2. smart-flow → Context-aware automation 95 | 3. Custom commands → Extend the system 96 | 97 | ### 6. **Try This Now** 98 | 99 | Based on what you asked about, try: 100 | [Specific command suggestion based on $ARGUMENTS] 101 | 102 | Want to learn more about a specific command? 103 | Type: /project:help <command-name> ``` -------------------------------------------------------------------------------- /assets/claude/commands/tm/learn.md: -------------------------------------------------------------------------------- ```markdown 1 | Learn about Task Master capabilities through interactive exploration. 2 | 3 | Arguments: $ARGUMENTS 4 | 5 | ## Interactive Task Master Learning 6 | 7 | Based on your input, I'll help you discover capabilities: 8 | 9 | ### 1. **What are you trying to do?** 10 | 11 | If $ARGUMENTS contains: 12 | - "start" / "begin" → Show project initialization workflows 13 | - "manage" / "organize" → Show task management commands 14 | - "automate" / "auto" → Show automation workflows 15 | - "analyze" / "report" → Show analysis tools 16 | - "fix" / "problem" → Show troubleshooting commands 17 | - "fast" / "quick" → Show efficiency shortcuts 18 | 19 | ### 2. **Intelligent Suggestions** 20 | 21 | Based on your project state: 22 | 23 | **No tasks yet?** 24 | ``` 25 | You'll want to start with: 26 | 1. /project:task-master:init <prd-file> 27 | → Creates tasks from requirements 28 | 29 | 2. /project:task-master:parse-prd <file> 30 | → Alternative task generation 31 | 32 | Try: /project:task-master:init demo-prd.md 33 | ``` 34 | 35 | **Have tasks?** 36 | Let me analyze what you might need... 37 | - Many pending tasks? → Learn sprint planning 38 | - Complex tasks? → Learn task expansion 39 | - Daily work? → Learn workflow automation 40 | 41 | ### 3. **Command Discovery** 42 | 43 | **By Category:** 44 | - 📋 Task Management: list, show, add, update, complete 45 | - 🔄 Workflows: auto-implement, sprint-plan, daily-standup 46 | - 🛠️ Utilities: check-health, complexity-report, sync-memory 47 | - 🔍 Analysis: validate-deps, show dependencies 48 | 49 | **By Scenario:** 50 | - "I want to see what to work on" → `/project:task-master:next` 51 | - "I need to break this down" → `/project:task-master:expand <id>` 52 | - "Show me everything" → `/project:task-master:status` 53 | - "Just do it for me" → `/project:workflows:auto-implement` 54 | 55 | ### 4. **Power User Patterns** 56 | 57 | **Command Chaining:** 58 | ``` 59 | /project:task-master:next 60 | /project:task-master:start <id> 61 | /project:workflows:auto-implement 62 | ``` 63 | 64 | **Smart Filters:** 65 | ``` 66 | /project:task-master:list pending high 67 | /project:task-master:list blocked 68 | /project:task-master:list 1-5 tree 69 | ``` 70 | 71 | **Automation:** 72 | ``` 73 | /project:workflows:pipeline init → expand-all → sprint-plan 74 | ``` 75 | 76 | ### 5. **Learning Path** 77 | 78 | Based on your experience level: 79 | 80 | **Beginner Path:** 81 | 1. init → Create project 82 | 2. status → Understand state 83 | 3. next → Find work 84 | 4. complete → Finish task 85 | 86 | **Intermediate Path:** 87 | 1. expand → Break down complex tasks 88 | 2. sprint-plan → Organize work 89 | 3. complexity-report → Understand difficulty 90 | 4. validate-deps → Ensure consistency 91 | 92 | **Advanced Path:** 93 | 1. pipeline → Chain operations 94 | 2. smart-flow → Context-aware automation 95 | 3. Custom commands → Extend the system 96 | 97 | ### 6. **Try This Now** 98 | 99 | Based on what you asked about, try: 100 | [Specific command suggestion based on $ARGUMENTS] 101 | 102 | Want to learn more about a specific command? 103 | Type: /project:help <command-name> ``` -------------------------------------------------------------------------------- /test-version-check-full.js: -------------------------------------------------------------------------------- ```javascript 1 | import { 2 | checkForUpdate, 3 | displayUpgradeNotification, 4 | compareVersions 5 | } from './scripts/modules/commands.js'; 6 | import fs from 'fs'; 7 | import path from 'path'; 8 | 9 | // Force our current version for testing 10 | process.env.FORCE_VERSION = '0.9.30'; 11 | 12 | // Create a mock package.json in memory for testing 13 | const mockPackageJson = { 14 | name: 'task-master-ai', 15 | version: '0.9.30' 16 | }; 17 | 18 | // Modified version of checkForUpdate that doesn't use HTTP for testing 19 | async function testCheckForUpdate(simulatedLatestVersion) { 20 | // Get current version - use our forced version 21 | const currentVersion = process.env.FORCE_VERSION || '0.9.30'; 22 | 23 | console.log(`Using simulated current version: ${currentVersion}`); 24 | console.log(`Using simulated latest version: ${simulatedLatestVersion}`); 25 | 26 | // Compare versions 27 | const needsUpdate = 28 | compareVersions(currentVersion, simulatedLatestVersion) < 0; 29 | 30 | return { 31 | currentVersion, 32 | latestVersion: simulatedLatestVersion, 33 | needsUpdate 34 | }; 35 | } 36 | 37 | // Test with current version older than latest (should show update notice) 38 | async function runTest() { 39 | console.log('=== Testing version check scenarios ===\n'); 40 | 41 | // Scenario 1: Update available 42 | console.log( 43 | '\n--- Scenario 1: Update available (Current: 0.9.30, Latest: 1.0.0) ---' 44 | ); 45 | const updateInfo1 = await testCheckForUpdate('1.0.0'); 46 | console.log('Update check results:'); 47 | console.log(`- Current version: ${updateInfo1.currentVersion}`); 48 | console.log(`- Latest version: ${updateInfo1.latestVersion}`); 49 | console.log(`- Update needed: ${updateInfo1.needsUpdate}`); 50 | 51 | if (updateInfo1.needsUpdate) { 52 | console.log('\nDisplaying upgrade notification:'); 53 | displayUpgradeNotification( 54 | updateInfo1.currentVersion, 55 | updateInfo1.latestVersion 56 | ); 57 | } 58 | 59 | // Scenario 2: No update needed (versions equal) 60 | console.log( 61 | '\n--- Scenario 2: No update needed (Current: 0.9.30, Latest: 0.9.30) ---' 62 | ); 63 | const updateInfo2 = await testCheckForUpdate('0.9.30'); 64 | console.log('Update check results:'); 65 | console.log(`- Current version: ${updateInfo2.currentVersion}`); 66 | console.log(`- Latest version: ${updateInfo2.latestVersion}`); 67 | console.log(`- Update needed: ${updateInfo2.needsUpdate}`); 68 | 69 | // Scenario 3: Development version (current newer than latest) 70 | console.log( 71 | '\n--- Scenario 3: Development version (Current: 0.9.30, Latest: 0.9.0) ---' 72 | ); 73 | const updateInfo3 = await testCheckForUpdate('0.9.0'); 74 | console.log('Update check results:'); 75 | console.log(`- Current version: ${updateInfo3.currentVersion}`); 76 | console.log(`- Latest version: ${updateInfo3.latestVersion}`); 77 | console.log(`- Update needed: ${updateInfo3.needsUpdate}`); 78 | 79 | console.log('\n=== Test complete ==='); 80 | } 81 | 82 | // Run all tests 83 | runTest(); 84 | ``` -------------------------------------------------------------------------------- /apps/docs/getting-started/quick-start/prd-quick.mdx: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: PRD Creation and Parsing 3 | sidebarTitle: "PRD Creation and Parsing" 4 | --- 5 | 6 | # Writing a PRD 7 | 8 | A PRD (Product Requirements Document) is the starting point of every task flow in Task Master. It defines what you're building and why. A clear PRD dramatically improves the quality of your tasks, your model outputs, and your final product — so it’s worth taking the time to get it right. 9 | 10 | <Tip> 11 | You don’t need to define your whole app up front. You can write a focused PRD just for the next feature or module you’re working on. 12 | </Tip> 13 | 14 | <Tip> 15 | You can start with an empty project or you can start with a feature PRD on an existing project. 16 | </Tip> 17 | 18 | <Tip> 19 | You can add and parse multiple PRDs per project using the --append flag 20 | </Tip> 21 | 22 | ## What Makes a Good PRD? 23 | 24 | - Clear objective — what’s the outcome or feature? 25 | - Context — what’s already in place or assumed? 26 | - Constraints — what limits or requirements need to be respected? 27 | - Reasoning — why are you building it this way? 28 | 29 | The more context you give the model, the better the breakdown and results. 30 | 31 | --- 32 | 33 | ## Writing a PRD for Task Master 34 | 35 | <Note>An example PRD can be found in .taskmaster/templates/example_prd.txt</Note> 36 | 37 | 38 | You can co-write your PRD with an LLM model using the following workflow: 39 | 40 | 1. **Chat about requirements** — explain what you want to build. 41 | 2. **Show an example PRD** — share the example PRD so the model understands the expected format. The example uses formatting that work well with Task Master's code. Following the example will yield better results. 42 | 3. **Iterate and refine** — work with the model to shape the draft into a clear and well-structured PRD. 43 | 44 | This approach works great in Cursor, or anywhere you use a chat-based LLM. 45 | 46 | --- 47 | 48 | ## Where to Save Your PRD 49 | 50 | Place your PRD file in the `.taskmaster/docs` folder in your project. 51 | 52 | - You can have **multiple PRDs** per project. 53 | - Name your PRDs clearly so they’re easy to reference later. 54 | - Examples: `dashboard_redesign.txt`, `user_onboarding.txt` 55 | 56 | --- 57 | 58 | # Parse your PRD into Tasks 59 | 60 | This is where the Task Master magic begins. 61 | 62 | In Cursor's AI chat, instruct the agent to generate tasks from your PRD: 63 | 64 | ``` 65 | Please use the task-master parse-prd command to generate tasks from my PRD. The PRD is located at .taskmaster/docs/<prd-name>.txt. 66 | ``` 67 | 68 | The agent will execute the following command which you can alternatively paste into the CLI: 69 | 70 | ```bash 71 | task-master parse-prd .taskmaster/docs/<prd-name>.txt 72 | ``` 73 | 74 | This will: 75 | 76 | - Parse your PRD document 77 | - Generate a structured `tasks.json` file with tasks, dependencies, priorities, and test strategies 78 | 79 | Now that you have written and parsed a PRD, you are ready to start setting up your tasks. 80 | 81 | 82 | ``` -------------------------------------------------------------------------------- /apps/extension/src/components/TaskMasterLogo.tsx: -------------------------------------------------------------------------------- ```typescript 1 | import React from 'react'; 2 | 3 | interface TaskMasterLogoProps { 4 | className?: string; 5 | } 6 | 7 | export const TaskMasterLogo: React.FC<TaskMasterLogoProps> = ({ 8 | className = '' 9 | }) => { 10 | return ( 11 | <svg 12 | className={className} 13 | viewBox="0 0 224 291" 14 | fill="none" 15 | xmlns="http://www.w3.org/2000/svg" 16 | > 17 | <path 18 | d="M101.635 286.568L71.4839 256.414C65.6092 250.539 65.6092 241.03 71.4839 235.155L142.52 164.11C144.474 162.156 147.643 162.156 149.61 164.11L176.216 190.719C178.17 192.673 181.339 192.673 183.305 190.719L189.719 184.305C191.673 182.35 191.673 179.181 189.719 177.214L163.113 150.605C161.159 148.651 161.159 145.481 163.113 143.514L191.26 115.365C193.214 113.41 193.214 110.241 191.26 108.274L182.316 99.3291C180.362 97.3748 177.193 97.3748 175.226 99.3291L55.8638 218.706C49.989 224.581 40.4816 224.581 34.6068 218.706L4.4061 188.501C-1.4687 182.626 -1.4687 173.117 4.4061 167.242L23.8342 147.811C25.7883 145.857 25.7883 142.688 23.8342 140.721L4.78187 121.666C-1.09293 115.791 -1.09293 106.282 4.78187 100.406L34.7195 70.4527C40.5943 64.5772 50.1017 64.5772 55.9765 70.4527L75.555 90.0335C77.5091 91.9879 80.6782 91.9879 82.6448 90.0335L124.144 48.5292C126.098 46.5749 126.098 43.4054 124.144 41.4385L115.463 32.7568C113.509 30.8025 110.34 30.8025 108.374 32.7568L99.8683 41.2632C97.9143 43.2175 94.7451 43.2175 92.7785 41.2632L82.1438 30.6271C80.1897 28.6728 80.1897 25.5033 82.1438 23.5364L101.271 4.40662C107.146 -1.46887 116.653 -1.46887 122.528 4.40662L152.478 34.3604C158.353 40.2359 158.353 49.7444 152.478 55.6199L82.6323 125.474C80.6782 127.429 77.5091 127.429 75.5425 125.474L48.8741 98.8029C46.9201 96.8486 43.7509 96.8486 41.7843 98.8029L33.1036 107.485C31.1496 109.439 31.1496 112.608 33.1036 114.575L59.2458 140.721C61.1999 142.675 61.1999 145.844 59.2458 147.811L32.7404 174.32C30.7863 176.274 30.7863 179.444 32.7404 181.411L41.6841 190.355C43.6382 192.31 46.8073 192.31 48.7739 190.355L168.136 70.9789C174.011 65.1034 183.518 65.1034 189.393 70.9789L219.594 101.183C225.469 107.059 225.469 116.567 219.594 122.443L198.537 143.502C196.583 145.456 196.583 148.626 198.537 150.592L218.053 170.111C223.928 175.986 223.928 185.495 218.053 191.37L190.37 219.056C184.495 224.932 174.988 224.932 169.113 219.056L149.597 199.538C147.643 197.584 144.474 197.584 142.508 199.538L99.8057 242.245C97.8516 244.2 97.8516 247.369 99.8057 249.336L108.699 258.231C110.653 260.185 113.823 260.185 115.789 258.231L122.954 251.065C124.908 249.11 128.077 249.11 130.044 251.065L140.679 261.701C142.633 263.655 142.633 266.825 140.679 268.791L122.879 286.593C117.004 292.469 107.497 292.469 101.622 286.593L101.635 286.568Z" 19 | fill="currentColor" 20 | /> 21 | </svg> 22 | ); 23 | }; 24 | ```