@campfire-app/cli 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +20589 -0
- package/package.json +48 -4
- package/templates/.claude/agents/domain.md +32 -0
- package/templates/.claude/settings.json +39 -0
- package/templates/.mcp.json +11 -0
- package/templates/CLAUDE.md +56 -0
- package/templates/README.md +110 -0
- package/templates/contracts/.gitkeep +0 -0
- package/templates/docs/hub/architecture.md +31 -0
- package/templates/docs/hub/conventions.md +33 -0
- package/templates/docs/hub/decisions/.gitkeep +0 -0
- package/templates/docs/hub/domain.md +134 -0
- package/templates/docs/hub/zadani.md +7 -0
- package/README.md +0 -3
package/package.json
CHANGED
|
@@ -1,6 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@campfire-app/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Campfire CLI — hooky Claude Code ho volají místo curl (brief, check-file, stop-summary).",
|
|
6
|
+
"bin": {
|
|
7
|
+
"campfire": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"templates"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "node scripts/build.mjs",
|
|
15
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
16
|
+
"dev": "tsx --conditions=development src/index.ts",
|
|
17
|
+
"prepublishOnly": "node scripts/build.mjs"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"commander": "^15.0.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"esbuild": "^0.28.2",
|
|
24
|
+
"tsx": "^4.23.15",
|
|
25
|
+
"@campfire/shared": "workspace:*"
|
|
26
|
+
},
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/TotallyNotApi/campfire.git",
|
|
31
|
+
"directory": "packages/cli"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/TotallyNotApi/campfire#readme",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/TotallyNotApi/campfire/issues"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"claude-code",
|
|
39
|
+
"mcp",
|
|
40
|
+
"agents",
|
|
41
|
+
"campfire",
|
|
42
|
+
"hooks"
|
|
43
|
+
],
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=22"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: domain
|
|
3
|
+
description: Onkologická doména — TNM, ICD-O-3, MKN-10, morfologie, biomarkery, pole REDCapu. Použij, když potřebuješ vysvětlit nebo validovat doménový pojem, místo abys ho hádal.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Doménový agent
|
|
7
|
+
|
|
8
|
+
Tvoje jediná znalostní báze je `docs/hub/domain.md` v tomhle repu. Přečti si ho
|
|
9
|
+
vždy na začátku, než odpovíš.
|
|
10
|
+
|
|
11
|
+
## Pravidla
|
|
12
|
+
|
|
13
|
+
1. **Odpovídej jen to, co stojí v `docs/hub/domain.md`.** Když tam odpověď není,
|
|
14
|
+
řekni to výslovně a zavolej `hub_ask(tag="domain")`. Odpověď dá medik nebo
|
|
15
|
+
mentor a při příštím startu ji budeš mít.
|
|
16
|
+
|
|
17
|
+
2. **Nikdy si nedomýšlej kódy ani jména polí.** Konkrétní kód ICD-O, hodnotu
|
|
18
|
+
TNM nebo jméno pole v REDCapu buď víš z `domain.md`, nebo ne. Vymyšlený kód
|
|
19
|
+
projde validací a rozbije export.
|
|
20
|
+
|
|
21
|
+
3. **U každé odpovědi uveď, odkud je** — sekce `domain.md`, nebo „odpověď
|
|
22
|
+
mentora z <datum>“.
|
|
23
|
+
|
|
24
|
+
4. **Rozlišuj klinickou a patologickou klasifikaci.** `cT2` a `pT2` nejsou
|
|
25
|
+
totéž a v extrakci se nesmí slít.
|
|
26
|
+
|
|
27
|
+
5. **Stadium neodvozuj z TNM, dokud nemáš tabulku pro tu konkrétní diagnózu.**
|
|
28
|
+
Pravidla se mezi diagnózami liší.
|
|
29
|
+
|
|
30
|
+
## Co nedělat
|
|
31
|
+
|
|
32
|
+
Nepiš kód a needituj soubory. Jsi slovník, ne vrstva.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "campfire brief",
|
|
9
|
+
"timeout": 10,
|
|
10
|
+
"statusMessage": "Campfire brief"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"PreToolUse": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "Edit|Write|MultiEdit",
|
|
18
|
+
"hooks": [
|
|
19
|
+
{
|
|
20
|
+
"type": "command",
|
|
21
|
+
"command": "campfire check-file",
|
|
22
|
+
"timeout": 5
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"Stop": [
|
|
28
|
+
{
|
|
29
|
+
"hooks": [
|
|
30
|
+
{
|
|
31
|
+
"type": "command",
|
|
32
|
+
"command": "campfire stop-summary",
|
|
33
|
+
"timeout": 15
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Projekt
|
|
2
|
+
|
|
3
|
+
@docs/hub/zadani.md
|
|
4
|
+
@docs/hub/architecture.md
|
|
5
|
+
@docs/hub/domain.md
|
|
6
|
+
@docs/hub/conventions.md
|
|
7
|
+
|
|
8
|
+
## Stack a příkazy
|
|
9
|
+
|
|
10
|
+
<!-- Doplň v pátek dopoledne, až bude jasné, co stavíme. -->
|
|
11
|
+
|
|
12
|
+
| Co | Příkaz |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| Testy | `TODO` |
|
|
15
|
+
| Lint | `TODO` |
|
|
16
|
+
| Dev server | `TODO` |
|
|
17
|
+
|
|
18
|
+
## Campfire
|
|
19
|
+
|
|
20
|
+
Tenhle repo sdílí čtyři agenti. Stav drží Campfire — MCP server, který máš
|
|
21
|
+
připojený jako `campfire`. Hooky ti samy stáhnou brief na začátku session a
|
|
22
|
+
vyžádají si status na konci, takže na hub nemusíš myslet. Čtyři pravidla ale
|
|
23
|
+
hooky nenahradí:
|
|
24
|
+
|
|
25
|
+
1. **`hub_claim` jen na to, co je sdílené — ne na svou vrstvu.** `contracts/`,
|
|
26
|
+
konfiguraci, `scripts/`. Vrstvy jsou disjunktní, takže claim na vlastní
|
|
27
|
+
modul je obřad bez odměny; kolize nastane přesně ve sdílených souborech,
|
|
28
|
+
kde dva lidi legitimně potřebují sáhnout. Claim je cesta nebo glob, např.
|
|
29
|
+
`contracts/**` nebo `scripts/synth.py`. Když vrátí konflikt, soubor právě
|
|
30
|
+
drží někdo jiný — napiš mu `hub_post` nebo si vyber jinou práci. Na konci
|
|
31
|
+
`hub_release`.
|
|
32
|
+
|
|
33
|
+
**Cizí vrstvu needituj na vlastní pěst**, ani když na ní není claim —
|
|
34
|
+
claimy na vrstvy záměrně nejsou, takže tě hook nezastaví. Potřebuješ-li
|
|
35
|
+
tam změnu, napiš `hub_post` vlastníkovi.
|
|
36
|
+
|
|
37
|
+
**Co vrací cizí vrstva, si přečti v `contracts/`, neptej se kolegy.** Když
|
|
38
|
+
to tam není, je to chyba kontraktu — ohlas ji přes `hub_contract_change`.
|
|
39
|
+
|
|
40
|
+
2. **Pokud si nejsi jistý doménovým pojmem, zavolej `hub_ask(tag="domain")` a
|
|
41
|
+
pokračuj s explicitní TODO poznámkou; nehádej.** TNM, ICD-O, morfologie a
|
|
42
|
+
pole REDCapu jsou věci, kde je odhad horší než prázdné místo. Odpověď od
|
|
43
|
+
medika nebo mentora ti přijde v dalším briefu i s hotovým odstavcem do
|
|
44
|
+
`docs/hub/domain.md`.
|
|
45
|
+
|
|
46
|
+
3. **Breaking změnu kontraktu nikdy necommituj bez `hub_contract_change`.**
|
|
47
|
+
Všechno v `contracts/` je rozhraní mezi čtyřmi vrstvami. Ohlas diff a
|
|
48
|
+
`breaking: true/false` dřív, než to půjde do mainu; breaking změnu
|
|
49
|
+
integrátor nemergne, dokud ji ostatní neodkývají.
|
|
50
|
+
|
|
51
|
+
4. **Do hubu nikdy neposílej obsah pacientských dokumentů, jen cesty, schémata
|
|
52
|
+
a syntetické příklady.** Server payload nad 4 kB a cokoliv, co vypadá jako
|
|
53
|
+
rodné číslo, odmítne — ale spoléhat se na to není plán.
|
|
54
|
+
|
|
55
|
+
Rozhodnutí, která ovlivní ostatní, zapiš přes `hub_decide`. Server ti vrátí
|
|
56
|
+
číslo ADR, cestu a hotový markdown; soubor commitneš ty.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Campfire v tomhle repu
|
|
2
|
+
|
|
3
|
+
Tenhle repo sdílí několik agentů Claude Code. Jejich stav drží Campfire — malý
|
|
4
|
+
MCP server se dashboardem. Co tady leží:
|
|
5
|
+
|
|
6
|
+
| Soubor | K čemu je |
|
|
7
|
+
| --- | --- |
|
|
8
|
+
| `CLAUDE.md` | pravidla pro agenty; importuje `docs/hub/*.md` |
|
|
9
|
+
| `.mcp.json` | adresa Campfire serveru; klíč jde z prostředí, ne odtud |
|
|
10
|
+
| `.claude/settings.json` | tři hooky — brief na startu, kontrola claims před editací, shrnutí na konci |
|
|
11
|
+
| `.claude/agents/domain.md` | doménový subagent nad `docs/hub/domain.md` |
|
|
12
|
+
| `docs/hub/` | statická znalost: architektura, doména, konvence, ADR |
|
|
13
|
+
| `contracts/` | rozhraní mezi vrstvami; mění se jen přes `hub_contract_change` |
|
|
14
|
+
|
|
15
|
+
## Nejrychlejší cesta (jeden příkaz)
|
|
16
|
+
|
|
17
|
+
Claude Code umí přidat MCP server sám. V dashboardu Campfire si v **Nastavení →
|
|
18
|
+
Připojit agenta** vygeneruj klíč a zkopíruj hotový příkaz:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
claude mcp add --transport http campfire https://campfire.fly.dev/mcp \
|
|
22
|
+
--header "Authorization: Bearer cf_..."
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Spusť ho v repu, na kterém budeš pracovat. Pak v Claude Code napiš `/mcp` —
|
|
26
|
+
`campfire` musí být `connected`. Hotovo: devět toolů je k dispozici.
|
|
27
|
+
|
|
28
|
+
Co tím **nezískáš**: hooky. Brief se ti sám nestáhne na startu session a nic ti
|
|
29
|
+
nepohlídá editaci cizího modulu. Na to je plné nastavení níže. Pro rychlé
|
|
30
|
+
vyzkoušení nebo pro pátého člověka, který se přidá na hodinu, to ale stačí.
|
|
31
|
+
|
|
32
|
+
## Plné nastavení pro tým (5 minut)
|
|
33
|
+
|
|
34
|
+
**1. Nainstaluj CLI globálně.**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add -g @campfire-app/cli
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Globální instalace, ne `npx`. Hook `PreToolUse` běží před **každou** editací
|
|
41
|
+
souboru a `npx` by u každé řešil resolving balíčku; spec na tenhle hook dává
|
|
42
|
+
dvě sekundy a žádné síťové volání. Pokud globální instalaci nechceš, přepiš
|
|
43
|
+
`command` v `.claude/settings.json` na `npx -y @campfire-app/cli …` a počítej s
|
|
44
|
+
latencí.
|
|
45
|
+
|
|
46
|
+
**2. Vygeneruj si klíč.** V dashboardu Campfire otevři svůj projekt → API klíče
|
|
47
|
+
→ „Vygenerovat“. Klíč se zobrazí **jednou**.
|
|
48
|
+
|
|
49
|
+
**3. Dej URL a klíč do prostředí.** Do `~/.zshrc` nebo `~/.bashrc`:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
export CAMPFIRE_URL=https://campfire.fly.dev
|
|
53
|
+
export CAMPFIRE_TOKEN=cf_...
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Klíč patří do prostředí, ne do repa — proto `.mcp.json` obsahuje jen
|
|
57
|
+
`${CAMPFIRE_TOKEN}` a repo zůstává sdílitelné.
|
|
58
|
+
|
|
59
|
+
**4. Ověř.**
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
campfire whoami
|
|
63
|
+
# OK: jsi Petr v projektu MDT asistent.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**5. Spusť Claude Code.** Hook `SessionStart` ti sám stáhne brief.
|
|
67
|
+
|
|
68
|
+
## Když expanze `${CAMPFIRE_TOKEN}` nefunguje
|
|
69
|
+
|
|
70
|
+
Některé verze Claude Code neexpandují proměnné v `.mcp.json`. Poznáš to tak, že
|
|
71
|
+
MCP server `campfire` se nepřipojí a `campfire whoami` přitom funguje. Řešení:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
campfire init --url "$CAMPFIRE_URL" --token "$CAMPFIRE_TOKEN" --inline-token --force
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Klíč se zapíše přímo do `.mcp.json` a ten se přidá do `.gitignore`. Necommituj ho.
|
|
78
|
+
|
|
79
|
+
## Co hooky dělají
|
|
80
|
+
|
|
81
|
+
| Hook | Kdy | Co |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| `SessionStart` | start session | `campfire brief` — digest do kontextu a obnovení `.campfire/claims.json` |
|
|
84
|
+
| `PreToolUse` na `Edit\|Write\|MultiEdit` | před každou editací | `campfire check-file` — porovná cestu s lokální cache; cizí claim zablokuje. Bez sítě. |
|
|
85
|
+
| `Stop` | konec odpovědi | `campfire stop-summary` — vyzve k `hub_status`, a když se měnilo `contracts/` bez ohlášení, připomene `hub_contract_change` |
|
|
86
|
+
|
|
87
|
+
Všechny tři degradují mlčky: když je hub nedostupný, session funguje dál.
|
|
88
|
+
|
|
89
|
+
## Devět toolů
|
|
90
|
+
|
|
91
|
+
| Tool | Kdy ho zavolat |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| `hub_brief` | automaticky hookem; ručně kdykoliv chceš vědět, co je nového |
|
|
94
|
+
| `hub_status` | po dokončení kroku |
|
|
95
|
+
| `hub_claim` / `hub_release` | před a po práci na **sdíleném** souboru (`contracts/`, konfigurace, `scripts/`) — ne na své vrstvě |
|
|
96
|
+
| `hub_post` | zpráva kolegovi, nebo `kind="ack"` u breaking změny |
|
|
97
|
+
| `hub_contract_change` | před commitem čehokoliv v `contracts/` |
|
|
98
|
+
| `hub_decide` | rozhodnutí, které ovlivní ostatní |
|
|
99
|
+
| `hub_ask` | doménová otázka, místo hádání |
|
|
100
|
+
| `hub_charter` | zadání projektu: cíl, demo, „hotovo, když“, mimo rozsah |
|
|
101
|
+
|
|
102
|
+
## Řešení problémů
|
|
103
|
+
|
|
104
|
+
| Příznak | Co s tím |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| brief se nezobrazil | `campfire brief` ručně — vypíše, co mu chybí |
|
|
107
|
+
| „Campfire nedostupný“ | zkontroluj `CAMPFIRE_URL`; hub možná běží lokálně u leada přes Tailscale |
|
|
108
|
+
| „Campfire odmítl klíč“ | klíč byl zrušený nebo patří jinému projektu; vygeneruj nový |
|
|
109
|
+
| hook blokuje editaci sdíleného souboru | to je záměr; drží ho někdo jiný — napiš mu `hub_post`, nebo si vyber jinou práci |
|
|
110
|
+
| hook blokuje furt dokola | `campfire claims-sync`; cache starší 15 minut se ignoruje sama |
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Architektura
|
|
2
|
+
|
|
3
|
+
<!-- Vyplní lead v pátek dopoledne, 9:30–11:00, ještě před prvním řádkem kódu. -->
|
|
4
|
+
|
|
5
|
+
## Vrstvy pipeline
|
|
6
|
+
|
|
7
|
+
| Vrstva | Vlastník | Vstup → výstup | Moduly |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| 1. Ingest | TODO | dokumenty → `Document` | `ingest/**` |
|
|
10
|
+
| 2. Extrakce | TODO | `Document` → `Finding`, `LabValue`, `TreatmentEvent` | `extraction/**`, `prompts/**` |
|
|
11
|
+
| 3. Doména | TODO | entity → časová osa, trendy, validace | `domain/**`, `api/**` |
|
|
12
|
+
| 4. UI | TODO | API → pohled lékaře | `web/**` |
|
|
13
|
+
| Integrace | integrátor | větve → main, e2e | `tests/e2e/**`, `contracts/**` (jen review) |
|
|
14
|
+
|
|
15
|
+
> Moduly níž jsou **vlastnictví, ne claimy.** Svou vrstvu neclaimuj — nikdo
|
|
16
|
+
> jiný do ní nesahá, takže by to byl obřad bez odměny. `hub_claim` je na to,
|
|
17
|
+
> co je sdílené: `contracts/`, konfigurace, `scripts/`.
|
|
18
|
+
|
|
19
|
+
## Jak se vrstvy potkávají
|
|
20
|
+
|
|
21
|
+
Jen přes `contracts/`. Nic jiného není sdílené rozhraní. Kontrakty píšeme
|
|
22
|
+
společně na začátku a od té chvíle je mění jen `hub_contract_change`.
|
|
23
|
+
|
|
24
|
+
## Hotovo, když
|
|
25
|
+
|
|
26
|
+
| Vrstva | Kritérium |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| 1 | TODO |
|
|
29
|
+
| 2 | TODO |
|
|
30
|
+
| 3 | TODO |
|
|
31
|
+
| 4 | TODO |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Konvence
|
|
2
|
+
|
|
3
|
+
<!-- Dohodnout před hackathonem, ne během. -->
|
|
4
|
+
|
|
5
|
+
## Commity
|
|
6
|
+
|
|
7
|
+
`<typ>(<oblast>): <co se změnilo>` — např. `feat(ingest): parser PDF přes pdfplumber`.
|
|
8
|
+
Typy: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`.
|
|
9
|
+
|
|
10
|
+
## Pojmenování
|
|
11
|
+
|
|
12
|
+
- Soubory a moduly: `snake_case` v Pythonu, `camelCase` v TypeScriptu.
|
|
13
|
+
- Typy z `contracts/` se nikde nekopírují, vždy importují.
|
|
14
|
+
- Jedna vrstva = jeden adresář. Nic nepřesahuje do cizího.
|
|
15
|
+
|
|
16
|
+
## Testy
|
|
17
|
+
|
|
18
|
+
- Každý modul má alespoň jeden test na syntetických datech ze `scripts/synth.py`.
|
|
19
|
+
- E2E běží na `main` a musí projít před demem. Integrátor je hlídá.
|
|
20
|
+
- Test, který potřebuje reálná data, nepatří do repa.
|
|
21
|
+
|
|
22
|
+
## Lint a formát
|
|
23
|
+
|
|
24
|
+
| Jazyk | Nástroj |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| Python | `ruff` (lint + format) |
|
|
27
|
+
| TypeScript | `eslint` + `prettier` |
|
|
28
|
+
|
|
29
|
+
## Co se nikdy nedostane do repa
|
|
30
|
+
|
|
31
|
+
- Pacientská data, ani anonymizovaná. Zůstávají v lokálním sandboxu toho, kdo
|
|
32
|
+
dělá extrakci.
|
|
33
|
+
- API klíče. `.campfire/` a `.env.local` jsou v `.gitignore`.
|
|
File without changes
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Doménový slovník
|
|
2
|
+
|
|
3
|
+
Onkologická doména pro tenhle projekt. Prázdná místa vyplňuje medik v týmu nebo
|
|
4
|
+
mentor — buď přímo, nebo přes odpovědi na `hub_ask(tag="domain")`, které se sem
|
|
5
|
+
připisují do sekce [Odpovědi mentorů](#odpovědi-mentorů).
|
|
6
|
+
|
|
7
|
+
**Pravidlo:** když tady něco není, zavolej `hub_ask(tag="domain")` a pokračuj s
|
|
8
|
+
TODO poznámkou. Nehádej.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## TNM (8. vydání)
|
|
13
|
+
|
|
14
|
+
Staging systém UICC/AJCC. Tři složky plus prefixy a grading.
|
|
15
|
+
|
|
16
|
+
| Složka | Co popisuje | Typické hodnoty |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| **T** | rozsah primárního tumoru | `Tis`, `T0`, `T1`–`T4` (s podstupni `T1a`, `T1b`, …), `TX` = nelze určit |
|
|
19
|
+
| **N** | regionální lymfatické uzliny | `N0`, `N1`–`N3` (s podstupni), `NX` |
|
|
20
|
+
| **M** | vzdálené metastázy | `M0`, `M1` (s lokalizací `M1a`–`M1c`); `MX` se v 8. vydání už nepoužívá |
|
|
21
|
+
|
|
22
|
+
### Prefixy
|
|
23
|
+
|
|
24
|
+
| Prefix | Význam |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `c` | klinická klasifikace (před léčbou, z vyšetření) |
|
|
27
|
+
| `p` | patologická klasifikace (z resekátu) |
|
|
28
|
+
| `yc` / `yp` | po neoadjuvantní léčbě |
|
|
29
|
+
| `r` | recidiva |
|
|
30
|
+
| `a` | z autopsie |
|
|
31
|
+
|
|
32
|
+
Příklad: `pT2 pN1 M0` = patologicky potvrzený T2, jedna skupina pozitivních
|
|
33
|
+
uzlin, bez vzdálených metastáz.
|
|
34
|
+
|
|
35
|
+
### Grading
|
|
36
|
+
|
|
37
|
+
| Hodnota | Význam |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `G1` | dobře diferencovaný |
|
|
40
|
+
| `G2` | středně diferencovaný |
|
|
41
|
+
| `G3` | špatně diferencovaný |
|
|
42
|
+
| `G4` | nediferencovaný |
|
|
43
|
+
| `GX` | nelze určit |
|
|
44
|
+
|
|
45
|
+
### Stadium
|
|
46
|
+
|
|
47
|
+
Stadium (`0`, `I`–`IV`, s podstupni `IA`, `IIB`, …) se z TNM odvozuje podle
|
|
48
|
+
tabulek specifických pro každou diagnózu. **Není to jedna univerzální tabulka** —
|
|
49
|
+
pravidla pro kolorektální karcinom a pro karcinom prsu se liší.
|
|
50
|
+
|
|
51
|
+
> TODO: doplnit tabulku stadia pro diagnózy, které náš projekt řeší.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## ICD-O-3
|
|
56
|
+
|
|
57
|
+
Mezinárodní klasifikace nemocí pro onkologii. Nález má dvě nezávislé osi:
|
|
58
|
+
|
|
59
|
+
| Osa | Formát | Příklad |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| **Topografie** (lokalizace) | `C__._` | `C50.4` = horní vnitřní kvadrant prsu |
|
|
62
|
+
| **Morfologie** (histologie) | `M____/_` | `M8140/3` = adenokarcinom, maligní |
|
|
63
|
+
|
|
64
|
+
Poslední číslice morfologie je **chování**:
|
|
65
|
+
|
|
66
|
+
| Kód | Chování |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| `/0` | benigní |
|
|
69
|
+
| `/1` | nejisté / hraniční |
|
|
70
|
+
| `/2` | in situ |
|
|
71
|
+
| `/3` | maligní, primární |
|
|
72
|
+
| `/6` | maligní, metastáza |
|
|
73
|
+
| `/9` | maligní, nejisté zda primární nebo metastáza |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## MKN-10, kapitola novotvarů
|
|
78
|
+
|
|
79
|
+
| Rozsah | Co pokrývá |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `C00`–`C97` | zhoubné novotvary |
|
|
82
|
+
| `C00`–`C14` | dutina ústní a hltan |
|
|
83
|
+
| `C15`–`C26` | trávicí orgány |
|
|
84
|
+
| `C30`–`C39` | dýchací soustava |
|
|
85
|
+
| `C50` | prs |
|
|
86
|
+
| `C51`–`C58` | ženské pohlavní orgány |
|
|
87
|
+
| `C60`–`C63` | mužské pohlavní orgány |
|
|
88
|
+
| `C64`–`C68` | močová soustava |
|
|
89
|
+
| `C81`–`C96` | lymfatická a krvetvorná tkáň |
|
|
90
|
+
| `D00`–`D09` | in situ |
|
|
91
|
+
| `D37`–`D48` | novotvary nejistého chování |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Biomarkery
|
|
96
|
+
|
|
97
|
+
> TODO: doplnit podle vybrané výzvy. Níže jsou ty, které se objevují nejčastěji.
|
|
98
|
+
|
|
99
|
+
| Marker | Kde | Hodnoty |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| ER / PR | prs | `%` pozitivních jader, nebo Allred skóre |
|
|
102
|
+
| HER2 | prs, žaludek | IHC `0`/`1+`/`2+`/`3+`; při `2+` ještě ISH |
|
|
103
|
+
| Ki-67 | prs a další | `%` |
|
|
104
|
+
| MSI / MMR | kolorektum, endometrium | `MSS` / `MSI-L` / `MSI-H`; MMR proteiny MLH1, MSH2, MSH6, PMS2 |
|
|
105
|
+
| EGFR, ALK, ROS1 | plíce | mutace / fúze, s uvedením exonu |
|
|
106
|
+
| BRAF | melanom, kolorektum | např. `V600E` |
|
|
107
|
+
| PD-L1 | plíce a další | TPS / CPS v `%` |
|
|
108
|
+
| BRCA1/2 | prs, ovarium | germinální / somatická, s variantou |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Laboratorní hodnoty
|
|
113
|
+
|
|
114
|
+
Každá hodnota potřebuje **číslo, jednotku a referenční rozmezí** laboratoře,
|
|
115
|
+
která ji vydala. Jednotky se mezi laboratořemi liší; bez jednotky je číslo
|
|
116
|
+
nepoužitelné.
|
|
117
|
+
|
|
118
|
+
> TODO: doplnit, které analyty projekt sleduje a v jakých jednotkách.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Pole REDCap
|
|
123
|
+
|
|
124
|
+
> TODO: doplnit přesná jména polí z data dictionary, až ho budeme mít. Hádat
|
|
125
|
+
> jména polí nemá smysl — REDCap je odmítne.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Odpovědi mentorů
|
|
130
|
+
|
|
131
|
+
Sem se připisují odpovědi na `hub_ask(tag="domain")`. Server vrátí hotový
|
|
132
|
+
odstavec v briefu toho, kdo se ptal; ten ho sem připojí a commitne.
|
|
133
|
+
|
|
134
|
+
<!-- campfire:answers -->
|
package/README.md
DELETED