gitopsy / {{ report.project_name }}

Generated {{ report.generated_at[:19].replace('T', ' ') }} UTC {% if report.git_commit %} · commit {{ report.git_commit }}{% endif %}
{% if report.tech_debt %}
{{ report.tech_debt.grade }}
{% endif %} {% if report.architecture %}
{{ report.architecture.total_files }} files
{{ '{:,}'.format(report.architecture.total_lines) }} lines
{% if report.architecture.framework %}
{{ report.architecture.framework }}
{% endif %} {% endif %}
{% set dash = score_dashboard %} {% if dash and dash.scores %}
{{ dash.overall_grade }}
Overall
Health
{% for key, info in dash.scores.items() %}
{{ info.grade }}
{{ info.label }}
{% endfor %}
{% endif %}
{% if report.architecture %} {% set arch = report.architecture %}
Project Type
{{ arch.project_type }} {% if arch.framework %} {{ arch.framework }} {% endif %}
Structure Pattern
{{ arch.structure_pattern }}
Codebase Size
{{ arch.total_files }}
files · {{ '{:,}'.format(arch.total_lines) }} lines
Language Breakdown
{% for lang, pct in arch.language_breakdown.items() | sort(attribute='1', reverse=True) %}
{{ lang }} {{ "%.1f"|format(pct) }}%
{% endfor %} {% if not arch.language_breakdown %}

No language data available.

{% endif %}
{% if arch.entry_points %}
Entry Points
{% for ep in arch.entry_points %} {% endfor %}
FileType
{{ ep.path }} {{ ep.entry_type }}
{% endif %} {% if arch.key_files %}
Key Files
{% for kf in arch.key_files %} {% endfor %}
FileRoleImportance
{{ kf.path }} {{ kf.role }}
{{ kf.importance_score }}
{% endif %} {% if arch.layers %}
Detected Layers
{% for layer in arch.layers %}
{{ layer.name }} {{ layer.purpose }} · {{ layer.files | length }} files
    {% for f in layer.files %}
  • {{ f }}
  • {% endfor %}
{% endfor %}
{% endif %} {% if arch.internal_deps %}
Internal Dependencies
{% for dep in arch.internal_deps[:30] %} {% endfor %} {% if arch.internal_deps | length > 30 %} {% endif %}
FromImports
{{ dep.from_module }} {{ dep.to_module }}
… and {{ (arch.internal_deps | length) - 30 }} more
{% endif %} {% else %}

Architecture analysis not available.

{% endif %}
{% if report.tech_debt %} {% set debt = report.tech_debt %}
{{ debt.grade }}
{{ debt.overall_score }}/100
Overall Tech Debt Score — lower is better
Dimension Scores
{% for key, dim in debt.dimensions.items() %}
{{ key.replace('_', ' ').title() }} {{ dim.score }}
{% endfor %}
Dimension Details
{% for key, dim in debt.dimensions.items() %} {% endfor %}
DimensionScoreWeightDetail
{{ key.replace('_', ' ').title() }} {{ dim.score }} {{ "%.0f"|format(dim.weight * 100) }}% {{ dim.detail }}
{% if debt.hotspots %}
Hotspots
{% for hs in debt.hotspots %} {% endfor %}
FileScoreReasons
{{ hs.path }} {{ hs.score }} {% for r in hs.reasons %}{{ r }}{% if not loop.last %} · {% endif %}{% endfor %}
{% endif %} {% if debt.recommendations %}
Recommendations
    {% for rec in debt.recommendations %}
  • {{ rec }}
  • {% endfor %}
{% endif %} {% else %}

Tech debt analysis not available.

{% endif %}
{% if report.onboarding %} {% set ob = report.onboarding %}
What Is This Project?

{{ ob.project_summary }}

{% if ob.architecture_overview %}
Architecture Overview

{{ ob.architecture_overview }}

{% endif %}
{% if ob.key_files %}
Key Files to Read First
{% for kf in ob.key_files[:10] %} {% endfor %}
#FileRole
{{ loop.index }} {{ kf.path }} {{ kf.role }}
{% endif %}
How to Run Locally
{% if ob.setup_steps %}
    {% for step in ob.setup_steps %}
  1. {{ step.description }}
    {% if step.command %}
    {{ step.command }}
    {% endif %}
  2. {% endfor %}
{% else %}

No setup steps detected. Check the README manually.

{% endif %}
{% if ob.test_commands %}
How to Run Tests
{% for cmd in ob.test_commands %}
{{ cmd }}
{% endfor %}
{% endif %} {% if ob.top_contributors %}
Who to Ask
{% for c in ob.top_contributors %} {% endfor %}
NameEmailRecent Commits
{{ c.name }} {{ c.email }} {{ c.recent_commits }}
{% endif %} {% if ob.gotchas %}
Gotchas
    {% for gotcha in ob.gotchas %}
  • {{ gotcha }}
  • {% endfor %}
{% endif %} {% if ob.glossary %}
Project Terms
{% for term, value in ob.glossary.items() %} {% endfor %}
TermValue
{{ term }} {{ value }}
{% endif %} {% else %}

Onboarding guide not available.

{% endif %}
{% if report.dependencies %} {% set deps = report.dependencies %}
Package Manager
{{ deps.package_manager }}
Total Dependencies
{{ deps.total_deps }}
{{ deps.outdated_count }} outdated
Risk Score
{{ deps.risk_score }}/100
{% if deps.license_conflicts %}
License Conflicts
    {% for conflict in deps.license_conflicts %}
  • ! {{ conflict }}
  • {% endfor %}
{% endif %}
All Dependencies
{% for dep in deps.deps %} {% endfor %}
NameVersionLatestLicenseStatus
{{ dep.name }} {{ dep.current_version }} {{ dep.latest_version or '—' }} {{ dep.license or '—' }} {% if dep.status == 'ok' %}up-to-date {% elif dep.status == 'outdated' %}outdated {% else %}unknown{% endif %}
{% else %}

