Files
pm3py/pyproject.toml
michael 4f66a93de9 feat(cli): add pm3py client — autocompleting console over the stock proxmark3 client
Wraps the standard Proxmark3 C client (so it works with any Proxmark/firmware) in a prompt_toolkit REPL: full command-tree completion sourced from the client's commands.json, option-flag completion, Tab-to-descend, a press-right help toggle, and the client's own coloured output.

Two swappable backends behind ClientDriver: in-process SWIG (_pm3) by default, a pexpect-around-the-binary fallback otherwise. Both auto-detect /dev/ttyACM* and discover the checkout via its doc/commands.json marker (walk-up + side-by-side), so no path is hardcoded.

`pm3py client --pack OUT` spins off a self-contained drop-in — a readable .py, or a .pyz with prompt_toolkit/pexpect bundled — amalgamated from the package (the tested source of truth) so it can't drift. Adds pexpect to deps; hardware-free tests in tests/test_clientcli.py.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 21:05:53 -07:00

61 lines
1.5 KiB
TOML

[build-system]
requires = ["setuptools>=77.0.0"]
build-backend = "setuptools.build_meta"
[project]
name = "pm3py"
version = "0.1.0"
description = "Pure-Python async client for the Proxmark3 NG wire protocol over USB serial."
readme = "README.md"
requires-python = ">=3.10"
license = "MIT"
license-files = ["LICENSE"]
authors = [{ name = "Dangerous Things", email = "ops@dangerousthings.com" }]
keywords = [
"proxmark3",
"rfid",
"nfc",
"iso14443",
"iso15693",
"mifare",
"ntag",
"t55xx",
"smartcard",
]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Security",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"pyserial-asyncio>=0.6",
"bitarray>=2.0",
"pycryptodome>=3.10",
"prompt_toolkit>=3.0",
"pexpect>=4.8",
]
[project.optional-dependencies]
dev = ["pytest"]
[project.scripts]
pm3flash = "pm3py.flash_cli:main"
pm3py = "pm3py.cli:main"
# pyws workspace plugin — discovered by the pyws engine (installed alongside) via this group.
[project.entry-points."pyws.plugins"]
pm3py = "pm3py.pyws_plugin:Pm3pyPlugin"
[tool.setuptools.packages.find]
include = ["pm3py*"]
[tool.pytest.ini_options]
testpaths = ["tests"]