Metadata-Version: 2.5
Name: mkit-cli
Version: 0.3.1
Summary: Release Android apps to Google Play from the command line: build, upload, listing, screenshots, data safety, in-app products, vitals and Firebase, in one tool built for humans and AI agents.
Project-URL: Homepage, https://github.com/almasumdev/mkit-cli
Project-URL: Documentation, https://github.com/almasumdev/mkit-cli/blob/main/docs/commands.md
Project-URL: Repository, https://github.com/almasumdev/mkit-cli
Project-URL: Issues, https://github.com/almasumdev/mkit-cli/issues
Project-URL: Changelog, https://github.com/almasumdev/mkit-cli/blob/main/CHANGELOG.md
Author: Nurullah Al-Masum
License-Expression: MIT
License-File: LICENSE
Keywords: android,aso,firebase,flutter,google-play,release
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Classifier: Topic :: System :: Software Distribution
Requires-Python: >=3.11
Requires-Dist: google-api-python-client>=2.150
Requires-Dist: google-auth>=2.35
Requires-Dist: pillow>=11
Requires-Dist: requests>=2.32
Description-Content-Type: text/markdown

# mkit

[![tests](https://github.com/almasumdev/mkit-cli/actions/workflows/tests.yml/badge.svg)](https://github.com/almasumdev/mkit-cli/actions/workflows/tests.yml)
[![licence: MIT](https://img.shields.io/badge/licence-MIT-blue.svg)](https://github.com/almasumdev/mkit-cli/blob/main/LICENSE)

One command-line tool for everything around an Android app that is not writing
it: build and install on a device, release to Google Play, keep the store
listing, screenshots, data safety and in-app products in your repo, read
installs, vitals, crashes and reviews, check search rank, and drive the
Firebase side (Firestore rules, Remote Config, an in-app update document).

Flutter and native Kotlin apps, including apps with a Wear OS module.

```bash
mkit deploy          # bump, build, upload to Play, publish, notify, push
mkit run -p          # build and install on the phone
mkit status          # what every track holds right now
mkit crashes         # what is breaking in production
```

A release is one command. `mkit deploy` bumps the version, commits it, builds
the bundle, uploads it with its mapping file and release notes, stages it on a
track, writes the update document, sends a message, and pushes — and if
anything fails before Play accepts the build, the version bump undoes itself so
the repo never claims a release that did not happen.

## Why it exists

Shipping an Android app means a dozen small jobs that live in different places:
a Gradle command, the Play Console, the Firebase console, a screenshot folder
somebody renamed, a changelog nobody updated. Each is easy; together they are a
release day. mkit puts them behind one tool, with the app's settings in one
file, so the same release happens the same way every time — and so an AI agent
can run the safe parts without being handed your Play Console password.

It was built to ship a small studio's apps and has been doing that for a while.
It is opinionated where opinions save time and configurable where apps really
differ.

## Install

Requires Python 3.11 or newer. [uv](https://docs.astral.sh/uv/) is the easiest
way in, and installs mkit as a command of its own rather than into a project:

```bash
uv tool install mkit-cli
mkit --version
```

With pipx: `pipx install mkit-cli`. With pip: `pip install mkit-cli`.

The latest from `main`, between releases:
`uv tool install git+https://github.com/almasumdev/mkit-cli`

`mkit self status` says whether a newer release is out, and `mkit self update`
gives the upgrade command for whichever of these installed it.

## Getting started

In an app's folder:

```bash
mkit init            # writes mkit.toml, asking what it cannot work out
mkit doctor          # what is configured, what is missing, and what to add
```

`mkit.toml` is the whole of an app's configuration:

```toml
[app]
name    = "My App"
kind    = "flutter"          # flutter | android | android-wear
package = "com.example.app"

[play]                       # switches Play features on

[store]                      # store listing, art and data safety in the repo
listing_dir = "store/listing"
```

Credentials never live in that file. A Google Play service account goes in
`.env` (per app) or `~/.mkit/.env` (shared); `mkit doctor` names the exact key
when one is missing, and never prints a secret. Every setting is documented in
[docs/config.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/config.md).

## What it does

| | |
|---|---|
| **Develop** | `run`, `devices`, `logs`, `emu`, `studio`, `gradle`, `version`, `bump` |
| **Release** | `deploy`, `status`, `promote`, `rollout`, `share` |
| **Store** | `listing`, `whatsnew`, `datasafety`, `testers`, `art` |
| **Money** | `products`, `prices` |
| **Insight** | `stats`, `vitals`, `crashes`, `reviews`, `aso` |
| **Firebase** | `rules`, `config`, `remoteconfig`, `firebase` |

Every command, flag and example: [docs/commands.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/commands.md),
generated from the code so it cannot describe a flag that does not exist.

Commands are classed by what they can change — `read`, `plan`, `write`,
`publish` — and anything in the `publish` class refuses to run without an
explicit confirmation naming the package.

Some things have no API and must be done in the Play Console. `mkit manual`
lists them, so you know what is left rather than discovering it at release
time.

## Working with AI agents

mkit answers in JSON whenever it is not attached to a terminal, with one
envelope on stdout and a documented exit code per outcome, so an agent can
branch on a result instead of reading prose. [AGENTS.md](https://github.com/almasumdev/mkit-cli/blob/main/AGENTS.md) is the
contract: which commands are safe to run unasked, which need a human to say so,
and what an agent must never do.

## Documentation

| | |
|---|---|
| [docs/commands.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/commands.md) | every command and flag |
| [docs/config.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/config.md) | `mkit.toml`, the store and keyword files, credentials |
| [docs/store.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/store.md) | the `store/` folder: what lives where, in every language |
| [docs/store-art.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/store-art.md) | screenshots and the feature graphic, built from real captures |
| [docs/in-app-update.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/in-app-update.md) | how an app should check for updates: Play first, your policy second |
| [docs/news-topics.md](https://github.com/almasumdev/mkit-cli/blob/main/docs/news-topics.md) | news and offer notifications over FCM topics |
| [AGENTS.md](https://github.com/almasumdev/mkit-cli/blob/main/AGENTS.md) | the agent contract |
| [CONTRIBUTING.md](https://github.com/almasumdev/mkit-cli/blob/main/CONTRIBUTING.md) | changing mkit, tests, versioning |
| [SECURITY.md](https://github.com/almasumdev/mkit-cli/blob/main/SECURITY.md) | what counts as a security bug here, and how to report it |

## Status and scope

Developed on Windows against real apps on Google Play; the code paths for
macOS and Linux exist but are less travelled, and there is no CI yet. The test
suite runs against a fake Play service — nothing in the tests touches a real
account.

It does not: create an app in the Play Console, answer content rating or target
audience questionnaires, manage tester email lists (the API only takes Google
Groups), or publish for you when managed publishing is on. `mkit manual` is the
full list.

Issues and pull requests are welcome. If you use it for your own apps, I would
like to hear what broke.

## Licence

MIT. See [LICENSE](https://github.com/almasumdev/mkit-cli/blob/main/LICENSE).
