sessionkit 0.3.1__tar.gz → 0.3.2__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,3 +1,23 @@
1
+ Metadata-Version: 2.4
2
+ Name: sessionkit
3
+ Version: 0.3.2
4
+ Summary: Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install.
5
+ Author: Mike Bailey
6
+ Author-email: Mike Bailey <mike@sessionkit.ai>
7
+ License-Expression: AGPL-3.0-or-later
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Requires-Dist: click>=8.1
11
+ Requires-Dist: sessionmail>=0.3.2
12
+ Requires-Dist: sessiontools>=0.3.2
13
+ Requires-Dist: sessionphone[media]>=0.3.2
14
+ Requires-Dist: sessionview>=0.3.2
15
+ Requires-Dist: sessionvoice[capture]>=0.3.2
16
+ Requires-Python: >=3.11, <3.15
17
+ Project-URL: Homepage, https://github.com/sessionkit/sessionkit
18
+ Project-URL: Repository, https://github.com/sessionkit/sessionkit
19
+ Description-Content-Type: text/markdown
20
+
1
21
  # Session Kit
2
22
 
3
23
  Session Kit lets your Claude Code sessions mail each other, hear you and
@@ -46,11 +66,10 @@ You need:
46
66
  curl -LsSf https://astral.sh/uv/install.sh | sh
47
67
  ```
48
68
 
49
- - Then open a new terminal. Until you do, `uv` is not on your PATH. Or
50
- run:
69
+ - Then open a new terminal, so `uv` is on your PATH. Or run:
51
70
 
52
71
  ```bash
53
- source ~/.local/bin/env
72
+ source ~/.zshrc
54
73
  ```
55
74
 
56
75
  - For a call on a Mac: [Homebrew][brew], then ffmpeg from it. A call needs
@@ -64,6 +83,9 @@ You need:
64
83
  brew install ffmpeg
65
84
  ```
66
85
 
86
+ - Homebrew lists what ffmpeg needs, then asks
87
+ `Do you want to proceed with the installation? [y/n]`. Press `y`. It
88
+ goes on at once, with no Return.
67
89
  - Then the speech server, then link the phone: the phone bullets below.
68
90
  - A call without Homebrew is the workaround case. This guide does not
69
91
  cover it.
@@ -82,8 +104,13 @@ kit's plugin and the five family plugins it depends on.
82
104
  - **Keep `--python 3.14`.** Without it, uv takes the Python it finds: 3.15,
83
105
  where a voice library has no build yet and the install fails, or the
84
106
  Command Line Tools' 3.11. The kit is tested on 3.14.
85
- - **Upgrade with `uv tool upgrade sessionkit`.** It keeps the Python the
86
- install chose.
107
+ - To upgrade:
108
+
109
+ ```bash
110
+ uv tool upgrade sessionkit
111
+ ```
112
+
113
+ It keeps the Python the install chose.
87
114
  - To reinstall, give the pin again:
88
115
 
89
116
  ```bash
@@ -102,8 +129,7 @@ kit's plugin and the five family plugins it depends on.
102
129
  bot signs its mail to your Claude follows your mail carrier:
103
130
  [bot mail signing][phone-signing].
104
131
  - **The speech server comes before the phone.** A call hears you through
105
- it, so it is installed before you link your phone. Linking is
106
- `sessionphone setup`, in [sessionphone][pkg-phone]'s docs.
132
+ it, so it is installed before you link your phone.
107
133
  - No phone: nothing to run now. [Hearing and speaking][hearing]
108
134
  installs the speech server with the rest of the voice.
109
135
  - A phone: first Homebrew, then ffmpeg, as the call item under "You
@@ -113,6 +139,7 @@ kit's plugin and the five family plugins it depends on.
113
139
  brew install ffmpeg
114
140
  ```
115
141
 
142
+ - At Homebrew's `[y/n]`, press `y`.
116
143
  - Then install the speech server. It builds the server and fetches its
117
144
  weights, about 2.9 GB.
118
145
 
@@ -120,7 +147,22 @@ kit's plugin and the five family plugins it depends on.
120
147
  ears services install --only speech
