# Phase 5: AI-Friendly Wiki API (v2) **Version:** 2.0 **Date:** January 2026 **Status:** IN PROGRESS --- ## Overview Phase 5 adds a v2 Wiki API designed for AI/LLM consumption and external plugin integration. This enhances the existing wiki functionality without modifying v1 endpoints. ### Goals 1. **AI-Ready Data** - Structured responses optimized for LLM consumption 2. **Full CRUD** - Complete wiki management via API 3. **Search** - Full-text search across wiki content 4. **Relationships** - Page link graph for navigation 5. **Health Metrics** - Wiki statistics and maintenance insights 6. **Plugin-Friendly** - Enable external tools (like .NET AI plugins) to build on top --- ## V2 API Endpoints Base URL: `/api/v2/repos/{owner}/{repo}/wiki` ### Pages CRUD #### List All Pages ``` GET /api/v2/repos/{owner}/{repo}/wiki/pages ``` Query Parameters: - `include_content` (bool, default: false) - Include full page content - `page` (int) - Page number for pagination - `limit` (int, default: 30) - Items per page Response: ```json { "pages": [ { "name": "Home", "title": "Home", "path": "Home.md", "url": "/owner/repo/wiki/Home", "word_count": 450, "last_commit": { "sha": "abc123", "author": "username", "message": "Updated home page", "date": "2026-01-08T10:00:00Z" }, "content": "# Home\n\nWelcome...", // if include_content=true "content_html": "

Home

..." // if include_content=true } ], "total_count": 25, "has_more": false } ``` #### Get Single Page ``` GET /api/v2/repos/{owner}/{repo}/wiki/pages/{pageName} ``` Response: ```json { "name": "Installation", "title": "Installation Guide", "path": "Installation.md", "url": "/owner/repo/wiki/Installation", "content": "# Installation\n\n...", "content_html": "

Installation

...", "word_count": 1250, "links_out": ["Home", "Configuration", "API-Reference"], "links_in": ["Home", "Getting-Started"], "sidebar": "...", "footer": "...", "last_commit": { "sha": "def456", "author": "username", "message": "Added troubleshooting section", "date": "2026-01-07T15:30:00Z" }, "history_url": "/api/v2/repos/owner/repo/wiki/pages/Installation/revisions" } ``` #### Create Page ``` POST /api/v2/repos/{owner}/{repo}/wiki/pages ``` Request: ```json { "name": "New-Page", "title": "New Page Title", "content": "# New Page\n\nContent here...", "message": "Created new page" } ``` Response: Same as Get Single Page #### Update Page ``` PUT /api/v2/repos/{owner}/{repo}/wiki/pages/{pageName} ``` Request: ```json { "title": "Updated Title", "content": "# Updated Content\n\n...", "message": "Updated page content", "rename_to": "new-page-name" // optional, to rename } ``` Response: Same as Get Single Page #### Delete Page ``` DELETE /api/v2/repos/{owner}/{repo}/wiki/pages/{pageName} ``` Request: ```json { "message": "Removed outdated page" } ``` Response: ```json { "success": true } ``` --- ### Search #### Full-Text Search ``` GET /api/v2/repos/{owner}/{repo}/wiki/search?q={query} ``` Query Parameters: - `q` (string, required) - Search query - `limit` (int, default: 20) - Max results - `include_content` (bool, default: false) - Include full content Response: ```json { "query": "installation docker", "results": [ { "name": "Docker-Setup", "title": "Docker Setup Guide", "snippet": "...to run the installation in Docker, use the following...", "score": 0.95, "word_count": 800, "last_updated": "2026-01-05T12:00:00Z" } ], "total_count": 3 } ``` --- ### Link Graph #### Get Page Relationships ``` GET /api/v2/repos/{owner}/{repo}/wiki/graph ``` Response: ```json { "nodes": [ {"name": "Home", "word_count": 450}, {"name": "Installation", "word_count": 1250}, {"name": "Configuration", "word_count": 2100} ], "edges": [ {"source": "Home", "target": "Installation"}, {"source": "Home", "target": "Configuration"}, {"source": "Installation", "target": "Configuration"} ] } ``` --- ### Statistics & Health #### Wiki Statistics ``` GET /api/v2/repos/{owner}/{repo}/wiki/stats ``` Response: ```json { "total_pages": 25, "total_words": 45000, "total_commits": 142, "last_updated": "2026-01-08T10:00:00Z", "contributors": 5, "health": { "orphaned_pages": [ {"name": "Old-Notes", "word_count": 120} ], "dead_links": [ {"page": "Home", "broken_link": "Deleted-Page"} ], "outdated_pages": [ {"name": "Legacy-API", "last_edit": "2024-06-15T00:00:00Z", "days_old": 573} ], "short_pages": [ {"name": "TODO", "word_count": 15} ] }, "top_linked": [ {"name": "Home", "incoming_links": 12}, {"name": "Configuration", "incoming_links": 8} ] } ``` --- ### Revisions #### Get Page History ``` GET /api/v2/repos/{owner}/{repo}/wiki/pages/{pageName}/revisions ``` Query Parameters: - `page` (int) - Page number - `limit` (int, default: 30) - Items per page Response: ```json { "page_name": "Installation", "revisions": [ { "sha": "abc123", "author": { "username": "user1", "email": "user1@example.com", "avatar_url": "..." }, "message": "Added troubleshooting section", "date": "2026-01-07T15:30:00Z", "additions": 45, "deletions": 12 } ], "total_count": 28 } ``` --- ## Database Schema ### `wiki_index` (for full-text search) | Column | Type | Description | |--------|------|-------------| | id | BIGINT | Primary key | | repo_id | BIGINT | Repository ID | | page_name | VARCHAR(255) | Wiki page name | | page_path | VARCHAR(512) | Git file path | | title | VARCHAR(255) | Page title | | content | LONGTEXT | Full page content (for search) | | content_hash | VARCHAR(64) | SHA256 for change detection | | commit_sha | VARCHAR(64) | Last indexed commit | | word_count | INT | Word count | | links_out | TEXT | JSON array of outgoing links | | updated_unix | BIGINT | Last update timestamp | | created_unix | BIGINT | Creation timestamp | **Indexes:** `(repo_id)`, `(repo_id, page_name) UNIQUE`, `FULLTEXT(title, content)` --- ## Implementation Plan ### Files to Create **API Structs:** - `modules/structs/repo_wiki_v2.go` **API Router:** - `routers/api/v2/repo/wiki.go` **Services:** - `services/wiki/wiki_index.go` - Search indexing **Migration:** - `models/migrations/v1_26/v328.go` ### Files to Modify - `routers/api/v2/api.go` - Register wiki routes - `models/repo/wiki_ai.go` - Simplify to just WikiIndex --- ## V2 vs V1 Comparison | Feature | V1 | V2 | |---------|----|----| | Content encoding | Base64 | Plain JSON | | HTML rendering | Separate call | Included in response | | Word count | No | Yes | | Link extraction | No | Yes | | Search | No | Yes (full-text) | | Graph | No | Yes | | Statistics | No | Yes | | Batch operations | No | Future | --- ## External Plugin Integration Your .NET plugin can: 1. **Fetch all wiki content** via `GET /wiki/pages?include_content=true` 2. **Generate AI summaries** using your AI library 3. **Create/update pages** with AI-generated content 4. **Build Q&A system** by indexing content externally 5. **Analyze relationships** using the graph endpoint The v2 API provides all the structured data needed for AI processing without building AI into Gitea itself. --- *End of Specification*