{
  "markdown": "<div align=\"center\">\n\n# YAP — Yet Another Packager\n\n<img src=\"assets/images/logo.png\" alt=\"yap-logo\" width=\"240\">\n\n<br><br>\n\n[![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/M0Rf30/yap)\n[![View examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](examples)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0)\n[![GitHub release](https://img.shields.io/github/release/M0Rf30/yap.svg?style=flat-square)](https://github.com/M0Rf30/yap/releases/latest)\n\n</div>\n\nYAP builds native packages for multiple GNU/Linux distributions from a single PKGBUILD specification. Write your package once; get `.deb`, `.rpm`, `.apk`, and `.pkg.tar.zst` out. All builds run in isolated OCI containers (Docker or Podman).\n\n## Features\n\n- **Multi-format output**: DEB (Debian/Ubuntu), RPM (Fedora/RHEL/Rocky/openSUSE), APK (Alpine), TAR.ZST (Arch)\n- **Container isolation**: reproducible builds, no host contamination, Docker and Podman supported\n- **PKGBUILD-based**: familiar Arch Linux syntax extended with distribution and architecture overrides\n- **Cross-compilation**: build for a different architecture than your host\n- **Dependency-aware builds**: sequential by default; opt-in parallel topo-sort via `--parallel`\n- **Package signing**: APK RSA + DEB/RPM/Pacman GPG (no `gpg` binary required)\n- **SBOM generation**: CycloneDX 1.5 and SPDX 2.3 sidecars\n- **Per-format compression**: `zstd`/`gzip`/`xz` for DEB and RPM\n- **Changelog support**: `changelog` PKGBUILD field renders to native format per distro\n- **Pacman scriptlets**: full 6-hook lifecycle (pre/post install/upgrade/remove)\n- **Structured logging**: slog-based, tree rendering for long lines, zero external UI deps\n\n## Installation\n\nOne-liner (Linux/macOS, amd64/arm64):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh | sh\n```\n\nPin a version or install only one tool:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh \\\n  | sh -s -- --version v2.1.3 --tool yap\n```\n\nManual download:\n\n```bash\nwget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\ntar -xzf yap_Linux_x86_64.tar.gz\nsudo mv yap /usr/local/bin/\nyap version\n```\n\n### Build from source\n\n```bash\ngit clone https://github.com/M0Rf30/yap.git\ncd yap\nmake build\nsudo mv yap /usr/local/bin/\n```\n\nRequires Docker or Podman:\n\n```bash\n# Docker\nsudo systemctl enable --now docker && sudo usermod -aG docker $USER\n\n# Podman\nsudo systemctl enable --now podman\n```\n\n## Quick start\n\n### 1. Project structure\n\nCreate `yap.json`:\n\n```json\n{\n  \"name\": \"My Package\",\n  \"description\": \"A sample package built with YAP\",\n  \"buildDir\": \"/tmp/yap-build\",\n  \"output\": \"artifacts\",\n  \"projects\": [\n    { \"name\": \"my-package\" }\n  ]\n}\n```\n\n### 2. PKGBUILD\n\nCreate `my-package/PKGBUILD`:\n\n```bash\npkgname=my-package\npkgver=1.0.0\npkgrel=1\npkgdesc=\"My awesome application\"\narch=('x86_64')\nlicense=('GPL-3.0')\nurl=\"https://github.com/user/my-package\"\nmakedepends=('gcc' 'make')\nsource=(\"https://github.com/user/my-package/archive/v${pkgver}.tar.gz\")\nsha256sums=('SKIP')\n\nbuild() {\n    cd \"${srcdir}/${pkgname}-${pkgver}\"\n    make\n}\n\npackage() {\n    cd \"${srcdir}/${pkgname}-${pkgver}\"\n    install -Dm755 my-package \"${pkgdir}/usr/bin/my-package\"\n    install -Dm644 README.md \"${pkgdir}/usr/share/doc/${pkgname}/README.md\"\n}\n```\n\n### 3. Build\n\n```bash\n# Auto-detect host distro from /etc/os-release\nyap build .\n\n# Specific distribution\nyap build ubuntu-jammy .\nyap build fedora-38 /path/to/project\nyap build --cleanbuild --no-makedeps ubuntu-jammy .\n```\n\n### 4. Output\n\n```\nartifacts/\n├── my-package_1.0.0-1_amd64.deb\n├── my-package-1.0.0-1.x86_64.rpm\n├── my-package-1.0.0-r1.apk\n└── my-package-1.0.0-1-x86_64.pkg.tar.zst\n```\n\n## Project configuration (`yap.json`)\n\n```json\n{\n  \"name\": \"My Multi-Package Project\",\n  \"description\": \"Project description\",\n  \"buildDir\": \"/tmp/yap-builds\",\n  \"output\": \"dist\",\n  \"projects\": [\n    { \"name\": \"package-one\", \"install\": true },\n    { \"name\": \"package-two\" }\n  ]\n}\n```\n\n| Field | Required | Default | Description |\n|-------|----------|---------|-------------|\n| `name` | yes | — | Project collection name |\n| `description` | yes | — | Project collection description |\n| `buildDir` | yes | — | Build/working directory |\n| `output` | yes | — | Output directory for built packages |\n| `projects` | yes | — | Ordered array of packages to build |\n| `projects[].name` | yes | — | Sub-directory containing the package's PKGBUILD |\n| `projects[].install` | no | `false` | Install immediately after build so later packages can depend on it |\n| `compressionDeb` / `compressionRpm` | no | `zstd` | Per-format compression: `zstd`/`gzip`/`xz` |\n| `signing` | no | — | Signing config (see [Package signing](#package-signing)) |\n| `repos` | no | — | Extra package repositories to configure before resolving deps |\n| `skipDeps` | no | — | Package names to omit from makedepends |\n| `targetArch` | no | host | Cross-compilation target architecture |\n| `parallel` | no | `false` | Build independent packages in parallel (topo-sort) |\n| `sbom` | no | `false` | Generate SBOM sidecars |\n| `sbomFormat` | no | `both` | `cyclonedx`/`spdx`/`both` |\n\nBuild ordering between packages comes from the `install` flag and each\nPKGBUILD's `depends`/`makedepends` — there is no `yap.json`-level `depends`\nfield. See [`yap.schema.json`](./yap.schema.json) for the complete spec.\n\n### Editor validation (JSON Schema)\n\nA JSON Schema for `yap.json` ships at the repo root: [`yap.schema.json`](./yap.schema.json).\nIt documents every supported field (compression, signing, repos, SBOM,\ncross-compilation, etc.). Reference it from your `yap.json` for autocomplete and\ninline validation in editors that support JSON Schema:\n\n```json\n{\n  \"$schema\": \"https://www.schemastore.org/yap.json\",\n  \"name\": \"My Multi-Package Project\",\n  \"...\": \"...\"\n}\n```\n\nThe schema is published on [SchemaStore](https://www.schemastore.org/json/),\nso editors (VS Code, JetBrains, Neovim, …) validate any `yap.json` by filename\nautomatically — no `$schema` line required.\n\n## PKGBUILD extensions\n\n### Distribution-specific variables\n\nUse `__` (double underscore) to override any variable per distribution. Priority (highest wins):\n\n| Priority | Syntax | Example |\n|----------|--------|---------|\n| 4+ | arch + distro | `depends_x86_64__ubuntu_noble` |\n| 4 | arch only | `depends_x86_64` |\n| 3 | distro + codename | `depends__ubuntu_noble` |\n| 2 | distro | `depends__ubuntu` |\n| 1 | package manager | `depends__apt` |\n| 0 | base (fallback) | `depends` |\n\n```bash\npkgdesc=\"My application\"\npkgdesc__debian=\"My application for Debian/Ubuntu\"\npkgdesc__ubuntu_noble=\"My application optimized for Ubuntu 24.04\"\n\nmakedepends=('gcc' 'make')\nmakedepends__apt=('build-essential' 'cmake')\nmakedepends__yum=('gcc-c++' 'cmake3')\nmakedepends__ubuntu_noble=('build-essential' 'cmake' 'pkg-config' 'libtool')\n```\n\n### Architecture-specific variables\n\n```bash\ndepends=('glibc' 'gcc')\ndepends_x86_64=('glibc' 'gcc' 'lib32-glibc')\ndepends_aarch64=('glibc' 'gcc' 'aarch64-linux-gnu-gcc')\n\nsource=('https://example.com/generic-source.tar.gz')\nsource_x86_64=('https://example.com/x86_64-optimized.tar.gz')\nsource_aarch64=('https://example.com/aarch64-source.tar.gz')\n\nsha256sums=('generic_hash')\nsha256sums_x86_64=('x86_64_specific_hash')\nsha256sums_aarch64=('aarch64_specific_hash')\n```\n\nSupported architectures: `x86_64`, `i686`, `aarch64`, `armv7h`, `armv6h`, `armv5`, `ppc64`, `ppc64le`, `s390x`, `mips`, `mipsle`, `riscv64`, `pentium4`, `any`.\n\n### Checksum types\n\nSupported (strongest to fastest): `b2sums`, `sha512sums`, `sha384sums`, `sha256sums`, `sha224sums`, `cksums`.\n\n```bash\n# BLAKE2b (recommended)\nb2sums=('2f240f2a3d2f8d8f...')\n\n# CRC32 (format: checksum filesize)\ncksums=('1234567890 2048576')\n```\n\n### Changelog\n\n```bash\nchangelog=CHANGELOG.md\n```\n\n- **DEB**: `usr/share/doc/<pkgname>/changelog.Debian.gz` (Lintian-compliant)\n- **RPM**: native `%changelog` entries embedded in package metadata\n- **Pacman**: `.CHANGELOG` in the archive\n- **APK**: ignored (no Alpine convention)\n\n### Pacman scriptlets\n\n```bash\npre_install()  { echo \"Before install\"; }\npost_install() { systemctl daemon-reload; }\npre_upgrade()  { systemctl stop myservice; }\npost_upgrade() { systemctl start myservice; }\npre_remove()   { systemctl disable myservice; }\npost_remove()  { systemctl daemon-reload; }\n```\n\nEmitted to `<pkgname>.install` only when at least one hook is defined. `pre/post_upgrade` fall back to `pre/post_install` when absent.\n\n### Package manager-specific fields\n\n```bash\n# DEB\nsection=utils\npriority=optional\n\n# RPM\ngroup=\"Applications/System\"\nrequires_pre=('shadow-utils')\n\n# APK\nmaintainer=\"John Doe <john@example.com>\"\n```\n\n## Supported distributions\n\n| Distribution ID | Format | Package Manager |\n|-----------------|--------|-----------------|\n| `almalinux` | `.rpm` | yum |\n| `alpine` | `.apk` | apk |\n| `amzn` | `.rpm` | yum |\n| `arch` | `.pkg.tar.zst` | pacman |\n| `centos` | `.rpm` | yum |\n| `debian` | `.deb` | apt |\n| `fedora` | `.rpm` | yum |\n| `linuxmint` | `.deb` | apt |\n| `opensuse-leap` | `.rpm` | zypper |\n| `opensuse-tumbleweed` | `.rpm` | zypper |\n| `ol` | `.rpm` | yum |\n| `pop` | `.deb` | apt |\n| `rhel` | `.rpm` | yum |\n| `rocky` | `.rpm` | yum |\n| `ubuntu` | `.deb` | apt |\n\n## Model Context Protocol (MCP)\n\nYAP ships a companion `yap-mcp` binary that exposes the same build pipeline\nover the [Model Context Protocol](https://modelcontextprotocol.io), so any\nMCP-compatible LLM client (Claude Desktop, opencode, Cursor, Zed, Continue,\nGoose, …) can drive yap directly.\n\nQuickstart (release binary):\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh | sh\n# then add { \"mcpServers\": { \"yap\": { \"command\": \"yap-mcp\" } } } to your client config\n```\n\nOr pull the standalone OCI image (also listed on the\n[MCP registry](https://registry.modelcontextprotocol.io) as `io.github.M0Rf30/yap`):\n\n```sh\ndocker pull ghcr.io/m0rf30/yap-mcp:latest\n# client config:\n# { \"mcpServers\": { \"yap\": { \"command\": \"docker\",\n#   \"args\": [\"run\",\"-i\",\"--rm\",\"ghcr.io/m0rf30/yap-mcp:latest\"] } } }\n```\n\n### Claude Code plugin (server + skill in one)\n\n```text\n/plugin marketplace add M0Rf30/claude-plugins\n/plugin install yap@M0Rf30\n```\n\n### Smithery\n\n```sh\nnpx @smithery/cli install io.github.M0Rf30/yap --client claude\n```\n\nThe full tool surface, per-client config snippets, security model, and\ntroubleshooting are in **[`MCP.md`](MCP.md)**. The shipped skill card at\n[`skills/yap/SKILL.md`](skills/yap/SKILL.md) follows the Anthropic Agent\nSkills layout and gives agents a workflow cheatsheet for free. Distribution\nchannels and release steps are documented in **[`PUBLISHING.md`](PUBLISHING.md)**.\n\n## CLI reference\n\n### Commands\n\n```bash\nyap build [distro[-release]] <path>   # Build packages (distro auto-detected if omitted)\nyap zap [distro] <path>               # Clean build environment\nyap prepare [distro[-release]]        # Prepare host build environment\nyap pull <distro>                     # Pull pre-built container images\nyap install <artifact-file>           # Install a built artifact\nyap graph [path]                      # Show dependency graph\nyap list-distros                      # List supported distributions\nyap status                            # Show host status and runtime detection\nyap version                           # Show version information\nyap completion <shell>                # Generate shell completion (bash/zsh/fish/powershell)\n```\n\n### Build flags\n\n```bash\n# Build behavior\n--cleanbuild, -c            # Clean srcdir before build\n--no-build, -o              # Download sources only\n--zap, -z                   # Deep clean staging directory\n--skip-hash-check, -H       # Skip source checksum verification\n--no-container              # Build natively on the host (skip container dispatch)\n\n# Dependencies\n--no-makedeps, -d           # Skip makedeps installation\n--skip-sync, -s             # Skip package manager sync\n--skip-deps pkg1,pkg2       # Omit specific packages from makedeps\n--parallel, -P              # Enable parallel topo-sort (opt-in)\n\n# Version\n--pkgver 1.2.3, -w          # Override package version\n--pkgrel 2, -r              # Override release number\n\n# Range / filter\n--from package1             # Start from specific package\n--to package5               # Stop at specific package\n--only pkg1,pkg2            # Build only listed packages\n--skip pkg1,pkg2            # Skip listed packages\n\n# Source access\n--ssh-password pass, -p     # Password for SSH source access\n--source-retries <n>        # Retries after first attempt for source/gensum/toolchain downloads (default 3; env: YAP_SOURCE_MAX_RETRIES)\n\n# Cross-compilation\n--target-arch arm64, -t     # Cross-compile for target architecture\n--skip-toolchain-validation, -T\n\n# Repositories / trust\n--repo \"<spec>\"             # Add an extra package repository (repeatable)\n--allow-unverified-repos, -U  # Allow apt sources without a verifiable Signed-By key\n\n# Signing\n--sign, -K                  # Enable artifact signing\n--sign-key /path/to/key     # Private key path\n--sign-passphrase pass      # Passphrase (prefer env: YAP_SIGN_PASSPHRASE)\n--sign-key-name mykey       # APK key name\n\n# SBOM\n--sbom, -S                  # Generate SBOM sidecars\n--sbom-format cyclonedx     # CycloneDX 1.5 only\n--sbom-format spdx          # SPDX 2.3 only\n--sbom-format both          # Both (default)\n\n# Compression\n--compression-deb gzip      # DEB: zstd|gzip|xz (default: zstd)\n--compression-rpm xz        # RPM: zstd|gzip|xz (default: zstd)\n\n# Debug / output\n--debug-dir /path, -D       # Emit split debug info\n--verbose                   # Verbose logging\n--no-color                  # Disable colored output\n```\n\n### Shell completion\n\n```bash\nyap completion bash > /etc/bash_completion.d/yap\nyap completion zsh > /usr/share/zsh/site-functions/_yap\nyap completion fish > ~/.config/fish/completions/yap.fish\nyap completion powershell > yap.ps1\n```\n\n## Package signing\n\n| Format | Algorithm | Output |\n|--------|-----------|--------|\n| APK | RSA PKCS#1 v1.5 SHA1 | `.SIGN.RSA.<keyname>.rsa.pub` embedded stream |\n| DEB | OpenPGP | `<package>.deb.asc` (ASCII-armored detached) |\n| RPM | OpenPGP | `<package>.rpm.asc` + optional in-RPM via rpmpack |\n| Pacman | OpenPGP | `<package>.pkg.tar.zst.sig` (binary detached) |\n\nSigning uses `github.com/ProtonMail/go-crypto/openpgp` — no `gpg` binary required.\n\n### Key resolution (highest to lowest)\n\n1. `--sign-key <path>` CLI flag\n2. Format env: `YAP_APK_KEY`, `YAP_DEB_KEY`, `YAP_RPM_KEY`, `YAP_PACMAN_KEY`\n3. Global env: `YAP_SIGN_KEY`\n4. `yap.json` field `signing.keyPath`\n5. `~/.config/yap/keys/<format>.{rsa,gpg}` then `~/.config/yap/keys/default.{rsa,gpg}`\n\nPassphrase resolution mirrors key resolution with `_PASSPHRASE` suffix.\n\n### yap.json signing config\n\n```json\n{\n  \"signing\": {\n    \"enabled\": true,\n    \"keyPath\": \"~/.config/yap/keys/release.gpg\",\n    \"keyName\": \"release\"\n  }\n}\n```\n\n### Verifying signed packages\n\n```bash\n# APK (after distributing the public key to /etc/apk/keys/)\napk add my-package.apk\n\n# DEB\ngpg --verify my-package_1.0.0_amd64.deb.asc my-package_1.0.0_amd64.deb\n\n# RPM\nrpm -K my-package-1.0.0-1.x86_64.rpm\n\n# Pacman\npacman-key --verify my-package-1.0.0-1-x86_64.pkg.tar.zst.sig\n```\n\n## SBOM generation\n\n```bash\nyap build --sbom .                        # Both formats (default)\nyap build --sbom --sbom-format cyclonedx .\nyap build --sbom --sbom-format spdx .\n```\n\nOutput alongside each artifact:\n\n```\nartifacts/\n└── my-package_1.0.0-1_amd64.deb\n    my-package_1.0.0-1_amd64.deb.cdx.json   ← CycloneDX 1.5\n    my-package_1.0.0-1_amd64.deb.spdx.json  ← SPDX 2.3\n```\n\nCaptured: name, version, license, runtime/build deps, source URLs and checksums, file hashes, DESCRIBES/DEPENDS_ON relationships.\n\n## Advanced usage\n\n### Cross-compilation\n\n```bash\nyap build --target-arch=aarch64 ubuntu-jammy .\nyap build --target-arch=armv7 fedora-38 .\nyap build --target-arch=i686 alpine .\nyap build --target-arch=ppc64le arch .\n```\n\nYAP installs the required cross-compilation toolchains and configures the build environment automatically.\n\n### Multi-package projects\n\n```json\n{\n  \"name\": \"My Suite\",\n  \"projects\": [\n    { \"name\": \"core-library\", \"install\": true },\n    { \"name\": \"main-application\", \"install\": true },\n    { \"name\": \"plugins\", \"install\": false }\n  ]\n}\n```\n\nPackages with `\"install\": true` are installed immediately after building so subsequent packages can use them as build-time dependencies.\n\n```bash\n# Sequential (default) — explicit ordering via \"install\" field\nyap build .\n\n# Parallel — topo-sort + worker pool\nyap build --parallel .\n```\n\n### Build environment preparation\n\n```bash\nyap prepare                    # Auto-detect host distro\nyap prepare ubuntu-jammy\nyap prepare fedora-38\nyap prepare --golang arch\nyap prepare --skip-sync rocky-9\n```\n\n### CI/CD integration\n\n#### GitHub Actions\n\n```yaml\nname: Build Packages\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install YAP\n        run: |\n          wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\n          tar -xzf yap_Linux_x86_64.tar.gz\n          sudo mv yap /usr/local/bin/\n\n      - name: Build Packages\n        run: yap build\n\n      - name: Upload Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: packages\n          path: artifacts/\n```\n\n#### GitLab CI\n\n```yaml\nbuild-packages:\n  stage: build\n  image: ubuntu:22.04\n  before_script:\n    - apt-get update && apt-get install -y wget docker.io\n    - wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\n    - tar -xzf yap_Linux_x86_64.tar.gz && mv yap /usr/local/bin/\n  script:\n    - yap build\n  artifacts:\n    paths:\n      - artifacts/\n    expire_in: 1 week\n```\n\n## Examples\n\nThe [examples](examples) directory contains complete, ready-to-build projects:\n\n| Example | Description |\n|---------|-------------|\n| [circular-deps](examples/circular-deps) | Circular dependency detection — YAP fails with a clear error |\n| [dependency-orchestration](examples/dependency-orchestration) | 5-package project with automatic dep resolution and build ordering |\n| [yap](examples/yap) | YAP packaging itself — Go application with install scripts |\n| [split-package](examples/split-package) | One build producing multiple installable packages with distro overrides |\n| [multi-architecture](examples/multi-architecture) | Architecture-specific sources, deps, and checksums |\n\n## PKGBUILD examples\n\n### Simple C application\n\n```bash\npkgname=hello-world\npkgver=1.0.0\npkgrel=1\npkgdesc=\"A simple Hello World program\"\narch=('x86_64')\nlicense=('MIT')\nmakedepends=('gcc')\nsource=(\"hello.c\")\nsha256sums=('SKIP')\n\nbuild() { gcc -o hello hello.c; }\n\npackage() { install -Dm755 hello \"${pkgdir}/usr/bin/hello\"; }\n```\n\n### Python application\n\n```bash\npkgname=python-myapp\npkgver=2.1.0\npkgrel=1\npkgdesc=\"My Python application\"\narch=('any')\nlicense=('Apache-2.0')\ndepends=('python3')\nmakedepends__apt=('python3-dev' 'python3-setuptools')\nmakedepends__yum=('python3-devel' 'python3-setuptools')\nsource=(\"https://pypi.io/packages/source/m/myapp/myapp-${pkgver}.tar.gz\")\nsha256sums=('...')\n\nbuild() {\n    cd \"${srcdir}/myapp-${pkgver}\"\n    python3 setup.py build\n}\n\npackage() {\n    cd \"${srcdir}/myapp-${pkgver}\"\n    python3 setup.py install --root=\"${pkgdir}\" --optimize=1\n}\n```\n\n### Web service with systemd\n\n```bash\npkgname=web-service\npkgver=1.5.0\npkgrel=1\npkgdesc=\"My web service\"\narch=('x86_64')\nlicense=('GPL-3.0')\ndepends=('systemd')\nbackup=('etc/web-service/config.yml')\nsource=(\"web-service-${pkgver}.tar.gz\" \"web-service.service\")\nsha256sums=('...' 'SKIP')\n\nbuild() {\n    cd \"${srcdir}/web-service-${pkgver}\"\n    make build\n}\n\npackage() {\n    cd \"${srcdir}/web-service-${pkgver}\"\n    install -Dm755 web-service \"${pkgdir}/usr/bin/web-service\"\n    install -Dm644 ../web-service.service \\\n        \"${pkgdir}/usr/lib/systemd/system/web-service.service\"\n    install -Dm644 config.yml \"${pkgdir}/etc/web-service/config.yml\"\n    install -dm755 \"${pkgdir}/var/lib/web-service\"\n    install -dm755 \"${pkgdir}/var/log/web-service\"\n}\n```\n\n## Development\n\n### Make targets\n\n```bash\nmake all              # clean, deps, fmt, lint, test, doc, build\nmake build            # build the yap binary\nmake build-all        # build for linux/darwin/windows, amd64/arm64\nmake clean            # clean build artifacts\nmake deps             # download and tidy Go modules\nmake fmt              # gofmt\nmake lint             # golangci-lint\nmake lint-md          # markdownlint\nmake test             # run all tests (-p 1 -v, sequential required)\nmake test-coverage    # tests with coverage report (coverage.html)\nmake release          # create release packages\n\nmake doc              # view all package documentation\nmake doc-serve        # start pkgsite on localhost:8080\nmake doc-generate     # generate static docs in docs/api/\nmake doc-package PKG=./pkg/builders/apk\n\nmake docker-build DISTRO=ubuntu\nmake docker-build-all\nmake docker-list-distros\n\nmake i18n-check       # verify localization file integrity\nmake i18n-stats       # localization statistics\n```\n\n### Testing\n\nTests must run sequentially (`-p 1`):\n\n```bash\nmake test\ngo test ./pkg/source -v\ngo test ./pkg/builders/deb -v\ngo test ./pkg/graph -v\ngo test -race ./pkg/builders/...\ngo test -timeout 30s ./pkg/download/...\n```\n\n### Internationalization\n\nSupported languages: English (`en`), Italian (`it`).\n\nLanguage is auto-detected from `LANG`/`LC_ALL`/`LC_MESSAGES`/`LANGUAGE`. Override with `--language` / `-l`:\n\n```bash\nyap --language=it build .\n```\n\nTo add a language: copy `pkg/i18n/locales/en.yaml` to `pkg/i18n/locales/{code}.yaml`, translate, add the code to `SupportedLanguages` in `pkg/i18n/i18n.go`, submit a PR.\n\n## Troubleshooting\n\n### Container runtime\n\n```bash\nsystemctl status docker       # or podman\ndocker run --rm hello-world   # test access\nsudo usermod -aG docker $USER # fix permissions (re-login required)\n```\n\n### Build failures\n\n```bash\nyap build --verbose\nyap zap ubuntu-jammy /path/to/project\nyap status\n```\n\n### Permission issues\n\n```bash\nsudo chown -R $USER:$USER artifacts/\nsetsebool -P container_manage_cgroup true   # SELinux (Red Hat family)\n```\n\n### Performance\n\n```bash\nyap build --skip-sync     # skip package manager sync\nyap build --cleanbuild    # clean source before build\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make changes and add tests\n4. Run `make fmt lint test`\n5. Commit and open a pull request\n\nSee [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community guidelines.\n\n## License\n\nGNU General Public License v3.0. See [LICENSE.md](LICENSE.md).\n\n## Credits\n\n- [Zachary Huff](https://github.com/zachhuff386) for contributions to Pacur, the project that inspired YAP\n- The Arch Linux community for the PKGBUILD format\n- All contributors\n\nBuilt with [Go](https://golang.org/), [Cobra](https://github.com/spf13/cobra), [Docker](https://www.docker.com/) / [Podman](https://podman.io/).\n\n---\n\n[Report issues](https://github.com/M0Rf30/yap/issues) · [Discussions](https://github.com/M0Rf30/yap/discussions) · [Wiki](https://github.com/M0Rf30/yap/wiki)\n",
  "bytes": 23434,
  "sha": "63a77aef6f72fed0182670f03a90c7e109dd09fa561ca493c7c536d978b89476",
  "repo_slug": "m0rf30/yap",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_m0rf30_yap_09a76509/readme"
}