Skip to main content

Documentation Build Specification

This document defines how documentation is extracted from the Tafy Studio monorepo and built into the documentation site at docs.tafy.studio.

Overview​

The Tafy Studio project maintains documentation in two locations:

  1. Source Documentation - Lives in the main monorepo (tafystudio/tafystudio)
  2. Documentation Site - Built and deployed from tafystudio/tafystudio-docs using Docusaurus

Documentation Structure in Monorepo​

Static Documentation Files​

Location: /docs/

Required files:

  • VISION.md - Project philosophy and goals
  • ARCHITECTURE.md - System design and technical architecture
  • CONCEPTS.md - Key terminology and concepts
  • DEVELOPMENT_SETUP.md - Getting started guide for developers
  • TESTING.md - Testing strategy and guidelines
  • SECURITY.md - Security policies and practices
  • HAL_SPEC.md - Hardware Abstraction Layer specification
  • QUICKSTART.md - Quick start guide for users
  • TROUBLESHOOTING.md - Common issues and solutions
  • DOCUMENTATION_BUILD_SPEC.md - This file

Additional files:

  • /README.md - Main project README (root of repository)
  • /CLAUDE.md - AI assistant instructions (optional for docs)
  • /packages/*/README.md - Package-specific documentation
  • /apps/*/README.md - Application-specific documentation

API Documentation Sources​

TypeScript/JavaScript​

  • Source: /packages/sdk-ts/, /packages/hal-schemas/src/
  • Tool: TypeDoc
  • Output: Markdown or HTML API reference

Python​

  • Source: /apps/hub-api/app/, /packages/sdk-python/
  • Tool: Sphinx with autodoc
  • Configuration: /apps/hub-api/docs/conf.py
  • Output: HTML/Markdown API reference

Go​

  • Source: /apps/tafyd/, /packages/sdk-go/
  • Tool: godoc (external - pkg.go.dev)
  • Output: Link to pkg.go.dev

Dynamic Content Generation​

HAL Schema Documentation​

  • Source: /packages/hal-schemas/schemas/*.json
  • Process: Generate markdown tables from JSON Schema files
  • Output: Schema reference documentation

Examples and Tutorials​

  • Source: /examples/, /firmware/*/examples/
  • Process: Extract and format example code with explanations
  • Output: Tutorial pages

Documentation Build Process​

1. Local Documentation Build (Monorepo)​

Add to /Makefile:

# Documentation build targets
.PHONY: docs-build docs-build-api docs-build-schemas docs-build-examples docs-prepare

# Prepare documentation for external build
docs-prepare: ## Prepare all documentation for docs site build
@echo "$(YELLOW)Preparing documentation for build...$(NC)"
@mkdir -p .docs-build
@make docs-build-static
@make docs-build-api
@make docs-build-schemas
@make docs-build-examples
@echo "$(GREEN)Documentation prepared in .docs-build/$(NC)"

# Copy static documentation
docs-build-static:
@echo "$(YELLOW)Copying static documentation...$(NC)"
@mkdir -p .docs-build/content
@cp -r docs/* .docs-build/content/
@cp README.md .docs-build/content/
@# Copy package READMEs
@mkdir -p .docs-build/content/packages
@for pkg in packages/*/README.md; do \
if [ -f "$$pkg" ]; then \
dir=$$(dirname "$$pkg"); \
name=$$(basename "$$dir"); \
cp "$$pkg" ".docs-build/content/packages/$$name.md"; \
fi; \
done
@# Copy app READMEs
@mkdir -p .docs-build/content/apps
@for app in apps/*/README.md; do \
if [ -f "$$app" ]; then \
dir=$$(dirname "$$app"); \
name=$$(basename "$$dir"); \
cp "$$app" ".docs-build/content/apps/$$name.md"; \
fi; \
done

# Build API documentation
docs-build-api:
@echo "$(YELLOW)Building API documentation...$(NC)"
@mkdir -p .docs-build/api
@# TypeScript API docs
@if command -v typedoc >/dev/null 2>&1; then \
echo "Building TypeScript API docs..."; \
cd packages/sdk-ts && typedoc --out ../../.docs-build/api/typescript || true; \
cd ../..; \
else \
echo "TypeDoc not found, skipping TypeScript API docs"; \
fi
@# Python API docs
@if [ -d "apps/hub-api/docs" ]; then \
echo "Building Python API docs..."; \
cd apps/hub-api && \
uv venv .venv-docs && \
. .venv-docs/bin/activate && \
uv pip install sphinx sphinx-rtd-theme sphinx-autodoc-typehints myst-parser && \
cd docs && \
sphinx-build -b html . ../../../.docs-build/api/python && \
deactivate && \
cd ../../..; \
else \
echo "Python docs not configured, skipping"; \
fi

# Generate schema documentation
docs-build-schemas:
@echo "$(YELLOW)Generating HAL schema documentation...$(NC)"
@mkdir -p .docs-build/schemas
@if [ -d "packages/hal-schemas" ]; then \
cd packages/hal-schemas && \
pnpm run generate:docs || echo "Schema docs generation not configured"; \
cd ../..; \
fi

# Extract examples
docs-build-examples:
@echo "$(YELLOW)Extracting examples...$(NC)"
@mkdir -p .docs-build/examples
@# Copy example files with proper formatting
@if [ -d "examples" ]; then \
find examples -name "*.md" -o -name "*.py" -o -name "*.ts" -o -name "*.go" | \
while read -r file; do \
rel=$${file#examples/}; \
dir=$$(dirname ".docs-build/examples/$$rel"); \
mkdir -p "$$dir"; \
cp "$$file" ".docs-build/examples/$$rel"; \
done; \
fi

# Clean documentation build
docs-clean:
@echo "$(YELLOW)Cleaning documentation build...$(NC)"
@rm -rf .docs-build

2. Documentation Extraction Script​

Create /scripts/extract-docs.sh:

#!/usr/bin/env bash
# Extract and prepare documentation for the docs site
# This script is used by the tafystudio-docs repository

set -euo pipefail

# Colors for output
YELLOW='\033[1;33m'
GREEN='\033[1;32m'
RED='\033[1;31m'
NC='\033[0m'

# Configuration
OUTPUT_DIR="${1:-.docs-build}"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

echo -e "${YELLOW}Extracting documentation from Tafy Studio monorepo...${NC}"

# Create output directory
mkdir -p "$OUTPUT_DIR"

# Create metadata file
cat > "$OUTPUT_DIR/metadata.json" << EOF
{
"source": "tafystudio/tafystudio",
"timestamp": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
"commit": "$(git rev-parse HEAD 2>/dev/null || echo 'unknown')",
"branch": "$(git branch --show-current 2>/dev/null || echo 'unknown')"
}
EOF

# Run make target to prepare documentation
cd "$REPO_ROOT"
make docs-prepare

# Copy prepared documentation to output directory
if [ -d ".docs-build" ]; then
cp -r .docs-build/* "$OUTPUT_DIR/"
echo -e "${GREEN}Documentation extracted successfully to $OUTPUT_DIR${NC}"
else
echo -e "${RED}Documentation build failed${NC}"
exit 1
fi

# Generate index file for Docusaurus
cat > "$OUTPUT_DIR/index.json" << EOF
{
"static": {
"vision": "content/VISION.md",
"architecture": "content/ARCHITECTURE.md",
"concepts": "content/CONCEPTS.md",
"quickstart": "content/QUICKSTART.md",
"development": "content/DEVELOPMENT_SETUP.md",
"testing": "content/TESTING.md",
"security": "content/SECURITY.md",
"hal_spec": "content/HAL_SPEC.md",
"troubleshooting": "content/TROUBLESHOOTING.md"
},
"api": {
"typescript": "api/typescript/index.html",
"python": "api/python/index.md",
"go": "https://pkg.go.dev/github.com/tafystudio/tafystudio"
},
"packages": [
$(find "$OUTPUT_DIR/content/packages" -name "*.md" 2>/dev/null | \
sed 's|.*/||; s|\.md$||' | \
awk '{printf "\"%s\"", $0} END {printf ""}' | \
sed 's/,$//')
],
"apps": [
$(find "$OUTPUT_DIR/content/apps" -name "*.md" 2>/dev/null | \
sed 's|.*/||; s|\.md$||' | \
awk '{printf "\"%s\"", $0} END {printf ""}' | \
sed 's/,$//')
]
}
EOF

