1 line
5.5 KiB
JSON
1 line
5.5 KiB
JSON
[{"updatedAt":"2026-05-14T21:36:33.337Z","createdAt":"2026-05-14T21:36:33.337Z","id":"UWLMOQQVxbTX6Sis","name":"Obsidian Weekly Decision Runbook Extractor","description":null,"active":true,"isArchived":false,"nodes":[{"parameters":{},"id":"f0b1fc1f-e1d9-4529-a1a2-b04bb942472f","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0]},{"parameters":{"rule":{"interval":[{"field":"weeks","triggerAtDay":[1],"triggerAtHour":8,"triggerAtMinute":0}]}},"id":"259798b5-2bff-4ec3-8b75-39353c053576","name":"Weekly Monday 08:00 PT","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[0,180]},{"parameters":{"jsCode":"\nreturn ['we decided','decision','runbook','procedure','rollback','workaround','root cause','next time'].map(query => ({json:{query}}));\n"},"id":"b8e28ca5-1d19-4e53-97c2-c3b1c88b2102","name":"Build Search Queries","type":"n8n-nodes-base.code","typeVersion":2,"position":[280,80]},{"parameters":{"method":"POST","url":"={{'http://172.19.0.1:27123/search/simple/?query=' + encodeURIComponent($json.query) + '&contextLength=300'}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"ef1d4e75-5a9d-42bf-8c46-646b94c16da3","name":"Search Obsidian","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[560,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}},"continueOnFail":true},{"parameters":{"jsCode":"\nconst now = new Date(); const date = now.toISOString().slice(0,10);\nconst rows=[];\nfor (const item of $input.all()) {\n const arr = Array.isArray(item.json) ? item.json : (Array.isArray(item.json.body) ? item.json.body : (Array.isArray(item.json.results) ? item.json.results : []));\n for (const r of arr) {\n const filename = r.filename || r.path || 'Unknown';\n const matches = Array.isArray(r.matches) ? r.matches : [];\n for (const m of matches) rows.push({filename, context:String(m.context||'').replace(/\\s+/g,' ').trim()});\n }\n}\nconst seen = new Set();\nconst uniq = rows.filter(r => { const k=r.filename+'|'+r.context.slice(0,100); if (seen.has(k)) return false; seen.add(k); return true; }).slice(0,60);\nconst decisionRe = /\\b(decision|decided|choose|chosen|because|tradeoff|approved|rejected)\\b/i;\nconst runbookRe = /\\b(runbook|procedure|steps|incident|fix|workaround|deploy|rollback|recovery|restart|root cause|next time)\\b/i;\nfunction section(title, arr, kind){\n if (!arr.length) return `## ${title}\\n\\n_No candidates found._\\n`;\n return `## ${title}\\n\\n` + arr.slice(0,20).map((r,i)=>`### ${i+1}. ${r.filename}\\n\\n- Suggested action: create/update a ${kind}.\\n- Source: [[${r.filename.replace(/\\.md$/,'')}]]\\n- Evidence: ${r.context.slice(0,700)}\\n`).join('\\n');\n}\nconst decisions=uniq.filter(r=>decisionRe.test(r.context));\nconst runbooks=uniq.filter(r=>runbookRe.test(r.context));\nconst body = `# Decision / Runbook Suggestions ${date}\\n\\nGenerated: ${now.toISOString()}\\n\\nReview candidates and promote useful items into durable Decision or Runbook notes. This note is overwritten weekly.\\n\\n${section('Decision Candidates', decisions, 'Decision note')}\\n\\n${section('Runbook Candidates', runbooks, 'Runbook note')}\\n\\n## Raw Summary\\n\\n- Total candidates: ${uniq.length}\\n- Decision candidates: ${decisions.length}\\n- Runbook candidates: ${runbooks.length}\\n`;\nreturn [{json:{path:'Decisions/Runbook Suggestions.md', body, total:uniq.length}}];\n","mode":"runOnceForAllItems"},"id":"6862ae15-2c5d-4805-9009-b3e72861be8e","name":"Build Suggestions Note","type":"n8n-nodes-base.code","typeVersion":2,"position":[840,80]},{"parameters":{"method":"PUT","url":"={{'http://172.19.0.1:27123/vault/' + encodeURIComponent($json.path).replace(/%2F/g, '/')}}","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"text/markdown"}]},"sendBody":true,"contentType":"raw","rawContentType":"text/markdown","body":"={{$json.body}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"cbab2fb9-c980-4c92-8450-f36885727a86","name":"Write Suggestions Note","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1120,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}}}],"connections":{"Manual Trigger":{"main":[[{"node":"Build Search Queries","type":"main","index":0}]]},"Weekly Monday 08:00 PT":{"main":[[{"node":"Build Search Queries","type":"main","index":0}]]},"Build Search Queries":{"main":[[{"node":"Search Obsidian","type":"main","index":0}]]},"Search Obsidian":{"main":[[{"node":"Build Suggestions Note","type":"main","index":0}]]},"Build Suggestions Note":{"main":[[{"node":"Write Suggestions Note","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":{"node:Weekly Monday 08:00 PT":{"recurrenceRules":[]}},"meta":null,"pinData":null,"versionId":"d8e576e0-22e5-455a-95ce-1f20b443cc61","activeVersionId":"d8e576e0-22e5-455a-95ce-1f20b443cc61","versionCounter":4,"triggerCount":1,"tags":[],"shared":[{"updatedAt":"2026-05-14T21:36:33.340Z","createdAt":"2026-05-14T21:36:33.340Z","role":"workflow:owner","workflowId":"UWLMOQQVxbTX6Sis","projectId":"WGdp8QunI1tHpjXa","project":{"updatedAt":"2026-03-11T21:08:10.005Z","createdAt":"2026-03-11T21:05:11.541Z","id":"WGdp8QunI1tHpjXa","name":"will will <will@wills-portal.com>","type":"personal","icon":null,"description":null,"creatorId":"5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"}}],"versionMetadata":{"name":null,"description":null}}] |