121
148
  ```
122
149
 
123
- - Then link the phone.
150
+ - Then link the phone. This makes its account on a public relay and
151
+ prints the invite link. The name people see in their chat list goes in
152
+ place of NAME:
153
+
154
+ ```bash
155
+ sessionphone setup --name NAME
156
+ ```
157
+
158
+ A name with a space in it needs quotes, or the shell splits it in two
159
+ and setup refuses the second word:
160
+
161
+ ```bash
162
+ sessionphone setup --name "Ada Lovelace"
163
+ ```
164
+
165
+ - The rest of linking is in [sessionphone][pkg-phone]'s docs.
124
166
 
125
167
  - **Then quit Claude Code and start it again**, every window of it, before
126
168
  you run anything else.
@@ -129,8 +171,19 @@ A plugin installed from the shell loads only when Claude Code starts, so a
129
171
  session that was already open has no plugin commands on its PATH, and no
130
172
  plugin hooks.
131
173
 
132
- The three lines leave the ears without the model they listen with. Fetch it
133
- once:
174
+ Then set up mail. This makes the box `claude`, which your first session
175
+ needs to hear mail and calls:
176
+
177
+ ```bash
178
+ sessionkit setup
179
+ ```
180
+
181
+ - **On a fresh Mac it exits 4, and that is expected.** It leaves two
182
+ notmuch steps for later: [the manual install][setup] shows its last
183
+ lines.
184
+
185
+ The three install lines leave the ears without the model they listen
186
+ with. Fetch it once:
134
187
 
135
188
  ```bash
136
189
  ears install
@@ -174,21 +227,41 @@ starts them ([hearing and speaking][hearing]), refuses with
174
227
  Step by step, with every step that needs you marked: [the manual
175
228
  install][install].
176
229
 
230
+ To see what this Mac is still missing, run the kit's check. It installs
231
+ nothing. It prints one line for each thing the kit needs, and under each
232
+ missing one, the command that adds it:
233
+
234
+ ```bash
235
+ sessionkit doctor
236
+ ```
237
+
238
+ It exits 0 when nothing the kit needs is missing, and 1 when something is.
239
+ The phone bot and the session key are shown, but they never fail it.
240
+
241
+ - No kit yet, or `sessionkit` will not start? The installer runs the same
242
+ check. Its address is not live yet. From a clone of this repository,
243
+ run `bash install.sh --check`. Once the address is live:
244
+
245
+ ```bash
246
+ curl -fsSL https://sessionkit.ai/install.sh | bash -s -- --check
247
+ ```
248
+
177
249
  ## Quick start
178
250
 
179
251
  ```bash
180
252
  sessionkit --version
181
253
  ```
182
254
 
183
- It lists the kit and each family package, with its version:
255
+ It lists the kit and each family package, with its version. Each `X.Y.Z`
256
+ is the version you installed:
184
257
 
185
258
  ```text
186
- sessionkit, version 0.3.0
187
- sessionmail 0.3.0
188
- sessiontools 0.3.0
189
- sessionphone 0.3.0
190
- sessionview 0.3.0
191
- sessionvoice 0.3.0
259
+ sessionkit, version X.Y.Z
260
+ sessionmail X.Y.Z
261
+ sessiontools X.Y.Z
262
+ sessionphone X.Y.Z
263
+ sessionview X.Y.Z
264
+ sessionvoice X.Y.Z
192
265
  ```
193
266
 
194
267
  Start Claude in a project folder, not in your home folder, where a new
@@ -219,9 +292,9 @@ session start
219
292
 
220
293
  - **Never a bare `claude`.** Mail to your agent's box, your phone's
221
294
  included, reaches only a session started as that agent.
222
- - **`sessionkit setup` makes the box `claude` first:** [first
223
- checks][checks]. Without the box, the first session starts plain too,
224
- and its line names the repair:
295
+ - **Without the box `claude`, the first session starts plain too.** The
296
+ mail setup under Installation makes the box ([first checks][checks]).
297
+ The line names the repair:
225
298
 
