2:I[7012,["4765","static/chunks/4765-f5afdf8061f456f3.js","9856","static/chunks/9856-3b185291364d9bef.js","6687","static/chunks/app/docs/%5B...slug%5D/page-e07536548216bee4.js"],"MarkdownRenderer"] 4:I[9856,["4765","static/chunks/4765-f5afdf8061f456f3.js","9856","static/chunks/9856-3b185291364d9bef.js","6687","static/chunks/app/docs/%5B...slug%5D/page-e07536548216bee4.js"],""] 5:I[4126,[],""] 7:I[9630,[],""] 8:I[4278,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"HeadingProvider"] 9:I[1476,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"Header"] a:I[3167,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"Sidebar"] b:I[7409,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"PageFrame"] 3:T2667, # Sprint 3 Design Documents This document outlines the design specifications for Sprint 3 features: 1. **Documentation Versioning System** 2. **CODEOWNERS for Cross-Team Ownership** 3. **i18n/RTL Multi-Language Structure** --- ## 1. Documentation Versioning System ### Overview Implement version-tagged documentation to support multiple product versions simultaneously. Users can switch between documentation versions (e.g., v1.x, v2.x, latest). ### Requirements - Support semantic versioning (major.minor.patch) - Git-tag-based version snapshots - UI version selector in docs site header - Maintain "latest" as default with version-specific URLs - SEO-friendly canonical URLs ### Technical Design #### Version Storage ``` docs/ ├── versions.json # Version manifest ├── v1/ # Version 1.x docs (if needed) │ └── ... └── ... # Current (latest) docs ``` **versions.json Schema:** ```json { "current": "2.0.0", "versions": [ { "version": "2.0.0", "label": "v2.0 (Latest)", "path": "/", "isLatest": true, "releaseDate": "2025-12-01" }, { "version": "1.5.0", "label": "v1.5 (Maintenance)", "path": "/v1/", "isLatest": false, "releaseDate": "2025-10-15", "deprecationDate": "2026-06-01" } ], "defaultVersion": "2.0.0" } ``` #### URL Structure ``` # Latest version (default) https://assistdocs.asimo.io/feature-flags/README # Specific version https://assistdocs.asimo.io/v1/feature-flags/README # Canonical URL in version pages ``` #### Version Selector Component ```typescript // apps/docs-site/src/components/VersionSelector.tsx interface VersionSelectorProps { currentVersion: string; versions: Version[]; currentPath: string; } function VersionSelector({ currentVersion, versions, currentPath }: VersionSelectorProps) { return ( ); } ``` #### Build Process ```bash # scripts/build-versioned-docs.sh #!/bin/bash # 1. Build latest docs pnpm --filter docs-site build # 2. Copy to version folder mkdir -p dist/v${VERSION} cp -r dist/* dist/v${VERSION}/ # 3. Generate version manifest node scripts/generate-versions-manifest.js ``` ### Implementation Tasks - [ ] Create versions.json schema and initial manifest - [ ] Implement VersionSelector component - [ ] Update routing to support versioned URLs - [ ] Add version badge to docs header - [ ] Create build script for version snapshots - [ ] Update CI/CD to trigger version builds on tag - [ ] Add redirects for deprecated versions --- ## 2. CODEOWNERS for Cross-Team Ownership ### Overview Define clear ownership of documentation sections using GitHub CODEOWNERS format. This enables automatic review assignments and accountability. ### CODEOWNERS File ``` # .github/CODEOWNERS - Documentation ownership # Default owners for everything in docs/ docs/ @voiceassist/docs-team # Feature-specific ownership docs/admin-guide/feature-flags/ @voiceassist/backend-team docs/voice/ @voiceassist/voice-team docs/api/ @voiceassist/backend-team docs/security/ @voiceassist/security-team docs/deployment/ @voiceassist/devops-team docs/testing/ @voiceassist/qa-team # Admin panel docs docs/admin/ @voiceassist/frontend-team apps/admin-panel/ @voiceassist/frontend-team # AI and RAG documentation docs/ai/ @voiceassist/ai-team # Architecture decisions require multiple reviewers docs/architecture/ @voiceassist/backend-team @voiceassist/frontend-team # Operations and runbooks docs/operations/ @voiceassist/sre-team docs/debugging/ @voiceassist/sre-team # Planning docs need product review docs/planning/ @voiceassist/product-team @voiceassist/docs-team # Scripts ownership scripts/ @voiceassist/devops-team # Agent JSON generation scripts/generate-all-agent-json.js @voiceassist/docs-team @voiceassist/ai-team ``` ### Ownership Metadata in Frontmatter Extend frontmatter to include ownership info: ```yaml --- title: Feature Flags Overview owner: backend # Team responsible for content maintainers: # Individual maintainers (optional) - "@username1" - "@username2" reviewers: # Required reviewers for changes - "@voiceassist/backend-team" last_review: "2025-11-15" next_review: "2026-02-15" --- ``` ### Ownership Dashboard Add to `/agent/health.json`: ```json { "ownership": { "by_owner": { "backend": { "count": 45, "coverage": 100 }, "frontend": { "count": 23, "coverage": 95 }, "docs": { "count": 120, "coverage": 100 }, "unassigned": { "count": 15, "coverage": 0 } }, "needs_review": [{ "path": "api/openapi-spec.md", "last_review": "2025-06-01" }] } } ``` ### Implementation Tasks - [ ] Create .github/CODEOWNERS file - [ ] Add `maintainers` and `reviewers` to frontmatter schema - [ ] Update frontmatter validation script - [ ] Add ownership metrics to health.json - [ ] Create ownership audit report script - [ ] Document ownership process in CONTRIBUTING.md --- ## 3. i18n/RTL Multi-Language Structure ### Overview Prepare documentation structure for future multi-language support, including RTL (Right-to-Left) languages like Arabic. ### Directory Structure ``` docs/ ├── en/ # English (default, source of truth) │ ├── admin-guide/ │ ├── api/ │ └── ... ├── ar/ # Arabic (RTL) │ ├── admin-guide/ │ └── ... ├── tr/ # Turkish │ └── ... └── i18n.config.json # i18n configuration ``` ### i18n Configuration **i18n.config.json:** ```json { "defaultLocale": "en", "locales": [ { "code": "en", "name": "English", "dir": "ltr", "isDefault": true, "completeness": 100 }, { "code": "ar", "name": "العربية", "dir": "rtl", "isDefault": false, "completeness": 0, "status": "planned" }, { "code": "tr", "name": "Türkçe", "dir": "ltr", "isDefault": false, "completeness": 0, "status": "planned" } ], "fallbackLocale": "en", "routes": { "prefix": true, "defaultLocalePrefix": false } } ``` ### URL Structure ``` # Default locale (English) - no prefix https://assistdocs.asimo.io/feature-flags/README # Arabic version https://assistdocs.asimo.io/ar/feature-flags/README # Turkish version https://assistdocs.asimo.io/tr/feature-flags/README ``` ### RTL Support #### CSS Variables ```css /* apps/docs-site/src/styles/rtl.css */ :root { --text-direction: ltr; --flex-direction: row; --margin-start: margin-left; --margin-end: margin-right; } [dir="rtl"] { --text-direction: rtl; --flex-direction: row-reverse; --margin-start: margin-right; --margin-end: margin-left; } /* Logical properties for RTL support */ .sidebar { margin-inline-start: 1rem; padding-inline-end: 1rem; } ``` #### Layout Component ```typescript // apps/docs-site/src/components/LocaleProvider.tsx interface LocaleProviderProps { locale: string; dir: 'ltr' | 'rtl'; children: React.ReactNode; } function LocaleProvider({ locale, dir, children }: LocaleProviderProps) { return ( {children} ); } ``` ### Translation Workflow 1. **Source Content**: All content written in English first 2. **Translation Keys**: Extract translatable strings 3. **Machine Translation**: Use AI-assisted translation for draft 4. **Human Review**: Native speakers review translations 5. **Sync Check**: Automated checks for missing translations #### Translation Status Frontmatter ```yaml --- title: Feature Flags Overview i18n: source_locale: en translations: ar: status: pending translator: null last_sync: null tr: status: pending translator: null last_sync: null --- ``` ### Implementation Tasks - [ ] Create i18n.config.json schema - [ ] Set up locale-based routing - [ ] Implement LocaleProvider component - [ ] Add RTL CSS utilities - [ ] Create language selector component - [ ] Build translation status dashboard - [ ] Document translation workflow in CONTRIBUTING.md - [ ] Add i18n completeness to health.json --- ## Implementation Timeline ### Phase 1: Foundation (Week 1) - CODEOWNERS file creation - Ownership metadata in frontmatter - Update validation scripts ### Phase 2: Versioning (Week 2) - Version manifest schema - VersionSelector component - Versioned URL routing ### Phase 3: i18n Preparation (Week 3-4) - i18n config and directory structure - RTL CSS support - LocaleProvider component - Language selector UI --- ## Success Metrics | Feature | Metric | Target | | ---------- | --------------------------------- | --------- | | Versioning | Version switch time | < 1s | | CODEOWNERS | Coverage | 100% | | i18n | RTL rendering accuracy | 100% | | i18n | Translation completeness tracking | Automated | --- ## Related Documentation - [Feature Flags Overview](../admin-guide/feature-flags/README.md) - [Documentation Guide for AI Agents](../admin-guide/for-ai-agents.md) - [NEXT_PHASE_IMPROVEMENTS.md](../NEXT_PHASE_IMPROVEMENTS.md) --- **Document Version**: 1.0 **Last Updated**: 2025-12-04 **Status**: Draft - Ready for Review 6:["slug","planning/SPRINT_3_DESIGN_DOCS","c"] 0:["X7oMT3VrOffzp0qvbeOas",[[["",{"children":["docs",{"children":[["slug","planning/SPRINT_3_DESIGN_DOCS","c"],{"children":["__PAGE__?{\"slug\":[\"planning\",\"SPRINT_3_DESIGN_DOCS\"]}",{}]}]}]},"$undefined","$undefined",true],["",{"children":["docs",{"children":[["slug","planning/SPRINT_3_DESIGN_DOCS","c"],{"children":["__PAGE__",{},[["$L1",["$","div",null,{"children":[["$","div",null,{"className":"mb-6 flex items-center justify-between gap-4","children":[["$","div",null,{"children":[["$","p",null,{"className":"text-sm text-gray-500 dark:text-gray-400","children":"Docs / Raw"}],["$","h1",null,{"className":"text-3xl font-bold text-gray-900 dark:text-white","children":"Sprint 3 Design Documents"}],["$","p",null,{"className":"text-sm text-gray-600 dark:text-gray-400","children":["Sourced from"," ",["$","code",null,{"className":"font-mono text-xs","children":["docs/","planning/SPRINT_3_DESIGN_DOCS.md"]}]]}]]}],["$","a",null,{"href":"https://github.com/mohammednazmy/VoiceAssist/edit/main/docs/planning/SPRINT_3_DESIGN_DOCS.md","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-2 rounded-md border border-gray-200 dark:border-gray-700 px-3 py-1.5 text-sm text-gray-700 dark:text-gray-200 hover:border-primary-500 dark:hover:border-primary-400 hover:text-primary-700 dark:hover:text-primary-300","children":"Edit on GitHub"}]]}],["$","div",null,{"className":"rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 p-6","children":["$","$L2",null,{"content":"$3"}]}],["$","div",null,{"className":"mt-6 flex flex-wrap gap-2 text-sm","children":[["$","$L4",null,{"href":"/reference/all-docs","className":"inline-flex items-center gap-1 rounded-md bg-gray-100 px-3 py-1 text-gray-700 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700","children":"← All documentation"}],["$","$L4",null,{"href":"/","className":"inline-flex items-center gap-1 rounded-md bg-gray-100 px-3 py-1 text-gray-700 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700","children":"Home"}]]}]]}],null],null],null]},[null,["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","docs","children","$6","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[null,["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","docs","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/7f586cdbbaa33ff7.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full","children":["$","body",null,{"className":"__className_f367f3 h-full bg-white dark:bg-gray-900","children":[["$","a",null,{"href":"#main-content","className":"skip-to-content","children":"Skip to main content"}],["$","$L8",null,{"children":[["$","$L9",null,{}],["$","$La",null,{}],["$","main",null,{"id":"main-content","className":"lg:pl-64","role":"main","aria-label":"Documentation content","children":["$","$Lb",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]]}]]}]}]],null],null],["$Lc",null]]]] c:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Sprint 3 Design Documents | Docs | VoiceAssist Docs"}],["$","meta","3",{"name":"description","content":"Design specifications for documentation versioning, CODEOWNERS, and i18n/RTL support"}],["$","meta","4",{"name":"keywords","content":"VoiceAssist,documentation,medical AI,voice assistant,healthcare,HIPAA,API"}],["$","meta","5",{"name":"robots","content":"index, follow"}],["$","meta","6",{"name":"googlebot","content":"index, follow"}],["$","link","7",{"rel":"canonical","href":"https://assistdocs.asimo.io"}],["$","meta","8",{"property":"og:title","content":"VoiceAssist Documentation"}],["$","meta","9",{"property":"og:description","content":"Comprehensive documentation for VoiceAssist - Enterprise Medical AI Assistant"}],["$","meta","10",{"property":"og:url","content":"https://assistdocs.asimo.io"}],["$","meta","11",{"property":"og:site_name","content":"VoiceAssist Docs"}],["$","meta","12",{"property":"og:type","content":"website"}],["$","meta","13",{"name":"twitter:card","content":"summary"}],["$","meta","14",{"name":"twitter:title","content":"VoiceAssist Documentation"}],["$","meta","15",{"name":"twitter:description","content":"Comprehensive documentation for VoiceAssist - Enterprise Medical AI Assistant"}],["$","meta","16",{"name":"next-size-adjust"}]] 1:null