README Generator Generate or update a comprehensive README.md file for GitHub repositories following best practices. Purpose This skill automates the creation of professional, well-structured README.md files for GitHub repositories. It generates all essential sections including badges for technologies used, project overview, site metrics, getting started instructions, project structure, and contact information. The skill is particularly optimized for MkDocs-based intelligent textbook projects but can be adapted for any repository type. When to Use This Skill Use this skill when: - Starting a…

, content, flags=re.DOTALL))\n # Count inline equations ($...$)\n inline = len(re.findall(r'(?\u003c!\\$)\\$(?!\\$)[^$]+\\$(?!\\$)', content))\n\n return display + inline\n except Exception as e:\n print(f\"Error reading {file_path}: {e}\", file=sys.stderr)\n return 0\n\ndef count_quiz_questions(file_path: str) -> int:\n \"\"\"Count quiz questions in a quiz markdown file.\"\"\"\n try:\n with open(file_path, 'r', encoding='utf-8') as f:\n content = f.read()\n\n # Count question numbers (assumes format like \"1.\", \"2.\", etc. at start of line)\n questions = len(re.findall(r'^\\d+\\.\\s+', content, flags=re.MULTILINE))\n\n # Alternative: count headers that start with numbers\n if questions == 0:\n questions = len(re.findall(r'^#+\\s+\\d+[\\.)]?\\s+', content, flags=re.MULTILINE))\n\n return questions\n except Exception as e:\n print(f\"Error reading {file_path}: {e}\", file=sys.stderr)\n return 0\n\ndef count_glossary_terms(file_path: str) -> int:\n \"\"\"Count glossary terms (assumes level 4 headers).\"\"\"\n try:\n with open(file_path, 'r', encoding='utf-8') as f:\n content = f.read()\n\n # Count level 4 headers (####)\n terms = len(re.findall(r'^####\\s+', content, flags=re.MULTILINE))\n return terms\n except Exception as e:\n print(f\"Error reading {file_path}: {e}\", file=sys.stderr)\n return 0\n\ndef count_faq_questions(file_path: str) -> int:\n \"\"\"Count FAQ questions.\"\"\"\n try:\n with open(file_path, 'r', encoding='utf-8') as f:\n content = f.read()\n\n # Count headers that end with question marks\n questions = len(re.findall(r'^#+\\s+.*\\?', content, flags=re.MULTILINE))\n\n # Alternative: count specific FAQ patterns\n if questions == 0:\n questions = len(re.findall(r'^#+\\s+', content, flags=re.MULTILINE))\n\n return questions\n except Exception as e:\n print(f\"Error reading {file_path}: {e}\", file=sys.stderr)\n return 0\n\ndef count_references(file_path: str) -> int:\n \"\"\"Count references in references file.\"\"\"\n try:\n with open(file_path, 'r', encoding='utf-8') as f:\n content = f.read()\n\n # Count numbered references or list items\n refs = len(re.findall(r'^\\d+\\.\\s+', content, flags=re.MULTILINE))\n\n if refs == 0:\n # Count list items\n refs = len(re.findall(r'^\\s*[-*+]\\s+', content, flags=re.MULTILINE))\n\n return refs\n except Exception as e:\n print(f\"Error reading {file_path}: {e}\", file=sys.stderr)\n return 0\n\ndef get_learning_graph_metrics(repo_path: Path) -> Dict:\n \"\"\"Extract learning graph metrics from learning-graph directory.\"\"\"\n lg_path = repo_path / 'docs' / 'learning-graph'\n metrics = {\n 'concepts': 0,\n 'quality_score': None\n }\n\n # Try to read concept list\n concept_file = lg_path / 'concept-list.md'\n if not concept_file.exists():\n concept_file = lg_path / 'list-concepts.md'\n\n if concept_file.exists():\n try:\n with open(concept_file, 'r', encoding='utf-8') as f:\n content = f.read()\n # Count numbered list items\n concepts = re.findall(r'^\\d+\\.\\s+', content, flags=re.MULTILINE)\n metrics['concepts'] = len(concepts)\n except Exception as e:\n print(f\"Error reading concept list: {e}\", file=sys.stderr)\n\n # Try to read quality metrics\n quality_file = lg_path / 'quality-metrics.md'\n if quality_file.exists():\n try:\n with open(quality_file, 'r', encoding='utf-8') as f:\n content = f.read()\n # Look for quality score\n match = re.search(r'quality score:?\\s*(\\d+)', content, re.IGNORECASE)\n if match:\n metrics['quality_score'] = int(match.group(1))\n except Exception as e:\n print(f\"Error reading quality metrics: {e}\", file=sys.stderr)\n\n return metrics\n\ndef collect_metrics(repo_path: str = '.') -> Dict:\n \"\"\"Collect all site metrics from repository.\"\"\"\n repo = Path(repo_path).resolve()\n docs_path = repo / 'docs'\n\n metrics = {\n 'repository': {\n 'path': str(repo),\n 'name': repo.name\n },\n 'content': {\n 'markdown_files': 0,\n 'total_words': 0,\n 'chapters': 0,\n 'list_items': 0,\n 'tables': 0,\n 'code_blocks': 0,\n 'equations': 0\n },\n 'learning_graph': {\n 'concepts': 0,\n 'quality_score': None\n },\n 'interactive': {\n 'microsims': 0,\n 'quizzes': 0,\n 'quiz_questions': 0\n },\n 'resources': {\n 'glossary_terms': 0,\n 'faq_questions': 0,\n 'references': 0\n },\n 'media': {\n 'images': 0,\n 'png': 0,\n 'jpg': 0,\n 'svg': 0\n }\n }\n\n if not docs_path.exists():\n print(f\"Warning: docs directory not found at {docs_path}\", file=sys.stderr)\n return metrics\n\n # Count markdown files and aggregate statistics\n for md_file in docs_path.rglob('*.md'):\n metrics['content']['markdown_files'] += 1\n metrics['content']['total_words'] += count_words_in_markdown(str(md_file))\n metrics['content']['list_items'] += count_list_items(str(md_file))\n metrics['content']['tables'] += count_tables(str(md_file))\n metrics['content']['code_blocks'] += count_code_blocks(str(md_file))\n metrics['content']['equations'] += count_equations(str(md_file))\n\n # Count chapters\n chapters_path = docs_path / 'chapters'\n if chapters_path.exists():\n metrics['content']['chapters'] = len([d for d in chapters_path.iterdir() if d.is_dir()])\n\n # Count MicroSims\n sims_path = docs_path / 'sims'\n if sims_path.exists():\n metrics['interactive']['microsims'] = len([d for d in sims_path.iterdir()\n if d.is_dir() and (d / 'index.md').exists()])\n\n # Count quizzes and questions\n for quiz_file in docs_path.rglob('quiz.md'):\n metrics['interactive']['quizzes'] += 1\n metrics['interactive']['quiz_questions'] += count_quiz_questions(str(quiz_file))\n\n # Count glossary terms\n glossary_file = docs_path / 'glossary.md'\n if glossary_file.exists():\n metrics['resources']['glossary_terms'] = count_glossary_terms(str(glossary_file))\n\n # Count FAQ questions\n faq_file = docs_path / 'faq.md'\n if faq_file.exists():\n metrics['resources']['faq_questions'] = count_faq_questions(str(faq_file))\n\n # Count references\n ref_file = docs_path / 'references.md'\n if ref_file.exists():\n metrics['resources']['references'] = count_references(str(ref_file))\n\n # Count images\n for ext in ['png', 'jpg', 'jpeg', 'svg', 'gif']:\n image_files = list(docs_path.rglob(f'*.{ext}'))\n count = len(image_files)\n metrics['media']['images'] += count\n if ext in ['jpg', 'jpeg']:\n metrics['media']['jpg'] += count\n elif ext in metrics['media']:\n metrics['media'][ext] = count\n\n # Get learning graph metrics\n lg_metrics = get_learning_graph_metrics(repo)\n metrics['learning_graph'] = lg_metrics\n\n return metrics\n\ndef format_metrics_table(metrics: Dict) -> str:\n \"\"\"Format metrics as a markdown table.\"\"\"\n table = \"| Metric | Count |\\n\"\n table += \"|--------|-------|\\n\"\n\n if metrics['learning_graph']['concepts'] > 0:\n table += f\"| Concepts in Learning Graph | {metrics['learning_graph']['concepts']} |\\n\"\n\n if metrics['content']['chapters'] > 0:\n table += f\"| Chapters | {metrics['content']['chapters']} |\\n\"\n\n table += f\"| Markdown Files | {metrics['content']['markdown_files']} |\\n\"\n table += f\"| Total Words | {metrics['content']['total_words']:,} |\\n\"\n\n if metrics['interactive']['microsims'] > 0:\n table += f\"| MicroSims | {metrics['interactive']['microsims']} |\\n\"\n\n if metrics['resources']['glossary_terms'] > 0:\n table += f\"| Glossary Terms | {metrics['resources']['glossary_terms']} |\\n\"\n\n if metrics['resources']['faq_questions'] > 0:\n table += f\"| FAQ Questions | {metrics['resources']['faq_questions']} |\\n\"\n\n if metrics['interactive']['quiz_questions'] > 0:\n table += f\"| Quiz Questions | {metrics['interactive']['quiz_questions']} |\\n\"\n\n if metrics['content']['equations'] > 0:\n table += f\"| Equations | {metrics['content']['equations']} |\\n\"\n\n if metrics['media']['images'] > 0:\n table += f\"| Images | {metrics['media']['images']} |\\n\"\n\n if metrics['resources']['references'] > 0:\n table += f\"| References | {metrics['resources']['references']} |\\n\"\n\n return table\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n repo_path = sys.argv[1] if len(sys.argv) > 1 else '.'\n\n print(f\"Collecting metrics from: {repo_path}\", file=sys.stderr)\n metrics = collect_metrics(repo_path)\n\n # Output JSON\n print(json.dumps(metrics, indent=2))\n\n # Also print formatted table to stderr for reference\n print(\"\\n--- Formatted Table ---\", file=sys.stderr)\n print(format_metrics_table(metrics), file=sys.stderr)\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12624,"content_sha256":"15800cbd2da2ceb002f32e9767295ec297264116f6f1915a772e58f308813aab"},{"filename":"scripts/validate-readme.py","content":"#!/usr/bin/env python3\n\"\"\"\nREADME Validation Script\n\nValidates README.md files for:\n- Required sections present\n- Working links (basic check)\n- Valid badge URLs\n- Proper markdown formatting\n- Common issues\n\nUsage:\n python validate-readme.py [path/to/README.md]\n\nOutput:\n Validation report with score and recommendations\n\"\"\"\n\nimport re\nimport sys\nfrom pathlib import Path\nfrom typing import List, Tuple, Dict\nfrom urllib.parse import urlparse\n\ndef check_required_sections(content: str) -> Tuple[List[str], List[str]]:\n \"\"\"Check for required README sections.\"\"\"\n required = [\n 'overview',\n 'getting started',\n 'license',\n 'contact'\n ]\n\n recommended = [\n 'installation',\n 'usage',\n 'contributing',\n 'acknowledgements',\n 'issues'\n ]\n\n found_required = []\n found_recommended = []\n missing_required = []\n missing_recommended = []\n\n content_lower = content.lower()\n\n for section in required:\n if section in content_lower or section.replace(' ', '-') in content_lower:\n found_required.append(section)\n else:\n missing_required.append(section)\n\n for section in recommended:\n if section in content_lower or section.replace(' ', '-') in content_lower:\n found_recommended.append(section)\n else:\n missing_recommended.append(section)\n\n return (found_required, missing_required, found_recommended, missing_recommended)\n\ndef extract_links(content: str) -> List[Tuple[str, str]]:\n \"\"\"Extract all markdown links from content.\"\"\"\n # Match [text](url) format\n links = re.findall(r'\\[([^\\]]+)\\]\\(([^\\)]+)\\)', content)\n return links\n\ndef validate_url_format(url: str) -> bool:\n \"\"\"Validate URL format (basic check).\"\"\"\n try:\n result = urlparse(url)\n # Check if it's a web URL or relative path\n return bool(result.scheme in ['http', 'https'] or url.startswith('/') or url.startswith('.'))\n except:\n return False\n\ndef extract_badges(content: str) -> List[str]:\n \"\"\"Extract badge URLs from content.\"\"\"\n badges = []\n # Find badge patterns like [![...](badge-url)](link-url)\n badge_pattern = r'\\[!\\[([^\\]]*)\\]\\(([^\\)]+)\\)\\]\\(([^\\)]+)\\)'\n matches = re.findall(badge_pattern, content)\n for match in matches:\n badges.append(match[1]) # badge URL\n return badges\n\ndef check_markdown_formatting(content: str) -> List[str]:\n \"\"\"Check for common markdown formatting issues.\"\"\"\n issues = []\n\n lines = content.split('\\n')\n\n # Check for lists without preceding blank line\n for i, line in enumerate(lines[1:], start=1):\n if re.match(r'^\\s*[-*+]\\s+', line) or re.match(r'^\\s*\\d+\\.\\s+', line):\n if i > 0 and lines[i-1].strip() and not re.match(r'^#+\\s+', lines[i-1]):\n # Previous line is not blank and not a header\n if not (re.match(r'^\\s*[-*+]\\s+', lines[i-1]) or re.match(r'^\\s*\\d+\\.\\s+', lines[i-1])):\n issues.append(f\"Line {i+1}: List item should have blank line before it\")\n\n # Check for code blocks without language specification\n code_blocks = re.findall(r'```(\\w*)\\n', content)\n unnamed_blocks = sum(1 for lang in code_blocks if not lang)\n if unnamed_blocks > 0:\n issues.append(f\"Found {unnamed_blocks} code block(s) without language specification\")\n\n # Check for very long lines (> 120 chars, excluding URLs)\n for i, line in enumerate(lines, start=1):\n if len(line) > 120 and 'http' not in line:\n issues.append(f\"Line {i}: Very long line ({len(line)} chars) - consider breaking\")\n\n return issues\n\ndef check_header_structure(content: str) -> List[str]:\n \"\"\"Check header structure and hierarchy.\"\"\"\n issues = []\n lines = content.split('\\n')\n\n h1_count = 0\n prev_level = 0\n\n for i, line in enumerate(lines, start=1):\n match = re.match(r'^(#+)\\s+', line)\n if match:\n level = len(match.group(1))\n\n if level == 1:\n h1_count += 1\n\n # Check for skipped levels\n if prev_level > 0 and level > prev_level + 1:\n issues.append(f\"Line {i}: Skipped header level (#{prev_level} to #{level})\")\n\n prev_level = level\n\n if h1_count == 0:\n issues.append(\"No H1 header found (should have repository name)\")\n elif h1_count > 1:\n issues.append(f\"Multiple H1 headers found ({h1_count}) - should have only one\")\n\n return issues\n\ndef validate_readme(file_path: str) -> Dict:\n \"\"\"Validate a README.md file and return detailed report.\"\"\"\n path = Path(file_path)\n\n if not path.exists():\n return {\n 'valid': False,\n 'error': f\"File not found: {file_path}\",\n 'score': 0\n }\n\n try:\n with open(path, 'r', encoding='utf-8') as f:\n content = f.read()\n except Exception as e:\n return {\n 'valid': False,\n 'error': f\"Error reading file: {e}\",\n 'score': 0\n }\n\n report = {\n 'valid': True,\n 'file': str(path),\n 'size': len(content),\n 'sections': {},\n 'links': {},\n 'badges': {},\n 'formatting': {},\n 'headers': {},\n 'recommendations': [],\n 'score': 0\n }\n\n # Check sections\n found_req, missing_req, found_rec, missing_rec = check_required_sections(content)\n report['sections'] = {\n 'required_found': found_req,\n 'required_missing': missing_req,\n 'recommended_found': found_rec,\n 'recommended_missing': missing_rec\n }\n\n # Extract and validate links\n links = extract_links(content)\n invalid_links = [url for text, url in links if not validate_url_format(url)]\n report['links'] = {\n 'total': len(links),\n 'invalid': invalid_links,\n 'invalid_count': len(invalid_links)\n }\n\n # Extract badges\n badges = extract_badges(content)\n report['badges'] = {\n 'count': len(badges),\n 'urls': badges\n }\n\n # Check markdown formatting\n formatting_issues = check_markdown_formatting(content)\n report['formatting'] = {\n 'issues': formatting_issues,\n 'issue_count': len(formatting_issues)\n }\n\n # Check header structure\n header_issues = check_header_structure(content)\n report['headers'] = {\n 'issues': header_issues,\n 'issue_count': len(header_issues)\n }\n\n # Generate recommendations\n if missing_req:\n report['recommendations'].append(f\"Add missing required sections: {', '.join(missing_req)}\")\n\n if missing_rec:\n report['recommendations'].append(f\"Consider adding recommended sections: {', '.join(missing_rec)}\")\n\n if invalid_links:\n report['recommendations'].append(f\"Fix {len(invalid_links)} invalid link(s)\")\n\n if len(badges) == 0:\n report['recommendations'].append(\"Add badges for technologies used\")\n\n if formatting_issues:\n report['recommendations'].append(f\"Fix {len(formatting_issues)} formatting issue(s)\")\n\n if header_issues:\n report['recommendations'].append(f\"Fix {len(header_issues)} header structure issue(s)\")\n\n # Calculate score (0-100)\n score = 100\n\n # Deduct for missing required sections (10 points each)\n score -= len(missing_req) * 10\n\n # Deduct for missing recommended sections (5 points each, max 20)\n score -= min(len(missing_rec) * 5, 20)\n\n # Deduct for invalid links (5 points each, max 15)\n score -= min(len(invalid_links) * 5, 15)\n\n # Deduct for no badges (10 points)\n if len(badges) == 0:\n score -= 10\n\n # Deduct for formatting issues (2 points each, max 15)\n score -= min(len(formatting_issues) * 2, 15)\n\n # Deduct for header issues (3 points each, max 10)\n score -= min(len(header_issues) * 3, 10)\n\n report['score'] = max(0, score)\n\n return report\n\ndef format_report(report: Dict) -> str:\n \"\"\"Format validation report as readable text.\"\"\"\n if not report.get('valid', False):\n return f\"ERROR: {report.get('error', 'Unknown error')}\"\n\n output = []\n output.append(\"=\" * 60)\n output.append(\"README VALIDATION REPORT\")\n output.append(\"=\" * 60)\n output.append(f\"\\nFile: {report['file']}\")\n output.append(f\"Size: {report['size']:,} bytes\")\n output.append(f\"\\nOVERALL SCORE: {report['score']}/100\")\n\n # Score interpretation\n if report['score'] >= 90:\n output.append(\"Status: EXCELLENT ✓\")\n elif report['score'] >= 75:\n output.append(\"Status: GOOD ✓\")\n elif report['score'] >= 60:\n output.append(\"Status: ADEQUATE\")\n else:\n output.append(\"Status: NEEDS IMPROVEMENT\")\n\n # Sections\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"SECTIONS\")\n output.append(\"-\" * 60)\n\n sections = report['sections']\n output.append(f\"Required sections: {len(sections['required_found'])}/{len(sections['required_found']) + len(sections['required_missing'])}\")\n if sections['required_missing']:\n output.append(f\" Missing: {', '.join(sections['required_missing'])}\")\n\n output.append(f\"Recommended sections: {len(sections['recommended_found'])}/{len(sections['recommended_found']) + len(sections['recommended_missing'])}\")\n if sections['recommended_missing']:\n output.append(f\" Missing: {', '.join(sections['recommended_missing'])}\")\n\n # Links\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"LINKS\")\n output.append(\"-\" * 60)\n output.append(f\"Total links: {report['links']['total']}\")\n output.append(f\"Invalid links: {report['links']['invalid_count']}\")\n if report['links']['invalid']:\n for link in report['links']['invalid'][:5]: # Show first 5\n output.append(f\" - {link}\")\n if len(report['links']['invalid']) > 5:\n output.append(f\" ... and {len(report['links']['invalid']) - 5} more\")\n\n # Badges\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"BADGES\")\n output.append(\"-\" * 60)\n output.append(f\"Badge count: {report['badges']['count']}\")\n\n # Formatting\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"FORMATTING\")\n output.append(\"-\" * 60)\n output.append(f\"Issues found: {report['formatting']['issue_count']}\")\n if report['formatting']['issues']:\n for issue in report['formatting']['issues'][:5]: # Show first 5\n output.append(f\" - {issue}\")\n if len(report['formatting']['issues']) > 5:\n output.append(f\" ... and {len(report['formatting']['issues']) - 5} more\")\n\n # Headers\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"HEADER STRUCTURE\")\n output.append(\"-\" * 60)\n output.append(f\"Issues found: {report['headers']['issue_count']}\")\n if report['headers']['issues']:\n for issue in report['headers']['issues']:\n output.append(f\" - {issue}\")\n\n # Recommendations\n if report['recommendations']:\n output.append(\"\\n\" + \"-\" * 60)\n output.append(\"RECOMMENDATIONS\")\n output.append(\"-\" * 60)\n for i, rec in enumerate(report['recommendations'], start=1):\n output.append(f\"{i}. {rec}\")\n\n output.append(\"\\n\" + \"=\" * 60)\n\n return \"\\n\".join(output)\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n if len(sys.argv) \u003c 2:\n print(\"Usage: python validate-readme.py \u003cpath/to/README.md>\", file=sys.stderr)\n sys.exit(1)\n\n readme_path = sys.argv[1]\n\n report = validate_readme(readme_path)\n print(format_report(report))\n\n # Exit with error code if score is below 60\n if report['score'] \u003c 60:\n sys.exit(1)\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":11594,"content_sha256":"b0a7d5018d87d74cbac785f555907dd0082853792a4065a5a1ce9bcee0a26d25"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"README Generator","type":"text"}]},{"type":"paragraph","content":[{"text":"Generate or update a comprehensive README.md file for GitHub repositories following best practices.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Purpose","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill automates the creation of professional, well-structured README.md files for GitHub repositories. It generates all essential sections including badges for technologies used, project overview, site metrics, getting started instructions, project structure, and contact information. The skill is particularly optimized for MkDocs-based intelligent textbook projects but can be adapted for any repository type.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use This Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this skill when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Starting a new GitHub repository that needs a README.md","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Updating an existing README.md to follow best practices","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After significant project changes that should be documented","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before publishing or sharing a repository","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"When migrating from another documentation system","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After adding new technologies or dependencies","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Analyze Repository Context","type":"text"}]},{"type":"paragraph","content":[{"text":"Before generating the README, gather information about the repository:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check if README.md already exists in the root directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify the repository name from ","type":"text"},{"text":".git/config","type":"text","marks":[{"type":"code_inline"}]},{"text":" or the working directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read ","type":"text"},{"text":"mkdocs.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" if it exists to extract:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Site name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Site description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Site URL (for GitHub Pages link)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository URL","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check for documentation in ","type":"text"},{"text":"/docs","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify technologies used (look for package.json, requirements.txt, mkdocs.yml, etc.)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"User Dialog Triggers:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If README.md exists: Ask \"README.md already exists. Would you like to update it or create a backup first?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If repository URL not found: Ask \"What is the GitHub repository URL? (e.g., https://github.com/username/repo-name)\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If site URL not configured: Ask \"Is this site deployed to GitHub Pages? If yes, what's the URL?\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Generate Badges","type":"text"}]},{"type":"paragraph","content":[{"text":"Create badges for all relevant technologies and platforms. Use shields.io format for consistency.","type":"text"}]},{"type":"paragraph","content":[{"text":"Badge Order:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MkDocs (if mkdocs.yml exists)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MkDocs Material (if theme is Material)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GitHub Pages live badge (if site is deployed)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Claude Code badge","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Claude Skills badge (if .claude/skills or skills/ directory exists)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"License badge","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Additional technology badges (Python, JavaScript, p5.js, etc.)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Do NOT include a \"GitHub repo\" badge that links the README back to its own repository.","type":"text","marks":[{"type":"strong"}]},{"text":" Anyone reading the README is already on GitHub (or already has the repo cloned), so a self-link adds no value. The GitHub Pages badge is fine because it points to a different surface (the published site).","type":"text"}]},{"type":"paragraph","content":[{"text":"Badge Templates:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"[![MkDocs](https://img.shields.io/badge/Made%20with-MkDocs-526CFE?logo=materialformkdocs)](https://www.mkdocs.org/)\n[![Material for MkDocs](https://img.shields.io/badge/Material%20for%20MkDocs-526CFE?logo=materialformkdocs)](https://squidfunk.github.io/mkdocs-material/)\n[![GitHub Pages](https://img.shields.io/badge/View%20on-GitHub%20Pages-blue?logo=github)](SITE_URL)\n[![Claude Code](https://img.shields.io/badge/Built%20with-Claude%20Code-DA7857?logo=anthropic)](https://claude.ai/code)\n[![Claude Skills](https://img.shields.io/badge/Uses-Claude%20Skills-DA7857?logo=anthropic)](https://github.com/dmccreary/claude-skills)","type":"text"}]},{"type":"paragraph","content":[{"text":"Check for these additional badges:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"p5.js: ","type":"text"},{"text":"[![p5.js](https://img.shields.io/badge/p5.js-ED225D?logo=p5.js&logoColor=white)](https://p5js.org/)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Python: ","type":"text"},{"text":"[![Python](https://img.shields.io/badge/Python-3776AB?logo=python&logoColor=white)](https://www.python.org/)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"JavaScript: ","type":"text"},{"text":"[![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Add License Badge","type":"text"}]},{"type":"paragraph","content":[{"text":"Look for license information in:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"LICENSE","type":"text","marks":[{"type":"code_inline"}]},{"text":" file in root","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"docs/license.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"mkdocs.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" (copyright field)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Default to Creative Commons BY-NC-SA 4.0 if not specified:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"[![License: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/)","type":"text"}]},{"type":"paragraph","content":[{"text":"Other common licenses:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MIT: ","type":"text"},{"text":"[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apache 2.0: ","type":"text"},{"text":"[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GPL-3.0: ","type":"text"},{"text":"[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Create Website Link Section","type":"text"}]},{"type":"paragraph","content":[{"text":"After badges, add a prominent link to the live website (if deployed):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## View the Live Site\n\nVisit the interactive textbook at: [https://username.github.io/repo-name](https://username.github.io/repo-name)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: Write Overview/Short Description","type":"text"}]},{"type":"paragraph","content":[{"text":"Create a compelling 1-3 paragraph overview that answers:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What is this project?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Who is it for?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Why is it valuable?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What makes it unique or special?","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Guidelines:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep it concise but engaging","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use active voice","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Highlight key features or benefits","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mention the educational framework if applicable","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For textbooks: mention target audience (grade level, prerequisites)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example for Intelligent Textbook:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Overview\n\nThis is an interactive, AI-generated intelligent textbook on [TOPIC] designed for [AUDIENCE]. Built using MkDocs with the Material theme, it incorporates learning graphs, concept dependencies, interactive MicroSims (p5.js simulations), and AI-assisted content generation.\n\nThe textbook follows Bloom's Taxonomy (2001 revision) for learning outcomes and uses concept dependency graphs to ensure proper prerequisite sequencing. All content is generated and curated using Claude AI skills, making it a Level 2+ intelligent textbook with interactive elements.\n\nWhether you're a student learning [TOPIC] for the first time or an educator looking for structured course materials, this textbook provides comprehensive coverage with hands-on interactive elements that make complex concepts accessible and engaging.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 6: Add Site Status and Metrics","type":"text"}]},{"type":"paragraph","content":[{"text":"Gather and display project metrics to show completeness and scope.","type":"text"}]},{"type":"paragraph","content":[{"text":"Run Python script to collect metrics:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Call ","type":"text"},{"text":"scripts/collect-site-metrics.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or create it if needed) to gather:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Learning Graph Metrics","type":"text","marks":[{"type":"strong"}]},{"text":" (from ","type":"text"},{"text":"docs/learning-graph/","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of concepts in concept graph","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Quality score","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Taxonomy distribution","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content Metrics","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of chapters (count directories in ","type":"text"},{"text":"docs/chapters/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of markdown files (","type":"text"},{"text":".md","type":"text","marks":[{"type":"code_inline"}]},{"text":" files in ","type":"text"},{"text":"docs/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Total word count (sum of all markdown files)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of code blocks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of lists and tables","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Interactive Elements","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of MicroSims (directories in ","type":"text"},{"text":"docs/sims/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of quizzes (files named ","type":"text"},{"text":"quiz.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Total quiz questions (count in quiz files)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Educational Resources","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of glossary terms (in ","type":"text"},{"text":"docs/glossary.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of FAQ questions (in ","type":"text"},{"text":"docs/faq.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of references (in ","type":"text"},{"text":"docs/references.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Media Assets","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of images (","type":"text"},{"text":".png","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".jpg","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".svg","type":"text","marks":[{"type":"code_inline"}]},{"text":" files)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of diagrams (Mermaid, vis-network)","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Format as a table:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Site Status and Metrics\n\n| Metric | Count |\n|--------|-------|\n| Concepts in Learning Graph | 200 |\n| Chapters | 13 |\n| Markdown Files | 87 |\n| Total Words | 45,230 |\n| MicroSims | 12 |\n| Glossary Terms | 187 |\n| FAQ Questions | 42 |\n| Quiz Questions | 156 |\n| Images | 34 |\n| References | 28 |\n\n**Completion Status:** Approximately 85% complete (content generation phase)","type":"text"}]},{"type":"paragraph","content":[{"text":"Book-Specific Metrics:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"For specialized textbooks, add domain-specific metrics:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Circuits textbook","type":"text","marks":[{"type":"strong"}]},{"text":": Number of circuit diagrams, simulations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"History textbook","type":"text","marks":[{"type":"strong"}]},{"text":": Number of timelines, maps, primary source documents","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Programming textbook","type":"text","marks":[{"type":"strong"}]},{"text":": Number of code examples, exercises, projects","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Math textbook","type":"text","marks":[{"type":"strong"}]},{"text":": Number of equations, proofs, worked examples","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 7: Add Getting Started Section","type":"text"}]},{"type":"paragraph","content":[{"text":"Provide clear instructions for using and customizing the project.","type":"text"}]},{"type":"paragraph","content":[{"text":"Standard sections:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":" (if any)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clone the Repository","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Installation","type":"text","marks":[{"type":"strong"}]},{"text":" (if dependencies needed)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Building the Site","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Local Development","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Deployment","type":"text","marks":[{"type":"strong"}]}]}]}]},{"type":"paragraph","content":[{"text":"Example:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Getting Started\n\n### Clone the Repository\n\n```bash\ngit clone https://github.com/username/repo-name.git\ncd repo-name","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Install Dependencies","type":"text"}]},{"type":"paragraph","content":[{"text":"This project uses MkDocs with the Material theme:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"pip install mkdocs\npip install mkdocs-material","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Build and Serve Locally","type":"text"}]},{"type":"paragraph","content":[{"text":"Build the site:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"mkdocs build","type":"text"}]},{"type":"paragraph","content":[{"text":"Serve locally for development (with live reload):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"mkdocs serve","type":"text"}]},{"type":"paragraph","content":[{"text":"Open your browser to ","type":"text"},{"text":"http://localhost:8000","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deploy to GitHub Pages","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"mkdocs gh-deploy","type":"text"}]},{"type":"paragraph","content":[{"text":"This will build the site and push it to the ","type":"text"},{"text":"gh-pages","type":"text","marks":[{"type":"code_inline"}]},{"text":" branch.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Using the Book","type":"text"}]},{"type":"paragraph","content":[{"text":"Navigation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use the left sidebar to browse chapters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Click on the search icon to search all content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Each chapter includes quizzes and practice exercises","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Interactive MicroSims:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Found in the \"MicroSims\" section","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Each simulation runs standalone in your browser","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Adjust parameters with sliders and controls","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Customization:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Edit markdown files in ","type":"text"},{"text":"docs/","type":"text","marks":[{"type":"code_inline"}]},{"text":" to modify content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Modify ","type":"text"},{"text":"mkdocs.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" to change site structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add your own MicroSims in ","type":"text"},{"text":"docs/sims/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Customize theme in ","type":"text"},{"text":"docs/css/extra.css","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\n### Step 8: Document Repository Structure\n\nCreate an ASCII tree diagram showing the repository structure with explanatory comments.\n\n**Use this approach:**\n\n- Don't list every single file\n- Show representative examples\n- Add comments explaining each major directory\n- Keep it concise (10-20 lines)\n\n**Example:**\n\n```markdown\n## Repository Structure\n","type":"text"}]},{"type":"paragraph","content":[{"text":"repo-name/ ├── docs/ # MkDocs documentation source │ ├── chapters/ # Chapter content │ │ ├── 01-intro/ │ │ │ ├── index.md # Chapter markdown │ │ │ └── quiz.md # Chapter quiz │ │ └── 02-concepts/ │ ├── sims/ # Interactive p5.js MicroSims │ │ ├── graph-viewer/ │ │ │ ├── main.html # Standalone simulation │ │ │ └── index.md # Documentation │ ├── learning-graph/ # Learning graph data and analysis │ │ ├── learning-graph.csv # Concept dependencies │ │ ├── learning-graph.json # vis-network format │ │ └── quality-metrics.md # Quality analysis │ ├── glossary.md # ISO 11179-compliant definitions │ ├── faq.md # Frequently asked questions │ └── references.md # Curated references ├── skills/ # Claude AI skills (if present) │ └── [skill-name]/ │ ├── SKILL.md # Skill definition │ └── *.py # Supporting scripts ├── mkdocs.yml # MkDocs configuration └── README.md # This file","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 9: Add Issue Reporting Section","type":"text"}]},{"type":"paragraph","content":[{"text":"Direct users to the GitHub Issues page:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Reporting Issues\n\nFound a bug, typo, or have a suggestion for improvement? Please report it:\n\n[GitHub Issues](https://github.com/username/repo-name/issues)\n\nWhen reporting issues, please include:\n\n- Description of the problem or suggestion\n- Steps to reproduce (for bugs)\n- Expected vs actual behavior\n- Screenshots (if applicable)\n- Browser/environment details (for MicroSims)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 10: Add License Information","type":"text"}]},{"type":"paragraph","content":[{"text":"Reinforce licensing terms and attribution requirements:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## License\n\nThis work is licensed under the [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/).\n\n**You are free to:**\n\n- Share — copy and redistribute the material\n- Adapt — remix, transform, and build upon the material\n\n**Under the following terms:**\n\n- **Attribution** — Give appropriate credit with a link to the original\n- **NonCommercial** — No commercial use without permission\n- **ShareAlike** — Distribute contributions under the same license\n\nSee [LICENSE.md](docs/license.md) for full details.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 11: Add Acknowledgements","type":"text"}]},{"type":"paragraph","content":[{"text":"Express gratitude to the open source community and key projects:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Acknowledgements\n\nThis project is built on the shoulders of giants in the open source community:\n\n- **[MkDocs](https://www.mkdocs.org/)** - Static site generator optimized for project documentation\n- **[Material for MkDocs](https://squidfunk.github.io/mkdocs-material/)** - Beautiful, responsive theme\n- **[p5.js](https://p5js.org/)** - Creative coding library from NYU ITP\n- **[vis-network](https://visjs.org/)** - Network visualization library for learning graphs\n- **[Python](https://www.python.org/)** community - Data processing and analysis tools\n- **[Claude AI](https://claude.ai)** by Anthropic - AI-assisted content generation\n- **[GitHub Pages](https://pages.github.com/)** - Free hosting for open source projects\n\nSpecial thanks to the educators and developers who contribute to making educational resources accessible and interactive.","type":"text"}]},{"type":"paragraph","content":[{"text":"Customize based on actual dependencies:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add Chart.js if using bubble charts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add Mermaid if using diagrams","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add specific Python libraries if used (pandas, numpy, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add any other key dependencies","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 12: Add Contact Section","type":"text"}]},{"type":"paragraph","content":[{"text":"Provide a way for users to reach out:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Contact\n\n**Dan McCreary**\n\n- LinkedIn: [linkedin.com/in/danmccreary](https://www.linkedin.com/in/danmccreary/)\n- GitHub: [@dmccreary](https://github.com/dmccreary)\n\nQuestions, suggestions, or collaboration opportunities? Feel free to connect on LinkedIn or open an issue on GitHub.","type":"text"}]},{"type":"paragraph","content":[{"text":"Customize with actual maintainer information:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace with repository owner's name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update LinkedIn URL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update GitHub username","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add email if desired (optional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add website/blog if relevant","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 13: Add Optional Sections","type":"text"}]},{"type":"paragraph","content":[{"text":"Include these sections if relevant to the project:","type":"text"}]},{"type":"paragraph","content":[{"text":"Contributing Guidelines:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Contributing\n\nContributions are welcome! To contribute:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.","type":"text"}]},{"type":"paragraph","content":[{"text":"Citation Information:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## How to Cite\n\nIf you use this textbook in your research or teaching, please cite it as:\n","type":"text"}]},{"type":"paragraph","content":[{"text":"[Author Name]. (2024). [Textbook Title]. GitHub. https://github.com/username/repo-name","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\nBibTeX:\n\n```bibtex\n@misc{repo-name-2024,\n author = {[Author Name]},\n title = {[Textbook Title]},\n year = {2024},\n publisher = {GitHub},\n url = {https://github.com/username/repo-name}\n}","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\n**Changelog:**\n\n```markdown\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a detailed history of changes.\n\n**Recent Updates:**\n\n- v1.0.0 (2024-11-11): Initial release with 13 chapters\n- v0.9.0 (2024-11-01): Added 12 MicroSims and interactive elements\n- v0.5.0 (2024-10-15): Completed learning graph and chapter structure","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 14: Validate and Format","type":"text"}]},{"type":"paragraph","content":[{"text":"Before finalizing the README:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check all links","type":"text","marks":[{"type":"strong"}]},{"text":" - Verify GitHub URLs, site URLs, badge URLs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate markdown","type":"text","marks":[{"type":"strong"}]},{"text":" - Ensure proper formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test locally","type":"text","marks":[{"type":"strong"}]},{"text":" - Render README on GitHub to check appearance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Spell check","type":"text","marks":[{"type":"strong"}]},{"text":" - Review for typos and grammar","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Consistency","type":"text","marks":[{"type":"strong"}]},{"text":" - Ensure terminology matches project docs","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Quality checklist:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All badges render correctly","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Repository URL is correct","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Live site URL works (if applicable)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Metrics are accurate and current","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Code blocks have proper syntax highlighting","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Links are not broken","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Table of contents matches sections (if auto-generated)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"License information is clear","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Contact information is current","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 15: Write README.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Generate the final README.md file in the repository root with all sections in order:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title (H1) with repository name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Badges","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Live site link (if applicable)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overview","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Site Status and Metrics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Getting Started","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository Structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reporting Issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"License","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Acknowledgements","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contact","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optional sections (Contributing, Citation, Changelog)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Formatting best practices:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ATX-style headers (","type":"text"},{"text":"#","type":"text","marks":[{"type":"code_inline"}]},{"text":" not underlines)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include blank lines before lists","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use code fences with language specifiers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep lines under 120 characters where practical","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use relative links for internal documentation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add table of contents for longer READMEs (>500 lines)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Supporting Scripts","type":"text"}]},{"type":"paragraph","content":[{"text":"The skill includes Python scripts for automated metrics collection:","type":"text"}]},{"type":"paragraph","content":[{"text":"scripts/collect-site-metrics.py","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Scans the repository and generates a metrics report including:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Markdown file count and word counts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Chapter and section counts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MicroSim count","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Glossary, FAQ, quiz statistics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Image and diagram counts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Learning graph statistics","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Usage:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd skills/readme-generator/scripts\npython collect-site-metrics.py /path/to/repo","type":"text"}]},{"type":"paragraph","content":[{"text":"Output: JSON object with all metrics","type":"text"}]},{"type":"paragraph","content":[{"text":"scripts/validate-readme.py","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Validates README.md for:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Required sections present","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Working links","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Valid badge URLs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proper markdown formatting","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Usage:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python validate-readme.py README.md","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Files","type":"text"}]},{"type":"paragraph","content":[{"text":"Required:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Complete README in repository root","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Optional:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":2,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"README-backup.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Backup of previous README (if updating)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"docs/readme-metrics.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Metrics data in JSON format","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Example Session","type":"text"}]},{"type":"paragraph","content":[{"text":"User:","type":"text","marks":[{"type":"strong"}]},{"text":" \"Generate a README for this repository\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Claude (using this skill):","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Checks if README.md exists (found, create backup)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reads ","type":"text"},{"text":"mkdocs.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" to extract site info","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identifies technologies: MkDocs, Material, p5.js, Python","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scans ","type":"text"},{"text":"/docs","type":"text","marks":[{"type":"code_inline"}]},{"text":" for metrics (chapters, MicroSims, glossary)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Runs ","type":"text"},{"text":"collect-site-metrics.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" to gather statistics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generates badges for all identified technologies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Writes comprehensive README.md with all 12 sections","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validates links and formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reports: \"Created README.md with 15 sections, 8 badges, and current site metrics (200 concepts, 13 chapters, 87 files, 12 MicroSims). Previous README backed up to README-backup.md.\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quality Standards","type":"text"}]},{"type":"paragraph","content":[{"text":"A high-quality README should have:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All relevant badges displayed correctly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Accurate, current metrics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clear, compelling overview (200-400 words)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complete getting started instructions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proper attribution and licensing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Working links (100% functional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Professional formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contact information","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"References","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GitHub README Best Practices","type":"text","marks":[{"type":"link","attrs":{"href":"https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Shields.io Badge Documentation","type":"text","marks":[{"type":"link","attrs":{"href":"https://shields.io/","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creative Commons License Chooser","type":"text","marks":[{"type":"link","attrs":{"href":"https://creativecommons.org/choose/","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MkDocs Documentation","type":"text","marks":[{"type":"link","attrs":{"href":"https://www.mkdocs.org/","title":null}}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"readme-generator","author":"@skillopedia","source":{"stars":72,"repo_name":"claude-skills","origin_url":"https://github.com/dmccreary/claude-skills/blob/HEAD/skills/readme-generator/SKILL.md","repo_owner":"dmccreary","body_sha256":"5020fe20cac07fa81b9849888c7cb9eb218353c08be8c45424bed78e7abb6efd","cluster_key":"616ef576c410d1b7cc0d53f0507d82f528361e1b632f8d123ba52bd949ce3698","clean_bundle":{"format":"clean-skill-bundle-v1","source":"dmccreary/claude-skills/skills/readme-generator/SKILL.md","attachments":[{"id":"be06015b-c713-5fba-8add-4a2d4141b9aa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/be06015b-c713-5fba-8add-4a2d4141b9aa/attachment.md","path":"README.md","size":4253,"sha256":"a386827ef5899c47354c0513a7d9b7c004cb3eb75d3d5569a7dad565aa25757b","contentType":"text/markdown; charset=utf-8"},{"id":"da1795fd-ad9a-5fc5-b047-74feefbf5a8a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/da1795fd-ad9a-5fc5-b047-74feefbf5a8a/attachment.md","path":"references/badges.md","size":9731,"sha256":"e885b78eeb772bd0b1adc2e06723c331370d1b8e30733dd30070fdd69abe9a64","contentType":"text/markdown; charset=utf-8"},{"id":"f2834595-9596-51b9-8bde-80bfbf797654","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f2834595-9596-51b9-8bde-80bfbf797654/attachment.py","path":"scripts/collect-site-metrics.py","size":12624,"sha256":"15800cbd2da2ceb002f32e9767295ec297264116f6f1915a772e58f308813aab","contentType":"text/x-python; charset=utf-8"},{"id":"5193abf2-87b9-5a95-a27d-5ed05cbdd719","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5193abf2-87b9-5a95-a27d-5ed05cbdd719/attachment.py","path":"scripts/validate-readme.py","size":11594,"sha256":"b0a7d5018d87d74cbac785f555907dd0082853792a4065a5a1ce9bcee0a26d25","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"44afb059d2378d52d2fd445cd1c58cf85c42db57a084cd4be2b5881520e7e9a6","attachment_count":4,"text_attachments":4,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/readme-generator/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"documents-office","category_label":"Documents"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"documents-office","import_tag":"clean-skills-v1","description":"This skill creates or updates a README.md file in the GitHub home directory of the current project. The README.md file it generates will conform to GitHub best practices, including badges, project overview, site metrics, getting started instructions, and comprehensive documentation."}},"renderedAt":1782980448187}

README Generator Generate or update a comprehensive README.md file for GitHub repositories following best practices. Purpose This skill automates the creation of professional, well-structured README.md files for GitHub repositories. It generates all essential sections including badges for technologies used, project overview, site metrics, getting started instructions, project structure, and contact information. The skill is particularly optimized for MkDocs-based intelligent textbook projects but can be adapted for any repository type. When to Use This Skill Use this skill when: - Starting a…