226
299
  ```text
227
300
  session start: starting plain: box claude is missing, so this session will NOT hear Delta messages or calls; repair: message setup --box claude
@@ -302,6 +375,7 @@ Session Kit installs these together:
302
375
  `session start <name>`. A plain `claude` session does not hear calls you
303
376
  make to it yet.
304
377
  - [sessionview][pkg-view]: a tmux sidebar of your projects and your agents.
378
+ `sessionview` (said "session view").
305
379
 
306
380
  ## Components
307
381
 
@@ -334,7 +408,7 @@ The rules for changing the kit: [AGENTS.md][agents].
334
408
 
335
409
  ## Status
336
410
 
337
- Alpha, 0.3.1. Tested on macOS 27 on Apple silicon; Linux and Windows are
411
+ Alpha, 0.3.2. Tested on macOS 27 on Apple silicon; Linux and Windows are
338
412
  untested. What you may still hit: [known gaps][gaps].
339
413
 
340
414
  Licence: [AGPL-3.0][licence].
@@ -343,6 +417,7 @@ Licence: [AGPL-3.0][licence].
343
417
  [brew]: https://brew.sh
344
418
  [install]: INSTALL.md
345
419
  [prereqs]: INSTALL.md#1-prerequisites-human
420
+ [setup]: INSTALL.md#2-install-the-kit
346
421
  [checks]: INSTALL.md#4-first-checks
347
422
  [hearing]: INSTALL.md#5-hearing-and-speaking-it-hears-me-and-speaks
348
423
  [mail]: INSTALL.md#mail-between-agents
@@ -1,23 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: sessionkit
3
- Version: 0.3.1
4
- Summary: Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install.
5
- Author: Mike Bailey
6
- Author-email: Mike Bailey <mike@sessionkit.ai>
7
- License-Expression: AGPL-3.0-or-later
8
- License-File: LICENSE
9
- Classifier: Development Status :: 3 - Alpha
10
- Requires-Dist: click>=8.1
11
- Requires-Dist: sessionmail>=0.3.1
12
- Requires-Dist: sessiontools>=0.3.1
13
- Requires-Dist: sessionphone[media]>=0.3.0
14
- Requires-Dist: sessionview>=0.3.0
15
- Requires-Dist: sessionvoice[capture]>=0.3.0
16
- Requires-Python: >=3.11, <3.15
17
- Project-URL: Homepage, https://github.com/sessionkit/sessionkit
18
- Project-URL: Repository, https://github.com/sessionkit/sessionkit
19
- Description-Content-Type: text/markdown
20
-
21
1
  # Session Kit
22
2
 
23
3
  Session Kit lets your Claude Code sessions mail each other, hear you and
@@ -66,11 +46,10 @@ You need:
66
46
  curl -LsSf https://astral.sh/uv/install.sh | sh
67
47
  ```
68
48
 
69
- - Then open a new terminal. Until you do, `uv` is not on your PATH. Or
70
- run:
49
+ - Then open a new terminal, so `uv` is on your PATH. Or run:
71
50
 
72
51
  ```bash
73
- source ~/.local/bin/env
52
+ source ~/.zshrc
74
53
  ```
75
54
 
76
55
  - For a call on a Mac: [Homebrew][brew], then ffmpeg from it. A call needs
@@ -84,6 +63,9 @@ You need:
84
63
  brew install ffmpeg
85
64
  ```
86
65
 
66
+ - Homebrew lists what ffmpeg needs, then asks
67
+ `Do you want to proceed with the installation? [y/n]`. Press `y`. It
68
+ goes on at once, with no Return.
87
69
  - Then the speech server, then link the phone: the phone bullets below.
88
70
  - A call without Homebrew is the workaround case. This guide does not
89
71
  cover it.
@@ -102,8 +84,13 @@ kit's plugin and the five family plugins it depends on.
102
84
  - **Keep `--python 3.14`.** Without it, uv takes the Python it finds: 3.15,
103
85
  where a voice library has no build yet and the install fails, or the
104
86
  Command Line Tools' 3.11. The kit is tested on 3.14.
105
- - **Upgrade with `uv tool upgrade sessionkit`.** It keeps the Python the
106
- install chose.
87
+ - To upgrade:
88
+
89
+ ```bash
90
+ uv tool upgrade sessionkit
91
+ ```
92
+
93
+ It keeps the Python the install chose.
107
94
  - To reinstall, give the pin again:
108
95
 
109
96
  ```bash
