{"id":30355784,"url":"https://github.com/joshcap20/pp","last_synced_at":"2025-08-19T05:14:38.743Z","repository":{"id":307226824,"uuid":"1028715618","full_name":"JoshCap20/pp","owner":"JoshCap20","description":"A declarative, language-agnostic build system and utility manager.","archived":false,"fork":false,"pushed_at":"2025-07-30T05:15:14.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-30T06:01:42.144Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JoshCap20.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2025-07-30T00:44:04.000Z","updated_at":"2025-07-30T05:15:14.000Z","dependencies_parsed_at":"2025-07-30T06:01:54.249Z","dependency_job_id":"ae31d5e7-2f15-4170-8295-00a327a2daa0","html_url":"https://github.com/JoshCap20/pp","commit_stats":null,"previous_names":["joshcap20/pp"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/JoshCap20/pp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshCap20%2Fpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshCap20%2Fpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshCap20%2Fpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshCap20%2Fpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JoshCap20","download_url":"https://codeload.github.com/JoshCap20/pp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshCap20%2Fpp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271103202,"owners_count":24699646,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-19T02:00:09.176Z","response_time":63,"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":"2025-08-19T05:14:36.364Z","updated_at":"2025-08-19T05:14:38.730Z","avatar_url":"https://github.com/JoshCap20.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pp\n[![Tests](https://github.com/JoshCap20/pp/actions/workflows/test.yml/badge.svg)](https://github.com/JoshCap20/pp/actions/workflows/test.yml)\n[![CI/CD](https://github.com/JoshCap20/pp/actions/workflows/publish.yml/badge.svg)](https://github.com/JoshCap20/pp/actions/workflows/publish.yml)\n\nA declarative, language-agnostic build system and utility manager.\n\n`pp` provides a unified interface for building, testing, and running applications across different programming languages and environments. By defining configurations in a declarative `pp.yaml` file, you eliminate the need to remember language-specific toolchains and command variations. The system works equally well for managing complex build processes, running simple utility scripts, and orchestrating development workflows.\n\nWhether you're working on a Python web application, a Rust CLI tool, or a Node.js frontend, `pp` abstracts away the underlying toolchain complexity while providing powerful parameterization and environment management capabilities.\n\n## Install\n\n### Quick Install\n\n```bash\npip install ppbuild\n```\n\n### macOS Users (externally-managed-environment error)\n\nIf you get an \"externally-managed-environment\" error on macOS, use one of these methods:\n\n**Option 1: Using pipx (Recommended)**\n```bash\n# Install pipx if you don't have it\nbrew install pipx\n\n# Install pp using pipx\npipx install ppbuild\n```\n\n**Option 2: Using virtual environment**\n```bash\n# Create and activate virtual environment\npython3 -m venv ~/.pp-env\nsource ~/.pp-env/bin/activate\n\n# Install pp\npip install ppbuild\n\n# Add to your shell profile (.zshrc, .bash_profile, etc.)\necho 'alias pp=\"~/.pp-env/bin/pp\"' \u003e\u003e ~/.zshrc\nsource ~/.zshrc\n```\n\n### Verify Installation\n\n```bash\npp --help\n```\n\n### Development Installation\n\n1. Clone the repository\n```bash\ngit clone https://github.com/JoshCap20/pp.git\ncd pp\n```\n\n2. Install in development mode\n```bash\npip install -e .\n```\n\n3. Install development dependencies\n```bash\npip install pytest pytest-cov black isort flake8 mypy\n```\n\n4. Run tests\n```bash\npytest\n```\n\nThe setup.py file creates a console script entry point, so after installation you can run `pp` from anywhere in your terminal.\n\n## Configuration\n\nCreate a `pp.yaml` configuration file that defines the commands for your applications. The beauty is that you can have:\n\n- A global config at `~/.pp/pp.yaml` for system-wide tools\n- Project-specific configs that override the global one\n- Environment-specific settings via `.env` files\n\nSee [TEMPLATE.md](TEMPLATE.md) for examples of creating your definition file.\n\n## Usage\n\n```bash\npp \u003capplication name\u003e \u003caction\u003e [command]\n```\n\n**Examples:**\n```bash\npp myapp build       # Build your application\npp myapp test        # Run tests\npp myapp run dev     # Start development server\npp backend deploy    # Deploy backend services\n```\n\n**Advanced Examples with Parameters:**\n```bash\npp ollama run --model deepseek-r1 --temperature 0.8    # Run AI model with specific settings\npp web_server run --port 3000 --debug                  # Start server on custom port with debug\npp database backup --output prod-backup.sql --compress # Create compressed database backup\npp docker scale --service web --replicas 3             # Scale web service to 3 instances\n```\n\nThe configuration is overridden by the current directory, so you can drop a `pp.yaml` in any project and immediately have access to all your build, test, run, lint, docker, and deployment commands through the same simple interface.\n\n## Features\n\n- **Simple Commands**: Define basic commands that just work (`pp myapp build`)\n- **Parameterized Commands**: Add typed parameters with validation, defaults, and help text\n- **Environment Management**: Automatic virtual environment activation (for python only) and environment variable injection\n- **Directory Context**: Commands run in the right directory with the right environment\n- **Type Safety**: Parameters are validated (strings, integers, floats, booleans) with constraints\n- **Flexible Configuration**: Global configs, project-specific overrides, and environment-specific settings\n\n## How it Works\n\n1. `pp` looks for a `pp.yaml` in your current directory, then falls back to `~/.pp/pp.yaml`\n2. It loads your application definitions and creates CLI subcommands automatically\n3. When you run a command, it executes the underlying tool (npm, cargo, docker, etc.) with the right arguments\n4. Parameters are validated and interpolated into your commands with proper escaping\n5. You get consistent logging and error handling across all your projects\n\nThis means you can finally stop context-switching between different build tools and just focus on building cool stuff.\n\n## How I use it\n\nI define global tools for common CLI operations in `~/.pp/pp.yaml` and then define project-specific tools in `pp.yaml` for each project. This way, I can have a single `pp` command that works for all my projects.\n\n## Todo\n\n- [ ] Download github repos and setup commands automatically\n- [ ] Chain existing commands\n- [ ] Easy MCP setup integration\n- [ ] pp utility commands (--init, etc)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshcap20%2Fpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoshcap20%2Fpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshcap20%2Fpp/lists"}