Files
ai-workflow-course/tools
claude 4f25e3a794 style(no-slop): de-em-dash the internal docs + config (repo now fully clean)
- AGENTS.md (the standard-bearer), _TEMPLATE.md, handoff.md, tools/README.md:
  em-dashes removed by restructuring, banned words replaced; all policy/structure
  and decisions preserved.
- .gitea/.github sync-wiki workflows, .claude/gitea-ship.json, .gitignore: em-dashes
  in comments/log strings/notes removed; YAML/JSON still valid.

The entire tracked repo is now em-dash-free (the lone remaining `—` is inside a
regex character class in tools/build_wiki.py, intentional, matches old titles).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TfzV5QvtPDz8LJS3Pu5VLT
2026-06-23 08:51:37 -04:00
..

tools/

build_wiki.py: render the course into a wiki

The course wiki (the "textbook" view under the Wiki tab) is generated build output. The single source of truth is modules/**/README.md + capstone/README.md. Never hand-edit the wiki; edits there are overwritten on the next sync.

build_wiki.py is host-agnostic: it writes Markdown pages into a wiki working directory (Home.md, _Sidebar.md, _Footer.md, one page per module + capstone), rewriting lab/… and repo-root links to absolute URLs back in the main repo (so the runnable labs stay in the repo and are linked, never copied into the wiki).

Run it manually

# clone the wiki repo (Gitea)
git clone https://git.jpaul.io/justin/ai-workflow-course.wiki.git wiki

# render into it
python3 tools/build_wiki.py --repo-root . --out wiki \
    --web-base https://git.jpaul.io/justin/ai-workflow-course --branch main --host gitea

# publish
cd wiki && git add -A && git commit -m "docs(wiki): sync from modules/" && git push

For GitHub, use --host github and --web-base https://github.com/<owner>/<repo>.

Automated sync (CI)

  • Gitea: .gitea/workflows/sync-wiki.yml runs on every push to main that touches modules/**, capstone/**, README.md, or this generator.
  • GitHub: .github/workflows/sync-wiki.yml does the same on the mirror.

Both need, one time:

  1. an Actions runner attached (Gitea: Settings → Actions → Runners);
  2. a repo secret WIKI_TOKEN with wiki write (a scoped PAT/deploy token, not a site-admin token; on GitHub the default GITHUB_TOKEN can't push the wiki);
  3. the wiki initialized once (Gitea is already initialized; on GitHub create one page in the UI first so <repo>.wiki.git exists).