From 608c3ae8b932a94251dd8ddde4679676c1de2959 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 26 May 2026 18:21:18 +0000 Subject: [PATCH] docs: add GitHub Pages workflow and Ask AI affordances - Add MkDocs Material config, docs landing page, and pinned docs/requirements.txt - Deploy site/ to Pages on main via actions/upload-pages-artifact + deploy-pages - Perplexity/ChatGPT banner, floating Ask AI (Perplexity), extra CSS - Ignore local site/; document preview in DEVELOPMENT and Pages setup in CONTRIBUTING - Link published docs from README and pyproject Documentation URL Co-authored-by: Gottam Sai Bharath --- .github/workflows/pages.yml | 55 +++++++++++++++++++++++++ .gitignore | 3 ++ CHANGELOG.md | 1 + CONTRIBUTING.md | 4 ++ DEVELOPMENT.md | 11 +++++ README.md | 2 + docs/index.md | 33 +++++++++++++++ docs/javascripts/ask-ai.js | 31 ++++++++++++++ docs/requirements.txt | 3 ++ docs/stylesheets/extra.css | 30 ++++++++++++++ mkdocs.yml | 82 +++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + 12 files changed, 256 insertions(+) create mode 100644 .github/workflows/pages.yml create mode 100644 docs/index.md create mode 100644 docs/javascripts/ask-ai.js create mode 100644 docs/requirements.txt create mode 100644 docs/stylesheets/extra.css create mode 100644 mkdocs.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..122f691 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,55 @@ +# Builds MkDocs site from docs/ and deploys to GitHub Pages. +# +# One-time repo setup (maintainer): Settings → Pages → Build and deployment → +# Source: GitHub Actions. The first successful run publishes the site. +name: Deploy documentation to GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + cache-dependency-path: docs/requirements.txt + + - name: Install MkDocs + run: pip install -r docs/requirements.txt + + - name: Build site + run: mkdocs build --strict + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 0a70fe5..2539546 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ web/node_modules/ .tools/ build/ dist/ + +# MkDocs (local `mkdocs build`; GitHub Pages uploads `site/` from CI only) +/site/ *.egg-info/ .coverage htmlcov/ diff --git a/CHANGELOG.md b/CHANGELOG.md index b6204d0..b69acc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This project follows [Semantic Versioning](https://semver.org/). From **v1.0.0** ### Added +- **Documentation (GitHub Pages):** workflow **`.github/workflows/pages.yml`** builds **`docs/`** with MkDocs Material on pushes to **`main`**; published URL on **`[project.urls] Documentation`**, README, **`DEVELOPMENT.md`**, and **`CONTRIBUTING.md`**. The static site includes a dismissible **Ask AI** banner (Perplexity / ChatGPT / repo) and a floating **Ask AI** shortcut (Perplexity with docs + repo context); no FlightDeck servers are involved. - **Web UI (`flightdeck serve`):** **`/#/settings`** for appearance (Light / Dark / System, **`flightdeck-theme`**); collapsible sidebar (**`flightdeck-sidebar-collapsed`**); **offline system font stack** (no remote font CSS); sidebar + favicon use **bundled** **`/assets/flightdeck-icon-*.png`** with stable **`GET /flightdeck-icon.png`** fallback; **`html[data-theme="dark"]`** tokens and Playwright **`web/e2e/`** (`smoke` icon checks, `theme.spec.ts`, `sidebar.spec.ts`). - **`flightdeck pricing check`** — reports **`flightdeck-bundled-*`** snapshot age vs **`--max-age-days`** (default **90**); **`--fail`** for CI. **`release diff`** / **`POST /v1/diff`** append **`pricing.warnings`** when bundled snapshots exceed the same age threshold. - **`flightdeck.integrations.telemetry.configure_otel_tracing()`** — optional OTLP HTTP **`TracerProvider`** wiring when the **`telemetry`** extra is installed (see **`docs/sdk-integrations.md`**). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24081f1..57f04e1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,6 +55,10 @@ If you change **`pyproject.toml`** dependencies, run **`uv lock`** and commit ** Details, Windows notes, and doctrine: **`AGENTS.md`** (Verification), **`DEVELOPMENT.md`**, **`web/README.md`**. +## GitHub Pages (maintainers) + +The **Deploy documentation to GitHub Pages** workflow publishes **`docs/`** on pushes to **`main`**. In the GitHub repo, use **Settings → Pages → Build and deployment → Source: GitHub Actions** so the workflow can attach the **`github-pages`** environment. The live URL is linked from the root **`README.md`** and **`pyproject.toml`** **`Documentation`** URL. + ## Private files and pushing to GitHub Do not commit credentials, customer data, internal strategy docs, or local ledger data. The repo ignores **`.flightdeck/`**, **`.env*`**, optional **`private/`** / **`secrets/`**, and common key/credential patterns—see **`.gitignore`** and **[SECURITY.md](SECURITY.md)**. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index f1d2c5c..ece000c 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -282,3 +282,14 @@ Use **`uv run python -m pytest`** from the repo root so imports like **`from tes | `VITE_FLIGHTDECK_LOCAL_API_TOKEN` | Web dev server | Build-time variable for the React UI dev server (Vite). Copy `web/.env.example` → `web/.env.local` to set it when testing mutations through `npm run dev` against a token-protected server. | | `VITE_DEV_PROXY_TARGET` | Web dev server | Overrides the Vite proxy target for `/v1` (default: `http://127.0.0.1:8765`). | | `TMPDIR` / `TEMP` / `TMP` | Tests / OS | Standard temp directory environment variables. Set any of these to a repo-local `.tmp/` path if the OS default is restricted or permissions cause pytest failures. | + +## Documentation site (MkDocs) + +The Markdown under **`docs/`** is also built as a static site for **[GitHub Pages](https://flightdeckdev.github.io/flightdeck/)** (workflow **`.github/workflows/pages.yml`**). To preview locally: + +```bash +pip install -r docs/requirements.txt +mkdocs serve +``` + +Then open the URL MkDocs prints (usually **http://127.0.0.1:8000/**). The build output directory **`site/`** is gitignored; CI uploads it as the Pages artifact. diff --git a/README.md b/README.md index 8501379..8f4cf48 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,8 @@ Bundled pricing from `init` is a **convenience snapshot**—`flightdeck pricing ## Documentation +**Published site (GitHub Pages):** [flightdeckdev.github.io/flightdeck](https://flightdeckdev.github.io/flightdeck/) — built from `docs/` on each push to `main` (`.github/workflows/pages.yml`). Enable **Pages → GitHub Actions** in the repository settings if the site is not live yet. + | Area | Links | |------|--------| | CLI | [docs/cli.md](docs/cli.md) | diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c9e908c --- /dev/null +++ b/docs/index.md @@ -0,0 +1,33 @@ +# FlightDeck documentation + +FlightDeck helps teams **ship AI agents safely** with **release diffs**, **runtime evidence**, and **policy gates**. + +This site mirrors the Markdown guides in the [flightdeck repository](https://github.com/flightdeckdev/flightdeck). Use the navigation on the left for the full reference. Repository-only pages (for example `SECURITY.md` at the repo root) are linked from the guides where relevant—open those on GitHub when you need the latest wording. + +## Ask AI + +Use the **dismissible banner** at the top to open **Perplexity** or **ChatGPT** in a new tab. Mention this documentation site or the GitHub repo so answers stay grounded in the real product surface (CLI, `release.yaml`, HTTP `/v1` routes, policy). + +## Quick links + +| Topic | Doc | +|--------|-----| +| Commands, flags, exit codes | [CLI reference](cli.md) | +| `flightdeck serve` JSON API | [HTTP API](http-api.md) | +| Diff, promote, rollback, SQLite | [Operations & policy](operations-and-policy.md) | +| `release.yaml`, workspace config | [Release artifact](release-artifact.md) | +| Optional pricing catalog YAML | [Pricing catalog](pricing-catalog.md) | +| `flightdeck` Python client | [Python SDK](sdk.md) | +| Experimental adoption hooks | [SDK integrations](sdk-integrations.md) | +| Shipped web UI vs roadmap | [Web UI](web-ui.md) · [UI roadmap](ui-roadmap.md) | +| Common failures | [Troubleshooting](troubleshooting.md) | + +## Install (local) + +```bash +uv sync --extra dev +uv run flightdeck --help +uv run flightdeck-quickstart-verify +``` + +See [DEVELOPMENT.md](https://github.com/flightdeckdev/flightdeck/blob/main/DEVELOPMENT.md) on GitHub for full contributor setup, web bundle rebuild, and CI parity. diff --git a/docs/javascripts/ask-ai.js b/docs/javascripts/ask-ai.js new file mode 100644 index 0000000..5031275 --- /dev/null +++ b/docs/javascripts/ask-ai.js @@ -0,0 +1,31 @@ +/* Floating “Ask AI” — opens Perplexity with repo + docs context (no FlightDeck servers). */ +(function () { + var url = + "https://www.perplexity.ai/search?q=" + + encodeURIComponent( + "FlightDeck: AI agent release governance (CLI, SQLite ledger, policy gates, diff, promote). Official docs site https://flightdeckdev.github.io/flightdeck/ and source https://github.com/flightdeckdev/flightdeck — answer using those when possible." + ); + + function addButton() { + if (document.getElementById("fd-floating-ask-ai")) { + return; + } + var a = document.createElement("a"); + a.id = "fd-floating-ask-ai"; + a.href = url; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.textContent = "Ask AI"; + a.setAttribute( + "aria-label", + "Ask AI about FlightDeck in Perplexity (new tab)" + ); + document.body.appendChild(a); + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addButton); + } else { + addButton(); + } +})(); diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..d9aaaa6 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +# Pinned for reproducible GitHub Pages builds (not part of the Python package). +mkdocs==1.6.1 +mkdocs-material==9.6.14 diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..1c9a67b --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,30 @@ +/* Slightly stronger “Ask AI” strip (Material theme `extra.announce`) */ +.md-banner { + font-size: 0.85rem; +} + +.md-banner a { + font-weight: 600; + text-decoration: underline; + text-underline-offset: 2px; +} + +/* Floating Perplexity shortcut (paired with docs/javascripts/ask-ai.js) */ +#fd-floating-ask-ai { + position: fixed; + bottom: 1.25rem; + right: 1.25rem; + z-index: 200; + padding: 0.45rem 1rem; + border-radius: 999px; + background: var(--md-primary-fg-color); + color: var(--md-primary-bg-color) !important; + font-weight: 600; + font-size: 0.8rem; + box-shadow: var(--md-shadow-z2); + text-decoration: none !important; +} + +#fd-floating-ask-ai:hover { + opacity: 0.92; +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..7cb61d1 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,82 @@ +site_name: FlightDeck documentation +site_description: Release diffs, runtime evidence, and policy gates for AI agents. +site_url: https://flightdeckdev.github.io/flightdeck/ +repo_url: https://github.com/flightdeckdev/flightdeck +repo_name: flightdeckdev/flightdeck +edit_uri: edit/main/docs/ + +docs_dir: docs +site_dir: site + +strict: true + +# Guides intentionally link to repo-root files (SECURITY.md, schemas/, …) for GitHub +# readers; those paths are not copied into the MkDocs tree. +validation: + links: + not_found: ignore + anchors: ignore + +nav: + - Home: index.md + - CLI: cli.md + - HTTP API: http-api.md + - Operations & policy: operations-and-policy.md + - Release artifact: release-artifact.md + - Pricing catalog: pricing-catalog.md + - Python SDK: sdk.md + - SDK integrations: sdk-integrations.md + - Web UI: web-ui.md + - UI roadmap: ui-roadmap.md + - Troubleshooting: troubleshooting.md + +theme: + name: material + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: indigo + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.expand + - navigation.sections + - navigation.top + - search.suggest + - search.highlight + - content.code.copy + +plugins: + - search + +markdown_extensions: + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - tables + - toc: + permalink: true + +extra: + generator: false + # Dismissible strip with outbound “Ask AI” helpers (no FlightDeck backend). + announce: >- + Ask AI about FlightDeck (paste the question after the page loads): + Perplexity + · + ChatGPT + · + Repository + +extra_css: + - stylesheets/extra.css + +extra_javascript: + - javascripts/ask-ai.js diff --git a/pyproject.toml b/pyproject.toml index 5faa96e..552ebe7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,6 +68,7 @@ integrations-ci = [ [project.urls] Homepage = "https://github.com/flightdeckdev/flightdeck" +Documentation = "https://flightdeckdev.github.io/flightdeck/" Repository = "https://github.com/flightdeckdev/flightdeck" Issues = "https://github.com/flightdeckdev/flightdeck/issues" Changelog = "https://github.com/flightdeckdev/flightdeck/blob/main/CHANGELOG.md"