{"id":51043662,"url":"https://github.com/axeforging/structlint","last_synced_at":"2026-06-22T12:02:06.902Z","repository":{"id":342891596,"uuid":"1144538199","full_name":"AxeForging/structlint","owner":"AxeForging","description":"CLI tool for validating and enforcing directory structure and file naming patterns","archived":false,"fork":false,"pushed_at":"2026-05-17T11:33:48.000Z","size":4708,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T20:09:29.384Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AxeForging.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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":"2026-01-28T19:22:31.000Z","updated_at":"2026-05-17T11:33:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AxeForging/structlint","commit_stats":null,"previous_names":["axeforging/structlint"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/AxeForging/structlint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fstructlint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fstructlint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fstructlint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fstructlint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AxeForging","download_url":"https://codeload.github.com/AxeForging/structlint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxeForging%2Fstructlint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34647750,"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-06-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T12:02:03.480Z","updated_at":"2026-06-22T12:02:06.896Z","avatar_url":"https://github.com/AxeForging.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"doc/banner.png\" alt=\"structlint\" width=\"400\"\u003e\n\u003c/div\u003e\n\n# structlint\n\nA CLI tool for validating and enforcing directory structure and file naming patterns in your projects.\n\n## Installation\n\n```bash\ngo install github.com/AxeForging/structlint@latest\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eOther Installation Methods\u003c/strong\u003e\u003c/summary\u003e\n\n### From Binary\n\nDownload from [Releases](https://github.com/AxeForging/structlint/releases):\n\n```bash\n# Linux (amd64)\ncurl -LO https://github.com/AxeForging/structlint/releases/latest/download/structlint-linux-amd64.tar.gz\ntar -xzf structlint-linux-amd64.tar.gz\nsudo mv structlint /usr/local/bin/\n\n# macOS (Apple Silicon)\ncurl -LO https://github.com/AxeForging/structlint/releases/latest/download/structlint-darwin-arm64.tar.gz\ntar -xzf structlint-darwin-arm64.tar.gz\nsudo mv structlint /usr/local/bin/\n\n# Windows (PowerShell)\nInvoke-WebRequest -Uri \"https://github.com/AxeForging/structlint/releases/latest/download/structlint-windows-amd64.zip\" -OutFile structlint.zip\nExpand-Archive structlint.zip -DestinationPath .\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/AxeForging/structlint.git\ncd structlint\nmake build\n./bin/structlint version\n```\n\n\u003c/details\u003e\n\n## Quick Start\n\n```bash\n# Create config\ncat \u003e .structlint.yaml \u003c\u003c 'EOF'\ndir_structure:\n  allowedPaths: [\".\", \"cmd/**\", \"internal/**\", \"pkg/**\"]\n  disallowedPaths: [\"vendor/**\", \"tmp/**\"]\nfile_naming_pattern:\n  allowed: [\"*.go\", \"*.yaml\", \"*.md\", \"Makefile\"]\n  disallowed: [\"*.env*\", \"*.log\"]\nignore: [\".git\", \"vendor\", \"bin\"]\nEOF\n\n# Validate\nstructlint validate\n```\n\n**Output:**\n```\n--- Validation Summary ---\n✓ 42 files/directories passed validation\n✗ 0 violations found\n🎉 All files and directories comply with the rules!\n```\n\n## Why structlint?\n\n| Problem | Solution |\n|---------|----------|\n| Inconsistent project structure across team | Enforce allowed/disallowed paths |\n| Sensitive files committed (.env, keys) | Block forbidden file patterns |\n| Missing essential files (README, configs) | Require specific files |\n| Files drifting into the wrong layer | Enforce placement rules |\n| Packages missing local entrypoints/docs | Enforce required groups |\n| Cross-layer imports creeping in | Enforce Go, JS/TS, and Python boundaries |\n| AI tools placing files incorrectly | Clear structure rules for AI context |\n| CI/CD structural compliance | JSON/SARIF/GitHub reports + exit codes |\n\n## Configuration\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eComplete Configuration Reference\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .structlint.yaml\n\n# Directory structure rules\ndir_structure:\n  # Directories that ARE allowed (glob patterns)\n  allowedPaths:\n    - \".\"              # Root directory\n    - \"cmd/**\"         # cmd/ and all subdirectories\n    - \"internal/**\"    # internal/ and all subdirectories\n    - \"pkg/**\"         # pkg/ and all subdirectories\n    - \"test/**\"        # test/ and all subdirectories\n    - \"docs/**\"        # docs/ and all subdirectories\n\n  # Directories that are NOT allowed (violations if found)\n  disallowedPaths:\n    - \"vendor/**\"      # No vendor directory\n    - \"node_modules/**\"\n    - \"tmp/**\"\n    - \"temp/**\"\n\n  # Directories that MUST exist\n  requiredPaths:\n    - \"cmd\"            # Must have cmd/\n    - \"internal\"       # Must have internal/\n\n# File naming rules\nfile_naming_pattern:\n  # Files that ARE allowed (glob patterns)\n  allowed:\n    - \"*.go\"\n    - \"*.mod\"\n    - \"*.sum\"\n    - \"*.yaml\"\n    - \"*.yml\"\n    - \"*.json\"\n    - \"*.md\"\n    - \"*.txt\"\n    - \"Makefile\"\n    - \"Dockerfile*\"\n    - \".gitignore\"\n    - \".golangci.yml\"\n\n  # Files that are NOT allowed (violations if found)\n  disallowed:\n    - \"*.env*\"         # No .env files\n    - \"*.log\"          # No log files\n    - \"*.tmp\"\n    - \"*.bak\"\n    - \"*~\"             # No backup files\n    - \".DS_Store\"\n    - \"Thumbs.db\"\n\n  # Files that MUST exist\n  required:\n    - \"go.mod\"         # Must have go.mod\n    - \"README.md\"      # Must have README\n    - \"*.go\"           # At least one .go file\n\n# Paths to completely skip during validation\nignore:\n  - \".git\"\n  - \"vendor\"\n  - \"node_modules\"\n  - \"bin\"\n  - \"dist\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eOrganization Drift Rules\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\nplacement:\n  - id: migrations-only\n    files: [\"*.sql\"]\n    mustBeUnder: [\"migrations/**\"]\n\nrequiredGroups:\n  - id: build-entrypoint\n    oneOf: [\"Makefile\", \"Taskfile.yml\", \"justfile\"]\n  - id: commands-have-main\n    eachDirMatching: \"cmd/*\"\n    mustContain: [\"main.go\"]\n\nboundaries:\n  - id: domain-no-infrastructure\n    from: \"internal/domain/**\"\n    cannotImport: [\"internal/db/**\", \"internal/http/**\"]\n```\n\nBoundary rules are language-aware for Go, JavaScript, TypeScript, and Python imports. See [Configuration Reference](docs/user/configuration.md) and [CI/CD Integration](docs/user/ci-cd-integration.md).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGlob Pattern Syntax\u003c/strong\u003e\u003c/summary\u003e\n\n| Pattern | Matches | Example |\n|---------|---------|---------|\n| `*` | Any characters (not `/`) | `*.go` → `main.go`, `test.go` |\n| `**` | Any characters (including `/`) | `cmd/**` → `cmd/app/main.go` |\n| `?` | Single character | `test?.go` → `test1.go` |\n| `[abc]` | Any char in set | `[mt]est.go` → `test.go`, `mest.go` |\n| `[!abc]` | Any char NOT in set | `[!t]est.go` → `best.go` |\n| `{a,b}` | Either a or b | `*.{go,md}` → `main.go`, `README.md` |\n\n\u003c/details\u003e\n\n## Project Type Examples\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGo Project\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .structlint.yaml for Go projects\ndir_structure:\n  allowedPaths:\n    - \".\"\n    - \"cmd/**\"\n    - \"internal/**\"\n    - \"pkg/**\"\n    - \"api/**\"\n    - \"web/**\"\n    - \"configs/**\"\n    - \"scripts/**\"\n    - \"test/**\"\n    - \"docs/**\"\n    - \".github/**\"\n  disallowedPaths:\n    - \"vendor/**\"\n    - \"tmp/**\"\n  requiredPaths:\n    - \"cmd\"\n\nfile_naming_pattern:\n  allowed:\n    - \"*.go\"\n    - \"*.mod\"\n    - \"*.sum\"\n    - \"*.yaml\"\n    - \"*.yml\"\n    - \"*.json\"\n    - \"*.md\"\n    - \"*.sql\"\n    - \"*.sh\"\n    - \"Makefile\"\n    - \"Dockerfile*\"\n    - \".gitignore\"\n    - \".golangci.yml\"\n    - \".goreleaser.yaml\"\n    - \"go.work\"\n  disallowed:\n    - \"*.env*\"\n    - \"*.log\"\n    - \"*.tmp\"\n    - \".DS_Store\"\n  required:\n    - \"go.mod\"\n    - \"README.md\"\n\nignore:\n  - \".git\"\n  - \"vendor\"\n  - \"bin\"\n  - \"dist\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eNode.js / TypeScript Project\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .structlint.yaml for Node.js/TypeScript projects\ndir_structure:\n  allowedPaths:\n    - \".\"\n    - \"src/**\"\n    - \"tests/**\"\n    - \"lib/**\"\n    - \"config/**\"\n    - \"scripts/**\"\n    - \"public/**\"\n    - \".github/**\"\n  disallowedPaths:\n    - \"node_modules/**\"\n    - \"dist/**\"\n    - \"build/**\"\n    - \"coverage/**\"\n\nfile_naming_pattern:\n  allowed:\n    - \"*.ts\"\n    - \"*.tsx\"\n    - \"*.js\"\n    - \"*.jsx\"\n    - \"*.json\"\n    - \"*.yaml\"\n    - \"*.yml\"\n    - \"*.md\"\n    - \"*.css\"\n    - \"*.scss\"\n    - \"*.html\"\n    - \".gitignore\"\n    - \".eslintrc*\"\n    - \".prettierrc*\"\n    - \"tsconfig*.json\"\n    - \"jest.config.*\"\n    - \"vite.config.*\"\n    - \"Dockerfile*\"\n  disallowed:\n    - \"*.env*\"\n    - \"*.log\"\n    - \".DS_Store\"\n  required:\n    - \"package.json\"\n    - \"README.md\"\n\nignore:\n  - \"node_modules\"\n  - \"dist\"\n  - \".git\"\n  - \"coverage\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePython Project\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .structlint.yaml for Python projects\ndir_structure:\n  allowedPaths:\n    - \".\"\n    - \"src/**\"\n    - \"tests/**\"\n    - \"docs/**\"\n    - \"scripts/**\"\n    - \"config/**\"\n    - \".github/**\"\n  disallowedPaths:\n    - \"venv/**\"\n    - \".venv/**\"\n    - \"__pycache__/**\"\n    - \"*.egg-info/**\"\n    - \".pytest_cache/**\"\n    - \".mypy_cache/**\"\n\nfile_naming_pattern:\n  allowed:\n    - \"*.py\"\n    - \"*.pyi\"\n    - \"*.yaml\"\n    - \"*.yml\"\n    - \"*.json\"\n    - \"*.toml\"\n    - \"*.txt\"\n    - \"*.md\"\n    - \"*.ini\"\n    - \"*.cfg\"\n    - \"Makefile\"\n    - \"Dockerfile*\"\n    - \".gitignore\"\n    - \"pyproject.toml\"\n    - \"setup.py\"\n    - \"setup.cfg\"\n    - \"requirements*.txt\"\n  disallowed:\n    - \"*.env*\"\n    - \"*.log\"\n    - \"*.pyc\"\n    - \".DS_Store\"\n  required:\n    - \"README.md\"\n    - \"*.py\"\n\nignore:\n  - \"venv\"\n  - \".venv\"\n  - \"__pycache__\"\n  - \".git\"\n  - \".pytest_cache\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMonorepo\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .structlint.yaml for monorepos\ndir_structure:\n  allowedPaths:\n    - \".\"\n    - \"apps/**\"\n    - \"packages/**\"\n    - \"libs/**\"\n    - \"services/**\"\n    - \"tools/**\"\n    - \"scripts/**\"\n    - \"docs/**\"\n    - \"infra/**\"\n    - \".github/**\"\n  disallowedPaths:\n    - \"node_modules/**\"\n    - \"vendor/**\"\n    - \"dist/**\"\n    - \"build/**\"\n  requiredPaths:\n    - \"apps\"\n    - \"packages\"\n\nfile_naming_pattern:\n  allowed:\n    - \"*.go\"\n    - \"*.ts\"\n    - \"*.js\"\n    - \"*.json\"\n    - \"*.yaml\"\n    - \"*.yml\"\n    - \"*.md\"\n    - \"*.toml\"\n    - \"Makefile\"\n    - \"Dockerfile*\"\n    - \".gitignore\"\n    - \"go.work\"\n    - \"pnpm-workspace.yaml\"\n    - \"turbo.json\"\n  disallowed:\n    - \"*.env*\"\n    - \"*.log\"\n  required:\n    - \"README.md\"\n\nignore:\n  - \".git\"\n  - \"node_modules\"\n  - \"vendor\"\n  - \"dist\"\n```\n\n\u003c/details\u003e\n\n## CLI Reference\n\n```bash\n# Basic validation\nstructlint validate\n\n# With specific config\nstructlint validate --config .structlint.yaml\n\n# Generate JSON report\nstructlint validate --json-output report.json\n\n# Verbose output\nstructlint validate --log-level debug\n\n# Silent mode (exit code only)\nstructlint validate --silent\n\n# Show version\nstructlint version\n\n# Shell completions\nstructlint completion bash \u003e /etc/bash_completion.d/structlint\nstructlint completion zsh \u003e \"${fpath[1]}/_structlint\"\nstructlint completion fish \u003e ~/.config/fish/completions/structlint.fish\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eEnvironment Variables\u003c/strong\u003e\u003c/summary\u003e\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `STRUCTLINT_CONFIG` | Config file path | `.structlint.yaml` |\n| `STRUCTLINT_LOG_LEVEL` | Log level | `debug`, `info`, `warn`, `error` |\n| `STRUCTLINT_NO_COLOR` | Disable colors | `true` |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eExit Codes\u003c/strong\u003e\u003c/summary\u003e\n\n| Code | Meaning |\n|------|---------|\n| `0` | Validation passed |\n| `1` | Validation failed (violations found) |\n| `2` | Configuration error |\n| `3` | Runtime error |\n\n\u003c/details\u003e\n\n## CI/CD Integration\n\n### GitHub Action\n\nThe simplest way to use structlint in CI — no Go setup required:\n\n```yaml\nname: Validate Structure\non: [push, pull_request]\n\njobs:\n  structlint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: AxeForging/structlint@main\n        with:\n          config: .structlint.yaml\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAction Inputs\u003c/strong\u003e\u003c/summary\u003e\n\n| Input | Description | Default |\n|-------|-------------|---------|\n| `config` | Path to config file | `.structlint.yaml` |\n| `path` | Directory to validate | `.` |\n| `json-output` | Path for JSON report | _(none)_ |\n| `log-level` | `debug`, `info`, `warn`, `error` | `info` |\n| `silent` | Exit code only, no output | `false` |\n| `version` | Structlint version to use | _(latest)_ |\n| `comment-on-pr` | Post results as a PR comment | `false` |\n| `GITHUB_TOKEN` | GitHub token (required for PR comments) | _(none)_ |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAction with JSON Report\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n- uses: AxeForging/structlint@main\n  with:\n    config: .structlint.yaml\n    json-output: structlint-report.json\n\n- uses: actions/upload-artifact@v4\n  if: always()\n  with:\n    name: structlint-report\n    path: structlint-report.json\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAction with PR Comments\u003c/strong\u003e\u003c/summary\u003e\n\nPosts validation results directly on your pull request and writes a GitHub Actions Job Summary:\n\n```yaml\nname: Validate Structure\non:\n  pull_request:\n    branches: [main]\n\npermissions:\n  contents: read\n  pull-requests: write\n\njobs:\n  structlint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: AxeForging/structlint@main\n        with:\n          config: .structlint.yaml\n          comment-on-pr: \"true\"\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n```\n\nThe comment is updated on each push (not duplicated), and includes a collapsible violation details section.\n\n\u003c/details\u003e\n\n### Reusable Workflow\n\nFor organizations that want a standardized setup across all repos:\n\n```yaml\n# In your repo's .github/workflows/structlint.yml\nname: Validate Structure\non: [push, pull_request]\n\njobs:\n  structlint:\n    uses: AxeForging/structlint/.github/workflows/structlint.yml@main\n    with:\n      config: .structlint.yaml\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eReusable Workflow Inputs\u003c/strong\u003e\u003c/summary\u003e\n\n| Input | Type | Description | Default |\n|-------|------|-------------|---------|\n| `config` | `string` | Path to config file | `.structlint.yaml` |\n| `path` | `string` | Directory to validate | `.` |\n| `json-output` | `string` | Path for JSON report | _(none)_ |\n| `log-level` | `string` | `debug`, `info`, `warn`, `error` | `info` |\n| `silent` | `boolean` | Exit code only | `false` |\n| `version` | `string` | Structlint version | _(latest)_ |\n| `upload-report` | `boolean` | Upload JSON report as artifact | `false` |\n| `comment-on-pr` | `boolean` | Post results as a PR comment | `false` |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eReusable Workflow with Report Upload\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\njobs:\n  structlint:\n    uses: AxeForging/structlint/.github/workflows/structlint.yml@main\n    with:\n      config: .structlint.yaml\n      json-output: report.json\n      upload-report: true\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eManual GitHub Actions (without the action)\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\nname: Validate Structure\non: [push, pull_request]\n\njobs:\n  structlint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.24'\n\n      - name: Install structlint\n        run: go install github.com/AxeForging/structlint@latest\n\n      - name: Validate structure\n        run: structlint validate --json-output report.json\n\n      - name: Upload report\n        uses: actions/upload-artifact@v4\n        if: always()\n        with:\n          name: structlint-report\n          path: report.json\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGitLab CI\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\nstructlint:\n  image: golang:1.24\n  stage: test\n  script:\n    - go install github.com/AxeForging/structlint@latest\n    - structlint validate --json-output report.json\n  artifacts:\n    when: always\n    paths:\n      - report.json\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePre-commit Hook\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\n# .pre-commit-config.yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: structlint\n        name: structlint\n        entry: structlint validate --silent\n        language: system\n        pass_filenames: false\n        always_run: true\n```\n\n\u003c/details\u003e\n\n## JSON Report Format\n\n```json\n{\n  \"successes\": 42,\n  \"failures\": 2,\n  \"errors\": [\n    \"Directory not in allowed list: tmp\",\n    \"Disallowed file found: .env.local\"\n  ],\n  \"summary\": {\n    \"directories_checked\": 15,\n    \"files_checked\": 27\n  }\n}\n```\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [Getting Started](docs/user/getting-started.md) | Installation and quick start |\n| [Configuration](docs/user/configuration.md) | Complete config reference |\n| [CLI Reference](docs/user/cli-reference.md) | Commands and options |\n| [CI/CD Integration](docs/user/ci-cd-integration.md) | Pipeline examples |\n| [AI Overview](docs/AI/overview.md) | AI context and architecture |\n| [Codebase Map](docs/AI/codebase-map.md) | File structure explained |\n| [Contributing](docs/AI/contributing.md) | How to contribute |\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeforging%2Fstructlint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxeforging%2Fstructlint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxeforging%2Fstructlint/lists"}