stackbite 0.5.19 → 0.5.21
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 +322 -322
- package/package.json +25 -25
- package/packaging/npm/release.json +16 -16
package/README.md
CHANGED
|
@@ -1,322 +1,322 @@
|
|
|
1
|
-
# Stackbite: Local Multi-Agent Work App
|
|
2
|
-
|
|
3
|
-
> Work Stack organizes the work. Stackbite gets it moving.
|
|
4
|
-
>
|
|
5
|
-
> Work Stack으로 정리하고, Stackbite로 실행한다.
|
|
6
|
-
|
|
7
|
-
Stackbite는 Windows ConPTY와 Linux POSIX PTY를 사용하는 로컬 멀티 에이전트 작업 앱입니다.
|
|
8
|
-
Room에 작업 경로와 목표를 정하고, Seat에서 셸·Codex·Claude 같은 설치된 CLI를 병렬로
|
|
9
|
-
실행합니다. TUI에서 방을 이동하거나 종료해도 데몬이 소유한 터미널은 계속 실행됩니다.
|
|
10
|
-
Work Stack 없이 사용할 수 있으며, Work Stack 연결은 Task 권한과 실행을 분리합니다.
|
|
11
|
-
|
|
12
|
-
## 설치와 실행
|
|
13
|
-
|
|
14
|
-
공개 [Stackbite 배포 저장소](https://github.com/Shinick-Han/stackbite/releases/tag/v0.5.
|
|
15
|
-
검증된 **0.5.
|
|
16
|
-
핵심 소스 저장소 `Shinick-Han/helm`은 비공개로 유지합니다.
|
|
17
|
-
|
|
18
|
-
0.5.
|
|
19
|
-
Alt+Shift+Z로 집중 화면, F6로 Seats 이동을 사용할 수 있습니다. 기존 키맵과 실행
|
|
20
|
-
기본값은 유지됩니다. [Rust 화면과 실행 소유권 안내](docs/release-0.5.
|
|
21
|
-
|
|
22
|
-
### npm / npx 설치
|
|
23
|
-
|
|
24
|
-
Node.js 20 이상과 `tar`가 있는 Windows x64 또는 glibc Linux x64에서 실행합니다.
|
|
25
|
-
Python 설치는 필요하지 않으며 첫 실행은 검증된 런타임을 내려받고 다음부터 캐시를 사용합니다.
|
|
26
|
-
아래 두 방식 중 하나를 선택하면 됩니다. 전역 설치는 작은 런처를 설치하고,
|
|
27
|
-
이어 `stackbite`를 처음 실행할 때 네이티브 런타임을 내려받습니다.
|
|
28
|
-
|
|
29
|
-
```sh
|
|
30
|
-
npx --yes stackbite
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
계속 사용할 명령으로 설치하려면:
|
|
34
|
-
|
|
35
|
-
```sh
|
|
36
|
-
npm install --global stackbite
|
|
37
|
-
stackbite
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
[npm registry](https://www.npmjs.com/package/stackbite)의 공개 패키지를 사용합니다.
|
|
41
|
-
특정 버전은 다음 GitHub TGZ URL로 지정할 수 있습니다.
|
|
42
|
-
|
|
43
|
-
```sh
|
|
44
|
-
npx --yes https://github.com/Shinick-Han/stackbite/releases/download/v0.5.18/stackbite-0.5.18.tgz
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
macOS·ARM·Alpine은 현재 지원 대상이 아닙니다.
|
|
48
|
-
[런처 설치·업데이트 안내](packaging/npm/README.md)를 참고하세요.
|
|
49
|
-
|
|
50
|
-
### 네이티브 실행 파일
|
|
51
|
-
|
|
52
|
-
Windows x64 ZIP의 **전체 압축을 해제한 뒤 `stackbite.exe`를 실행**합니다.
|
|
53
|
-
Linux x86_64 tar.gz는 전체를 해제하고 `./stackbite`를 실행합니다. 두 플랫폼 모두
|
|
54
|
-
`runtime/`을 실행 파일 옆에 유지하면 Python이나 소스 checkout 없이 동작합니다.
|
|
55
|
-
Linux의 최소 glibc 요구 사항은 `portable.json`의 `minimum_glibc`에 기록됩니다.
|
|
56
|
-
|
|
57
|
-
선택적으로 Windows의 `install.cmd` 또는 Linux의 `./install.sh`로 사용자 계정에 설치합니다.
|
|
58
|
-
Codex·Claude 등 provider CLI의 설치와 로그인은 별도입니다.
|
|
59
|
-
설치·롤백은 [Windows](packaging/README.md) / [Linux](packaging/linux/README.md) 안내를 따릅니다.
|
|
60
|
-
|
|
61
|
-
```text
|
|
62
|
-
stackbite
|
|
63
|
-
stackbite --help
|
|
64
|
-
stackbite --version
|
|
65
|
-
stackbite --status
|
|
66
|
-
stackbite agent --help
|
|
67
|
-
stackbite update --check
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
`--help`는 TUI나 백엔드를 시작하지 않습니다. `--version`은 실제 버전·커밋을,
|
|
71
|
-
`--status`는 실행·상태 경로를 확인하는 데 사용합니다. `stackbite update`는 배포 파일과
|
|
72
|
-
체크섬을 검증하여 설치하며, 실행 중인 백엔드와 CLI를 종료하지 않습니다. 소스 checkout은
|
|
73
|
-
Git으로 업데이트합니다. 이미 실행 중인 백엔드는 기존 코드를 사용하므로 새 기능은 그
|
|
74
|
-
백엔드를 명시적으로 재시작한 뒤 적용됩니다. 백엔드 재시작은 실행 중인 CLI를 종료합니다.
|
|
75
|
-
|
|
76
|
-
0.5.18은 지원되는 로컬 백엔드와 지속적인 인증 연결로 입력을 전달하고, 변경된
|
|
77
|
-
화면 행을 push로 받습니다. Windows PTY 수집은 출력 이벤트를 기다리며, 물리 셀
|
|
78
|
-
렌더링에서는 출력만 바뀌면 기존 UI 프레임을 재사용합니다. 확대·축소, 스크롤,
|
|
79
|
-
복사와 좌석 세대 검증을 유지하며, 기존 백엔드에는 HTTP 조회로 연결됩니다.
|
|
80
|
-
실제 PTY 지연 측정의 범위와 한계는 `docs/terminal-stream-ui-1008.md`를 참고하세요.
|
|
81
|
-
|
|
82
|
-
0.5.18은 단순 키 전달에 따른 불필요한 전체 화면 갱신을 줄이고, 검증된 불변
|
|
83
|
-
화면 행을 재사용합니다. 한 좌석이 바쁜 동안 다른 좌석의 화면 발행을 계속하며,
|
|
84
|
-
렌더 시간 자체를 갱신 간격에 포함합니다. 입력 ACK·실패 시 재전송 금지·좌석과
|
|
85
|
-
화면 소유권 검증은 유지합니다. 이번 직렬 PTY 측정과 한계는
|
|
86
|
-
`docs/next-latency-release-1008.md`에 기록합니다.
|
|
87
|
-
|
|
88
|
-
이하 기능·설정 안내는 공개된 **0.5.18** 기준입니다. 설치된 client/server의
|
|
89
|
-
실제 버전과 지원 기능은 각각 확인하세요.
|
|
90
|
-
|
|
91
|
-
### 오래된 VTE / Citrix 터미널
|
|
92
|
-
|
|
93
|
-
MATE Terminal의 VTE 0.52 환경에서 상태 원과 의자 glyph가 한 칸으로 표시되면,
|
|
94
|
-
새 frontend를 다음처럼 실행합니다. csh/tcsh에서도 같은 명령을 사용합니다.
|
|
95
|
-
|
|
96
|
-
```sh
|
|
97
|
-
env STACKBITE_CHROME_PROFILE=vte-0.52 ./stackbite
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
이 설정은 제품 UI의 두 glyph만 폭이 안정적인 표현으로 바꿉니다. 일반 터미널은
|
|
101
|
-
기본 UI를 유지하며, Seat 출력·사용자 이름·폰트·터미널 설정은 바뀌지 않습니다.
|
|
102
|
-
0.5.18는 지원되는 POSIX VT 터미널의 화면 행을 절대 위치로 출력하므로 raw tty의 LF 처리에 의존하지
|
|
103
|
-
않습니다. frontend만 다시 열어도 표시 수정이 적용되며 기존 backend와 Seat를
|
|
104
|
-
종료할 필요가 없습니다. [호환 설정과 검증 범위](docs/citrix-chrome-1008.md)를
|
|
105
|
-
참고하세요.
|
|
106
|
-
|
|
107
|
-
## Room과 Seat
|
|
108
|
-
|
|
109
|
-
현재 소스는 연결된 백엔드에 방이 없으면 작업 폴더를 채운 Room 생성 화면을 엽니다.
|
|
110
|
-
Enter로 Room과 기본 shell을 열며, 같은 폴더에서 다시 실행하면 기억한 유효 Room으로 돌아갑니다.
|
|
111
|
-
재접속만으로 중단된 Seat를 실행하지 않습니다. 다른 폴더·삭제된 Room이면 목록을 엽니다.
|
|
112
|
-
작업실 백엔드가 꺼져 있으면 로컬 8090에서 시작합니다.
|
|
113
|
-
방을 선택하고 Enter로 진입합니다. `F7` / `Alt+R`로 목록으로 돌아가며, 목록에서 `Esc`는
|
|
114
|
-
이전에 열었던 작업실로 돌아갑니다. Room 생성 화면에서 Esc를 누르면 목록으로 돌아갑니다.
|
|
115
|
-
목록 입력은 관리 동작이며 좌석의 CLI에 전달되지 않습니다.
|
|
116
|
-
|
|
117
|
-
설정은 Room 생성 화면의 `Ctrl+D` 또는 Help의 `s`로 저장합니다. CLI에서는
|
|
118
|
-
`stackbite config set chrome_profile vte-0.52`, `stackbite config set terminal_core python`처럼
|
|
119
|
-
한 번 저장하고 이후 `stackbite`만 실행하면 됩니다. 명시한 환경변수·실행 옵션은 저장값보다
|
|
120
|
-
우선합니다. [첫 사용](docs/first-use.md), [설정](docs/launch-preferences.md),
|
|
121
|
-
[clone 후 단일 명령 빌드](docs/build-local.md), [Node 없는 설치](docs/install-from-release.md)를 참고하세요.
|
|
122
|
-
|
|
123
|
-
화면 아래 `[+ Room]`, `[+ Terminal]`, `[Find seats]`로 방·터미널을 관리합니다.
|
|
124
|
-
방에는 이름·작업 폴더·공통 목표를 지정합니다. Seat는 역할·개별 작업·범위·완료 조건·
|
|
125
|
-
결과물·보고 대상을 가집니다. 이름을 바꿔도 내부 seat key와 실행 기록의 연결은 유지됩니다.
|
|
126
|
-
검색은 여러 방의 이름·역할·명령·작업 경로를 찾고 `Tab`으로 상태를 필터링합니다.
|
|
127
|
-
|
|
128
|
-
방 안에서 `Ctrl+T` / `Alt+T` 또는 `[+ New terminal]`을 선택하고 Enter를 누르면 기본 셸을
|
|
129
|
-
엽니다. `codex`, `claude`, `python -i` 같은 설치된 명령과 인자도 입력할 수 있습니다.
|
|
130
|
-
명령 선택창은 셸 연산자나 환경 변수를 자동 평가하지 않으므로 필요한 경우 셸 안에서 실행합니다.
|
|
131
|
-
기존 터미널은 sidebar에서 클릭해 전환합니다.
|
|
132
|
-
|
|
133
|
-
`[Split →]` / `[Split ↓]`로 같은 방의 두 터미널을 표시합니다. pane 클릭은 입력 대상을
|
|
134
|
-
바꾸고, 경계선 드래그는 크기를 조절합니다. `Alt+Z`는 현재 pane을 확대합니다.
|
|
135
|
-
좌석·터미널 우클릭 또는 `Alt+M` / `Shift+F10`은 Rename, Close, Restart CLI 메뉴를 엽니다.
|
|
136
|
-
좌석 패널의 `Delete`는 선택한 좌석을 닫고, 터미널 포커스의 `Delete`는 CLI에 전달됩니다.
|
|
137
|
-
종료 동작은 선택한 generation만 대상으로 하며 기록은 보존합니다.
|
|
138
|
-
|
|
139
|
-
꺼진 CLI 좌석을 선택하면 같은 좌석에 복구용 기본 셸을 엽니다. 원래 CLI 명령·모델·역할은
|
|
140
|
-
유지하며 `Restart CLI`로 원래 명령을 다시 실행합니다. 이전 복구 요청의 전달 결과가
|
|
141
|
-
불명확하면 먼저 그 요청을 조회합니다. 새 실행은 `Start new terminal (new request)` 또는
|
|
142
|
-
`Retry CLI (new request)`로 명시적으로 요청하며 이전 요청을 자동 재전송하지 않습니다.
|
|
143
|
-
|
|
144
|
-
방 우클릭의 Archive / Restore / Delete room 또는 `/room-delete`로 방을 관리합니다.
|
|
145
|
-
실행 중인 좌석이 있으면 먼저 명시적으로 종료해야 합니다. 삭제 확인창은 Cancel을 기본으로
|
|
146
|
-
선택합니다. 정지된 활성 방은 확인 후 보관·삭제하며 작업 폴더·Git worktree·실행 기록은 보존합니다.
|
|
147
|
-
Restore는 좌석을 자동 실행하지 않습니다. `Ctrl+Q`는 TUI 연결만 해제합니다.
|
|
148
|
-
|
|
149
|
-
| 관리 명령 | 동작 |
|
|
150
|
-
| --- | --- |
|
|
151
|
-
| `/room-new 작업 이름` | 현재 작업 경로에 빈 작업실 생성; 자동 진입·실행 없음 |
|
|
152
|
-
| `/room <번호 또는 room_id>` | 작업실 선택 |
|
|
153
|
-
| `/seat-new qa powershell` | 선택 방에 좌석을 만들고 명시적으로 실행 |
|
|
154
|
-
| `/seat-add qa codex` | 정지된 좌석 정의만 추가 |
|
|
155
|
-
| `/room-run qa 검토해줘` | 정지된 provider 좌석에서 headless 단발 실행 |
|
|
156
|
-
| `/room-history`, `/room-context qa` | 실행 기록·초기 컨텍스트 확인 |
|
|
157
|
-
| `/room-find 검색어`, `/room-filter active` | 작업실 검색·상태 필터 |
|
|
158
|
-
| `/room-worktree 작업 이름` | Git 커밋 HEAD에서 별도 worktree 작업실 생성 |
|
|
159
|
-
| `/spawn qa codex`, `/kill qa` | 선택 방의 좌석 실행·종료 |
|
|
160
|
-
| `/broadcast 점검해줘` | 선택 방의 살아 있는 좌석에 지시 |
|
|
161
|
-
| `/archive`, `/restore` | 정지된 작업실 보관·복원 |
|
|
162
|
-
|
|
163
|
-
## 터미널 입력과 출력
|
|
164
|
-
|
|
165
|
-
`Alt+H`로 검색 가능한 도움말을 엽니다. 도움말의 `Ctrl+P`로 관리 prefix를 활성화하고
|
|
166
|
-
`Ctrl+K`로 `Ctrl+B` / `Ctrl+A` / `Ctrl+Space` 중 선택합니다. prefix 뒤 `%` / `"`는
|
|
167
|
-
좌우·상하 분할, `o`는 pane 전환, `n`은 좌석 검색, `[`는 복사 모드입니다.
|
|
168
|
-
같은 prefix를 두 번 누르면 문자 하나를 CLI에 전달합니다. 도움말의 `Ctrl+L`로 관리
|
|
169
|
-
단축키를 해제하면 해당 키를 CLI에 전달할 수 있습니다.
|
|
170
|
-
|
|
171
|
-
출력 드래그는 선택 후 버튼을 놓으면 복사합니다. CLI가 마우스 입력을 요청하면 휠·왼쪽
|
|
172
|
-
클릭은 포인터 아래 CLI에 전달하며, `Shift`를 누른 드래그는 Stackbite 출력 선택입니다.
|
|
173
|
-
`Shift`+휠은 Stackbite 이력을 탐색합니다. 메뉴나 출력 선택 중에는 CLI에 마우스를 보내지 않습니다.
|
|
174
|
-
CLI 포인터 입력에는 백엔드의 `terminal_mouse`와 `terminal_geometry`가 모두 필요합니다.
|
|
175
|
-
실제 PTY 크기·화면 원점·좌석 generation이 확인된 라이브 화면에서만 좌표를 전달합니다.
|
|
176
|
-
오래된 백엔드에서는 안내에 따라 업데이트·재시작합니다.
|
|
177
|
-
[터미널 입력·크기 계약](docs/terminal-interaction-contract.md)에 자세한 규약이 있습니다.
|
|
178
|
-
|
|
179
|
-
`Shift+PageUp` / `Shift+PageDown`은 이력을 탐색하고 `End`는 라이브 화면으로 돌아갑니다.
|
|
180
|
-
분할 pane은 각자 이력 위치를 유지합니다. 보관량은 좌석마다 기본 2,000줄이며
|
|
181
|
-
백엔드 시작 전에 `STACKBITE_SCROLLBACK_LINES`로 1~20,000줄을 지정합니다.
|
|
182
|
-
잘못된 값은 기본값으로 돌아갑니다. 오래된 줄부터 제거하며 보관량을 늘리면 메모리도 늘어납니다.
|
|
183
|
-
이력은 메모리이므로 백엔드 재시작 시 초기화됩니다.
|
|
184
|
-
|
|
185
|
-
`Alt+C` 또는 prefix + `[`로 복사 모드를 열어 `/` 검색, `n` / `N` 다음·이전 결과,
|
|
186
|
-
`v` 선택, 방향키 이동, `y` 복사를 사용합니다. `Esc`로 돌아갑니다.
|
|
187
|
-
Windows는 시스템 클립보드를, Linux는 `Ctrl+O` 또는 `STACKBITE_CLIPBOARD_OSC52=1`로
|
|
188
|
-
명시적으로 허용한 OSC52를 사용합니다. 호스트 터미널의 OSC52 지원이 필요합니다.
|
|
189
|
-
|
|
190
|
-
터미널은 전경색·배경색·문자 속성과 결합 문자·이모지의 셀 폭을 보존합니다.
|
|
191
|
-
대체 화면의 짧은 출력 묶음과 DEC2026 동기화 구간은 표시 프레임을 합치지만 모든 바이트는
|
|
192
|
-
즉시 파싱합니다. 실행 완료는 표시 지연과 별개이며 모든 CLI 재도색을 완전히 재현하는 것은 아닙니다.
|
|
193
|
-
실제 PTY 기본 환경은 `TERM=xterm-256color`, `COLORTERM=truecolor`입니다.
|
|
194
|
-
호출자가 좌석 환경에 명시한 `NO_COLOR`, `TERM`, `COLORTERM`은 보존합니다.
|
|
195
|
-
|
|
196
|
-
## 에이전트 협업과 API
|
|
197
|
-
|
|
198
|
-
좌석 안에서는 `stackbite-room`으로 같은 방의 동료를 관리합니다.
|
|
199
|
-
|
|
200
|
-
```text
|
|
201
|
-
stackbite-room context
|
|
202
|
-
stackbite-room ready
|
|
203
|
-
stackbite-room summon reviewer --provider codex --task-file review-task.txt --scope src --acceptance "tests pass" --output-path review.md --report-to coordinator
|
|
204
|
-
stackbite-room send reviewer --prompt-file followup.txt
|
|
205
|
-
stackbite-room wait reviewer --generation RECEIPT_GENERATION --turn 4 --timeout 30
|
|
206
|
-
stackbite-room read reviewer
|
|
207
|
-
stackbite-room report --state progress --message "검토 중" --artifact review.md
|
|
208
|
-
stackbite-room inbox
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
`assign`은 작업 메타데이터를 바꾸고 `send`는 실제 지시를 제출합니다. 여러 지시는 같은
|
|
212
|
-
프로세스·대화에 전달됩니다. 바쁜 좌석·사용자 입력 초안·교체된 generation에는 지시를
|
|
213
|
-
거절하며 자동 재전송하지 않습니다. `report --state completed`는 에이전트 보고로 보존하며
|
|
214
|
-
provider 완료 증거와 구별합니다. Codex·Claude의 hooks는 시작·작업·승인 대기·응답 완료를
|
|
215
|
-
기록합니다. CLI 로그인, workspace 신뢰, hooks 신뢰와 도구 실행 승인은 provider 안에서 처리합니다.
|
|
216
|
-
Stackbite는 승인·sandbox를 우회하지 않습니다.
|
|
217
|
-
|
|
218
|
-
Python SDK `AgentStackbite`는 방을 대상으로 합니다. 외부 스크립트는 `room_id`를
|
|
219
|
-
명시하고, 좌석 안의 에이전트는 상속된 `STACKBITE_ROOM_ID`를 사용합니다. 인증된
|
|
220
|
-
`TaskRoomClient`로 위임하며 방이 없는 호출은 거절합니다. 직접 방 API를 사용하려면
|
|
221
|
-
`TaskRoomClient`를 사용합니다.
|
|
222
|
-
|
|
223
|
-
기존 방의 좌석을 조회하는 예:
|
|
224
|
-
|
|
225
|
-
```python
|
|
226
|
-
from private_pty import AgentStackbite, TaskRoomClient
|
|
227
|
-
|
|
228
|
-
sdk = AgentStackbite(room_id="review-room", client=TaskRoomClient())
|
|
229
|
-
seats = sdk.list_agents() # 이 방의 정의된 좌석; 정지된 좌석도 포함
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
좌석 안에서는 `AgentStackbite()`가 상속된 방을 사용합니다. 생성자는 데몬을 시작하거나
|
|
233
|
-
로컬 에이전트를 생성하지 않습니다.
|
|
234
|
-
|
|
235
|
-
기본 방 주소는 `http://127.0.0.1:8090`입니다. 명시적 `base_url`,
|
|
236
|
-
`STACKBITE_ROOM_BRIDGE_URL`, 기본 주소 순서로 선택합니다. 클라이언트는 상태 위치에서
|
|
237
|
-
기존 인증 토큰을 읽어 `X-Office-Token`으로 전송합니다. 토큰 값을 프롬프트나 로그에 넣지 않습니다.
|
|
238
|
-
|
|
239
|
-
```python
|
|
240
|
-
from private_pty import TaskRoomClient
|
|
241
|
-
|
|
242
|
-
client = TaskRoomClient()
|
|
243
|
-
room = client.create_worktree_room(
|
|
244
|
-
"입력 안정화", source_repo=r"C:\my-project",
|
|
245
|
-
objective="입력 회귀를 수정하고 테스트 결과를 보고한다",
|
|
246
|
-
)
|
|
247
|
-
rid = room["room_id"]
|
|
248
|
-
client.add_seat(rid, "qa", agent_kind="codex", role_title="회귀 검토")
|
|
249
|
-
result = client.run(rid, "qa", "입력 처리를 검토하고 결함을 보고해줘",
|
|
250
|
-
request_id="input-review-001", timeout=120)
|
|
251
|
-
history = client.executions(rid)
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
`run()`은 정지된 좌석의 명시적인 headless 단발 실행입니다. 대화형 `spawn` / `send`가
|
|
255
|
-
실패해도 headless 실행으로 바꾸지 않습니다. `dispatch()`는 살아 있는 대화형 CLI에
|
|
256
|
-
generation을 확인한 뒤 입력합니다. 지시별 request ID·generation·turn receipt로
|
|
257
|
-
전달과 완료를 구별합니다. 같은 ID·지시는 저장된 receipt를 반환하고 다른 지시는 충돌합니다.
|
|
258
|
-
불명확한 전달은 `unknown_delivery`로 보고하며 자동 재실행하지 않습니다.
|
|
259
|
-
|
|
260
|
-
완료는 owned process와 provider의 명시적 lifecycle 증거로 판정합니다. 잠깐의 출력 정지나
|
|
261
|
-
CLI 종료 코드 0만으로 AI 작업 성공을 판정하지 않습니다. blocked는 개입이 필요한 상태입니다.
|
|
262
|
-
결과물 등록·accepted/rejected 검토·외부 Task 완료는 각각 별도 동작입니다.
|
|
263
|
-
|
|
264
|
-
실행 저널은 지시·generation·turn·상태·완료 근거·최대 64 Ki 문자의 출력 스냅샷을 저장합니다.
|
|
265
|
-
모든 키 입력을 기록하는 transcript는 아닙니다. 백엔드 재시작은 셸 메모리를 복구하지 않으며
|
|
266
|
-
살아 있는 generation이 없는 미완료 실행은 interrupted로 표시합니다.
|
|
267
|
-
Windows 네이티브 실행은 전용 Job Object가 provider와 그 자식 프로세스를 소유합니다.
|
|
268
|
-
|
|
269
|
-
## 데이터와 Work Stack
|
|
270
|
-
|
|
271
|
-
새 설치는 Stackbite 이름의 경로를 사용합니다. 이전 설치의 실제 DB·토큰·설정은 상태
|
|
272
|
-
locator(`.stackbite-state.json`)와 파일 매핑으로 **현재 위치에서 재사용**합니다. 열려 있는 SQLite DB를 복사하거나
|
|
273
|
-
이름을 바꾸지 않습니다. 이전 제품명 경로가 실제 데이터 위치로 남아 있어도 추가 상태
|
|
274
|
-
트리를 만들 필요가 없습니다. 0.5.18의 `stackbite --status`는 실제 `state`와 인증 파일의
|
|
275
|
-
`auth_file` 경로를 반환합니다. 인증 파일은 그 경로를 사용하며, 상태 폴더 아래 고정된
|
|
276
|
-
새 파일명으로 추측하거나 별도 토큰을 만들지 않습니다. 토큰 내용은 출력하지 않습니다.
|
|
277
|
-
[호환성 안내](docs/stackbite-compatibility.md)에 durable data와 인증 경계가 있습니다.
|
|
278
|
-
|
|
279
|
-
Work Stack은 작업 정리와 Task 권한을, Stackbite는 로컬 Room/Seat 실행을 담당합니다.
|
|
280
|
-
연결 개발은 `integration/work-stack`에서 분리하고 병렬 실행·우선순위·의존성 기반 선택을
|
|
281
|
-
유지합니다. 선택한 Task의 workspace·revision을 확인한 뒤 방을 만들며 이 과정은 Task
|
|
282
|
-
상태를 수정하지 않습니다.
|
|
283
|
-
|
|
284
|
-
```powershell
|
|
285
|
-
python -m private_pty.workstack_link room --task T-0041 --cwd C:\my-project --isolated --source-repo C:\my-project
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
handoff의 첫 줄 `WorkStack binding:` JSON marker와 Task ID·workspace·revision 계약은
|
|
289
|
-
유지합니다. `publish_checkpoint()`는 새로 검증한 바인딩과 안정적인 intent ID로 호출자가
|
|
290
|
-
작성한 사실만 전달합니다. commit_unknown은 operation-status로 확인하고 mutation을
|
|
291
|
-
재전송하지 않습니다. 로그·프롬프트 자동 복사나 Task 자동 완료는 하지 않습니다.
|
|
292
|
-
|
|
293
|
-
초기 에이전트 컨텍스트에는 실제 cwd/worktree, 사용 가능한 CLI와 비밀값을 노출하지 않는
|
|
294
|
-
인증 API 사용법을 포함하며 다음 소개를 전달합니다.
|
|
295
|
-
|
|
296
|
-
> Stackbite는 현재 로컬에서 실행 중인 자체 멀티 에이전트 작업 앱이다.
|
|
297
|
-
|
|
298
|
-
## 개발과 성능 검토
|
|
299
|
-
|
|
300
|
-
```powershell
|
|
301
|
-
python -m pip install -r requirements-build.txt
|
|
302
|
-
python stackbite.py
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
핵심 구현은 `private_pty/`의 PTY·VT 버퍼·세션 registry·Room/Seat·실행 저널·Rich TUI와
|
|
306
|
-
`office_backend_bridge.py`의 인증 HTTP API입니다. 런타임 데이터와 개인 설정은 배포에 포함하지
|
|
307
|
-
않습니다. 별도 웹 UI는 `/stackbite/company_office_mockup.html`이며 `/agency-agents/`의
|
|
308
|
-
manifest identity는 유지합니다.
|
|
309
|
-
원격 웹 접속의 origin·신뢰 프록시는 `STACKBITE_ALLOWED_ORIGINS`·`STACKBITE_TRUSTED_PROXY_IPS`로
|
|
310
|
-
명시합니다. `X-Office-Token` 인증은 로컬 요청에도 필요합니다.
|
|
311
|
-
|
|
312
|
-
변경·검증·통합 경계는 [CONTRIBUTING.md](CONTRIBUTING.md)를 따릅니다.
|
|
313
|
-
실제 provider 테스트는 별도 opt-in이며 사용자 상태·진행 중인 좌석에서 실행하지 않습니다.
|
|
314
|
-
|
|
315
|
-
[최적화 후보](docs/optimization-candidates.md)는 우선순위·소스 근거·위험·검증을 정리합니다.
|
|
316
|
-
[기존 측정 보고서](docs/optimization/implementation-results-059.md)는 일부 렌더링·본문·저장소
|
|
317
|
-
개선과 함께 HTTP 서버 CPU 증가·일부 VT 재생 시간 증가를 기록합니다. 앱 전체가 빨라졌다고
|
|
318
|
-
주장하지 않습니다.
|
|
319
|
-
|
|
320
|
-
## License
|
|
321
|
-
|
|
322
|
-
Private & Proprietary — All Rights Reserved.
|
|
1
|
+
# Stackbite: Local Multi-Agent Work App
|
|
2
|
+
|
|
3
|
+
> Work Stack organizes the work. Stackbite gets it moving.
|
|
4
|
+
>
|
|
5
|
+
> Work Stack으로 정리하고, Stackbite로 실행한다.
|
|
6
|
+
|
|
7
|
+
Stackbite는 Windows ConPTY와 Linux POSIX PTY를 사용하는 로컬 멀티 에이전트 작업 앱입니다.
|
|
8
|
+
Room에 작업 경로와 목표를 정하고, Seat에서 셸·Codex·Claude 같은 설치된 CLI를 병렬로
|
|
9
|
+
실행합니다. TUI에서 방을 이동하거나 종료해도 데몬이 소유한 터미널은 계속 실행됩니다.
|
|
10
|
+
Work Stack 없이 사용할 수 있으며, Work Stack 연결은 Task 권한과 실행을 분리합니다.
|
|
11
|
+
|
|
12
|
+
## 설치와 실행
|
|
13
|
+
|
|
14
|
+
공개 [Stackbite 배포 저장소](https://github.com/Shinick-Han/stackbite/releases/tag/v0.5.20)의
|
|
15
|
+
검증된 **0.5.20** 실행 파일과 TGZ는 GitHub 로그인 없이 받을 수 있습니다.
|
|
16
|
+
핵심 소스 저장소 `Shinick-Han/helm`은 비공개로 유지합니다.
|
|
17
|
+
|
|
18
|
+
0.5.20에는 간결한 Rust 화면이 포함됩니다. `stackbite --frontend rust`로 실행하고,
|
|
19
|
+
Alt+Shift+Z로 집중 화면, F6로 Seats 이동을 사용할 수 있습니다. 기존 키맵과 실행
|
|
20
|
+
기본값은 유지됩니다. [Rust 화면과 실행 소유권 안내](docs/release-0.5.20.md)를 참고하세요.
|
|
21
|
+
|
|
22
|
+
### npm / npx 설치
|
|
23
|
+
|
|
24
|
+
Node.js 20 이상과 `tar`가 있는 Windows x64 또는 glibc Linux x64에서 실행합니다.
|
|
25
|
+
Python 설치는 필요하지 않으며 첫 실행은 검증된 런타임을 내려받고 다음부터 캐시를 사용합니다.
|
|
26
|
+
아래 두 방식 중 하나를 선택하면 됩니다. 전역 설치는 작은 런처를 설치하고,
|
|
27
|
+
이어 `stackbite`를 처음 실행할 때 네이티브 런타임을 내려받습니다.
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
npx --yes stackbite
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
계속 사용할 명령으로 설치하려면:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
npm install --global stackbite
|
|
37
|
+
stackbite
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
[npm registry](https://www.npmjs.com/package/stackbite)의 공개 패키지를 사용합니다.
|
|
41
|
+
특정 버전은 다음 GitHub TGZ URL로 지정할 수 있습니다.
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
npx --yes https://github.com/Shinick-Han/stackbite/releases/download/v0.5.18/stackbite-0.5.18.tgz
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
macOS·ARM·Alpine은 현재 지원 대상이 아닙니다.
|
|
48
|
+
[런처 설치·업데이트 안내](packaging/npm/README.md)를 참고하세요.
|
|
49
|
+
|
|
50
|
+
### 네이티브 실행 파일
|
|
51
|
+
|
|
52
|
+
Windows x64 ZIP의 **전체 압축을 해제한 뒤 `stackbite.exe`를 실행**합니다.
|
|
53
|
+
Linux x86_64 tar.gz는 전체를 해제하고 `./stackbite`를 실행합니다. 두 플랫폼 모두
|
|
54
|
+
`runtime/`을 실행 파일 옆에 유지하면 Python이나 소스 checkout 없이 동작합니다.
|
|
55
|
+
Linux의 최소 glibc 요구 사항은 `portable.json`의 `minimum_glibc`에 기록됩니다.
|
|
56
|
+
|
|
57
|
+
선택적으로 Windows의 `install.cmd` 또는 Linux의 `./install.sh`로 사용자 계정에 설치합니다.
|
|
58
|
+
Codex·Claude 등 provider CLI의 설치와 로그인은 별도입니다.
|
|
59
|
+
설치·롤백은 [Windows](packaging/README.md) / [Linux](packaging/linux/README.md) 안내를 따릅니다.
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
stackbite
|
|
63
|
+
stackbite --help
|
|
64
|
+
stackbite --version
|
|
65
|
+
stackbite --status
|
|
66
|
+
stackbite agent --help
|
|
67
|
+
stackbite update --check
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`--help`는 TUI나 백엔드를 시작하지 않습니다. `--version`은 실제 버전·커밋을,
|
|
71
|
+
`--status`는 실행·상태 경로를 확인하는 데 사용합니다. `stackbite update`는 배포 파일과
|
|
72
|
+
체크섬을 검증하여 설치하며, 실행 중인 백엔드와 CLI를 종료하지 않습니다. 소스 checkout은
|
|
73
|
+
Git으로 업데이트합니다. 이미 실행 중인 백엔드는 기존 코드를 사용하므로 새 기능은 그
|
|
74
|
+
백엔드를 명시적으로 재시작한 뒤 적용됩니다. 백엔드 재시작은 실행 중인 CLI를 종료합니다.
|
|
75
|
+
|
|
76
|
+
0.5.18은 지원되는 로컬 백엔드와 지속적인 인증 연결로 입력을 전달하고, 변경된
|
|
77
|
+
화면 행을 push로 받습니다. Windows PTY 수집은 출력 이벤트를 기다리며, 물리 셀
|
|
78
|
+
렌더링에서는 출력만 바뀌면 기존 UI 프레임을 재사용합니다. 확대·축소, 스크롤,
|
|
79
|
+
복사와 좌석 세대 검증을 유지하며, 기존 백엔드에는 HTTP 조회로 연결됩니다.
|
|
80
|
+
실제 PTY 지연 측정의 범위와 한계는 `docs/terminal-stream-ui-1008.md`를 참고하세요.
|
|
81
|
+
|
|
82
|
+
0.5.18은 단순 키 전달에 따른 불필요한 전체 화면 갱신을 줄이고, 검증된 불변
|
|
83
|
+
화면 행을 재사용합니다. 한 좌석이 바쁜 동안 다른 좌석의 화면 발행을 계속하며,
|
|
84
|
+
렌더 시간 자체를 갱신 간격에 포함합니다. 입력 ACK·실패 시 재전송 금지·좌석과
|
|
85
|
+
화면 소유권 검증은 유지합니다. 이번 직렬 PTY 측정과 한계는
|
|
86
|
+
`docs/next-latency-release-1008.md`에 기록합니다.
|
|
87
|
+
|
|
88
|
+
이하 기능·설정 안내는 공개된 **0.5.18** 기준입니다. 설치된 client/server의
|
|
89
|
+
실제 버전과 지원 기능은 각각 확인하세요.
|
|
90
|
+
|
|
91
|
+
### 오래된 VTE / Citrix 터미널
|
|
92
|
+
|
|
93
|
+
MATE Terminal의 VTE 0.52 환경에서 상태 원과 의자 glyph가 한 칸으로 표시되면,
|
|
94
|
+
새 frontend를 다음처럼 실행합니다. csh/tcsh에서도 같은 명령을 사용합니다.
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
env STACKBITE_CHROME_PROFILE=vte-0.52 ./stackbite
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
이 설정은 제품 UI의 두 glyph만 폭이 안정적인 표현으로 바꿉니다. 일반 터미널은
|
|
101
|
+
기본 UI를 유지하며, Seat 출력·사용자 이름·폰트·터미널 설정은 바뀌지 않습니다.
|
|
102
|
+
0.5.18는 지원되는 POSIX VT 터미널의 화면 행을 절대 위치로 출력하므로 raw tty의 LF 처리에 의존하지
|
|
103
|
+
않습니다. frontend만 다시 열어도 표시 수정이 적용되며 기존 backend와 Seat를
|
|
104
|
+
종료할 필요가 없습니다. [호환 설정과 검증 범위](docs/citrix-chrome-1008.md)를
|
|
105
|
+
참고하세요.
|
|
106
|
+
|
|
107
|
+
## Room과 Seat
|
|
108
|
+
|
|
109
|
+
현재 소스는 연결된 백엔드에 방이 없으면 작업 폴더를 채운 Room 생성 화면을 엽니다.
|
|
110
|
+
Enter로 Room과 기본 shell을 열며, 같은 폴더에서 다시 실행하면 기억한 유효 Room으로 돌아갑니다.
|
|
111
|
+
재접속만으로 중단된 Seat를 실행하지 않습니다. 다른 폴더·삭제된 Room이면 목록을 엽니다.
|
|
112
|
+
작업실 백엔드가 꺼져 있으면 로컬 8090에서 시작합니다.
|
|
113
|
+
방을 선택하고 Enter로 진입합니다. `F7` / `Alt+R`로 목록으로 돌아가며, 목록에서 `Esc`는
|
|
114
|
+
이전에 열었던 작업실로 돌아갑니다. Room 생성 화면에서 Esc를 누르면 목록으로 돌아갑니다.
|
|
115
|
+
목록 입력은 관리 동작이며 좌석의 CLI에 전달되지 않습니다.
|
|
116
|
+
|
|
117
|
+
설정은 Room 생성 화면의 `Ctrl+D` 또는 Help의 `s`로 저장합니다. CLI에서는
|
|
118
|
+
`stackbite config set chrome_profile vte-0.52`, `stackbite config set terminal_core python`처럼
|
|
119
|
+
한 번 저장하고 이후 `stackbite`만 실행하면 됩니다. 명시한 환경변수·실행 옵션은 저장값보다
|
|
120
|
+
우선합니다. [첫 사용](docs/first-use.md), [설정](docs/launch-preferences.md),
|
|
121
|
+
[clone 후 단일 명령 빌드](docs/build-local.md), [Node 없는 설치](docs/install-from-release.md)를 참고하세요.
|
|
122
|
+
|
|
123
|
+
화면 아래 `[+ Room]`, `[+ Terminal]`, `[Find seats]`로 방·터미널을 관리합니다.
|
|
124
|
+
방에는 이름·작업 폴더·공통 목표를 지정합니다. Seat는 역할·개별 작업·범위·완료 조건·
|
|
125
|
+
결과물·보고 대상을 가집니다. 이름을 바꿔도 내부 seat key와 실행 기록의 연결은 유지됩니다.
|
|
126
|
+
검색은 여러 방의 이름·역할·명령·작업 경로를 찾고 `Tab`으로 상태를 필터링합니다.
|
|
127
|
+
|
|
128
|
+
방 안에서 `Ctrl+T` / `Alt+T` 또는 `[+ New terminal]`을 선택하고 Enter를 누르면 기본 셸을
|
|
129
|
+
엽니다. `codex`, `claude`, `python -i` 같은 설치된 명령과 인자도 입력할 수 있습니다.
|
|
130
|
+
명령 선택창은 셸 연산자나 환경 변수를 자동 평가하지 않으므로 필요한 경우 셸 안에서 실행합니다.
|
|
131
|
+
기존 터미널은 sidebar에서 클릭해 전환합니다.
|
|
132
|
+
|
|
133
|
+
`[Split →]` / `[Split ↓]`로 같은 방의 두 터미널을 표시합니다. pane 클릭은 입력 대상을
|
|
134
|
+
바꾸고, 경계선 드래그는 크기를 조절합니다. `Alt+Z`는 현재 pane을 확대합니다.
|
|
135
|
+
좌석·터미널 우클릭 또는 `Alt+M` / `Shift+F10`은 Rename, Close, Restart CLI 메뉴를 엽니다.
|
|
136
|
+
좌석 패널의 `Delete`는 선택한 좌석을 닫고, 터미널 포커스의 `Delete`는 CLI에 전달됩니다.
|
|
137
|
+
종료 동작은 선택한 generation만 대상으로 하며 기록은 보존합니다.
|
|
138
|
+
|
|
139
|
+
꺼진 CLI 좌석을 선택하면 같은 좌석에 복구용 기본 셸을 엽니다. 원래 CLI 명령·모델·역할은
|
|
140
|
+
유지하며 `Restart CLI`로 원래 명령을 다시 실행합니다. 이전 복구 요청의 전달 결과가
|
|
141
|
+
불명확하면 먼저 그 요청을 조회합니다. 새 실행은 `Start new terminal (new request)` 또는
|
|
142
|
+
`Retry CLI (new request)`로 명시적으로 요청하며 이전 요청을 자동 재전송하지 않습니다.
|
|
143
|
+
|
|
144
|
+
방 우클릭의 Archive / Restore / Delete room 또는 `/room-delete`로 방을 관리합니다.
|
|
145
|
+
실행 중인 좌석이 있으면 먼저 명시적으로 종료해야 합니다. 삭제 확인창은 Cancel을 기본으로
|
|
146
|
+
선택합니다. 정지된 활성 방은 확인 후 보관·삭제하며 작업 폴더·Git worktree·실행 기록은 보존합니다.
|
|
147
|
+
Restore는 좌석을 자동 실행하지 않습니다. `Ctrl+Q`는 TUI 연결만 해제합니다.
|
|
148
|
+
|
|
149
|
+
| 관리 명령 | 동작 |
|
|
150
|
+
| --- | --- |
|
|
151
|
+
| `/room-new 작업 이름` | 현재 작업 경로에 빈 작업실 생성; 자동 진입·실행 없음 |
|
|
152
|
+
| `/room <번호 또는 room_id>` | 작업실 선택 |
|
|
153
|
+
| `/seat-new qa powershell` | 선택 방에 좌석을 만들고 명시적으로 실행 |
|
|
154
|
+
| `/seat-add qa codex` | 정지된 좌석 정의만 추가 |
|
|
155
|
+
| `/room-run qa 검토해줘` | 정지된 provider 좌석에서 headless 단발 실행 |
|
|
156
|
+
| `/room-history`, `/room-context qa` | 실행 기록·초기 컨텍스트 확인 |
|
|
157
|
+
| `/room-find 검색어`, `/room-filter active` | 작업실 검색·상태 필터 |
|
|
158
|
+
| `/room-worktree 작업 이름` | Git 커밋 HEAD에서 별도 worktree 작업실 생성 |
|
|
159
|
+
| `/spawn qa codex`, `/kill qa` | 선택 방의 좌석 실행·종료 |
|
|
160
|
+
| `/broadcast 점검해줘` | 선택 방의 살아 있는 좌석에 지시 |
|
|
161
|
+
| `/archive`, `/restore` | 정지된 작업실 보관·복원 |
|
|
162
|
+
|
|
163
|
+
## 터미널 입력과 출력
|
|
164
|
+
|
|
165
|
+
`Alt+H`로 검색 가능한 도움말을 엽니다. 도움말의 `Ctrl+P`로 관리 prefix를 활성화하고
|
|
166
|
+
`Ctrl+K`로 `Ctrl+B` / `Ctrl+A` / `Ctrl+Space` 중 선택합니다. prefix 뒤 `%` / `"`는
|
|
167
|
+
좌우·상하 분할, `o`는 pane 전환, `n`은 좌석 검색, `[`는 복사 모드입니다.
|
|
168
|
+
같은 prefix를 두 번 누르면 문자 하나를 CLI에 전달합니다. 도움말의 `Ctrl+L`로 관리
|
|
169
|
+
단축키를 해제하면 해당 키를 CLI에 전달할 수 있습니다.
|
|
170
|
+
|
|
171
|
+
출력 드래그는 선택 후 버튼을 놓으면 복사합니다. CLI가 마우스 입력을 요청하면 휠·왼쪽
|
|
172
|
+
클릭은 포인터 아래 CLI에 전달하며, `Shift`를 누른 드래그는 Stackbite 출력 선택입니다.
|
|
173
|
+
`Shift`+휠은 Stackbite 이력을 탐색합니다. 메뉴나 출력 선택 중에는 CLI에 마우스를 보내지 않습니다.
|
|
174
|
+
CLI 포인터 입력에는 백엔드의 `terminal_mouse`와 `terminal_geometry`가 모두 필요합니다.
|
|
175
|
+
실제 PTY 크기·화면 원점·좌석 generation이 확인된 라이브 화면에서만 좌표를 전달합니다.
|
|
176
|
+
오래된 백엔드에서는 안내에 따라 업데이트·재시작합니다.
|
|
177
|
+
[터미널 입력·크기 계약](docs/terminal-interaction-contract.md)에 자세한 규약이 있습니다.
|
|
178
|
+
|
|
179
|
+
`Shift+PageUp` / `Shift+PageDown`은 이력을 탐색하고 `End`는 라이브 화면으로 돌아갑니다.
|
|
180
|
+
분할 pane은 각자 이력 위치를 유지합니다. 보관량은 좌석마다 기본 2,000줄이며
|
|
181
|
+
백엔드 시작 전에 `STACKBITE_SCROLLBACK_LINES`로 1~20,000줄을 지정합니다.
|
|
182
|
+
잘못된 값은 기본값으로 돌아갑니다. 오래된 줄부터 제거하며 보관량을 늘리면 메모리도 늘어납니다.
|
|
183
|
+
이력은 메모리이므로 백엔드 재시작 시 초기화됩니다.
|
|
184
|
+
|
|
185
|
+
`Alt+C` 또는 prefix + `[`로 복사 모드를 열어 `/` 검색, `n` / `N` 다음·이전 결과,
|
|
186
|
+
`v` 선택, 방향키 이동, `y` 복사를 사용합니다. `Esc`로 돌아갑니다.
|
|
187
|
+
Windows는 시스템 클립보드를, Linux는 `Ctrl+O` 또는 `STACKBITE_CLIPBOARD_OSC52=1`로
|
|
188
|
+
명시적으로 허용한 OSC52를 사용합니다. 호스트 터미널의 OSC52 지원이 필요합니다.
|
|
189
|
+
|
|
190
|
+
터미널은 전경색·배경색·문자 속성과 결합 문자·이모지의 셀 폭을 보존합니다.
|
|
191
|
+
대체 화면의 짧은 출력 묶음과 DEC2026 동기화 구간은 표시 프레임을 합치지만 모든 바이트는
|
|
192
|
+
즉시 파싱합니다. 실행 완료는 표시 지연과 별개이며 모든 CLI 재도색을 완전히 재현하는 것은 아닙니다.
|
|
193
|
+
실제 PTY 기본 환경은 `TERM=xterm-256color`, `COLORTERM=truecolor`입니다.
|
|
194
|
+
호출자가 좌석 환경에 명시한 `NO_COLOR`, `TERM`, `COLORTERM`은 보존합니다.
|
|
195
|
+
|
|
196
|
+
## 에이전트 협업과 API
|
|
197
|
+
|
|
198
|
+
좌석 안에서는 `stackbite-room`으로 같은 방의 동료를 관리합니다.
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
stackbite-room context
|
|
202
|
+
stackbite-room ready
|
|
203
|
+
stackbite-room summon reviewer --provider codex --task-file review-task.txt --scope src --acceptance "tests pass" --output-path review.md --report-to coordinator
|
|
204
|
+
stackbite-room send reviewer --prompt-file followup.txt
|
|
205
|
+
stackbite-room wait reviewer --generation RECEIPT_GENERATION --turn 4 --timeout 30
|
|
206
|
+
stackbite-room read reviewer
|
|
207
|
+
stackbite-room report --state progress --message "검토 중" --artifact review.md
|
|
208
|
+
stackbite-room inbox
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
`assign`은 작업 메타데이터를 바꾸고 `send`는 실제 지시를 제출합니다. 여러 지시는 같은
|
|
212
|
+
프로세스·대화에 전달됩니다. 바쁜 좌석·사용자 입력 초안·교체된 generation에는 지시를
|
|
213
|
+
거절하며 자동 재전송하지 않습니다. `report --state completed`는 에이전트 보고로 보존하며
|
|
214
|
+
provider 완료 증거와 구별합니다. Codex·Claude의 hooks는 시작·작업·승인 대기·응답 완료를
|
|
215
|
+
기록합니다. CLI 로그인, workspace 신뢰, hooks 신뢰와 도구 실행 승인은 provider 안에서 처리합니다.
|
|
216
|
+
Stackbite는 승인·sandbox를 우회하지 않습니다.
|
|
217
|
+
|
|
218
|
+
Python SDK `AgentStackbite`는 방을 대상으로 합니다. 외부 스크립트는 `room_id`를
|
|
219
|
+
명시하고, 좌석 안의 에이전트는 상속된 `STACKBITE_ROOM_ID`를 사용합니다. 인증된
|
|
220
|
+
`TaskRoomClient`로 위임하며 방이 없는 호출은 거절합니다. 직접 방 API를 사용하려면
|
|
221
|
+
`TaskRoomClient`를 사용합니다.
|
|
222
|
+
|
|
223
|
+
기존 방의 좌석을 조회하는 예:
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
from private_pty import AgentStackbite, TaskRoomClient
|
|
227
|
+
|
|
228
|
+
sdk = AgentStackbite(room_id="review-room", client=TaskRoomClient())
|
|
229
|
+
seats = sdk.list_agents() # 이 방의 정의된 좌석; 정지된 좌석도 포함
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
좌석 안에서는 `AgentStackbite()`가 상속된 방을 사용합니다. 생성자는 데몬을 시작하거나
|
|
233
|
+
로컬 에이전트를 생성하지 않습니다.
|
|
234
|
+
|
|
235
|
+
기본 방 주소는 `http://127.0.0.1:8090`입니다. 명시적 `base_url`,
|
|
236
|
+
`STACKBITE_ROOM_BRIDGE_URL`, 기본 주소 순서로 선택합니다. 클라이언트는 상태 위치에서
|
|
237
|
+
기존 인증 토큰을 읽어 `X-Office-Token`으로 전송합니다. 토큰 값을 프롬프트나 로그에 넣지 않습니다.
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
from private_pty import TaskRoomClient
|
|
241
|
+
|
|
242
|
+
client = TaskRoomClient()
|
|
243
|
+
room = client.create_worktree_room(
|
|
244
|
+
"입력 안정화", source_repo=r"C:\my-project",
|
|
245
|
+
objective="입력 회귀를 수정하고 테스트 결과를 보고한다",
|
|
246
|
+
)
|
|
247
|
+
rid = room["room_id"]
|
|
248
|
+
client.add_seat(rid, "qa", agent_kind="codex", role_title="회귀 검토")
|
|
249
|
+
result = client.run(rid, "qa", "입력 처리를 검토하고 결함을 보고해줘",
|
|
250
|
+
request_id="input-review-001", timeout=120)
|
|
251
|
+
history = client.executions(rid)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
`run()`은 정지된 좌석의 명시적인 headless 단발 실행입니다. 대화형 `spawn` / `send`가
|
|
255
|
+
실패해도 headless 실행으로 바꾸지 않습니다. `dispatch()`는 살아 있는 대화형 CLI에
|
|
256
|
+
generation을 확인한 뒤 입력합니다. 지시별 request ID·generation·turn receipt로
|
|
257
|
+
전달과 완료를 구별합니다. 같은 ID·지시는 저장된 receipt를 반환하고 다른 지시는 충돌합니다.
|
|
258
|
+
불명확한 전달은 `unknown_delivery`로 보고하며 자동 재실행하지 않습니다.
|
|
259
|
+
|
|
260
|
+
완료는 owned process와 provider의 명시적 lifecycle 증거로 판정합니다. 잠깐의 출력 정지나
|
|
261
|
+
CLI 종료 코드 0만으로 AI 작업 성공을 판정하지 않습니다. blocked는 개입이 필요한 상태입니다.
|
|
262
|
+
결과물 등록·accepted/rejected 검토·외부 Task 완료는 각각 별도 동작입니다.
|
|
263
|
+
|
|
264
|
+
실행 저널은 지시·generation·turn·상태·완료 근거·최대 64 Ki 문자의 출력 스냅샷을 저장합니다.
|
|
265
|
+
모든 키 입력을 기록하는 transcript는 아닙니다. 백엔드 재시작은 셸 메모리를 복구하지 않으며
|
|
266
|
+
살아 있는 generation이 없는 미완료 실행은 interrupted로 표시합니다.
|
|
267
|
+
Windows 네이티브 실행은 전용 Job Object가 provider와 그 자식 프로세스를 소유합니다.
|
|
268
|
+
|
|
269
|
+
## 데이터와 Work Stack
|
|
270
|
+
|
|
271
|
+
새 설치는 Stackbite 이름의 경로를 사용합니다. 이전 설치의 실제 DB·토큰·설정은 상태
|
|
272
|
+
locator(`.stackbite-state.json`)와 파일 매핑으로 **현재 위치에서 재사용**합니다. 열려 있는 SQLite DB를 복사하거나
|
|
273
|
+
이름을 바꾸지 않습니다. 이전 제품명 경로가 실제 데이터 위치로 남아 있어도 추가 상태
|
|
274
|
+
트리를 만들 필요가 없습니다. 0.5.18의 `stackbite --status`는 실제 `state`와 인증 파일의
|
|
275
|
+
`auth_file` 경로를 반환합니다. 인증 파일은 그 경로를 사용하며, 상태 폴더 아래 고정된
|
|
276
|
+
새 파일명으로 추측하거나 별도 토큰을 만들지 않습니다. 토큰 내용은 출력하지 않습니다.
|
|
277
|
+
[호환성 안내](docs/stackbite-compatibility.md)에 durable data와 인증 경계가 있습니다.
|
|
278
|
+
|
|
279
|
+
Work Stack은 작업 정리와 Task 권한을, Stackbite는 로컬 Room/Seat 실행을 담당합니다.
|
|
280
|
+
연결 개발은 `integration/work-stack`에서 분리하고 병렬 실행·우선순위·의존성 기반 선택을
|
|
281
|
+
유지합니다. 선택한 Task의 workspace·revision을 확인한 뒤 방을 만들며 이 과정은 Task
|
|
282
|
+
상태를 수정하지 않습니다.
|
|
283
|
+
|
|
284
|
+
```powershell
|
|
285
|
+
python -m private_pty.workstack_link room --task T-0041 --cwd C:\my-project --isolated --source-repo C:\my-project
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
handoff의 첫 줄 `WorkStack binding:` JSON marker와 Task ID·workspace·revision 계약은
|
|
289
|
+
유지합니다. `publish_checkpoint()`는 새로 검증한 바인딩과 안정적인 intent ID로 호출자가
|
|
290
|
+
작성한 사실만 전달합니다. commit_unknown은 operation-status로 확인하고 mutation을
|
|
291
|
+
재전송하지 않습니다. 로그·프롬프트 자동 복사나 Task 자동 완료는 하지 않습니다.
|
|
292
|
+
|
|
293
|
+
초기 에이전트 컨텍스트에는 실제 cwd/worktree, 사용 가능한 CLI와 비밀값을 노출하지 않는
|
|
294
|
+
인증 API 사용법을 포함하며 다음 소개를 전달합니다.
|
|
295
|
+
|
|
296
|
+
> Stackbite는 현재 로컬에서 실행 중인 자체 멀티 에이전트 작업 앱이다.
|
|
297
|
+
|
|
298
|
+
## 개발과 성능 검토
|
|
299
|
+
|
|
300
|
+
```powershell
|
|
301
|
+
python -m pip install -r requirements-build.txt
|
|
302
|
+
python stackbite.py
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
핵심 구현은 `private_pty/`의 PTY·VT 버퍼·세션 registry·Room/Seat·실행 저널·Rich TUI와
|
|
306
|
+
`office_backend_bridge.py`의 인증 HTTP API입니다. 런타임 데이터와 개인 설정은 배포에 포함하지
|
|
307
|
+
않습니다. 별도 웹 UI는 `/stackbite/company_office_mockup.html`이며 `/agency-agents/`의
|
|
308
|
+
manifest identity는 유지합니다.
|
|
309
|
+
원격 웹 접속의 origin·신뢰 프록시는 `STACKBITE_ALLOWED_ORIGINS`·`STACKBITE_TRUSTED_PROXY_IPS`로
|
|
310
|
+
명시합니다. `X-Office-Token` 인증은 로컬 요청에도 필요합니다.
|
|
311
|
+
|
|
312
|
+
변경·검증·통합 경계는 [CONTRIBUTING.md](CONTRIBUTING.md)를 따릅니다.
|
|
313
|
+
실제 provider 테스트는 별도 opt-in이며 사용자 상태·진행 중인 좌석에서 실행하지 않습니다.
|
|
314
|
+
|
|
315
|
+
[최적화 후보](docs/optimization-candidates.md)는 우선순위·소스 근거·위험·검증을 정리합니다.
|
|
316
|
+
[기존 측정 보고서](docs/optimization/implementation-results-059.md)는 일부 렌더링·본문·저장소
|
|
317
|
+
개선과 함께 HTTP 서버 CPU 증가·일부 VT 재생 시간 증가를 기록합니다. 앱 전체가 빨라졌다고
|
|
318
|
+
주장하지 않습니다.
|
|
319
|
+
|
|
320
|
+
## License
|
|
321
|
+
|
|
322
|
+
Private & Proprietary — All Rights Reserved.
|
package/package.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "stackbite",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"description": "Verified native Stackbite CLI bootstrapper",
|
|
5
|
-
"license": "UNLICENSED",
|
|
6
|
-
"engines": {
|
|
7
|
-
"node": ">=20"
|
|
8
|
-
},
|
|
9
|
-
"bin": {
|
|
10
|
-
"stackbite": "packaging/npm/bin/stackbite.js"
|
|
11
|
-
},
|
|
12
|
-
"files": [
|
|
13
|
-
"packaging/npm/bin/",
|
|
14
|
-
"packaging/npm/lib/",
|
|
15
|
-
"packaging/npm/release.json"
|
|
16
|
-
],
|
|
17
|
-
"scripts": {
|
|
18
|
-
"test": "node --test packaging/npm/test/*.test.js"
|
|
19
|
-
},
|
|
20
|
-
"repository": {
|
|
21
|
-
"type": "git",
|
|
22
|
-
"url": "https://github.com/Shinick-Han/stackbite.git"
|
|
23
|
-
},
|
|
24
|
-
"homepage": "https://github.com/Shinick-Han/stackbite"
|
|
25
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "stackbite",
|
|
3
|
+
"version": "0.5.21",
|
|
4
|
+
"description": "Verified native Stackbite CLI bootstrapper",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"stackbite": "packaging/npm/bin/stackbite.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"packaging/npm/bin/",
|
|
14
|
+
"packaging/npm/lib/",
|
|
15
|
+
"packaging/npm/release.json"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"test": "node --test packaging/npm/test/*.test.js"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/Shinick-Han/stackbite.git"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/Shinick-Han/stackbite"
|
|
25
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"commit": "
|
|
3
|
+
"version": "0.5.21",
|
|
4
|
+
"commit": "40e88489c4f7b43d564454848654fd2d1ec9cea2",
|
|
5
5
|
"repository": "Shinick-Han/stackbite",
|
|
6
6
|
"platforms": {
|
|
7
7
|
"win32-x64": {
|
|
8
|
-
"asset": "stackbite-0.5.
|
|
9
|
-
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.
|
|
10
|
-
"sha256": "
|
|
11
|
-
"size":
|
|
12
|
-
"root": "stackbite-0.5.
|
|
13
|
-
"manifestSha256": "
|
|
14
|
-
"metadataSha256": "
|
|
8
|
+
"asset": "stackbite-0.5.21-windows-x64-40e88489c4f7.zip",
|
|
9
|
+
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.21/stackbite-0.5.21-windows-x64-40e88489c4f7.zip",
|
|
10
|
+
"sha256": "2d3ff2bc3e608c35cff4993aa0c96bf9a93708ddf0630b9bccfddc8ef746898f",
|
|
11
|
+
"size": 41676751,
|
|
12
|
+
"root": "stackbite-0.5.21-windows-x64-40e88489c4f7",
|
|
13
|
+
"manifestSha256": "9b41f64cd02ceb35a392bd4261f529c5e4adfb027a6787e48e1eb84d5a656b15",
|
|
14
|
+
"metadataSha256": "78fbf04e26c54635a2165600deb98b05eef962f61ed11c518829f7ce371d4db3"
|
|
15
15
|
},
|
|
16
16
|
"linux-x64": {
|
|
17
|
-
"asset": "stackbite-0.5.
|
|
18
|
-
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.
|
|
19
|
-
"sha256": "
|
|
20
|
-
"size":
|
|
21
|
-
"root": "stackbite-0.5.
|
|
22
|
-
"manifestSha256": "
|
|
23
|
-
"metadataSha256": "
|
|
17
|
+
"asset": "stackbite-0.5.21-linux-x86_64-40e88489c4f7.tar.gz",
|
|
18
|
+
"url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.21/stackbite-0.5.21-linux-x86_64-40e88489c4f7.tar.gz",
|
|
19
|
+
"sha256": "c9896de05617373161939de289d3281ec5b2fc31a29bc296a85b97419850b049",
|
|
20
|
+
"size": 28383033,
|
|
21
|
+
"root": "stackbite-0.5.21-linux-x86_64-40e88489c4f7",
|
|
22
|
+
"manifestSha256": "afa00be15b4a280ef2767e97f74a777c9100367f7a887f18d7d8dd553692484d",
|
|
23
|
+
"metadataSha256": "0d70e25195dfc4085fa560d9101ec0a116b577da73d8ade003db8e1c1c130a5c"
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
}
|