quick-status 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. quick_status-0.6.0/.github/PULL_REQUEST_TEMPLATE.md +33 -0
  2. quick_status-0.6.0/.github/workflows/ci.yml +141 -0
  3. quick_status-0.6.0/.github/workflows/release.yml +36 -0
  4. quick_status-0.6.0/.gitignore +27 -0
  5. quick_status-0.6.0/.pre-commit-config.yaml +39 -0
  6. quick_status-0.6.0/.python-version +1 -0
  7. quick_status-0.6.0/AGENTS.md +22 -0
  8. quick_status-0.6.0/PKG-INFO +296 -0
  9. quick_status-0.6.0/README.md +269 -0
  10. quick_status-0.6.0/docs/api.md +223 -0
  11. quick_status-0.6.0/docs/repo_overview.md +88 -0
  12. quick_status-0.6.0/pyproject.toml +148 -0
  13. quick_status-0.6.0/src/quick_status/__init__.py +7 -0
  14. quick_status-0.6.0/src/quick_status/ci_models.py +181 -0
  15. quick_status-0.6.0/src/quick_status/ci_render.py +197 -0
  16. quick_status-0.6.0/src/quick_status/ci_snapshot.py +955 -0
  17. quick_status-0.6.0/src/quick_status/cli.py +459 -0
  18. quick_status-0.6.0/src/quick_status/commands.py +91 -0
  19. quick_status-0.6.0/src/quick_status/env_render.py +535 -0
  20. quick_status-0.6.0/src/quick_status/env_snapshot.py +383 -0
  21. quick_status-0.6.0/src/quick_status/formatting.py +270 -0
  22. quick_status-0.6.0/src/quick_status/git_snapshot.py +514 -0
  23. quick_status-0.6.0/src/quick_status/github.py +423 -0
  24. quick_status-0.6.0/src/quick_status/models.py +311 -0
  25. quick_status-0.6.0/src/quick_status/py.typed +0 -0
  26. quick_status-0.6.0/src/quick_status/repo_render.py +580 -0
  27. quick_status-0.6.0/tests/test_ci_snapshot.py +615 -0
  28. quick_status-0.6.0/tests/test_cli.py +552 -0
  29. quick_status-0.6.0/tests/test_env_snapshot.py +142 -0
  30. quick_status-0.6.0/tests/test_git_snapshot.py +354 -0
  31. quick_status-0.6.0/tests/test_github.py +322 -0
  32. quick_status-0.6.0/tests/test_performance.py +67 -0
  33. quick_status-0.6.0/uv.lock +443 -0
