Skip to content

v0.6.5

Latest

Choose a tag to compare

@github-actions github-actions released this 20 Jul 19:24
a6bca44

0.6.5 — 2026-07-16

Upgrade notes for admins

  • Run migrations after upgrading. 0008_remove_documentationsource_file_patterns
    drops the file_patterns column — any custom glob patterns previously set
    are gone; every documentation source now only ever parses *.md files.
    0009_alter_documentationsource_folder_name is metadata-only (updated
    help_text), no data changes.
  • The app no longer ships a default "TetherDust Documentation" source under
    sources/docs/ — a fresh install now starts with zero documentation
    sources. If you relied on the shipped product docs being registered out of
    the box, pull them from an earlier tag or write your own.

Changed

  • Generate Documentation and Generate Documentation Library both gained a
    fourth wizard step, Prompt, after Sources — a read-only live preview
    of the exact prompt that will be sent to the agent (base template + Scope
    & goals + the create_documentation tool instructions built from the
    selected destination/sources), debounced 400ms after the last edit to
    Type/Library type, Scope, or Sources. Backed by two new no-side-effect
    API actions, generate-preview and generate-library-preview, which
    reuse the exact prompt-building code the real generate/generate-library
    actions call (extracted into docgen.build_single_generation_prompt() /
    build_library_generation_prompt() so there's one source of truth for
    what gets sent). The preview renders as formatted Markdown (reusing the
    same react-markdown/remark-gfm + .doc-result-preview__content
    styling as the generation result preview) rather than raw text, since the
    prompt itself is Markdown.
  • The Codebases admin list's Activity column is now labeled Status,
    matching the Database Connections list's column name for the same
    ACTIVE/INACTIVE badge.
  • The Documentation Sources admin list's Validate result now renders as
    a full-width row under the source, matching the Database Connections
    list's Test result — instead of a small badge squeezed next to the
    button.
  • Add Documentation's option picker now groups its choices into Manual
    and Generate using AI sections, matching the grouped pickers on Add
    Database Connection and Add Codebase.
  • Delete confirmation on the Documentation Sources admin list now uses the
    same styled in-app dialog as the Database Connections and Codebases
    lists, instead of the browser's native confirm() popup.
  • Delete failure on the Documentation Sources admin list (e.g. the folder
    still exists on disk) now shows the error in a new styled AlertDialog
    (components/AlertDialog.tsx) matching ConfirmDialog's look, instead of
    the browser's native alert() popup.
  • Edit Documentation Source now shares the same numbered wizard-section
    layout as Add Documentation Source (Identity / Configuration), instead of
    a plain two-card layout — matching how Edit/Add already look identical on
    Database Connections and Codebases.
  • Added a CustomSelect component (admin/components/forms.tsx) — a styled
    dropdown matching the app's look (glass panel, cyan focus ring, uppercase
    labels) instead of the browser's native <select> popup, using CSS
    (.custom-select, already present in forms.css/tokens.css for both
    themes but previously unused by any component) with full keyboard support
    (arrow keys, Enter, Escape). Wired it into the Type dropdown on
    Generate Documentation, the Library type dropdown on Generate
    Documentation Library, and the Type dropdown on Edit Documentation
    Source's Configuration step, replacing their native selects.
  • Added a ComboInput component (admin/components/forms.tsx) — a styled
    text input + suggestions dropdown (see .combo-input in docsgen.css,
    likewise already present but unused) replacing the browser's native
    <input list> / <datalist> autocomplete. Unlike CustomSelect it stays
    free-text: any value can still be typed and submitted, and the dropdown
    shows matching existing folders plus a Create "…" entry when the typed
    value doesn't match one of them. Wired it into Generate Documentation's
    Destination folder field, replacing its <datalist>-backed input.
  • Removed the configurable File patterns feature from Documentation
    Sources entirely — every source now only ever parses *.md files, with no
    way to widen or narrow that per source. Removed: the file_patterns
    column on DocumentationSource (migration
    0008_remove_documentationsource_file_patterns), the field from the
    admin API/serializer and both DocSourceInput/DocSource frontend
    types, the "File patterns (JSON)" field and "Optional Configurations"
    step on Edit Documentation Source (back down to two steps: Identity,
    Configuration), the Patterns column on the Documentation Sources
    list, and DocumentationSourceConfig.file_patterns plus every glob-list
    loop in tdmcp (markdown_parser.py, server.py,
    tools/create_documentation.py, tools/__init__.py's direct-SQL admin-DB
    loader) — all hardcoded to *.md instead. The Documentation Sources
    admin list's Validate action and the docs viewer's file tree
    (api/v1/docs.py) both still work the same, just without the
    configurability.
  • Removed the built-in "TetherDust Documentation" source (24 Markdown files
    under sources/docs/TetherDust Documentation/) and the boot-time code that
    registered it. The app no longer ships any default documentation source —
    sources/docs/ starts empty. Removed the .gitignore carve-out that kept
    that one folder tracked (sources/docs/* now has no exception). Deleted
    engine/builtin_docs.py and its apps.py post-migrate hook entirely —
    besides seeding the shipped source, it only ran the same
    sync_from_filesystem() that docker-entrypoint.sh already runs on every
    boot and DocSourceViewSet.list() already runs on every admin-list load,
    so it added no coverage beyond those two once the seeding was gone.
  • Swept for leftovers from the file-patterns/register-a-folder/shipped-docs
    removals above: fixed remaining "documentations/" copy (a folder name that
    never actually existed — the real path is sources/docs/) across Add/Edit
    Documentation Source, Generate Documentation, and Generate Documentation
    Library, plus their backend docstrings/help_text; fixed the Documentation
    Sources empty-state copy ("Register a folder…") and the Add Documentation
    "Edit it" step (still mentioned setting "file patterns") to match current
    behavior.
  • Removed the Register a folder option from Add Documentation — dropping
    a folder under documentations/ already auto-registers it (with default
    type/description/patterns) the next time the admin list loads, so the
    manual create form was redundant with editing the auto-created source
    afterward. The Manual section now explains those three steps (create,
    auto-register, edit) instead of showing a button. Documentation Sources
    are edit-only in the admin UI now; DocSourceFormPage dropped its create
    branch, the docsources/register route, createDocSource/
    getDocSourceFolders API calls, and the backend's now-unused folders
    action.

Fixed

  • DATABASE_LIBRARY_GUIDE (the library-generation prompt template used by
    the new Prompt step) had two spots where a fenced example was nested
    inside another fence using the same 3-backtick marker (a
    ```mermaid/```sql block inside a ```markdown block) —
    CommonMark can't nest identical fences, so the inner fence's non-bare
    line doesn't close anything, but its own bare closing does close the *outer* fence early, leaving a stray trailing that opens a new,
    never-closed fence. In the "Data Flows" example this self-corrected by
    chance a few blocks later, but the "Example Queries" example's stray
    fence stayed open for the rest of the document — every heading and table
    after it (Style rules, Checklist, ...) got swallowed into one
    giant code block and rendered as flat text instead of real Markdown
    structure. Fixed both by bumping the outer fence to 4 backticks, the
    standard way to nest a 3-backtick fence inside another. Verified all
    fences in the file now balance.
  • The Prompt step's live preview flashed to "Loading preview…" on every edit
    to Type/Library type, Scope, or Sources — each debounced input change gave
    the preview query a new key, and without placeholderData, TanStack
    Query cleared data (so isLoading went true again) until the refetch
    resolved. Added placeholderData: keepPreviousData so the previous
    prompt stays on screen while the next one is fetched, and the loading
    message only ever shows once, before the very first preview arrives.
  • Removed the Agent picker from Generate Documentation and Generate
    Documentation Library's Configuration step. Both forms already
    auto-selected the active agent as the default and never offered a real
    reason to pick a different one, so the dropdown just added a step to a
    choice that was already made. Both forms now always use the active
    agent; if none is active, the form shows an error and disables the
    Generate button instead of submitting and failing with a generic
    "Missing required fields" response.
  • Removed the Is active toggle from Edit Documentation Source — it was
    silently non-functional. is_active is derived from folder presence
    under sources/docs/ by DocSourceService.sync_from_filesystem(), which
    runs on every admin-list load and unconditionally reactivates any source
    whose folder still exists. So manually turning a source inactive got
    reverted the moment the admin list was fetched again, undoing the change
    before an admin could even see it take effect. is_active is now a
    read-only field on the API (DocSourceSerializer) — it only ever changes
    via deleting/restoring the folder on disk, matching the actual behavior.
  • Generate Documentation Library was missing the Scope & goals field
    that Generate Documentation (single page) already had — the gap ran the
    whole way down: build_library_prompt() had no scope parameter,
    docgen.start_library() never threaded one through, and the
    generate-library API action never read one from the request. Added
    scope end-to-end (prompt builder → engine → API → frontend) for both
    Generate Documentation and Generate Documentation Library. On both forms,
    Scope & goals now lives in the Configuration step (alongside Type/
    Library type) instead of a separate "Optional Configurations" step, and
    Source material moved out of Configuration into its own new Sources
    step — three required steps (Identity, Configuration, Sources) instead of
    two required plus one optional.
  • The Sources step's category headings ("Database", "Documentation",
    "Codebase") on Generate Documentation, Generate Documentation Library,
    and Generate Dashboard Chart now use the same bold, full-contrast,
    wide-letter-spaced style as the Config step's field labels (Type, Library
    type, Agent), instead of a dimmer, tighter-spaced, muted-gray style that
    read as a lower priority than it should.
  • The Source material picker (shared by Generate Documentation, Generate
    Documentation Library, and Generate Dashboard Chart) laid its Database /
    Documentation / Codebase category columns out stacked on top of each
    other. They now render side by side in a 3-column grid (stacking back to
    one column below 800px), and the redundant "Source material" heading was
    removed from the Sources step on the two documentation-generation forms —
    the step heading already says "Sources".
  • Delete Documentation Source used to attempt removing the folder from disk
    itself, but the backend container's ./sources/docs mount is read-only,
    so that silently failed — and since the folder still existed, the very
    next admin-list refetch re-discovered it via the filesystem sync and
    recreated the source, making the delete look like a no-op. The mount stays
    read-only; Delete now instead checks whether the folder is still present
    and, if so, rejects with a message asking the admin to delete the folder
    from disk first and click Delete again to remove it from the list.
  • The docs viewer sidebar's file tree indented files by depth * var(--md) in
    an inline style, double-counting nesting depth on top of the margin-left
    each ancestor folder already contributes via .docs-dir — files ended up
    one tab short of their sibling folders at the top level (and drifted
    further off at deeper nesting). Removed the inline style so files fall
    back to .docs-file-btn's existing fixed calc(var(--lg) + var(--md))
    left padding, which combined with the inherited ancestor margins now lines
    files up with their sibling folders at every depth.
  • backend/engine/prompts/docs.py's wiki-link instructions (WIKILINK_NOTE,
    TETHERDUST_CONTEXT, and LIBRARY_GUIDE) under-specified how [[...]]
    paths resolve, and LIBRARY_GUIDE's subsystem cross-link example (see [[X]]) actively modeled the wrong pattern: bare filenames only resolve
    against the library root, never the current page's folder, but the guide
    didn't say that plainly and its own example omitted the folder-qualified
    path deep-dive pages actually need. AI-generated libraries whose deep-dive
    pages live in subfolders (the common case — LIBRARY_GUIDE itself tells
    the agent to reach for Subsystems/, Schemas/, API/ folders) ended up
    with bare-filename and relative ../ links between subfolder pages, none
    of which the frontend's wikilink.ts resolver supports — every such link
    rendered "This page doesn't exist or you don't have permission". Reworded
    all three to state the rule unambiguously (bare filenames only work
    library-root-to-library-root; every other link, including between two
    pages in the same subfolder, needs the full <LibraryRoot>/Subfolder/ Page.md path; there is no ../ syntax), fixed LIBRARY_GUIDE's example
    to use a folder-qualified path, and added the same rule to its "What to
    avoid" and checklist sections. DATABASE_LIBRARY_GUIDE already stated the
    full-path rule correctly and was left as-is.