@buzzni/saycode-cli 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +67 -10
  2. package/index.mjs +20175 -23956
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -109,6 +109,43 @@ saycode chat -p <프로젝트> --voice-file ./prompt.wav
109
109
  `-m`은 머신 id 접두사 또는 host 부분 문자열로 매칭합니다. 여러 개가 걸리면 후보를 보여주고 멈춥니다 —
110
110
  엉뚱한 머신에서 작업을 시작하는 것보다 낫기 때문입니다.
111
111
 
112
+ ## 긴 prompt 작성과 재사용
113
+
114
+ TTY의 유휴 chat prompt에서 `/edit-prompt`를 입력하면 외부 편집기가 열립니다. 편집기는 `$VISUAL`,
115
+ `$EDITOR`, `vi` 순서로 선택하므로 VS Code라면 예를 들어 `VISUAL="code --wait"`를 사용할 수
116
+ 있습니다. 저장 후에는 바로 전송하지 않고 다음 선택을 받습니다.
117
+
118
+ ```text
119
+ Draft ready: 12 lines, 684 characters.
120
+ Draft: [s] send · [e] edit again · [d] discard:
121
+ ```
122
+
123
+ `/history`는 현재 `saycode` 프로세스에서 전송에 성공한 최근 prompt를 최신순으로 최대 50개
124
+ 보여주고, `/history <query>`는 대소문자 구분 없이 본문을 필터링합니다. 번호로 고른 prompt도 같은
125
+ send/edit/discard review를 거칩니다. 빈 입력·로컬 slash command·전송 실패는 history에 들어가지
126
+ 않으며, history는 파일이나 서버에 저장되지 않아 프로세스를 종료하면 사라집니다.
127
+
128
+ 편집 중에는 CLI가 readline과 raw-mode listener를 잠시 분리해 terminal을 편집기에 넘깁니다. 임시
129
+ 디렉터리와 파일은 각각 0700/0600으로 만들고 성공·취소·오류 뒤 삭제합니다. 오류 메시지와 usage
130
+ analytics에는 draft 본문을 넣지 않습니다.
131
+
132
+ ## 응답과 입력 필요 알림
133
+
134
+ `saycode chat`은 live 응답 완료·실패와 permission/AskUserQuestion 입력 대기를 terminal-native
135
+ 알림으로 전달합니다. 기본 `--notify auto`이며 `--notify always` 또는 `--notify never`로 실행별
136
+ 정책을 바꿀 수 있습니다.
137
+
138
+ ```bash
139
+ saycode chat -s <session> --notify auto
140
+ saycode chat -p <project> --notify never
141
+ ```
142
+
143
+ kitty에서는 `auto`가 unfocused window에만 표시되도록 OSC 99로 요청합니다. iTerm2는 OSC 9,
144
+ WezTerm·Ghostty·VTE 계열은 OSC 777을 사용하고 focus 억제는 terminal 설정을 따릅니다. 식별되지
145
+ 않은 terminal은 bell로 fallback하며 stdout이 TTY가 아니면 아무 escape byte도 쓰지 않습니다.
146
+ 알림에는 `Saycode`와 `Response complete`·`Action required`·`Response failed`만 들어가고 prompt,
147
+ 응답, 경로, session id, permission 인자는 포함하지 않습니다.
148
+
112
149
  ## 대화에서 나가기
113
150
 
114
151
  채팅 하단 상태가 현재 입력 가능 여부를 그대로 나타냅니다.
@@ -116,15 +153,25 @@ saycode chat -p <프로젝트> --voice-file ./prompt.wav
116
153
  ```
117
154
  ● Ready — you can type
118
155
  › 다음 작업을 진행해줘
119
- ● Agent is responding — input locked · Ctrl+C for options
156
+ ● Agent is responding — follow-ups accepted · Ctrl+C for options
120
157
  ⏺ Bash(npm test)
121
158
  │ running tests...
122
- ^C [Enter] keep watching · [d] detach, agent keeps working · [s] stop the response
159
+ ↳ Queue follow-up › 끝나면 변경 사항도 요약해줘
160
+ Queued follow-up #1 — sends after the current turn. Press Enter on an empty prompt to send now.
161
+ ^C [Enter] keep watching · [q] queue status · [x] discard latest · [c] clear queue · [d] detach · [s] stop the response
123
162
  ```
124
163
 