@@ -122,8 +109,7 @@ kit's plugin and the five family plugins it depends on.
122
109
  bot signs its mail to your Claude follows your mail carrier:
123
110
  [bot mail signing][phone-signing].
124
111
  - **The speech server comes before the phone.** A call hears you through
125
- it, so it is installed before you link your phone. Linking is
126
- `sessionphone setup`, in [sessionphone][pkg-phone]'s docs.
112
+ it, so it is installed before you link your phone.
127
113
  - No phone: nothing to run now. [Hearing and speaking][hearing]
128
114
  installs the speech server with the rest of the voice.
129
115
  - A phone: first Homebrew, then ffmpeg, as the call item under "You
@@ -133,6 +119,7 @@ kit's plugin and the five family plugins it depends on.
133
119
  brew install ffmpeg
134
120
  ```
135
121
 
122
+ - At Homebrew's `[y/n]`, press `y`.
136
123
  - Then install the speech server. It builds the server and fetches its
137
124
  weights, about 2.9 GB.
138
125
 
@@ -140,7 +127,22 @@ kit's plugin and the five family plugins it depends on.
140
127
  ears services install --only speech
141
128
  ```
142
129
 
143
- - Then link the phone.
130
+ - Then link the phone. This makes its account on a public relay and
131
+ prints the invite link. The name people see in their chat list goes in
132
+ place of NAME:
133
+
134
+ ```bash
135
+ sessionphone setup --name NAME
136
+ ```
137
+
138
+ A name with a space in it needs quotes, or the shell splits it in two
139
+ and setup refuses the second word:
140
+
141
+ ```bash
142
+ sessionphone setup --name "Ada Lovelace"
143
+ ```
144
+
145
+ - The rest of linking is in [sessionphone][pkg-phone]'s docs.
144
146
 
145
147
  - **Then quit Claude Code and start it again**, every window of it, before
146
148
  you run anything else.
@@ -149,8 +151,19 @@ A plugin installed from the shell loads only when Claude Code starts, so a
149
151
  session that was already open has no plugin commands on its PATH, and no
150
152
  plugin hooks.
151
153
 
152
- The three lines leave the ears without the model they listen with. Fetch it
153
- once:
154
+ Then set up mail. This makes the box `claude`, which your first session
155
+ needs to hear mail and calls:
156
+
157
+ ```bash
158
+ sessionkit setup
159
+ ```
160
+
161
+ - **On a fresh Mac it exits 4, and that is expected.** It leaves two
162
+ notmuch steps for later: [the manual install][setup] shows its last
163
+ lines.
164
+
165
+ The three install lines leave the ears without the model they listen
166
+ with. Fetch it once:
154
167
 
155
168
  ```bash
156
169
  ears install
@@ -194,21 +207,41 @@ starts them ([hearing and speaking][hearing]), refuses with
194
207
  Step by step, with every step that needs you marked: [the manual
195
208
  install][install].
196
209
 
210
+ To see what this Mac is still missing, run the kit's check. It installs
211
+ nothing. It prints one line for each thing the kit needs, and under each
212
+ missing one, the command that adds it:
213
+
214
+ ```bash
215
+ sessionkit doctor
216
+ ```
217
+
218
+ It exits 0 when nothing the kit needs is missing, and 1 when something is.
219
+ The phone bot and the session key are shown, but they never fail it.
220
+
221
+ - No kit yet, or `sessionkit` will not start? The installer runs the same
222
+ check. Its address is not live yet. From a clone of this repository,
223
+ run `bash install.sh --check`. Once the address is live:
224
+
225
+ ```bash
226
+ curl -fsSL https://sessionkit.ai/install.sh | bash -s -- --check
227
+ ```
228
+
197
229
  ## Quick start
198
230
 
199
231
  ```bash
200
232
  sessionkit --version
