{"id":31725739,"url":"https://github.com/assistant-ui/xpm","last_synced_at":"2025-10-09T05:58:58.347Z","repository":{"id":314215619,"uuid":"1054601053","full_name":"assistant-ui/xpm","owner":"assistant-ui","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-28T19:39:58.000Z","size":66,"stargazers_count":98,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-02T08:44:42.746Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/assistant-ui.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-11T04:40:15.000Z","updated_at":"2025-10-01T02:57:02.000Z","dependencies_parsed_at":"2025-09-11T08:48:06.386Z","dependency_job_id":"52fa1d48-860e-45ab-bb66-09c1a3f43f58","html_url":"https://github.com/assistant-ui/xpm","commit_stats":null,"previous_names":["assistant-ui/xpm"],"tags_count":0,"template":false,"template_full_name":"github/codespaces-blank","purl":"pkg:github/assistant-ui/xpm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/assistant-ui%2Fxpm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/assistant-ui%2Fxpm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/assistant-ui%2Fxpm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/assistant-ui%2Fxpm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/assistant-ui","download_url":"https://codeload.github.com/assistant-ui/xpm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/assistant-ui%2Fxpm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278399621,"owners_count":25980330,"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-10-04T02:00:05.491Z","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-10-09T05:58:57.017Z","updated_at":"2025-10-09T05:58:58.341Z","avatar_url":"https://github.com/assistant-ui.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xpm - Universal Package Manager Wrapper\n\nWorking across multiple projects with different package managers?\n\nYou can use `xpm` instead of `npm`/`yarn`/`pnpm`/`bun`/`deno` (and even `pip`/`poetry`/`uv`).\n\nThink of `xpm` as your universal translator for package managers. When you run `xpm`, it figures out which package manager your project uses, ensures your dependencies are up-to-date, and runs the appropriate command. It's like having muscle memory that works everywhere.\n\nFor example, when you run `xpm dev` in a project:\n\n- `xpm` detects the package manager\n- it auto-installs dependencies if necessary (compares lockfile hash)\n- runs `npm run dev` / `yarn dev` / `pnpm dev` / `bun dev` / `deno task dev`\n\n\n## Install\n\n```bash\nnpm install -g @assistant-ui/xpm\n```\n\n## Features\n\n- 🔍 **Auto-detects** your package manager from lockfiles or package.json\n- ⚡ **Dependency sync** - auto-installs dependencies when lockfile changes\n- 🎯 **Unified commands** - identical commands across all package managers\n- 📦 **Workspace aware** - correctly handles monorepo operations\n- 🏃 **Runs from anywhere** - works in project subdirectories\n- 🌍 **Multi-language** - supports JavaScript and Python ecosystems\n\n\n## Usage\n\n```bash\nxpm               # Install dependencies\nxpm add react     # Add a package\nxpm dev           # Run a script\n\nxpm add -g turbo  # Installs global dependency\n\nxpx prettier      # Download and run from the registry\n```\n\n## Configuration\n\nxpm defaults to npm for global installs. Configure this with a config file at `~/.config/xpm/config.json` or `~/.xpmrc`.\n\n### Default Package Manager\n\nSet the default package manager for new projects (when no lockfile or package.json `packageManager` field is found):\n\n```bash\nxpm set-config default-package-manager \u003cnpm|yarn|pnpm|bun|deno\u003e\n```\n\nEnvironment variable (takes precedence):\n```bash\nexport XPM_DEFAULT_PM=\u003cnpm|yarn|pnpm|bun|deno\u003e\n```\n\n### Global Package Manager\n\nSet which package manager to use for global installs (`-g` flag):\n\n```bash\nxpm set-config global-package-manager \u003cnpm|yarn|pnpm|bun|deno\u003e\n```\n\nEnvironment variable (takes precedence):\n```bash\nexport XPM_GLOBAL_PM=\u003cnpm|yarn|pnpm|bun|deno\u003e\n```\n\nDefault: `npm`\n\n### Configuration Priority\n\n1. Environment variables (`XPM_DEFAULT_PM`, `XPM_GLOBAL_PM`)\n2. Config file (`~/.config/xpm/config.json` or `~/.xpmrc`)\n3. Default fallback (`npm`)\n\n## Python Support\n\nWhile xpm is primarily designed for JavaScript projects, it also supports Python package managers for a unified development experience across languages.\n\n### Supported Python Package Managers\n\n- **pip** - Detects `requirements.txt`\n- **pipenv** - Detects `Pipfile` and `Pipfile.lock`\n- **poetry** - Detects `pyproject.toml` and `poetry.lock`\n- **uv** - Detects `uv.lock`\n- **conda** - Detects `environment.yml`\n\n### Python Usage Examples\n\n```bash\n# In a Python project\nxpm install          # Runs pip/pipenv/poetry install\nxpm install flask    # Adds flask package\nxpm remove flask     # Removes flask package\n\n# Poetry project\nxpm install --dev pytest  # Adds pytest as dev dependency\n\n# UV project\nxpm sync            # Syncs dependencies\nxpm update          # Updates lockfile\n```\n\n### Detection Priority\n\n1. **Lockfiles** - Most specific (e.g., `poetry.lock` → Poetry)\n2. **Package files** - Project configuration (e.g., `Pipfile` → Pipenv)\n3. **Fallback** - Uses pip if `requirements.txt` exists\n\n**Note:** Python global installs (`-g`) are not supported.\n\n## Future Work\n\n### TODO\n- [ ] **pnpm patch support** - Support for pnpm patch files and patch packages\n- [ ] **Auto-install package managers** - Prompt user to install missing package managers (for all supported package managers)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fassistant-ui%2Fxpm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fassistant-ui%2Fxpm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fassistant-ui%2Fxpm/lists"}