125
- `Agent is responding` 동안 stdin은 raw/no-echo로 잠겨 일반 문자와 Enter가 화면에 나타나거나 다음
126
- 프롬프트에 쌓이지 않습니다. 권한 요청 때만 `◆ Action required — permission response only`로 바뀌고
127
- 해당 선택 입력을 받습니다. 에이전트 턴이 끝나 `Ready`가 표시된 뒤에만 일반 프롬프트가 열립니다.
164
+ interactive TTY에서는 `Agent is responding` 동안 한 줄짜리 plain-text follow-up을 입력할 수 있습니다.
165
+ 입력한 내용은 현재 프로세스의 FIFO에만 보관되고, 현재 turn이 끝날 때 가장 오래된 한 건이 다음 user
166
+ turn으로 전송됩니다. Queue가 있을 때 빈 입력을 제출하면 현재 응답을 중단하고 가장 오래된 follow-up을
167
+ 다음 turn으로 먼저 보냅니다. non-TTY stdin은 기존처럼 입력을 잠가 pipe의 다음 행을 queue로
168
+ 오인하지 않습니다. 권한 요청 때는 `◆ Action required — permission response only`로 바뀌고 해당 선택만
169
+ 입력받습니다.
170
+
171
+ 이전 답변을 보려면 터미널 scrollback 단축키인 **`Shift+Page Up/Down`**을 사용합니다. Mac 노트북
172
+ 키보드에서는 **`Shift+Fn+↑/↓`**입니다. `Page Up`만 누르면 readline/raw 입력으로 전달될 수 있어
173
+ 스크롤되지 않습니다. CLI는 터미널의 기존 scrollback·복사·검색을 보존하기 위해 alternate screen을
174
+ 사용하지 않습니다.
128
175
 
129
176
  에이전트가 작업 중일 때 **`Ctrl+C`를 누르면 선택지가 뜹니다.**
130
177
  한 글자만 누르면 됩니다 (Enter 불필요). `Ctrl+C`를 한 번 더 누르면 `d`와 같습니다 —
@@ -133,17 +180,27 @@ saycode chat -p <프로젝트> --voice-file ./prompt.wav
133
180
 
134
181
  | 방법 | 동작 |
135
182
  |---|---|
183
+ | 응답 중 일반 입력 | 현재 turn을 중단하지 않고 process-local FIFO에 follow-up을 추가합니다 |
184
+ | queue가 있을 때 빈 입력 | 현재 응답을 중단한 뒤 FIFO의 가장 오래된 한 건을 전송합니다 |
185
+ | `Ctrl+C` → `q` | 본문을 노출하지 않고 queue 개수만 표시합니다 |
186
+ | `Ctrl+C` → `x` | 가장 최근 follow-up 한 건을 버립니다 |
187
+ | `Ctrl+C` → `c` → `y` | 확인 후 queue 전체를 비웁니다 |
136
188
  | `Ctrl+C` → `d` | **나갑니다. 에이전트는 계속 일합니다** |
137
189
  | `Ctrl+C` → `s` | 그 **응답을 중단**시킵니다 |
138
190
  | `Ctrl+C` → `Enter` | 아무것도 안 하고 계속 봅니다 |
139
191
  | `Ctrl+C` (유휴 중) | CLI를 종료합니다 |
140
192
  | `/detach` | 프롬프트에서 치는 `d`의 별칭 |
141
193
  | `/exit` | 대화를 떠납니다 (탐색기에서 왔다면 탐색기로 복귀) |
194
+ | `/model` | 다음 메시지부터 사용할 모델을 선택합니다 |
195
+ | `/effort` | 현재 모델의 effort를 다음 메시지부터 변경합니다 |
142
196
  | `/voice` | 마이크로 다음 프롬프트를 녹음·전사합니다 |
143
197
  | `/voice <audio-path>` | 기존 음성 파일을 다음 프롬프트로 전사합니다 |
198
+ | `/edit-prompt` | 외부 편집기에서 여러 줄 draft를 작성하고 검토합니다 |
199
+ | `/history [query]` | 이번 CLI 실행에서 성공한 최근 prompt를 찾아 검토합니다 |
144
200
 
145
- **어느 경우에도 원격 세션은 죽지 않습니다.** 데스크탑이나 다른 터미널에서 하던 작업을
146
- CLI를 닫았다는 이유로 파괴하지 않습니다.
201
+ **나가기만 해서는 원격 세션이나 실행 중인 응답을 중단하지 않습니다.** 데스크탑이나 다른 터미널에서
202
+ 하던 작업을 CLI를 닫았다는 이유로 파괴하지 않습니다. 응답 중단은 `Ctrl+C` → `s`처럼 명시적으로
203
+ 선택한 경우에만 요청합니다.
147
204
 
148
205
  응답이 오래 걸릴 때 `Ctrl+C` → `d`로 빠져나와 `saycode watch`로 진행만 지켜보다가,
149
206
  끝나면 `saycode chat -s <id>`로 돌아오는 흐름을 의도했습니다.
@@ -179,11 +236,11 @@ GitHub Actions 가 태그로 발행합니다 (`.github/workflows/publish-saycode
179
236
 
180
237
  ```bash
181
238
  # 1. 버전 올리기 — 데스크탑 앱 버전과 무관합니다
182
- vi cli/manifest.json # "version": "0.1.4"
239
+ vi cli/manifest.json # "version": "0.2.0"
183
240
 
184
241
  # 2. 커밋하고 태그를 밀면 끝
185
- git tag -a saycode-cli-v0.1.4 -m "Release saycode-cli 0.1.4"
186
- git push origin saycode-cli-v0.1.4
242
+ git tag -a saycode-cli-v0.2.0 -m "Release saycode-cli 0.2.0"
243
+ git push origin saycode-cli-v0.2.0
187
244
  ```
188
245
 
189
246
  워크플로는 발행 전에 이 순서로 막습니다: