termdeck-cli 1.0.2 โ 2.0.2
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/README.md +195 -174
- package/package.json +9 -7
- package/sample-config.json +176 -0
- package/src/agentManager.js +217 -0
- package/src/config.js +636 -427
- package/src/dashboard.js +502 -198
- package/src/devServer.js +51 -2
- package/src/index.js +103 -9
- package/src/processMonitor.js +168 -0
- package/src/projectManager.js +159 -0
- package/src/updater.js +172 -0
- package/src/util.js +23 -0
- package/bin/termdeck.js +0 -22
package/README.md
CHANGED
|
@@ -1,233 +1,254 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# ๐ฅ๏ธ termdeck
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
each one three actions:
|
|
5
|
+
**A beautiful, terminal-based project dashboard to manage your local dev environments, services, and AI coding agents.**
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
| **Dev Server** | runs `npm run dev` **inside termdeck** โ stdout/stderr stream into the scrollable log pane below (no extra terminal window), then the localhost URL is detected and opened in your default browser |
|
|
11
|
-
| **Editor** | opens a **brand new OS terminal window**, `cd`s into the project and runs `code .` |
|
|
12
|
-
| **Agent** | opens a **brand new OS terminal window**, `cd`s into the project and runs `opencode` (placeholder โ configurable) |
|
|
13
|
-
|
|
14
|
-
Everything is keyboard driven *and* mouse driven: the three CTAs are clickable
|
|
15
|
-
buttons, the project list is click-selectable, and the mouse wheel scrolls the
|
|
16
|
-
logs.
|
|
7
|
+
[](https://www.npmjs.com/package/termdeck)
|
|
8
|
+
[](https://github.com/barigalasunil/termdeck/blob/main/LICENSE)
|
|
17
9
|
|
|
18
10
|
```
|
|
19
11
|
+----------------------------------------------------------------------+
|
|
20
|
-
| termdeck
|
|
12
|
+
| termdeck 14 projects ยท ~/dev/projects โ 2 dev servers running |
|
|
21
13
|
+------------------------+---------------------------------------------+
|
|
22
14
|
| projects | selected project |
|
|
23
|
-
| โ api [
|
|
24
|
-
| โ alpha [
|
|
25
|
-
| โ blog [
|
|
26
|
-
| โ lab [
|
|
27
|
-
| |
|
|
15
|
+
| โ api [live] | alpha โ live |
|
|
16
|
+
| โ alpha [live] | ~/dev/projects/alpha main ยท 8a2f1 (2d ago)|
|
|
17
|
+
| โ blog [exp] | marketing site |
|
|
18
|
+
| โ lab [scrap] | โ dev server running (pid 8123) โ localhost |
|
|
19
|
+
| | cpu 3.2% ยท mem 214MB |
|
|
28
20
|
+------------------------+---------------------------------------------+
|
|
29
|
-
|
|
|
30
|
-
| +---------------------------------------------+
|
|
31
|
-
| | dev server logs |
|
|
32
|
-
| | 12:04:11 alpha [termdeck] $npm run dev |
|
|
33
|
-
| | 12:04:12 alpha โ Local: http://localhost:51 |
|
|
21
|
+
| dev [r] status [s] search [/] ... |
|
|
34
22
|
+------------------------+---------------------------------------------+
|
|
35
|
-
|
|
|
23
|
+
| dev server logs |
|
|
24
|
+
| 12:04:11 alpha [termdeck] $npm run dev |
|
|
25
|
+
| 12:04:12 alpha โ Local: http://localhost:5173 |
|
|
36
26
|
+----------------------------------------------------------------------+
|
|
37
27
|
```
|
|
38
28
|
|
|
39
|
-
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## โจ Features
|
|
34
|
+
|
|
35
|
+
- ๐ฏ **Centralized Dashboard** โ See every project, its status (live, exp, pend, scrap), git state (branch, last commit), current process stats, and dev server state in one place.
|
|
36
|
+
- โก **In-Terminal Dev Servers** โ Run `npm run dev` and stream the logs inside the dashboard. Auto-opens the browser. **Crash recovery** restarts a dead server up to 3 times.
|
|
37
|
+
- ๐ **One-Click External Tools** โ Launch your editor or an AI coding agent (claude, codex, opencode, freebuff, kilocode) in a new terminal window, with agent logs tailed back into the dashboard.
|
|
38
|
+
- ๐ **Live Search & Filtering** โ Type `/` to search projects by name; press `1`โ`5` to filter by status chip.
|
|
39
|
+
- ๏ธ **Mouse & Keyboard Support** โ Fully navigable with mouse clicks, Tab/Shift+Tab focus cycling, and keyboard shortcuts.
|
|
40
|
+
- ๐พ **Persistent, Self-Healing Config** โ Interactive first-run setup saves `~/.termdeck-config.json`; the `--scan` wizard merges new projects without losing your custom agent configs.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## ๐ฆ Installation
|
|
45
|
+
|
|
46
|
+
### Global Install (Recommended)
|
|
40
47
|
|
|
41
48
|
```bash
|
|
42
49
|
npm install -g termdeck
|
|
43
|
-
termdeck
|
|
44
50
|
```
|
|
45
51
|
|
|
46
|
-
|
|
47
|
-
Terminal, iTerm, โฆ). No Docker, no daemon, no background service.
|
|
52
|
+
This installs the `termdeck` command anywhere.
|
|
48
53
|
|
|
49
|
-
|
|
54
|
+
### One-Off Run
|
|
50
55
|
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
```bash
|
|
57
|
+
npx termdeck
|
|
58
|
+
```
|
|
53
59
|
|
|
54
|
-
|
|
55
|
-
folders like `~/Projects`, plus every drive letter on Windows) or type a path.
|
|
56
|
-
2. **Which folders are projects?** โ multi-select with <kbd>space</kbd>, confirm
|
|
57
|
-
with <kbd>enter</kbd>.
|
|
58
|
-
3. **Status + description per folder** โ `Experimental`, `Live`, `Working` or
|
|
59
|
-
`Pending`, plus a one line blurb.
|
|
60
|
+
> **Note:** Requires Node.js 16+ and a real terminal (macOS/Linux Terminal, Windows Terminal, iTerm, etc.). No Docker, no daemon, no background service.
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
`termdeck --setup` (existing answers are pre-filled as defaults).
|
|
62
|
+
### Auto-Updates
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
On every dashboard launch termdeck silently checks the npm registry for a newer version. When one exists it installs `termdeck@latest` in the background โ no confirmation, no restart. Offline, slow or unreachable registries are ignored: you simply keep running the installed version.
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
| --- | --- |
|
|
68
|
-
| <kbd>โ</kbd>/<kbd>โ</kbd>, <kbd>j</kbd>/<kbd>k</kbd> | select a project (or click it) |
|
|
69
|
-
| <kbd>d</kbd> | start the dev server for the selection (or click **Dev Server**) |
|
|
70
|
-
| <kbd>e</kbd> | open the editor in a new terminal window (or click **Editor**) |
|
|
71
|
-
| <kbd>a</kbd> | open the agent in a new terminal window (or click **Agent**) |
|
|
72
|
-
| <kbd>x</kbd> | stop the selected project's dev server |
|
|
73
|
-
| <kbd>r</kbd> | reload the config file from disk |
|
|
74
|
-
| <kbd>PgUp</kbd>/<kbd>PgDn</kbd>, wheel | scroll the log pane (pauses following, shows how many lines arrived) |
|
|
75
|
-
| <kbd>shift</kbd>+<kbd>G</kbd>, <kbd>end</kbd> | jump back to live logs |
|
|
76
|
-
| <kbd>home</kbd> | jump to the start of the log history |
|
|
77
|
-
| <kbd>q</kbd>, <kbd>ctrl</kbd>+<kbd>c</kbd> | quit โ every dev server termdeck started is stopped first |
|
|
66
|
+
Disable the check on an individual run with:
|
|
78
67
|
|
|
79
|
-
|
|
68
|
+
```bash
|
|
69
|
+
termdeck --no-update
|
|
70
|
+
```
|
|
80
71
|
|
|
81
|
-
|
|
72
|
+
### Manual Upgrade
|
|
82
73
|
|
|
74
|
+
```bash
|
|
75
|
+
npm update -g termdeck
|
|
76
|
+
# or, to force the very latest release:
|
|
77
|
+
npm install -g termdeck@latest
|
|
83
78
|
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
termdeck --no-open never auto-open the browser
|
|
89
|
-
termdeck --help
|
|
79
|
+
|
|
80
|
+
### Check the Installed Version
|
|
81
|
+
|
|
82
|
+
```bash
|
|
90
83
|
termdeck --version
|
|
84
|
+
# or inspect the global install directly
|
|
85
|
+
npm list -g termdeck
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## ๐๏ธ Uninstall
|
|
91
|
+
|
|
92
|
+
To completely remove termdeck from your system:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm uninstall -g termdeck
|
|
91
96
|
```
|
|
92
97
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"editorCommand": "code .",
|
|
104
|
-
"agentCommand": "opencode",
|
|
105
|
-
"openBrowser": true,
|
|
106
|
-
"projects": [
|
|
107
|
-
{
|
|
108
|
-
"name": "alpha",
|
|
109
|
-
"path": "/home/you/Projects/alpha",
|
|
110
|
-
"status": "Working",
|
|
111
|
-
"info": "marketing site with a Next.js frontend"
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
98
|
+
This removes the global package and the `termdeck` command.
|
|
99
|
+
Your project configuration at `~/.termdeck-config.json` is preserved.
|
|
100
|
+
To delete the config file as well:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# macOS/Linux
|
|
104
|
+
rm ~/.termdeck-config.json
|
|
105
|
+
|
|
106
|
+
# Windows PowerShell
|
|
107
|
+
Remove-Item ~\.termdeck-config.json
|
|
115
108
|
```
|
|
116
109
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## ๐ First Run & Configuration
|
|
113
|
+
|
|
114
|
+
On first launch termdeck detects that no `~/.termdeck-config.json` exists and runs an interactive setup wizard:
|
|
115
|
+
|
|
116
|
+
1. **Which directory holds your projects?** โ Pick from suggestions (common folders like `~/Projects`, `~/dev`, plus every drive letter on Windows) or type a path.
|
|
117
|
+
2. **Which folders are projects?** โ termdeck scans the directory and shows only folders that contain a `.git` directory or a `package.json` manifest. Multi-select with <kbd>Space</kbd>, confirm with <kbd>Enter</kbd>.
|
|
118
|
+
3. **Per-project details** โ For each project you pick, termdeck asks its status (`live`, `exp`, `pend` or `scrap`, default `exp`), the dev-server port (default `3000`) and the package manager (`npm`, `pnpm` or `yarn` โ auto-detected from `pnpm-lock.yaml` / `yarn.lock`).
|
|
119
|
+
|
|
120
|
+
Every later launch skips straight to the dashboard.
|
|
121
|
+
|
|
122
|
+
> **Tip:** You can manually edit `~/.termdeck-config.json` if needed. Press <kbd>r</kbd> in the dashboard to reload.
|
|
123
|
+
|
|
124
|
+
---
|
|
121
125
|
|
|
122
|
-
|
|
126
|
+
## โจ๏ธ Usage & Controls
|
|
127
|
+
|
|
128
|
+
### CLI Flags
|
|
129
|
+
|
|
130
|
+
| Command | What it does |
|
|
123
131
|
| --- | --- |
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
is attached to a terminal. Each stream is split into lines and pushed into the
|
|
136
|
-
blessed-contrib `log` widget in the dashboard (batched every 120 ms โ dev
|
|
137
|
-
servers can emit hundreds of lines per second). Every line is scanned for a
|
|
138
|
-
localhost URL (`http://localhost:5173/`, `0.0.0.0:3000`, `listening on port
|
|
139
|
-
4200`, โฆ); the first hit is normalised, and after a short delay the `open`
|
|
140
|
-
package launches your default browser. If no URL shows up within ~9 seconds,
|
|
141
|
-
termdeck assumes `http://localhost:<port || 3000>` and says so in the log pane.
|
|
142
|
-
Processes are spawned detached on macOS/Linux and killed as a tree
|
|
143
|
-
(`process.kill(-pid)` / `taskkill /T /F`), so a quit never leaves an orphaned
|
|
144
|
-
Vite/Next server behind.
|
|
145
|
-
|
|
146
|
-
**Editor / Agent (new terminal windows).** `cross-spawn` launches the OS
|
|
147
|
-
terminal:
|
|
148
|
-
|
|
149
|
-
- **macOS** โ `osascript -e 'tell application "Terminal" โฆ do script "cd โฆ && code ."'`
|
|
150
|
-
- **Windows** โ `wt.exe -d "<dir>" cmd /k "code ."`, falling back to
|
|
151
|
-
`cmd /c start "" /D "<dir>" cmd.exe /k "code ."` when Windows Terminal is not
|
|
152
|
-
installed
|
|
153
|
-
- **Linux** โ the first emulator found on `PATH` out of `gnome-terminal`,
|
|
154
|
-
`konsole`, `xfce4-terminal`, `kitty`, `alacritty`, `wezterm`,
|
|
155
|
-
`x-terminal-emulator`, `xterm` (each gets `--working-directory`/`-e` with
|
|
156
|
-
`bash -lc` and `exec bash` so the window stays open)
|
|
157
|
-
|
|
158
|
-
On Linux you can force a specific emulator with the `TERMDECK_TERMINAL`
|
|
159
|
-
environment variable.
|
|
160
|
-
|
|
161
|
-
## Linking locally (test before publishing)
|
|
162
|
-
|
|
163
|
-
From the project folder:
|
|
132
|
+
| `termdeck` | Launch the dashboard using the existing config (first run starts the wizard). |
|
|
133
|
+
| `termdeck --demo` | Launch with 14 sample projects (great for trying it out). |
|
|
134
|
+
| `termdeck --scan` | Re-run the interactive scanner: adds/updates projects in the config, merging with existing entries and preserving custom agent configs. |
|
|
135
|
+
| `termdeck --no-auto-restart` | Disable dev-server crash recovery for this session only. |
|
|
136
|
+
| `termdeck --reset` | Delete the config file and force a fresh first-run setup on the next launch. |
|
|
137
|
+
| `termdeck --no-update` | Disable the background auto-updater. |
|
|
138
|
+
| `termdeck --setup` | Re-run the setup wizard manually. |
|
|
139
|
+
| `termdeck --list` | Print the configured projects as a table and exit (no TUI). |
|
|
140
|
+
| `termdeck --no-open` | Do not auto-open the browser when a dev server starts. |
|
|
141
|
+
|
|
142
|
+
### Keyboard Shortcuts
|
|
164
143
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
144
|
+
| Key | Action |
|
|
145
|
+
| --- | --- |
|
|
146
|
+
| <kbd>โ</kbd> / <kbd>โ</kbd> or <kbd>j</kbd> / <kbd>k</kbd> | Navigate projects |
|
|
147
|
+
| <kbd>Tab</kbd> / <kbd>Shift</kbd>+<kbd>Tab</kbd> | Cycle focus: project list โ actions โ output |
|
|
148
|
+
| <kbd>Enter</kbd> or <kbd>Space</kbd> | Activate the focused button |
|
|
149
|
+
| <kbd>r</kbd> / <kbd>d</kbd> | Run `npm run dev` for the selected project |
|
|
150
|
+
| <kbd>e</kbd> | Open the project in your editor in a new terminal |
|
|
151
|
+
| <kbd>c</kbd> | Open Claude in a new terminal |
|
|
152
|
+
| <kbd>x</kbd> | Open Codex in a new terminal |
|
|
153
|
+
| <kbd>o</kbd> | Open opencode in a new terminal |
|
|
154
|
+
| <kbd>f</kbd> | Open freebuff in a new terminal |
|
|
155
|
+
| <kbd>k</kbd> | Open kilocode in a new terminal |
|
|
156
|
+
| <kbd>s</kbd> | Cycle the selected project's status |
|
|
157
|
+
| <kbd>/</kbd> | Search projects by name (Enter commits, Esc cancels) |
|
|
158
|
+
| <kbd>1</kbd>โ<kbd>5</kbd> | Filter by status chip: all / live / exp / pend / scrap |
|
|
159
|
+
| <kbd>Shift</kbd>+<kbd>X</kbd> | Stop the selected project's dev server |
|
|
160
|
+
| <kbd>PgUp</kbd>/<kbd>PgDn</kbd>, mouse wheel | Scroll the dev server logs (<kbd>g</kbd> to follow the tail again) |
|
|
161
|
+
| <kbd>q</kbd> | Quit (stops every dev server it started) |
|
|
169
162
|
|
|
170
|
-
|
|
171
|
-
termdeck # now runs from anywhere with your edits live
|
|
163
|
+
> **Mouse Support:** All buttons and list items are fully clickable. Use the mouse wheel to scroll logs.
|
|
172
164
|
|
|
173
|
-
|
|
174
|
-
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## โ FAQ
|
|
168
|
+
|
|
169
|
+
**How do I disable auto-updates?**
|
|
170
|
+
Pass `--no-update` when you launch the dashboard: `termdeck --no-update`. The npm registry is then never contacted and nothing is printed.
|
|
171
|
+
|
|
172
|
+
**A dev server keeps restarting โ how do I stop that?**
|
|
173
|
+
termdeck restarts a crashed dev server up to 3 times, then gives up and logs the failure. If you would rather not have any crash recovery for a session, launch with `termdeck --no-auto-restart`.
|
|
174
|
+
|
|
175
|
+
**Does my config get clobbered when I re-scan?**
|
|
176
|
+
No. `termdeck --scan` (or the setup wizard on a machine that already has a config) merges: projects you didn't touch stay exactly as they are, projects you re-select get their new status/port/package manager, and hand-written per-project overrides such as custom agent commands are kept.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## ๐ ๏ธ Development & Contributing
|
|
181
|
+
|
|
182
|
+
### Local Testing
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
git clone https://github.com/barigalasunil/termdeck.git
|
|
186
|
+
cd termdeck
|
|
187
|
+
npm install
|
|
188
|
+
npm link # symlink into global node_modules
|
|
189
|
+
termdeck # runs from anywhere with your edits live
|
|
175
190
|
```
|
|
176
191
|
|
|
177
|
-
|
|
178
|
-
code changes take effect immediately โ no republishing. If you would rather not
|
|
179
|
-
touch the global install, these work too:
|
|
192
|
+
### Running Tests
|
|
180
193
|
|
|
181
194
|
```bash
|
|
182
|
-
npm
|
|
183
|
-
|
|
184
|
-
npm exec -- termdeck # run via the local package
|
|
195
|
+
npm test # unit + end-to-end dev server tests (64/64 passing โ
)
|
|
196
|
+
npm run smoke # headless TUI smoke test
|
|
185
197
|
```
|
|
186
198
|
|
|
187
|
-
|
|
199
|
+
The smoke test drives a headless blessed screen: it verifies the dashboard renders, the dev-server CTA starts a real fixture server and streams its logs into the log pane, and that stopping the server cleans up the child process.
|
|
188
200
|
|
|
189
|
-
|
|
190
|
-
`TERMDECK_CONFIG=./scratch-config.json termdeck` (on Windows Git Bash use
|
|
191
|
-
`TERMDECK_CONFIG=./scratch-config.json node bin/termdeck.js`).
|
|
192
|
-
- `termdeck --list` prints the parsed config without starting the TUI, which is
|
|
193
|
-
the quickest way to check that setup wrote what you expected.
|
|
201
|
+
### Testing Auto-Updates
|
|
194
202
|
|
|
195
|
-
|
|
203
|
+
The updater reads its registry endpoint from `TERMDECK_REGISTRY_URL`, so you can point it at a local mock. In one terminal, serve a fake registry that always claims a newer version:
|
|
196
204
|
|
|
197
205
|
```bash
|
|
198
|
-
|
|
199
|
-
npm publish # needs an npm account; the package name must be free
|
|
206
|
+
node -e "require('http').createServer((q,s)=>{s.setHeader('content-type','application/json');s.end(JSON.stringify({version:'9.9.9'}))}).listen(4873)"
|
|
200
207
|
```
|
|
201
208
|
|
|
202
|
-
|
|
203
|
-
|
|
209
|
+
Then run termdeck with the mock enabled:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
# macOS/Linux
|
|
213
|
+
TERMDECK_REGISTRY_URL=http://127.0.0.1:4873/termdeck/latest termdeck
|
|
204
214
|
|
|
205
|
-
|
|
215
|
+
# Windows PowerShell
|
|
216
|
+
$env:TERMDECK_REGISTRY_URL="http://127.0.0.1:4873/termdeck/latest"; termdeck
|
|
217
|
+
```
|
|
206
218
|
|
|
207
|
-
|
|
208
|
-
| --- | --- |
|
|
209
|
-
| `termdeck needs an interactive terminal` | first-run setup and the dashboard need a TTY. Use a real terminal, or `termdeck --list` |
|
|
210
|
-
| Browser opens too early / too late | tune the port: the URL is only opened once it appears in the output. Silence your dev server's URL banner and termdeck falls back after ~9s |
|
|
211
|
-
| "no terminal emulator found" | install one of the Linux terminals above or set `TERMDECK_TERMINAL` |
|
|
212
|
-
| `opencode` not found in the new window | change `agentCommand` to whatever you use (`cursor .`, `claude`, `aider`, โฆ) |
|
|
213
|
-
| Log colours look plain | intentional: ANSI codes are stripped so the log pane stays readable in a terminal multiplexer |
|
|
214
|
-
| Nothing appears when clicking | make sure you are *inside* the TUI window and the terminal reports mouse events (Windows Terminal, iTerm2, GNOME Terminal, VS Code all do) |
|
|
219
|
+
> The install always targets `@latest` on the **real** npm registry. Set the mock to your current version (e.g. `{"version":"2.0.0"}`) to exercise the "already up to date, no install" path, or use `--no-update` to skip the check entirely.
|
|
215
220
|
|
|
216
|
-
|
|
221
|
+
### Releasing a Version
|
|
217
222
|
|
|
223
|
+
```bash
|
|
224
|
+
npm version patch # 2.0.0 -> 2.0.1 (bug fixes)
|
|
225
|
+
npm version minor # adds backwards-compatible features
|
|
226
|
+
npm version major # breaking changes
|
|
227
|
+
npm publish
|
|
218
228
|
```
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
src/util.js ANSI stripping, URL parsing, which(), killTree()
|
|
227
|
-
test/run.js npm test โ unit tests + a real npm run dev lifecycle
|
|
228
|
-
test/smoke.js npm run smoke โ headless render + real mouse click on a CTA
|
|
229
|
+
|
|
230
|
+
Publishing a higher version is what triggers the auto-update for everyone already running termdeck.
|
|
231
|
+
|
|
232
|
+
### Unlink When Done
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm unlink -g termdeck
|
|
229
236
|
```
|
|
230
237
|
|
|
231
|
-
|
|
238
|
+
> **Tip:** Use `TERMDECK_CONFIG=./scratch-config.json termdeck` to test without touching your real config.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## ๐ License
|
|
232
243
|
|
|
233
244
|
MIT
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
<div align="center">
|
|
249
|
+
|
|
250
|
+
**Built with โค๏ธ by [Sunil](https://github.com/barigalasunil)**
|
|
251
|
+
|
|
252
|
+
[GitHub](https://github.com/barigalasunil/termdeck) ยท [npm](https://www.npmjs.com/package/termdeck)
|
|
253
|
+
|
|
254
|
+
</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termdeck-cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.2",
|
|
4
|
+
"description": "Terminal project control: a multi-pane TUI to manage your local dev projects โ dev servers, git state, process stats, and AI coding agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
7
7
|
"tui",
|
|
@@ -9,23 +9,24 @@
|
|
|
9
9
|
"blessed",
|
|
10
10
|
"blessed-contrib",
|
|
11
11
|
"dev-server",
|
|
12
|
-
"projects"
|
|
12
|
+
"projects",
|
|
13
|
+
"agents"
|
|
13
14
|
],
|
|
14
15
|
"license": "MIT",
|
|
15
16
|
"main": "src/index.js",
|
|
16
17
|
"bin": {
|
|
17
|
-
"termdeck": "
|
|
18
|
+
"termdeck": "src/index.js"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
|
-
"bin",
|
|
21
21
|
"src",
|
|
22
|
+
"sample-config.json",
|
|
22
23
|
"README.md"
|
|
23
24
|
],
|
|
24
25
|
"engines": {
|
|
25
26
|
"node": ">=16"
|
|
26
27
|
},
|
|
27
28
|
"scripts": {
|
|
28
|
-
"start": "node
|
|
29
|
+
"start": "node src/index.js",
|
|
29
30
|
"test": "node test/run.js",
|
|
30
31
|
"smoke": "node test/smoke.js"
|
|
31
32
|
},
|
|
@@ -34,6 +35,7 @@
|
|
|
34
35
|
"blessed-contrib": "^4.11.0",
|
|
35
36
|
"cross-spawn": "^7.0.3",
|
|
36
37
|
"inquirer": "^8.2.6",
|
|
37
|
-
"open": "^8.4.2"
|
|
38
|
+
"open": "^8.4.2",
|
|
39
|
+
"pidusage": "^3.0.2"
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 2,
|
|
3
|
+
"root": "~/dev/projects",
|
|
4
|
+
"demoMode": true,
|
|
5
|
+
"autoRestart": true,
|
|
6
|
+
"devCommand": "npm run dev",
|
|
7
|
+
"editorCommand": "code .",
|
|
8
|
+
"agentCommand": "opencode",
|
|
9
|
+
"openBrowser": true,
|
|
10
|
+
"projects": [
|
|
11
|
+
{
|
|
12
|
+
"name": "hyperion-core",
|
|
13
|
+
"path": "hyperion-core",
|
|
14
|
+
"status": "live",
|
|
15
|
+
"port": 3000,
|
|
16
|
+
"packageManager": "pnpm",
|
|
17
|
+
"stack": "Next.js 14.2 ยท TypeScript 5.4 ยท Tailwind",
|
|
18
|
+
"branch": "feat/v2-query-optimizer",
|
|
19
|
+
"info": "core platform API and query engine",
|
|
20
|
+
"lastCommit": { "hash": "e8f20b4", "message": "feat: batch cache flush", "timestamp": "2025-05-18T16:30:00Z" },
|
|
21
|
+
"lastActivity": "12m ago"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "atlas-engine",
|
|
25
|
+
"path": "atlas-engine",
|
|
26
|
+
"status": "live",
|
|
27
|
+
"port": 4000,
|
|
28
|
+
"packageManager": "npm",
|
|
29
|
+
"stack": "Node 20 ยท Express ยท Prisma",
|
|
30
|
+
"branch": "main",
|
|
31
|
+
"info": "data ingestion and normalization engine",
|
|
32
|
+
"lastCommit": { "hash": "c91d2aa", "message": "fix: retry backoff on S3 timeouts", "timestamp": "2025-05-18T14:02:00Z" },
|
|
33
|
+
"lastActivity": "2h ago"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "orbit-controls",
|
|
37
|
+
"path": "orbit-controls",
|
|
38
|
+
"status": "live",
|
|
39
|
+
"port": 5000,
|
|
40
|
+
"packageManager": "yarn",
|
|
41
|
+
"stack": "React 18 ยท Vite ยท Zustand",
|
|
42
|
+
"branch": "develop",
|
|
43
|
+
"info": "mission control web UI",
|
|
44
|
+
"lastCommit": { "hash": "7f31ac9", "message": "feat: live telemetry widgets", "timestamp": "2025-05-18T09:47:00Z" },
|
|
45
|
+
"lastActivity": "7h ago"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "neocortex-api",
|
|
49
|
+
"path": "neocortex-api",
|
|
50
|
+
"status": "live",
|
|
51
|
+
"port": 3001,
|
|
52
|
+
"packageManager": "pnpm",
|
|
53
|
+
"stack": "NestJS ยท PostgreSQL ยท Redis",
|
|
54
|
+
"branch": "main",
|
|
55
|
+
"info": "cognitive services REST API",
|
|
56
|
+
"lastCommit": { "hash": "d4e08f1", "message": "feat: vector search endpoint", "timestamp": "2025-05-17T20:15:00Z" },
|
|
57
|
+
"lastActivity": "1d ago"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "quanta-cache",
|
|
61
|
+
"path": "quanta-cache",
|
|
62
|
+
"status": "live",
|
|
63
|
+
"port": 6379,
|
|
64
|
+
"packageManager": "npm",
|
|
65
|
+
"stack": "Go ยท Redis",
|
|
66
|
+
"branch": "feat/eviction-policy",
|
|
67
|
+
"info": "distributed in-memory cache layer",
|
|
68
|
+
"lastCommit": { "hash": "aa21c8e", "message": "feat: LFU eviction policy", "timestamp": "2025-05-17T11:20:00Z" },
|
|
69
|
+
"lastActivity": "1d ago"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "ripple-mq",
|
|
73
|
+
"path": "ripple-mq",
|
|
74
|
+
"status": "live",
|
|
75
|
+
"port": 5672,
|
|
76
|
+
"packageManager": "pnpm",
|
|
77
|
+
"stack": "Elixir ยท RabbitMQ",
|
|
78
|
+
"branch": "main",
|
|
79
|
+
"info": "async event bus and worker queues",
|
|
80
|
+
"lastCommit": { "hash": "5f90b31", "message": "chore: upgrade amqp client", "timestamp": "2025-05-16T18:40:00Z" },
|
|
81
|
+
"lastActivity": "2d ago"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "lumen-ui",
|
|
85
|
+
"path": "lumen-ui",
|
|
86
|
+
"status": "exp",
|
|
87
|
+
"port": 5173,
|
|
88
|
+
"packageManager": "npm",
|
|
89
|
+
"stack": "SolidJS ยท Tailwind",
|
|
90
|
+
"branch": "experimental/wip",
|
|
91
|
+
"info": "next-generation design system",
|
|
92
|
+
"lastCommit": { "hash": "1b0e23c", "message": "wip: token theming", "timestamp": "2025-05-18T12:05:00Z" },
|
|
93
|
+
"lastActivity": "4h ago"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "sparkline-app",
|
|
97
|
+
"path": "sparkline-app",
|
|
98
|
+
"status": "exp",
|
|
99
|
+
"port": 8080,
|
|
100
|
+
"packageManager": "yarn",
|
|
101
|
+
"stack": "D3 ยท TypeScript",
|
|
102
|
+
"branch": "spikes/time-series",
|
|
103
|
+
"info": "time series visualizer spike",
|
|
104
|
+
"lastCommit": { "hash": "0ae4d77", "message": "spike: streaming chart", "timestamp": "2025-05-15T15:30:00Z" },
|
|
105
|
+
"lastActivity": "3d ago"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "flux-router",
|
|
109
|
+
"path": "flux-router",
|
|
110
|
+
"status": "exp",
|
|
111
|
+
"port": 3100,
|
|
112
|
+
"packageManager": "pnpm",
|
|
113
|
+
"stack": "Go ยท gRPC",
|
|
114
|
+
"branch": "spike/grpc-gateway",
|
|
115
|
+
"info": "edge router prototype",
|
|
116
|
+
"lastCommit": { "hash": "71fcd64", "message": "spike: gateway handshake", "timestamp": "2025-05-14T10:12:00Z" },
|
|
117
|
+
"lastActivity": "4d ago"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "stellar-auth",
|
|
121
|
+
"path": "stellar-auth",
|
|
122
|
+
"status": "pend",
|
|
123
|
+
"port": 4001,
|
|
124
|
+
"packageManager": "npm",
|
|
125
|
+
"stack": "Node 20 ยท JWT",
|
|
126
|
+
"branch": "main",
|
|
127
|
+
"info": "auth service - waiting on security review",
|
|
128
|
+
"lastCommit": { "hash": "2c8e9a4", "message": "docs: auth flow diagram", "timestamp": "2025-05-10T08:00:00Z" },
|
|
129
|
+
"lastActivity": "8d ago"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "beacon-sdk",
|
|
133
|
+
"path": "beacon-sdk",
|
|
134
|
+
"status": "pend",
|
|
135
|
+
"packageManager": "pnpm",
|
|
136
|
+
"stack": "TypeScript SDK",
|
|
137
|
+
"branch": "next-release",
|
|
138
|
+
"info": "client library for the beacon API",
|
|
139
|
+
"lastCommit": { "hash": "6b3da17", "message": "feat: typed events", "timestamp": "2025-05-09T16:45:00Z" },
|
|
140
|
+
"lastActivity": "9d ago"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "nova-cli",
|
|
144
|
+
"path": "nova-cli",
|
|
145
|
+
"status": "pend",
|
|
146
|
+
"packageManager": "npm",
|
|
147
|
+
"stack": "Node CLI",
|
|
148
|
+
"branch": "main",
|
|
149
|
+
"info": "developer CLI - specs not finalised",
|
|
150
|
+
"lastCommit": { "hash": "e77c9b2", "message": "init: project scaffold", "timestamp": "2025-05-05T13:00:00Z" },
|
|
151
|
+
"lastActivity": "2w ago"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "drift-store",
|
|
155
|
+
"path": "drift-store",
|
|
156
|
+
"status": "scrap",
|
|
157
|
+
"packageManager": "npm",
|
|
158
|
+
"stack": "Node",
|
|
159
|
+
"branch": "archived/w1",
|
|
160
|
+
"info": "abandoned embedded store prototype",
|
|
161
|
+
"lastCommit": { "hash": "903fa18", "message": "abandoned: keep for reference", "timestamp": "2025-04-20T09:30:00Z" },
|
|
162
|
+
"lastActivity": "1mo ago"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"name": "quill-docs",
|
|
166
|
+
"path": "quill-docs",
|
|
167
|
+
"status": "scrap",
|
|
168
|
+
"packageManager": "yarn",
|
|
169
|
+
"stack": "Astro",
|
|
170
|
+
"branch": "main",
|
|
171
|
+
"info": "attempted docs rebuild, superseded",
|
|
172
|
+
"lastCommit": { "hash": "8d4ff32", "message": "docs: initial outline", "timestamp": "2025-04-15T17:20:00Z" },
|
|
173
|
+
"lastActivity": "1mo ago"
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|