<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG">alpha-delta-context</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=.claude"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .claude</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=.forgejo"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .forgejo</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=build-history"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> build-history</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=components"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> components</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=docs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=infra"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> infra</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=justfiles"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> justfiles</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=project"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> project</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=qdrant"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> qdrant</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=reference"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> reference</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=runbooks"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> runbooks</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=scripts"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=scripts%2Fdeploy"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> deploy</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=scripts%2Ffrontend"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> frontend</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Ffrontend%2FREADME.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0 active" style="padding-left:48px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Ffrontend%2Fcoverage-check.sh"><i class="fa-solid fa-file" style="color:#888;"></i> coverage-check.sh</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Ffrontend%2Fgenerate-all-tests.sh"><i class="fa-solid fa-file" style="color:#888;"></i> generate-all-tests.sh</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Ffrontend%2Fgenerate-tests.sh"><i class="fa-solid fa-file" style="color:#888;"></i> generate-tests.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fcheckout-deps.sh"><i class="fa-solid fa-file" style="color:#888;"></i> checkout-deps.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fci-report-generator.py"><i class="fa-solid fa-file" style="color:#888;"></i> ci-report-generator.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fci-status.sh"><i class="fa-solid fa-file" style="color:#888;"></i> ci-status.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fclaude-workflow-runner.py"><i class="fa-solid fa-file" style="color:#888;"></i> claude-workflow-runner.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fclaude-workflows.cron"><i class="fa-solid fa-file" style="color:#888;"></i> claude-workflows.cron</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fcommit-ci-updates.sh"><i class="fa-solid fa-file" style="color:#888;"></i> commit-ci-updates.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fdeploy-ci-templates.sh"><i class="fa-solid fa-file" style="color:#888;"></i> deploy-ci-templates.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fdeploy-full-node.sh"><i class="fa-solid fa-file" style="color:#888;"></i> deploy-full-node.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fdeploy-radicle-systemd.sh"><i class="fa-solid fa-file" style="color:#888;"></i> deploy-radicle-systemd.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fgenerate-tests.py"><i class="fa-solid fa-file" style="color:#888;"></i> generate-tests.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Finstall-ci-tools.sh"><i class="fa-solid fa-file" style="color:#888;"></i> install-ci-tools.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fpull-all.sh"><i class="fa-solid fa-file" style="color:#888;"></i> pull-all.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Frunner-health-json.sh"><i class="fa-solid fa-file" style="color:#888;"></i> runner-health-json.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fsetup-workflow-hooks.sh"><i class="fa-solid fa-file" style="color:#888;"></i> setup-workflow-hooks.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fsetup_radicle_sync.py"><i class="fa-solid fa-file" style="color:#888;"></i> setup_radicle_sync.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fupdate-license-headers.py"><i class="fa-solid fa-file" style="color:#888;"></i> update-license-headers.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fworkflow-grammar.yaml"><i class="fa-solid fa-file" style="color:#888;"></i> workflow-grammar.yaml</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=scripts%2Fworkflows.yaml"><i class="fa-solid fa-file" style="color:#888;"></i> workflows.yaml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=sessions"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> sessions</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=testnet-validation"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> testnet-validation</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=tooling"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tooling</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=tools"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tools</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=.mcp.json"><i class="fa-solid fa-file" style="color:#888;"></i> .mcp.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=AGENTS.cspec"><i class="fa-solid fa-file" style="color:#888;"></i> AGENTS.cspec</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=CLAUDE-FRONTEND.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE-FRONTEND.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=CLAUDE-QUICK.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE-QUICK.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=CLAUDE.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=FINAL-STATUS-2026-01-21.md"><i class="fa-solid fa-file" style="color:#888;"></i> FINAL-STATUS-2026-01-21.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=PROPOSAL-CACHE-FIXES-COMPLETE.md"><i class="fa-solid fa-file" style="color:#888;"></i> PROPOSAL-CACHE-FIXES-COMPLETE.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=SECTION-12-COMPLETE-2026-01-22.md"><i class="fa-solid fa-file" style="color:#888;"></i> SECTION-12-COMPLETE-2026-01-22.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=TESTNET-ISSUES-2026-01-22.md"><i class="fa-solid fa-file" style="color:#888;"></i> TESTNET-ISSUES-2026-01-22.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=cd"><i class="fa-solid fa-file" style="color:#888;"></i> cd</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=fresh-restart-with-logging.sh"><i class="fa-solid fa-file" style="color:#888;"></i> fresh-restart-with-logging.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=governance-test-proposal.json"><i class="fa-solid fa-file" style="color:#888;"></i> governance-test-proposal.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=setup-testnet-ssh.sh"><i class="fa-solid fa-file" style="color:#888;"></i> setup-testnet-ssh.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=ssh-fix.sh"><i class="fa-solid fa-file" style="color:#888;"></i> ssh-fix.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=startci.sh"><i class="fa-solid fa-file" style="color:#888;"></i> startci.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=startme.sh"><i class="fa-solid fa-file" style="color:#888;"></i> startme.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-cleanup-script.sh"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-cleanup-script.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-deployment-plan.cspec"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-deployment-plan.cspec</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-deployment-requirements.cspec"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-deployment-requirements.cspec</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-deployment-status-2026-01-21.md"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-deployment-status-2026-01-21.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-e2e-test-report-2026-01-21.md"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-e2e-test-report-2026-01-21.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-fresh-deploy.sh"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-fresh-deploy.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-production-deployment.plan"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-production-deployment.plan</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-ssh-fixed.md"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-ssh-fixed.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&file=testnet-swap-status.md"><i class="fa-solid fa-file" style="color:#888;"></i> testnet-swap-status.md</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=.">/</a> <a href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=scripts">scripts</a> / <a href="/cgi-bin/repo?id=z3XCPA2jQz5Fhh6LnYKxHMCAyoAMG&source=scripts%2Ffrontend">frontend</a> / coverage-check.sh</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> coverage-check.sh</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;"> 1</span>  #!/bin/bash
<span style="color:#666; user-select:none;"> 2</span>  # Check coverage for a frontend repository
<span style="color:#666; user-select:none;"> 3</span>  # Usage: ./coverage-check.sh &lt;repo_path&gt; [threshold]
<span style="color:#666; user-select:none;"> 4</span>  #
<span style="color:#666; user-select:none;"> 5</span>  # Example: ./coverage-check.sh /path/to/wallet-core 80
<span style="color:#666; user-select:none;"> 6</span>  
<span style="color:#666; user-select:none;"> 7</span>  set -e
<span style="color:#666; user-select:none;"> 8</span>  
<span style="color:#666; user-select:none;"> 9</span>  REPO_PATH=$1
<span style="color:#666; user-select:none;">10</span>  THRESHOLD=${2:-80}
<span style="color:#666; user-select:none;">11</span>  
<span style="color:#666; user-select:none;">12</span>  if [ -z &quot;$REPO_PATH&quot; ] || [ ! -d &quot;$REPO_PATH&quot; ]; then
<span style="color:#666; user-select:none;">13</span>      echo &quot;Usage: $0 &lt;repo_path&gt; [threshold]&quot;
<span style="color:#666; user-select:none;">14</span>      echo &quot;Example: $0 /path/to/wallet-core 80&quot;
<span style="color:#666; user-select:none;">15</span>      exit 1
<span style="color:#666; user-select:none;">16</span>  fi
<span style="color:#666; user-select:none;">17</span>  
<span style="color:#666; user-select:none;">18</span>  cd &quot;$REPO_PATH&quot;
<span style="color:#666; user-select:none;">19</span>  
<span style="color:#666; user-select:none;">20</span>  echo &quot;Checking coverage for: $REPO_PATH&quot;
<span style="color:#666; user-select:none;">21</span>  echo &quot;Threshold: $THRESHOLD%&quot;
<span style="color:#666; user-select:none;">22</span>  
<span style="color:#666; user-select:none;">23</span>  # Detect project type
<span style="color:#666; user-select:none;">24</span>  if [ -f &quot;Cargo.toml&quot; ]; then
<span style="color:#666; user-select:none;">25</span>      echo &quot;Detected: Rust project&quot;
<span style="color:#666; user-select:none;">26</span>      TOOL=&quot;tarpaulin&quot;
<span style="color:#666; user-select:none;">27</span>  
<span style="color:#666; user-select:none;">28</span>      # Run tarpaulin
<span style="color:#666; user-select:none;">29</span>      cargo tarpaulin --all-features --workspace \
<span style="color:#666; user-select:none;">30</span>          --out json \
<span style="color:#666; user-select:none;">31</span>          --output-dir coverage \
<span style="color:#666; user-select:none;">32</span>          --fail-under &quot;$THRESHOLD&quot;
<span style="color:#666; user-select:none;">33</span>  
<span style="color:#666; user-select:none;">34</span>      COVERAGE=$(cat coverage/tarpaulin-report.json | jq &#x27;.coverage_percentage&#x27;)
<span style="color:#666; user-select:none;">35</span>  
<span style="color:#666; user-select:none;">36</span>  elif [ -f &quot;package.json&quot; ]; then
<span style="color:#666; user-select:none;">37</span>      echo &quot;Detected: Node.js project&quot;
<span style="color:#666; user-select:none;">38</span>  
<span style="color:#666; user-select:none;">39</span>      # Check for vitest or jest
<span style="color:#666; user-select:none;">40</span>      if grep -q &quot;vitest&quot; package.json; then
<span style="color:#666; user-select:none;">41</span>          TOOL=&quot;vitest&quot;
<span style="color:#666; user-select:none;">42</span>          yarn test --coverage --reporter=json
<span style="color:#666; user-select:none;">43</span>      else
<span style="color:#666; user-select:none;">44</span>          TOOL=&quot;jest&quot;
<span style="color:#666; user-select:none;">45</span>          yarn test --coverage --coverageReporters=json
<span style="color:#666; user-select:none;">46</span>      fi
<span style="color:#666; user-select:none;">47</span>  
<span style="color:#666; user-select:none;">48</span>      COVERAGE=$(cat coverage/coverage-summary.json | jq &#x27;.total.lines.pct&#x27;)
<span style="color:#666; user-select:none;">49</span>  
<span style="color:#666; user-select:none;">50</span>  elif [ -f &quot;program.json&quot; ]; then
<span style="color:#666; user-select:none;">51</span>      echo &quot;Detected: Leo contract&quot;
<span style="color:#666; user-select:none;">52</span>      TOOL=&quot;leo&quot;
<span style="color:#666; user-select:none;">53</span>  
<span style="color:#666; user-select:none;">54</span>      # Leo doesn&#x27;t have built-in coverage, check test count
<span style="color:#666; user-select:none;">55</span>      leo test
<span style="color:#666; user-select:none;">56</span>      COVERAGE=100  # Assume 100% if tests pass
<span style="color:#666; user-select:none;">57</span>  
<span style="color:#666; user-select:none;">58</span>  else
<span style="color:#666; user-select:none;">59</span>      echo &quot;ERROR: Unknown project type&quot;
<span style="color:#666; user-select:none;">60</span>      exit 1
<span style="color:#666; user-select:none;">61</span>  fi
<span style="color:#666; user-select:none;">62</span>  
<span style="color:#666; user-select:none;">63</span>  echo &quot;&quot;
<span style="color:#666; user-select:none;">64</span>  echo &quot;=== Coverage Report ===&quot;
<span style="color:#666; user-select:none;">65</span>  echo &quot;Tool: $TOOL&quot;
<span style="color:#666; user-select:none;">66</span>  echo &quot;Coverage: $COVERAGE%&quot;
<span style="color:#666; user-select:none;">67</span>  echo &quot;Threshold: $THRESHOLD%&quot;
<span style="color:#666; user-select:none;">68</span>  
<span style="color:#666; user-select:none;">69</span>  # Check against threshold
<span style="color:#666; user-select:none;">70</span>  if (( $(echo &quot;$COVERAGE &lt; $THRESHOLD&quot; | bc -l) )); then
<span style="color:#666; user-select:none;">71</span>      echo &quot;&quot;
<span style="color:#666; user-select:none;">72</span>      echo &quot;FAIL: Coverage $COVERAGE% is below threshold $THRESHOLD%&quot;
<span style="color:#666; user-select:none;">73</span>      exit 1
<span style="color:#666; user-select:none;">74</span>  else
<span style="color:#666; user-select:none;">75</span>      echo &quot;&quot;
<span style="color:#666; user-select:none;">76</span>      echo &quot;PASS: Coverage $COVERAGE% meets threshold $THRESHOLD%&quot;
<span style="color:#666; user-select:none;">77</span>      exit 0
<span style="color:#666; user-select:none;">78</span>  fi
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

