From 5bd97e9cf5c4c9bd1a4d8f3054ecb19f74ed66ba Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 May 2026 02:52:49 +0300 Subject: [PATCH] feat: add categories to bot posts via centralized mapping - Introduced BOT_CATEGORIES in src/core/botCategories.js to map bot names to their respective categories. - Updated TdnClient.createPost in src/api/client.js to automatically inject categories from the mapping. - Supports multi-category bots (e.g., [FRONTEND, BACKEND]) falling back to an empty array if no mapping exists. --- src/api/client.js | 9 ++- src/core/botCategories.js | 128 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/core/botCategories.js diff --git a/src/api/client.js b/src/api/client.js index f8fb7c0..32aa541 100644 --- a/src/api/client.js +++ b/src/api/client.js @@ -1,4 +1,5 @@ import { log } from "../logger.js"; +import { BOT_CATEGORIES } from "../core/botCategories.js"; import { createRequire } from "module"; const require = createRequire(import.meta.url); @@ -164,14 +165,18 @@ class TdnClient { /** * Creates a new post on the TDN platform. - * @param {{ content: string, type: string, mediaUrls: string[] }} payload - Post data + * @param {{ content: string, type: string, mediaUrls: string[], categories: string[] }} payload - Post data * @returns {Promise} API response on success, null on failure */ async createPost(payload) { try { + const categories = + payload.categories ?? BOT_CATEGORIES[this.botName] ?? []; + const body = { ...payload, categories }; + const response = await this.fetchWithAuth("/posts", { method: "POST", - body: JSON.stringify(payload), + body: JSON.stringify(body), }); if (!response.ok) { diff --git a/src/core/botCategories.js b/src/core/botCategories.js new file mode 100644 index 0000000..66e802d --- /dev/null +++ b/src/core/botCategories.js @@ -0,0 +1,128 @@ +/** + * Maps each bot name (as used in config.json) to its TDN post categories. + * Used by TdnClient.createPost to automatically inject the `categories` field. + * + * Valid category values: "AI" | "GAME" | "MOBILE" | "BACKEND" | "FRONTEND" + */ +export const BOT_CATEGORIES = { + // AI + anthropic: ["AI"], + autogen: ["AI"], + claudecode: ["AI"], + cohere: ["AI"], + comfyui: ["AI"], + crewai: ["AI"], + cursor: ["AI"], + deepseek: ["AI"], + dify: ["AI"], + flowise: ["AI"], + gemini: ["AI"], + google: ["AI"], + groq: ["AI"], + haystack: ["AI"], + huggingface: ["AI"], + langchain: ["AI"], + litellm: ["AI"], + llamaindex: ["AI"], + meta: ["AI"], + mistral: ["AI"], + mlflow: ["AI"], + ollama: ["AI"], + openai: ["AI"], + pytorch: ["AI"], + semantickernel: ["AI"], + stability: ["AI"], + tensorflow: ["AI"], + vllm: ["AI"], + xai: ["AI"], + + // GAME + bevy: ["GAME"], + godot: ["GAME"], + phaser: ["GAME"], + unity: ["GAME"], + unrealengine: ["GAME"], + + // MOBILE + flutter: ["MOBILE"], + + // BACKEND + aws: ["BACKEND"], + cloudflare: ["BACKEND"], + django: ["BACKEND"], + docker: ["BACKEND"], + dotnet: ["BACKEND"], + drizzle: ["BACKEND"], + elixir: ["BACKEND"], + express: ["BACKEND"], + fastapi: ["BACKEND"], + fastify: ["BACKEND"], + github: ["BACKEND"], + go: ["BACKEND"], + grafana: ["BACKEND"], + hono: ["BACKEND"], + java: ["BACKEND"], + kubernetes: ["BACKEND"], + laravel: ["BACKEND"], + mongodb: ["BACKEND"], + nestjs: ["BACKEND"], + netflix: ["BACKEND"], + nodejs: ["BACKEND"], + php: ["BACKEND"], + prisma: ["BACKEND"], + prometheus: ["BACKEND"], + python: ["BACKEND"], + rails: ["BACKEND"], + redis: ["BACKEND"], + ruby: ["BACKEND"], + rust: ["BACKEND"], + springboot: ["BACKEND"], + supabase: ["BACKEND"], + terraform: ["BACKEND"], + zig: ["BACKEND"], + + // FRONTEND + alpinejs: ["FRONTEND"], + angular: ["FRONTEND"], + astro: ["FRONTEND"], + biome: ["FRONTEND"], + bootstrap: ["FRONTEND"], + electron: ["FRONTEND"], + esbuild: ["FRONTEND"], + eslint: ["FRONTEND"], + htmx: ["FRONTEND"], + nuxt: ["FRONTEND"], + playwright: ["FRONTEND"], + pnpm: ["FRONTEND"], + prettier: ["FRONTEND"], + react: ["FRONTEND"], + solidjs: ["FRONTEND"], + svelte: ["FRONTEND"], + swc: ["FRONTEND"], + tailwindcss: ["FRONTEND"], + threejs: ["FRONTEND"], + vite: ["FRONTEND"], + vitest: ["FRONTEND"], + vue: ["FRONTEND"], + webpack: ["FRONTEND"], + + // FRONTEND + BACKEND + bun: ["FRONTEND", "BACKEND"], + deno: ["FRONTEND", "BACKEND"], + nextjs: ["FRONTEND", "BACKEND"], + remix: ["FRONTEND", "BACKEND"], + tauri: ["FRONTEND", "BACKEND"], + trpc: ["FRONTEND", "BACKEND"], + typescript: ["FRONTEND", "BACKEND"], + vercel: ["FRONTEND", "BACKEND"], + + // BACKEND + MOBILE + kotlin: ["BACKEND", "MOBILE"], + swift: ["BACKEND", "MOBILE"], + + // FRONTEND + MOBILE + reactnative: ["FRONTEND", "MOBILE"], + + // AI + BACKEND + n8n: ["AI", "BACKEND"], +};