diff --git a/.changeset/loose-poems-tickle.md b/.changeset/loose-poems-tickle.md new file mode 100644 index 00000000..ea27cf69 --- /dev/null +++ b/.changeset/loose-poems-tickle.md @@ -0,0 +1,7 @@ +--- +"task-master-ai": patch +--- + +Fix Zed MCP configuration by adding required "source" property + +- Add "source": "custom" property to task-master-ai server in Zed settings.json diff --git a/scripts/init.js b/scripts/init.js index 1223dc01..79d2ecfe 100755 --- a/scripts/init.js +++ b/scripts/init.js @@ -16,8 +16,6 @@ import fs from 'fs'; import path from 'path'; import readline from 'readline'; -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; import chalk from 'chalk'; import figlet from 'figlet'; import boxen from 'boxen'; @@ -49,9 +47,6 @@ import { GITIGNORE_FILE } from '../src/constants/paths.js'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - // Define log levels const LOG_LEVELS = { debug: 0, @@ -619,13 +614,7 @@ function createProjectStructure( // Copy .gitignore with GitTasks preference try { - const gitignoreTemplatePath = path.join( - __dirname, - '..', - 'assets', - 'gitignore' - ); - const templateContent = fs.readFileSync(gitignoreTemplatePath, 'utf8'); + const templateContent = readAsset('gitignore', 'utf8'); manageGitignoreFile( path.join(targetDir, GITIGNORE_FILE), templateContent, diff --git a/scripts/modules/commands.js b/scripts/modules/commands.js index 62d679e0..9ea561f3 100644 --- a/scripts/modules/commands.js +++ b/scripts/modules/commands.js @@ -5077,7 +5077,7 @@ Examples: function setupCLI() { // Create a new program instance const programInstance = new Command() - .name('dev') + .name('task-master') .description('AI-driven development task management') .version(process.env.TM_PUBLIC_VERSION || 'unknown') .helpOption('-h, --help', 'Display help') @@ -5108,8 +5108,9 @@ function setupCLI() { */ async function runCLI(argv = process.argv) { try { - // Display banner if not in a pipe - if (process.stdout.isTTY) { + // Display banner if not in a pipe (except for init command which has its own banner) + const isInitCommand = argv.includes('init'); + if (process.stdout.isTTY && !isInitCommand) { displayBanner(); } diff --git a/src/profiles/zed.js b/src/profiles/zed.js index 989f7cd3..66e52b8b 100644 --- a/src/profiles/zed.js +++ b/src/profiles/zed.js @@ -142,6 +142,11 @@ function onPostConvertRulesProfile(targetDir, assetsDir) { // Transform to Zed format const zedConfig = transformToZedFormat(mcpConfig); + // Add "source": "custom" to task-master-ai server for Zed + if (zedConfig['context_servers'] && zedConfig['context_servers']['task-master-ai']) { + zedConfig['context_servers']['task-master-ai'].source = 'custom'; + } + // Write back the transformed config with proper formatting fs.writeFileSync( mcpConfigPath, diff --git a/src/utils/path-utils.js b/src/utils/path-utils.js index d17342d1..13671c84 100644 --- a/src/utils/path-utils.js +++ b/src/utils/path-utils.js @@ -463,6 +463,17 @@ export function findConfigPath(explicitPath = null, args = null, log = null) { } } - logger.warn?.(`No configuration file found in project: ${projectRoot}`); + // Only warn once per command execution to prevent spam during init + const warningKey = `config_warning_${projectRoot}`; + + if (!global._tmConfigWarningsThisRun) { + global._tmConfigWarningsThisRun = new Set(); + } + + if (!global._tmConfigWarningsThisRun.has(warningKey)) { + global._tmConfigWarningsThisRun.add(warningKey); + logger.warn?.(`No configuration file found in project: ${projectRoot}`); + } + return null; }