eyaltoledano/claude-task-master · error · Error

Tag ${oldTag} not found in standard format

Error message

Tag ${oldTag} not found in standard format

What it means

In renameTag, when tasks.json is in standard format the only valid rename source is 'master' (which converts the file to legacy format under the new name). Renaming any other tag against a standard-format file throws this error, since non-master tags only exist in legacy format.

Source

Thrown at packages/tm-core/src/modules/storage/adapters/file-storage/file-storage.ts:785

						}

						return existingData;
					} else {
						throw new Error(`Tag ${oldTag} not found`);
					}
				} else if (oldTag === 'master') {
					// Convert standard format to legacy when renaming master
					const masterTasks = existingData.tasks || [];
					const masterMetadata = existingData.metadata || {};

					return {
						[newTag]: {
							tasks: masterTasks,
							metadata: { ...masterMetadata, tags: [newTag] }
						}
					};
				} else {
					throw new Error(`Tag ${oldTag} not found in standard format`);
				}
			});
		} catch (error: any) {
			if (error.code === 'ENOENT') {
				throw new Error(`Tag ${oldTag} not found - file doesn't exist`);
			}
			throw error;
		}
	}

	/**
	 * Copy a tag within the single tasks.json file
	 */
	async copyTag(sourceTag: string, targetTag: string): Promise<void> {
		const tasks = await this.loadTasks(sourceTag);

		if (tasks.length === 0) {
			throw new Error(`Source tag ${sourceTag} not found or has no tasks`);

View on GitHub (pinned to c0c98d367c)

Solutions

  1. Migrate tasks.json to legacy/tagged format first, then rename the tag.
  2. If the intent was to rename the implicit master set, call renameTag('master', newName) — that is the supported standard-format path.
  3. Detect the file format before renaming and branch accordingly.
  4. Create the new tag and copy tasks (copyTag) if a full migration is not desired.

Example fix

// before
await storage.renameTag('feature', 'feature-v2'); // standard format file
// after
const data = JSON.parse(fs.readFileSync(tasksPath, 'utf8'));
if (Array.isArray(data.tasks)) {
  await storage.renameTag('master', 'feature-v2'); // supported conversion path
} else {
  await storage.renameTag('feature', 'feature-v2');
}
Defensive patterns

Strategy: validation

Validate before calling

const data = JSON.parse(fs.readFileSync(tasksPath, 'utf8'));
const isStandardFormat = Array.isArray(data.tasks);
if (isStandardFormat && oldTag !== 'master') {
  throw new Error(`Only 'master' can be renamed in standard format; migrate tasks.json first`);
}

Type guard

function isStandardFormat(data: unknown): data is { tasks: unknown[]; metadata?: object } {
  return typeof data === 'object' && data !== null && Array.isArray((data as any).tasks);
}

Try / catch

try {
  await storage.renameTag(oldTag, newTag);
} catch (err) {
  if (err instanceof Error && err.message.includes('not found in standard format')) {
    await migrateToTaggedFormat(tasksPath);
    await storage.renameTag(oldTag, newTag);
    return;
  }
  throw err;
}

Prevention

When it happens

Trigger: storage.renameTag('feature', 'feature-v2') while tasks.json is still standard/un-migrated format; scripts assuming the file was already converted to tagged format; renaming a tag right after project init when the file still uses {tasks, metadata} layout.

Common situations: Older projects not yet migrated to multi-tag storage; version upgrades introducing tagged format while automation still targets old assumptions; confusion between the 'master' pseudo-tag and real legacy tag keys.

Related errors


AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29). Data as JSON: /api/errors/f770f9fced3725cd. Report an issue: GitHub.