@ictechgy/lterm 1.0.6 → 1.0.8
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.ko.md +48 -21
- package/README.md +39 -22
- package/package.json +5 -5
package/README.ko.md
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
- **무엇** — tmux 같은 영속 터미널 세션 데몬을 더 작게 만든 도구. AI 에이전트 도구를 위한 tmux 호환 명령 계층을 제공하며, 세션을 이름이나 pane id로 detach·reattach할 수 있습니다.
|
|
8
8
|
- **대상** — Claude Code, Codex CLI, OpenCode, GitHub Copilot CLI, Cursor Agent, Antigravity/`agy`, Kiro, Jules, Aider, Goose, Amp, Crush, Kimi, Qwen, Gemini CLI, `oh-my-codex` / `oh-my-claude` 같은 terminal-first coding agent를 쓰는 사용자와, 이를 `cmux` 안에서 실행하는 사용자.
|
|
9
|
-
- **사용법** — `lterm start`로 만들고 `lterm resume`으로 (재)
|
|
10
|
-
- **상태** — alpha MVP
|
|
9
|
+
- **사용법** — `lterm start`로 만들고 `lterm resume`으로 (재)접속합니다. shim이 적용된 agent 실행에는 `lterm agent <profile>` / `lterm claude` / `lterm codex` / `lterm opencode` / `lterm agy` / `lterm kiro` / `lterm gemini` 같은 내장 단축 명령을 사용할 수 있습니다. tmux가 켜진 세션 안에서는 `tmux` 명령이 `lterm tmux-compat`으로 해석됩니다.
|
|
10
|
+
- **상태** — 1.0 명령/출력 호환성 경계를 문서화한 alpha MVP입니다. 같은 OS 사용자 안에서 쓰는 편의용 데몬이며, **샌드박스, escape-sequence sanitizer, 완전한 tmux 대체품 모두 아닙니다.**
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -63,15 +63,19 @@ npm install -g @ictechgy/lterm
|
|
|
63
63
|
|
|
64
64
|
Homebrew와 npm 모두 `PATH`에 `lterm` 명령을 설치합니다. `lterm --version`으로 확인하세요.
|
|
65
65
|
|
|
66
|
-
수동
|
|
66
|
+
수동 설치가 번거롭다면 [`docs/agent-install.ko.md`](docs/agent-install.ko.md)의
|
|
67
67
|
프롬프트를 Claude Code, Codex CLI, OpenCode, GitHub Copilot CLI, Cursor Agent, Antigravity/`agy`, Kiro, Jules, Aider, Goose, Amp, Crush, Kimi, Qwen, Gemini CLI 같은 terminal coding agent에
|
|
68
68
|
붙여 넣으세요. Agent가 platform을 감지하고, `lterm`을 설치하고, smoke test로
|
|
69
69
|
검증하며, shell startup file을 바꿔야 할 때는 먼저 diff를 보여주도록 안내합니다.
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
1.0 명령/출력 안정성 경계는 [public contract](docs/public-contract.md)와
|
|
72
|
+
machine-readable [contract manifest](docs/contract-manifest.json)를 참고하세요.
|
|
73
|
+
|
|
74
|
+
GitHub에서 Cargo로 설치할 때는 release tag를 고정하세요. 아래 예시는 현재
|
|
75
|
+
README 릴리스 기준이며, 더 최신 tag가 있는지는 Releases 페이지에서 확인하세요:
|
|
72
76
|
|
|
73
77
|
```bash
|
|
74
|
-
cargo install --git https://github.com/ictechgy/light_terminal --tag v1.0.
|
|
78
|
+
cargo install --locked --git https://github.com/ictechgy/light_terminal --tag v1.0.8
|
|
75
79
|
```
|
|
76
80
|
|
|
77
81
|
저장소를 클론한 뒤 직접 빌드하려면 Rust 1.85 이상이 필요합니다.
|
|
@@ -91,8 +95,11 @@ cargo run -- --help
|
|
|
91
95
|
|
|
92
96
|
```bash
|
|
93
97
|
lterm install-shim
|
|
94
|
-
# 출력된 디렉터리를 실제 tmux보다 앞쪽 PATH에
|
|
98
|
+
# 출력된 디렉터리를 실제 tmux보다 앞쪽 PATH에 추가하거나, helper 출력을 확인한 뒤 실행하세요.
|
|
99
|
+
lterm env
|
|
95
100
|
eval "$(lterm env)"
|
|
101
|
+
# fish:
|
|
102
|
+
lterm env --shell fish | source
|
|
96
103
|
```
|
|
97
104
|
|
|
98
105
|
## 빠른 시작
|
|
@@ -129,12 +136,16 @@ lterm -a api
|
|
|
129
136
|
| 세션 이름 변경 | `lterm rename api api-renamed` | 없음 |
|
|
130
137
|
| 세션 status theme 설정 | `lterm status-theme api green` | `theme` |
|
|
131
138
|
| 정제된 scrollback 읽기 | `lterm logs api --start=-80 --end=-1` | `capture` |
|
|
139
|
+
| 디버깅용 raw PTY 출력 기록 | `lterm trace api --duration 5s --output trace.jsonl` | `record` |
|
|
132
140
|
| 정제된 scrollback 위에 입력 컴포저 열기 | `lterm compose api` | `mobile` |
|
|
133
141
|
| 세션 출력 또는 종료 대기 | `lterm wait api --contains READY --timeout 30s --json` | 없음 |
|
|
134
142
|
| 세션을 감시하고 완료 시 알림 | `lterm watch api --exit --notify` | 없음 |
|
|
135
143
|
| PTY에 입력 쓰기 | `lterm input api 'echo hello' --enter` | `send` |
|
|
136
144
|
| 세션 종료 | `lterm close api` | `kill` |
|
|
137
145
|
| 데몬과 shim 상태 진단 | `lterm doctor --json` | `status` |
|
|
146
|
+
| redacted 로컬 진단 bundle 수집 | `lterm diagnose --bundle` | 없음 |
|
|
147
|
+
| 로컬 설정 단계 미리 보기 | `lterm init --shell zsh` | 없음 |
|
|
148
|
+
| shell completion 생성 | `mkdir -p ~/.zfunc && lterm completions zsh > ~/.zfunc/_lterm` | 없음 |
|
|
138
149
|
| 백그라운드 데몬 명시 실행 | `lterm daemon` | 없음 |
|
|
139
150
|
| 데몬과 모든 세션 종료 | `lterm shutdown` | 없음 |
|
|
140
151
|
|
|
@@ -145,13 +156,17 @@ lterm -a api
|
|
|
145
156
|
| profile 기반 agent 세션 실행 | `lterm agent claude -- --help` | sibling shortcuts: `lterm claude`, `lterm codex`, `lterm opencode`, `lterm copilot`, `lterm cursor-agent`, `lterm agy`, `lterm jules`, `lterm kiro`, `lterm aider`, `lterm goose`, `lterm amp`, `lterm crush`, `lterm kimi`, `lterm qwen`, `lterm gemini`, `lterm omx`, `lterm omc` |
|
|
146
157
|
| 사용 가능한 agent profile 확인 | `lterm agents --json` | 실행 시점의 `PATH` 사용 가능 여부 확인 |
|
|
147
158
|
| `tmux` 호환 shim 설치 | `lterm install-shim` | `lterm tmux-compat`으로 전달하는 shim 생성 |
|
|
148
|
-
| tmux 호환 shell export 출력 | `eval "$(lterm env)"` | shim dir을 `$PATH` 앞에 추가하는 신뢰된 `export` 행 출력 |
|
|
159
|
+
| tmux 호환 shell export 출력 | `eval "$(lterm env)"` (`lterm env --shell fish \| source` for fish) | shim dir을 `$PATH` 앞에 추가하는 신뢰된 `export` 행 출력 |
|
|
160
|
+
| shell completion 생성 | `lterm completions bash\|zsh\|fish` | completion script만 출력하며 session을 조회하거나 daemon을 시작하지 않음 |
|
|
149
161
|
| cmux-friendly 알림 보내기 | `lterm notify --title 'Done' --body 'Tests passed'` | OSC 777 fallback은 터미널 제어 문자를 제거하고 Unicode text는 보존 |
|
|
150
162
|
| 원격 호스트에 attach | `lterm ssh user@host main` | 신뢰할 수 있는 host에서만 사용; host-key 확인은 SSH가 처리하고 remote PTY bytes는 정제 없이 전달 |
|
|
151
163
|
| tmux shim namespace 직접 호출 | `lterm tmux-compat list-commands` | 제품 alias 표가 아니라 호환 namespace |
|
|
152
164
|
|
|
153
165
|
`eval "$(lterm env)"`는 `PATH`의 `lterm` binary를 신뢰할 수 있을 때만 사용하세요.
|
|
154
166
|
이 명령은 shim directory를 `$PATH` 앞에 추가하는 고정 `export` 행을 출력합니다.
|
|
167
|
+
fish에서는 같은 확인 뒤 `lterm env --shell fish | source`를 사용하세요.
|
|
168
|
+
eval/source를 쓰고 싶지 않다면 먼저 `lterm env` 출력을 직접 확인한 뒤 필요한
|
|
169
|
+
export 행만 shell startup file에 복사하세요.
|
|
155
170
|
|
|
156
171
|
`lterm ssh`는 remote PTY bytes를 local terminal로 정제 없이 전달하므로,
|
|
157
172
|
compromised remote는 local terminal emulator가 허용하는 control sequence를
|
|
@@ -168,9 +183,9 @@ escape 처리가 여기에 포함됩니다. 직접 `ssh`하듯 신뢰할 수 있
|
|
|
168
183
|
|
|
169
184
|
이 표는 사람과 agent가 직접 쓰는 제품 CLI 표면입니다. `lterm tmux-compat ...`는 이미 tmux 명령을 사용하는 스크립트를 위한 별도 shim namespace이며, 모든 제품 명령에 tmux 호환 이름이 있는 것은 아닙니다. 런타임에 지원되는 shim subset은 `lterm tmux-compat list-commands`로 확인하세요.
|
|
170
185
|
|
|
171
|
-
`lterm sessions`는 기본적으로 하위 pane을 숨기고, 기존 첫 5개 tab-separated 열(`name`, `pane`, `alive`, `cwd`, `command`)을 유지한 뒤 attach 상태(`attached` / `detached`)와 parent pane(`-` 또는 pane id)을 뒤에 붙입니다. 호환 이름인 `lterm list`와 `lterm ls`도 같은 출력 형식을 유지합니다. attach된 클라이언트는 아래쪽 한 줄에 status bar를 표시하고, PTY는 그 줄을 제외한 영역으로 resize됩니다. 예전처럼 전체 터미널을 raw 모드로 재개하려면 `lterm resume --no-status api`(호환 이름: `lterm attach --no-status api`)를 쓰거나, 상태줄 처리가 충돌하는 클라이언트에서는 `LTERM_NO_STATUS=1`
|
|
186
|
+
`lterm sessions`는 기본적으로 하위 pane을 숨기고, 기존 첫 5개 tab-separated 열(`name`, `pane`, `alive`, `cwd`, `command`)을 유지한 뒤 attach 상태(`attached` / `detached`)와 parent pane(`-` 또는 pane id)을 뒤에 붙입니다. 호환 이름인 `lterm list`와 `lterm ls`도 같은 출력 형식을 유지합니다. attach된 클라이언트는 아래쪽 한 줄에 status bar를 표시하고, PTY는 그 줄을 제외한 영역으로 resize됩니다. 예전처럼 전체 터미널을 raw 모드로 재개하려면 `lterm resume --no-status api`(호환 이름: `lterm attach --no-status api`)를 쓰거나, 상태줄 처리가 충돌하는 클라이언트에서는 `LTERM_NO_STATUS=1` 또는 동일한 의미의 `LTERM_STATUS=0`을 설정하세요.
|
|
172
187
|
|
|
173
|
-
`lterm rename <target> <new-name>`은 실행 중인 세션의 프로세스를 재시작하지 않고 이름만 바꿉니다. 현재 이름과 동일한 이름으로 바꾸면 no-op success이고, 다른 세션이 이미 쓰는 이름으로 바꾸면 conflict error로 실패합니다. `<target>`은 세션 이름, session id, pane id(`%0`), 또는 bare pane 번호(`0`)를
|
|
188
|
+
`lterm rename <target> <new-name>`은 실행 중인 세션의 프로세스를 재시작하지 않고 이름만 바꿉니다. 현재 이름과 동일한 이름으로 바꾸면 no-op success이고, 다른 세션이 이미 쓰는 이름으로 바꾸면 conflict error로 실패합니다. `<target>`은 세션 이름, session id, pane id(`%0`), 또는 bare pane 번호(`0`)를 받습니다. 숫자만 있는 target은 세션 이름이 아니라 bare pane 번호로 해석됩니다(세션 이름은 숫자만으로 만들 수 없습니다). `<new-name>`은 `--name`과 같은 이름 규칙을 따릅니다.
|
|
174
189
|
|
|
175
190
|
`lterm status-theme <target> <theme>`(alias: `lterm theme`)은 PTY를 재시작하지 않고 세션별 status bar theme을 저장합니다. pane id를 지정하면 해당 pane이 속한 세션에 적용됩니다. `default`, `clear`, `none`을 쓰면 세션 override를 지우고 attach하는 client의 기본값으로 돌아갑니다. 이미 attach된 client는 detach 후 다시 attach할 때 새 색을 반영합니다. 새 세션은 `lterm start --status-theme green -n api -- npm run dev`(또는 alias `--status-color`)처럼 생성 시점에 같은 metadata를 저장할 수 있습니다.
|
|
176
191
|
|
|
@@ -178,7 +193,7 @@ escape 처리가 여기에 포함됩니다. 직접 `ssh`하듯 신뢰할 수 있
|
|
|
178
193
|
|
|
179
194
|
`lterm logs <target>`은 `--start` / `-S`와 `--end` / `-E` line offset을 받습니다. 0 이상의 값은 absolute scrollback line index이고, 음수 값은 현재 scrollback line count에서 뒤로 셉니다. `--end`는 inclusive라 `lterm logs api -S0 -E0`은 첫 번째 줄만 capture합니다. Capture 출력은 계속 정제된 text이며, attach된 PTY stream은 raw 그대로 유지됩니다.
|
|
180
195
|
|
|
181
|
-
`lterm wait <target> --exit
|
|
196
|
+
`lterm wait <target> --exit / --contains <text>`는 세션이 종료되거나 정제된 scrollback에 marker가 나타날 때까지 block합니다. 자동화용 health check에는 `--timeout 250ms|2s|5m|1h`, `--tail N`, `--json`을 함께 쓰세요. Timeout 시 `wait` / `watch`는 exit code `124`를 반환하고 JSON에는 `timed_out: true`가 들어갑니다. `lterm watch`는 같은 조건을 쓰며, `--notify`를 더하면 attach된 PTY bytes는 건드리지 않고 cmux-friendly 완료 알림을 보냅니다. `--json`을 함께 쓸 때는 notification fallback이 필요해도 stdout을 machine-readable JSON으로 유지합니다.
|
|
182
197
|
|
|
183
198
|
`LTERM_STATUS_STYLE=full` 또는 `LTERM_STATUS_STYLE=minimal` 로 시각 스타일을 선택할 수 있습니다. `full`(로컬 터미널 기본값)은 색이 있는 bar를 그리고, `minimal`은 SGR 색을 모두 생략한 plain text로 동작합니다. SSH 세션(`SSH_CONNECTION` / `SSH_CLIENT` / `SSH_TTY` 감지)에서는 자동으로 `minimal`이 적용되어 Termius 같은 모바일 SSH 클라이언트의 색 충돌을 줄이지만, 세션 또는 환경 theme을 명시하면 색이 유지됩니다.
|
|
184
199
|
|
|
@@ -215,7 +230,7 @@ Status bar theme은 v0.1.3에서 추가되었습니다. 이 기능은 metadata
|
|
|
215
230
|
|
|
216
231
|
attach된 PTY가 alternate screen buffer로 진입하면(예: `vim`, `less`, `htop`이 `\x1b[?1049h` 사용) lterm은 status bar를 일시 중단해 alt-screen 앱의 UI와 충돌을 피합니다. 앱이 alt-screen을 종료하는 즉시 status bar가 다시 그려집니다.
|
|
217
232
|
|
|
218
|
-
`lterm resume` / `lterm attach` 도중 panic이나
|
|
233
|
+
`lterm resume` / `lterm attach` 도중 panic이나 예기치 않은 종료가 lterm의 recovery hook을 거치면 최소 복구 sequence(scroll region 리셋, 커서 보이기, alt-screen 종료, SGR 리셋)를 best-effort로 emit해 사용자 터미널이 raw mode나 hidden cursor 상태로 남을 가능성을 줄입니다.
|
|
219
234
|
|
|
220
235
|
CJK 문자나 이모지(ZWJ family, 국기, 결합 문자 포함)가 들어간 세션 이름은 `unicode-width` / `unicode-segmentation` 으로 디스플레이 폭을 계산해 정렬되므로 wide character가 섞여도 status bar 패딩이 어긋나지 않습니다.
|
|
221
236
|
|
|
@@ -283,11 +298,11 @@ lterm amp
|
|
|
283
298
|
lterm crush
|
|
284
299
|
lterm kimi
|
|
285
300
|
lterm qwen
|
|
286
|
-
lterm gemini -- -p "이 저장소를 요약해줘" #
|
|
301
|
+
lterm gemini -- -p "이 저장소를 요약해줘" # Gemini CLI도 -p를 받습니다
|
|
287
302
|
lterm agents
|
|
288
303
|
```
|
|
289
304
|
|
|
290
|
-
위 명령은
|
|
305
|
+
위 명령은 built-in profile로 연결되는 얇은 alias입니다. 예를 들면 다음과 같습니다.
|
|
291
306
|
|
|
292
307
|
```bash
|
|
293
308
|
lterm agent claude
|
|
@@ -309,11 +324,17 @@ lterm agy --status -- -p "lterm status를 유지해줘"
|
|
|
309
324
|
|
|
310
325
|
Claude/Codex/OpenCode/Copilot/Cursor Agent/Antigravity/Kiro/Jules/Aider/Goose/Amp/Crush/Kimi/Qwen/Gemini profile은 각 도구의 자체 TUI/status/alternate-screen 렌더링과 충돌하지 않도록 기본적으로 lterm status bar를 끈 raw full-terminal attach를 사용합니다. OMX/OMC는 기존 lightweight status/HUD 흐름과의 연속성을 위해 lterm status bar를 기본 표시하며, 특정 OMX/OMC 실행에서 완전 raw surface가 필요하면 `--no-status`를 쓰면 됩니다. `--status`로 lterm status bar를 강제로 켜거나, status bar가 표시되는 launch/profile에서는 `--no-status`로 숨길 수 있습니다. agent에 넘길 인자가 lterm launch option처럼 보일 수 있으면 앞에 `--`를 두세요. `lterm agent <name>`은 `PATH`에서 찾을 수 있는 안전한 bare command name이면 바로 동작하므로, 예를 들어 `lterm agent qwen-code`처럼 미래/서드파티 agent도 쓸 수 있습니다. `lterm run -- <command>`는 더 낮은 수준의 tmux-compatible primitive를 직접 쓰고 싶을 때만 사용하세요.
|
|
311
326
|
|
|
312
|
-
launcher 제어 옵션은 agent의 흔한 short flag(`-c` 등)를 빼앗지 않도록 long-only(`--name`, `--cwd`, `--detach`, `--status`, `--no-status`, `--status-theme`)입니다. 이 옵션들은 `claude`, `codex`, `opencode`, `copilot`, `cursor-agent`, `agy`, `kiro`, `jules`, `aider`, `goose`, `amp`, `crush`, `kimi`, `qwen`, `gemini`, `omx`, `omc`, `agent <profile>`에 동일하게 적용됩니다. 해당 agent 세션이 이후 attach에서도 특정 lterm status 색을 유지하게 하려면 `--status-theme` / `--status-color`를 사용하세요.
|
|
327
|
+
launcher 제어 옵션은 agent의 흔한 short flag(`-c` 등)를 빼앗지 않도록 long-only(`--name`, `--cwd`, `--detach`, `--status`, `--no-status`, `--status-theme`, `--status-color`)입니다. 이 옵션들은 `claude`, `codex`, `opencode`, `copilot`, `cursor-agent`, `agy`, `kiro`, `jules`, `aider`, `goose`, `amp`, `crush`, `kimi`, `qwen`, `gemini`, `omx`, `omc`, `agent <profile>`에 동일하게 적용됩니다. 해당 agent 세션이 이후 attach에서도 특정 lterm status 색을 유지하게 하려면 `--status-theme` / `--status-color`를 사용하세요.
|
|
313
328
|
`--detach`는 각 field의 control character와 Unicode line/paragraph separator를 공백으로 바꾼 `name<TAB>pane<TAB>command`를 출력하며, 나중에 `lterm resume <name>` 또는 호환 이름 `lterm attach <name>`으로 다시 붙으면 됩니다. detach record에는 `--cwd`가 포함되지 않으므로 나중에 필요하면 session을 조회하세요.
|
|
314
329
|
명시한 `--name`은 lterm의 일반 session-name 문법을 따르고 사용 중이지 않아야 합니다. 충돌 시 자동 suffix를 붙이지 않고 conflict error로 실패합니다.
|
|
315
330
|
이름에는 ASCII 문자/숫자와 `.`, `_`, `-`만 사용할 수 있고, `-` 또는 `%`로 시작할 수 없으며, 숫자만으로 이뤄질 수 없고, UUID처럼 보이면 안 되고, 128바이트를 넘을 수 없습니다.
|
|
316
|
-
`lterm agents` 또는 `lterm agents --json`으로 profile 기본값과 현재 `PATH`에서 binary를 찾을 수 있는지 확인할 수 있습니다. JSON row의 `kind` 값은
|
|
331
|
+
`lterm agents` 또는 `lterm agents --json`으로 profile 기본값과 현재 `PATH`에서 binary를 찾을 수 있는지 확인할 수 있습니다. JSON row의 `kind` 값은 다음 중 하나입니다.
|
|
332
|
+
|
|
333
|
+
- `built-in`: lterm이 기본 제공하는 `claude`, `codex`, `kiro` 같은 profile.
|
|
334
|
+
- `custom`: 사용자가 요청한 safe bare command name에서 만든 임시 profile.
|
|
335
|
+
- `configured`: 명시적인 `--agent-config` 파일에서 읽은 profile.
|
|
336
|
+
|
|
337
|
+
`lterm agents codex my-agent --json`처럼 profile 이름을 넘기면 선택한 built-in/custom/configured profile만 확인합니다. availability는 실행 시점의 PATH probe입니다. Built-in은 `lterm agents`에 표시되는 binary 이름을 그대로 `PATH`에서 찾습니다. 대부분 profile 이름과 같지만 `kiro`는 `kiro-cli`를 사용합니다. 따라서 `lterm kiro`에는 `PATH`에서 찾을 수 있는 `kiro-cli`가 필요합니다. provider가 다른 command 이름으로 설치된다면 추측 alias에 의존하지 말고 `lterm agent <command>`나 configured profile을 사용하세요.
|
|
317
338
|
반복해서 쓰는 custom alias는 명시적인 JSON config 파일로 넘길 수 있습니다.
|
|
318
339
|
|
|
319
340
|
```bash
|
|
@@ -325,7 +346,14 @@ lterm agent repo-review --agent-config agents.json -- exec "이 저장소를 리
|
|
|
325
346
|
```
|
|
326
347
|
|
|
327
348
|
configured name과 binary는 `lterm agent <profile>`과 같은 안전한 profile 문법을 사용하며, built-in 이름은 재정의할 수 없습니다.
|
|
328
|
-
|
|
349
|
+
Configured profile 규칙:
|
|
350
|
+
|
|
351
|
+
- `binary`는 shell fragment나 path가 아니라 `PATH`에서 찾는 bare command name이어야 합니다.
|
|
352
|
+
- `binary`의 기본값은 `name`입니다.
|
|
353
|
+
- `session_base`의 기본값은 `<name>-lterm`입니다.
|
|
354
|
+
- `status_default`의 기본값은 `true`이며, field가 있을 때는 boolean이어야 합니다.
|
|
355
|
+
- 중복 이름과 알 수 없는 JSON field는 거부됩니다.
|
|
356
|
+
- `--agent-config`를 넘긴 경우 built-in이 아닌 선택 이름은 그 파일 안에 있어야 합니다.
|
|
329
357
|
|
|
330
358
|
**Oh My Codex를 shim이 적용된 세션에서 실행:**
|
|
331
359
|
|
|
@@ -339,8 +367,7 @@ lterm omx --madmax --xhigh
|
|
|
339
367
|
|
|
340
368
|
```bash
|
|
341
369
|
lterm omc team
|
|
342
|
-
#
|
|
343
|
-
# 설치된 `omc --help`에 해당 flag가 보이지 않는다면 --xhigh 없이 --madmax만 사용하세요.
|
|
370
|
+
# 설치된 `omc --help`에 --xhigh가 보이지 않는다면 --xhigh 없이 --madmax만 사용하세요.
|
|
344
371
|
lterm omc --madmax
|
|
345
372
|
```
|
|
346
373
|
|
|
@@ -386,7 +413,7 @@ tmux `-f` filter는 조용히 무시하지 않고 의도적으로 거부합니
|
|
|
386
413
|
lterm notify --title 'Task complete' --body 'All checks passed'
|
|
387
414
|
```
|
|
388
415
|
|
|
389
|
-
`lterm notify`는 먼저 `cmux notify`를 시도합니다. 사용할 수 없으면 OSC 777을 출력해 cmux나 호환 터미널이 알림을 표시할 수 있도록 합니다. fallback OSC에 들어가는 알림 필드는 터미널 제어 문자를 제거한 뒤 출력하며, subtitle/body 구분용 newline 같은 문자는
|
|
416
|
+
`lterm notify`는 먼저 `cmux notify`를 시도합니다. 사용할 수 없으면 OSC 777을 출력해 cmux나 호환 터미널이 알림을 표시할 수 있도록 합니다. fallback OSC에 들어가는 알림 필드는 터미널 제어 문자를 제거한 뒤 출력하며, subtitle/body 구분용 newline 같은 문자는 그대로 내보내지 않고 공백으로 바꿔 OSC 777 framing을 유지합니다.
|
|
390
417
|
|
|
391
418
|
Agent workflow에서 특정 세션 조건에 묶인 알림이 필요하면 `lterm watch <target> --exit --notify` 또는 `lterm watch <target> --contains DONE --notify`를 우선 사용하세요.
|
|
392
419
|
|
|
@@ -420,7 +447,7 @@ lterm ssh devbox main -- -p 2222 -i ~/.ssh/id_ed25519
|
|
|
420
447
|
|
|
421
448
|
**터미널 출력은 그대로 전달됩니다.** `lterm resume`(호환 이름: `lterm attach`)은 full-screen 터미널 프로그램과 cmux/OSC 알림이 정상 동작하도록 PTY byte를 그대로 통과시킵니다. 로컬 상태 바는 클라이언트 쪽 표시 요소일 뿐이며, 완전한 raw 모드 터미널이 필요하면 `--no-status`를 사용하세요. 신뢰할 수 없는 child 프로그램은 tmux/screen에서와 마찬가지로 attach된 터미널에 escape sequence를 출력할 수 있습니다. **`lterm`을 escape-sequence sanitizer나 sandbox로 사용하지 마세요.**
|
|
422
449
|
|
|
423
|
-
**Capture 출력은
|
|
450
|
+
**Capture 출력은 표시/로깅 전에 terminal control sequence를 제거합니다.** `lterm logs`(호환 이름: `lterm capture`), `lterm compose`(alias: `lterm mobile`), `tmux capture-pane`은 captured scrollback을 출력할 때 일반적인 터미널 제어 시퀀스를 제거합니다. 그래도 scrollback text는 신뢰할 수 없는 프로그램 출력일 수 있으므로 사람이나 agent에게 넘기기 전에 확인하세요. `compose`는 attach가 아닌 view에서 기존 input/send 경로로 텍스트를 commit하며, raw attached PTY stream을 변환하지 않습니다.
|
|
424
451
|
|
|
425
452
|
**프로세스 가시성.** `lterm processes [session]`(호환 이름: `lterm ps [session]`)은 process-group id와 함께 각 세션 child 아래의 process tree를 보여 줍니다. `--orphans`를 추가하면 기록된 session root의 descendant가 아니지만 같은 process group에 남아 있는 row도 함께 보여 주므로, Codex/OMX/MCP subprocess가 누적되어 메모리 누수처럼 커지기 전에 확인할 수 있습니다. 시스템 `ps`는 절대 경로로 호출하며, 형식이 잘못된 process row는 추측하지 않고 건너뜁니다.
|
|
426
453
|
|
|
@@ -428,7 +455,7 @@ lterm ssh devbox main -- -p 2222 -i ~/.ssh/id_ed25519
|
|
|
428
455
|
|
|
429
456
|
**Popup 명령.** `tmux-compat display-popup`은 tmux와 비슷한 동작을 위해 요청된 명령을 사용자 shell로 실행합니다. **신뢰할 수 없는 popup 명령을 전달하지 마세요.**
|
|
430
457
|
|
|
431
|
-
**빌드 재현성.** 릴리스 빌드는 커밋된 lockfile을 사용하세요: `cargo build --release --locked`. 현재 lockfile은 `serde_json 1.0.149
|
|
458
|
+
**빌드 재현성.** 릴리스 빌드는 커밋된 lockfile을 사용하세요: `cargo build --release --locked`. 현재 lockfile은 `serde_json 1.0.149`와 registry dependency인 `zmij 1.0.21`을 고정합니다. 둘 다 Cargo가 lockfile에 따라 resolve하는 crate이며, 로컬에 vendor된 crate가 아닙니다. `cargo tree --locked -p serde_json`으로 의존성 집합을 확인할 수 있습니다.
|
|
432
459
|
|
|
433
460
|
## 현재 제한 사항
|
|
434
461
|
|
package/README.md
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
- **What** — A persistent terminal session daemon (like tmux, but smaller) with a tmux-compatible command layer for AI agent tooling. Detach and reattach by name or pane id.
|
|
8
8
|
- **Who it's for** — Terminal-first coding agents such as Claude Code, Codex CLI, OpenCode, GitHub Copilot CLI, Cursor Agent, Antigravity/`agy`, Kiro, Jules, Aider, Goose, Amp, Crush, Kimi, Qwen, Gemini CLI, `oh-my-codex` / `oh-my-claude`, and users running them inside `cmux`.
|
|
9
|
-
- **How** — `lterm start` to create, `lterm resume` to (re)connect, `lterm agent <profile>` / `lterm claude` / `lterm codex` / `lterm opencode` / `lterm agy` / `lterm kiro` / `lterm gemini`
|
|
10
|
-
- **Status** — alpha MVP.
|
|
9
|
+
- **How** — `lterm start` to create, `lterm resume` to (re)connect, and `lterm agent <profile>` / `lterm claude` / `lterm codex` / `lterm opencode` / `lterm agy` / `lterm kiro` / `lterm gemini` as examples of built-in shortcuts for shimmed agent runs. Inside a tmux-enabled session, the `tmux` command resolves to `lterm tmux-compat`.
|
|
10
|
+
- **Status** — alpha MVP with a documented 1.0 command/output compatibility boundary. It is a same-user convenience daemon — **not** a sandbox, an escape-sequence sanitizer, or a full tmux replacement.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -64,7 +64,7 @@ npm install -g @ictechgy/lterm
|
|
|
64
64
|
|
|
65
65
|
Homebrew and npm both install the `lterm` command on your `PATH`; verify with `lterm --version`.
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
Prefer an agent-assisted install? Copy the prompt in
|
|
68
68
|
[`docs/agent-install.md`](docs/agent-install.md) into Claude Code, Codex CLI,
|
|
69
69
|
OpenCode, GitHub Copilot CLI, Cursor Agent, Antigravity/`agy`, Kiro, Jules, Aider, Goose, Amp, Crush, Kimi, Qwen, Gemini CLI, or another terminal coding agent. It asks the agent to detect your
|
|
70
70
|
platform, install `lterm`, verify it with a smoke test, and avoid modifying
|
|
@@ -74,13 +74,14 @@ For the 1.0 command/output stability boundary, see the
|
|
|
74
74
|
[public contract](docs/public-contract.md) and its machine-readable
|
|
75
75
|
[contract manifest](docs/contract-manifest.json).
|
|
76
76
|
|
|
77
|
-
With Cargo from GitHub
|
|
77
|
+
With Cargo from GitHub, pin a release tag. The example below uses the current
|
|
78
|
+
README release; check the Releases page for newer tags:
|
|
78
79
|
|
|
79
80
|
```bash
|
|
80
|
-
cargo install --git https://github.com/ictechgy/light_terminal --tag v1.0.
|
|
81
|
+
cargo install --locked --git https://github.com/ictechgy/light_terminal --tag v1.0.8
|
|
81
82
|
```
|
|
82
83
|
|
|
83
|
-
|
|
84
|
+
Building from this checkout requires Rust 1.85 or newer:
|
|
84
85
|
|
|
85
86
|
```bash
|
|
86
87
|
cargo build --release --locked
|
|
@@ -97,7 +98,8 @@ To expose the tmux shim:
|
|
|
97
98
|
|
|
98
99
|
```bash
|
|
99
100
|
lterm install-shim
|
|
100
|
-
# Add the printed directory to PATH ahead of the real tmux, or eval the helper:
|
|
101
|
+
# Add the printed directory to PATH ahead of the real tmux, or inspect and eval the helper:
|
|
102
|
+
lterm env
|
|
101
103
|
eval "$(lterm env)"
|
|
102
104
|
# fish:
|
|
103
105
|
lterm env --shell fish | source
|
|
@@ -113,7 +115,7 @@ lterm env --shell fish | source
|
|
|
113
115
|
lterm start -n api -- npm run dev
|
|
114
116
|
```
|
|
115
117
|
|
|
116
|
-
**Create detached
|
|
118
|
+
**Create a detached session and attach later:**
|
|
117
119
|
|
|
118
120
|
```bash
|
|
119
121
|
lterm start -d -n api -- npm run dev
|
|
@@ -148,7 +150,7 @@ lterm -a api
|
|
|
148
150
|
| Diagnose daemon and shim state | `lterm doctor --json` | `status` |
|
|
149
151
|
| Collect a redacted local diagnostic bundle | `lterm diagnose --bundle` | None |
|
|
150
152
|
| Preview local setup steps | `lterm init --shell zsh` | None |
|
|
151
|
-
| Generate shell completions | `lterm completions zsh > ~/.zfunc/_lterm` | None |
|
|
153
|
+
| Generate shell completions | `mkdir -p ~/.zfunc && lterm completions zsh > ~/.zfunc/_lterm` | None |
|
|
152
154
|
| Run the background daemon explicitly | `lterm daemon` | None |
|
|
153
155
|
| Stop the daemon and all sessions | `lterm shutdown` | None |
|
|
154
156
|
|
|
@@ -168,6 +170,8 @@ Agent and shim utilities are also product CLI commands, not tmux aliases:
|
|
|
168
170
|
Use `eval "$(lterm env)"` only when you trust the `lterm` binary on your `PATH`.
|
|
169
171
|
It emits fixed `export` lines that prepend the shim directory to `$PATH`.
|
|
170
172
|
For fish, use `lterm env --shell fish | source` after the same trust check.
|
|
173
|
+
If you do not want to eval or source generated shell, run `lterm env` first and
|
|
174
|
+
copy only the export lines you expect into your shell startup file.
|
|
171
175
|
|
|
172
176
|
`lterm ssh` forwards remote PTY bytes to the local terminal without sanitizing
|
|
173
177
|
terminal control sequences, so a compromised remote can drive terminal features
|
|
@@ -183,9 +187,9 @@ Compatibility names are subcommands unless shown as a leading flag: `-a` is the
|
|
|
183
187
|
|
|
184
188
|
This table is the product CLI surface for humans and agents. `lterm tmux-compat ...` is a separate shim namespace for scripts that already speak tmux; not every product command has a tmux-compatible spelling. Use `lterm tmux-compat list-commands` to inspect the supported shim subset at runtime.
|
|
185
189
|
|
|
186
|
-
`lterm sessions` hides child panes by default, preserves the original first five tab-separated columns (`name`, `pane`, `alive`, `cwd`, `command`), then appends attach state (`attached` / `detached`) and parent pane (`-` or a pane id). The compatibility names `lterm list` and `lterm ls` keep the same output shape. Attached clients render a small status bar on the bottom row showing the current session and pane; the PTY is resized to the remaining rows. For the older raw full-terminal resume, use `lterm resume --no-status api` (or compatibility name `lterm attach --no-status api`),
|
|
190
|
+
`lterm sessions` hides child panes by default, preserves the original first five tab-separated columns (`name`, `pane`, `alive`, `cwd`, `command`), then appends attach state (`attached` / `detached`) and parent pane (`-` or a pane id). The compatibility names `lterm list` and `lterm ls` keep the same output shape. Attached clients render a small status bar on the bottom row showing the current session and pane; the PTY is resized to the remaining rows. For the older raw full-terminal resume, use `lterm resume --no-status api` (or compatibility name `lterm attach --no-status api`), set `LTERM_NO_STATUS=1`, or use the equivalent `LTERM_STATUS=0` for clients whose status-line handling conflicts with lterm.
|
|
187
191
|
|
|
188
|
-
`lterm rename <target> <new-name>` renames a running session without restarting its process. Renaming a session to its current name is a no-op success, while renaming over a different in-use name fails with a conflict error. `<target>` accepts a session name, session id, pane id (`%0`), or bare pane number (`0`); `<new-name>` follows the same syntax rules as `--name`.
|
|
192
|
+
`lterm rename <target> <new-name>` renames a running session without restarting its process. Renaming a session to its current name is a no-op success, while renaming over a different in-use name fails with a conflict error. `<target>` accepts a session name, session id, pane id (`%0`), or bare pane number (`0`); a bare numeric target is interpreted as a pane number because session names cannot be all digits. `<new-name>` follows the same syntax rules as `--name`.
|
|
189
193
|
|
|
190
194
|
`lterm status-theme <target> <theme>` (alias: `lterm theme`) stores a per-session status bar theme without restarting the PTY; pane ids resolve to their session. Use `default`, `clear`, or `none` to remove the session override and return to the attaching client's default. Already-attached clients keep their current status color until they detach and reattach. New sessions can set the same metadata at creation time with `lterm start --status-theme green -n api -- npm run dev` (or alias `--status-color`).
|
|
191
195
|
|
|
@@ -205,7 +209,7 @@ bytes. It is for opt-in debugging of intermittent render issues; it does not
|
|
|
205
209
|
replay bytes to stdout, caps raw capture at `--max-bytes` (default 16 MiB), and
|
|
206
210
|
refuses to overwrite existing trace files unless `--force` is passed.
|
|
207
211
|
|
|
208
|
-
`lterm wait <target> --exit
|
|
212
|
+
`lterm wait <target> --exit / --contains <text>` blocks until a session exits or its sanitized scrollback contains a marker. Add `--timeout 250ms|2s|5m|1h`, `--tail N`, and `--json` for automation-friendly health checks. On timeout, `wait` / `watch` return exit code `124` and JSON reports `timed_out: true`. `lterm watch` uses the same conditions and can add `--notify` to emit a cmux-friendly completion notification without altering attached PTY bytes; with `--json`, stdout stays machine-readable even when notification fallback is needed.
|
|
209
213
|
|
|
210
214
|
Set `LTERM_STATUS_STYLE=full` or `LTERM_STATUS_STYLE=minimal` to choose the visual style. `full` (default for local terminals) draws a colored bar; `minimal` drops all SGR colors in favor of plain text. SSH sessions (detected via `SSH_CONNECTION`, `SSH_CLIENT`, or `SSH_TTY`) default to `minimal` to avoid color-mapping issues on mobile SSH clients like Termius, unless a session or environment theme is explicitly set.
|
|
211
215
|
|
|
@@ -242,11 +246,11 @@ Reset a session override with `lterm status-theme api default` (or `clear` / `no
|
|
|
242
246
|
|
|
243
247
|
When the attached PTY enters the alternate screen buffer (e.g. `vim`, `less`, `htop` via `\x1b[?1049h`), lterm suspends its status bar to avoid conflicting with the application's UI. The status bar is redrawn immediately when the application exits alt-screen.
|
|
244
248
|
|
|
245
|
-
If `lterm resume` / `lterm attach` panics or
|
|
249
|
+
If `lterm resume` / `lterm attach` panics or exits unexpectedly and reaches lterm's recovery hook, it emits a minimal best-effort recovery sequence (scroll region reset, cursor visible, alt-screen exit, SGR reset) so the user's terminal is less likely to be left in raw mode or with a hidden cursor.
|
|
246
250
|
|
|
247
251
|
Session names containing CJK characters or emoji (including ZWJ families, country flags, and combining marks) are aligned by display width using `unicode-width` and `unicode-segmentation`, so the status bar stays correctly padded across mixed-width content.
|
|
248
252
|
|
|
249
|
-
When a child application enables the Kitty keyboard protocol through `CSI u` enhancement sequences, lterm tracks that and best-effort
|
|
253
|
+
When a child application enables the Kitty keyboard protocol through `CSI u` enhancement sequences, lterm tracks that and makes a best-effort attempt to restore the terminal keyboard mode when attach exits so a crashed child does not leave later shell input looking like `1;1:3u` escape fragments.
|
|
250
254
|
|
|
251
255
|
**Inspect or control a session:**
|
|
252
256
|
|
|
@@ -310,7 +314,7 @@ lterm amp
|
|
|
310
314
|
lterm crush
|
|
311
315
|
lterm kimi
|
|
312
316
|
lterm qwen
|
|
313
|
-
lterm gemini -- -p "summarize this repo" #
|
|
317
|
+
lterm gemini -- -p "summarize this repo" # Gemini CLI also accepts -p
|
|
314
318
|
lterm agents
|
|
315
319
|
```
|
|
316
320
|
|
|
@@ -336,11 +340,17 @@ lterm agy --status -- -p "keep lterm status visible"
|
|
|
336
340
|
|
|
337
341
|
Known Claude/Codex/OpenCode/Copilot/Cursor Agent/Antigravity/Kiro/Jules/Aider/Goose/Amp/Crush/Kimi/Qwen/Gemini profiles default to a raw full-terminal attach without the lterm status bar, so their own TUI/status/alternate-screen rendering stays in control. OMX/OMC keep the lterm status bar visible by default for continuity with their existing lightweight status/HUD workflow; use `--no-status` if a specific OMX/OMC run needs a fully raw surface. Use `--status` to force the lterm status bar on, or `--no-status` to suppress it for any launch/profile that would otherwise show it. Put `--` before agent arguments that could be parsed as lterm launch options. `lterm agent <name>` also works for any safe bare command name available in `PATH` (for example `lterm agent qwen-code`); use `lterm run -- <command>` only when you want the lower-level tmux-compatible primitive directly.
|
|
338
342
|
|
|
339
|
-
Launcher controls are long-only (`--name`, `--cwd`, `--detach`, `--status`, `--no-status`, `--status-theme`) so common agent short flags such as `-c` pass through naturally. They apply uniformly to built-in agent shortcuts such as `claude`, `codex`, `opencode`, `copilot`, `cursor-agent`, `agy`, `kiro`, `jules`, `aider`, `goose`, `amp`, `crush`, `kimi`, `qwen`, `gemini`, `omx`, `omc`, and `agent <profile>`. Use `--status-theme` / `--status-color` on agent launches when you want that session to keep a specific lterm status color across future attaches.
|
|
343
|
+
Launcher controls are long-only (`--name`, `--cwd`, `--detach`, `--status`, `--no-status`, `--status-theme`, `--status-color`) so common agent short flags such as `-c` pass through naturally. They apply uniformly to built-in agent shortcuts such as `claude`, `codex`, `opencode`, `copilot`, `cursor-agent`, `agy`, `kiro`, `jules`, `aider`, `goose`, `amp`, `crush`, `kimi`, `qwen`, `gemini`, `omx`, `omc`, and `agent <profile>`. Use `--status-theme` / `--status-color` on agent launches when you want that session to keep a specific lterm status color across future attaches.
|
|
340
344
|
`--detach` prints `name<TAB>pane<TAB>command` with control characters and Unicode line/paragraph separators in each field replaced by spaces; resume later with `lterm resume <name>` or compatibility name `lterm attach <name>`. The detach record does not echo `--cwd`; query the session if you need to inspect it later.
|
|
341
|
-
Explicit `--name` values use lterm's normal session-name syntax and must be
|
|
345
|
+
Explicit `--name` values use lterm's normal session-name syntax and must not already be in use; they do not auto-suffix on conflict, so an in-use name fails with a conflict error.
|
|
342
346
|
Names may contain ASCII letters, digits, `.`, `_`, and `-`, must not start with `-` or `%`, must not consist only of digits, must not look like a UUID, and are limited to 128 bytes.
|
|
343
|
-
Use `lterm agents` (or `lterm agents --json`) to inspect profile defaults and whether their binaries are currently available in `PATH`. JSON rows use `kind` values of
|
|
347
|
+
Use `lterm agents` (or `lterm agents --json`) to inspect profile defaults and whether their binaries are currently available in `PATH`. JSON rows use `kind` values of:
|
|
348
|
+
|
|
349
|
+
- `built-in` for profiles shipped by lterm, such as `claude`, `codex`, or `kiro`;
|
|
350
|
+
- `custom` for safe bare commands discovered from the names you request; and
|
|
351
|
+
- `configured` for profiles loaded from an explicit `--agent-config` file.
|
|
352
|
+
|
|
353
|
+
Pass profile names, such as `lterm agents codex my-agent --json`, to inspect a selected built-in/custom/configured set; availability is a point-in-time PATH probe. Built-ins resolve the binary names shown by `lterm agents`; most match the profile name, while `kiro` resolves `kiro-cli`. If a provider installs a different command name, use `lterm agent <command>` or a configured profile rather than relying on a guessed alias.
|
|
344
354
|
For reusable custom aliases, pass an explicit JSON config file:
|
|
345
355
|
|
|
346
356
|
```bash
|
|
@@ -352,7 +362,14 @@ lterm agent repo-review --agent-config agents.json -- exec "review this repo"
|
|
|
352
362
|
```
|
|
353
363
|
|
|
354
364
|
Configured names and binaries use the same safe profile syntax as `lterm agent <profile>`; built-in names cannot be redefined.
|
|
355
|
-
|
|
365
|
+
Configured profile rules:
|
|
366
|
+
|
|
367
|
+
- `binary` must be a bare command name resolved from `PATH`, not a shell fragment or path.
|
|
368
|
+
- `binary` defaults to `name`.
|
|
369
|
+
- `session_base` defaults to `<name>-lterm`.
|
|
370
|
+
- `status_default` defaults to `true` and must be a boolean when present.
|
|
371
|
+
- duplicate names and unknown JSON fields are rejected.
|
|
372
|
+
- when `--agent-config` is supplied, non-built-in selected names must exist in that file.
|
|
356
373
|
|
|
357
374
|
**Run Oh My Codex inside a shimmed session:**
|
|
358
375
|
|
|
@@ -409,7 +426,7 @@ This gives cmux a real pane to decorate while `lterm` retains scrollback capture
|
|
|
409
426
|
lterm notify --title 'Task complete' --body 'All checks passed'
|
|
410
427
|
```
|
|
411
428
|
|
|
412
|
-
`lterm notify` first tries `cmux notify`. If that's unavailable, it emits OSC 777 so cmux or another compatible terminal can still surface the notification. Notification fields are stripped of terminal control characters before falling back to OSC; subtitle/body separators such as newlines are
|
|
429
|
+
`lterm notify` first tries `cmux notify`. If that's unavailable, it emits OSC 777 so cmux or another compatible terminal can still surface the notification. Notification fields are stripped of terminal control characters before falling back to OSC; subtitle/body separators such as newlines are replaced with spaces rather than emitted verbatim, which keeps the OSC 777 framing intact.
|
|
413
430
|
|
|
414
431
|
For agent workflows, prefer `lterm watch <target> --exit --notify` or `lterm watch <target> --contains DONE --notify` when the notification should be tied to a specific session condition.
|
|
415
432
|
|
|
@@ -443,7 +460,7 @@ the old code until they are stopped.
|
|
|
443
460
|
|
|
444
461
|
**Terminal output is forwarded as-is.** `lterm resume` (compatibility name: `lterm attach`) passes PTY bytes through so full-screen terminal programs and cmux/OSC notifications keep working. The local status bar is purely a client-side decoration; use `--no-status` for a fully raw terminal surface. Untrusted child programs can still emit terminal escape sequences to an attached terminal — exactly as under tmux/screen. **Do not use `lterm` as an escape-sequence sanitizer or sandbox.**
|
|
445
462
|
|
|
446
|
-
**Capture output is sanitized
|
|
463
|
+
**Capture output is terminal-control-sanitized before display/logging.** `lterm logs` (compatibility name: `lterm capture`), `lterm compose` (alias: `lterm mobile`), and `tmux capture-pane` strip common terminal control sequences before printing scrollback. Scrollback text can still be untrusted program output, so review it before feeding it to humans or agents. `compose` is a non-attached view that commits text through the existing input/send path; it does not transform raw attached PTY streams.
|
|
447
464
|
|
|
448
465
|
**Process visibility.** `lterm processes [session]` (or compatibility name `lterm ps [session]`) shows the process tree rooted at each session child, including process-group ids. Add `--orphans` to also include same-process-group rows that are no longer descendants of the recorded session root, so long-running Codex/OMX/MCP subprocess buildup stays visible before it becomes a memory-leak surprise. The system `ps` is invoked by absolute path, and malformed process rows are skipped rather than guessed at.
|
|
449
466
|
|
|
@@ -451,7 +468,7 @@ the old code until they are stopped.
|
|
|
451
468
|
|
|
452
469
|
**Popup commands.** `tmux-compat display-popup` runs the requested command through the user's shell to preserve tmux-like behavior. **Do not pass untrusted popup commands.**
|
|
453
470
|
|
|
454
|
-
**Build reproducibility.** Use the committed lockfile for release builds: `cargo build --release --locked`. The current lockfile pins `serde_json 1.0.149
|
|
471
|
+
**Build reproducibility.** Use the committed lockfile for release builds: `cargo build --release --locked`. The current lockfile pins `serde_json 1.0.149` and its registry dependency `zmij 1.0.21`; both are resolved by Cargo from the lockfile, not vendored locally. Verify the dependency set with `cargo tree --locked -p serde_json`.
|
|
455
472
|
|
|
456
473
|
## Current limitations
|
|
457
474
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ictechgy/lterm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Lightweight tmux-compatible terminal session daemon with cmux-friendly notifications.",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/ictechgy/light_terminal#readme",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"LICENSE-MIT"
|
|
32
32
|
],
|
|
33
33
|
"optionalDependencies": {
|
|
34
|
-
"lterm-darwin-arm64": "1.0.
|
|
35
|
-
"lterm-darwin-x64": "1.0.
|
|
36
|
-
"lterm-linux-arm64": "1.0.
|
|
37
|
-
"lterm-linux-x64": "1.0.
|
|
34
|
+
"lterm-darwin-arm64": "1.0.8",
|
|
35
|
+
"lterm-darwin-x64": "1.0.8",
|
|
36
|
+
"lterm-linux-arm64": "1.0.8",
|
|
37
|
+
"lterm-linux-x64": "1.0.8"
|
|
38
38
|
},
|
|
39
39
|
"engines": {
|
|
40
40
|
"node": ">=16"
|