{
  "repository": "fatedier/frp",
  "ref": "0368148cc3de0837abaf84c6b9af501d7fe505c6",
  "methods": [
    {
      "slug": "formal",
      "title": "Formal verification and model checking"
    },
    {
      "slug": "static_analysis",
      "title": "Static analysis"
    },
    {
      "slug": "testing",
      "title": "Testing"
    },
    {
      "slug": "formatting",
      "title": "Formatting and hygiene"
    },
    {
      "slug": "supply_chain",
      "title": "Supply chain"
    },
    {
      "slug": "unclassified",
      "title": "Unclassified"
    }
  ],
  "verifications": [
    {
      "tool": "go-vet",
      "method": "static_analysis",
      "commands": [
        "go vet -tags $(NOWEB_TAG) ./..."
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "Makefile",
          "locator": "target vet (line 37)"
        }
      ],
      "upstream": "https://github.com/golang/go",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "golangci-lint",
      "method": "static_analysis",
      "commands": [
        "uses golangci/golangci-lint-action"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/golangci-lint.yml",
          "locator": "jobs.golangci.steps[4] (golangci-lint)"
        },
        {
          "path": ".golangci.yml",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/golangci/golangci-lint",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "eslint",
      "method": "static_analysis",
      "commands": [],
      "triggers": [],
      "evidence": [
        {
          "path": "web/frpc/eslint.config.js",
          "locator": "config file"
        },
        {
          "path": "web/frps/eslint.config.js",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/eslint/eslint",
      "docs": "https://eslint.org/docs/latest/use/command-line-interface#exit-codes",
      "exit_codes": {
        "0": "no errors",
        "1": "linting errors found",
        "2": "configuration problem or internal error"
      },
      "autofix": true,
      "declared_only": true
    },
    {
      "tool": "go-test",
      "method": "testing",
      "commands": [
        "go test -tags $(NOWEB_TAG) -v --cover ./assets/...",
        "go test -tags $(NOWEB_TAG) -v --cover ./cmd/...",
        "go test -tags $(NOWEB_TAG) -v --cover ./client/...",
        "go test -tags $(NOWEB_TAG) -v --cover ./server/...",
        "go test -tags $(NOWEB_TAG) -v --cover ./pkg/..."
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "Makefile",
          "locator": "target gotest (line 48)"
        }
      ],
      "upstream": "https://github.com/golang/go",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "vitest",
      "method": "testing",
      "commands": [
        "vitest run",
        "vitest"
      ],
      "triggers": [
        "ci",
        "local"
      ],
      "evidence": [
        {
          "path": ".github/workflows/golangci-lint.yml",
          "locator": "jobs.golangci.steps[3] (Test and build web assets)"
        },
        {
          "path": "Makefile",
          "locator": "target web-ci (line 19)"
        },
        {
          "path": "web/package.json",
          "locator": "scripts.test:unit"
        },
        {
          "path": "web/package.json",
          "locator": "scripts.test:unit:watch"
        },
        {
          "path": "web/package.json",
          "locator": "devDependencies: vitest"
        },
        {
          "path": "web/vitest.config.mts",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/vitest-dev/vitest",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "gofmt",
      "method": "formatting",
      "commands": [
        "go fmt ./...",
        "gofumpt -l -w ."
      ],
      "triggers": [
        "local"
      ],
      "evidence": [
        {
          "path": "Makefile",
          "locator": "target fmt (line 28)"
        },
        {
          "path": "Makefile",
          "locator": "target fmt-more (line 31)"
        }
      ],
      "upstream": "https://github.com/golang/go",
      "docs": null,
      "exit_codes": {},
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "prettier",
      "method": "formatting",
      "commands": [],
      "triggers": [],
      "evidence": [
        {
          "path": "web/frpc/.prettierrc.json",
          "locator": "config file"
        },
        {
          "path": "web/frps/.prettierrc.json",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/prettier/prettier",
      "docs": "https://prettier.io/docs/cli#exit-codes",
      "exit_codes": {
        "0": "everything formatted",
        "1": "something was not formatted (--check)",
        "2": "prettier error"
      },
      "autofix": true,
      "declared_only": true
    }
  ]
}
