<table><tr> <td colspan="1"> <h3 align="center"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://PlayForm.Cloud/Dark/Image/GitHub/GitHub.svg"> <source media="(prefers-color-scheme: light)" srcset="https://PlayForm.Cloud/Image/GitHub/GitHub.svg"> <img width="28" alt="GitHub" src="https://PlayForm.Cloud/Image/GitHub/GitHub.svg"> </picture>  </h3> </td> <td colspan="3" valign="top"> <h3 align="center"> Related </h3> </td> </tr><tr><td valign="top" colspan="1"><a href="https://GitHub.Com/PlayForm/Compress/actions/workflows/Node.yml" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/actions/workflow/status/PlayForm/Compress/Node.yml?branch=main&label=Build&logo=node.js&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/actions/workflow/status/PlayForm/Compress/Node.yml?branch=main&label=Build&logo=node.js&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/github/actions/workflow/status/PlayForm/Compress/Node.yml?branch=main&label=Build&logo=node.js&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Build" title="Build"> </picture> </a><br><a href="https://NPMJS.Org/@playform/compress?activeTab=dependencies" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/librariesio/release/npm/@playform/compress?logo=dependabot&label=&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/librariesio/release/npm/@playform/compress?logo=dependabot&label=&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/librariesio/release/npm/@playform/compress?logo=dependabot&label=&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Dependency" title="Dependency"> </picture> </a><br><a href="https://NPMJS.Org/@playform/compress" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/npm/v/@playform/compress?label=Version&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/npm/v/@playform/compress?label=Version&logo=npm&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/npm/v/@playform/compress?label=Version&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Version" title="Version"> </picture> </a><br></td><td valign="top" colspan="1"><a href="https://GitHub.Com/PlayForm/Compress" target="_blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/stars/PlayForm/Compress?style=flat&label=Star&logo=github&color=black&labelColor=black&logoColor=white&logoWidth=0"><source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/stars/PlayForm/Compress?style=flat&label=Star&logo=github&color=white&labelColor=white&logoColor=black&logoWidth=0"><img src="https://img.shields.io/github/stars/PlayForm/Compress?style=flat&label=Star&logo=github&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Star"></picture></a><br><a href="https://NPMJS.Org/@playform/compress" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/npm/d18m/@playform/compress?label=Download&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/npm/d18m/@playform/compress?label=Download&logo=npm&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/npm/d18m/@playform/compress?label=Download&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Download" title="Download"> </picture> </a><br><a href="https://GitHub.Com/PlayForm/Compress" target="_blank"><b>🗜️ Compress —</b></a></td><td valign="top" colspan="1"><a href="https://GitHub.Com/PlayForm/Format/actions/workflows/Node.yml" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/actions/workflow/status/PlayForm/Format/Node.yml?branch=main&label=Build&logo=node.js&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/actions/workflow/status/PlayForm/Format/Node.yml?branch=main&label=Build&logo=node.js&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/github/actions/workflow/status/PlayForm/Format/Node.yml?branch=main&label=Build&logo=node.js&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Build" title="Build"> </picture> </a><br><a href="https://NPMJS.Org/@playform/format?activeTab=dependencies" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/librariesio/release/npm/@playform/format?logo=dependabot&label=&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/librariesio/release/npm/@playform/format?logo=dependabot&label=&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/librariesio/release/npm/@playform/format?logo=dependabot&label=&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Dependency" title="Dependency"> </picture> </a><br><a href="https://NPMJS.Org/@playform/format" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/npm/v/@playform/format?label=Version&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/npm/v/@playform/format?label=Version&logo=npm&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/npm/v/@playform/format?label=Version&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Version" title="Version"> </picture> </a><br></td><td valign="top" colspan="1"><a href="https://GitHub.Com/PlayForm/Format" target="_blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/stars/PlayForm/Format?style=flat&label=Star&logo=github&color=black&labelColor=black&logoColor=white&logoWidth=0"><source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/stars/PlayForm/Format?style=flat&label=Star&logo=github&color=white&labelColor=white&logoColor=black&logoWidth=0"><img src="https://img.shields.io/github/stars/PlayForm/Format?style=flat&label=Star&logo=github&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Star"></picture></a><br><a href="https://NPMJS.Org/@playform/format" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/npm/d18m/@playform/format?label=Download&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0"> <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/npm/d18m/@playform/format?label=Download&logo=npm&color=white&labelColor=white&logoColor=black&logoWidth=0"> <img src="https://img.shields.io/npm/d18m/@playform/format?label=Download&logo=npm&color=black&labelColor=black&logoColor=white&logoWidth=0" alt="Download" title="Download"> </picture> </a><br><a href="https://GitHub.Com/PlayForm/Format" target="_blank"><b>🗻 Format —</b></a></td></tr></table><hr>

# [Maintain] 🔧

This **[`CLI tool`][Maintain]** brings GitHub repository maintenance utilities
to your workflow.

