{"id":51579227,"url":"https://github.com/lfreleng-actions/project-reporting-tool","last_synced_at":"2026-07-11T04:02:09.246Z","repository":{"id":323079624,"uuid":"1091867083","full_name":"lfreleng-actions/project-reporting-tool","owner":"lfreleng-actions","description":"Tool to generate project reports from Linux Foundation Gerrit server content","archived":false,"fork":false,"pushed_at":"2026-07-04T08:09:20.000Z","size":1251300,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-04T10:11:34.565Z","etag":null,"topics":["ci","github","jenkins","jobs","project","projects","reporting","reports"],"latest_commit_sha":null,"homepage":"https://lfreleng-actions.github.io/project-reporting-tool/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lfreleng-actions.png","metadata":{"files":{"readme":"README.md","changelog":null,"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-11-07T16:29:44.000Z","updated_at":"2026-07-03T08:07:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"8ad8fa50-c340-4bbd-806c-83951febf5d6","html_url":"https://github.com/lfreleng-actions/project-reporting-tool","commit_stats":null,"previous_names":["modeseven-lfit/reporting-tool","modeseven-lfit/gerrit-reporting-tool","modeseven-lfit/project-reporting-tool","lfreleng-actions/project-reporting-tool"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/lfreleng-actions/project-reporting-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fproject-reporting-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fproject-reporting-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fproject-reporting-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fproject-reporting-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lfreleng-actions","download_url":"https://codeload.github.com/lfreleng-actions/project-reporting-tool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fproject-reporting-tool/sbom","scorecard":{"id":1239581,"data":{"date":"2025-11-07T23:38:08Z","repo":{"name":"github.com/modeseven-lfit/reporting-tool","commit":"64a52a42e34db9518db140d04763c674ffe391a8"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5,"checks":[{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":0,"reason":"Found 0/1 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/build-test-release.yaml:277","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/build-test-release.yaml:341","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:22","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:86","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:119","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:146","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:170","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:245","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test-release.yaml:215","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test.yaml:37","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test.yaml:65","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test.yaml:92","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-test.yaml:116","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/codeql.yml:30","Info: jobLevel 'packages' permission set to 'read': .github/workflows/codeql.yml:32","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:34","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:35","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/openssf-scorecard.yaml:35","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release-drafter.yaml:56","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reporting.yaml:382","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reporting.yaml:418","Warn: jobLevel 'actions' permission set to 'write': .github/workflows/reporting.yaml:419","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reporting.yaml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reporting.yaml:169","Info: jobLevel 'contents' permission set to 'read': .github/workflows/semantic-pull-request.yaml:24","Info: found token with 'none' permissions: .github/workflows/build-test-release.yaml:1","Info: found token with 'none' permissions: .github/workflows/build-test.yaml:1","Info: found token with 'none' permissions: .github/workflows/codeql.yml:1","Info: found token with 'none' permissions: .github/workflows/openssf-scorecard.yaml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/performance-tracking.yaml:23","Info: topLevel 'contents' permission set to 'read': .github/workflows/pre-commit.yaml:20","Info: found token with 'none' permissions: .github/workflows/release-drafter.yaml:1","Info: found token with 'none' permissions: .github/workflows/reporting.yaml:1","Info: found token with 'none' permissions: .github/workflows/semantic-pull-request.yaml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/tests.yaml:35","Warn: topLevel 'checks' permission set to 'write': .github/workflows/tests.yaml:36"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":9,"reason":"dependency not pinned by hash detected -- score normalized to 9","details":["Warn: pipCommand not pinned by hash: .github/workflows/pre-commit.yaml:146","Warn: pipCommand not pinned by hash: .github/workflows/pre-commit.yaml:147","Warn: pipCommand not pinned by hash: .github/workflows/pre-commit.yaml:185","Warn: pipCommand not pinned by hash: .github/workflows/pre-commit.yaml:186","Warn: pipCommand not pinned by hash: .github/workflows/tests.yaml:457","Info:  69 out of  69 GitHub-owned GitHubAction dependencies pinned","Info:  68 out of  68 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Contributors","score":0,"reason":"project has 0 contributing companies or organizations -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":0,"reason":"0 out of 1 merged PRs checked by a CI test -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-11-08T01:20:09.453Z","repository_id":323079624,"created_at":"2025-11-08T01:20:09.453Z","updated_at":"2025-11-08T01:20:09.453Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35350133,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-11T02:00:05.354Z","response_time":104,"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":["ci","github","jenkins","jobs","project","projects","reporting","reports"],"created_at":"2026-07-11T04:02:07.694Z","updated_at":"2026-07-11T04:02:09.239Z","avatar_url":"https://github.com/lfreleng-actions.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\n# SPDX-License-Identifier: Apache-2.0\n# SPDX-FileCopyrightText: 2025 The Linux Foundation\n--\u003e\n\n# 📊 Linux Foundation Project Reporting System\n\n\u003e Comprehensive multi-repository analysis tool for Linux Foundation projects\n\nGenerate detailed reports on Gerrit projects, contributor activity, Jenkins\njobs, GitHub CI/CD workflows, and development practices across repositories.\n\n---\n\n## 🗒️ Published Reports\n\n\u003chttps://lfreleng-actions.github.io/project-reporting-tool/\u003e\n\n## ⚡ Quick Start\n\n```bash\n# Install\npip install .\n\n# Generate your first report\nlf-releng-project-reporting generate \\\n  --project my-project \\\n  --repos-path ./repos\n```\n\n---\n\n## 🚀 Key Features\n\n- **📈 Git Analytics** - Commit activity, lines of code, contributor metrics across configurable time windows\n- **📋 INFO.yaml Reporting** - Project metadata, committer activity, and lifecycle state tracking from info-master\n- **🔍 Feature Detection** - Automatic detection of CI/CD, documentation, dependency management, security tools\n- **👥 Contributor Intelligence** - Author and organization analysis with domain mapping\n- **🌐 API Integration** - GitHub, Gerrit, and Jenkins API support\n- **🎯 CI-Management Integration** - Authoritative Jenkins job allocation using JJB definitions (99%+ accuracy)\n- **📊 Interactive Reports** - JSON (data), Markdown (readable), HTML (interactive), ZIP (bundled)\n- **⚡ High Performance** - Parallel processing with caching support\n\n---\n\n## 📚 Documentation\n\n### 🎯 Getting Started\n\n- **[Getting Started Guide](docs/GETTING_STARTED.md)** - Complete installation and setup walkthrough\n- **[Commands Reference](docs/COMMANDS.md)** - Full command-line reference with quick reference\n- **[FAQ](docs/FAQ.md)** - Frequently asked questions\n- **[Usage Examples](docs/USAGE_EXAMPLES.md)** - Real-world scenarios and patterns\n\n### ⚙️ Setup \u0026 Configuration\n\n- **[Configuration Guide](docs/CONFIGURATION.md)** - All configuration options (GitHub API, INFO.yaml, performance)\n- **[Configuration Merging](docs/CONFIGURATION_MERGING.md)** - How project configs inherit and override defaults\n- **[Deployment Guide](docs/DEPLOYMENT.md)** - Production deployment and operations\n- **[CI/CD Integration](docs/CI_CD_INTEGRATION.md)** - GitHub Actions, GitLab CI, and automation\n\n### 🔧 Advanced Usage\n\n- **[Performance Guide](docs/PERFORMANCE.md)** - Optimization, caching, and scaling\n- **[Feature Discovery](docs/FEATURE_DISCOVERY_GUIDE.md)** - Understanding automatic feature detection\n- **[INFO.yaml Reporting](docs/INFO_YAML_REPORTING.md)** - Project metadata and committer activity tracking\n- **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Problem solving and debugging\n\n### 👨‍💻 Development\n\n- **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - Architecture, API reference, and contributing\n- **[Template Development](docs/TEMPLATE_DEVELOPMENT.md)** - Customizing Jinja2 templates and creating new output formats\n- **[Testing Guide](docs/TESTING.md)** - Test suite documentation\n- **[Migration Guide](docs/MIGRATION_GUIDE.md)** - Production migration from legacy system\n\n### 🔍 Development Tools\n\n- **Template Audit Script** - `python scripts/audit_templates.py` - Comprehensive audit of all Jinja2 templates to verify field accesses match context builders, preventing runtime errors\n\n---\n\n## 💻 Installation\n\n### Using UV (Recommended)\n\n```bash\n# Install UV\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Install dependencies\nuv sync\n\n# Run the tool\nuv run lf-releng-project-reporting generate --project my-project --repos-path ./repos\n```\n\n### Using pip\n\n```bash\n# Install from source\npip install .\n\n# Run the tool\n# Note: repos-path should match the directory created by gerrit-clone-action\n# which defaults to the Gerrit server hostname (e.g., ./gerrit.o-ran-sc.org)\nlf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org\n```\n\n**→ [Detailed Setup Instructions](SETUP.md)**\n\n---\n\n## 🎯 Common Use Cases\n\n| Use Case                    | Command                                                                                                          |\n| --------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| **Basic report (O-RAN-SC)** | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org`                     |\n| **Basic report (ONAP)**     | `lf-releng-project-reporting generate --project ONAP --repos-path ./gerrit.onap.org`                             |\n| **With caching**            | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --cache --workers 8` |\n| **Check config**            | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --dry-run`           |\n| **Get help**                | `lf-releng-project-reporting --help`                                                                             |\n\n\u003e **Note:** The `--repos-path` should point to the directory created by `gerrit-clone-action`, which uses the Gerrit server hostname as the directory name (e.g., `./gerrit.o-ran-sc.org` for O-RAN-SC, `./gerrit.onap.org` for ONAP).\n\n---\n\n## 📊 Output Formats\n\n```text\nreports/\n  \u003cPROJECT\u003e/\n    ├── report_raw.json              # Complete dataset (canonical)\n    ├── report.md                    # Markdown report (readable)\n    ├── report.html                  # Interactive HTML (sortable tables)\n    ├── config_resolved.json         # Applied configuration\n    └── \u003cPROJECT\u003e_report_bundle.zip  # Complete bundle\n```\n\n---\n\n## 🔌 CI/CD Integration\n\n### GitHub Actions\n\n```yaml\n- name: Generate Report\n  run: |\n    uv run lf-releng-project-reporting generate \\\n      --project \"${{ matrix.project }}\" \\\n      --repos-path \"./${{ matrix.server }}\" \\\n      --cache \\\n      --quiet\n  env:\n    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n```\n\n---\n\n## 🔧 Requirements\n\n- **Python**: 3.10+ (supports 3.10, 3.11, 3.12, 3.13)\n- **Dependencies**: PyYAML, httpx, Jinja2, typer, rich\n- **Optional**: GitHub token for API features (required for workflow status colors)\n\n### GitHub Token Requirements\n\nFor full workflow status reporting (colored status indicators), you need a GitHub Personal Access Token (Classic) with these permissions:\n\n**Required Scopes:**\n\n- ☑ `repo` - Full repository access (or `public_repo` for public repositories)\n- ☑ `actions:read` - Read GitHub Actions workflow runs and status\n\n**Note:** Fine-grained tokens are not supported as they cannot span organizations.\n\n**Setup:**\n\n```bash\n# Set environment variable\nexport GITHUB_TOKEN=ghp_your_token_here\n# OR for CI/production:\nexport CLASSIC_READ_ONLY_PAT_TOKEN=ghp_your_token_here\n\n# Then run the tool\nlf-releng-project-reporting generate --project my-project --repos-path ./repos\n```\n\n**Create token:** \u003chttps://github.com/settings/tokens\u003e\n\n**Without a token:** The tool detects workflows but shows them as grey (unknown status) instead of colored status indicators.\n\n**See also:** [Configuration Guide](docs/CONFIGURATION.md#github-api-integration) for detailed token setup\n\n### Jenkins Authentication (Optional)\n\nSome Jenkins servers require authentication to view job information. If you encounter a \"returned 0 jobs\" error, you need to provide Jenkins credentials.\n\n**Setup:**\n\n```bash\n# Generate API token in Jenkins: User → Configure → API Token → Add new Token\nexport JENKINS_USER=\"your-username\"\nexport JENKINS_API_TOKEN=\"your-api-token\"\n\n# Then run the tool\nlf-releng-project-reporting generate --project my-project --repos-path ./repos\n```\n\n**Create token:** Log into your Jenkins instance → Your Username → Configure → API Token\n\n**Without credentials:** The tool will fail with an error if Jenkins requires authentication.\n\n**See also:** [Troubleshooting Guide](docs/TROUBLESHOOTING.md#jenkins-authentication) for detailed setup\n\n---\n\n## 📖 Key Documentation Files\n\n| Topic               | Document                                               |\n| ------------------- | ------------------------------------------------------ |\n| **Getting Started** | [docs/GETTING_STARTED.md](docs/GETTING_STARTED.md)     |\n| **Commands**        | [docs/COMMANDS.md](docs/COMMANDS.md)                   |\n| **FAQ**             | [docs/FAQ.md](docs/FAQ.md)                             |\n| **Configuration**   | [docs/CONFIGURATION.md](docs/CONFIGURATION.md)         |\n| **Usage Examples**  | [docs/USAGE_EXAMPLES.md](docs/USAGE_EXAMPLES.md)       |\n| **Performance**     | [docs/PERFORMANCE.md](docs/PERFORMANCE.md)             |\n| **Troubleshooting** | [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)     |\n| **CI/CD Setup**     | [docs/CI_CD_INTEGRATION.md](docs/CI_CD_INTEGRATION.md) |\n| **Developer Guide** | [docs/DEVELOPER_GUIDE.md](docs/DEVELOPER_GUIDE.md)     |\n\n---\n\n## 💡 Quick Tips\n\n- 🎯 **First time?** Start with [Getting Started Guide](docs/GETTING_STARTED.md)\n- ⚡ **Slow?** Add `--cache --workers 8` for parallel processing\n- 🐛 **Issues?** Check [Troubleshooting Guide](docs/TROUBLESHOOTING.md)\n- ❓ **Questions?** See [FAQ](docs/FAQ.md)\n- 📖 **Need help?** Run `lf-releng-project-reporting --help`\n- 🔍 **Developing templates?** Run `python scripts/audit_templates.py` to verify all field accesses\n\n---\n\n## 🛠️ Development Scripts\n\n### Template Audit Script\n\n```bash\npython scripts/audit_templates.py\n```\n\nThis script performs a comprehensive audit of all Jinja2 templates to:\n\n- Extract all field accesses from templates (e.g., `repo.field`, `org.field`)\n- Analyze context builders to see what fields they provide\n- Identify mismatches that could cause \"Undefined variable\" errors at runtime\n\n**When to use:**\n\n- Before committing template changes\n- After modifying context builders\n- When debugging template rendering errors\n- During code review to verify template correctness\n\n**Output:**\n\n- ✅ **Green checkmarks** - All required fields present\n- ⚠️ **Warnings** - Extra fields exist (safe, unused)\n- ❌ **Red errors** - Missing fields that will cause runtime failures\n\n**Example output:**\n\n```text\n================================================================================\nTEMPLATE FIELD ACCESS AUDIT\n================================================================================\n\n📄 html/sections/summary.html.j2\n  summary:\n    - active_count\n    - current_count\n    - repositories_analyzed\n\n✅ No critical issues found!\n   Extra fields are safe - they're unused.\n```\n\n---\n\n## 🤝 Support\n\n- **Documentation**: [Complete Index](docs/INDEX.md)\n- **Issues**: [GitHub Issues](https://github.com/lfreleng-actions/project-reporting-tool/issues)\n\n---\n\n## 📜 License\n\nApache-2.0 License - Copyright 2025 The Linux Foundation\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flfreleng-actions%2Fproject-reporting-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flfreleng-actions%2Fproject-reporting-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flfreleng-actions%2Fproject-reporting-tool/lists"}