101 lines
15 KiB
JSON
101 lines
15 KiB
JSON
{
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(mkdir -p /home/chk/Dokumente/brain/.claude/skills/obsidian-markdown/references)",
|
|
"Bash(mkdir -p /home/chk/Dokumente/brain/.claude/skills/obsidian-bases/references)",
|
|
"Bash(mkdir -p /home/chk/Dokumente/brain/.claude/skills/json-canvas/references)",
|
|
"Bash(mkdir -p /home/chk/Dokumente/brain/.claude/skills/obsidian-cli)",
|
|
"Bash(mkdir -p /home/chk/Dokumente/brain/.claude/skills/defuddle)",
|
|
"Write(/home/chk/Dokumente/brain/.claude/skills/jour-fixe.md)",
|
|
"Write(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\commands\\\\meeting.md)",
|
|
"Write(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\commands\\\\meeting-end.md)",
|
|
"Write(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\skills\\\\jour-fixe.md)",
|
|
"Edit(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\skills\\\\jour-fixe.md)",
|
|
"Read(//c/Users/d-chrka/AppData/Roaming/UpNote/UpNote Backup/HtgSdi2hYyUfnYq3OZkBwx13H5q2/Markdown/General Space/**)",
|
|
"Read(//d/projects/brain/05 Daily Notes/**)",
|
|
"Bash(rm -rf \"D:/projects/chrka/brain/05 Daily Notes/_import_test\" && cd \"D:/projects/chrka/brain\" && python scripts/import_journal.py 2>&1 | tail -20)",
|
|
"Bash(mkdir -p \"D:/projects/chrka/brain/03 Bereiche/Familie/Versicherungen\" \"D:/projects/chrka/brain/03 Bereiche/Familie/Haus Buchhagen\")",
|
|
"Bash(mv \"Autoversicherung Hetty.md\" \"Autoversicherung Vera.md\" \"Berufsunfähigkeit & BasisRente \\(Rürup\\).md\" \"CanadaLife Rentenversicherungen.md\" \"Direktversicherung.md\" \"Familienhaftpflicht.md\" \"Gebäudeversicherung.md\" \"Gesetzliche Krankenversicherung.md\" \"Hausrat Hetty.md\" \"Hausrat Kauers.md\" \"Krankenzusatzversicherung & Zahnzusatz Justus.md\" \"Krankenzusatzversicherung Vicky.md\" \"Metallrente.md\" \"Unfallversicherung.md\" \"Union Investment RiesterRente.md\" \"Volkswohlbund Berufsunfähigkeit.md\" \"Zahnzusatzversicherung.md\" \"../Familie/Versicherungen/\")",
|
|
"Bash(cd \"D:/projects/chrka/brain/03 Bereiche/Familie\" && mv \"Auslegung Wechselrichter.md\" \"Klärgrube.md\" \"PV Anlage.md\" \"PV-Anlage neuer Stromzähler.md\" \"Pool.md\" \"Teich-Tagebuch.md\" \"Zapfanlage.md\" \"Haus Buchhagen/\" && ls \"Haus Buchhagen\" && echo \"---\" && ls \"Versicherungen\" | wc -l && echo \"Finanzen:\" && ls \"D:/projects/chrka/brain/03 Bereiche/Finanzen\")",
|
|
"Bash(cd \"D:/projects/chrka/brain\" && for title in \"Netzwerk-Interface\" \"Claude Notes\" \"Koogle\" \"Export Metadaten\" \"Hydra\" \"Fernseher\" \"KERBEROS\" \"Meinolf\" \"DocuWare\" \"Autobatterie\" \"Systemarchitektur\" \"Full Cert Chain\"; do echo \"=== $title ===\"; find . -type f -name \"*.md\" -not -path \"./node_modules/*\" 2>/dev/null | xargs grep -l -i \"$title\" 2>/dev/null | head -3; done)",
|
|
"Bash(cd \"C:\\\\Users\\\\d-chrka\\\\AppData\\\\Roaming\\\\UpNote\\\\UpNote Backup\\\\HtgSdi2hYyUfnYq3OZkBwx13H5q2\\\\Markdown\\\\General Space\" && grep -l \"^# I: \" *.md 2>/dev/null | head -5)",
|
|
"Bash(cd /d D:\\\\projects\\\\chrka\\\\brain && python scripts/import_inventar.py --dry-run)",
|
|
"Read(//d/projects/chrka/myNote/ka-note/server/data/backup-remote/**)",
|
|
"Read(//d/projects/chrka/myNote/ka-note/server/data/**)",
|
|
"Read(//d/projects/chrka/myNote/**)",
|
|
"Bash(sort -t\"'\" -k2)",
|
|
"Bash(mkdir -p /tmp/kan)",
|
|
"Bash(cp 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-shm' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-wal' /tmp/kan/)",
|
|
"Bash(cp 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-shm' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-wal' /c/temp/ 2>&1 || \\(mkdir -p /c/temp && cp 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-shm' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-wal' /c/temp/\\))",
|
|
"Bash(sqlite3 'C:\\\\temp\\\\ka-note.db' '.tables')",
|
|
"Bash(unzip -l backup-remote.zip)",
|
|
"Bash(sqlite3 'C:\\\\temp\\\\ka-note.db' '.recover')",
|
|
"Read(//c/temp/**)",
|
|
"Bash(cp 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-shm' 'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\ka-note.db-wal' /c/temp/ && ls -la /c/temp/ka-note.db*)",
|
|
"Bash(sqlite3 'C:\\\\temp\\\\ka-note.db' '.recover' 2>/dev/null > /c/temp/recovered.sql && wc -l /c/temp/recovered.sql && grep -i \"asset\\\\|room\" /c/temp/recovered.sql | head -5)",
|
|
"Bash(python -X utf8 -c \"\nimport sqlite3,json\nc=sqlite3.connect\\(r'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\data\\\\ka-note.db'\\)\nc.row_factory=sqlite3.Row\npids={r['person_id'] for r in c.execute\\('SELECT DISTINCT person_id FROM asset_persons WHERE deleted_at IS NULL'\\)}\nprint\\('Person IDs in assets:', pids\\)\n# resolve from contexts.json\nctxs=json.load\\(open\\(r'D:\\\\projects\\\\chrka\\\\myNote\\\\ka-note\\\\server\\\\data\\\\backup-remote\\\\contexts.json',encoding='utf-8'\\)\\)\nfor cx in ctxs:\n if cx['id'] in pids:\n print\\(cx['id'],'->',cx['name'],'meta:',\\(cx.get\\('meta'\\) or {}\\).get\\('fullName'\\)\\)\n\")",
|
|
"Bash(python -X utf8 -c \"\nimport os,re\nd=r'D:\\\\projects\\\\chrka\\\\brain\\\\03 Bereiche\\\\Inventar'\nremoved=0\nfor f in os.listdir\\(d\\):\n p=os.path.join\\(d,f\\)\n try:\n head=open\\(p,encoding='utf-8'\\).read\\(500\\)\n except: continue\n if 'kanote-import' in head:\n os.remove\\(p\\); removed+=1\nprint\\('removed notes:',removed\\)\n# wipe attachments/inventar\nad=r'D:\\\\projects\\\\chrka\\\\brain\\\\07 Anhänge\\\\inventar'\ncnt=0\nfor f in os.listdir\\(ad\\):\n os.remove\\(os.path.join\\(ad,f\\)\\); cnt+=1\nprint\\('removed images:',cnt\\)\n\")",
|
|
"Write(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\commands\\\\meeting-manual.md)",
|
|
"Edit(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\commands\\\\meeting-manual.md)",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" add \"docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design.md\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" commit -m \"docs: add meeting-end auto-import design spec\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" commit -m \"docs: add speaker mapping component to meeting-end spec\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" commit -m \"docs: clarify backfill scope and recording link in meeting-end spec\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" add \"docs/superpowers/plans/2026-05-06-meeting-end-auto-import.md\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" commit -m \"docs: add meeting-end auto-import implementation plan\")",
|
|
"Bash(git -C \"D:/projects/chrka/brain\" status -sb)",
|
|
"Bash(node --test test/vtt-parser.test.js)",
|
|
"Bash(npm test *)",
|
|
"Bash(node --test scripts/test/vtt-parser.test.js)",
|
|
"Bash(node --test test/speaker-matcher.test.js)",
|
|
"Bash(node -e ' *)",
|
|
"Bash(node --test test/graph-meetings.test.js)",
|
|
"Bash(node --test test/o365-calendar.test.js)",
|
|
"Bash(cd /d/projects/chrka/brain && git show --stat 997e941)",
|
|
"Bash(cd /d/projects/chrka/brain && git show 997e941)",
|
|
"Read(//d/d/projects/chrka/brain/**)",
|
|
"Bash(cd /d D:\\\\projects\\\\chrka\\\\brain\\\\scripts && node --test test/o365-calendar.test.js)",
|
|
"Bash(cd /D/projects/chrka/brain && git add scripts/lib/o365-calendar.js scripts/test/o365-calendar.test.js && git commit -m \"$\\(cat <<'EOF'\nrefactor\\(o365\\): extract authenticated graph client helper, add getEventById validation\n\nExtract buildAuthenticatedClient\\(\\) helper to eliminate duplicate MSAL token\nacquisition logic in getCalendarEvents and getEventById. Add eventId validation\nand error wrapping with cause chain in getEventById.\n\nNew tests verify eventId type and empty-string checks.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\nEOF\n\\)\")",
|
|
"Bash(cd /d/projects/chrka/brain && git show 51613ff)",
|
|
"Bash(node --test test/fetch-meeting-artifacts.test.js)",
|
|
"Bash(cd \"D:\\\\projects\\\\chrka\\\\brain\" && git add scripts/fetch-meeting-artifacts.js scripts/test/fetch-meeting-artifacts.test.js && git commit -m \"$\\(cat <<'EOF'\nfeat\\(scripts\\): add fetch-meeting-artifacts orchestrator cli\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nEOF\n\\)\")",
|
|
"Bash(cd /d/projects/chrka/brain && git show 15499cf --stat)",
|
|
"Bash(node --test scripts/test/fetch-meeting-artifacts.test.js)",
|
|
"Bash(cd /d/projects/chrka/brain && git show 15499cf)",
|
|
"Bash(node --test test/backfill-series-id.test.js)",
|
|
"Bash(cd \"D:/projects/chrka/brain\" && git add scripts/backfill-series-id.js scripts/test/backfill-series-id.test.js && git commit -m \"$\\(cat <<'EOF'\nfeat\\(scripts\\): add backfill-series-id script for jour-fixe agendas\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nEOF\n\\)\")",
|
|
"Bash(cd /d/projects/chrka/brain && git show 0679aa0 --stat)",
|
|
"Bash(node --test scripts/test/backfill-series-id.test.js)",
|
|
"Bash(node -e \"const m = require\\('./scripts/backfill-series-id.js'\\); console.log\\('Exports:', Object.keys\\(m\\)\\); console.log\\('upsertFrontmatterField:', typeof m.upsertFrontmatterField\\); console.log\\('backfill:', typeof m.backfill\\);\")",
|
|
"Bash(node backfill-series-id.js \"../03 Bereiche/Jour Fixe/IT Team/Agenda IT Team.md\" \"Jour\\\\\\\\s*Fixe.*IT\\\\\\\\s*Team\")",
|
|
"Bash(node -e \"const {getCalendarEvents} = require\\('./lib/o365-calendar.js'\\); getCalendarEvents\\(30\\).then\\(es => { console.log\\(JSON.stringify\\(es.map\\(e => \\({title:e.title, isRecurring:e.isRecurring, start:e.start}\\)\\), null, 2\\)\\); }\\).catch\\(e => console.error\\(e.message\\)\\)\")",
|
|
"Bash(node -e \"const {getCalendarEvents} = require\\('./lib/o365-calendar.js'\\); getCalendarEvents\\(30\\).then\\(es => { const matches = es.filter\\(e => /jour.*fix|IT.Team|landata/i.test\\(e.title\\)\\); console.log\\(JSON.stringify\\(matches.map\\(e => \\({title:e.title, isRecurring:e.isRecurring, id:e.id}\\)\\), null, 2\\)\\); }\\).catch\\(e => console.error\\(e.message\\)\\)\")",
|
|
"Bash(node -e \"const {getCalendarEvents} = require\\('./lib/o365-calendar.js'\\); getCalendarEvents\\(60\\).then\\(es => { const matches = es.filter\\(e => /IT.*Team|landata|losch|brauer|kara|stieve|klein/i.test\\(e.title\\)\\); console.log\\(JSON.stringify\\(matches.map\\(e => \\({title:e.title, isRecurring:e.isRecurring}\\)\\), null, 2\\)\\); console.error\\('total events:', es.length\\); }\\).catch\\(e => console.error\\(e.message\\)\\)\")",
|
|
"Bash(node backfill-series-id.js \"../03 Bereiche/Jour Fixe/LANdata/Agenda LANdata.md\" \"Status.*Meeting.*KRAH.*LANdata\")",
|
|
"Bash(cd D:/projects/chrka/brain && git status && git diff --stat)",
|
|
"Edit(D:\\\\projects\\\\chrka\\\\brain\\\\.claude\\\\commands\\\\meeting.md)",
|
|
"Bash(node backfill-series-id.js \"../03 Bereiche/Jour Fixe/IT Team/Agenda IT Team.md\" \"diverse.IT.Themen\")",
|
|
"Bash(cd D:/projects/chrka/brain && git add \"03 Bereiche/Jour Fixe/IT Team/Agenda IT Team.md\" && git commit -m \"feat\\(jour-fixe\\): backfill o365_series_id for IT Team\" && git push origin main 2>&1)",
|
|
"Bash(node fetch-meeting-artifacts.js --o365-id \"AAMkADM1ZWEzODc3LTRjMTEtNGExYi04MGMwLWNhZTE0ZjkyNDVjOAFRAAgI3qsCaprAAEYAAAAAMySJViLo9EWl32JswSRPzgcA4E3NSW0FuEieq6kPTtaG_AAAAAABDQAADcgZwJ68IkWODv1ql-eWvQAGRrSRngAAEA==\" --out ./test-fetch.json)",
|
|
"Bash(node -e \"const j=require\\('./test-fetch.json'\\); console.log\\('transcript:', j.transcript?j.transcript.slice\\(0,200\\)+'...':'null'\\); console.log\\('recap:', j.recap?'YES \\(id='+j.recap.id+'\\)':'null'\\); console.log\\('recordingUrl:', j.recordingUrl\\); console.log\\('warnings:', j.warnings\\);\")",
|
|
"Bash(node -e \"const j=require\\('./test-fetch.json'\\); console.log\\('onlineMeetingId:', j.meeting?.onlineMeetingId\\); console.log\\('transcript:', j.transcript?j.transcript.length+' chars':'null'\\); console.log\\('recap:', j.recap?'YES \\(id='+j.recap.id+'\\)':'null'\\); console.log\\('recordingUrl:', j.recordingUrl\\); console.log\\('warnings:', j.warnings\\);\")",
|
|
"Bash(node -e \"const j=require\\('./test-fetch.json'\\); console.log\\('transcript:', j.transcript?j.transcript.length+' chars / '+j.transcript.split\\('\\\\n'\\).length+' lines':'null'\\); console.log\\('recap:', j.recap?'YES \\(id='+j.recap.id+'\\)':'null'\\); console.log\\('recordingUrl:', j.recordingUrl\\); console.log\\('warnings:', j.warnings\\); if\\(j.transcript\\) console.log\\('--- first 400 chars ---\\\\n'+j.transcript.slice\\(0,400\\)\\);\")",
|
|
"Bash(node -e \"const j=require\\('./test-fetch.json'\\); console.log\\('transcript:', j.transcript?j.transcript.length+' chars':'null'\\); console.log\\('recap:', j.recap?'YES \\(id='+j.recap.id+', notes:'+\\(j.recap.meetingNotes?.length||0\\)+', actions:'+\\(j.recap.actionItems?.length||0\\)+'\\)':'null'\\); console.log\\('recordingUrl:', j.recordingUrl\\); console.log\\('warnings:', j.warnings\\); if\\(j.recap\\) console.log\\('--- recap keys ---', Object.keys\\(j.recap\\)\\);\")",
|
|
"Bash(node -e \"const j=require\\('./test-fetch.json'\\); console.log\\('transcript:', j.transcript?.length, 'chars'\\); const r=j.recap; if\\(r.insights\\){console.log\\('recap: '+r.insights.length+' insights, total notes:', r.insights.reduce\\(\\(s,i\\)=>s+\\(i.meetingNotes?.length||0\\),0\\), 'actions:', r.insights.reduce\\(\\(s,i\\)=>s+\\(i.actionItems?.length||0\\),0\\)\\);} else { console.log\\('recap: notes:', r.meetingNotes?.length, 'actions:', r.actionItems?.length\\); } console.log\\('recordingUrl:', j.recordingUrl\\); console.log\\('warnings:', j.warnings\\);\")",
|
|
"Bash(rm D:/projects/chrka/brain/scripts/test-fetch.json 2>/dev/null; cd D:/projects/chrka/brain && git add scripts/lib/graph-meetings.js scripts/fetch-meeting-artifacts.js scripts/test/graph-meetings.test.js && git status)",
|
|
"Bash(git -C D:/projects/chrka/brain status --short)",
|
|
"Bash(ls scripts/test-recording-*.json)",
|
|
"Bash(node -e \"console.log\\(new Date\\(\\).toISOString\\(\\)\\)\")",
|
|
"Bash(node scripts/fetch-meeting-artifacts.js --o365-id \"AAMkADM1ZWEzODc3LTRjMTEtNGExYi04MGMwLWNhZTE0ZjkyNDVjOAFRAAgI3qsCaprAAEYAAAAAMySJViLo9EWl32JswSRPzgcA4E3NSW0FuEieq6kPTtaG_AAAAAABDQAADcgZwJ68IkWODv1ql-eWvQAAj7FwfQAAEA==\" --out scripts/test-recording.json)",
|
|
"Bash(node -e \"const r = require\\('./scripts/test-recording.json'\\); console.log\\('recordingUrl:', r.recordingUrl\\); console.log\\('transcript len:', r.transcript ? r.transcript.length : null\\); console.log\\('recap:', r.recap ? 'present' : null\\); console.log\\('warnings:', r.warnings\\);\")"
|
|
]
|
|
},
|
|
"ms365-calendar": {
|
|
"command": "bash",
|
|
"args": [
|
|
"-c",
|
|
"TOKEN=$(curl -s -X POST 'https://login.microsoftonline.com/94cf90d7-e9ff-49a1-bc3b-a5b94d3cc8ca/oauth2/v2.0/token' -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=client_credentials&client_id=93f9f15c-b566-4ca1-9145-c23f87c7f5c7&client_secret=Gpm8Q~5QKks3jYrbIkTM54AHmnZPC3a8RDc1Xam.&scope=https://graph.microsoft.com/.default' | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d.get('access_token',''))\") && MS365_MCP_OAUTH_TOKEN=$TOKEN npx -y @softeria/ms-365-mcp-server --preset calendar --read-only"
|
|
]
|
|
}
|
|
}
|