Add Claude memory store synced via Gitea

Move ~/.claude/projects/U--janssen/memory into repo (claude-memory/)
linked back via a directory junction so memory persists across machines.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 22:57:44 +02:00
parent f11d407b73
commit 2d65ad2988
8 changed files with 200 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
# Memory Index
- [Pracovat v maintree](feedback_worktree.md) — vždy pracuj v `U:/janssen/`, ne ve worktree větvích
- [Projekt Covance UCO3001](project_covance.md) — report vzorků studie 77242113UCO3001, skript `create_report.py`, zdroj + logika OK statusů
- [EDC import do MongoDB](project_edc_mongo.md) — skript `medidata/edc_import.py`, import Data Listing + QueryDetails CSV do MongoDB (192.168.1.76), kolekce `queries` + `queries_snapshots` pro tracking vývoje queries v čase
- [Dropbox file transfer](project_dropbox_file_transfer.md) — přenos souborů z JNJ PC do Dropboxu přes msgreceiver kontejner na Unraidu
- [Graph email import](project_graph_email_import.md) — import JNJ emailů do schránky vladimir.buzalka@buzalka.cz přes Graph API
+11
View File
@@ -0,0 +1,11 @@
---
name: Pracovat v maintree
description: Uživatel preferuje práci v hlavním repozitáři, ne ve worktree
type: feedback
---
Vždy pracuj přímo v hlavním repozitáři (`U:/janssen/`), ne ve worktree větvích.
**Why:** Uživateli to nevadí a je to jednodušší — vyhneme se problémům jako spouštění skriptů se starými cestami z worktree.
**How to apply:** Soubory čti a edituj z `U:/janssen/`, skripty spouštěj přímo odtud.
+26
View File
@@ -0,0 +1,26 @@
---
name: Projekt Covance UCO3001
description: Klinická studie 77242113UCO3001 — generování přehledového reportu vzorků
type: project
---
Skript `U:/janssen/Covance_UCO3001/create_report.py` generuje xlsx report ze vzorků Covance.
**Zdroj dat:**
- `Protocol 77242113UCO3001 - All Samples.xlsx` — hlavní zdroj vzorků (header=0, sloupec pacienta = `Patient No.`)
- `_EDCStdRpt-DataListing.csv` — návštěvy pacientů pro list "Seznam pacientů"
**Výstup:** `U:/Dropbox/!!!Days/Downloads Z230/YYYY-MM-DD 77242113UCO3001 Speciment Inventory report.xlsx`
**Struktura výstupního souboru:**
1. List **"Zdroj"** — kopie zdrojového xlsx, sloupce autofitnuté
2. List **"Přehled vzorků"** — přehled vzorků per pacient (BXSCR screening + visity I-0, I-2, I-4) s hyperlinkami do Zdroje
3. List **"Seznam pacientů"** — návštěvy z CSV
**Klíčová logika:**
- Zelená buňka (OK) = Sample Status je `Received`, `In Inventory` nebo `Shipped`
- Červená buňka = vše ostatní (Not Received, Cancelled, Removed) nebo chybějící záznam
- Excel row offset = index + 2 (header v řádku 1)
- `get_specimen_info` i `get_label_info` filtrují pouze OK_STATUSES
**Why:** Původní soubor `3001Specimeninventoryreport_30c1e108.xlsx` byl nahrazen novým `Protocol 77242113UCO3001 - All Samples.xlsx`, který má header v řádku 1 a jiný název sloupce pacienta.
@@ -0,0 +1,24 @@
---
name: dropbox-file-transfer
description: Přenos souborů z JNJ počítače do Dropboxu přes msgreceiver Docker kontejner na Unraidu
metadata:
node_type: memory
type: project
originSessionId: a5eaa623-110f-4feb-b3c0-46457c93d222
---
Systém pro přenos souborů z JNJ počítače do Dropboxu (`/!!!Days/Downloads Z230/`).
Kontejner msgreceiver nyní také importuje JNJ emaily do Graph API — viz [[graph-email-import]].
**Architektura:**
- `EmailsImport/janssenpc_file_send.py` — běží na JNJ PC, čte soubory z `C:\Users\vbuzalka\OneDrive - JNJ\##JNJPrenos\`, posílá je na `https://msgs.buzalka.cz/upload-dropbox`, po úspěšném uploadu maže
- `EmailsImport/DockerCustomApp/app.py` — FastAPI kontejner `msgreceiver` na Unraidu (192.168.1.76:8765), endpoint `/upload-dropbox` nahrává soubory přes Dropbox API
- Dropbox credentials (APP_KEY, APP_SECRET, REFRESH_TOKEN) jsou v `.env` uvnitř Docker image
- Kontejner config: volume `/mnt/user/JNJEMAILS:/msgs`, port 8765, restart unless-stopped
- Unraid appdata: `\\tower\appdata\msgreceiver\` (`/mnt/user/appdata/msgreceiver/`)
**Why:** JNJ počítač nemá přímý přístup k Dropboxu, přenos jde přes Unraid jako prostředníka.
**How to apply:** Při změnách v `DockerCustomApp/` je potřeba rebuild image na Unraidu (SSH root@192.168.1.76, heslo v BUILD.md). Postup: SFTP upload souborů → `docker build``docker stop/rm/run`. Bez redeploye se změny neprojeví (2026-05-29: 442 .db souborů se nehromadilo kvůli chybějícímu redeployi). Refresh token z `10 GetOneTimeDropBoxAuth.py` platí dokud se appka neodvolá.
Souvisí s [[edc-mongo-import]] — stejný Docker server.
+92
View File
@@ -0,0 +1,92 @@
# Projekt: Import EDC reportů do MongoDB
## Stav: rozpracováno (2026-05-20)
## Co je hotovo
### Skript `U:/janssen/medidata/edc_import.py`
- Import CSV reportů z Medidata Rave EDC do MongoDB
- Spuštění: `python edc_import.py downloads/*.csv`
- Default MongoDB: `mongodb://192.168.1.76:27017` (bez autentikace)
- Default databáze: `edc`
- Parametry: `--host`, `--db`
### Dva typy CSV souborů — skript je detekuje automaticky
**1. Data Listing reporty** (mají příponu `_DataListing.csv`)
- Sloupce: pevná metadata + Field1Value/Field1Label … Field300Value/Field300Label
- Kolekce: odvozena z názvu souboru mezi `EDC_` a `_DataListing`
- např. `MDD3003_DateofVisit`, `MDD3003_InterimInvestigatorSignature`
- Upsert klíč: `form.recordId`
- Struktura dokumentu: `study`, `site{}`, `subject{}`, `form{}`, `fields{}`, `lastModified`, `importedAt`, `sourceFile`, `_meta{}`
- Importováno a otestováno: `MDD3003_DateofVisit` (381 záznamů)
**2. QueryDetails reporty** (mají sloupec `QueryID(ReQry)`)
- Kolekce: vždy `queries` (všechny studie dohromady)
- Upsert klíč: `queryId`
- Struktura dokumentu: `study`, `site{}`, `subject{}`, `visit`, `page`, `field`, `queryGroup`, `queryId`, `queryStatus`, `openedBy/Date`, `answeredBy/Date`, `closedBy/Date`, `daysNotYetClosed`, `daysToAnswer`, `daysToClose`, `queryText`, `answerText`, `importedAt`, `sourceFile`, `_meta{}`
- Importováno: 2091 queries (MDD3003, stav 2026-05-20)
### Daily snapshots pro queries
- Kolekce: `queries_snapshots`
- Každý import QueryDetails zapíše i snapshot s `snapshotDate` (datum ze jména souboru)
- Upsert klíč: `(queryId, snapshotDate)` — žádné duplikáty, bezpečný reimport
- Účel: sledování vývoje statusů v čase (Open → Answered → Closed → requeried)
- Objem: ~3000 queries × 365 dní × 2 roky ≈ 2M dokumentů — MongoDB zvládá
### Logika pro QueryDetails se dvěma soubory
Každý den se stahují dva soubory:
- Menší: pouze Open + Answered queries
- Větší: všechny queries včetně Closed
Oba se importují — upsert na `queryId` zajistí, že každá query je v `queries` jednou.
Menší soubor je podmnožina většího → výsledek je vždy kompletní sada.
### Indexy
**queries:**
- `queryId` (unique)
- `subject.label`, `site.number`, `queryStatus`, `openedDate`
**queries_snapshots:**
- `(queryId, snapshotDate)` (unique)
- `snapshotDate`, `queryStatus`, `site.number`, `subject.label`
**Data Listing kolekce:**
- `form.recordId` (unique, sparse)
- `subject.id`, `site.id`, `study`, `lastModified`
## Co zbývá udělat
- [ ] Importovat zbývající soubory ze složky `downloads`
- [ ] Nastavit zálohování MongoDB (obdoba `mysqldump``mongodump`)
- [ ] Případně naplánovat automatické denní stahování + import
## Příklady dotazů
```js
// Aktuální open queries
db.queries.find({ queryStatus: "Open" })
// Trend open queries v čase
db.queries_snapshots.aggregate([
{ $match: { queryStatus: "Open" } },
{ $group: { _id: "$snapshotDate", count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
])
// Historie statusů jedné query
db.queries_snapshots.find(
{ queryId: "20915933" },
{ snapshotDate: 1, queryStatus: 1 }
).sort({ snapshotDate: 1 })
// Queries pacienta
db.queries.find({ "subject.label": "CZ100040001" })
// Všechny záznamy ze site
db.MDD3003_DateofVisit.find({ "site.number": "S10-CZ10004" })
```
## Soubory
- Skript: `U:/janssen/medidata/edc_import.py`
- Log: `U:/janssen/medidata/edc_import.log`
- Stažené CSV: `U:/janssen/medidata/downloads/`
@@ -0,0 +1,40 @@
---
name: graph-email-import
description: Import JNJ emailů do schránky vladimir.buzalka@buzalka.cz přes Microsoft Graph API
metadata:
node_type: memory
type: project
originSessionId: current
---
Import emailů z JNJ Outlook schránky do osobní schránky `vladimir.buzalka@buzalka.cz` přes Microsoft Graph API.
**Architektura:**
- `EmailsImport/janssenpc_email_send_new_v1.4.py` — běží na JNJ PC, posílá .msg + `folder` parametr (plná cesta, např. `/vbuzalka@its.jnj.com/Inbox/TMP`) na `https://msgs.buzalka.cz/upload`
- `EmailsImport/DockerCustomApp/app.py` v1.3 — FastAPI kontejner `msgreceiver` na Unraidu, při příjmu .msg s `folder`:
1. Uloží .msg na disk (jako dřív)
2. Parsuje .msg (extract_msg) — subject, body, from, to, cc, datum, přílohy
3. Mapuje JNJ folder cestu na Graph folder pod `Inbox/JNJ/...`
4. Vytváří chybějící složky automaticky
5. Importuje email přes Graph API jako přijatý (ne draft — MAPI property `PR_MESSAGE_FLAGS 0x0E07 = 1`)
- Bez `folder` parametru (starý klient) — email se uloží na disk ale neimportuje do Graph (zpětná kompatibilita)
**Mapování složek:**
- `/vbuzalka@its.jnj.com/Inbox``Inbox/JNJ/Inbox`
- `/vbuzalka@its.jnj.com/Sent Items``Inbox/JNJ/Sent Items`
- `/vbuzalka@its.jnj.com/Inbox/TMP``Inbox/JNJ/Inbox/TMP`
- `/Online Archive - vbuzalka@its.jnj.com/Inbox``Inbox/JNJ/Online Archive/Inbox`
**Azure AD App (PythonMailer):**
- Tenant: `7d269944-37a4-43a1-8140-c7517dc426e9` (TrialHelp s.r.o.)
- Client ID: `4b222bfd-78c9-4239-a53f-43006b3ed07f`
- Permissions: Mail.Send (Application), Mail.ReadWrite (Application), User.Read (Delegated) — all granted
- Credentials v app.py (Docker image), NE na JNJ PC
**Logování na JNJ PC:**
- `C:\Users\vbuzalka\SQLITE\jnjemails_uploads.log` — každý upload (filename, folder, response)
- `C:\Users\vbuzalka\SQLITE\jnjemails_errors.log` — chyby
**Staré emaily (69k):** zatím neimportovány, plánován jednorázový batch import.
Souvisí s [[dropbox-file-transfer]] — stejný Docker kontejner msgreceiver.