eyaltoledano/claude-task-master · warning · TaskMasterError

NOT_IMPLEMENTED

NOT_IMPLEMENTED

Error message

Tag creation is not supported with API storage. Please create briefs through Hamster Studio.

What it means

ApiStorage.createTag unconditionally throws a TaskMasterError with code NOT_IMPLEMENTED because API storage models tags as Hamster briefs, which cannot be created programmatically. Users must create briefs in Hamster Studio (web interface). Any internal flow that tries to create a tag via API storage (saveTasks, saveMetadata, appendTasks, renameTag, copyTag) will hit this.

Source

Thrown at packages/tm-core/src/modules/storage/adapters/api-storage.ts:742

		}
	}

	/**
	 * Get all available tags
	 */
	async getAllTags(): Promise<string[]> {
		return this.listTags();
	}

	/**
	 * Create a new tag (brief)
	 * Not supported with API storage - users must create briefs via web interface
	 */
	async createTag(
		tagName: string,
		_options?: { copyFrom?: string; description?: string }
	): Promise<void> {
		throw new TaskMasterError(
			'Tag creation is not supported with API storage. Please create briefs through Hamster Studio.',
			ERROR_CODES.NOT_IMPLEMENTED,
			{ storageType: 'api', operation: 'createTag', tagName }
		);
	}

	/**
	 * Delete all tasks for a tag
	 */
	async deleteTag(tag: string): Promise<void> {
		await this.ensureInitialized();

		try {
			await this.retryOperation(() =>
				this.repository.deleteTag(this.projectId, tag)
			);

			this.tagsCache.delete(tag);

View on GitHub (pinned to c0c98d367c)

Solutions

  1. Create the brief in Hamster Studio first, then select it and use it as the tag
  2. Detect NOT_IMPLEMENTED and surface the guidance message to users instead of retrying
  3. Restructure scripts to operate only on existing briefs when using API storage
  4. Use local/file storage if programmatic tag creation is required

Example fix

// before
await storage.createTag('my-brief');
// after
const tags = await storage.listTags();
if (!tags.includes('my-brief')) {
  throw new Error('Create the brief "my-brief" in Hamster Studio first, then re-run');
}
Defensive patterns

Strategy: fallback

Validate before calling

const tags = await storage.listTags();
if (!tags.includes(tagName)) throw new Error(`Brief '${tagName}' must be created in Hamster Studio before use with API storage`);

Type guard

function isNotImplemented(e: unknown): e is TaskMasterError {
  return e instanceof TaskMasterError && e.code === 'NOT_IMPLEMENTED';
}

Try / catch

try {
  await storage.createTag(name);
} catch (e) {
  if (e instanceof TaskMasterError && e.code === 'NOT_IMPLEMENTED') {
    console.warn('Create briefs via Hamster Studio, then re-run with the existing brief selected');
    return;
  }
  throw e;
}

Prevention

When it happens

Trigger: Directly calling storage.createTag(name) on an ApiStorage instance; renameTag/copyTag implementations that create the destination tag; saveMetadata/appendTasks with a tag absent from the cache and absent on the server (createTag fallback path).

Common situations: Porting file-storage workflows that freely create tags to API storage; scripted brief provisioning; copying a tag set from local storage to the API backend.

Related errors


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