let-them-talk 0.1.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.
- let_them_talk-0.1.0/.gitignore +16 -0
- let_them_talk-0.1.0/LICENSE +202 -0
- let_them_talk-0.1.0/PKG-INFO +55 -0
- let_them_talk-0.1.0/README.md +31 -0
- let_them_talk-0.1.0/docs/configuration.md +85 -0
- let_them_talk-0.1.0/docs/how-it-works.md +227 -0
- let_them_talk-0.1.0/docs/limits.md +56 -0
- let_them_talk-0.1.0/docs/usage.md +478 -0
- let_them_talk-0.1.0/mods/let-them-talk-handoff/.claude-plugin/plugin.json +5 -0
- let_them_talk-0.1.0/mods/let-them-talk-handoff/README.md +12 -0
- let_them_talk-0.1.0/mods/let-them-talk-handoff/skills/handoff/LICENSE +21 -0
- let_them_talk-0.1.0/mods/let-them-talk-handoff/skills/handoff/SKILL.md +16 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/.claude-plugin/plugin.json +9 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/AGENTS.md +8 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/CLAUDE.md +1 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/README.md +24 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/hooks.json +1 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/register.test.ts +156 -0
- let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/register.ts +228 -0
- let_them_talk-0.1.0/pypi/__init__.py +1 -0
- let_them_talk-0.1.0/pyproject.toml +79 -0
- let_them_talk-0.1.0/server.py +4697 -0
- let_them_talk-0.1.0/static/app.js +3441 -0
- let_them_talk-0.1.0/static/fonts/LICENSE-Selawik.txt +91 -0
- let_them_talk-0.1.0/static/fonts/selawk.woff2 +0 -0
- let_them_talk-0.1.0/static/fonts/selawkb.woff2 +0 -0
- let_them_talk-0.1.0/static/fonts/selawksb.woff2 +0 -0
- let_them_talk-0.1.0/static/index.html +273 -0
- let_them_talk-0.1.0/static/style.css +1105 -0
- let_them_talk-0.1.0/tests/check.sh +18 -0
- let_them_talk-0.1.0/tests/check_page.py +1721 -0
- let_them_talk-0.1.0/tests/check_server.py +1568 -0
- let_them_talk-0.1.0/tests/setup.sh +8 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Your own data: boards (chat ids, connection reasons) and the log of sent notes
|
|
2
|
+
boards/
|
|
3
|
+
logs/
|
|
4
|
+
# Python cache
|
|
5
|
+
__pycache__/
|
|
6
|
+
# Private notes (handoffs, scratch files)
|
|
7
|
+
temp/
|
|
8
|
+
# Claude Code (local settings, worktrees)
|
|
9
|
+
.claude/
|
|
10
|
+
# Written by Claude Code each time it loads a mod
|
|
11
|
+
mods/*/.claude-plugin/types/
|
|
12
|
+
mods/*/tsconfig.json
|
|
13
|
+
# The page checks' browser (tests/setup.sh)
|
|
14
|
+
tests/.venv/
|
|
15
|
+
# Built packages (uv build)
|
|
16
|
+
dist/
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: let-them-talk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A visual board for your Claude Code agents: see sessions, subagents and background agents as cards, and draw arrows so they talk to each other.
|
|
5
|
+
Project-URL: Homepage, https://github.com/abdullahkavakli/let-them-talk
|
|
6
|
+
Project-URL: Issues, https://github.com/abdullahkavakli/let-them-talk/issues
|
|
7
|
+
Project-URL: Documentation, https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/usage.md
|
|
8
|
+
Author: Abdullah KAVAKLI
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: mods/let-them-talk-handoff/skills/handoff/LICENSE
|
|
12
|
+
License-File: static/fonts/LICENSE-Selawik.txt
|
|
13
|
+
Keywords: agents,board,claude,claude-code,dashboard,multi-agent,subagents
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Software Development
|
|
22
|
+
Requires-Python: >=3.12
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# Let Them Talk
|
|
26
|
+
|
|
27
|
+
A visual board for your agents. Each running Claude Code session is a card, and an arrow from one card to another tells both chats who they work with and why.
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+
## What it does
|
|
32
|
+
|
|
33
|
+
- Draw an arrow between two chats and it tells them who to talk to and why. They then talk through Claude Code's own messaging.
|
|
34
|
+
- Click an arrow to read what the two chats sent each other.
|
|
35
|
+
- Start a team: a master and up to 8 agents, each with its own role, prompt, model and effort.
|
|
36
|
+
- Terminal chats, Cursor chats and background agents share one board, with the subagents they run.
|
|
37
|
+
- Local and small: the server is one Python file that uses only Python's standard library, and nothing is installed into Claude Code.
|
|
38
|
+
|
|
39
|
+
## Start
|
|
40
|
+
|
|
41
|
+
Needs Python 3.12+ and Claude Code (on Windows, both inside WSL).
|
|
42
|
+
|
|
43
|
+
- One line: `uvx let-them-talk` (needs [uv](https://docs.astral.sh/uv/); or `pipx run let-them-talk`). It starts the board and opens it in your browser; `--no-open` skips that. Its boards are kept in `~/.local/share/let-them-talk`.
|
|
44
|
+
- From a copy of this repository, on Windows: double-click `Start Let Them Talk.bat`.
|
|
45
|
+
- From a copy of this repository, on macOS, Linux or WSL: `./start.sh`, then open <http://localhost:8765>.
|
|
46
|
+
|
|
47
|
+
Click **New board** and pick a project folder: its running chats appear as cards. Drag the blue handle from one card onto another, then click **Connect**.
|
|
48
|
+
|
|
49
|
+
More: [using it](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/usage.md) · [how it works](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/how-it-works.md) · [settings](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/configuration.md) · [limits](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/limits.md)
|
|
50
|
+
|
|
51
|
+
Not related to [Dekelelz/let-them-talk](https://github.com/Dekelelz/let-them-talk), a different project with the same name.
|
|
52
|
+
|
|
53
|
+
## License
|
|
54
|
+
|
|
55
|
+
[Apache 2.0](https://github.com/abdullahkavakli/let-them-talk/blob/main/LICENSE). The Selawik font and the `/handoff` skill keep their own licenses, next to their files.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Let Them Talk
|
|
2
|
+
|
|
3
|
+
A visual board for your agents. Each running Claude Code session is a card, and an arrow from one card to another tells both chats who they work with and why.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
- Draw an arrow between two chats and it tells them who to talk to and why. They then talk through Claude Code's own messaging.
|
|
10
|
+
- Click an arrow to read what the two chats sent each other.
|
|
11
|
+
- Start a team: a master and up to 8 agents, each with its own role, prompt, model and effort.
|
|
12
|
+
- Terminal chats, Cursor chats and background agents share one board, with the subagents they run.
|
|
13
|
+
- Local and small: the server is one Python file that uses only Python's standard library, and nothing is installed into Claude Code.
|
|
14
|
+
|
|
15
|
+
## Start
|
|
16
|
+
|
|
17
|
+
Needs Python 3.12+ and Claude Code (on Windows, both inside WSL).
|
|
18
|
+
|
|
19
|
+
- One line: `uvx let-them-talk` (needs [uv](https://docs.astral.sh/uv/); or `pipx run let-them-talk`). It starts the board and opens it in your browser; `--no-open` skips that. Its boards are kept in `~/.local/share/let-them-talk`.
|
|
20
|
+
- From a copy of this repository, on Windows: double-click `Start Let Them Talk.bat`.
|
|
21
|
+
- From a copy of this repository, on macOS, Linux or WSL: `./start.sh`, then open <http://localhost:8765>.
|
|
22
|
+
|
|
23
|
+
Click **New board** and pick a project folder: its running chats appear as cards. Drag the blue handle from one card onto another, then click **Connect**.
|
|
24
|
+
|
|
25
|
+
More: [using it](docs/usage.md) · [how it works](docs/how-it-works.md) · [settings](docs/configuration.md) · [limits](docs/limits.md)
|
|
26
|
+
|
|
27
|
+
Not related to [Dekelelz/let-them-talk](https://github.com/Dekelelz/let-them-talk), a different project with the same name.
|
|
28
|
+
|
|
29
|
+
## License
|
|
30
|
+
|
|
31
|
+
[Apache 2.0](LICENSE). The Selawik font and the `/handoff` skill keep their own licenses, next to their files.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
Let Them Talk runs without setup; these settings and the optional
|
|
4
|
+
suggestions mod change how it runs.
|
|
5
|
+
|
|
6
|
+
## Environment settings
|
|
7
|
+
|
|
8
|
+
Set these for the server before you start it.
|
|
9
|
+
|
|
10
|
+
- `LTT_PORT`: the port it listens on (default `8765`). The Windows `.bat`
|
|
11
|
+
always opens the page on port 8765; for the suggestions mod, see
|
|
12
|
+
[below](#suggestions-mod).
|
|
13
|
+
- `LTT_DATA`: the folder where the app keeps its boards and logs. By
|
|
14
|
+
default the app's own folder when you run `./start.sh` or
|
|
15
|
+
`python3 server.py` from a copy of the repository, and
|
|
16
|
+
`$XDG_DATA_HOME/let-them-talk` (`~/.local/share/let-them-talk` if that isn't
|
|
17
|
+
set, on macOS too) when you installed it with `uvx` or `pipx`. It is also the
|
|
18
|
+
folder the app's own short `claude -p` runs start in. To carry boards over
|
|
19
|
+
to another folder, copy `boards/` and `logs/` there. See
|
|
20
|
+
[What is stored where](how-it-works.md#what-is-stored-where).
|
|
21
|
+
- `LTT_MODEL`: the model for notes and TL;DRs (default `haiku`).
|
|
22
|
+
- `LTT_CLAUDE`: the path to the `claude` binary. By default `claude` on the
|
|
23
|
+
PATH, else `~/.local/bin/claude`.
|
|
24
|
+
- `LTT_WINDOWS_HOME`: your Windows user folder as a WSL path, e.g.
|
|
25
|
+
`/mnt/c/Users/you`, whose `.claude` holds Windows sessions. By default the
|
|
26
|
+
app asks Windows for `%USERPROFILE%`.
|
|
27
|
+
- `CLAUDE_CONFIG_DIR`: if you run Claude Code with it, set it for the server
|
|
28
|
+
too. It then reads sessions, transcripts and background agents from there
|
|
29
|
+
instead of `~/.claude`.
|
|
30
|
+
|
|
31
|
+
The older `ORGANIZER_*` names (such as `ORGANIZER_PORT`) still work.
|
|
32
|
+
|
|
33
|
+
## Suggestions mod
|
|
34
|
+
|
|
35
|
+
The mod in `mods/let-them-talk-suggestions` does three things: it passes on
|
|
36
|
+
Claude Code's reply suggestion for terminal chats (see
|
|
37
|
+
[Reply suggestions](how-it-works.md#reply-suggestions)), it runs a
|
|
38
|
+
**Chat in IDE** on the model picked in **New agent** (see
|
|
39
|
+
[The model of a Chat in IDE](how-it-works.md#the-model-of-a-chat-in-ide)),
|
|
40
|
+
and in a background agent, after an ultracode switch made while it works,
|
|
41
|
+
it runs `/effort status` so the app can read the switch (see
|
|
42
|
+
[Ultracode](how-it-works.md#ultracode)). In other chats it runs nothing
|
|
43
|
+
for ultracode.
|
|
44
|
+
|
|
45
|
+
To install it, add this repository as a plugin marketplace and install the
|
|
46
|
+
plugin from it:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
claude plugin marketplace add abdullahkavakli/let-them-talk
|
|
50
|
+
claude plugin install let-them-talk-suggestions@let-them-talk
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Or, in a chat:
|
|
54
|
+
`/plugin install let-them-talk-suggestions --marketplace abdullahkavakli/let-them-talk`.
|
|
55
|
+
|
|
56
|
+
The plugin is the mod of the latest release, the same release as the app
|
|
57
|
+
`uvx let-them-talk` runs, so the two always match. A change made to the mod
|
|
58
|
+
after that release reaches the plugin only with the next release, which brings
|
|
59
|
+
both: update the plugin with
|
|
60
|
+
`claude plugin update let-them-talk-suggestions@let-them-talk`.
|
|
61
|
+
|
|
62
|
+
If you run a copy of the repository and want the mod to follow it, load it
|
|
63
|
+
from there instead. To load it in every chat started from then on, add its
|
|
64
|
+
absolute path to the `env` block of `~/.claude/settings.json`:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{ "env": { "CLAUDE_CODE_PLUGIN_DIRS": "/path/to/let-them-talk/mods/let-them-talk-suggestions" } }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
For a single chat:
|
|
71
|
+
`claude --plugin-dir /path/to/let-them-talk/mods/let-them-talk-suggestions`.
|
|
72
|
+
|
|
73
|
+
A copy loaded this way (`CLAUDE_CODE_PLUGIN_DIRS` or `--plugin-dir`) takes the
|
|
74
|
+
place of an installed one with the same name, so having both is fine.
|
|
75
|
+
|
|
76
|
+
- Chats started before the mod was loaded show no suggestion until
|
|
77
|
+
restarted, and an ultracode switch made while they work shows only at
|
|
78
|
+
their next prompt.
|
|
79
|
+
- A **Chat in IDE** gets the picked model only where the mod is loaded: a
|
|
80
|
+
Cursor or VS Code connected to WSL reads the same `~/.claude/settings.json`;
|
|
81
|
+
one on Windows has its own.
|
|
82
|
+
- It talks to port 8765. If you changed `LTT_PORT`, edit `APP` in
|
|
83
|
+
`mods/let-them-talk-suggestions/hooks/register.ts` to match, in a copy of the
|
|
84
|
+
repository loaded as above: Claude Code keeps an installed copy itself and
|
|
85
|
+
may replace it when the plugin updates.
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# How it works
|
|
2
|
+
|
|
3
|
+
Where the board's data comes from, how notes reach a chat, and what the app
|
|
4
|
+
stores.
|
|
5
|
+
|
|
6
|
+
## Sessions and cards
|
|
7
|
+
|
|
8
|
+
- Live sessions come from `~/.claude/sessions/*.json`; background agents that
|
|
9
|
+
aren't running come from `claude agents --json --all`. (With
|
|
10
|
+
[`CLAUDE_CONFIG_DIR`](configuration.md#environment-settings) set, that
|
|
11
|
+
folder takes the place of `~/.claude` here and below.)
|
|
12
|
+
- A card greys out when its session ends, and leaves the board about two
|
|
13
|
+
minutes later unless it has arrows.
|
|
14
|
+
- Titles, models and recent messages are read from its transcript in
|
|
15
|
+
`~/.claude/projects/`, and a chat's agents from the subagent and workflow
|
|
16
|
+
files next to it.
|
|
17
|
+
- Inside WSL, sessions of Claude Code on native Windows are read from
|
|
18
|
+
`%USERPROFILE%\.claude` while their `claude.exe` runs.
|
|
19
|
+
|
|
20
|
+
## Notes and messages
|
|
21
|
+
|
|
22
|
+
Notes are delivered by a short headless run,
|
|
23
|
+
`claude -p --model haiku --name let-them-talk`, whose only tool is
|
|
24
|
+
`SendMessage` (about 8 s); [`LTT_MODEL`](configuration.md#environment-settings)
|
|
25
|
+
picks another model.
|
|
26
|
+
|
|
27
|
+
Each note is then marked *sent*, *sent, reworded* or *failed*; until then its
|
|
28
|
+
arrow shows it is still sending (see [Arrows](usage.md#arrows)). If the
|
|
29
|
+
server restarts meanwhile, the run carries on without it, and the arrow is
|
|
30
|
+
settled from the chats' transcripts: *sent* once the note shows up there,
|
|
31
|
+
*failed* if it hasn't within 3½ minutes.
|
|
32
|
+
|
|
33
|
+
A message you send to a chat goes the same way, as *[Let Them Talk] Message
|
|
34
|
+
from your user:*, and a new editor chat's prompt as *[Let Them Talk] Your
|
|
35
|
+
user started this chat from Let Them Talk with this prompt:*. An idle
|
|
36
|
+
background agent gets yours as a prompt instead: typed into its prompt box
|
|
37
|
+
through `claude attach` while its process runs, or with
|
|
38
|
+
`claude --resume <id> --bg` once that has ended.
|
|
39
|
+
|
|
40
|
+
## Images
|
|
41
|
+
|
|
42
|
+
An image you send is saved under a random name, readable only by you, in the
|
|
43
|
+
chat's own folder in Claude Code's temporary folder
|
|
44
|
+
(`/tmp/claude-<uid>/<project>/let-them-talk-images/`). Your text gets a line
|
|
45
|
+
`[Image: source: <path>]` for it, the way Claude Code names an image you
|
|
46
|
+
paste. The chat opens it with its Read tool without asking, as it does its
|
|
47
|
+
own files there.
|
|
48
|
+
|
|
49
|
+
Images older than a week are deleted the next time an image is saved.
|
|
50
|
+
|
|
51
|
+
## An arrow's conversation
|
|
52
|
+
|
|
53
|
+
An arrow's **Conversation** is read from both chats' transcripts. A message
|
|
54
|
+
belongs to it when its message id is in one chat's `SendMessage` call and in
|
|
55
|
+
the other's transcript, or when it went to the other chat's own socket (*not
|
|
56
|
+
read yet* until it shows up there).
|
|
57
|
+
|
|
58
|
+
Matching by name is a last resort, used only when one side's transcript is
|
|
59
|
+
gone (*read state unknown* if it was the receiver's). A→B and B→A arrows show
|
|
60
|
+
the same messages between the two chats, each with its own notes.
|
|
61
|
+
|
|
62
|
+
## TL;DRs
|
|
63
|
+
|
|
64
|
+
A TL;DR is written by `claude -p` on the same model as notes, with no tools
|
|
65
|
+
(about 7 s). It is written once per finished reply of 280+ characters, only
|
|
66
|
+
when you open that chat, and kept in memory until the server restarts.
|
|
67
|
+
|
|
68
|
+
## Handoffs
|
|
69
|
+
|
|
70
|
+
A handoff is written by `claude -p --resume <id> --fork-session` on the
|
|
71
|
+
chat's own model, running the app's `/handoff` skill over the whole
|
|
72
|
+
conversation. The skill is loaded for that run only, with
|
|
73
|
+
`--plugin-dir mods/let-them-talk-handoff`; your own skills are left as they
|
|
74
|
+
are. It takes a few seconds to minutes and costs about one reply of that
|
|
75
|
+
chat. The fork is not saved.
|
|
76
|
+
|
|
77
|
+
Nobody can answer the fork, so it edits files without asking
|
|
78
|
+
(`acceptEdits`), in the chat's folder and in the handoff folder (see
|
|
79
|
+
[What is stored where](#what-is-stored-where)). It is told only to write the
|
|
80
|
+
handoff there; nothing else stops it from editing the chat's files.
|
|
81
|
+
|
|
82
|
+
## Compacting
|
|
83
|
+
|
|
84
|
+
**Compact** types `/compact` into a running background agent through
|
|
85
|
+
`claude attach`, as a prompt is typed, pressing Enter only once its prompt
|
|
86
|
+
box shows `/compact`. An ended one is woken with
|
|
87
|
+
`claude --resume <id> --bg -- /compact`, which Claude Code runs as the
|
|
88
|
+
command too. A chat in a terminal or an editor gets only messages, read
|
|
89
|
+
between steps, and a message can't run a command, so it has no **Compact**.
|
|
90
|
+
|
|
91
|
+
Claude Code writes the result into the agent's transcript once it is done
|
|
92
|
+
(seconds, or a minute or two for a long conversation): a compact boundary
|
|
93
|
+
with the context's size before and after, then `/compact`'s answer. The app
|
|
94
|
+
reads what the transcript gets after you click. It stops waiting after 8
|
|
95
|
+
minutes, or once the agent is neither busy nor done for a few seconds (Esc in
|
|
96
|
+
its terminal, or it ended). Meanwhile it doesn't look up ultracode (see
|
|
97
|
+
[Ultracode](usage.md#ultracode)) in that agent.
|
|
98
|
+
|
|
99
|
+
## Reply suggestions
|
|
100
|
+
|
|
101
|
+
The Send box shows the same grey suggestion as the chat's own prompt box, or
|
|
102
|
+
nothing:
|
|
103
|
+
|
|
104
|
+
- **A background agent that ends its turn waiting on you:** Claude Code saves
|
|
105
|
+
its suggestion in `~/.claude/jobs/<id>/state.json` (the one `claude agents`
|
|
106
|
+
offers with Tab), and the app reads it there. No setup, any agent. This job
|
|
107
|
+
file isn't an official Claude Code interface; if an update moves it, those
|
|
108
|
+
agents show nothing rather than wrong text.
|
|
109
|
+
- **Terminal chats, and background turns that don't wait on you:** Claude
|
|
110
|
+
Code saves the suggestion nowhere, so the
|
|
111
|
+
[suggestions mod](configuration.md#suggestions-mod) passes it on as it is
|
|
112
|
+
shown. When Claude Code makes none (the window isn't focused, or nobody is
|
|
113
|
+
attached) and the app has that chat's details open, the mod makes one the
|
|
114
|
+
way Claude Code does (one tool-less reply of the chat's own model over its
|
|
115
|
+
cached conversation). It puts it in the chat's prompt box too, so both
|
|
116
|
+
match.
|
|
117
|
+
- It first waits about 12 s for Claude Code's own.
|
|
118
|
+
- At most one per turn, none for chats nobody has open, and none once the
|
|
119
|
+
reply is more than 5 minutes old (its conversation may no longer be
|
|
120
|
+
cached).
|
|
121
|
+
- While the app waits for one (up to about 45 s after the reply, or after
|
|
122
|
+
you open the chat), the Send box says *Suggesting a reply…*.
|
|
123
|
+
- **Chats in Cursor or VS Code** show none, like their own composer: the
|
|
124
|
+
extension doesn't ask Claude Code for suggestions.
|
|
125
|
+
|
|
126
|
+
## The model of a Chat in IDE
|
|
127
|
+
|
|
128
|
+
An editor link can't name a model, so the
|
|
129
|
+
[suggestions mod](configuration.md#suggestions-mod) runs a **Chat in IDE**
|
|
130
|
+
started from the app on the model picked in
|
|
131
|
+
[New agent](usage.md#new-agent). The app tells the mod which model as the
|
|
132
|
+
chat's first turns start, and the mod names that model on the chat's own
|
|
133
|
+
requests, not its subagents'.
|
|
134
|
+
|
|
135
|
+
## Ultracode
|
|
136
|
+
|
|
137
|
+
Whether ultracode is on in a background agent (see
|
|
138
|
+
[Ultracode](usage.md#ultracode)) is read from its transcript: Claude Code
|
|
139
|
+
notes each `/effort` answered while the agent is idle ("Ultracode on …",
|
|
140
|
+
"Ultracode off …", or for `/effort status` a line that names ultracode only
|
|
141
|
+
while it is on), and at each prompt a reminder when it changed since the last
|
|
142
|
+
one. The newest of these counts, with what the app saw itself: a **Turn on**
|
|
143
|
+
or **Turn off**, or a look in its Effort panel.
|
|
144
|
+
|
|
145
|
+
- **While it works:** an `/effort` answers only on the agent's screen, and
|
|
146
|
+
its transcript gets nothing. In a background agent that loads the
|
|
147
|
+
[suggestions mod](configuration.md#suggestions-mod), the mod sees the
|
|
148
|
+
command run but not its answer. When `/effort ultracode …` or the Effort
|
|
149
|
+
panel gets no answer (an effort level alone leaves ultracode as it was, so
|
|
150
|
+
it doesn't count), it runs `/effort status` in the agent, once. Claude
|
|
151
|
+
Code queues it until the agent is idle, then notes its answer in the
|
|
152
|
+
transcript, where the app reads it like any other. The mod sends the app
|
|
153
|
+
nothing about it, and the app shows neither that line nor its queued entry
|
|
154
|
+
in the agent's messages. Without the mod, the agent's next prompt tells.
|
|
155
|
+
- **Only in background agents:** Claude Code starts one with
|
|
156
|
+
`CLAUDE_CODE_SESSION_KIND=bg`, which also makes its registry file's kind
|
|
157
|
+
`bg`, the kind the app reads. The mod runs `/effort status` only where that
|
|
158
|
+
variable says `bg`, so never in an ordinary terminal or IDE chat.
|
|
159
|
+
- **The app's own Turn on or off while it works:** the app reads Claude
|
|
160
|
+
Code's answer off the agent's screen, so it is in no transcript either.
|
|
161
|
+
The app keeps it on disk, as it does what a look in the Effort panel
|
|
162
|
+
showed, so a restart of the app loses neither.
|
|
163
|
+
- **Which process:** a switch the app keeps counts only while the process
|
|
164
|
+
that had it (by its pid) runs the agent, and only from when that process
|
|
165
|
+
started, so a later process that gets the same pid doesn't inherit it.
|
|
166
|
+
- **The panel opened only to look:** closed with Esc, Claude Code notes
|
|
167
|
+
"Cancelled", which changes nothing. Opened while the agent works, the mod's
|
|
168
|
+
`/effort status` reads what it left once the agent is idle.
|
|
169
|
+
|
|
170
|
+
## Moving an editor chat to a terminal
|
|
171
|
+
|
|
172
|
+
The editor's Claude panel runs a chat as a Claude Code process of its own
|
|
173
|
+
(entrypoint `claude-vscode`, in `~/.claude/sessions/<pid>.json`). Claude Code
|
|
174
|
+
doesn't stop a terminal from resuming a conversation that process still holds;
|
|
175
|
+
both would write its transcript. So **Open in terminal** first closes the one
|
|
176
|
+
in the editor, then opens `claude --resume <id>`.
|
|
177
|
+
|
|
178
|
+
- **How it is closed:** the process gets SIGINT, once you said yes. In the
|
|
179
|
+
mode the extension runs it in, Claude Code answers by ending its turn,
|
|
180
|
+
saving the conversation and exiting with code 0, which is what happens when
|
|
181
|
+
the extension closes a chat itself (it ends the process's input). SIGTERM
|
|
182
|
+
would exit with code 143, which the extension reports as an error in the
|
|
183
|
+
panel, so it isn't used. The app waits up to 10 seconds for the process to
|
|
184
|
+
go; if it stays, nothing opens in the terminal and the notice says to close
|
|
185
|
+
the tab in the editor.
|
|
186
|
+
- **What the editor shows:** the extension sees the process end the way it
|
|
187
|
+
does when you close the tab, with no error. Its panel keeps the
|
|
188
|
+
conversation and is not started again by itself; a message typed there later
|
|
189
|
+
starts it, and the extension, which reads the same session files, sees the
|
|
190
|
+
terminal holds the chat and asks before taking it back.
|
|
191
|
+
- **Which chats:** a chat on this machine whose process was started by the
|
|
192
|
+
editor. Windows chats can't be signalled from here.
|
|
193
|
+
|
|
194
|
+
## Security
|
|
195
|
+
|
|
196
|
+
The server listens only on 127.0.0.1 and answers only requests addressed to
|
|
197
|
+
`localhost` or `127.0.0.1` on its port. It takes commands only with its own
|
|
198
|
+
request header, which other web pages can't send, and tells browsers never to
|
|
199
|
+
show it in a frame.
|
|
200
|
+
|
|
201
|
+
## What is stored where
|
|
202
|
+
|
|
203
|
+
The first group lives in the app's *data folder*. Run from a copy of the
|
|
204
|
+
repository (`./start.sh`), that is the app's own folder. Installed with `uvx`
|
|
205
|
+
or `pipx`, it is `~/.local/share/let-them-talk` (`$XDG_DATA_HOME/let-them-talk`
|
|
206
|
+
if that is set; the same on macOS), so nothing is written next to the
|
|
207
|
+
installed code. [`LTT_DATA`](configuration.md#environment-settings) picks
|
|
208
|
+
another folder in both cases. The app's own short `claude -p` runs (notes,
|
|
209
|
+
TL;DRs, looking up a model's full id) start in the data folder too, and save
|
|
210
|
+
no conversation.
|
|
211
|
+
|
|
212
|
+
- `boards/`: the boards, a card's name included.
|
|
213
|
+
- `logs/relay.jsonl`: every note and message sent through the headless run.
|
|
214
|
+
- `logs/suggestions.json`: the mod's latest suggestions, kept for a day.
|
|
215
|
+
- `logs/models.json`: the model picked for each Chat in IDE, kept a week, so
|
|
216
|
+
a chat resumed within a week still runs on it.
|
|
217
|
+
- `logs/ultracode.json`: each chat's latest ultracode switch the app made or
|
|
218
|
+
saw in its Effort panel, with the pid of the process that had it, kept 30
|
|
219
|
+
days.
|
|
220
|
+
|
|
221
|
+
Elsewhere:
|
|
222
|
+
|
|
223
|
+
- `let-them-talk-handoffs` in the system's temp folder (`/tmp` on Linux and
|
|
224
|
+
WSL): the handoffs.
|
|
225
|
+
- Images you send: see [Images](#images).
|
|
226
|
+
- What the page keeps in your browser: see
|
|
227
|
+
[What the page remembers](usage.md#what-the-page-remembers).
|