sessionkit 0.2.1__tar.gz → 0.3.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sessionkit
3
- Version: 0.2.1
3
+ Version: 0.3.0
4
4
  Summary: Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install.
5
5
  Author: Mike Bailey
6
6
  Author-email: Mike Bailey <mike@sessionkit.ai>
@@ -8,11 +8,11 @@ License-Expression: AGPL-3.0-or-later
8
8
  License-File: LICENSE
9
9
  Classifier: Development Status :: 3 - Alpha
10
10
  Requires-Dist: click>=8.1
11
- Requires-Dist: sessionmail>=0.2.1
12
- Requires-Dist: sessiontools>=0.2.0
13
- Requires-Dist: sessionphone[media]>=0.2.1
14
- Requires-Dist: sessionview>=0.2.0
15
- Requires-Dist: sessionvoice[capture]>=0.2.1
11
+ Requires-Dist: sessionmail>=0.3.0
12
+ Requires-Dist: sessiontools>=0.3.0
13
+ Requires-Dist: sessionphone[media]>=0.3.0
14
+ Requires-Dist: sessionview>=0.3.0
15
+ Requires-Dist: sessionvoice[capture]>=0.3.0
16
16
  Requires-Python: >=3.11, <3.15
17
17
  Project-URL: Homepage, https://github.com/sessionkit/sessionkit
18
18
  Project-URL: Repository, https://github.com/sessionkit/sessionkit
@@ -26,9 +26,14 @@ Code plugins.
26
26
 
27
27
  ## Installation
28
28
 
29
- You need macOS and [Claude Code][claude-code]. If you do not have uv yet,
30
- install it with `curl -LsSf https://astral.sh/uv/install.sh | sh`, then open
31
- a new terminal (or run `source ~/.local/bin/env`).
29
+ You need macOS, [Claude Code][claude-code], and [Homebrew][brew] or at
30
+ least Apple's Command Line Tools. Homebrew installs the Command Line Tools
31
+ for you ([prerequisites][prereqs]), and the kit needs two of their tools:
32
+ the plugin lines clone with git, and the ears build a Swift helper with
33
+ `swiftc`. Without Homebrew, run `xcode-select --install` to get the Command
34
+ Line Tools alone. If you do not have uv yet, install it with
35
+ `curl -LsSf https://astral.sh/uv/install.sh | sh`, then open a new terminal
36
+ (or run `source ~/.local/bin/env`).
32
37
 
33
38
  ```bash
34
39
  uv tool install --python 3.14 sessionkit
@@ -37,18 +42,42 @@ claude plugin install sessionkit@sessionkit
37
42
  ```
38
43
 
39
44
  The first line puts the commands on your PATH. The other two install the
40
- kit's plugin and the five family plugins it depends on. Start Claude Code
41
- (or restart it) to load them.
45
+ kit's plugin and the five family plugins it depends on.
42
46
 
43
47
  - **Keep `--python 3.14`.** Without it, uv takes the Python it finds: 3.15,
44
48
  where a voice library has no build yet and the install fails, or the
45
49
  Command Line Tools' 3.11. The kit is tested on 3.14.
50
+ - **Upgrade with `uv tool upgrade sessionkit`.** It keeps the Python the
51
+ install chose. To reinstall, give the pin again:
52
+ `uv tool install --python 3.14 --reinstall sessionkit`. Without it, uv
53
+ drops the pin from its record, or, with `--force`, builds the kit again on
54
+ the Python it finds.
46
55
  - **A dialog may ask to install the Command Line Tools.** On a Mac without
47
56
  them, the first `uv tool install` opens it. Click Install and let it
48
57
  finish: the plugin lines need the git it brings.
49
- - **Phone calls are installed, not yet walked.** Whether the phone bot
50
- signs its mail to your Claude follows your mail carrier: [bot mail
51
- signing][phone-signing].
58
+ - **Phone calls are installed, and walked for a session started with
59
+ `session start <name>`.** A fresh Mac took a real call and passed. A plain
60
+ `claude` session does not hear calls you make to it yet. Whether the phone
61
+ bot signs its mail to your Claude follows your mail carrier:
62
+ [bot mail signing][phone-signing].
63
+
64
+ **Then quit Claude Code and start it again**, every window of it, before you
65
+ run anything else. A plugin installed from the shell loads only when Claude
66
+ Code starts, so a session that was already open has no plugin commands on
67
+ its PATH, and no plugin hooks.
68
+
69
+ The three lines leave the ears without the model they listen with. Fetch it
70
+ once:
71
+
72
+ ```bash
73
+ ears install
74
+ ```
75
+
76
+ It downloads the 2.3 MB voice-activity model to
77
+ `~/.cache/ears/silero_vad.onnx` (network, no sudo) and prints `done`. Without
78
+ it the ears cannot hear you, and `ears services install`, the step that
79
+ starts them ([hearing and speaking][hearing]), refuses with
80
+ `silero MISSING`. The Swift helper is built later, when those services start.
52
81
 
53
82
  - **The mail hooks start off.** They tell an agent about new mail between
54
83
  its tool calls. To turn them on, set `"hooks": true` in
@@ -79,12 +108,12 @@ sessionkit --version
79
108
  It lists the kit and each family package, with its version:
80
109
 
81
110
  ```text
82
- sessionkit, version 0.2.1
83
- sessionmail 0.2.1
84
- sessiontools 0.2.0
85
- sessionphone 0.2.1
86
- sessionview 0.2.0
87
- sessionvoice 0.2.1
111
+ sessionkit, version 0.3.0
112
+ sessionmail 0.3.0
113
+ sessiontools 0.3.0
114
+ sessionphone 0.3.0
115
+ sessionview 0.3.0
116
+ sessionvoice 0.3.0
88
117
  ```
89
118
 
90
119
  Start Claude with `session start claude`, never a bare `claude`: mail to
@@ -109,6 +138,14 @@ mouth say --device default "the build is green" # speak one line
109
138
  output; `mouth devices` lists the others.
110
139
  - **To hear you**, the ears need a speech-to-text server: [hearing and
111
140
  speaking][hearing].
141
+ - **Your agent talks with the kit's mouth and ears.** sessionvoice's ears
142
+ skill sets the default:
143
+
144
+ > **With the kit, an agent talks through the kit's own mouth and ears: it
145
+ > speaks with `mouth say` and listens by arming the ears with `ears-arm`. That
146
+ > is the default whenever the user asks it to talk, speak, listen or use voice,
147
+ > even on a host that also has VoiceMode's `converse` tool. It uses `converse`
148
+ > only when the user asks for converse by name.**
112
149
 
113
150
  ## Uninstall
114
151
 
@@ -117,8 +154,9 @@ claude plugin marketplace remove sessionkit
117
154
  uv tool uninstall sessionkit
118
155
  ```
119
156
 
120
- Removing the marketplace removes its six plugins too. The services and your
121
- data have their own steps: [uninstall][uninstall].
157
+ Removing the marketplace removes its six plugins too, but not the copies they
158
+ ran from. Those copies, the services and your data have their own steps:
159
+ [uninstall][uninstall].
122
160
 
123
161
  ## Usage
124
162
 
@@ -133,7 +171,9 @@ Session Kit installs these together:
133
171
  - [sessiontools][pkg-tools]: sessions, status and idle. `session`.
134
172
  - [sessionvoice][pkg-voice]: ambient voice. `ears` hears; `mouth` speaks.
135
173
  - [sessionphone][pkg-phone]: phone calls to a session over Delta Chat.
136
- Installed, not yet walked.
174
+ Installed, and walked on a fresh Mac for a session started with
175
+ `session start <name>`. A plain `claude` session does not hear calls you
176
+ make to it yet.
137
177
  - [sessionview][pkg-view]: a tmux sidebar of your projects and your agents.
138
178
 
139
179
  ## Components
@@ -164,13 +204,15 @@ The rules for changing the kit: [AGENTS.md][agents].
164
204
 
165
205
  ## Status
166
206
 
167
- Alpha, 0.2.1. Tested on macOS 27 on Apple silicon; Linux and Windows are
207
+ Alpha, 0.3.0. Tested on macOS 27 on Apple silicon; Linux and Windows are
168
208
  untested. What you may still hit: [known gaps][gaps].
169
209
 
170
210
  Licence: [AGPL-3.0][licence].
171
211
 
172
212
  [claude-code]: https://claude.ai/code
213
+ [brew]: https://brew.sh
173
214
  [install]: INSTALL.md
215
+ [prereqs]: INSTALL.md#1-prerequisites-human
174
216
  [checks]: INSTALL.md#4-first-checks
175
217
  [hearing]: INSTALL.md#5-hearing-and-speaking-it-hears-me-and-speaks
176
218
  [mail]: INSTALL.md#mail-between-agents
@@ -6,9 +6,14 @@ Code plugins.
6
6
 
7
7
  ## Installation
8
8
 
9
- You need macOS and [Claude Code][claude-code]. If you do not have uv yet,
10
- install it with `curl -LsSf https://astral.sh/uv/install.sh | sh`, then open
11
- a new terminal (or run `source ~/.local/bin/env`).
9
+ You need macOS, [Claude Code][claude-code], and [Homebrew][brew] or at
10
+ least Apple's Command Line Tools. Homebrew installs the Command Line Tools
11
+ for you ([prerequisites][prereqs]), and the kit needs two of their tools:
12
+ the plugin lines clone with git, and the ears build a Swift helper with
13
+ `swiftc`. Without Homebrew, run `xcode-select --install` to get the Command
14
+ Line Tools alone. If you do not have uv yet, install it with
15
+ `curl -LsSf https://astral.sh/uv/install.sh | sh`, then open a new terminal
16
+ (or run `source ~/.local/bin/env`).
12
17
 
