docs: add n8n integration context
This commit is contained in:
@@ -0,0 +1,498 @@
|
||||
{
|
||||
"meta": {
|
||||
"lastReviewed": "2026-04-20",
|
||||
"instructions": [
|
||||
"Add one workflow entry for every n8n workflow that feeds or is triggered by this repository.",
|
||||
"Keep repository.consumers paths repo-relative.",
|
||||
"Optional: export workflow JSON into docs/integrations/n8n/exports/ and reference it from n8n.exportFile."
|
||||
]
|
||||
},
|
||||
"workflows": [
|
||||
{
|
||||
"id": "ai-search",
|
||||
"status": "confirmed",
|
||||
"name": "AI Search",
|
||||
"purpose": "Resolve semantic search candidates from n8n and hydrate them into project results.",
|
||||
"n8n": {
|
||||
"workflowId": "F5cQ06DykBfpeyfqL-pd7",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "webhook",
|
||||
"method": "GET",
|
||||
"path": "ai-search"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"src/app/api/search/ai/route.ts"
|
||||
],
|
||||
"env": [
|
||||
"N8N_AI_SEARCH_WEBHOOK"
|
||||
],
|
||||
"schemas": [
|
||||
"N8NSearchResponseSchema"
|
||||
]
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"desc",
|
||||
"limit",
|
||||
"page",
|
||||
"offset",
|
||||
"tags",
|
||||
"domains",
|
||||
"productForms"
|
||||
],
|
||||
"responseFields": [
|
||||
"results[].id",
|
||||
"results[].similarity",
|
||||
"pagination.total",
|
||||
"pagination.totalPages",
|
||||
"pagination.hasMore"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"RAG项目搜索",
|
||||
"pgvector similarity search",
|
||||
"SiliconFlow embeddings"
|
||||
],
|
||||
"downstreams": [
|
||||
"src/hooks/useProjects.ts#getProjectsByIds",
|
||||
"POST /api/search/ai response"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: webhook path is `ai-search` and the workflow returns `results[].id` plus `similarity`."
|
||||
},
|
||||
{
|
||||
"id": "signals-aggregation",
|
||||
"status": "confirmed",
|
||||
"name": "Signals Aggregation",
|
||||
"purpose": "Aggregate multi-source discussion signals, filter them with AI, and ingest them into the repository signal store.",
|
||||
"n8n": {
|
||||
"workflowId": "bAxNZKGq2ApUUiw9",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "multi-source discussion crawl"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"src/lib/auth.ts",
|
||||
"src/app/api/webhook/signals/route.ts",
|
||||
"src/app/api/signals/route.ts",
|
||||
"src/lib/validations.ts",
|
||||
"prisma/schema.prisma"
|
||||
],
|
||||
"env": [
|
||||
"WEBHOOK_API_KEY"
|
||||
],
|
||||
"schemas": [
|
||||
"SignalWebhookPayloadSchema",
|
||||
"SignalIngestionInputSchema",
|
||||
"SignalQuerySchema"
|
||||
]
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"apiKey",
|
||||
"signals[].source",
|
||||
"signals[].sourceUrl",
|
||||
"signals[].title",
|
||||
"signals[].titleEn",
|
||||
"signals[].summary",
|
||||
"signals[].summaryEn",
|
||||
"signals[].topic",
|
||||
"signals[].topicEn",
|
||||
"signals[].tags",
|
||||
"signals[].sections",
|
||||
"signals[].engagement",
|
||||
"signals[].hotScore",
|
||||
"signals[].isHot",
|
||||
"signals[].publishedAt",
|
||||
"signals[].isActive"
|
||||
],
|
||||
"responseFields": [
|
||||
"success",
|
||||
"processed",
|
||||
"created",
|
||||
"updated",
|
||||
"failed",
|
||||
"errors[].index",
|
||||
"errors[].field",
|
||||
"errors[].message"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"Hacker News",
|
||||
"GitHub",
|
||||
"arXiv",
|
||||
"Reddit",
|
||||
"Product Hunt",
|
||||
"Hugging Face"
|
||||
],
|
||||
"downstreams": [
|
||||
"GET /api/signals",
|
||||
"signals page feed",
|
||||
"signal hotness computation"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow posts to `/api/webhook/signals` and also triggers external discovery dedupe/task creation. Workflow currently embeds a shared secret in HTTP body and should move to credentials/env."
|
||||
},
|
||||
{
|
||||
"id": "tag-reset",
|
||||
"status": "confirmed",
|
||||
"name": "Project Tag Reset",
|
||||
"purpose": "Reset selected project tags in bulk from n8n classification results.",
|
||||
"n8n": {
|
||||
"workflowId": "8tIgBqLyWrBewJPs",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "manual",
|
||||
"path": "bulk tag reset"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"src/lib/auth.ts",
|
||||
"src/app/api/tags/reset-projects/route.ts",
|
||||
"src/lib/validations.ts",
|
||||
"prisma/schema.prisma"
|
||||
],
|
||||
"env": [
|
||||
"WEBHOOK_API_KEY"
|
||||
],
|
||||
"schemas": [
|
||||
"ProjectTagResetRequestSchema"
|
||||
]
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"apiKey",
|
||||
"dryRun",
|
||||
"replaceAllCategories",
|
||||
"categories",
|
||||
"projects[].projectSlug",
|
||||
"projects[].selectedTagSlugsByCategory"
|
||||
],
|
||||
"responseFields": [
|
||||
"success",
|
||||
"result.dryRun",
|
||||
"result.categories",
|
||||
"result.updatedCount",
|
||||
"result.failedCount",
|
||||
"result.results[].projectSlug",
|
||||
"result.results[].status",
|
||||
"result.results[].details"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"n8n tag classification"
|
||||
],
|
||||
"downstreams": [
|
||||
"project tag relations",
|
||||
"project detail page revalidation",
|
||||
"project list revalidation"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow reads `/api/tags` and `/api/projects`, then posts bulk updates into `/api/tags/reset-projects`. Workflow currently embeds a shared secret in HTTP body and should move to credentials/env."
|
||||
},
|
||||
{
|
||||
"id": "project-ingestion-multi-source",
|
||||
"status": "external-upstream",
|
||||
"name": "Project Ingestion (Multi-source)",
|
||||
"purpose": "Consume queued discovery tasks, enrich project metadata with AI/browser steps, and write final ingestion results back to Agent Park.",
|
||||
"n8n": {
|
||||
"workflowId": "1Ig1CyVMsGJFaHOe",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "every 10 minutes"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"prisma/schema.prisma",
|
||||
"src/app/api/projects/route.ts",
|
||||
"src/app/api/projects/[slug]/route.ts"
|
||||
],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"task.status",
|
||||
"task.sourceUrl",
|
||||
"task.sourceType"
|
||||
],
|
||||
"responseFields": [
|
||||
"project content",
|
||||
"tag assignments",
|
||||
"task completion status"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"discovery task queue",
|
||||
"browser/AI extraction",
|
||||
"tag catalog"
|
||||
],
|
||||
"downstreams": [
|
||||
"project records visible in repository APIs",
|
||||
"task completion callbacks",
|
||||
"task failure callbacks"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow polls `/api/discovery/tasks`, marks tasks `IN_PROGRESS`, enriches candidates, then completes or fails tasks. The current repo does not contain `/api/discovery/*` handlers, so this is an upstream system dependency rather than a route implemented here."
|
||||
},
|
||||
{
|
||||
"id": "github-star-refresh",
|
||||
"status": "confirmed",
|
||||
"name": "GitHub Star Refresh",
|
||||
"purpose": "Refresh `projects.githubStars` and `projects.githubStarsUpdatedAt` directly from GitHub repository metadata.",
|
||||
"n8n": {
|
||||
"workflowId": "ewx9Gs6cjrTXvwD0",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "daily at 04:00"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"prisma/schema.prisma",
|
||||
"src/app/api/search/ai/route.ts",
|
||||
"src/hooks/useProjects.ts"
|
||||
],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"projects.id",
|
||||
"projects.slug",
|
||||
"external_links.url(type=GITHUB)"
|
||||
],
|
||||
"responseFields": [
|
||||
"projects.githubStars",
|
||||
"projects.githubStarsUpdatedAt"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"GitHub repository API",
|
||||
"projects table",
|
||||
"external_links table"
|
||||
],
|
||||
"downstreams": [
|
||||
"project ranking",
|
||||
"star sorting",
|
||||
"home ranking display"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow reads active project GitHub links from Postgres, fetches repository metadata from GitHub, then writes star counts directly back to Postgres. This bypasses repository API routes."
|
||||
},
|
||||
{
|
||||
"id": "project-description-vectorization",
|
||||
"status": "confirmed",
|
||||
"name": "Project Description Vectorization",
|
||||
"purpose": "Generate and persist project embeddings used by semantic search.",
|
||||
"n8n": {
|
||||
"workflowId": "1AvejnM5n-WPApU1vFt9C",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "every 30 minutes"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"prisma/schema.prisma",
|
||||
"prisma/migrations/20260126000000_add_project_embedding/migration.sql",
|
||||
"src/app/api/search/ai/route.ts"
|
||||
],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"projects.id",
|
||||
"projects.name",
|
||||
"projects.nameEn",
|
||||
"projects.description",
|
||||
"projects.descriptionEn",
|
||||
"projects.content",
|
||||
"projects.contentEn"
|
||||
],
|
||||
"responseFields": [
|
||||
"projects.embedding",
|
||||
"projects.embeddingUpdatedAt"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"SiliconFlow embeddings API",
|
||||
"projects table"
|
||||
],
|
||||
"downstreams": [
|
||||
"RAG项目搜索",
|
||||
"semantic search quality"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow selects active projects with null embeddings, generates `BAAI/bge-m3` vectors, and writes them directly into the `vector` column. This is a direct DB maintenance job, not a repository API route."
|
||||
},
|
||||
{
|
||||
"id": "github-trending-discovery",
|
||||
"status": "external-upstream",
|
||||
"name": "GitHub Trending Discovery",
|
||||
"purpose": "Scrape GitHub Trending, dedupe candidates, filter them with AI, and enqueue project discovery tasks.",
|
||||
"n8n": {
|
||||
"workflowId": "hughGsWismCpk7jd",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "daily at 01:00"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"src/app/api/projects/route.ts",
|
||||
"src/app/api/projects/[slug]/route.ts"
|
||||
],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"GitHub trending repository URL",
|
||||
"apiKey",
|
||||
"tasks[].sourceUrl",
|
||||
"tasks[].sourceType"
|
||||
],
|
||||
"responseFields": [
|
||||
"dedupe shouldCreate",
|
||||
"task creation result"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"https://github.com/trending",
|
||||
"AI keep/discard filter"
|
||||
],
|
||||
"downstreams": [
|
||||
"/api/discovery/check-duplicates",
|
||||
"/api/discovery/tasks",
|
||||
"project ingestion queue"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow scrapes GitHub Trending, filters candidates with an LLM, then posts queued tasks into discovery webhook endpoints. The current repo does not implement `/api/discovery/*`, so treat this as upstream data intake."
|
||||
},
|
||||
{
|
||||
"id": "topic-discovery",
|
||||
"status": "external-upstream",
|
||||
"name": "Topic Discovery",
|
||||
"purpose": "Search GitHub topics and keywords for agent/LLM engineering repos, dedupe them, and enqueue discovery tasks.",
|
||||
"n8n": {
|
||||
"workflowId": "iw9vx9ih5Lt0Mobk",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "schedule",
|
||||
"path": "daily at 01:00"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [
|
||||
"src/app/api/projects/route.ts",
|
||||
"src/app/api/projects/[slug]/route.ts"
|
||||
],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"GitHub search query",
|
||||
"apiKey",
|
||||
"tasks[].sourceUrl",
|
||||
"tasks[].sourceType"
|
||||
],
|
||||
"responseFields": [
|
||||
"dedupe shouldCreate",
|
||||
"task creation result",
|
||||
"low recall alert"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"GitHub Search API",
|
||||
"AI keep/discard filter",
|
||||
"topic watchlist"
|
||||
],
|
||||
"downstreams": [
|
||||
"/api/discovery/check-duplicates",
|
||||
"/api/discovery/tasks",
|
||||
"project ingestion queue"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: workflow searches agent, infra, observability, evaluation, and MCP-related repositories, then posts accepted candidates into discovery webhooks. The current repo does not implement `/api/discovery/*`, so this is upstream context rather than in-repo routing."
|
||||
},
|
||||
{
|
||||
"id": "ai-chat-gateway",
|
||||
"status": "adjacent",
|
||||
"name": "AI Chat Gateway",
|
||||
"purpose": "Expose a chat-oriented webhook wrapper around `RAG项目搜索` and package search hits into chat blocks/citations.",
|
||||
"n8n": {
|
||||
"workflowId": "Rncc22jmHEaYOG58",
|
||||
"exportFile": "",
|
||||
"entrypoints": [
|
||||
{
|
||||
"kind": "webhook",
|
||||
"method": "POST",
|
||||
"path": "agent-park-chat"
|
||||
}
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"consumers": [],
|
||||
"env": [],
|
||||
"schemas": []
|
||||
},
|
||||
"contracts": {
|
||||
"requestFields": [
|
||||
"requestId",
|
||||
"sessionId",
|
||||
"clientId",
|
||||
"locale",
|
||||
"mode",
|
||||
"message"
|
||||
],
|
||||
"responseFields": [
|
||||
"message.blocks",
|
||||
"message.citations",
|
||||
"message.meta.source",
|
||||
"progress.stage"
|
||||
]
|
||||
},
|
||||
"upstreams": [
|
||||
"RAG项目搜索",
|
||||
"n8n webhook `ai-search`"
|
||||
],
|
||||
"downstreams": [
|
||||
"external chat clients",
|
||||
"project detail URLs"
|
||||
],
|
||||
"owners": [],
|
||||
"notes": "Confirmed against live n8n MCP: this workflow is related to Agent Park but does not call a repository route directly. It wraps the RAG webhook and formats citations pointing at project pages."
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user