stackbite 0.5.22 → 0.5.27

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 CHANGED
@@ -1,322 +1,146 @@
1
- # Stackbite: Local Multi-Agent Work App
1
+ # Stackbite through npm and npx
2
2
 
3
- > Work Stack organizes the work. Stackbite gets it moving.
4
- >
5
- > Work Stack으로 정리하고, Stackbite로 실행한다.
3
+ Work Stack organizes the work. Stackbite gets it moving.
6
4
 
7
- Stackbite는 Windows ConPTY와 Linux POSIX PTY를 사용하는 로컬 멀티 에이전트 작업 앱입니다.
8
- Room에 작업 경로와 목표를 정하고, Seat에서 셸·Codex·Claude 같은 설치된 CLI를 병렬로
9
- 실행합니다. TUI에서 방을 이동하거나 종료해도 데몬이 소유한 터미널은 계속 실행됩니다.
10
- Work Stack 없이 사용할 수 있으며, Work Stack 연결은 Task 권한과 실행을 분리합니다.
5
+ Node.js 20 or newer is required. The portable runtime is available for Windows x64
6
+ and Linux x64 with glibc 2.39 or newer; macOS, ARM and musl/Alpine builds are not supplied yet.
7
+ Python installation and compilation are unnecessary. Archive extraction requires
8
+ `tar` (included in current Windows and common Linux distributions).
11
9
 
12
- ## 설치와 실행
10
+ ## Install without an account
13
11
 
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`를 처음 실행할 때 네이티브 런타임을 내려받습니다.
12
+ Choose one method. For a single run, use the public npm package:
28
13
 
29
14
  ```sh
30
15
  npx --yes stackbite
31
16
  ```
32
17
 
33
- 계속 사용할 명령으로 설치하려면:
18
+ For a persistent command, install it globally, prepare the runtime, then launch:
34
19
 
35
20
  ```sh
36
21
  npm install --global stackbite
22
+ stackbite setup
37
23
  stackbite
38
24
  ```
39
25
 
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)를 참고하세요.
26
+ Global installation installs the small launcher without a postinstall download.
27
+ `stackbite setup` downloads and fully validates its pinned runtime without starting
28
+ the app or backend. It prints short stages to stderr. If setup is omitted, the
29
+ first launch prepares the runtime with the same stages. Cached launches remain
30
+ quiet and fully validate the runtime every time. Running both installation methods
31
+ is unnecessary.
49
32
 
50
- ### 네이티브 실행 파일
33
+ The same preparation command works through npx:
51
34
 
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
35
+ ```sh
36
+ npx --yes stackbite setup
68
37
  ```
69
38
 
70
- `--help`는 TUI나 백엔드를 시작하지 않습니다. `--version`은 실제 버전·커밋을,
71
- `--status`는 실행·상태 경로를 확인하는 데 사용합니다. `stackbite update`는 배포 파일과
72
- 체크섬을 검증하여 설치하며, 실행 중인 백엔드와 CLI를 종료하지 않습니다. 소스 checkout은
73
- Git으로 업데이트합니다. 이미 실행 중인 백엔드는 기존 코드를 사용하므로 새 기능은 그
74
- 백엔드를 명시적으로 재시작한 뒤 적용됩니다. 백엔드 재시작은 실행 중인 CLI를 종료합니다.
39
+ Check a prepared runtime offline with `stackbite setup --check`. The launcher
40
+ checks all pinned file hashes, identity, inventory and link boundaries, without
41
+ downloading, extracting, writing cache files, or starting the app/backend. It exits
42
+ with status 0 when valid and status 1 when absent or invalid; an absent cache needs
43
+ `stackbite setup`. Only `setup` and `setup --check` are accepted setup forms.
44
+ The launcher check is read-only; npx itself may install its npm package before
45
+ invoking it, so use the installed command for an entirely offline check.
75
46
 
76
- 0.5.18은 지원되는 로컬 백엔드와 지속적인 인증 연결로 입력을 전달하고, 변경된
77
- 화면 행을 push로 받습니다. Windows PTY 수집은 출력 이벤트를 기다리며, 물리 셀
78
- 렌더링에서는 출력만 바뀌면 기존 UI 프레임을 재사용합니다. 확대·축소, 스크롤,
79
- 복사와 좌석 세대 검증을 유지하며, 기존 백엔드에는 HTTP 조회로 연결됩니다.
80
- 실제 PTY 지연 측정의 범위와 한계는 `docs/terminal-stream-ui-1008.md`를 참고하세요.
47
+ Binary caches use `%LOCALAPPDATA%\Stackbite\cache` on Windows and
48
+ `${XDG_CACHE_HOME:-~/.cache}/stackbite` on Linux. `LOCALAPPDATA`, `XDG_CACHE_HOME`
49
+ and `HOME` overrides retain their normal behavior. These caches are separate from
50
+ application state. Interrupted preparation removes only its own temporary staging
51
+ directory and can be retried. An invalid existing runtime is reported and left in
52
+ place; setup does not delete or overwrite it.
81
53
 
82
- 0.5.18은 단순 키 전달에 따른 불필요한 전체 화면 갱신을 줄이고, 검증된 불변
83
- 화면 행을 재사용합니다. 한 좌석이 바쁜 동안 다른 좌석의 화면 발행을 계속하며,
84
- 렌더 시간 자체를 갱신 간격에 포함합니다. 입력 ACK·실패 시 재전송 금지·좌석과
85
- 화면 소유권 검증은 유지합니다. 이번 직렬 PTY 측정과 한계는
86
- `docs/next-latency-release-1008.md`에 기록합니다.
54
+ Update a registry installation with `npm install --global stackbite@latest`.
87
55
 
88
- 이하 기능·설정 안내는 공개된 **0.5.18** 기준입니다. 설치된 client/server의
89
- 실제 버전과 지원 기능은 각각 확인하세요.
56
+ ## Direct GitHub package
90
57
 
91
- ### 오래된 VTE / Citrix 터미널
92
-
93
- MATE Terminal의 VTE 0.52 환경에서 상태 원과 의자 glyph가 한 칸으로 표시되면,
94
- 새 frontend를 다음처럼 실행합니다. csh/tcsh에서도 같은 명령을 사용합니다.
58
+ Run the package attached to the verified GitHub release:
95
59
 
96
60
  ```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
61
+ npx --yes https://github.com/Shinick-Han/stackbite/releases/download/v0.5.27/stackbite-0.5.27.tgz
209
62
  ```
210
63
 
211
- `assign`은 작업 메타데이터를 바꾸고 `send`는 실제 지시를 제출합니다. 여러 지시는 같은
212
- 프로세스·대화에 전달됩니다. 바쁜 좌석·사용자 입력 초안·교체된 generation에는 지시를
213
- 거절하며 자동 재전송하지 않습니다. `report --state completed`는 에이전트 보고로 보존하며
214
- provider 완료 증거와 구별합니다. Codex·Claude의 hooks는 시작·작업·승인 대기·응답 완료를
215
- 기록합니다. CLI 로그인, workspace 신뢰, hooks 신뢰와 도구 실행 승인은 provider 안에서 처리합니다.
216
- Stackbite는 승인·sandbox를 우회하지 않습니다.
64
+ Arguments go after the package URL, for example `--version` or `--status`. For a
65
+ persistent command, install that same package globally:
217
66
 
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() # 이 방의 정의된 좌석; 정지된 좌석도 포함
67
+ ```sh
68
+ npm install --global https://github.com/Shinick-Han/stackbite/releases/download/v0.5.27/stackbite-0.5.27.tgz
69
+ stackbite setup
70
+ stackbite
230
71
  ```
231
72
 
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
- ```
73
+ The core source repository remains private at `shinick-dev/stackbite`. The separate
74
+ public `Shinick-Han/stackbite` repository distributes only this thin launcher and
75
+ verified compiled runtime releases; installers need no GitHub or npm login.
76
+ Registry-free distribution does not require publishing rights on npm.
77
+ The small JavaScript package downloads the
78
+ exact pinned native release on first execution, verifies its archive and file
79
+ checksums and product identity, then reuses a persistent binary cache. There is no
80
+ postinstall download or provider installation. An offline cached launch is possible;
81
+ the first launch needs access to GitHub release downloads.
82
+
83
+ For a GitHub URL installation, install the package URL from the newer release.
84
+ Each npm package pins one native release; the portable app's own `stackbite update`
85
+ does not change the npm package version.
86
+
87
+ ## Existing data and processes
88
+
89
+ `STACKBITE_STATE_DIR` is the explicit state override. The bundled native runtime
90
+ owns state discovery and migration for both npm and direct launches. It reuses
91
+ existing configured state and keeps live databases, authentication and records
92
+ in place. New state uses `%LOCALAPPDATA%\Stackbite\state` or
93
+ `${XDG_STATE_HOME:-~/.local/state}/stackbite`.
94
+ Rooms, Seats, authentication, provider configuration, journals and Work Stack
95
+ contracts are not renamed or migrated. Binary cache data is separate from this
96
+ state. Installing or launching the npm package does not stop an existing backend.
97
+ Check the connected server's capabilities before using newly added runtime features.
98
+
99
+ For app commands, the launcher inherits terminal input/output and passes CLI
100
+ arguments directly to the native app. Its `setup` command only prepares/checks the
101
+ runtime. It does not insert a second screen renderer or an agent provider.
102
+ Global npm installation creates only the `stackbite` command; it does not claim an
103
+ external `helm` command or replace independent Kubernetes tooling.
104
+
105
+ ## Maintainer release steps
106
+
107
+ Measure bounded fake runtime preparation and warm verification without network or
108
+ app processes:
253
109
 
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
110
+ ```sh
111
+ node packaging/npm/test/measure-setup.js
286
112
  ```
287
113
 
288
- handoff의 첫 줄 `WorkStack binding:` JSON marker와 Task ID·workspace·revision 계약은
289
- 유지합니다. `publish_checkpoint()`는 새로 검증한 바인딩과 안정적인 intent ID로 호출자가
290
- 작성한 사실만 전달합니다. commit_unknown은 operation-status로 확인하고 mutation을
291
- 재전송하지 않습니다. 로그·프롬프트 자동 복사나 Task 자동 완료는 하지 않습니다.
114
+ The measurement reports fixture sizes and each preparation stage plus warm check
115
+ and launch validation costs. It uses disposable cache data and an inert child
116
+ stub; its timings are not measurements of released native bundles or providers.
292
117
 
293
- 초기 에이전트 컨텍스트에는 실제 cwd/worktree, 사용 가능한 CLI와 비밀값을 노출하지 않는
294
- 인증 API 사용법을 포함하며 다음 소개를 전달합니다.
118
+ Build and verify both native platform archives first. Prepare the pinned manifest
119
+ from their exact extracted bundles and archive bytes:
295
120
 
296
- > Stackbite는 현재 로컬에서 실행 중인 자체 멀티 에이전트 작업 앱이다.
297
-
298
- ## 개발과 성능 검토
299
-
300
- ```powershell
301
- python -m pip install -r requirements-build.txt
302
- python stackbite.py
121
+ ```sh
122
+ python scripts/prepare_npm_release.py --version 0.5.27
123
+ npm test
124
+ npm pack
303
125
  ```
304
126
 
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` 인증은 로컬 요청에도 필요합니다.
127
+ Keep `package.json` and `packaging/npm/release.json` versions equal. Inspect `npm
128
+ pack --dry-run` before publishing; the package must include the launcher and pinned
129
+ manifest, and exclude native runtimes, installed state, credentials, tests and
130
+ development worktrees. Test the packed package with `npx` on both platforms.
311
131
 
312
- 변경·검증·통합 경계는 [CONTRIBUTING.md](CONTRIBUTING.md)를 따릅니다.
313
- 실제 provider 테스트는 별도 opt-in이며 사용자 상태·진행 중인 좌석에서 실행하지 않습니다.
132
+ Attach `stackbite-<version>.tgz` and its SHA-256 sidecar to the corresponding GitHub
133
+ release in the public distribution repository. Copy only the npm file allowlist to
134
+ that repository; never push the private core history, state, personal notes or
135
+ credentials. Native archives must retain dependency license notices. Publishing
136
+ the short name requires an authenticated owner account:
314
137
 
315
- [최적화 후보](docs/optimization-candidates.md)는 우선순위·소스 근거·위험·검증을 정리합니다.
316
- [기존 측정 보고서](docs/optimization/implementation-results-059.md)는 일부 렌더링·본문·저장소
317
- 개선과 함께 HTTP 서버 CPU 증가·일부 VT 재생 시간 증가를 기록합니다. 앱 전체가 빨라졌다고
318
- 주장하지 않습니다.
319
-
320
- ## License
138
+ ```sh
139
+ npm login --registry=https://registry.npmjs.org
140
+ npm publish --access public --registry=https://registry.npmjs.org
141
+ ```
321
142
 
322
- Private & Proprietary — All Rights Reserved.
143
+ Complete any registry-required authentication interactively; do not put credentials
144
+ in this repository, prompts or package files. The repository currently specifies
145
+ `UNLICENSED` for the JavaScript wrapper instead of inventing a license for the app;
146
+ native runtime dependency notices remain in each platform archive.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stackbite",
3
- "version": "0.5.22",
3
+ "version": "0.5.27",
4
4
  "description": "Verified native Stackbite CLI bootstrapper",
5
5
  "license": "UNLICENSED",