13
18
  ```bash
14
19
  uv tool install --python 3.14 sessionkit
@@ -17,18 +22,42 @@ claude plugin install sessionkit@sessionkit
17
22
  ```
18
23
 
19
24
  The first line puts the commands on your PATH. The other two install the
20
- kit's plugin and the five family plugins it depends on. Start Claude Code
21
- (or restart it) to load them.
25
+ kit's plugin and the five family plugins it depends on.
22
26
 
23
27
  - **Keep `--python 3.14`.** Without it, uv takes the Python it finds: 3.15,
24
28
  where a voice library has no build yet and the install fails, or the
25
29
  Command Line Tools' 3.11. The kit is tested on 3.14.
30
+ - **Upgrade with `uv tool upgrade sessionkit`.** It keeps the Python the
31
+ install chose. To reinstall, give the pin again:
32
+ `uv tool install --python 3.14 --reinstall sessionkit`. Without it, uv
33
+ drops the pin from its record, or, with `--force`, builds the kit again on
34
+ the Python it finds.
26
35
  - **A dialog may ask to install the Command Line Tools.** On a Mac without
27
36
  them, the first `uv tool install` opens it. Click Install and let it
28
37
  finish: the plugin lines need the git it brings.
29
- - **Phone calls are installed, not yet walked.** Whether the phone bot
30
- signs its mail to your Claude follows your mail carrier: [bot mail
31
- signing][phone-signing].
38
+ - **Phone calls are installed, and walked for a session started with
39
+ `session start <name>`.** A fresh Mac took a real call and passed. A plain
40
+ `claude` session does not hear calls you make to it yet. Whether the phone
41
+ bot signs its mail to your Claude follows your mail carrier:
42
+ [bot mail signing][phone-signing].
43
+
44
+ **Then quit Claude Code and start it again**, every window of it, before you
45
+ run anything else. A plugin installed from the shell loads only when Claude
46
+ Code starts, so a session that was already open has no plugin commands on
47
+ its PATH, and no plugin hooks.
48
+
49
+ The three lines leave the ears without the model they listen with. Fetch it
50
+ once:
51
+
52
+ ```bash
53
+ ears install
54
+ ```
55
+
56
+ It downloads the 2.3 MB voice-activity model to
57
+ `~/.cache/ears/silero_vad.onnx` (network, no sudo) and prints `done`. Without
58
+ it the ears cannot hear you, and `ears services install`, the step that
59
+ starts them ([hearing and speaking][hearing]), refuses with
60
+ `silero MISSING`. The Swift helper is built later, when those services start.
32
61
 
33
62
  - **The mail hooks start off.** They tell an agent about new mail between
34
63
  its tool calls. To turn them on, set `"hooks": true` in
@@ -59,12 +88,12 @@ sessionkit --version
59
88
  It lists the kit and each family package, with its version:
60
89
 
61
90
  ```text
62
- sessionkit, version 0.2.1
63
- sessionmail 0.2.1
64
- sessiontools 0.2.0
65
- sessionphone 0.2.1
66
- sessionview 0.2.0
67
- sessionvoice 0.2.1
91
+ sessionkit, version 0.3.0
92
+ sessionmail 0.3.0
93
+ sessiontools 0.3.0
94
+ sessionphone 0.3.0
95
+ sessionview 0.3.0
96
+ sessionvoice 0.3.0
68
97
  ```