201
233
  ```
202
234
 
203
- It lists the kit and each family package, with its version:
235
+ It lists the kit and each family package, with its version. Each `X.Y.Z`
236
+ is the version you installed:
204
237
 
205
238
  ```text
206
- sessionkit, version 0.3.0
207
- sessionmail 0.3.0
208
- sessiontools 0.3.0
209
- sessionphone 0.3.0
210
- sessionview 0.3.0
211
- sessionvoice 0.3.0
239
+ sessionkit, version X.Y.Z
240
+ sessionmail X.Y.Z
241
+ sessiontools X.Y.Z
242
+ sessionphone X.Y.Z
243
+ sessionview X.Y.Z
244
+ sessionvoice X.Y.Z
212
245
  ```
213
246
 
214
247
  Start Claude in a project folder, not in your home folder, where a new
@@ -239,9 +272,9 @@ session start
239
272
 
240
273
  - **Never a bare `claude`.** Mail to your agent's box, your phone's
241
274
  included, reaches only a session started as that agent.
242
- - **`sessionkit setup` makes the box `claude` first:** [first
243
- checks][checks]. Without the box, the first session starts plain too,
244
- and its line names the repair:
275
+ - **Without the box `claude`, the first session starts plain too.** The
276
+ mail setup under Installation makes the box ([first checks][checks]).
277
+ The line names the repair:
245
278
 
246
279
  ```text
247
280
  session start: starting plain: box claude is missing, so this session will NOT hear Delta messages or calls; repair: message setup --box claude
@@ -322,6 +355,7 @@ Session Kit installs these together:
322
355
  `session start <name>`. A plain `claude` session does not hear calls you
323
356
  make to it yet.
324
357
  - [sessionview][pkg-view]: a tmux sidebar of your projects and your agents.
358
+ `sessionview` (said "session view").
325
359
 
326
360
  ## Components
327
361
 
@@ -354,7 +388,7 @@ The rules for changing the kit: [AGENTS.md][agents].
354
388
 
355
389
  ## Status
356
390
 
357
- Alpha, 0.3.1. Tested on macOS 27 on Apple silicon; Linux and Windows are
391
+ Alpha, 0.3.2. Tested on macOS 27 on Apple silicon; Linux and Windows are
358
392
  untested. What you may still hit: [known gaps][gaps].
359
393
 
360
394
  Licence: [AGPL-3.0][licence].
@@ -363,6 +397,7 @@ Licence: [AGPL-3.0][licence].
363
397
  [brew]: https://brew.sh
364
398
  [install]: INSTALL.md
365
399
  [prereqs]: INSTALL.md#1-prerequisites-human
400
+ [setup]: INSTALL.md#2-install-the-kit
366
401
  [checks]: INSTALL.md#4-first-checks
367
402
  [hearing]: INSTALL.md#5-hearing-and-speaking-it-hears-me-and-speaks
368
403
  [mail]: INSTALL.md#mail-between-agents
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sessionkit"
3
- version = "0.3.1"
3
+ version = "0.3.2"
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"
@@ -9,11 +9,11 @@ classifiers = ["Development Status :: 3 - Alpha"]
9
9
  requires-python = ">=3.11,<3.15"
10
10
  dependencies = [
11
11
  "click>=8.1",
12
- "sessionmail>=0.3.1",
13
- "sessiontools>=0.3.1",
14
- "sessionphone[media]>=0.3.0",
15
- "sessionview>=0.3.0",
16
- "sessionvoice[capture]>=0.3.0",
12
+ "sessionmail>=0.3.2",
13
+ "sessiontools>=0.3.2",
14
+ "sessionphone[media]>=0.3.2",
15
+ "sessionview>=0.3.2",
16
+ "sessionvoice[capture]>=0.3.2",
17
17
  ]
18
18
 
19
19
  [[project.authors]]
@@ -51,4 +51,7 @@ dev = [
51
51
  ]
52
52
 
53
53
  [tool.pytest.ini_options]
54
- testpaths = ["tests"]
54
+ testpaths = [
55
+ "tests",
56
+ "dark-launch/tests",
57
+ ]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sessionkit"
3
- version = "0.3.1"
3
+ version = "0.3.2"
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"
@@ -18,6 +18,9 @@ requires-python = ">=3.11,<3.15"
18
18
  # and docs call on: `sessionkit setup` asks sessiontools 0.3.1's