6
6
  "engines": {
@@ -102,7 +102,9 @@ async function ensureBinary(spec, { cache = cacheDirectory(), downloadImpl = dow
102
102
  if (checkOnly) {
103
103
  if (!await existingCacheDirectory(cache)) fail('Pinned runtime is not cached; run stackbite setup.');
104
104
  } else await safeDirectory(cache);
105
- const target = path.join(cache, `${spec.version}-${spec.commit}-${spec.key}-${spec.sha256}`);
105
+ // Full identity remains SHA-256 addressed while avoiding Windows MAX_PATH.
106
+ const cacheKey = createHash('sha256').update(JSON.stringify([spec.version, spec.commit, spec.key, spec.sha256])).digest('hex');
107
+ const target = path.join(cache, `v1-${cacheKey}`);
106
108
  if (await exists(target)) {
107
109
  if (checkOnly || reportCached) progress('validate');
108
110
  const installed = { home: target, executable: await validatePayload(target, spec) };
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "schema": 1,
3
- "version": "0.5.22",
4
- "commit": "28e7e9b24f4fad78e1335cbc67c038d45fcb7f34",
3
+ "version": "0.5.27",
4
+ "commit": "dfaa65f36a25da971458083d8a7ed49fe50b9fe2",
5
5
  "repository": "Shinick-Han/stackbite",
6
6
  "platforms": {
7
7
  "win32-x64": {
8
- "asset": "stackbite-0.5.22-windows-x64-28e7e9b24f4f.zip",
9
- "url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.22/stackbite-0.5.22-windows-x64-28e7e9b24f4f.zip",
10
- "sha256": "f620d6b7aec05dfb0c8680c94f4bc24415a4a80a6b33ffd29eff093dea190ad6",
11
- "size": 42010317,
12
- "root": "stackbite-0.5.22-windows-x64-28e7e9b24f4f",
13
- "manifestSha256": "b48def9fc69434e5d6b5eb01aa6b676e4b6585420d2c808f2574cb7218e31d4f",
14
- "metadataSha256": "473309122bfe2acde99dcf137df5d56fae3a37f4a52dee45f3ba97094238dc09"
8
+ "asset": "stackbite-0.5.27-windows-x64-dfaa65f36a25.zip",
9
+ "url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.27/stackbite-0.5.27-windows-x64-dfaa65f36a25.zip",
10
+ "sha256": "c5b1c22afe21303a3b4a9736694b45488b7387fb1f91aedd48f972396f5175e7",
11
+ "size": 43942506,
12
+ "root": "stackbite-0.5.27-windows-x64-dfaa65f36a25",
13
+ "manifestSha256": "27389aaa5c8f45938e3b309d6859b2ccbb36f4032932a42ccc6372b436442e56",
14
+ "metadataSha256": "fae14dfcb279451c543a2447f9ec53958df72d3141ffedf01f7752237db11ecc"
15
15
  },
16
16
  "linux-x64": {
17
- "asset": "stackbite-0.5.22-linux-x86_64-28e7e9b24f4f.tar.gz",
18
- "url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.22/stackbite-0.5.22-linux-x86_64-28e7e9b24f4f.tar.gz",
19
- "sha256": "dd08f9c967aebf02f05ad6dfd7c014ab8610a561a5484391f34b8ce895f81115",
20
- "size": 28850971,
21
- "root": "stackbite-0.5.22-linux-x86_64-28e7e9b24f4f",
22
- "manifestSha256": "a7812375a72e1aba50f1eb998c7c78c10976ffcea68f8d535948b79719b9d37d",
23
- "metadataSha256": "dd01b9f92b81e7c040b209d326d558d77654c0bf35b489d1a6914533c00401f8"
17
+ "asset": "stackbite-0.5.27-linux-x86_64-dfaa65f36a25.tar.gz",
18
+ "url": "https://github.com/Shinick-Han/stackbite/releases/download/v0.5.27/stackbite-0.5.27-linux-x86_64-dfaa65f36a25.tar.gz",
19
+ "sha256": "d244fe614d88c47137a8c126d1a4089cdc5ae656f34981f4c3c5603789918478",
20
+ "size": 30900428,
21
+ "root": "stackbite-0.5.27-linux-x86_64-dfaa65f36a25",
22
+ "manifestSha256": "460eac22d703b2aee95666936767c405b7175b7e7d6cbe10ce107c232096a741",
23
+ "metadataSha256": "88d2f12b6991a1083c46c9e53d6e6d45ca6b7ad534717ccf41553d233a2c71fc"
24
24
  }
25
25
  }
26
26
  }