Make it executable:

chmod +x scripts/extract-docs.sh

3. Documentation Site Build Process​

The tafystudio-docs repository should:

  1. Clone the monorepo
  2. Run ./scripts/extract-docs.sh output-dir
  3. Process the extracted documentation according to index.json
  4. Build the Docusaurus site

Example workflow snippet:

- name: Extract documentation
run: |
cd tafystudio-main
./scripts/extract-docs.sh ../extracted-docs
cd ..

- name: Process extracted documentation
run: |
# Copy static content
cp -r extracted-docs/content/* docs/

# Copy API documentation
mkdir -p static/api
cp -r extracted-docs/api/* static/api/ || true

# Process any generated content
if [ -f "extracted-docs/schemas/hal-schemas.md" ]; then
cp extracted-docs/schemas/hal-schemas.md docs/hal-schemas-reference.md
fi

Documentation Standards​

Markdown Files​

All markdown files should include frontmatter:

---
title: Document Title
description: Brief description for SEO
sidebar_position: 1
---

# Document Title

Content...

File Naming​

  • Use UPPERCASE for top-level concept docs (e.g., ARCHITECTURE.md)
  • Use lowercase with hyphens for generated docs (e.g., api-reference.md)
  • Package/app specific docs use their directory name

Cross-References​

  • Use relative links within the monorepo: [See Architecture](./ARCHITECTURE.md)
  • The docs site build process will convert these to proper Docusaurus links

Versioning​

Documentation versions are tied to the monorepo releases:

  1. Main branch = "next" version (latest development)
  2. Tagged releases = versioned documentation
  3. The docs site can maintain multiple versions using Docusaurus versioning

Local Development​

Developers can preview documentation locally:

# In monorepo
make docs-prepare
python -m http.server 8080 -d .docs-build

# Or clone docs repo and run full build
git clone https://github.com/tafystudio/tafystudio-docs.git
cd tafystudio-docs
npm install
npm start

CI/CD Integration​

  1. Monorepo CI: Validates documentation on every PR

    • Runs make docs-lint
    • Checks required files exist
    • Validates links
  2. Trigger on Changes: When docs change in main branch

    • Triggers repository_dispatch to docs repo
    • Docs repo rebuilds and deploys
  3. Scheduled Builds: Docs repo rebuilds periodically

    • Catches any missed triggers
    • Ensures docs stay fresh

Future Enhancements​

  1. Automated API Extraction:

    • Extract API docs from code comments
    • Generate OpenAPI specs from FastAPI
    • Create interactive API playground
  2. Interactive Examples:

    • Embed runnable code examples
    • Link to CodeSandbox/StackBlitz
  3. Search Integration:

    • Index all documentation
    • Add Algolia DocSearch
  4. Metrics:

    • Track which docs are most viewed
    • Identify documentation gaps

Maintenance​

Regular tasks:

  1. Weekly: Review and update documentation
  2. Per Release: Tag documentation version
  3. Monthly: Audit for broken links and outdated content
  4. Quarterly: Review documentation architecture and organization