[`Clean`][Clean] 🎁

[`Dependabot`][Dependabot] 🎁

[`Dispatch`][Dispatch] 🎁

[`Edit`][Edit] 🎁

[`Node`][Node] 🎁

[`Cloudflare`][Cloudflare] 🎁

[`NPM`][NPM] 🎁

[`Rust`][Rust] 🎁

[`GitHub`][GitHub] 🎁

[`Star`][Star] 🎁

> [!IMPORTANT]
>
> Set `Base` and `Token` in your `.env` before running any commands.

## Installation 🚀

There are two ways to use `Maintain`. Install it globally for repeated use, or
run it directly without installing.

### Install globally

Using NPM:

```sh
npm install -g @playform/maintain
```

Using Yarn:

```sh
yarn global add @playform/maintain
```

Using PNPM:

```sh
pnpm add -g @playform/maintain
```

### Run directly

Using NPM:

```sh
npx @playform/maintain < Command > [Arguments...]
```

Using Yarn:

```sh
yarn dlx @playform/maintain < Command > [Arguments...]
```

Using PNPM:

```sh
pnpx @playform/maintain < Command > [Arguments...]
```

## Getting started

Once installed, invoke `Maintain` followed by a subcommand:

```sh
Maintain < Command > [Arguments...]
```

### Clean

Deletes GitHub Actions workflow runs, their logs, and caches for the specified
repositories. Omit repositories to target all accessible ones.

```sh
Maintain Clean MyRepo AnotherRepo
Maintain Clean
```

### Dependabot

Scans project directories for package manifests (`package.json`, `Cargo.toml`,
etc.) and generates `.github/dependabot.yml` alongside a supporting
`.github/workflows/Dependabot.yml` workflow to keep dependencies up-to-date
automatically.

```sh
Maintain Dependabot
```

### Dispatch

Triggers `workflow_dispatch` events for every workflow in the specified
repositories on the `Current` ref. Omit repositories to dispatch for all
accessible ones.

```sh
Maintain Dispatch MyRepo AnotherRepo
Maintain Dispatch
```

### Edit

Configures repository and organization settings: merge strategies, auto-merge,
branch deletion on merge, fork settings, web commit signoffs, and default
Actions permissions.

```sh
Maintain Edit MyRepo AnotherRepo
Maintain Edit
```

### Node

Generates or updates `.github/workflows/Node.yml` for Node.js projects
(`package.json`). Configures `pnpm` with lock-file caching and adds steps for
`build`, `test`, and `prepublishOnly` scripts. Uploads `./Target` artifacts when
a build script is present.

```sh
Maintain Node
```

### Cloudflare

Generates or updates `.github/workflows/Cloudflare.yml` for Cloudflare Workers
projects (`wrangler.toml`). Configures `cloudflare/wrangler-action` for
deployments.

```sh
Maintain Cloudflare
```

### NPM

Generates or updates `.github/workflows/NPM.yml` for packages published to NPM.
Adds a publish step via `npm publish --legacy-peer-deps --ignore-scripts` when
`build`, `prepublishOnly`, or `Build` scripts are detected.

```sh
Maintain NPM
```

### Rust

Generates or updates `.github/workflows/Rust.yml` for Rust projects
(`Cargo.toml`). Caches Cargo dependencies and builds in release mode with all
features enabled.

```sh
Maintain Rust
```

### GitHub

Generates or updates `.github/workflows/GitHub.yml` for general CI use across
repositories.

```sh
Maintain GitHub
```

### Workflow

Meta-command that runs all workflow generators — `Dependabot`, `Node`,
`Cloudflare`, `NPM`, `Rust`, and `GitHub` — in a single pass.

```sh
Maintain Workflow
```

### Star

Reads all `package.json` files under `Base`, collects every NPM dependency, and
stars their corresponding GitHub repositories.

```sh
Maintain Star
```

### Complexity

Discovers and logs package file information across project directories.

```sh
Maintain Complexity "src/**/*.ts"
Maintain Complexity
```

## `.env` Configuration

Create a `.env` file in the directory where you run `Maintain`:

```sh
# Your GitHub username — used by Clean, Dispatch, Edit.
User="YourGitHubUsername"

# Root directory scanned for package manifests.
# Defaults to the current working directory.
# Used by Star and all workflow commands.
Base="/path/to/your/projects"

# GitHub Personal Access Token with repo, workflow, and admin:org scopes.
# Used by Clean, Dispatch, Edit, Star.
Token="YourGitHubPAT"
```

[Maintain]: HTTPS://NPMJS.Org/@playform/maintain
[Clean]: #clean
[Dependabot]: #dependabot
[Dispatch]: #dispatch
[Edit]: #edit
[Node]: #node
[Cloudflare]: #cloudflare
[NPM]: #npm
[Rust]: #rust
[GitHub]: #github
[Star]: #star

## Changelog

See [`CHANGELOG.md`](CHANGELOG.md) for a history of changes to this tool.
