diff --git a/CHANGELOG.md b/CHANGELOG.md index a78ca00..f78e78a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,19 @@ for 1.0.0 have something to be assembled from. ## Unreleased +## 1.0.2 + +- **The documentation moved to the [wiki](https://git.houmeres.sk/Houmeres/LLeMbas/wiki).** + `CLAUDE.md`, `PLAN.md` and `docs/` are gone from the repository: they are + documentation *about* this project rather than part of it, and a clone should + carry software. Nothing was lost — the working notes, the roadmap and the eight + topic notes are all there, with every internal link rewritten, and the README + now opens onto them. Where a source comment said "see `CLAUDE.md`" it now says + "see the working notes". +- Entries below this one still name `PLAN.md` and `docs/notes/…`, and are left as + they were written. A changelog records what happened at the time; rewriting old + entries to match a later decision makes it a worse record, not a better one. + ## 1.0.1 - Fixed: the Updates page showed **"v1.0.0 (reports 1.0.0)"** — two spellings of diff --git a/README.md b/README.md index d4c8104..f43bca3 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,24 @@ runtime. Clone it, `pip install -e .`, run it. OCR for scanned PDFs · conversation branching · chat export · archived chats. -See [PLAN.md](PLAN.md) for what is built, what is not, and why. +See the [Roadmap](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Roadmap) for what +is built, what is not, and why. + +## Documentation + +The **[wiki](https://git.houmeres.sk/Houmeres/LLeMbas/wiki)** carries everything +about how this works and why — it is documentation *about* the project rather +than part of it, so a clone stays software. + +- **[Working notes](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Working-notes)** + — read this before changing anything. The hard rules the project is built + around, the layout, and a long catalogue of *things that will bite you*: bugs + that shipped looking correct, why each happened, and what stops it recurring. +- **[Roadmap](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Roadmap)** — what is + built, what is deliberately not, and the reasoning behind each. +- A page each for agent chats, schedules and reports, permissions and sharing, + search and extraction, image generation, subagents, branding, and the manual + release checklist. ## Quick start @@ -479,7 +496,7 @@ python scripts/fetch_vendor.py # verify vendored JS against the lockfile There is no Alembic. The schema is SQLite-only and synchronised at startup: missing tables and missing columns are added automatically, so adding a field to a model needs nothing but a restart. Renames, drops and retypes are still manual -— see `CLAUDE.md`. +— see the [working notes](https://git.houmeres.sk/Houmeres/LLeMbas/wiki/Working-notes). ## Artwork diff --git a/src/lembas/__init__.py b/src/lembas/__init__.py index 056cc7a..9fa4e24 100644 --- a/src/lembas/__init__.py +++ b/src/lembas/__init__.py @@ -1,3 +1,3 @@ """LLeMbas - a Middle-earth themed web UI for OpenAI-compatible LLM endpoints.""" -__version__ = "1.0.1" +__version__ = "1.0.2" diff --git a/src/lembas/api/admin_images.py b/src/lembas/api/admin_images.py index 6ff9bca..b215ffb 100644 --- a/src/lembas/api/admin_images.py +++ b/src/lembas/api/admin_images.py @@ -3,7 +3,7 @@ Two shapes on one nav entry, because they are two different kinds of thing. The connection, the checkpoints and the switches are instance settings and get a settings page. A workflow is an authored document with a name, a description and -a body, so the workflows are list-plus-detail -- the shape `CLAUDE.md` requires +a body, so the workflows are list-plus-detail -- the shape the working notes require of any admin list, and for the reason it gives: a page that renders a ten-line JSON textarea per row is unusable at three rows. diff --git a/src/lembas/api/agents.py b/src/lembas/api/agents.py index 63dc6b0..c19dbe0 100644 --- a/src/lembas/api/agents.py +++ b/src/lembas/api/agents.py @@ -238,7 +238,7 @@ async def browse_profile( it holds for the same reason -- somebody who owns the credential could list the directory with an ssh client -- but it does mean Manual mode's promise that everything is shown to you first now has a second exception. Both are - written down in CLAUDE.md. + written down in the working notes. """ profile = _profile(db, user, profile_id) entries: list = [] diff --git a/src/lembas/api/chats.py b/src/lembas/api/chats.py index 122de42..c8a79c7 100644 --- a/src/lembas/api/chats.py +++ b/src/lembas/api/chats.py @@ -985,7 +985,7 @@ def _too_many_replies(db: DBSession, chat: Chat, user: User) -> str: """Why this account may not start another reply right now, or "". In-process, and that is exact rather than approximate only because this - application runs one worker -- see the first known limit in PLAN.md. With + application runs one worker -- see the first known limit in the roadmap. With several, this becomes a guess, and a quota that is a guess should be a number in the database instead. Stated here rather than discovered. """ diff --git a/src/lembas/main.py b/src/lembas/main.py index bc248bd..ab35ff2 100644 --- a/src/lembas/main.py +++ b/src/lembas/main.py @@ -263,7 +263,7 @@ def register_error_handlers(app: FastAPI) -> None: # Flavour lives in error pages, empty states and theme names -- never in the -# functional UI. See CLAUDE.md. +# functional UI. See the working notes. # # The three lines themselves moved into `services/branding.py` with the rest of # what an administrator can replace. What is left here is the mapping from a diff --git a/src/lembas/services/agent/index.py b/src/lembas/services/agent/index.py index d5a8b44..2cd4913 100644 --- a/src/lembas/services/agent/index.py +++ b/src/lembas/services/agent/index.py @@ -18,7 +18,7 @@ a model choosing to run something. Both are read-only, both are built here rather than assembled from anything a model said, and the project directory is configuration rather than input. It is still an exception to Manual mode's "everything is shown to you before it happens", and it is written down in -CLAUDE.md next to the others. +the working notes, next to the others. **Nothing here is trusted.** Filenames come off somebody else's machine and end up inside a system prompt, so they are stripped of control characters, capped diff --git a/src/lembas/services/agent/jobs.py b/src/lembas/services/agent/jobs.py index be67649..53f827b 100644 --- a/src/lembas/services/agent/jobs.py +++ b/src/lembas/services/agent/jobs.py @@ -184,7 +184,7 @@ def launch_and_wait_command(chat_id: str, job_id: str, command: str, max_bytes: # operand and formats to "", whose angle brackets and # parentheses are shell syntax -- so this line died with a syntax error, # after the sentinel where nothing reads it, and every job's four files - # were left on the far side forever. See the note in CLAUDE.md. + # were left on the far side forever. See the note in the working notes. f"rm -f {_file(chat_id, job_id, 'sh')} {pid} {logf} {exit_}\n" ) diff --git a/src/lembas/services/branding.py b/src/lembas/services/branding.py index 7e31f45..470557a 100644 --- a/src/lembas/services/branding.py +++ b/src/lembas/services/branding.py @@ -7,7 +7,7 @@ are separate because they fail differently: shows; - **flavour text** — the Middle-earth lines, which live in the artwork, the empty states, the loading lines and the error pages and nowhere else (see the - flavour rule in CLAUDE.md), and which somebody rebranding needs to be able to + flavour rule in the working notes), and which somebody rebranding needs to be able to replace without editing templates; - **themes**, which are token sets rather than stylesheets, because the invariant that no component hard-codes a colour is what makes a third one @@ -36,7 +36,7 @@ page and by nothing else. The cost of being a cache is stated rather than discovered: with several workers, a save in one is not seen by the others until each next reads. That is already true of this application for other reasons -- see the "one worker" note -in PLAN.md -- and this does not make it worse. +in the roadmap -- and this does not make it worse. """ from __future__ import annotations diff --git a/src/lembas/services/tools.py b/src/lembas/services/tools.py index 2adf164..b67e17b 100644 --- a/src/lembas/services/tools.py +++ b/src/lembas/services/tools.py @@ -383,7 +383,7 @@ async def _run_fetch(context: ToolContext, args: dict[str, Any]) -> ToolOutcome: Straight through `services/fetch.py`, which owns the SSRF guard, the hand-rolled redirect loop that re-checks every hop, and the content-type - sniff. Deliberately not a second HTTP client: CLAUDE.md already names three + sniff. Deliberately not a second HTTP client: the working notes already name three places that follow redirects by hand as the ceiling, and a fourth is how one of them loses its check. """ diff --git a/src/lembas/web/templates/messages/index.html b/src/lembas/web/templates/messages/index.html index d876713..c91439e 100644 --- a/src/lembas/web/templates/messages/index.html +++ b/src/lembas/web/templates/messages/index.html @@ -118,7 +118,7 @@ toggling their panel twice, which is to say doing nothing at all. None of it looks like a script loaded twice. Found by driving the file under a - DOM stub, which is the rule `CLAUDE.md` sets out and the reason it does. + DOM stub, which is the rule the working notes set out and the reason it does. #} {% block scripts %} diff --git a/src/lembas/web/templates/offline.html b/src/lembas/web/templates/offline.html index 8043bb8..b384492 100644 --- a/src/lembas/web/templates/offline.html +++ b/src/lembas/web/templates/offline.html @@ -5,7 +5,7 @@ Cached at install time, so it has to stand entirely on its own: no user, no chats, nothing that was rendered from the database. One of the few places - flavour belongs -- see the flavour rule in CLAUDE.md. + flavour belongs -- see the flavour rule in the working notes. #} {% block title %}Offline - {{ brand.name }}{% endblock %}