Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
90 lines (82 loc) · 4.28 KB
/
Copy pathpyproject.toml
File metadata and controls
90 lines (82 loc) · 4.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "gpt-voicecoding"
version = "1.0.6"
description = "Voice-controlling terminal coding agents through a realtime voice call."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.12"
authors = [{ name = "Simon-AI-coding" }]
keywords = ["voice", "coding-agent", "claude-code", "codex", "realtime"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: MacOS X",
"License :: OSI Approved :: MIT License",
"Operating System :: MacOS :: MacOS X",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
]
dependencies = []
[project.optional-dependencies]
# `ruff` is pinned exactly, and `pytest` is not, because only one of them decides
# what the source is allowed to look like. The formatter changes its mind between
# releases — 0.16 rejoins lines 0.6 split — so an open range makes `ruff format
# --check` a check against whichever version CI happened to resolve that morning,
# and main goes red without a commit having touched it. An exact pin makes a ruff
# upgrade a deliberate act that carries its own reformat, never an ambient one.
dev = ["pytest>=8", "ruff==0.16.4"]
# The bridge-owned Live Call's audio path. An extra rather than a dependency:
# every one of these carries a compiled media stack, and the engine's control
# plane, its Relays and its whole test suite run without them. They are imported
# in exactly one module (`adapters/call/realtime/webrtc.py`), and the Call
# adapter's factory refuses to build without them rather than failing mid-call.
voice = ["aiortc>=1.9", "av>=12", "sounddevice>=0.4",
"livekit>=1.1.17", "pyobjc-framework-CoreAudio>=12.2.2"]
# The real-environment acceptance's one actor: a Telegram *user*-account client,
# because a bot cannot message a bot and inbound has to be real
# (`docs/acceptance-design.md`). An extra rather than a dev dependency, and never
# a dependency: `tests/test_architecture.py` lists `telethon` among the protocol
# libraries Bridge Core and the seams may not import, this is the only place in
# the repository that imports it, and it must not reach the bundle — the bundle's
# interpreter installs the project, not its extras.
acceptance = ["telethon>=1.41"]
[project.urls]
Homepage = "https://github.com/Simon-AI-coding/GPT-VoiceCoding"
Issues = "https://github.com/Simon-AI-coding/GPT-VoiceCoding/issues"
[project.scripts]
bridgectl = "gpt_voicecoding.cli:main"
bridge-install = "gpt_voicecoding.installation.__main__:main"
[tool.hatch.build.targets.wheel]
packages = ["src/gpt_voicecoding"]
[tool.pytest.ini_options]
testpaths = ["tests"]
# `-m "not acceptance"` is what keeps `pytest -q` meaning what it has always
# meant. The acceptance suite needs THIS machine, THESE credentials and THAT bot;
# it spends real agent turns and writes real messages into a real chat, so it is
# opt-in by marker and never runs in CI. Run it deliberately:
# .venv/bin/python -m pytest -m acceptance tests/acceptance -v
addopts = "-q -m \"not acceptance\""
markers = [
"acceptance: the real-environment run (docs/acceptance-design.md); needs credentials and costs money",
"covers: which acceptance items (docs/acceptance-design.md §2) a test grades, so `--step` can deselect it",
]
# Test modules import the shared fakes bare (`from fakes import ...`); this pins that path.
# The repository root is here for `app_bundle`, the build pipeline, which lives
# outside `src/` on purpose: the product does not ship its own build system.
# `tests/acceptance` is here so the *fast* suite can import the harness's own
# pure logic — the item names, the selection, the deadlines and the verdict. The
# acceptance run itself never reaches CI — it needs this machine, these
# credentials and that bot — but a rule the harness applies to the chat is
# ordinary code, and #109 is what a rule with no test at CI speed costs. The
# import is safe from here: `items` and `deadlines` are leaves, `support` and
# `journey` reach only those, and telethon is imported inside the functions of
# `telegram_person`, which nothing else imports.
pythonpath = ["tests", "tests/acceptance", "."]
[tool.ruff]
src = ["src", "tests", "app_bundle"]
line-length = 100
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]