Dependency analysis not available.

{% endif %}
{% if report.conventions %} {% set conv = report.conventions %}
{{ conv.consistency_score }}/100
Consistency Score
Import Style
{{ conv.import_style }}
Error Handling
{{ conv.error_handling }}
Test Pattern
{{ conv.test_pattern }}
Naming Conventions
Detected Naming Patterns
CategoryConvention
Variables{% if conv.naming.variables %}{{ conv.naming.variables }}{% else %}{% endif %}
Functions{% if conv.naming.functions %}{{ conv.naming.functions }}{% else %}{% endif %}
Classes{% if conv.naming.classes %}{{ conv.naming.classes }}{% else %}{% endif %}
Files{% if conv.naming.files %}{{ conv.naming.files }}{% else %}{% endif %}
Formatting Rules
Detected Formatting
RuleValue
Indent Style{% if conv.formatting.indent_style %}{{ conv.formatting.indent_style }}{% else %}{% endif %}
Indent Width{% if conv.formatting.indent_width %}{{ conv.formatting.indent_width }}{% else %}{% endif %}
Quotes{% if conv.formatting.quotes %}{{ conv.formatting.quotes }}{% else %}{% endif %}
Semicolons{% if conv.formatting.semicolons is not none %}{{ conv.formatting.semicolons }}{% else %}{% endif %}
Git Conventions
Commit Format
{% if conv.git_conventions.commit_format %}{{ conv.git_conventions.commit_format }}{% else %}Not detected{% endif %}
{% if conv.linter_config %}
Linter Config
{{ conv.linter_config }}
{% endif %}
{% else %}

Convention analysis not available.

{% endif %}
{% if report.api %} {% set api = report.api %}
API Type
{{ api.api_type }}
Total Routes
{{ api.total_routes }}
{{ api.undocumented_routes }} undocumented
{% if api.endpoints %}
HTTP Endpoints
{% for ep in api.endpoints %} {% endfor %}
MethodPathHandler
{{ ep.method }} {{ ep.path }} {{ ep.handler_file }}
{% endif %} {% if api.cli_commands %}
CLI Commands
{% for cmd in api.cli_commands %} {% endfor %}
CommandDescriptionHandler
{{ cmd.name }} {{ cmd.description or '—' }} {{ cmd.handler_file }}
{% endif %} {% else %}

API analysis not available.

{% endif %}
{% if report.security %} {% set sec = report.security %}
{% if sec.risk_level == 'critical' %}⚠{% elif sec.risk_level == 'high' %}⚠{% elif sec.risk_level == 'medium' %}ℹ{% else %}✓{% endif %} Risk Level: {{ sec.risk_level | upper }} {% if sec.secrets_found > 0 %} · {{ sec.secrets_found }} secret(s) found{% endif %}
Auth Pattern
{% if sec.auth_pattern %}{{ sec.auth_pattern }}{% else %}None detected{% endif %}
{% if sec.exposed_ports %}
Exposed Ports
{% for port in sec.exposed_ports %}{{ port }}{% endfor %}
{% endif %}
Findings
{{ sec.findings | length }}
{% if sec.findings %}
Security Findings
{% for finding in sec.findings %} {% endfor %}
SeverityCategoryFileLineDescription
{{ finding.severity }} {{ finding.category }} {{ finding.file }} {{ finding.line or '—' }} {{ finding.description }}
{% else %}

✓ No security findings detected.

{% endif %} {% if sec.recommendations %}
Recommendations
    {% for rec in sec.recommendations %}
  • {{ rec }}
  • {% endfor %}
{% endif %} {% else %}

Security analysis not available.

{% endif %}
{% if report.setup %} {% set setup = report.setup %} {% if setup.prerequisites %}
Prerequisites
    {% for prereq in setup.prerequisites %}
  • {{ prereq.name }} {% if prereq.version %}{{ prereq.version }}{% endif %} {% if prereq.install_url %}{{ prereq.install_url }}{% endif %}
  • {% endfor %}
{% endif %} {% if setup.install_steps %}
Installation
    {% for step in setup.install_steps %}
  1. {{ step.description }}
    {% if step.command %}
    {{ step.command }}
    {% endif %}
  2. {% endfor %}
{% endif %} {% if setup.env_vars %}
Environment Variables
{% for ev in setup.env_vars %} {% endfor %}
NameRequiredDescriptionExample
{{ ev.name }} {% if ev.required %}required{% else %}optional{% endif %} {{ ev.description or '—' }} {{ ev.example or '—' }}
{% endif %} {% if setup.run_commands %}
Run Commands
{% for label, cmd in setup.run_commands.items() %}
{{ label }}
{{ cmd }}
{% endfor %}
{% endif %} {% if setup.test_command %}
Test Command
{{ setup.test_command }}
{% endif %} {% if setup.build_command %}
Build Command
{{ setup.build_command }}
{% endif %} {% if setup.database_setup %}
Database Setup
    {% for step in setup.database_setup %}
  1. {{ step.description }}
    {% if step.command %}
    {{ step.command }}
    {% endif %}
  2. {% endfor %}
{% endif %} {% if setup.common_issues %}
Common Issues
{% for issue in setup.common_issues %}
{{ issue.description }}
{{ issue.solution }}
{% endfor %}
{% endif %} {% else %}

Setup guide not available.

{% endif %}