Pobieralna paczka źródeł dla AI: pages/ski-2027-kb.zip
Przy każdej regeneracji gen_pages.py buduje archiwum do wrzucenia w okno
czatu: wszystkie pliki .md bundle'a z zachowaniem struktury katalogów
(28 plików: koncepty, indexy podkatalogów, log.md) plus wygenerowany
AI-README.md. Nie wchodzą pages/, zdjęcia, generatory ani __pycache__ —
paczka niesie samą wiedzę, nie rusztowanie.
Deterministycznie: stały czas modyfikacji wpisów (1980-01-01), stała
kolejność i stały poziom kompresji, więc archiwum jest bajt w bajt takie
samo, dopóki nie zmieni się treść — git nie widzi diffów z niczego
(zweryfikowane: dwa uruchomienia, ten sam md5).
Z tego samego powodu AI-README.md podaje jako datę nie odczyt zegara,
tylko najnowsze `ostatnia_aktualizacja` w bundle'u ("data treści") —
data z zegara robiłaby nową wersję pliku każdego dnia, także wtedy, gdy
nic nie doszło.
AI-README.md (PL + EN, generowany z bundle'a): czym jest baza, format
OKF (markdown + YAML frontmatter, jeden plik = jeden koncept), polecenie
odpowiadania wyłącznie z tych plików i objaśnienie dwóch pól niosących
pewność danych — `status_ceny` i `dostepnosc_6_13_02_2027`, z ostrzeżeniem,
żeby nie zgadywać dostępności przy 🔍 i nie podawać szacunków jako cen
potwierdzonych.
Link "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj" jako piąty
kafel na start.html i pozycja w sekcji "Wejście" na linki.html.
Plus wpis do log.md podsumowujący całą zmianę terminu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
06ab1b24aa
commit
2491ae59f3
127
gen_pages.py
127
gen_pages.py
|
|
@ -41,10 +41,12 @@ Uruchomienie: python3 gen_pages.py
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import html
|
import html
|
||||||
|
import io
|
||||||
import posixpath
|
import posixpath
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
|
import zipfile
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
@ -61,6 +63,16 @@ TERM_SHORT = "6–13.02" # nagłówek kolumny w tabeli porównawczej
|
||||||
TERM_NOTE = "tydzień Fasching, szczyt sezonu"
|
TERM_NOTE = "tydzień Fasching, szczyt sezonu"
|
||||||
RESERVED = {"index.md", "log.md"}
|
RESERVED = {"index.md", "log.md"}
|
||||||
|
|
||||||
|
# Pobieralna paczka źródeł dla AI (patrz sekcja niżej): same .md bundle'a
|
||||||
|
# plus wygenerowany AI-README.md, bez stron, zdjęć i generatorów.
|
||||||
|
ZIP_NAME = "ski-2027-kb.zip"
|
||||||
|
ZIP_ROOT = "ski-2027-kb" # katalog wewnątrz archiwum, żeby się nie rozsypało
|
||||||
|
AI_README = "AI-README.md"
|
||||||
|
# Stały czas modyfikacji wpisów: archiwum ma być bajt w bajt identyczne,
|
||||||
|
# dopóki nie zmieni się treść — inaczej każda regeneracja robiłaby gitowi
|
||||||
|
# diff z niczego. 1980-01-01 to minimum formatu ZIP.
|
||||||
|
ZIP_TIMESTAMP = (1980, 1, 1, 0, 0, 0)
|
||||||
|
|
||||||
# Publiczny adres wystawki — jedyne miejsce, w którym siedzi domena. Używa go
|
# Publiczny adres wystawki — jedyne miejsce, w którym siedzi domena. Używa go
|
||||||
# WYŁĄCZNIE pages/linki.html (spis do kopiowania i wysyłania grupie); wszystkie
|
# WYŁĄCZNIE pages/linki.html (spis do kopiowania i wysyłania grupie); wszystkie
|
||||||
# pozostałe strony linkują względnie albo root-absolutnie, żeby działały tak
|
# pozostałe strony linkują względnie albo root-absolutnie, żeby działały tak
|
||||||
|
|
@ -1190,6 +1202,9 @@ TILES = [
|
||||||
("/pages/linki.html", "Wszystkie linki",
|
("/pages/linki.html", "Wszystkie linki",
|
||||||
"Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — "
|
"Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — "
|
||||||
"do wrzucenia grupie."),
|
"do wrzucenia grupie."),
|
||||||
|
(f"/{PAGES_DIRNAME}/{ZIP_NAME}", "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj",
|
||||||
|
"Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model "
|
||||||
|
"przeczyta całość i odpowie na pytania o wyjazd."),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1326,6 +1341,12 @@ def link_sections(
|
||||||
),
|
),
|
||||||
Link(site_url("viz.html"), "Graf powiązań", "Struktura bazy — załącznik."),
|
Link(site_url("viz.html"), "Graf powiązań", "Struktura bazy — załącznik."),
|
||||||
Link(site_url("pages/linki.html"), "Ten spis linków", "Strona, którą czytasz."),
|
Link(site_url("pages/linki.html"), "Ten spis linków", "Strona, którą czytasz."),
|
||||||
|
Link(
|
||||||
|
site_url(f"{PAGES_DIRNAME}/{ZIP_NAME}"),
|
||||||
|
"Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj",
|
||||||
|
"Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model "
|
||||||
|
"przeczyta całość i odpowie na pytania o wyjazd.",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
used.add("wyjazd")
|
used.add("wyjazd")
|
||||||
|
|
||||||
|
|
@ -1494,6 +1515,110 @@ def render_links(concepts: list[Concept], regions: list[Region]) -> str:
|
||||||
return _page_shell("Linki", 0, content, script=LINKS_JS)
|
return _page_shell("Linki", 0, content, script=LINKS_JS)
|
||||||
|
|
||||||
|
|
||||||
|
# --- pobieralna paczka źródeł dla AI ----------------------------------
|
||||||
|
|
||||||
|
def bundle_sources() -> list[Path]:
|
||||||
|
"""Pliki .md bundle'a — z zachowaniem struktury katalogów."""
|
||||||
|
return sorted(
|
||||||
|
path
|
||||||
|
for path in BUNDLE_ROOT.rglob("*.md")
|
||||||
|
if ".git" not in path.parts
|
||||||
|
and PAGES_DIRNAME not in path.relative_to(BUNDLE_ROOT).parts
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def bundle_date(concepts: list[Concept]) -> str:
|
||||||
|
"""Data treści = najnowsze `ostatnia_aktualizacja` w bundle'u.
|
||||||
|
|
||||||
|
Świadomie NIE bierzemy zegara: paczka ma być identyczna, dopóki nie
|
||||||
|
zmieni się wiedza. Data z zegara robiłaby nową wersję pliku każdego
|
||||||
|
dnia, także wtedy, gdy nic nie doszło.
|
||||||
|
"""
|
||||||
|
dates = [
|
||||||
|
str(c.frontmatter.get("ostatnia_aktualizacja") or "").strip() for c in concepts
|
||||||
|
]
|
||||||
|
return max((d for d in dates if d), default="—")
|
||||||
|
|
||||||
|
|
||||||
|
def render_ai_readme(concepts: list[Concept]) -> str:
|
||||||
|
"""AI-README.md do paczki — skrót index.md dla modelu po drugiej stronie."""
|
||||||
|
offers = [c for c in concepts if is_offer(c)]
|
||||||
|
active = [c for c in offers if not is_archived(c)]
|
||||||
|
regions = sorted(
|
||||||
|
c.id.split("/")[0] for c in concepts if c.id.endswith("/region")
|
||||||
|
)
|
||||||
|
date = bundle_date(concepts)
|
||||||
|
return f"""# Ski 2027 — baza wiedzy wyjazdu ({TERM_LABEL})
|
||||||
|
|
||||||
|
## PL
|
||||||
|
|
||||||
|
To baza wiedzy wyjazdu narciarskiego czterech rodzin (14 osób: 8 dorosłych,
|
||||||
|
4 nastolatków, 2 dzieci) z Warszawy w Alpy w terminie **{TERM_LABEL}**
|
||||||
|
({TERM_NOTE}). Format to OKF: markdown z frontmatterem YAML, gdzie jeden
|
||||||
|
plik = jeden koncept, `index.md` w każdym katalogu jest listingiem, a
|
||||||
|
`log.md` historią zmian; porównywane są {len(regions)} regiony
|
||||||
|
({", ".join(regions)}) w schemacie `<region>/region.md` +
|
||||||
|
`<region>/oferty/*.md`, razem {len(active)} aktualnych kart noclegów.
|
||||||
|
Odpowiadaj na pytania o ten wyjazd **wyłącznie na podstawie tych plików** i
|
||||||
|
podawaj, z którego pliku pochodzi odpowiedź.
|
||||||
|
|
||||||
|
O pewności danych mówią dwa pola frontmattera: `status_ceny`
|
||||||
|
(ZWERYFIKOWANE = odczytane z cennika obiektu, SZACUNEK = nasza estymacja,
|
||||||
|
do potwierdzenia) oraz `{AVAILABILITY_FIELD}` ze statusem ✅ DOSTĘPNE
|
||||||
|
(zweryfikowane) / ❌ BRAK (zweryfikowane) / 🔍 BRAK DANYCH (do
|
||||||
|
weryfikacji). Nie przedstawiaj szacunków jako cen potwierdzonych i nie
|
||||||
|
zgaduj dostępności tam, gdzie stoi 🔍. Karty z `priorytet: ARCHIWALNA`
|
||||||
|
pochodzą z riserczu na poprzedni termin (16–23.01.2027) — traktuj je jako
|
||||||
|
historyczne, nie jako aktualną ofertę.
|
||||||
|
|
||||||
|
**Data treści (najnowsza aktualizacja w bazie): {date}.**
|
||||||
|
|
||||||
|
## EN
|
||||||
|
|
||||||
|
This is the knowledge base of a ski trip for four families (14 people:
|
||||||
|
8 adults, 4 teenagers, 2 children) driving from Warsaw to the Alps on
|
||||||
|
**{TERM_LABEL}** (carnival week, peak season). The format is OKF: markdown
|
||||||
|
with YAML frontmatter, one file = one concept, `index.md` in each directory
|
||||||
|
is a listing and `log.md` is the change history; {len(regions)} regions
|
||||||
|
({", ".join(regions)}) are compared using the same schema
|
||||||
|
`<region>/region.md` + `<region>/oferty/*.md`, with {len(active)} current
|
||||||
|
accommodation cards in total. Answer questions about this trip **only from
|
||||||
|
these files** and say which file an answer comes from.
|
||||||
|
|
||||||
|
Two frontmatter fields carry the confidence of the data: `status_ceny`
|
||||||
|
(ZWERYFIKOWANE = read from the property's own price list, SZACUNEK = our
|
||||||
|
estimate, unconfirmed) and `{AVAILABILITY_FIELD}` (✅ AVAILABLE,
|
||||||
|
verified / ❌ NOT AVAILABLE, verified / 🔍 NO DATA, to be checked). Never
|
||||||
|
present an estimate as a confirmed price and never guess availability where
|
||||||
|
the value is 🔍. Cards marked `priorytet: ARCHIWALNA` come from research
|
||||||
|
for the previous date (16–23.01.2027) — treat them as historical.
|
||||||
|
|
||||||
|
**Content date (latest update in the base): {date}.**
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def write_bundle_zip(concepts: list[Concept]) -> Path:
|
||||||
|
"""Buduje pages/ski-2027-kb.zip — deterministycznie, bajt w bajt."""
|
||||||
|
entries: list[tuple[str, str]] = [
|
||||||
|
(f"{ZIP_ROOT}/{AI_README}", render_ai_readme(concepts))
|
||||||
|
]
|
||||||
|
for path in bundle_sources():
|
||||||
|
rel = path.relative_to(BUNDLE_ROOT).as_posix()
|
||||||
|
entries.append((f"{ZIP_ROOT}/{rel}", path.read_text(encoding="utf-8")))
|
||||||
|
|
||||||
|
buffer = io.BytesIO()
|
||||||
|
with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED, compresslevel=9) as archive:
|
||||||
|
for name, text in sorted(entries):
|
||||||
|
info = zipfile.ZipInfo(name, date_time=ZIP_TIMESTAMP)
|
||||||
|
info.compress_type = zipfile.ZIP_DEFLATED
|
||||||
|
info.external_attr = 0o644 << 16
|
||||||
|
archive.writestr(info, text.encode("utf-8"))
|
||||||
|
|
||||||
|
target = PAGES_DIR / ZIP_NAME
|
||||||
|
target.write_bytes(buffer.getvalue())
|
||||||
|
return target
|
||||||
|
|
||||||
|
|
||||||
# --- raport braków ----------------------------------------------------
|
# --- raport braków ----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1566,6 +1691,8 @@ def main() -> int:
|
||||||
path.write_text(markup, encoding="utf-8")
|
path.write_text(markup, encoding="utf-8")
|
||||||
written.append(path)
|
written.append(path)
|
||||||
|
|
||||||
|
written.append(write_bundle_zip(concepts))
|
||||||
|
|
||||||
print(f"Renderer markdown: {RENDERER}")
|
print(f"Renderer markdown: {RENDERER}")
|
||||||
print(f"Zapisano {len(written)} plików w {PAGES_DIR}:")
|
print(f"Zapisano {len(written)} plików w {PAGES_DIR}:")
|
||||||
for path in written:
|
for path in written:
|
||||||
|
|
|
||||||
8
log.md
8
log.md
|
|
@ -1,5 +1,13 @@
|
||||||
# Update Log
|
# Update Log
|
||||||
|
|
||||||
|
## 2026-08-04
|
||||||
|
|
||||||
|
* **Update**: **Zmiana terminu wyjazdu: 16–23.01 → 6–13.02.2027** i nałożenie riserczu 08.2026 na cały bundle. Nowy termin to tydzień **Fasching** (karnawał, Popielec 10.02) plus ferie bawarskie — szczyt sezonu, więc wszystkie budżety noclegowe poszły w górę, a [SFL](/sfl/region.md) traci styczniową przewagę cenową (u nich luty to pełny wysoki sezon). Zaktualizowane body i pola merytoryczne czterech regionów, dziesięciu kart noclegów i [szablonu maila](/szablon-maila.md). Każda karta noclegu ma nowe pole `dostepnosc_6_13_02_2027` z legendą ✅ DOSTĘPNE (zweryfikowane) / ❌ BRAK (zweryfikowane) / 🔍 BRAK DANYCH (do weryfikacji). Jedyny zweryfikowany status w bazie jest negatywny: [Glemm Lodge](/saalbach/oferty/glemm-lodge.md) ma na ten tydzień zajęte wszystkie 3 apartamenty (wolne 13–20.02 i 27.02–06.03) — twardy dowód presji na tydzień karnawału. [Wyjazd](/wyjazd.md) przepisany: nowa tabela porównawcza regionów, tabela dostępności i wnioski przekrojowe (Kronplatz najlepiej znosi termin), plus sekcja "Plan B na wypadek pełnego tygodnia".
|
||||||
|
* **Update**: Restrukturyzacja do symetrii — `region.md` i `oferty/` z korzenia przeniesione do [`saalbach/`](/saalbach/index.md), więc wszystkie cztery regiony siedzą w jednym schemacie `<region>/region.md` + `<region>/oferty/*.md`. Zdjęcia obiektów przetrwały bez ruszania: mapowanie oferta→zdjęcia jest kluczowane po polu `id`, nie po ścieżce. Dołożony [`saalbach/index.md`](/saalbach/index.md), indexy podkatalogów zaktualizowane, listing [index.md](/index.md) przebudowany na cztery równorzędne regiony.
|
||||||
|
* **Update**: Karty [dom dla grupy](/saalbach/oferty/dom-dla-grupy.md) i [AlpenParks Rehrenberg](/saalbach/oferty/alpenparks-rehrenberg.md) — spoza paczki riserczowej — oznaczone jako **ARCHIWALNE**: ich ceny i dostępność dotyczą starego terminu. Wypadają z tabeli porównawczej i ze statusów dostępności do osobnej sekcji "Archiwum" na dole porównania.
|
||||||
|
* **Update**: `gen_pages.py` — nowa kolumna "Dostępność 6–13.02" w tabeli porównawczej (emoji + werdykt w komórce, pełna notatka pod kursorem, sortowanie decyzyjne), wiersz z zweryfikowanym brakiem miejsc na czerwono, sekcja "Archiwum", termin wyjazdu w stałych `TERM_LABEL`/`TERM_SHORT`/`TERM_NOTE` (stąd biorą go nagłówki wszystkich stron i raport braków). Raport braków czyta dostępność z pola frontmattera zamiast zgadywać z nagłówków w body.
|
||||||
|
* **Update**: Nowa **pobieralna paczka źródeł dla AI**: `pages/ski-2027-kb.zip` (budowana przy każdej regeneracji, deterministycznie — bajt w bajt taka sama, dopóki nie zmieni się treść) z wszystkimi plikami `.md` bundle'a, `log.md` i wygenerowanym `AI-README.md` po polsku i angielsku (czym jest baza, jak czytać `status_ceny` i `dostepnosc_6_13_02_2027`, data treści). Link "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj" na [starcie](/index.md) i w spisie linków.
|
||||||
|
|
||||||
## 2026-08-03
|
## 2026-08-03
|
||||||
|
|
||||||
* **Update**: Rozstrzygnięcie rozbieżności skipassowej w [Ischgl](/ischgl/region.md) (ischgl.com, cennik 26/27, sprawdzone 03.08.2026): 385/231 € to **VIP Skipass** — tylko dla nocujących w Ischgl/Mathon, 46 urządzeń, bez wyciągów Kappl; 451/257 € to **Silvretta Skipass** — dla gości spoza Ischgl/Mathon (w tym Kappl), 75 urządzeń. Przy PLANIE A (nocleg w Kappl) obowiązuje Silvretta, więc ceny w tabelach zostają. Poprawione dwa błędy w karcie: tabela 451/257 € była podpisana jako VIP, a sekcja "Teren" przypisywała VIP-owi zasięg całego Paznaun. Pułapka wiekowa 8–<17 potwierdzona, dopisany plus: dzieci <8 lat gratis — w karcie i w [wyjeździe](/wyjazd.md) (tabela porównawcza + wniosek nr 2).
|
* **Update**: Rozstrzygnięcie rozbieżności skipassowej w [Ischgl](/ischgl/region.md) (ischgl.com, cennik 26/27, sprawdzone 03.08.2026): 385/231 € to **VIP Skipass** — tylko dla nocujących w Ischgl/Mathon, 46 urządzeń, bez wyciągów Kappl; 451/257 € to **Silvretta Skipass** — dla gości spoza Ischgl/Mathon (w tym Kappl), 75 urządzeń. Przy PLANIE A (nocleg w Kappl) obowiązuje Silvretta, więc ceny w tabelach zostają. Poprawione dwa błędy w karcie: tabela 451/257 € była podpisana jako VIP, a sekcja "Teren" przypisywała VIP-owi zasięg całego Paznaun. Pułapka wiekowa 8–<17 potwierdzona, dopisany plus: dzieci <8 lat gratis — w karcie i w [wyjeździe](/wyjazd.md) (tabela porównawcza + wniosek nr 2).
|
||||||
|
|
|
||||||
|
|
@ -158,9 +158,9 @@ td.thumb .placeholder { display: flex; width: 120px; height: 80px; border-radius
|
||||||
<body>
|
<body>
|
||||||
<nav><a href="start.html">← Start</a> · <a href="index.html">Wszystkie karty</a> · <a href="porownanie.html">Porównanie ofert</a> · <a href="linki.html">Linki</a> · <a href="../viz.html">Graf</a></nav>
|
<nav><a href="start.html">← Start</a> · <a href="index.html">Wszystkie karty</a> · <a href="porownanie.html">Porównanie ofert</a> · <a href="linki.html">Linki</a> · <a href="../viz.html">Graf</a></nav>
|
||||||
<h1>Linki do wysłania</h1>
|
<h1>Linki do wysłania</h1>
|
||||||
<p class="lead">Wszystkie 24 stron wystawki jako pełne adresy — do skopiowania i wrzucenia grupie. Lista powstaje z tych samych danych co reszta stron, więc nowa oferta pojawi się tu sama.</p>
|
<p class="lead">Wszystkie 25 stron wystawki jako pełne adresy — do skopiowania i wrzucenia grupie. Lista powstaje z tych samych danych co reszta stron, więc nowa oferta pojawi się tu sama.</p>
|
||||||
<div class="copybar"><button type="button" id="copy-all">Kopiuj wszystkie</button><button type="button" id="copy-start" data-url="https://narty27.kapala.org/">Kopiuj link startowy</button><span class="copy-status" role="status" aria-live="polite"></span></div>
|
<div class="copybar"><button type="button" id="copy-all">Kopiuj wszystkie</button><button type="button" id="copy-start" data-url="https://narty27.kapala.org/">Kopiuj link startowy</button><span class="copy-status" role="status" aria-live="polite"></span></div>
|
||||||
<section data-section="Wejście"><h2>Wejście</h2><ul class="links"><li><a href="https://narty27.kapala.org/">Start</a><code class="url">https://narty27.kapala.org/</code><p>Landing decyzyjny — od tego zaczyna grupa.</p></li><li><a href="https://narty27.kapala.org/pages/porownanie.html">Porównanie ofert</a><code class="url">https://narty27.kapala.org/pages/porownanie.html</code><p>Wszystkie noclegi w jednej sortowalnej tabeli, ze zdjęciami.</p></li><li><a href="https://narty27.kapala.org/pages/wyjazd.html">Analiza wariantów</a><code class="url">https://narty27.kapala.org/pages/wyjazd.html</code><p>Wyjazd narciarski 4 rodzin (14 osób) z Warszawy w tygodniu Fasching: porównanie czterech regionów, statusy…</p></li><li><a href="https://narty27.kapala.org/pages/index.html">Spis wszystkich kart</a><code class="url">https://narty27.kapala.org/pages/index.html</code><p>Każdy dokument bazy wiedzy w jednym miejscu.</p></li><li><a href="https://narty27.kapala.org/viz.html">Graf powiązań</a><code class="url">https://narty27.kapala.org/viz.html</code><p>Struktura bazy — załącznik.</p></li><li><a href="https://narty27.kapala.org/pages/linki.html">Ten spis linków</a><code class="url">https://narty27.kapala.org/pages/linki.html</code><p>Strona, którą czytasz.</p></li></ul></section>
|
<section data-section="Wejście"><h2>Wejście</h2><ul class="links"><li><a href="https://narty27.kapala.org/">Start</a><code class="url">https://narty27.kapala.org/</code><p>Landing decyzyjny — od tego zaczyna grupa.</p></li><li><a href="https://narty27.kapala.org/pages/porownanie.html">Porównanie ofert</a><code class="url">https://narty27.kapala.org/pages/porownanie.html</code><p>Wszystkie noclegi w jednej sortowalnej tabeli, ze zdjęciami.</p></li><li><a href="https://narty27.kapala.org/pages/wyjazd.html">Analiza wariantów</a><code class="url">https://narty27.kapala.org/pages/wyjazd.html</code><p>Wyjazd narciarski 4 rodzin (14 osób) z Warszawy w tygodniu Fasching: porównanie czterech regionów, statusy…</p></li><li><a href="https://narty27.kapala.org/pages/index.html">Spis wszystkich kart</a><code class="url">https://narty27.kapala.org/pages/index.html</code><p>Każdy dokument bazy wiedzy w jednym miejscu.</p></li><li><a href="https://narty27.kapala.org/viz.html">Graf powiązań</a><code class="url">https://narty27.kapala.org/viz.html</code><p>Struktura bazy — załącznik.</p></li><li><a href="https://narty27.kapala.org/pages/linki.html">Ten spis linków</a><code class="url">https://narty27.kapala.org/pages/linki.html</code><p>Strona, którą czytasz.</p></li><li><a href="https://narty27.kapala.org/pages/ski-2027-kb.zip">Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj</a><code class="url">https://narty27.kapala.org/pages/ski-2027-kb.zip</code><p>Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model przeczyta całość i odpowie na pytania o wyjazd.</p></li></ul></section>
|
||||||
<section data-section="Regiony"><h2>Regiony</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/region.html">Saalbach</a><code class="url">https://narty27.kapala.org/pages/saalbach/region.html</code><p>Budżet grupy ~16 200–19 500 €. Wariant bazowy: 270 km tras i najkrótszy dojazd z Warszawy, ale w tygodniu Fasching…</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/region.html">Ischgl/Paznaun</a><code class="url">https://narty27.kapala.org/pages/ischgl/region.html</code><p>Budżet grupy ~14 200–17 000 €. Wariant alternatywny: 239 km Silvretta Areny z jazdą do bezcłowego Samnaun, nocleg w…</p></li><li><a href="https://narty27.kapala.org/pages/kronplatz/region.html">Kronplatz</a><code class="url">https://narty27.kapala.org/pages/kronplatz/region.html</code><p>Budżet grupy ~14 500–17 700 €. Wariant alternatywny i najlepiej znoszący tydzień Fasching: 121 km na jednej górze plus…</p></li><li><a href="https://narty27.kapala.org/pages/sfl/region.html">SFL</a><code class="url">https://narty27.kapala.org/pages/sfl/region.html</code><p>Budżet grupy ~14 500–17 900 €. Wariant alternatywny: 214 km na słonecznym płaskowyżu i najlepsza infrastruktura…</p></li></ul></section>
|
<section data-section="Regiony"><h2>Regiony</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/region.html">Saalbach</a><code class="url">https://narty27.kapala.org/pages/saalbach/region.html</code><p>Budżet grupy ~16 200–19 500 €. Wariant bazowy: 270 km tras i najkrótszy dojazd z Warszawy, ale w tygodniu Fasching…</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/region.html">Ischgl/Paznaun</a><code class="url">https://narty27.kapala.org/pages/ischgl/region.html</code><p>Budżet grupy ~14 200–17 000 €. Wariant alternatywny: 239 km Silvretta Areny z jazdą do bezcłowego Samnaun, nocleg w…</p></li><li><a href="https://narty27.kapala.org/pages/kronplatz/region.html">Kronplatz</a><code class="url">https://narty27.kapala.org/pages/kronplatz/region.html</code><p>Budżet grupy ~14 500–17 700 €. Wariant alternatywny i najlepiej znoszący tydzień Fasching: 121 km na jednej górze plus…</p></li><li><a href="https://narty27.kapala.org/pages/sfl/region.html">SFL</a><code class="url">https://narty27.kapala.org/pages/sfl/region.html</code><p>Budżet grupy ~14 500–17 900 €. Wariant alternatywny: 214 km na słonecznym płaskowyżu i najlepsza infrastruktura…</p></li></ul></section>
|
||||||
<section data-section="Oferty — Saalbach"><h2>Oferty — Saalbach</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html">AlpenParks Hotel & Apartment Sonnleiten</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html</code><p>PLAN A-bis · Saalbach</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html">Appartementhaus Kristall at SchattbergXpress</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html</code><p>PLAN A · Saalbach (centrum)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html</code><p>PLAN B · Viehhofen (3 km od Saalbach)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html">AlpenParks Apartments Rehrenberg</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html</code><p>ARCHIWALNA · Viehhofen</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html">Duży dom wakacyjny 12–14 os. (do wyszukania)</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html</code><p>ARCHIWALNA · Viehhofen / Maishofen / strona Fieberbrunn</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html">Glemm Lodge Apartments ⭐⭐⭐⭐</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html</code><p>NIEDOSTĘPNY w terminie; referencja cenowa + opcja przy zmianie tygodnia · między Saalbach a Hinterglemm</p></li></ul></section>
|
<section data-section="Oferty — Saalbach"><h2>Oferty — Saalbach</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html">AlpenParks Hotel & Apartment Sonnleiten</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html</code><p>PLAN A-bis · Saalbach</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html">Appartementhaus Kristall at SchattbergXpress</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html</code><p>PLAN A · Saalbach (centrum)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html</code><p>PLAN B · Viehhofen (3 km od Saalbach)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html">AlpenParks Apartments Rehrenberg</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html</code><p>ARCHIWALNA · Viehhofen</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html">Duży dom wakacyjny 12–14 os. (do wyszukania)</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html</code><p>ARCHIWALNA · Viehhofen / Maishofen / strona Fieberbrunn</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html">Glemm Lodge Apartments ⭐⭐⭐⭐</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html</code><p>NIEDOSTĘPNY w terminie; referencja cenowa + opcja przy zmianie tygodnia · między Saalbach a Hinterglemm</p></li></ul></section>
|
||||||
<section data-section="Oferty — Ischgl/Paznaun"><h2>Oferty — Ischgl/Paznaun</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html">Apartment Brandau</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html</code><p>PLAN A · Kappl (Paznaun)</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html">Apartments Kappl</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html</code><p>PLAN B · Kappl (Paznaun)</p></li></ul></section>
|
<section data-section="Oferty — Ischgl/Paznaun"><h2>Oferty — Ischgl/Paznaun</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html">Apartment Brandau</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html</code><p>PLAN A · Kappl (Paznaun)</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html">Apartments Kappl</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html</code><p>PLAN B · Kappl (Paznaun)</p></li></ul></section>
|
||||||
|
|
|
||||||
BIN
pages/ski-2027-kb.zip
Normal file
BIN
pages/ski-2027-kb.zip
Normal file
Binary file not shown.
|
|
@ -159,7 +159,7 @@ td.thumb .placeholder { display: flex; width: 120px; height: 80px; border-radius
|
||||||
<nav><a href="/pages/index.html">Wszystkie karty</a> · <a href="/pages/porownanie.html">Porównanie ofert</a> · <a href="/pages/linki.html">Linki</a> · <a href="/viz.html">Graf</a></nav>
|
<nav><a href="/pages/index.html">Wszystkie karty</a> · <a href="/pages/porownanie.html">Porównanie ofert</a> · <a href="/pages/linki.html">Linki</a> · <a href="/viz.html">Graf</a></nav>
|
||||||
<h1>Ski 2027 — wyjazd 6–13.02.2027</h1>
|
<h1>Ski 2027 — wyjazd 6–13.02.2027</h1>
|
||||||
<p class="lead"><strong>6–13.02.2027</strong> (tydzień Fasching, szczyt sezonu), 4 rodziny / 14 osób, wyjazd z Warszawy. Od czego zacząć:</p>
|
<p class="lead"><strong>6–13.02.2027</strong> (tydzień Fasching, szczyt sezonu), 4 rodziny / 14 osób, wyjazd z Warszawy. Od czego zacząć:</p>
|
||||||
<ul class="tiles"><li><a href="/pages/porownanie.html">Porównanie ofert<small>Wszystkie noclegi w jednej sortowalnej tabeli: dostępność na 6–13.02, ceny, status ceny, priorytet, odległość od wyciągu.</small></a></li><li><a href="/pages/wyjazd.html">Analiza wariantów<small>Cztery regiony obok siebie: skipassy, dojazd, budżet całkowity grupy i wnioski przekrojowe.</small></a></li><li><a href="/viz.html">Graf powiązań<small>Struktura bazy wiedzy — koncepty, linki między nimi i adresy zewnętrzne. Załącznik, nie punkt wejścia.</small></a></li><li><a href="/pages/linki.html">Wszystkie linki<small>Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — do wrzucenia grupie.</small></a></li></ul>
|
<ul class="tiles"><li><a href="/pages/porownanie.html">Porównanie ofert<small>Wszystkie noclegi w jednej sortowalnej tabeli: dostępność na 6–13.02, ceny, status ceny, priorytet, odległość od wyciągu.</small></a></li><li><a href="/pages/wyjazd.html">Analiza wariantów<small>Cztery regiony obok siebie: skipassy, dojazd, budżet całkowity grupy i wnioski przekrojowe.</small></a></li><li><a href="/viz.html">Graf powiązań<small>Struktura bazy wiedzy — koncepty, linki między nimi i adresy zewnętrzne. Załącznik, nie punkt wejścia.</small></a></li><li><a href="/pages/linki.html">Wszystkie linki<small>Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — do wrzucenia grupie.</small></a></li><li><a href="/pages/ski-2027-kb.zip">Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj<small>Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model przeczyta całość i odpowie na pytania o wyjazd.</small></a></li></ul>
|
||||||
<h2>Regiony</h2>
|
<h2>Regiony</h2>
|
||||||
<p class="lead">Karta regionu = skipassy, dojazd, terminy, koszty życia i budżet całkowity.</p>
|
<p class="lead">Karta regionu = skipassy, dojazd, terminy, koszty życia i budżet całkowity.</p>
|
||||||
<ul class="regions"><li><a href="/pages/saalbach/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/alpenparks-sonnleiten/01.jpg')">Saalbach<small>Budżet grupy: ~16 200–19 500 €</small></a></li><li><a href="/pages/ischgl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/apartment-brandau-kappl/01.jpg')">Ischgl/Paznaun<small>Budżet grupy: ~14 200–17 000 €</small></a></li><li><a href="/pages/kronplatz/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haeuslerhof-valdaora/01.jpg')">Kronplatz<small>Budżet grupy: ~14 500–17 700 €</small></a></li><li><a href="/pages/sfl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haus-central-ladis/01.jpg')">SFL<small>Budżet grupy: ~14 500–17 900 €</small></a></li></ul>
|
<ul class="regions"><li><a href="/pages/saalbach/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/alpenparks-sonnleiten/01.jpg')">Saalbach<small>Budżet grupy: ~16 200–19 500 €</small></a></li><li><a href="/pages/ischgl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/apartment-brandau-kappl/01.jpg')">Ischgl/Paznaun<small>Budżet grupy: ~14 200–17 000 €</small></a></li><li><a href="/pages/kronplatz/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haeuslerhof-valdaora/01.jpg')">Kronplatz<small>Budżet grupy: ~14 500–17 700 €</small></a></li><li><a href="/pages/sfl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haus-central-ladis/01.jpg')">SFL<small>Budżet grupy: ~14 500–17 900 €</small></a></li></ul>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue