{"id":31534052,"url":"https://github.com/apyguard/apyguard_openapi_analysis","last_synced_at":"2025-10-04T05:16:43.169Z","repository":{"id":315792175,"uuid":"1060394240","full_name":"ApyGuard/apyguard_openapi_analysis","owner":"ApyGuard","description":"A comprehensive GitHub Action that analyzes OpenAPI specifications and provides detailed feedback on best practices, validation, and documentation quality. Supports both single file analysis and entire repository scanning.","archived":false,"fork":false,"pushed_at":"2025-09-27T18:39:07.000Z","size":112,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-27T20:41:05.752Z","etag":null,"topics":["openapi","openapi-spec","security","security-tools"],"latest_commit_sha":null,"homepage":"https://apyguard.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ApyGuard.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-19T20:51:41.000Z","updated_at":"2025-09-27T18:37:59.000Z","dependencies_parsed_at":"2025-09-27T20:28:26.939Z","dependency_job_id":null,"html_url":"https://github.com/ApyGuard/apyguard_openapi_analysis","commit_stats":null,"previous_names":["apyguard/apyguard_openapi_analysis"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/ApyGuard/apyguard_openapi_analysis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ApyGuard%2Fapyguard_openapi_analysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ApyGuard%2Fapyguard_openapi_analysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ApyGuard%2Fapyguard_openapi_analysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ApyGuard%2Fapyguard_openapi_analysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ApyGuard","download_url":"https://codeload.github.com/ApyGuard/apyguard_openapi_analysis/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ApyGuard%2Fapyguard_openapi_analysis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278266896,"owners_count":25958733,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["openapi","openapi-spec","security","security-tools"],"created_at":"2025-10-04T05:16:39.402Z","updated_at":"2025-10-04T05:16:43.153Z","avatar_url":"https://github.com/ApyGuard.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenAPI Analyzer\n\nA comprehensive GitHub Action that analyzes OpenAPI specifications and provides detailed feedback on best practices, validation, and documentation quality. Supports both single file analysis and entire repository scanning.\n\n## Features\n\n### 🔍 **Core Analysis**\n- **Comprehensive Validation**: Validates OpenAPI specs against best practices\n- **Detailed Reporting**: Provides actionable suggestions for improvement\n- **Version-Aware**: Supports OpenAPI 3.x and Swagger 2.0 (v2) specs\n- **Easy Integration**: Simple one-step setup in your GitHub workflows\n\n### 🛡️ **Advanced Security Analysis**\n- **OWASP API Security Top 10**: Complete compliance checking\n- **Authentication Analysis**: OAuth2, API keys, JWT token validation\n- **Authorization Checks**: Function-level and object-level authorization\n- **Data Exposure Analysis**: Identifies sensitive data exposure risks\n- **Injection Vulnerability Detection**: SQL injection and XSS pattern detection\n- **Security Misconfiguration**: HTTPS, CORS, and security header analysis\n\n### ⚡ **Performance \u0026 Optimization**\n- **Response Complexity Analysis**: Identifies overly complex response schemas\n- **Caching Recommendations**: Cache-Control, ETag, Last-Modified headers\n- **Rate Limiting Analysis**: API throttling and quota management\n- **Performance Metrics**: Response time estimates and payload analysis\n- **Pagination Detection**: List operation pagination requirements\n\n### 🏗️ **API Design \u0026 Patterns**\n- **RESTful Compliance**: CRUD operation completeness analysis\n- **Resource Hierarchy**: Proper resource organization and relationships\n- **HTTP Method Usage**: Appropriate method selection and idempotency\n- **Naming Conventions**: Consistent path and parameter naming\n- **Design Pattern Detection**: Common API patterns and anti-patterns\n\n### 📊 **Advanced Analytics**\n- **Complexity Scoring**: API complexity and maintainability metrics\n- **Technical Debt Identification**: Areas requiring refactoring\n- **Architecture Insights**: Domain modeling and design recommendations\n- **Quality Metrics**: Comprehensive API quality assessment\n\n### 🛡️ **Compliance \u0026 Standards**\n- **GDPR Compliance**: Personal data handling and privacy requirements\n- **HIPAA Compliance**: Healthcare data protection standards\n- **PCI-DSS Compliance**: Payment card data security\n- **Accessibility Standards**: WCAG compliance for error messages\n- **Industry-Specific**: Regulatory compliance checking\n\n### 🧪 **Testing \u0026 Quality Assurance**\n- **Test Scenario Generation**: Comprehensive test case recommendations\n- **Mock Data Generation**: Schema-based test data creation\n- **Contract Testing**: API compatibility and versioning strategies\n- **Load Testing**: Performance and scalability recommendations\n- **Security Testing**: Authentication and authorization test scenarios\n\n### 📈 **Monitoring \u0026 Observability**\n- **Health Check Endpoints**: System monitoring and status endpoints\n- **Metrics Collection**: Performance and usage analytics\n- **Logging Strategies**: Structured logging and correlation IDs\n- **Alerting Configuration**: Error rate and performance monitoring\n- **Distributed Tracing**: Request tracing and debugging support\n\n### 🔧 **Code Generation \u0026 SDKs**\n- **Client SDK Generation**: Multi-language SDK creation\n- **Server Stubs**: Framework-specific server implementations\n- **TypeScript Types**: Type-safe client development\n- **Database Models**: ORM framework integration\n- **Mock Servers**: Development and testing environments\n\n### 🏛️ **API Governance**\n- **Naming Consistency**: Standardized naming conventions\n- **Style Guide Compliance**: Organizational API standards\n- **Versioning Strategy**: Semantic versioning and migration paths\n- **Deprecation Management**: Proper API lifecycle management\n- **Change Management**: Breaking change detection and communication\n\n### 🏢 **Repository Analysis**\n- **Multi-File Support**: Analyze entire repositories for OpenAPI files\n- **Auto-Discovery**: Automatically finds OpenAPI files in repositories\n- **Repository Metadata**: GitHub statistics and project information\n- **Local File Support**: Analyze local OpenAPI files in your repository\n\n## Quick Start\n\n### Example Usage\n\n```yaml\nname: OpenAPI Analysis\n\non:\n  push:\n    branches: [ main, develop ]\n    paths:\n      - '**/*.json'\n      - '**/*.yaml'\n      - '**/*.yml'\n  pull_request:\n    branches: [ main, develop ]\n    paths:\n      - '**/*.json'\n      - '**/*.yaml'\n      - '**/*.yml'\n  workflow_dispatch:\n\njobs:\n  analyze-openapi:\n    runs-on: ubuntu-latest\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n      \n    - name: Analyze OpenAPI\n      id: analyze\n      uses: ApyGuard/apyguard_openapi_analysis@main\n      with:\n        # Change this to your OpenAPI file path\n        file: your-openapi-file.json\n        output_format: json\n        \n    - name: Display Results\n      run: |\n        echo \"OpenAPI Analysis Results:\"\n        echo \"=========================\"\n        echo \"Valid: ${{ steps.analyze.outputs.is_valid }}\"\n        echo \"Suggestions: ${{ steps.analyze.outputs.suggestions_count }}\"\n        echo \"Operations: ${{ steps.analyze.outputs.operations_count }}\"\n        echo \"Paths: ${{ steps.analyze.outputs.paths_count }}\"\n        echo \"Schemas: ${{ steps.analyze.outputs.schemas_count }}\"\n        \n    - name: Comment on PR\n      if: github.event_name == 'pull_request'\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const analysis = JSON.parse('${{ steps.analyze.outputs.analysis }}');\n          const comment = `## 🔍 OpenAPI Analysis Results\n          \n          **Valid**: ${analysis.is_valid ? '✅' : '❌'}\n          **Total Suggestions**: ${analysis.suggestions ? Object.values(analysis.suggestions).reduce((total, suggestions) =\u003e total + suggestions.length, 0) : 0}\n          **Operations**: ${analysis.summary ? analysis.summary.operations_count : 0}\n          **Paths**: ${analysis.summary ? analysis.summary.paths_count : 0}\n          **Schemas**: ${analysis.summary ? analysis.summary.schemas_count : 0}\n          \n          ${analysis.suggestions \u0026\u0026 Object.keys(analysis.suggestions).length \u003e 0 ? \n            Object.entries(analysis.suggestions).map(([category, suggestions]) =\u003e \n              `### ${category} (${suggestions.length} issues)\\n\\n${suggestions.slice(0, 3).map(s =\u003e `- ${s}`).join('\\n')}${suggestions.length \u003e 3 ? `\\n- ... and ${suggestions.length - 3} more` : ''}\\n`\n            ).join('\\n') : \n            '### ✅ No suggestions found! Your OpenAPI specification looks great! 🎉'\n          }`;\n            \n          github.rest.issues.createComment({\n            issue_number: context.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: comment\n          });\n```\n\n### Option 1: Using the GitHub Action (Recommended)\n\nThe action is now fully tested and works reliably with all repository types. Add this workflow to your repository (`.github/workflows/openapi-analysis.yml`):\n\n```yaml\nname: OpenAPI Analysis\n\non:\n  push:\n    branches: [ main, develop ]\n    paths:\n      - '**/*.json'\n      - '**/*.yaml'\n      - '**/*.yml'\n  pull_request:\n    branches: [ main, develop ]\n    paths:\n      - '**/*.json'\n      - '**/*.yaml'\n      - '**/*.yml'\n  workflow_dispatch:\n\njobs:\n  analyze-openapi:\n    runs-on: ubuntu-latest\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n      \n    - name: Analyze OpenAPI\n      id: analyze\n      uses: ApyGuard/apyguard_openapi_analysis@main\n      with:\n        # Change this to your OpenAPI file path\n        file: your-openapi-file.json\n        output_format: json\n        \n    - name: Display Results\n      run: |\n        echo \"OpenAPI Analysis Results:\"\n        echo \"=========================\"\n        echo \"Valid: ${{ steps.analyze.outputs.is_valid }}\"\n        echo \"Suggestions: ${{ steps.analyze.outputs.suggestions_count }}\"\n        echo \"Operations: ${{ steps.analyze.outputs.operations_count }}\"\n        echo \"Paths: ${{ steps.analyze.outputs.paths_count }}\"\n        echo \"Schemas: ${{ steps.analyze.outputs.schemas_count }}\"\n        \n    - name: Comment on PR\n      if: github.event_name == 'pull_request'\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const analysis = JSON.parse('${{ steps.analyze.outputs.analysis }}');\n          const comment = `## 🔍 OpenAPI Analysis Results\n          \n          **Valid**: ${analysis.is_valid ? '✅' : '❌'}\n          **Total Suggestions**: ${analysis.suggestions ? Object.values(analysis.suggestions).reduce((total, suggestions) =\u003e total + suggestions.length, 0) : 0}\n          **Operations**: ${analysis.summary ? analysis.summary.operations_count : 0}\n          **Paths**: ${analysis.summary ? analysis.summary.paths_count : 0}\n          **Schemas**: ${analysis.summary ? analysis.summary.schemas_count : 0}\n          \n          ${analysis.suggestions \u0026\u0026 Object.keys(analysis.suggestions).length \u003e 0 ? \n            Object.entries(analysis.suggestions).map(([category, suggestions]) =\u003e \n              `### ${category} (${suggestions.length} issues)\\n\\n${suggestions.slice(0, 3).map(s =\u003e `- ${s}`).join('\\n')}${suggestions.length \u003e 3 ? `\\n- ... and ${suggestions.length - 3} more` : ''}\\n`\n            ).join('\\n') : \n            '### ✅ No suggestions found! Your OpenAPI specification looks great! 🎉'\n          }`;\n            \n          github.rest.issues.createComment({\n            issue_number: context.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: comment\n          });\n```\n\n### Option 2: Analyze from URL\n\n```yaml\nname: OpenAPI Analysis\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  analyze:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - name: Analyze OpenAPI from URL\n      uses: ApyGuard/apyguard_openapi_analysis@main\n      with:\n        spec_url: 'https://api.example.com/openapi.json'\n        output_format: json\n```\n\n### Option 3: Analyze Repository\n\n```yaml\nname: OpenAPI Analysis\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  analyze:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - name: Analyze Repository OpenAPI Files\n      uses: ApyGuard/apyguard_openapi_analysis@main\n      with:\n        repository: ${{ github.repository }}\n        github_token: ${{ secrets.GITHUB_TOKEN }}\n        output_format: summary\n```\n\n## How to Use in Other Repositories\n\n### 1. **Copy the Workflow**\nCopy one of the workflow examples above to your repository's `.github/workflows/` directory.\n\n### 2. **Customize the File Path**\nReplace `your-openapi-file.json` with your actual OpenAPI file path:\n```yaml\nwith:\n  file: api/openapi.json  # Your OpenAPI file path\n```\n\n### 3. **Set Up Triggers**\nConfigure when the analysis should run:\n```yaml\non:\n  push:\n    branches: [ main ]           # Run on pushes to main\n    paths: [ '**/*.json' ]      # Only when JSON files change\n  pull_request:\n    branches: [ main ]          # Run on PRs to main\n  workflow_dispatch:            # Allow manual triggering\n```\n\n### 4. **Commit and Push**\nThe workflow will run automatically when you push changes to your OpenAPI files.\n\n## Workflow Templates\n\nWe provide ready-to-use workflow templates that you can copy to your repository:\n\n### 📁 **Available Workflow Templates**\n\n| Workflow Template | Purpose | Best For | Triggers | Input | Output |\n|------------------|---------|----------|----------|-------|--------|\n| **`analyze-single-openapi-file.yml`** | Analyze one OpenAPI file from URL | External APIs, single file analysis | Push, PR, Manual | OpenAPI URL | Analysis results with suggestions |\n| **`analyze-repository-openapi-files.yml`** | Find and analyze all OpenAPI files in repository | Multi-file repositories, comprehensive analysis | Push, PR, Manual | Repository name | All files + repository metadata |\n| **`analyze-openapi-advanced.yml`** | Advanced multi-type analysis with scheduling | Enterprise use, automated monitoring | Push, PR, Schedule, Manual | Analysis type | Reports + artifacts + PR comments |\n| **`test-openapi-analyzer.yml`** | Test the analyzer in different scenarios | Development, debugging | Manual only | Test type | Test results and validation |\n\n### 🚀 **Quick Setup with Templates**\n\n1. **Copy a workflow template** from `.github/workflows/` to your repository's `.github/workflows/` directory\n2. **Rename the file** to something like `openapi-analysis.yml`\n3. **Customize the triggers** (branches, events) as needed\n4. **Commit and push** - the workflow will run automatically\n\n### 📋 **Template Comparison**\n\n| Feature | Single File | Repository | Advanced |\n|---------|-------------|------------|----------|\n| **File Analysis** | ✅ One file | ✅ Multiple files | ✅ Multiple types |\n| **URL Support** | ✅ Yes | ❌ No | ✅ Yes |\n| **Local Files** | ❌ No | ❌ No | ✅ Yes |\n| **Repository Metadata** | ❌ No | ✅ Yes | ✅ Yes |\n| **Scheduled Runs** | ❌ No | ❌ No | ✅ Daily |\n| **Report Generation** | ❌ No | ❌ No | ✅ Yes |\n| **Artifact Upload** | ❌ No | ❌ No | ✅ Yes |\n| **PR Comments** | ✅ Basic | ✅ Detailed | ✅ Advanced |\n| **Manual Dispatch** | ✅ Yes | ✅ Yes | ✅ Yes |\n| **Complexity** | 🟢 Simple | 🟡 Medium | 🔴 Advanced |\n\n## What This Workflow Does\n\n### 🔍 **Analysis Features**\n- **Validates** your OpenAPI specification\n- **Counts** operations, paths, and schemas\n- **Provides suggestions** for improvements\n- **Checks** for missing documentation\n- **Validates** security configurations\n- **Reviews** response definitions\n\n### 📊 **Outputs**\n- **Valid**: Whether the spec is valid\n- **Suggestions**: Number of improvement suggestions\n- **Operations**: Number of API operations\n- **Paths**: Number of API paths\n- **Schemas**: Number of data schemas\n\n### 🎯 **Triggers**\n- **Push**: Runs when you push to main/develop branches\n- **Pull Request**: Runs on PRs to main/develop branches\n- **Manual**: Can be triggered manually via GitHub Actions UI\n- **File Changes**: Only runs when OpenAPI files are modified\n\n## Example Output\n\nThe workflow will generate a comment like this on your PRs:\n\n```markdown\n## 🔍 OpenAPI Analysis Results\n\n**Valid**: ✅\n**Suggestions**: 5\n**Operations**: 10\n**Paths**: 2\n**Schemas**: 3\n\n### 📋 Top Suggestions:\n\n- Spec is missing an API title.\n- No servers defined. Consider specifying servers for clarity.\n- Operation GET /users missing security definition.\n- POST operation /users should have requestBody.\n- Operation POST /users missing security definition.\n\nDetailed results are available in the workflow artifacts.\n```\n\n## Customization\n\n### Change the File Path\nReplace `your-openapi-file.json` with your actual OpenAPI file:\n\n```yaml\n- name: Run OpenAPI Analysis\n  run: |\n    python analyzer.py api/openapi.json \u003e analysis-results.json\n```\n\n### Multiple Files\nTo analyze multiple OpenAPI files, create separate steps:\n\n```yaml\n- name: Analyze API v1\n  run: |\n    python analyzer.py api-v1.json \u003e analysis-v1.json\n    \n- name: Analyze API v2  \n  run: |\n    python analyzer.py api-v2.json \u003e analysis-v2.json\n```\n\n### Different File Formats\nThe analyzer supports both JSON and YAML:\n\n```yaml\n# For JSON files\npython analyzer.py api.json\n\n# For YAML files  \npython analyzer.py api.yaml\n```\n\n## What the Analyzer Checks\n\n### 📋 Basic Validation\n- ✅ Valid JSON/YAML format\n- ✅ OpenAPI specification compliance\n- ✅ Required fields (title, description, version)\n\n### 🔐 Security Analysis\n- 🔒 Global security requirements\n- 🔒 Operation-level security definitions\n- 🔒 Authentication scheme documentation\n\n### 📝 Documentation Quality\n- 📖 Operation descriptions and summaries\n- 📖 Parameter descriptions\n- 📖 Response descriptions and schemas\n- 📖 Schema definitions and types\n\n### 🛠️ Best Practices\n- 🎯 Unique operation IDs\n- 🎯 Proper HTTP status codes\n- 🎯 Server definitions\n- 🎯 Request/response content types\n- 🎯 Schema composition and inheritance\n\n## Advanced Usage\n\n### Repository Analysis\nAnalyze all OpenAPI files in a repository:\n\n```yaml\n- name: Analyze Repository\n  uses: ApyGuard/apyguard_openapi_analysis@main\n  with:\n    repository: ${{ github.repository }}\n    github_token: ${{ secrets.GITHUB_TOKEN }}\n    output_format: summary\n```\n\n### URL Analysis\nAnalyze OpenAPI specs from URLs:\n\n```yaml\n- name: Analyze from URL\n  uses: ApyGuard/apyguard_openapi_analysis@main\n  with:\n    spec_url: 'https://api.example.com/openapi.json'\n    output_format: json\n```\n\n### Custom Analysis Rules\nYou can modify the analyzer script to add custom validation rules by editing the `analyze_openapi_spec` function.\n\n## Troubleshooting\n\n### File Not Found Error\nMake sure your OpenAPI file exists in the repository root or update the file path in the workflow.\n\n### Permission Issues\nEnsure the workflow has permission to read your OpenAPI files.\n\n### Analysis Not Running\nCheck that your file has a `.json`, `.yaml`, or `.yml` extension and is in the repository.\n\n### Docker Issues\nThe action uses Docker containers to ensure consistent execution across different environments. If you encounter Docker-related issues:\n\n1. **Check GitHub Actions logs** for specific error messages\n2. **Verify file paths** are correct relative to your repository root\n3. **Ensure proper permissions** for the workflow to access your files\n4. **Check network connectivity** if analyzing from URLs\n\nThe Docker container is configured to work with GitHub Actions' working directory (`/github/workspace`) and will automatically find your OpenAPI files.\n\n## Requirements\n\n- OpenAPI 3.0+ or Swagger 2.0 specifications (v2 is automatically normalized to v3-like structure)\n- For single file analysis: Publicly accessible URL to the specification\n- For repository analysis: Public repository or GitHub token for private repositories\n- Valid JSON or YAML format\n\n## Support\n\nFor support and questions:\n- 📧 **Issues**: [GitHub Issues](https://github.com/ApyGuard/openapi_analyzer/issues)\n- 📖 **Documentation**: [GitHub Wiki](https://github.com/ApyGuard/openapi_analyzer/wiki)\n- 💬 **Discussions**: [GitHub Discussions](https://github.com/ApyGuard/openapi_analyzer/discussions)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Changelog\n\n### v1.0.2\n- 🔧 **Docker Fix**: Fixed Docker container to work correctly with GitHub Actions working directory\n- 🔧 **Path Resolution**: Improved file path handling for local OpenAPI files\n- 🔧 **Container Stability**: Enhanced Docker container reliability across different environments\n- ✅ **Verified Compatibility**: Tested with multiple repository types and file structures\n\n### v1.0.1\n- 🆕 **Repository Analysis**: Analyze entire repositories for OpenAPI files\n- 🆕 **Auto-Discovery**: Automatically finds OpenAPI files in repositories\n- 🆕 **Repository Metadata**: Get repository information and statistics\n- 🆕 **Multiple File Support**: Analyze multiple OpenAPI files in one run\n- 🆕 **Enhanced CLI**: Support for repository analysis via command line\n- 🆕 **GitHub Token Support**: Support for private repositories\n- 🆕 **Output Formats**: JSON and summary output formats\n- 🆕 **Rate Limit Management**: Built-in GitHub API rate limit handling\n- 🆕 **Local File Support**: Analyze local OpenAPI files in repositories\n\n### v1.0.0\n- Initial release\n- Basic OpenAPI validation\n- Comprehensive best practice checks\n- Security analysis\n- Documentation quality assessment\n\n---\n\nMade with ❤️ by [ApyGuard](https://github.com/ApyGuard)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapyguard%2Fapyguard_openapi_analysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapyguard%2Fapyguard_openapi_analysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapyguard%2Fapyguard_openapi_analysis/lists"}