19
19
  # `session agent default`, and INSTALL.md describes sessionmail 0.3.1's
20
20
  # one-run mail setup.
21
+ # All five are floored at 0.3.2: the family is released together, and an older
22
+ # copy of one package beside the others splits its state between the old
23
+ # and new folders.
21
24
  # sessionphone with its media extra: the bot, calls and `sessionphone web` need it.
22
25
  # sessionvoice with its capture extra, so the ears can hear the room.
23
26
  # This is the RULED list, kept in tests/_ruled_deps.py with the ruling;
@@ -25,11 +28,11 @@ requires-python = ">=3.11,<3.15"
25
28
  # uv.lock drift from it.
26
29
  dependencies = [
27
30
  "click>=8.1",
28
- "sessionmail>=0.3.1",
29
- "sessiontools>=0.3.1",
30
- "sessionphone[media]>=0.3.0",
31
- "sessionview>=0.3.0",
32
- "sessionvoice[capture]>=0.3.0",
31
+ "sessionmail>=0.3.2",
32
+ "sessiontools>=0.3.2",
33
+ "sessionphone[media]>=0.3.2",
34
+ "sessionview>=0.3.2",
35
+ "sessionvoice[capture]>=0.3.2",
33
36
  ]
34
37
 
35
38
  [project.urls]
@@ -80,4 +83,4 @@ dev = [
80
83
  ]
81
84
 
82
85
  [tool.pytest.ini_options]
83
- testpaths = ["tests"]
86
+ testpaths = ["tests", "dark-launch/tests"]
@@ -5,6 +5,7 @@ from importlib.metadata import PackageNotFoundError, version
5
5
 
6
6
  import click
7
7
 
8
+ from sessionkit import doctor as kit_doctor
8
9
  from sessionkit import setup as operator_setup
9
10
 
10
11
  CTX = {"help_option_names": ["-h", "--help"]}
@@ -154,3 +155,42 @@ def setup(
154
155
  for line in outcome.lines:
155
156
  click.echo(line, err=outcome.code != 0)
156
157
  raise SystemExit(outcome.code)
158
+
159
+
160
+ @main.command(context_settings=CTX)
161
+ @click.option(
162
+ "--no-speech",
163
+ is_flag=True,
164
+ help="Leave the speech server and the ears out: their rows do not fail.",
165
+ )
166
+ def doctor(no_speech: bool) -> None:
167
+ """Check this Mac for what the kit needs, and install nothing.
168
+
169
+ One line per thing, found or missing, and under each missing one the
170
+ command that adds it. The rows the installer checks come from the
171
+ installer itself: this runs the install.sh the kit ships, with --check.
172
+ Then three rows of its own: the mail hooks (needed), the phone bot
173
+ (optional) and the session key (information only).
174
+
175
+ It is read-only: it writes no file of its own and starts and stops
176
+ nothing. The only network it reaches itself is the speech server on
177
+ 127.0.0.1:8890, which it probes, and its brew reads download nothing.
178
+ The tools it asks keep their own files in your home, and may use their
179
+ own network: in an empty home, brew, uv and claude make their caches,
180
+ and claude, asked for its plugins, reaches Anthropic's API over HTTPS.
181
+ INSTALL.md section 4, in
182
+ https://github.com/sessionkit/sessionkit, names each file.
183
+
184
+ On a Mac without the kit, or where this command will not start, the
185
+ installer runs the same check:
186
+
187
+ \b
188
+ curl -fsSL https://sessionkit.ai/install.sh | bash -s -- --check
189
+
190
+ From a clone of the kit, the same: bash install.sh --check
191
+
192
+ Exit 0 nothing the kit needs is missing, 1 something is (each missing
193
+ row says what to run), 2 usage, 3 this Mac cannot be checked (not macOS,
194
+ or run as root).
195
+ """
196
+ raise SystemExit(kit_doctor.run(no_speech=no_speech, echo=click.echo))