Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/sync-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ on:

permissions:
contents: write
actions: write

jobs:
sync:
Expand Down Expand Up @@ -45,6 +46,8 @@ jobs:
# derived from flowmcp-spec.
- name: Sync, commit and push (race-safe)
working-directory: flowmcp.github.io
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
Expand All @@ -60,6 +63,14 @@ jobs:
git commit -m "chore: sync spec from flowmcp-spec [auto]"
if git push origin HEAD:"$BRANCH"; then
echo "Pushed on attempt $attempt."
# A push made with GITHUB_TOKEN does NOT trigger deploy.yml's
# `on: push` (GitHub loop-protection), so synced spec changes would
# never go live on their own. Explicitly dispatch the deploy
# workflow. (Alternative: push these changes with a PAT instead of
# GITHUB_TOKEN, which would trigger `on: push` naturally.)
if [ "$BRANCH" = "main" ]; then
gh workflow run deploy.yml --ref "$BRANCH" || echo "::warning::deploy dispatch failed; site may not redeploy until next push"
fi
exit 0
fi
echo "Push rejected on attempt $attempt — concurrent push moved $BRANCH. Resetting to remote and re-syncing."
Expand Down
6 changes: 3 additions & 3 deletions src/components/HeaderCopyButton.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
// HeaderCopyButton.astro — Memo 064 Phase 4 PRD-009
// HeaderCopyButton.astro
// ONE small icon-only button injected on the heading line of every content page
// (via the PageTitle override). Click copies the page content as Markdown.
//
Expand Down Expand Up @@ -128,8 +128,8 @@ const labels = LABELS[ lang ]
const getPageMarkdown = async ( slug ) => {
if( !slug ) { throw new Error( 'HeaderCopyButton: missing slug' ) }
const trimmed = slug.replace( /^\/+|\/+$/g, '' )
// Memo 069 PRD-002: the slug comes from the URL pathname, so a directory
// page like /about/ yields slug "about". The generator
// The slug comes from the URL pathname, so a directory page like
// /about/ yields slug "about". The generator
// (generate-markdown-map.mjs) writes index pages as {dir}/index.md, so
// "about" → about/index.md, not about.md. Try the direct file first, then
// fall back to the {slug}/index.md variant for directory-index pages.
Expand Down
6 changes: 3 additions & 3 deletions src/components/PageTitleWithBreadcrumb.astro
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import Breadcrumb from './Breadcrumb.astro'
import SidebarHooks from './SidebarHooks.astro'
import HeaderCopyButton from './HeaderCopyButton.astro'

// Memo 064 Phase 4 PRD-009: exactly ONE small copy button on the heading line
// of every documentation page, injected via this PageTitle override. Replaces
// all manual per-page <CopyMarkdown mode="page"> embeds.
// Exactly ONE small copy button on the heading line of every documentation
// page, injected via this PageTitle override. Replaces all manual per-page
// <CopyMarkdown mode="page"> embeds.
//
// Suppressed on splash/landing pages (homepage, blog index, blog posts): those
// hide the page title and have no per-slug markdown source, so the button would
Expand Down
4 changes: 2 additions & 2 deletions src/content/docs/de/quickstart/how-it-works.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Die Schema-Schicht ist dein Arbeitsbereich. Alles andere wird von der Runtime ue

## Schema-Anatomie

Jedes FlowMCP v4.1.0 Schema nutzt das **Two-Export-Pattern**:
Jedes FlowMCP v4.3.0 Schema nutzt das **Two-Export-Pattern**:

### main (erforderlich)

Expand Down Expand Up @@ -227,5 +227,5 @@ Schemas, die versuchen Module zu importieren, auf das Dateisystem zuzugreifen od
:::

:::note
Fuer die vollstaendige Spezifikation einschliesslich aller Validierungsregeln, Parameterformate und Sicherheitsdetails, siehe die [Spezifikation v4.1.0](/de/specification/overview/).
Fuer die vollstaendige Spezifikation einschliesslich aller Validierungsregeln, Parameterformate und Sicherheitsdetails, siehe die [Spezifikation v4.3.0](/de/specification/overview/).
:::
21 changes: 1 addition & 20 deletions src/content/docs/team/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,7 @@ experience in API design, developer tooling, and open data.

## Team

{/*
TODO (PRD-31, Memo 052 Phase 8): Team-Mitglieder mit User-Sign-off einfuegen.

Personen-Daten erfordern explizite Freigabe. Pro Person folgendes Schema:

### Person Name
![Photo](/images/team/person-slug.png)
**Role:** Maintainer / Co-Founder / Contributor
[LinkedIn](https://linkedin.com/in/...)

Bio in 2-3 sentences. Focus: role, experience, relation to FlowMCP.
Tonality: sachlich (Anders-Persona). Keine Buzzwords, keine Emojis.

Vor dem Einfuegen:
1. Name, Rolle, Bio-Text vom User freigeben lassen
2. Optional: Profilbild in public/images/team/ ablegen
3. Optional: LinkedIn-URL ergaenzen
4. DE-Pendant (src/content/docs/de/roadmap/team.md) analog pflegen
5. Im Commit-Body User-Sign-off-Bestaetigung dokumentieren
*/}
{/* Team member profiles to be added with sign-off. */}

Will be filled by maintainer.

Expand Down
11 changes: 5 additions & 6 deletions src/pages/404.astro
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
---
// 404 Page — Memo 064 Phase 4 PRD-010
// 404 Page
// Pagefind search removed (locked decision). Page reduced to clear links:
// home + the main areas. Pagefind remains the GLOBAL Starlight search
// (SearchCustom.astro override) — only the 404 usage was removed here.
// History: Memo 057 PRD-03 introduced the (now removed) search field.
---

<html lang="en">
Expand Down Expand Up @@ -46,7 +45,7 @@
</main>

<style>
/* PRD-07: Skip-Link visible on focus */
/* Skip-Link visible on focus */
.skip-link {
position: absolute;
top: -40px;
Expand All @@ -65,9 +64,9 @@
outline-offset: 2px;
}

/* Memo 059 PRD-005 (A13, A14, A15):
* - logo (via /logo.svg) renders in Babyblau by default
* - --notfound-accent is the Babyblau brand colour (was purple #8c5dff)
/* Brand colour tokens:
* - logo (via /logo.svg) renders in baby blue by default
* - --notfound-accent is the baby blue brand colour
* - --notfound-muted aligns with --color-text-secondary token in custom.css */
:root {
--notfound-bg: #0e0f12;
Expand Down
11 changes: 5 additions & 6 deletions src/pages/blog/[...slug].astro
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
---
// Memo 060 PRD-005 (Phase 1a.4): Standalone-Page wurde zu einem duennen
// Wrapper um BlogPostLayout.astro reduziert. getStaticPaths bleibt hier,
// damit Astro die Routen aus der `blog`-Content-Collection generiert; die
// eigentliche Render-Logik (Title + Author + Tags + Reading-Progress +
// Custom-TOC + Share + Related-Posts) lebt jetzt im Layout und wird ueber
// <StarlightPage> in den Starlight-Frame eingebettet.
// Thin wrapper around BlogPostLayout.astro. getStaticPaths stays here so
// Astro generates the routes from the `blog` content collection; the actual
// render logic (Title + Author + Tags + Reading-Progress + Custom-TOC +
// Share + Related-Posts) lives in the layout and is embedded via
// <StarlightPage> into the Starlight frame.
import BlogPostLayout from '../../layouts/BlogPostLayout.astro'
import { getCollection } from 'astro:content'

Expand Down
9 changes: 4 additions & 5 deletions src/pages/blog/index.astro
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
---
// Memo 060 PRD-005 (Phase 1a.5): Standalone-Page wurde zu einem duennen
// Wrapper um BlogIndexLayout.astro reduziert. Die eigentliche Render-Logik
// (Featured + Filter + Grid) lebt jetzt im Layout und wird ueber
// <StarlightPage> in den Starlight-Frame eingebettet — damit greift der
// globale Header.astro mit funktionaler Pagefind-Search + LanguageSelect.
// Thin wrapper around BlogIndexLayout.astro. The actual render logic
// (Featured + Filter + Grid) lives in the layout and is embedded via
// <StarlightPage> into the Starlight frame — so the global Header.astro
// with the functional Pagefind search + LanguageSelect applies.
import BlogIndexLayout from '../../layouts/BlogIndexLayout.astro'
---
<BlogIndexLayout lang="en" />
8 changes: 4 additions & 4 deletions src/pages/configurator.astro
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
// Memo 121 Phase 5 (PRD-008): thin wrapper around ConfiguratorLayout.astro.
// The render logic lives in the layout, embedded via <StarlightPage> so the
// global Header.astro / Footer.astro apply unchanged (integration constraint,
// Memo 121 Kap. 2). Mirrors the src/pages/blog/index.astro pattern.
// Thin wrapper around ConfiguratorLayout.astro. The render logic lives in
// the layout, embedded via <StarlightPage> so the global Header.astro /
// Footer.astro apply unchanged (integration constraint). Mirrors the
// src/pages/blog/index.astro pattern.
import ConfiguratorLayout from '../layouts/ConfiguratorLayout.astro'
---
<ConfiguratorLayout lang="en" />
17 changes: 8 additions & 9 deletions src/scripts/mermaid-zoom.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Mermaid-Zoom — Memo 088 Kap. 5 (Phase 2)
// Lightbox fuer rehype-mermaid inline-svg. Kein .mermaid-Wrapper:
// rehype-mermaid rendert bare <svg id="mermaid-…">. Vanilla, keine Dependency.
// Portiert aus cli/memo-toolkit/editor/src/MemoView.mjs (:8047-8082).
// Mermaid zoom
// Lightbox for rehype-mermaid inline SVG. No .mermaid wrapper:
// rehype-mermaid renders a bare <svg id="mermaid-…">. Vanilla, no dependency.

const OVERLAY_ID = 'flowmcp-mermaid-overlay'
const TARGET_SELECTOR = '.sl-markdown-content svg[id^="mermaid"]'
Expand All @@ -26,11 +25,11 @@ const openOverlay = ( svgEl ) => {
const overlay = ensureOverlay()
const stage = overlay.querySelector( '.mermaid-overlay__stage' )
const clone = svgEl.cloneNode( true )
// ID NICHT entfernen: rehype-mermaid bettet die Theme-Styles als
// id-skopierte Regeln ein (`#mermaid-N .node rect { fill: … }`). Ohne die ID
// greift keine Regel mehr und das SVG faellt auf SVG-Default fill:#000 zurueck
// (schwarze Boxen). Das Duplikat-ID-Risiko ist unkritisch (Original liegt
// unsichtbar hinter dem Overlay).
// Do NOT remove the ID: rehype-mermaid embeds the theme styles as
// id-scoped rules (`#mermaid-N .node rect { fill: … }`). Without the ID no
// rule matches and the SVG falls back to the SVG default fill:#000
// (black boxes). The duplicate-ID risk is harmless (the original sits
// invisibly behind the overlay).
clone.removeAttribute( 'style' )
clone.style.width = '100%'
clone.style.height = '100%'
Expand Down
Loading
Loading