- 레거시 .md 2건(slack_basic_dialogue, service_health_check)을 _archive/로 이동 - n8n .json 파일 18건을 _archive/로 이동 - README.md 전면 재작성: n8n 전제 제거, 현행 아키텍처(APScheduler DB + SKILL.md) 반영 - 구 IP(192.168.219.52)를 localhost로 교체 (infrastructure-ssot-principle 준수) Refs: DOCS#8 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
340 lines
8.1 KiB
JSON
340 lines
8.1 KiB
JSON
{
|
|
"name": "robeing-github-service-request",
|
|
"nodes": [
|
|
{
|
|
"parameters": {
|
|
"httpMethod": "POST",
|
|
"path": "skills/github/request",
|
|
"responseMode": "responseNode",
|
|
"options": {}
|
|
},
|
|
"id": "gh-req-001",
|
|
"name": "Webhook In",
|
|
"type": "n8n-nodes-base.webhook",
|
|
"typeVersion": 1,
|
|
"position": [200, 260]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const body = $json.body || {};\nreturn {\n intent: body.intent || '',\n slots: body.slots || {},\n user_id: body.user_id || '',\n channel: body.channel || 'slack',\n robeing_id: body.robeing_id || 'rb8001'\n};"
|
|
},
|
|
"id": "gh-req-002",
|
|
"name": "Normalize Payload",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [440, 260]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const validIntents = new Set(['github_analyze', 'github_manage', 'git_ops']);\nreturn {\n ...$json,\n valid_intent: validIntents.has($json.intent)\n};"
|
|
},
|
|
"id": "gh-req-003",
|
|
"name": "Validate Intent",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [700, 260]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"boolean": [
|
|
{
|
|
"value1": "={{ $json.valid_intent }}"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "gh-req-004",
|
|
"name": "Intent OK?",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2,
|
|
"position": [940, 260]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const slots = $json.slots || {};\nconst risk = slots.risk_level || 'low';\nconst requiresConfirmation = Boolean(slots.requires_confirmation);\nconst criticalActions = new Set(['force_push', 'reset_hard', 'delete_branch', 'delete_release']);\nconst action = slots.action || '';\nreturn {\n ...$json,\n risk_level: risk,\n denied: criticalActions.has(action) || risk === 'critical',\n requires_confirmation: requiresConfirmation || risk === 'high'\n};"
|
|
},
|
|
"id": "gh-req-005",
|
|
"name": "Risk Decision",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [1180, 260]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"boolean": [
|
|
{
|
|
"value1": "={{ $json.denied }}"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "gh-req-006",
|
|
"name": "Denied?",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2,
|
|
"position": [1420, 180]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"boolean": [
|
|
{
|
|
"value1": "={{ $json.requires_confirmation }}"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "gh-req-007",
|
|
"name": "Needs Confirmation?",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2,
|
|
"position": [1420, 360]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"string": [
|
|
{
|
|
"value1": "={{ $json.intent }}",
|
|
"operation": "equals",
|
|
"value2": "github_analyze"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "gh-req-008",
|
|
"name": "Route Analyze",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2,
|
|
"position": [1660, 500]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"string": [
|
|
{
|
|
"value1": "={{ $json.intent }}",
|
|
"operation": "equals",
|
|
"value2": "github_manage"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "gh-req-009",
|
|
"name": "Route Manage",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2,
|
|
"position": [1900, 560]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: false, message: 'unknown_intent', intent: $json.intent } }}"
|
|
},
|
|
"id": "gh-req-010",
|
|
"name": "Reject Unknown Intent",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [1180, 420]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: false, message: 'critical_action_denied', intent: $json.intent, slots: $json.slots } }}"
|
|
},
|
|
"id": "gh-req-011",
|
|
"name": "Reject Critical",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [1660, 120]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: false, message: 'confirmation_required', intent: $json.intent, slots: $json.slots } }}"
|
|
},
|
|
"id": "gh-req-012",
|
|
"name": "Return Confirmation",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [1660, 320]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: true, dispatch: 'analyze_target', intent: $json.intent, slots: $json.slots } }}"
|
|
},
|
|
"id": "gh-req-013",
|
|
"name": "Dispatch Analyze",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [1900, 460]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: true, dispatch: 'manage_resource', intent: $json.intent, slots: $json.slots } }}"
|
|
},
|
|
"id": "gh-req-014",
|
|
"name": "Dispatch Manage",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [2140, 520]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"respondWith": "json",
|
|
"responseBody": "={{ { success: true, dispatch: 'run_git_operation', intent: $json.intent, slots: $json.slots } }}"
|
|
},
|
|
"id": "gh-req-015",
|
|
"name": "Dispatch Git Ops",
|
|
"type": "n8n-nodes-base.respondToWebhook",
|
|
"typeVersion": 1,
|
|
"position": [2140, 620]
|
|
}
|
|
],
|
|
"connections": {
|
|
"Webhook In": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Normalize Payload",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Normalize Payload": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Validate Intent",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Validate Intent": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Intent OK?",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Intent OK?": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Risk Decision",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Reject Unknown Intent",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Risk Decision": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Denied?",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Denied?": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Reject Critical",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Needs Confirmation?",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Needs Confirmation?": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Return Confirmation",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Route Analyze",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Route Analyze": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Dispatch Analyze",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Route Manage",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Route Manage": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Dispatch Manage",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Dispatch Git Ops",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"pinData": {},
|
|
"meta": {
|
|
"templateCredsSetupCompleted": true,
|
|
"instanceId": "robeing-skills"
|
|
}
|
|
}
|