Metadata-Version: 2.4
Name: crys
Version: 0.1.5
Summary: One short CLI for pip/npm/node/python chores
Author-email: Sourasish Das <dassouraasish@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/TheServer-lab/crys
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: System :: Software Distribution
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# Crystal Dependency Manager (`crys`)

One short command instead of remembering different pip/npm invocations.

## Install

```bash
cd crystal-dependency-manager
pip install .
```

This registers a `crys` command on your PATH (via Python's normal
console-scripts mechanism).

## Why

`crys` doesn't reinvent pip/npm/apt/brew/choco — it just remembers the
long command for you and runs it. A few examples of what's actually
happening behind the scenes:

| You type | `crys` runs (depending on your OS/tools) |
|---|---|
| `crys update pip` | `python -m pip install --upgrade pip` |
| `crys update npm` | `npm install -g npm@latest` |
| `crys update py` | `sudo apt update && sudo apt install --only-upgrade python3` (or `brew upgrade python`, `choco upgrade python`, ...) |
| `crys update node` | `sudo apt install --only-upgrade nodejs` (or `brew upgrade node`, `choco upgrade nodejs`, ...) |
| `crys update rust` | `rustup update` (or `brew upgrade rust`, `choco upgrade rust`, ...) |
| `crys remove py` | `sudo apt remove python3` (or `brew uninstall python`, `choco uninstall python`, ...) — with a confirmation prompt first |
| `crys remove node` | `brew uninstall node` / `apt remove nodejs` / `choco uninstall nodejs` — with a confirmation prompt first |
| `crys remove rust` | `rustup self uninstall -y` (or `brew uninstall rust`, `choco uninstall rust`, ...) — with a confirmation prompt first |
| `crys install node` | `brew install node` / `sudo apt install nodejs npm` / `choco install nodejs` / `winget install OpenJS.NodeJS` — only if Node isn't already there |
| `crys install rust` | the official `curl \| sh` installer from rustup.rs — only if Rust isn't already there |
| `crys install py` | nothing — prints why crys can't bootstrap its own interpreter, and where to get Python |
| `crys lib install req py` | `pip install -r requirements.txt` |
| `crys lib install req node` | `npm install` |
| `crys lib install req rust` | `cargo fetch` |

Every run also prints the exact command it's about to execute (the
cyan `$ ...` line), so you can see what actually happened and learn
the "real" command if you ever need it without `crys`.

## Commands

```text
crys install node                  install Node.js if it's missing
crys install rust                  install Rust (via rustup) if missing
crys install go                    install Go if it's missing
crys install ruby                  install Ruby if it's missing
crys install php                   install PHP if it's missing
crys install py                    explains why crys can't do this one

crys lib install req py            install from requirements.txt (pip)
crys lib install req node          install from package.json (npm)
crys lib install req rust          fetch deps from Cargo.toml (cargo)
crys lib install req go            fetch deps from go.mod (go)
crys lib install req ruby          install from Gemfile (bundler)
crys lib install req php           install from composer.json (composer)

crys update pip                    upgrade pip itself
crys update npm                    upgrade npm itself
crys update py                     upgrade the Python interpreter
crys update node                   upgrade the Node.js runtime
crys update rust                   upgrade the Rust toolchain
crys update go                     upgrade the Go toolchain
crys update ruby                   upgrade the Ruby interpreter
crys update php                    upgrade the PHP interpreter

crys update py lib <name>          pip install --upgrade <name>
crys update node lib <name>        npm install <name>@latest
crys update rust lib <name>        cargo update -p <name>
crys update go lib <name>          go get -u <name>
crys update ruby lib <name>        gem update <name>
crys update php lib <name>         composer update <name>

crys remove py                     uninstall Python (asks to confirm)
crys remove node                   uninstall Node.js (asks to confirm)
crys remove rust                   uninstall Rust (asks to confirm)
crys remove go                     uninstall Go (asks to confirm)
crys remove ruby                   uninstall Ruby (asks to confirm)
crys remove php                    uninstall PHP (asks to confirm)

crys version                       print the crys version
crys version py                    print the Python version
crys version node                  print the Node.js version
crys version rust                  print the Rust version
crys version go                    print the Go version
crys version ruby                  print the Ruby version
crys version php                   print the PHP version

crys uninstall                     remove Crystal Dependency Manager
crys help                          show help text
```

## Notes on the risky commands

- `crys update node` / `crys update py` try, in order: `nvm`/`pyenv` (if
  present, they just print the right follow-up command since those are
  shell functions, not real executables), then `brew` on macOS, then
  `apt`/`dnf`/`pacman` on Linux, then `choco`/`winget` on Windows.
- `crys remove node` / `crys remove py` always ask for confirmation
  first. `crys remove py` on Linux refuses to run automatically,
  since removing the system Python package can break the OS — it
  prints the manual command instead.
- Everything shells out to the real tool (`pip`, `npm`, `brew`,
  `apt`, etc.) rather than reimplementing package management, so
  `crys` stays a thin, predictable wrapper.

## Uninstalling

```bash
crys uninstall
```

or manually: `pip uninstall crystal-dependency-manager`