@@ -0,0 +1,33 @@
1
+ One sentence explaining what this PR does.
2
+
3
+ Follow this format by default, but you can deviate if that makes the PR
4
+ clearer, for example for an unusually large PR.
5
+
6
+ ## Related:
7
+ Optional. Use only if truly needed. Link related issues, docs, PRs, or
8
+ discussion.
9
+ - ...
10
+
11
+ ## Changes:
12
+ What changed in the final state of the PR. Describe the current behavior the
13
+ reader needs to know. Do not narrate the whole implementation history of the PR.
14
+ Be concise.
15
+ - ...
16
+ - ...
17
+
18
+ ## Why:
19
+ What problem this solves and why the changes were needed.
20
+ Be concise.
21
+ - ...
22
+ - ...
23
+
24
+ ## Details:
25
+ Optional. Use only if truly needed. Use this for important details or gotchas
26
+ that would clutter the changes section.
27
+ - ...
28
+
29
+ ## How To Try It:
30
+ Optional. Use only if truly needed. Use this when a reviewer would benefit
31
+ from commands, paths, task ids, or links to inspect the change directly. Do
32
+ not repeat generic CI or test output.
33
+ - ...
@@ -0,0 +1,141 @@
1
+ name: Checks
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ ruff:
18
+ name: Ruff
19
+ runs-on: ubuntu-latest
20
+ timeout-minutes: 5
21
+
22
+ steps:
23
+ - name: Check out repository
24
+ uses: actions/checkout@v6
25
+
26
+ - name: Set up Python
27
+ uses: actions/setup-python@v6
28
+ with:
29
+ python-version: "3.11"
30
+ cache: pip
31
+ cache-dependency-path: pyproject.toml
32
+
33
+ - name: Install Ruff
34
+ run: python -m pip install ruff==0.15.9
35
+
36
+ - name: Ruff format
37
+ run: python -m ruff format --check --diff .
38
+
39
+ - name: Ruff lint
40
+ run: python -m ruff check --output-format=full .
41
+
42
+ python-checks:
43
+ name: Ruff + Mypy + Pytest
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 10
46
+ strategy:
47
+ fail-fast: false
48
+ matrix:
49
+ python-version: ["3.11", "3.12", "3.13"]
50
+
51
+ steps:
52
+ - name: Check out repository
53
+ uses: actions/checkout@v6
54
+
55
+ - name: Set up Python
56
+ uses: actions/setup-python@v6
57
+ with:
58
+ python-version: ${{ matrix.python-version }}
59
+ cache: pip
60
+ cache-dependency-path: pyproject.toml
61
+
62
+ - name: Install Python dependencies
63
+ run: |
64
+ python -m pip install --upgrade pip
65
+ python -m pip install -e ".[dev]"
66
+
67
+ - name: Ruff format
68
+ run: python -m ruff format --check --diff .
69
+
70
+ - name: Ruff lint
71
+ run: python -m ruff check --output-format=full .
72
+
73
+ - name: Mypy static type checks
74
+ run: python -m mypy
75
+
76
+ - name: Pytest tests
77
+ run: python -m pytest
78
+
79
+ package-pip:
80
+ name: Package Build (pip)
81
+ runs-on: ubuntu-latest
82
+ timeout-minutes: 10
83
+
84
+ steps:
85
+ - name: Check out repository
86
+ uses: actions/checkout@v6
87
+
88
+ - name: Set up Python
89
+ uses: actions/setup-python@v6
90
+ with:
91
+ python-version: "3.11"
92
+ cache: pip
93
+ cache-dependency-path: pyproject.toml
94
+
95
+ - name: Install Python dependencies
96
+ run: |
97
+ python -m pip install --upgrade pip
98
+ python -m pip install -e ".[dev]"
99
+
100
+ - name: Build package
101
+ run: python -m build
102
+
103
+ - name: Install built wheel
104
+ run: python -m pip install --force-reinstall dist/*.whl
105
+
106
+ - name: Smoke test installed package
107
+ run: |
108
+ python -c "import quick_status; print(quick_status.__version__)"
109
+ quick-status --version
110
+
111
+ package-uv:
112
+ name: Package Build (uv)
113
+ runs-on: ubuntu-latest
114
+ timeout-minutes: 10
115
+
116
+ steps:
117
+ - name: Check out repository
118
+ uses: actions/checkout@v6
119
+
120
+ - name: Set up uv
121
+ uses: astral-sh/setup-uv@v6
122
+ with:
123
+ enable-cache: true
124
+ cache-dependency-glob: uv.lock
125
+
126
+ - name: Set up Python
127
+ run: uv python install 3.11
128
+
129
+ - name: Install Python dependencies
130
+ run: uv sync --extra dev --locked
131
+
132
+ - name: Build package
133
+ run: uv build
134
+
135
+ - name: Install built wheel
136
+ run: uv pip install --force-reinstall dist/*.whl
137
+
138
+ - name: Smoke test installed package
139
+ run: |
140
+ uv run --no-sync python -c "import quick_status; print(quick_status.__version__)"
141
+ uv run --no-sync quick-status --version
@@ -0,0 +1,36 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ publish:
13
+ name: Publish to PyPI
14
+ runs-on: ubuntu-latest
15
+ environment: pypi
16
+ permissions:
17
+ contents: read
18
+ id-token: write
19
+
20
+ steps:
21
+ - name: Check out repository
22
+ uses: actions/checkout@v6
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v6
26
+ with:
27
+ python-version: "3.11"
28
+
29
+ - name: Build package
30
+ run: |
31
+ python -m pip install --upgrade pip
32
+ python -m pip install build
33
+ python -m build
34
+
35
+ - name: Publish package distributions to PyPI
36
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,27 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+
5
+ .Python
6
+ .venv/
7
+ venv/
8
+ env/
9
+ ENV/
10
+
11
+ build/
12
+ dist/
13
+ *.egg-info/
14
+ .eggs/
15
+
16
+ .pytest_cache/
17
+ .mypy_cache/
18
+ .ruff_cache/
19
+ .coverage
20
+ htmlcov/
21
+
22
+ .env
23
+ .env.*
24
+
25
+ .DS_Store
26
+ .idea/
27
+ .vscode/
@@ -0,0 +1,39 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.15.9
4
+ hooks:
5
+ - id: ruff
6
+ - id: ruff-format
7
+ args: ["--check"]
8
+
9
+ - repo: https://github.com/pre-commit/pre-commit-hooks
10
+ rev: v6.0.0
11
+ hooks:
12
+ - id: trailing-whitespace
13
+ - id: check-symlinks
14
+ - id: destroyed-symlinks
15
+ - id: end-of-file-fixer
16
+ - id: check-yaml
17
+ - id: check-toml
18
+ - id: check-merge-conflict
19
+ - id: check-case-conflict
20
+ - id: check-executables-have-shebangs
21
+ - id: check-added-large-files
22
+ args: ["--maxkb=2000"]
23
+ - id: check-shebang-scripts-are-executable
24
+ - id: detect-private-key
25
+ - id: debug-statements
26
+
27
+ - repo: https://github.com/codespell-project/codespell
28
+ rev: v2.4.1
29
+ hooks:
30
+ - id: codespell
31
+ additional_dependencies:
32
+ - tomli
33
+
34
+ - repo: https://github.com/pre-commit/pygrep-hooks
35
+ rev: v1.10.0
36
+ hooks:
37
+ - id: rst-backticks
38
+ - id: rst-directive-colons
39
+ - id: rst-inline-touching-normal
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,22 @@
1
+ # AGENTS.md
2
+
3
+ Repo-specific instructions for agents working with the `quick-status` package.
4
+
5
+ ## Package Conventions
6
+
7
+ - Keep importable package code under `src/quick_status/`.
8
+ - Put CLI entrypoint behavior in `src/quick_status/cli.py`.
9
+
10
+ ## Validation
11
+
12
+ - Run checks relevant to the files changed.
13
+ - For README/docs-only changes, run formatting and pre-commit hygiene.
14
+ - For Python or packaging changes, also run Ruff, mypy, pytest, and build
15
+ checks.
16
+
17
+ ## Pull Requests
18
+
19
+ - Use `.github/PULL_REQUEST_TEMPLATE.md` for PR descriptions.
20
+ - Do not commit secrets, credentials, local runtime config, or scratch notes.
21
+ - Keep `AGENTS.md` updated when recurring agent instructions become
22
+ repo-specific.
@@ -0,0 +1,296 @@
1
+ Metadata-Version: 2.4
2
+ Name: quick-status
3
+ Version: 0.6.0
4
+ Summary: Quick local status snapshots for developer workspaces.
5
+ Project-URL: Homepage, https://github.com/alik-git/quick-status
6
+ Project-URL: Repository, https://github.com/alik-git/quick-status
7
+ Project-URL: Issues, https://github.com/alik-git/quick-status/issues
8
+ Author-email: Ali K <alikgithb@gmail.com>
9
+ Maintainer-email: Ali K <alikgithb@gmail.com>
10
+ Keywords: cli,developer-tools,git,status
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.11
20
+ Provides-Extra: dev
21
+ Requires-Dist: build>=1.2; extra == 'dev'
22
+ Requires-Dist: mypy>=1.15; extra == 'dev'
23
+ Requires-Dist: pre-commit>=4.0; extra == 'dev'
24
+ Requires-Dist: pytest>=8.0; extra == 'dev'
25
+ Requires-Dist: ruff>=0.11; extra == 'dev'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # quick-status
29
+
30
+ Quick local status snapshots for developer workspaces.
31
+
32
+ ## Installation
33
+
34
+ Recommended with `uv`:
35
+
36
+ ```bash
37
+ uv sync --extra dev
38
+ ```
39
+
40
+ Standard Python fallback:
41
+
42
+ ```bash
43
+ python -m pip install -e ".[dev]"
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ ```bash
49
+ quick-status
50
+ quick-status repo
51
+ quick-status repo --json
52
+ quick-status repo --github
53
+ quick-status repo --cwd /path/to/repo
54
+ quick-status repo --verbose
55
+ quick-status repo --plain
56
+ quick-status repo --non-compact
57
+ quick-status repo --worktrees
58
+ quick-status repo --stashes --stash-limit 5
59
+ quick-status repo --color=always
60
+ quick-status env
61
+ quick-status env --cwd /path/to/project
62
+ quick-status env --json
63
+ quick-status ci
64
+ quick-status ci --json
65
+ quick-status ci --cwd /path/to/repo
66
+ quick-status ci --log-tail 40
67
+ quick-status --version
68
+ ```
69
+
70
+ `quick-status` is an alias for `quick-status repo`. By default it performs a fast local
71
+ Git snapshot only. It does not fetch, push, pull, run tests, run builds, or call
72
+ network services.
73
+
74
+ Example human output:
75
+
76
+ ```text
77
+ REPO quick-status /home/ali/Projects/quick-status
78
+ BRANCH main 6acc81f origin/main synced ahead=0 behind=0
79
+ STATE clean staged=0 unstaged=0 untracked=0 conflicts=0 stash=0
80
+ REMOTE origin git@github.com:alik-git/quick-status.git
81
+ SUBMODULES none
82
+ PR not-requested
83
+ CI not-requested
84
+ ```
85
+
86
+ Repo output is compact by default. Use `--non-compact` when you want the
87
+ sectioned human summary.
88
+
89
+ Use `--worktrees` when you want the linked worktree map for the current repo
90
+ family:
91
+
92
+ ```bash
93
+ quick-status repo --worktrees
94
+ ```
95
+
96
+ Use `--stashes` when you need bounded stash details in addition to the normal
97
+ stash count:
98
+
99
+ ```bash
100
+ quick-status repo --stashes
101
+ quick-status repo --stashes --stash-limit 10
102
+ ```
103
+
104
+ These are read-only inventory flags. They do not create, prune, apply, drop, or
105
+ repair anything.
106
+
107
+ Use `--json` when another tool or agent should consume the snapshot:
108
+
109
+ ```bash
110
+ quick-status repo --json
111
+ ```
112
+
113
+ Use `--github` only when you want read-only GitHub context through the `gh` CLI:
114
+
115
+ ```bash
116
+ quick-status repo --github
117
+ quick-status repo --json --github
118
+ ```
119
+
120
+ GitHub mode reports PR, CI/check, and package-release facts when available. If
121
+ `gh` is missing, unauthenticated, offline, or rate-limited, the local snapshot
122
+ still succeeds and the GitHub section is marked unavailable.
123
+
124
+ For human output, `--github` prints and flushes the local Git facts before
125
+ running GitHub checks, then appends PR, CI, and release facts when they are
126
+ ready. JSON output remains a single complete object printed at the end.
127
+
128
+ `quick-status` reports facts and neutral summaries only. It intentionally does not
129
+ decide whether a repo is ready to commit, push, merge, or release.
130
+
131
+ ## CI Snapshots
132
+
133
+ Use `quick-status ci` when you need the deeper GitHub CI facts behind a branch or
134
+ PR:
135
+
136
+ ```bash
137
+ quick-status ci
138
+ quick-status ci --cwd ~/Projects/worksets/devpy_work/devpy-runner
139
+ quick-status ci --json
140
+ quick-status ci --verbose
141
+ quick-status ci --log-tail 40
142
+ ```
143
+
144
+ `quick-status ci` is read-only. It does not fetch, push, rerun workflows, cancel
145
+ runs, or open a browser. It reports local `HEAD`, worktree cleanliness, the
146
+ current PR when one exists, expected SHA, current/stale/absent CI evidence,
147
+ check buckets, workflow run URLs, and failed job URLs.
148
+
149
+ Example no-PR output:
150
+
151
+ ```text
152
+ CI quick-status alik-git/quick-status
153
+ BRANCH main local=4955870 upstream=origin/main synced
154
+ STATE clean staged=0 unstaged=0 untracked=0 conflicts=0
155
+ PR none
156
+ CURRENT current expected=4955870 checked=4955870 source=run-list-commit reason=run-exists-for-expected-sha
157
+ RUNS success total=1 pass=1 fail=0 pending=0 running=0 skipped=0 cancel=0 unknown=0 applies_to_head=yes
158
+ RUN Checks success id=26352434014 sha=4955870 currentness=current url=https://github.com/alik-git/quick-status/actions/runs/26352434014
159
+ ```
160
+
161
+ `--log-tail N` is intentionally simple and opt-in. For failed current GitHub
162
+ Actions runs, it prints the last `N` non-empty lines from `gh run view
163
+ --log-failed`. If log fetching is unavailable, the snapshot still succeeds and
164
+ prints `LOG unavailable`.
165
+
166
+ Human output uses color automatically when stdout is an interactive terminal.
167
+ Machine-readable JSON is never colorized. To control ANSI color explicitly:
168
+
169
+ ```bash
170
+ quick-status repo --plain # no ANSI color
171
+ quick-status repo --color=never # no ANSI color
172
+ quick-status repo --color=always # force ANSI color
173
+ ```
174
+
175
+ `--plain` overrides `--color`. Automatic color also honors the standard
176
+ `NO_COLOR` environment variable and disables color when `TERM=dumb`.
177
+
178
+ ## Environment Snapshots
179
+
180
+ Use `quick-status env` to inspect Python, conda, venv, devpy, uv, and py_runner facts
181
+ without activating or modifying anything:
182
+
183
+ ```bash
184
+ quick-status env
185
+ quick-status env --cwd ~/Projects/motion_data_processing_worktree1
186
+ quick-status env --show-all
187
+ quick-status env --show-tools --show-hints
188
+ quick-status env --abs-paths
189
+ quick-status env --compact
190
+ quick-status env --json
191
+ quick-status env --verbose
192
+ ```
193
+
194
+ Example for a normal Python project:
195
+
196
+ ```text
197
+ SHELL
198
+ cwd ~/Projects/quick-status
199
+ kind=neutral conda=none venv=none
200
+ PYTHON
201
+ runtime ~/.local/share/uv/tools/quick-status/bin/python3
202
+ python missing
203
+ python3 /usr/bin/python3
204
+ version=3.14.4 venv_like=yes
205
+ PROJECT
206
+ root ~/Projects/quick-status
207
+ pyproject=ok uv.lock=yes devpy=no .venv=yes
208
+ ```
209
+
210
+ Example for a `devpy`-backed worktree:
211
+
212
+ ```text
213
+ PROJECT
214
+ root ~/Projects/motion_data_processing_worktree1
215
+ name=motion-data-processing pyproject=ok uv.lock=yes devpy=yes .venv=yes
216
+ DEVPY
217
+ venv ~/Projects/motion_data_processing_worktree1/.venv
218
+ base=mdp_shared status=ok venv_python=yes editables=3
219
+ ```
220
+
221
+ Use `--show-all`, `--show-tools`, `--show-hints`, or `--show-home` when you need
222
+ those extra sections:
223
+
224
+ ```text
225
+ TOOLS
226
+ uv ~/.local/bin/uv
227
+ conda ~/miniconda3/condabin/conda
228
+ devpy ~/.local/bin/devpy
229
+ py_runner ~/.agent_files/py_runner/run
230
+ HINTS devpy_python=devpy python
231
+ py_runner_overlay:
232
+ ~/.agent_files/py_runner/run \
233
+ --env mdp_shared \
234
+ --python .venv/bin/python
235
+ ```
236
+
237
+ `quick-status env` treats tools like `python`, `python3`, `pip`, `conda`, `devpy`,
238
+ `uv`, and `py_runner` as optional facts. Missing tools are reported as missing
239
+ instead of crashing the command. Human output compacts home-relative paths with
240
+ `~`; pass `--abs-paths` when exact absolute paths are more useful. Default env
241
+ collection is path-based and avoids slow `--version` subprocesses; use
242
+ `--verbose` when you want those command records and version probes. `quick-status
243
+ repo` still requires `git`, but reports a missing Git executable directly
244
+ instead of confusing it with a non-repository path.
245
+
246
+ ## Development
247
+
248
+ Read these docs first when changing the package:
249
+
250
+ - [Repo Overview](docs/repo_overview.md): mental model, public surface, module
251
+ ownership, and design rules
252
+ - [API](docs/api.md): command surface, JSON schemas, exit codes, GitHub mode,
253
+ and env snapshot behavior
254
+
255
+ Run the standard checks before opening a PR:
256
+
257
+ ```bash
258
+ uv run ruff format --check .
259
+ uv run ruff check .
260
+ uv run mypy
261
+ uv run pytest
262
+ uv build
263
+ ```
264
+
265
+ If you are using standard Python tools instead of uv:
266
+
267
+ ```bash
268
+ python -m ruff format --check .
269
+ python -m ruff check .
270
+ python -m mypy
271
+ python -m pytest
272
+ python -m build
273
+ ```
274
+
275
+ ## Publishing
276
+
277
+ This repo publishes to PyPI through GitHub Actions Trusted Publishing. The
278
+ release workflow is [`.github/workflows/release.yml`](.github/workflows/release.yml).
279
+
280
+ Use these values in PyPI's pending trusted publisher form:
281
+
282
+ ```text
283
+ PyPI project name: quick-status
284
+ Owner: alik-git
285
+ Repository name: quick-status
286
+ Workflow name: release.yml
287
+ Environment name: pypi
288
+ ```
289
+
290
+ The workflow filename is `release.yml`; the display name inside that file is
291
+ `Release`, but PyPI wants the filename. The `pypi` environment should also exist
292
+ under the GitHub repository's environment settings.
293
+
294
+ Publishing is release-driven: normal pushes and pull requests build and test the
295
+ package, but publishing happens when a GitHub Release is published or the release
296
+ workflow is manually dispatched.