@threadcrumbs/threadgauge 0.0.0-stage → 0.1.0
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.
- package/LICENSE.md +34 -0
- package/NOTICES.md +137 -0
- package/README.md +423 -3
- package/bin/threadgauge.mjs +99 -0
- package/dist/assets/atkinson-hyperlegible-mono-latin-ext-wght-normal-CXgNM06D.woff2 +0 -0
- package/dist/assets/atkinson-hyperlegible-mono-latin-wght-normal-CoA7y8X5.woff2 +0 -0
- package/dist/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/assets/barlow-latin-400-normal-qiz4-Cze.woff2 +0 -0
- package/dist/assets/barlow-latin-500-normal-BPAOfeC8.woff2 +0 -0
- package/dist/assets/barlow-latin-600-normal-DILqtrty.woff2 +0 -0
- package/dist/assets/barlow-latin-700-normal-A9pxMQ4z.woff2 +0 -0
- package/dist/assets/barlow-latin-ext-400-normal-HxX4XjxC.woff2 +0 -0
- package/dist/assets/barlow-latin-ext-500-normal-DOaysfXq.woff2 +0 -0
- package/dist/assets/barlow-latin-ext-600-normal-B8NK_A3D.woff2 +0 -0
- package/dist/assets/barlow-latin-ext-700-normal-BLuWmldJ.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-400-normal-DlzeKIMS.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-500-normal-G0uxJNrM.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-600-normal-BkLiAYu4.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-ext-400-normal-BDztQS4c.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-ext-500-normal-BXdp1BvY.woff2 +0 -0
- package/dist/assets/barlow-semi-condensed-latin-ext-600-normal-BkQ9hN72.woff2 +0 -0
- package/dist/assets/fira-code-latin-ext-wght-normal-Dvfvaomy.woff2 +0 -0
- package/dist/assets/fira-code-latin-wght-normal-CHoedHDv.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-400-normal-BmvZHCvU.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-500-normal-B1UMRPS4.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-600-normal-CdJSnjCb.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-ext-400-normal-BHj09Mzt.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-ext-500-normal-CDI94yGp.woff2 +0 -0
- package/dist/assets/fira-sans-condensed-latin-ext-600-normal-10nHsj_O.woff2 +0 -0
- package/dist/assets/fira-sans-latin-400-normal-a0AnQzuD.woff2 +0 -0
- package/dist/assets/fira-sans-latin-500-normal-Bvbxc8ch.woff2 +0 -0
- package/dist/assets/fira-sans-latin-600-normal-CXKlxLG9.woff2 +0 -0
- package/dist/assets/fira-sans-latin-700-normal-CRhwpWTq.woff2 +0 -0
- package/dist/assets/fira-sans-latin-ext-400-normal-BLG_mAEf.woff2 +0 -0
- package/dist/assets/fira-sans-latin-ext-500-normal-OO1QnNpY.woff2 +0 -0
- package/dist/assets/fira-sans-latin-ext-600-normal-DTQBTt1m.woff2 +0 -0
- package/dist/assets/fira-sans-latin-ext-700-normal-g2Yrd4J5.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-400-normal-DKyD6XsY.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-500-normal-BqaLkUoX.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-600-normal-CRd5VyFf.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-ext-400-normal-BJ9nxTJg.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-ext-500-normal--oYb3bSD.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-condensed-latin-ext-600-normal-CBdNZ9Ci.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-700-normal-Bxkt5Cjx.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/assets/ibm-plex-sans-latin-ext-700-normal-aMgXseD4.woff2 +0 -0
- package/dist/assets/inconsolata-latin-ext-wght-normal-C75G6mlG.woff2 +0 -0
- package/dist/assets/inconsolata-latin-wght-normal-DBskYKbm.woff2 +0 -0
- package/dist/assets/index-DGQBjXpa.js +2 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-tight-latin-ext-wght-normal-B4u9PlvR.woff2 +0 -0
- package/dist/assets/inter-tight-latin-wght-normal-DX-nOvPD.woff2 +0 -0
- package/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/assets/main-CEA6P2m0.js +2 -0
- package/dist/assets/preload-helper-BXl3LOEh.js +1 -0
- package/dist/assets/shell-DBhI_m_t.css +1 -0
- package/dist/assets/shell-fZRN8tMb.js +251 -0
- package/dist/assets/source-code-pro-latin-ext-wght-normal-0UZNSh4u.woff2 +0 -0
- package/dist/assets/source-code-pro-latin-wght-normal-BP8Zz55n.woff2 +0 -0
- package/dist/assets/source-sans-3-latin-ext-wght-normal-C8iNium2.woff2 +0 -0
- package/dist/assets/source-sans-3-latin-wght-normal-Bo_j9asI.woff2 +0 -0
- package/dist/favicon.svg +17 -0
- package/dist/index.html +16 -0
- package/package.json +75 -6
- package/server/api.mjs +188 -0
- package/server/details.mjs +64 -0
- package/server/history.mjs +65 -0
- package/server/http-server.mjs +87 -0
- package/server/lib/local-request.mjs +41 -0
- package/server/lib/open-url.mjs +16 -0
- package/server/lib/ports.mjs +54 -0
- package/server/license.mjs +100 -0
- package/server/monitor.mjs +136 -0
- package/server/open.mjs +49 -0
- package/server/paths.mjs +104 -0
- package/server/serve.mjs +8 -0
- package/server/threadnauts.mjs +23 -0
- package/server/threads.mjs +12 -0
- package/src/tiers.js +20 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Threadcrumbs LLC. All rights reserved.
|
|
4
|
+
|
|
5
|
+
This software is proprietary. Threadcrumbs LLC grants you a free, non-exclusive,
|
|
6
|
+
non-transferable license to install and run it, as published by Threadcrumbs LLC, on computers
|
|
7
|
+
you own or control, for your personal or internal business use.
|
|
8
|
+
|
|
9
|
+
Paid features, such as Threadgauge Pro, are licensed to you only as your license key and
|
|
10
|
+
subscription allow, under the terms you agreed to when you bought them.
|
|
11
|
+
|
|
12
|
+
You may not:
|
|
13
|
+
|
|
14
|
+
- copy, modify, merge, publish, distribute, sublicense, rent, or sell this software, in whole
|
|
15
|
+
or in part;
|
|
16
|
+
- reverse engineer, decompile, or disassemble it, except where the law allows this despite
|
|
17
|
+
this restriction;
|
|
18
|
+
- get around its license checks, or share a license key or paid content beyond what your
|
|
19
|
+
subscription allows.
|
|
20
|
+
|
|
21
|
+
This license ends automatically if you break these terms. When it ends, you must stop using
|
|
22
|
+
the software and delete your copies of it.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
25
|
+
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
|
|
26
|
+
NONINFRINGEMENT. TO THE FULLEST EXTENT THE LAW ALLOWS, IN NO EVENT SHALL THREADCRUMBS LLC BE
|
|
27
|
+
LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR
|
|
28
|
+
OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR ITS USE.
|
|
29
|
+
|
|
30
|
+
Any other use needs a separate written agreement with Threadcrumbs LLC
|
|
31
|
+
(hello@threadcrumbs.io).
|
|
32
|
+
|
|
33
|
+
Portions of this software are third-party code used under their own licenses, which are
|
|
34
|
+
reproduced in [NOTICES.md](NOTICES.md). Those licenses govern those portions.
|
package/NOTICES.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Notices
|
|
2
|
+
|
|
3
|
+
## Third-party
|
|
4
|
+
|
|
5
|
+
Threadgauge includes the following third-party software, used under its own license.
|
|
6
|
+
|
|
7
|
+
### Original source code
|
|
8
|
+
|
|
9
|
+
Portions of Threadgauge are derived from source code released under the MIT License.
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
MIT License
|
|
13
|
+
|
|
14
|
+
Copyright (c) 2026 Jarren Rocks
|
|
15
|
+
|
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
18
|
+
in the Software without restriction, including without limitation the rights
|
|
19
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
20
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
21
|
+
furnished to do so, subject to the following conditions:
|
|
22
|
+
|
|
23
|
+
The above copyright notice and this permission notice shall be included in all
|
|
24
|
+
copies or substantial portions of the Software.
|
|
25
|
+
|
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
+
SOFTWARE.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Fonts
|
|
36
|
+
|
|
37
|
+
The new interface includes these fonts as .woff2 files, from the @fontsource packages. Each is used under the SIL Open Font License, Version 1.1, which follows the list.
|
|
38
|
+
|
|
39
|
+
- Inter and Inter Tight: Copyright 2016 and 2022 The Inter Project Authors (https://github.com/rsms/inter)
|
|
40
|
+
- Barlow and Barlow Semi Condensed: Copyright 2017 The Barlow Project Authors (https://github.com/jpt/barlow)
|
|
41
|
+
- IBM Plex Sans, IBM Plex Sans Condensed, and IBM Plex Mono: Copyright 2017 and 2019 IBM Corp.
|
|
42
|
+
- Atkinson Hyperlegible Next: Copyright 2020-2024 The Atkinson Hyperlegible Next Project Authors (https://github.com/googlefonts/atkinson-hyperlegible-next)
|
|
43
|
+
- Atkinson Hyperlegible Mono: Copyright 2020-2024 The Atkinson Hyperlegible Mono Project Authors (https://github.com/googlefonts/atkinson-hyperlegible-next-mono)
|
|
44
|
+
- Fira Sans and Fira Sans Condensed: Copyright 2012-2015 The Mozilla Foundation and Telefonica S.A.
|
|
45
|
+
- Fira Code: Copyright 2014-2020 The Fira Code Project Authors (https://github.com/tonsky/FiraCode)
|
|
46
|
+
- Source Sans 3 and Source Code Pro: Copyright 2010-2020 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'
|
|
47
|
+
- JetBrains Mono: Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
|
48
|
+
- Inconsolata: Copyright 2006 The Inconsolata Project Authors (https://github.com/cyrealtype/Inconsolata)
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
52
|
+
-----------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
PREAMBLE
|
|
55
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
56
|
+
development of collaborative font projects, to support the font creation
|
|
57
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
58
|
+
open framework in which fonts may be shared and improved in partnership
|
|
59
|
+
with others.
|
|
60
|
+
|
|
61
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
62
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
63
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
64
|
+
redistributed and/or sold with any software provided that any reserved
|
|
65
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
66
|
+
however, cannot be released under any other type of license. The
|
|
67
|
+
requirement for fonts to remain under this license does not apply
|
|
68
|
+
to any document created using the fonts or their derivatives.
|
|
69
|
+
|
|
70
|
+
DEFINITIONS
|
|
71
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
72
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
73
|
+
include source files, build scripts and documentation.
|
|
74
|
+
|
|
75
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
76
|
+
copyright statement(s).
|
|
77
|
+
|
|
78
|
+
"Original Version" refers to the collection of Font Software components as
|
|
79
|
+
distributed by the Copyright Holder(s).
|
|
80
|
+
|
|
81
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
82
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
83
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
84
|
+
new environment.
|
|
85
|
+
|
|
86
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
87
|
+
writer or other person who contributed to the Font Software.
|
|
88
|
+
|
|
89
|
+
PERMISSION & CONDITIONS
|
|
90
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
91
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
92
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
93
|
+
Software, subject to the following conditions:
|
|
94
|
+
|
|
95
|
+
1) Neither the Font Software nor any of its individual components,
|
|
96
|
+
in Original or Modified Versions, may be sold by itself.
|
|
97
|
+
|
|
98
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
99
|
+
redistributed and/or sold with any software, provided that each copy
|
|
100
|
+
contains the above copyright notice and this license. These can be
|
|
101
|
+
included either as stand-alone text files, human-readable headers or
|
|
102
|
+
in the appropriate machine-readable metadata fields within text or
|
|
103
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
104
|
+
|
|
105
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
106
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
107
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
108
|
+
presented to the users.
|
|
109
|
+
|
|
110
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
111
|
+
Software shall not be used to promote, endorse or advertise any
|
|
112
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
113
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
114
|
+
permission.
|
|
115
|
+
|
|
116
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
117
|
+
must be distributed entirely under this license, and must not be
|
|
118
|
+
distributed under any other license. The requirement for fonts to
|
|
119
|
+
remain under this license does not apply to any document created
|
|
120
|
+
using the Font Software.
|
|
121
|
+
|
|
122
|
+
TERMINATION
|
|
123
|
+
This license becomes null and void if any of the above conditions are
|
|
124
|
+
not met.
|
|
125
|
+
|
|
126
|
+
DISCLAIMER
|
|
127
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
128
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
129
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
130
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
131
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
132
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
133
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
134
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
135
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
136
|
+
|
|
137
|
+
```
|
package/README.md
CHANGED
|
@@ -1,3 +1,423 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# Threadgauge — live telemetry for your coding agents
|
|
2
|
+
|
|
3
|
+
Threadgauge is a live dashboard of every coding agent working on this machine. It shows what each
|
|
4
|
+
one is doing right now, how full its context window is, what it has cost, how much code it has
|
|
5
|
+
changed, and how far through its plan it is.
|
|
6
|
+
|
|
7
|
+
It reads each harness's own files on your machine. Nothing about your threads is uploaded, and
|
|
8
|
+
there is no account to create. The only thing it ever sends is a Pro license key, and the
|
|
9
|
+
license that key earns, to the Threadcrumbs license service. On its own, it never writes to a
|
|
10
|
+
harness. Anything that would, such as adding a statusline or hooks to get data a harness doesn't
|
|
11
|
+
save to disk, will be a setting you switch on.
|
|
12
|
+
|
|
13
|
+
## Run it
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @threadcrumbs/threadgauge
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
You need Node 22.13 or newer. This serves the dashboard on port 5274 and opens it in your browser at
|
|
20
|
+
`http://localhost:5274`, the address Threadnauts links to, so your view settings are the same
|
|
21
|
+
either way. If it's already running, it opens that copy instead of starting a second one. If
|
|
22
|
+
something else holds the port, Threadgauge tries the next one, up to 20 ports, and tells you
|
|
23
|
+
where it ended up.
|
|
24
|
+
|
|
25
|
+
| Option | |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `-p`, `--port <number>` | Serve on this port, or the next free one |
|
|
28
|
+
| `--no-open` | Start without opening the browser |
|
|
29
|
+
| `-v`, `--version` | Print the version |
|
|
30
|
+
| `-h`, `--help` | Show the options |
|
|
31
|
+
|
|
32
|
+
### Next to Threadnauts
|
|
33
|
+
|
|
34
|
+
Threadnauts starts on 5274 too. Whichever app starts first gets 5274, and the other takes the
|
|
35
|
+
next free port. Before taking a port, Threadgauge checks both `127.0.0.1` and `::1`, because a
|
|
36
|
+
Vite dev server listens only on `::1`. If something answers on either, Threadgauge asks it what
|
|
37
|
+
it is. `GET /api/about` answers `{ "app": "threadgauge", "version": … }`. Threadgauge uses that
|
|
38
|
+
to recognize a copy of itself, and Threadnauts uses it to find the dashboard to open.
|
|
39
|
+
|
|
40
|
+
### From a checkout
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm install && pnpm dev
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You need [pnpm](https://pnpm.io/installation) too, and a checkout of
|
|
47
|
+
[threadcrumbs/common](https://github.com/threadcrumbs/common) beside this one, as `../common`. The
|
|
48
|
+
harness readers live there and are linked in.
|
|
49
|
+
- `pnpm dev` runs everything in one process, with the API inside the Vite dev server.
|
|
50
|
+
- `pnpm dev:demo` shows made-up demo threads instead of this computer's, for a look or a screenshot.
|
|
51
|
+
- `pnpm check:layout` checks the dev server with the demo threads at several window sizes, for
|
|
52
|
+
sideways scrolling, overflow, clipped text, and console errors.
|
|
53
|
+
- `pnpm test` runs the test suite.
|
|
54
|
+
- `pnpm start` builds and serves the built version.
|
|
55
|
+
- `pnpm serve` serves the built version if `dist/` already exists.
|
|
56
|
+
|
|
57
|
+
## Free and Pro
|
|
58
|
+
|
|
59
|
+
Everything Threadgauge shows is free. Seeing is free, and acting is Pro.
|
|
60
|
+
|
|
61
|
+
| | What it includes |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| **Threadgauge** | Every harness and every thread, [older ones](#older-threads) included: [the list](#the-thread-list), [the table](#the-table), [each thread's details](#a-threads-details), usage limits, Open, screenshots, and the explanation behind every figure |
|
|
64
|
+
| **Threadgauge Pro** | Arrives with Threadbare: answering, prompting, and messaging your agents from Threadgauge |
|
|
65
|
+
|
|
66
|
+
- **Alerts** come next, and they're free too, since they only read.
|
|
67
|
+
- **Nothing to buy yet:** Threadgauge Pro goes on sale when Threadbare's first piece ships. Until
|
|
68
|
+
then, the license row in Settings says so, and Respond in a thread's details says what's coming.
|
|
69
|
+
- **Release dates:** each Pro feature will have one. A license opens the features released while
|
|
70
|
+
its owner paid, so someone who stops paying keeps those and misses only the ones released after.
|
|
71
|
+
- **Development:** `pnpm dev` opens every Pro feature. Add `?free` to its address to see the free
|
|
72
|
+
tier.
|
|
73
|
+
|
|
74
|
+
### Entering a license key
|
|
75
|
+
|
|
76
|
+
Settings › Threadcrumbs › Threadgauge Pro has **Enter a key**, which opens the license box. Paste
|
|
77
|
+
the Threadcrumbs license key from your Polar receipt (it starts with `THREADCRUMBS-`) and choose
|
|
78
|
+
Activate.
|
|
79
|
+
- **One key for every app:** the same key comes with Threadnauts Pro, Threadgauge Pro, and the
|
|
80
|
+
bundle of both. The license says which apps the plan includes, and Threadgauge opens Pro only
|
|
81
|
+
when it includes Threadgauge Pro. Switching plans in Polar's customer portal keeps the key.
|
|
82
|
+
- **One activation per machine:** Threadgauge sends the key and this computer's device ID to the
|
|
83
|
+
Threadcrumbs license service, which checks it with Polar and returns a signed license. The
|
|
84
|
+
license and device ID go in one `license.json` that every Threadcrumbs app on this computer
|
|
85
|
+
shares, in `%APPDATA%\Threadcrumbs`, `~/Library/Application Support/Threadcrumbs`, or
|
|
86
|
+
`~/.local/share/threadcrumbs`. A key entered in Threadnauts counts here too, and the machine
|
|
87
|
+
uses one of the key's three device slots either way. Remove a computer in Polar's customer
|
|
88
|
+
portal to free its slot.
|
|
89
|
+
- **Checked offline:** the license is checked against public keys built into Threadgauge, with
|
|
90
|
+
no network call. While Threadgauge is open, it renews the license about once a week. A
|
|
91
|
+
license that can't renew keeps working for two weeks past its own two-week life.
|
|
92
|
+
- **Nothing is written** until you first activate a key.
|
|
93
|
+
- **Where keys go:** a built copy uses the license service at `threadcrumbs.io/api`. `pnpm dev`
|
|
94
|
+
uses the one running from `../cloud` at `localhost:8787/api`, and `THREADCRUMBS_CLOUD_URL`
|
|
95
|
+
points either one somewhere else.
|
|
96
|
+
|
|
97
|
+
## What it reads
|
|
98
|
+
|
|
99
|
+
Sessions from the last 24 hours, plus every live one, from each harness on the machine, and
|
|
100
|
+
[older threads](#older-threads) too. Threads you archived or deleted in the harness are left out:
|
|
101
|
+
|
|
102
|
+
| Harness | What it shows |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| **Claude Code** (Anthropic) | ✅ Everything in the next table, from the desktop app and the CLI |
|
|
105
|
+
| **Codex** (OpenAI) | ✅ Status, current tool, context, tokens, plan, subagents, lines counted from patches that applied, and its usage limits. No spend: Codex doesn't save it |
|
|
106
|
+
| **OpenCode**, **Kilo Code** | ✅ Status, current tool, context, tokens, spend, lines, plan, and subagents. OpenCode 2.x doesn't record lines |
|
|
107
|
+
| **Hermes** (Nous Research) | ✅ Status, current tool, context, tokens, spend, plan, and subagents. No lines |
|
|
108
|
+
| **Cursor** | ✅ Status, the tool it last called, plan, and subagents. Cursor saves no tokens, context, model, or spend |
|
|
109
|
+
| **Antigravity CLI** (Google) | ✅ Status and plan. Its transcript lands only after each turn, and it keeps tokens and context in a format that isn't read |
|
|
110
|
+
|
|
111
|
+
Only Claude Code has been checked against a real install. The other readers were built from each
|
|
112
|
+
harness's source code, or from the formats other open-source tools parse, and tested against fake
|
|
113
|
+
installs. Where a harness doesn't record something, Threadgauge shows "—" or "Not recorded".
|
|
114
|
+
|
|
115
|
+
For each Claude Code session it shows:
|
|
116
|
+
|
|
117
|
+
| | Where it comes from |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| Status | The live process's own record (`~/.claude/sessions/*.json`), how its transcript ends, and the Claude app's own record of the thread: whether you've read it, whether its turn is waiting on you, and whether you archived it |
|
|
120
|
+
| Tool running now, and for how long | A tool call in the transcript with no result yet |
|
|
121
|
+
| Context fill | The last reply's input, cache, and output tokens, against the model's `max_input_tokens` in Claude Code's model catalog cache |
|
|
122
|
+
| Tokens | Every reply's usage, counted once per message |
|
|
123
|
+
| Spend | Every reply's tokens at Anthropic's API list prices, subagents included, the same way Claude Code's `/usage` computes its total. A Pro or Max plan covers this usage, so it's not what a subscriber pays |
|
|
124
|
+
| Lines changed | Lines added and removed by Edit and Write, and by shell commands that changed files, subagents included |
|
|
125
|
+
| Plan progress | `TodoWrite` and `update_plan` calls |
|
|
126
|
+
| Subagents | `<session>/subagents/*.jsonl` transcripts still mid-turn |
|
|
127
|
+
|
|
128
|
+
## The thread list
|
|
129
|
+
|
|
130
|
+
The list down the left side holds every thread. Each row shows its organization and folder, the
|
|
131
|
+
harness's initials, a status lamp, the title, and what it's doing now: the tool running and for
|
|
132
|
+
how long, the subagents it's waiting on, or the question, command, or error it's stopped on.
|
|
133
|
+
Beside that are its context used as a small gauge, its output, and its lines changed, and under it
|
|
134
|
+
are its branch, worktree, model with effort bars, and plan ticks. Hold the pointer on a row for a
|
|
135
|
+
moment to peek at its figures, and click it for its details.
|
|
136
|
+
- **Status lamps** above the list count the threads in each status. Press one to show only that
|
|
137
|
+
status, or the total to show them all. The counts follow the repo filter and match Threadnauts'
|
|
138
|
+
for the same threads.
|
|
139
|
+
- **Search,** with `/` or the magnifier, filters by title, repo, branch, model, and what a thread
|
|
140
|
+
asks. Ctrl+K lists threads and actions in the same field.
|
|
141
|
+
- **The filter bar** says what's filtered, as in "4 of 22: Needs you in api", with Clear filters.
|
|
142
|
+
- **The footer** totals the live agents, output, and lines changed for the threads shown, each
|
|
143
|
+
with a picture, and has a gauge for each usage limit a harness records. So far that's Codex's
|
|
144
|
+
5-hour and weekly limits, which it saves in its own files.
|
|
145
|
+
- **The tab's title** counts the threads that need you, as in "(2) Threadgauge".
|
|
146
|
+
|
|
147
|
+
### Settings
|
|
148
|
+
|
|
149
|
+
The gear, or `?`, opens Settings in the list's place:
|
|
150
|
+
- **Threads:** Group by Turn (Your turn, Agents' turn, Idle), Live (live, the last 24 hours, then
|
|
151
|
+
older), Repo, or State. Sort by Needs you first, Longest wait, Most recent, Context used, or
|
|
152
|
+
Title. Repo shows one repo's threads, with each repo's count in the menu.
|
|
153
|
+
- **Look:** the font for text and the font for code.
|
|
154
|
+
- **Connection:** each harness and whether it's watched, and every usage limit in full. The Live
|
|
155
|
+
button in the list header opens it too.
|
|
156
|
+
- **Threadcrumbs:** the Threadgauge Pro license, and **Open Threadnauts colony** when Threadnauts
|
|
157
|
+
is running on this computer.
|
|
158
|
+
- **Keys:** every key, as in [the table below](#keys).
|
|
159
|
+
|
|
160
|
+
Your choices are remembered in this browser.
|
|
161
|
+
|
|
162
|
+
### Organizations
|
|
163
|
+
|
|
164
|
+
In the Repo grouping, each repo's header starts with its organization's name and a building icon,
|
|
165
|
+
and repos without one come first.
|
|
166
|
+
- **Where the name comes from:** the repo's own package name, such as `@threadcrumbs/site` in
|
|
167
|
+
`package.json`, or its Go module, Maven group, and the like. A thread working in a folder inside
|
|
168
|
+
a repo, like a crate in `math/engine`, uses the repo's package name. A repo with no package file
|
|
169
|
+
counts by its GitHub owner when another repo's package already names that organization.
|
|
170
|
+
- **Not from folders:** the folders the repos sit in don't count.
|
|
171
|
+
- **Same as Threadnauts:** this is `@threadcrumbs/common/orgs`, which Threadnauts uses too.
|
|
172
|
+
|
|
173
|
+
## The table
|
|
174
|
+
|
|
175
|
+
Close a thread on anything wider than a phone, and every thread fills the window as a table, under
|
|
176
|
+
the status lamps: where it is, the thread (its lamp, title, and what it's doing now), plan, lines,
|
|
177
|
+
context (a gauge and a sparkline), input, output, cache reads, prompts, and last active. Click a
|
|
178
|
+
heading to sort by it, and click a row to open that thread beside the list again. As the window
|
|
179
|
+
narrows, the table tightens and drops its sparklines and plan ticks before it ever scrolls
|
|
180
|
+
sideways. On a phone, closing a thread goes back to the list.
|
|
181
|
+
|
|
182
|
+
## Older threads
|
|
183
|
+
|
|
184
|
+
Threads from before the last 24 hours are listed too, in an **Older** group in the Live grouping,
|
|
185
|
+
and in their repos and states in the others.
|
|
186
|
+
- **Quick read:** an older thread's row shows its status, title, repo, branch, and when it was
|
|
187
|
+
last active, from the same quick read Threadnauts does of every thread. Its figures aren't read
|
|
188
|
+
until you open it, so the table leaves them blank.
|
|
189
|
+
- **Read when opened:** opening one reads that thread in full, so its details have everything a
|
|
190
|
+
recent thread's do. Claude Code is the only harness this works for so far; an older thread from
|
|
191
|
+
another harness says so.
|
|
192
|
+
- **Kept current:** the list of older threads is refreshed once a minute, and when a thread leaves
|
|
193
|
+
the last 24 hours.
|
|
194
|
+
|
|
195
|
+
## A thread's details
|
|
196
|
+
|
|
197
|
+
Click a thread for its details beside the list. The list stays live, and clicking another thread
|
|
198
|
+
switches. The address keeps the open thread (`#thread=…`), so a reload brings it back, and Back
|
|
199
|
+
closes it. How it fits depends on the window:
|
|
200
|
+
- **Side by side:** the list and the details share the window. Drag the handle between them, or
|
|
201
|
+
focus it and press Left or Right, to change the list's width, which is remembered. `[` collapses
|
|
202
|
+
the list to a narrow rail and shows it again.
|
|
203
|
+
- **Phones:** a short list sits above the details, with a bar between them that steps to the
|
|
204
|
+
previous or next thread, or shows the whole list. The Conversation opens from a card at the
|
|
205
|
+
bottom.
|
|
206
|
+
|
|
207
|
+
At the top are the thread's folder, branch, and worktree, the up and down arrows for the previous
|
|
208
|
+
and next thread, ×, the title, and a state line with its status, what it's doing, and its
|
|
209
|
+
harness's chip, which is the Open button. Under them:
|
|
210
|
+
- **The ask block** shows what a thread is stopped on: the question with its options, the command
|
|
211
|
+
waiting for approval, or the error and how many times it retried. It also shows the command
|
|
212
|
+
running now and the subagents and threads it's waiting on, each a link. Its buttons are Respond,
|
|
213
|
+
which says what Threadgauge Pro will add, and Open in the harness.
|
|
214
|
+
- **Latest prompt,** with Show all for a long one.
|
|
215
|
+
- **The Conversation,** which `R` or the button on the right edge opens: the thread's prompts and
|
|
216
|
+
replies, with the ask block's buttons on a card for anything that needs you.
|
|
217
|
+
|
|
218
|
+
The sections sit in up to four columns, Progress, Activity, Changes, and History, as the window
|
|
219
|
+
allows. Each one shows its main figure when it's collapsed, with a small picture beside it:
|
|
220
|
+
|
|
221
|
+
| Section | What it shows |
|
|
222
|
+
| --- | --- |
|
|
223
|
+
| Plan | Every step, with what's done and what's current, finished when the thread is done |
|
|
224
|
+
| Subagents | Every subagent it started, newest first, with its type, model, output, and what it's doing now. Finished ones stay listed, dimmed. For Claude Code, click one to see its own activity, tools, files, prompts, and context |
|
|
225
|
+
| Thoughts | The thinking the harness recorded, with the newest thought and when it came |
|
|
226
|
+
| Activity | The newest 100 tool calls: when each started, its target (a file, command, or search), how long it took, and whether it failed. A running call counts up live. Expand one for its full command or input and a failed call's own error output. Filter by tool, by failures, or by a reply's time on the context chart |
|
|
227
|
+
| Errors | API errors and failed turns, open by default when the thread's last turn failed |
|
|
228
|
+
| Files changed | Lines added and removed per file. Expand a file to see the agent's own changes as a diff, newest first, with line numbers where the harness records them. A note names any other thread from the last day that changed the same file, and links to it |
|
|
229
|
+
| Tools | Calls, time, and failures per tool, over the whole thread. Click a tool to show only its calls in Activity |
|
|
230
|
+
| Context | A gauge with the room left, what fills the window (messages, system prompt, built-in tools, MCP tools, skills, memory files, the space kept free for compacting, and free space, like Claude Code's `/context`), and context after every reply against the model's limit, with its compactions. Hover or click a reply on the chart for its value, and show that reply's calls in Activity |
|
|
231
|
+
| Prompts | Every prompt, newest first, with its time. Expand a long one to read all of it |
|
|
232
|
+
| Session | The session id, the command that resumes it in a terminal, its folder, project, branch, worktree, models and their spend, effort, duration, start time, and the file it was read from |
|
|
233
|
+
|
|
234
|
+
What each harness records differs:
|
|
235
|
+
- **Claude Code and Codex** fill in every section, except that Codex has no compactions or spend.
|
|
236
|
+
- **OpenCode and Kilo** have no compactions, Kilo has no per-file lines, and OpenCode 2.x has no files.
|
|
237
|
+
- **Hermes** has no per-reply history or files.
|
|
238
|
+
- **Cursor** saves no times or results for its tool calls, and no tokens.
|
|
239
|
+
- **Antigravity** has a step log, prompts, the plan, and errors.
|
|
240
|
+
|
|
241
|
+
A section a harness doesn't record says "Not recorded", and a note at the end says what's
|
|
242
|
+
missing and why. Every figure and section label opens a tip that says what it means for that
|
|
243
|
+
thread's harness, with a larger picture and links to the harness's own docs where they help.
|
|
244
|
+
|
|
245
|
+
### Copy and open
|
|
246
|
+
|
|
247
|
+
- **Copy:** anything you'd copy has a copy button: the session id, the resume command, branch
|
|
248
|
+
and worktree names, a call's command or input, its error, a prompt, and an error message.
|
|
249
|
+
- **Paths:** every file and folder path has two buttons, one to copy its full path and one to
|
|
250
|
+
open it.
|
|
251
|
+
- **Files** open in your editor at the line the agent last changed, or at the line it read.
|
|
252
|
+
"Open files in", in Files changed, picks VS Code, Cursor, Windsurf, Zed, or the default app,
|
|
253
|
+
and is remembered in this browser.
|
|
254
|
+
- **Folders** open in Explorer, Finder, or your file manager.
|
|
255
|
+
- **What it will open:** Threadgauge opens only files and folders that thread touched: the files
|
|
256
|
+
it changed or named in a tool call, its folders, its Markdown memory files, and its transcript.
|
|
257
|
+
- **Nothing runs:** with "Default app" chosen, a file Windows or macOS would run instead of open,
|
|
258
|
+
such as a script, a program, a shortcut, or an installer, is shown selected in File Explorer or
|
|
259
|
+
Finder instead.
|
|
260
|
+
|
|
261
|
+
## Keys
|
|
262
|
+
|
|
263
|
+
| Key | What it does |
|
|
264
|
+
| --- | --- |
|
|
265
|
+
| N | Goes to the next thread waiting on you: first the ones that need you, then finished ones, newest first, and opens its details |
|
|
266
|
+
| J, K | Next and previous thread, in the list's order |
|
|
267
|
+
| Enter | Opens the thread in its harness, unless a button or field has focus |
|
|
268
|
+
| Esc | Steps back: closes a tip, Settings, or a subagent, then the thread |
|
|
269
|
+
| P | Saves a screenshot |
|
|
270
|
+
| ? | Opens Settings |
|
|
271
|
+
| [ | Collapses the list, or shows it again |
|
|
272
|
+
| R | Opens or closes the Conversation |
|
|
273
|
+
| / | Searches threads |
|
|
274
|
+
| Ctrl+K | Searches threads and actions |
|
|
275
|
+
|
|
276
|
+
Keys do nothing while you're typing or with Ctrl, Alt, or Cmd held, except Ctrl+K.
|
|
277
|
+
|
|
278
|
+
## Opening a thread
|
|
279
|
+
|
|
280
|
+
The harness chip in a thread's state line, and Open in its ask block, hand the thread to the
|
|
281
|
+
harness it came from, the same way Threadnauts does.
|
|
282
|
+
- **A thread running in a terminal:** that terminal's window comes to the front.
|
|
283
|
+
- **Claude Code:** the desktop app opens on the thread.
|
|
284
|
+
- **Other harnesses:** their own deep link.
|
|
285
|
+
- **Linux with no desktop app:** the harness's CLI resumes the thread in a new terminal.
|
|
286
|
+
- **When nothing on the computer opens the link:** Claude Code first tries VS Code's Claude Code
|
|
287
|
+
extension and says so. Otherwise a dialog names the app that's missing, with a link to download
|
|
288
|
+
it and to any other app that would do, and offers to open the thread in a terminal instead when
|
|
289
|
+
the harness's CLI is installed.
|
|
290
|
+
|
|
291
|
+
A message in the corner says what happened. Cursor has no link to a single thread, so its Open
|
|
292
|
+
opens the repo in Cursor and says so. Hermes threads have no Open, because Hermes has nothing to
|
|
293
|
+
link to.
|
|
294
|
+
|
|
295
|
+
## Threadnauts
|
|
296
|
+
|
|
297
|
+
If Threadnauts is running on this computer, Settings › Threadcrumbs shows **Open Threadnauts
|
|
298
|
+
colony**, which opens it in its own tab, reusing that tab after the first time. Threadgauge looks
|
|
299
|
+
for it every 30 seconds and whenever its window gets focus, on ports 5274 to 5293, the same way
|
|
300
|
+
Threadnauts finds Threadgauge.
|
|
301
|
+
|
|
302
|
+
## Screenshots
|
|
303
|
+
|
|
304
|
+
The camera button in the list header, or P, saves a PNG of the window as it looks right now,
|
|
305
|
+
named `threadgauge-<date>-<time>.png`. It's at the screen's own resolution, so a 1440 × 900 window
|
|
306
|
+
on a 2× display makes a 2880 × 1800 image, with the fonts drawn in. The open details, where each
|
|
307
|
+
list is scrolled to, and any message in the corner are all in it. The page draws it itself, so the
|
|
308
|
+
browser never asks to share your screen, and its tabs and toolbar aren't in the picture.
|
|
309
|
+
|
|
310
|
+
## What moves
|
|
311
|
+
|
|
312
|
+
Anything happening right now moves:
|
|
313
|
+
- **Live threads:** a working thread's status lamp moves, and so does a running tool call's line in
|
|
314
|
+
Activity.
|
|
315
|
+
- **The context chart:** a ring pings from the newest point while the thread is live.
|
|
316
|
+
|
|
317
|
+
Anything that changes flashes once: figures and totals, a status that changes, and rows that
|
|
318
|
+
change, such as a call that finishes or a plan step that moves on. New rows fade in.
|
|
319
|
+
|
|
320
|
+
With reduced motion turned on in the operating system, none of it moves.
|
|
321
|
+
|
|
322
|
+
Each status uses the same color as in Threadnauts, and they're listed in this order, most urgent
|
|
323
|
+
first:
|
|
324
|
+
|
|
325
|
+
| Status | Means |
|
|
326
|
+
| --- | --- |
|
|
327
|
+
| Needs you | Stopped on a question or permission prompt only you can answer, or, for Claude Code, a turn the Claude app marked as waiting on you |
|
|
328
|
+
| Error | The last turn failed |
|
|
329
|
+
| Done | It's your turn: the turn ended in the last 30 minutes, or earlier and you haven't read the reply. Codex, Hermes, and OpenCode 2.x record when you read a thread, so for them only that counts |
|
|
330
|
+
| Working | Running right now |
|
|
331
|
+
| Waiting on agents | Its own work is paused until the subagents it started finish or, for Claude Code, until another session it asked to hear from goes quiet. The row names them: "Waiting on 2 subagents" or "Waiting on Threadnauts main", and the details link to each one |
|
|
332
|
+
| Idle | Nothing is running for it, and you've seen its last reply |
|
|
333
|
+
|
|
334
|
+
## How it stays live
|
|
335
|
+
|
|
336
|
+
The server watches the harness folders and sends changes to the page with
|
|
337
|
+
[server-sent events](https://developer.mozilla.org/docs/Web/API/Server-sent_events).
|
|
338
|
+
- **Reading:** a transcript is read in full once, and after that only the bytes added since the
|
|
339
|
+
last read.
|
|
340
|
+
- **Batching:** bursts of file events are grouped into one scan every quarter second.
|
|
341
|
+
- **Heartbeat:** a scan every 5 seconds catches anything the file watcher missed, such as a
|
|
342
|
+
process that has exited.
|
|
343
|
+
|
|
344
|
+
## Keeping it local
|
|
345
|
+
|
|
346
|
+
These work the same way as in Threadnauts:
|
|
347
|
+
- **Loopback only:** the server binds to `127.0.0.1`.
|
|
348
|
+
- **Host check:** it refuses any request whose `Host` isn't this machine, which stops DNS
|
|
349
|
+
rebinding.
|
|
350
|
+
- **Origin check:** a request that names an `Origin` is answered only when it's this server's own
|
|
351
|
+
page, with the same host and port, so a page on another port of this machine is refused too. A
|
|
352
|
+
request with no `Origin`, such as Threadnauts' server reading `/api/sessions`, may only read.
|
|
353
|
+
- **JSON only:** every POST needs `Content-Type: application/json`, which a form or a plain-text
|
|
354
|
+
request from another page can't send without asking first.
|
|
355
|
+
- **Why it's strict:** `/api/sessions` and the stream carry each thread's current command line,
|
|
356
|
+
clipped, and the question or command it's stopped on, not just titles.
|
|
357
|
+
- **Content-Security-Policy:** the built page only runs its own script, can't be framed, and
|
|
358
|
+
only talks to this server. The server, not the page, talks to the license service.
|
|
359
|
+
|
|
360
|
+
`THREADGAUGE_HOST` changes the address it binds to. `THREADGAUGE_ALLOWED_HOSTS` adds extra host
|
|
361
|
+
names that pass the checks, separated by commas. Anyone who can reach the port can see every
|
|
362
|
+
session title, folder, and branch, so only widen it on a network you trust.
|
|
363
|
+
|
|
364
|
+
## Layout
|
|
365
|
+
|
|
366
|
+
```
|
|
367
|
+
bin/threadgauge.mjs the `threadgauge` command: picks a port and opens the browser
|
|
368
|
+
server/
|
|
369
|
+
lib/ port search, the local-request check, opening a URL
|
|
370
|
+
monitor.mjs watches every harness, keeps the current sessions, reports changes
|
|
371
|
+
threads.mjs the quick read of every thread, for older threads
|
|
372
|
+
history.mjs older threads, and reading one in full when it's opened
|
|
373
|
+
api.mjs /api/about, /api/entitlements, /api/sessions, /api/sessions/<id> (and its
|
|
374
|
+
/hunks and /subagents/<id>), /api/history, /api/stream, /api/threadnauts,
|
|
375
|
+
POST /api/open, POST /api/open-path, POST /api/license
|
|
376
|
+
details.mjs the details' data: details without diff lines, other threads that changed the
|
|
377
|
+
same files, and the resume command
|
|
378
|
+
paths.mjs opens a file or folder the thread touched, in an editor or the file manager
|
|
379
|
+
license.mjs reads the shared license, activates and renews it with the license service
|
|
380
|
+
open.mjs finds a thread's ref through its harness adapter, opens it, and writes its
|
|
381
|
+
resume command
|
|
382
|
+
threadnauts.mjs finds a running Threadnauts for Settings' link
|
|
383
|
+
http-server.mjs serves the built page, with the API and security headers
|
|
384
|
+
src/
|
|
385
|
+
main.js the boot screen, then the app
|
|
386
|
+
live.js the page's end of the event stream, the details fetch, and Open
|
|
387
|
+
arrange.js grouping, sorting, and filtering threads
|
|
388
|
+
tiers.js the Pro features and their release dates, shared with the server
|
|
389
|
+
format.js numbers, money, durations, times, model names
|
|
390
|
+
next/ the app: the list, table, details, Conversation, Settings, keys, and layout
|
|
391
|
+
pictures/ the gauges and small charts, as SVG strings
|
|
392
|
+
theme/ colors, type, spacing, status colors, and the fonts
|
|
393
|
+
ui/ shared parts: the mark, editors, the "?" text, screenshots, the license box
|
|
394
|
+
tools/
|
|
395
|
+
demo/ the demo threads that `pnpm dev:demo` serves
|
|
396
|
+
audit/, layout-audit.mjs `pnpm check:layout`
|
|
397
|
+
test/ node --test
|
|
398
|
+
site/ the threadgauge.io website, HTML and CSS plus copy.js for the copy buttons
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
`site/` is deployed and previewed with the other Threadcrumbs sites;
|
|
402
|
+
[threadcrumbs/site](https://github.com/threadcrumbs/site)'s README has both.
|
|
403
|
+
|
|
404
|
+
The telemetry readers themselves, one per harness, are in `@threadcrumbs/common/telemetry`. Their
|
|
405
|
+
contract and tests live in the common repo, beside the session readers Threadnauts uses:
|
|
406
|
+
|
|
407
|
+
```
|
|
408
|
+
../common/telemetry/ one telemetry reader per harness (README.md is the contract)
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Publishing a release
|
|
412
|
+
|
|
413
|
+
Write the release notes as a `## <version>` entry in `../threadgauge-community/CHANGELOG.md` and
|
|
414
|
+
commit them. Then, from this folder, run `pnpm auto-publish` with `patch`, `minor` or `major`, or
|
|
415
|
+
with nothing to publish the version already in `package.json`. Add `--dry-run` first to see the
|
|
416
|
+
plan. It publishes `@threadcrumbs/common` first if it changed, then tests, builds, publishes, tags,
|
|
417
|
+
and pushes, which deploys threadgauge.io. The whole sequence is described in
|
|
418
|
+
`../common/README.md`.
|
|
419
|
+
|
|
420
|
+
## License
|
|
421
|
+
|
|
422
|
+
Proprietary. See [LICENSE.md](LICENSE.md). Portions are derived from MIT-licensed source code, whose
|
|
423
|
+
notice is in [NOTICES.md](NOTICES.md).
|