69
98
 
70
99
  Start Claude with `session start claude`, never a bare `claude`: mail to
@@ -89,6 +118,14 @@ mouth say --device default "the build is green" # speak one line
89
118
  output; `mouth devices` lists the others.
90
119
  - **To hear you**, the ears need a speech-to-text server: [hearing and
91
120
  speaking][hearing].
121
+ - **Your agent talks with the kit's mouth and ears.** sessionvoice's ears
122
+ skill sets the default:
123
+
124
+ > **With the kit, an agent talks through the kit's own mouth and ears: it
125
+ > speaks with `mouth say` and listens by arming the ears with `ears-arm`. That
126
+ > is the default whenever the user asks it to talk, speak, listen or use voice,
127
+ > even on a host that also has VoiceMode's `converse` tool. It uses `converse`
128
+ > only when the user asks for converse by name.**
92
129
 
93
130
  ## Uninstall
94
131
 
@@ -97,8 +134,9 @@ claude plugin marketplace remove sessionkit
97
134
  uv tool uninstall sessionkit
98
135
  ```
99
136
 
100
- Removing the marketplace removes its six plugins too. The services and your
101
- data have their own steps: [uninstall][uninstall].
137
+ Removing the marketplace removes its six plugins too, but not the copies they
138
+ ran from. Those copies, the services and your data have their own steps:
139
+ [uninstall][uninstall].
102
140
 
103
141
  ## Usage
104
142
 
@@ -113,7 +151,9 @@ Session Kit installs these together:
113
151
  - [sessiontools][pkg-tools]: sessions, status and idle. `session`.
114
152
  - [sessionvoice][pkg-voice]: ambient voice. `ears` hears; `mouth` speaks.
115
153
  - [sessionphone][pkg-phone]: phone calls to a session over Delta Chat.
116
- Installed, not yet walked.
154
+ Installed, and walked on a fresh Mac for a session started with
155
+ `session start <name>`. A plain `claude` session does not hear calls you
156
+ make to it yet.
117
157
  - [sessionview][pkg-view]: a tmux sidebar of your projects and your agents.
118
158
 
119
159
  ## Components
@@ -144,13 +184,15 @@ The rules for changing the kit: [AGENTS.md][agents].
144
184
 
145
185
  ## Status
146
186
 
147
- Alpha, 0.2.1. Tested on macOS 27 on Apple silicon; Linux and Windows are
187
+ Alpha, 0.3.0. Tested on macOS 27 on Apple silicon; Linux and Windows are
148
188
  untested. What you may still hit: [known gaps][gaps].
149
189
 
150
190
  Licence: [AGPL-3.0][licence].
151
191
 
152
192
  [claude-code]: https://claude.ai/code
193
+ [brew]: https://brew.sh
153
194
  [install]: INSTALL.md
195
+ [prereqs]: INSTALL.md#1-prerequisites-human
154
196
  [checks]: INSTALL.md#4-first-checks
155
197
  [hearing]: INSTALL.md#5-hearing-and-speaking-it-hears-me-and-speaks
156
198
  [mail]: INSTALL.md#mail-between-agents
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sessionkit"
3
- version = "0.2.1"
3
+ version = "0.3.0"
4
4
  description = "Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -10,12 +10,10 @@ authors = [
10
10
  { name = "Mike Bailey", email = "mike@sessionkit.ai" }
11
11
  ]
12
12
  requires-python = ">=3.11,<3.15"
13
- # The family, one install. Floored at 0.2.0: the kit needs every family
14
- # package at 0.2.0 or later, and PyPI's 0.0.1 name placeholders and the
15
- # 0.1.0 alphas must never satisfy these. sessionmail, sessionphone and
16
- # sessionvoice are floored at 0.2.1: mail's 0.2.1 judges the doorbell by the
17
- # drop, phone's 0.2.1 sends unsigned under the drop carrier, and voice's 0.2.1
18
- # installer sets the drop carrier.
13
+ # The family, one install. Floored at 0.3.0: the kit is released and tested
14
+ # with the family's 0.3.0, so it needs every family package at 0.3.0 or
15
+ # later, and PyPI's 0.0.1 name placeholders and the 0.1.0 alphas must never
16
+ # satisfy these.
19
17
  # sessionphone with its media extra: the bot, calls and `sessionphone web` need it.
20
18
  # sessionvoice with its capture extra, so the ears can hear the room.
21
19
  # This is the RULED list, kept in tests/_ruled_deps.py with the ruling;
@@ -23,11 +21,11 @@ requires-python = ">=3.11,<3.15"
23
21
  # uv.lock drift from it.
24
22
  dependencies = [
25
23
  "click>=8.1",
26
- "sessionmail>=0.2.1",
27
- "sessiontools>=0.2.0",
28
- "sessionphone[media]>=0.2.1",
29
- "sessionview>=0.2.0",
30
- "sessionvoice[capture]>=0.2.1",
24
+ "sessionmail>=0.3.0",
25
+ "sessiontools>=0.3.0",
26
+ "sessionphone[media]>=0.3.0",
27
+ "sessionview>=0.3.0",
28
+ "sessionvoice[capture]>=0.3.0",
31
29
  ]
32
30
 
33
31
  [project.urls]
@@ -40,8 +38,8 @@ Repository = "https://github.com/sessionkit/sessionkit"
40
38
  # `uv tool install sessionkit` would put `sessionkit` alone on the PATH.
41
39
  # Each entry point is the child's own target, copied verbatim; re-measure them
42
40
  # at each child's HEAD whenever a child adds, renames or drops a command.
43
- # Measured from each child's built wheel (entry_points.txt) at mail 471a6f7,
44
- # tools ab62717, phone 02d8cf7, view 3fada19, voice eda3f94.
41
+ # Measured from each child's 0.3.0 wheel (entry_points.txt), by wheel sha256:
42
+ # mail 8e4d9476, tools 8d089699, phone ac402a39, view 3942f119, voice ebc1b65c.
45
43
  # sessionview's four commands share one target: `sessionview:main` reads the
46
44
  # name it was run as and runs that command.
47
45
  # The kit itself still ships no `session` of its own: `session` below is
@@ -127,6 +127,10 @@ def setup(mailbox: str | None, address: str | None, agent: str, dry_run: bool) -
127
127
  layout, is left as it is. It ends with the one launch step:
128
128
  `session start NAME`.
129
129
 
130
+ Before that step it asks `ears backends`, read only. If the ears'
131
+ voice-activity model is missing, it says one line naming `ears install`.
132
+ It never runs `ears install`, and the line never changes the exit.
133
+
130
134
  Exit 0 all done, 1 refused or failed, 2 usage, 4 done what it could,
131
135
  mail steps left for you. See INSTALL.md, "Operator and administrators"
132
136
  and "Mail between agents".
@@ -1,6 +1,8 @@
1
1
  """`sessionkit setup`: make this host's mail ready, write the operator, then
2
2
  define the assistant (`run_agent`: the file `session start NAME` resolves, and
3
- the box it hears, so a seat started that way hears mail to NAME).
3
+ the box it hears, so a seat started that way hears mail to NAME). Last, it
4
+ asks `ears backends` whether the ears' model is there, and says so when it is
5
+ not (`ears_model_missing`): read only, never `ears install`, never the exit.
4
6
 
5
7
  Mail first. sessionmail's mail setup verb (argv in `MAIL_SETUP_ARGV`) makes
6
8
  the mail root and the first boxes, the operator's box among them, and the
@@ -636,6 +638,34 @@ def run_agent(
636
638
  return Outcome(EXIT_OK, lines)
637
639
 
638
640
 
641
+ # --- the ears' model: read, never fetched -------------------------------------
642
+
643
+ # sessionvoice's read-only probe. Its last line is `silero ok: PATH` or
644
+ # `silero no model: ears install` (sessionvoice 0.2.1, `ears backends`).
645
+ EARS_BACKENDS_ARGV = ("ears", "backends")
646
+ # The probe answers in well under a second; a slow one is never waited on.
647
+ EARS_PROBE_TIMEOUT = 5.0
648
+ EARS_MODEL_LINE = (
649
+ "The ears have no voice-activity model, so they cannot hear you: "
650
+ "run `ears install` to fetch it."
651
+ )
652
+
653
+
654
+ def ears_model_missing(environ: Mapping[str, str]) -> bool:
655
+ """True only when `ears backends` answers, exit 0, with a `silero` line
656
+ saying `no model`. `ears` not on the PATH (no voice here), a timeout, a
657
+ failure or output we do not know all read as False: say nothing. Setup
658
+ never runs `ears install`; the user does."""
659
+ done = _run(EARS_BACKENDS_ARGV, environ, timeout=EARS_PROBE_TIMEOUT)
660
+ if done is None or done.returncode != 0:
661
+ return False
662
+ for line in (done.stdout or "").splitlines():
663
+ name, _, state = line.strip().partition(" ")
664
+ if name == "silero":
665
+ return state.strip().startswith("no model")
666
+ return False
667
+
668
+
639
669
  # --- the run ------------------------------------------------------------------
640
670
 
641
671
 
@@ -700,9 +730,11 @@ def run_setup(
700
730
  because the operator is written only for a box that exists, and the
701
731
  mail setup verb is what makes the operator's box and the agent's. The
702
732
  exit is the worst of the three: 1 if any refused or failed, else 4 if
703
- mail left steps for you, else 0. With the agent defined, the run ends on
704
- the one launch step (LAUNCH_SENTENCE). MAILBOX / ADDRESS / AGENT are
705
- already shape-checked by the caller.
733
+ mail left steps for you, else 0. Then `ears backends` is asked, read
734
+ only: when the ears' model is missing, one line (EARS_MODEL_LINE) names
735
+ `ears install`; it never changes the exit. With the agent defined, the
736
+ run ends on the one launch step (LAUNCH_SENTENCE). MAILBOX / ADDRESS /
737
+ AGENT are already shape-checked by the caller.
706
738
  """
707
739
  environ = os.environ if environ is None else environ
708
740
  resolved = Path.home() if home is None else home
@@ -733,6 +765,9 @@ def run_setup(
733
765
  lines.append(
734
766
  f"Would ask `{_verb()}` for the agent's box {agent!r} (--box {agent})."
735
767
  )
768
+ # Read only, and never part of the exit: 4 means mail steps are left.
769
+ if ears_model_missing(environ):
770
+ lines.append(EARS_MODEL_LINE)
736
771
  if defined.code == EXIT_OK:
737
772
  lines.append(launch_sentence(agent))
738
773
  return Outcome(code, lines)
@@ -1,54 +0,0 @@
1
- [project]
2
- name = "sessionkit"
3
- version = "0.2.1"
4
- description = "Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install."
5
- readme = "README.md"
6
- license = "AGPL-3.0-or-later"
7
- license-files = ["LICENSE"]
8
- classifiers = ["Development Status :: 3 - Alpha"]
9
- requires-python = ">=3.11,<3.15"
10
- dependencies = [
11
- "click>=8.1",
12
- "sessionmail>=0.2.1",
13
- "sessiontools>=0.2.0",
14
- "sessionphone[media]>=0.2.1",
15
- "sessionview>=0.2.0",
16
- "sessionvoice[capture]>=0.2.1",
17
- ]
18
-
19
- [[project.authors]]
20
- name = "Mike Bailey"
21
- email = "mike@sessionkit.ai"
22
-
23
- [project.urls]
24
- Homepage = "https://github.com/sessionkit/sessionkit"
25
- Repository = "https://github.com/sessionkit/sessionkit"
26
-
27
- [project.scripts]
28
- sessionkit = "sessionkit.cli:main"
29
- message = "sessionmail.message:cli"
30
- pager = "sessionmail.pager:cli"
31
- memory = "sessionmail.memory:cli"
32
- session = "sessiontools.cli:main"
33
- sessionphone = "sessionphone.cli:main"
34
- sessionview = "sessionview:main"
35
- sessionview-config = "sessionview:main"
36
- sessionview-session = "sessionview:main"
37
- sessionview-messages = "sessionview:main"
38
- ears = "ears.cli:main"
39
- ears-serve = "ears.serve:main"
40
- mouth = "mouth.__main__:main"
41
- talk = "talk.cli:main"
42
-
43
- [build-system]
44
- requires = ["uv_build>=0.11.9,<0.12.0"]
45
- build-backend = "uv_build"
46
-
47
- [dependency-groups]
48
- dev = [
49
- "pytest>=8",
50
- "ruff>=0.6",
51
- ]
52
-
53
- [tool.pytest.ini_options]
54
- testpaths = ["tests"]
File without changes