sleepcode 1.1.0 → 1.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.
- package/README.md +16 -15
- package/bin/index.js +24 -17
- package/package.json +1 -1
- package/templates/common/README.md +28 -25
- package/templates/common/ai_worker.ps1 +2 -2
- package/templates/common/ai_worker.sh +2 -2
- package/templates/common/run_forever.ps1 +3 -3
- package/templates/common/run_forever.sh +3 -3
package/README.md
CHANGED
|
@@ -48,19 +48,19 @@ npx sleepcode
|
|
|
48
48
|
**macOS / Linux:**
|
|
49
49
|
```bash
|
|
50
50
|
# 1회 실행
|
|
51
|
-
./.sleepcode/ai_worker.sh
|
|
51
|
+
./.sleepcode/scripts/ai_worker.sh
|
|
52
52
|
|
|
53
53
|
# 무한 루프 (tmux 권장)
|
|
54
|
-
tmux new -s ai './.sleepcode/run_forever.sh'
|
|
54
|
+
tmux new -s ai './.sleepcode/scripts/run_forever.sh'
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
**Windows (PowerShell):**
|
|
58
58
|
```powershell
|
|
59
59
|
# 1회 실행
|
|
60
|
-
powershell -File .\.sleepcode\ai_worker.ps1
|
|
60
|
+
powershell -File .\.sleepcode\scripts\ai_worker.ps1
|
|
61
61
|
|
|
62
62
|
# 무한 루프
|
|
63
|
-
powershell -File .\.sleepcode\run_forever.ps1
|
|
63
|
+
powershell -File .\.sleepcode\scripts\run_forever.ps1
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
### 4. 아침에 확인
|
|
@@ -106,17 +106,18 @@ npx sleepcode --type react-native --name my-app --role "쇼핑몰 앱 개발"
|
|
|
106
106
|
|
|
107
107
|
```
|
|
108
108
|
.sleepcode/
|
|
109
|
-
rules.md
|
|
110
|
-
tasks.md
|
|
111
|
-
docs/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
rules.md # ✏️ AI 역할 + 작업 규칙 (수정하세요)
|
|
110
|
+
tasks.md # ✏️ 작업 목록 (수정하세요)
|
|
111
|
+
docs/ # ✏️ 참고 자료 (피그마 스크린샷, 기획서 등)
|
|
112
|
+
scripts/ # ⚙️ 시스템 스크립트 (수정하지 마세요)
|
|
113
|
+
ai_worker.sh/.ps1 # 1회 실행 스크립트 (OS별)
|
|
114
|
+
run_forever.sh/.ps1 # 무한 루프 스크립트 (OS별)
|
|
115
|
+
log_filter.py # 실시간 로그 필터
|
|
116
|
+
logs/ # 실행 로그 (자동 생성)
|
|
117
|
+
README.md # 사용 가이드
|
|
117
118
|
|
|
118
119
|
.claude/
|
|
119
|
-
settings.local.json
|
|
120
|
+
settings.local.json # Claude 권한 설정
|
|
120
121
|
```
|
|
121
122
|
|
|
122
123
|
---
|
|
@@ -152,7 +153,7 @@ rules.md + tasks.md → 프롬프트 조합 → claude -p (비대화형) → 코
|
|
|
152
153
|
|
|
153
154
|
| 동작 | 명령어 |
|
|
154
155
|
|------|--------|
|
|
155
|
-
| 세션 생성 + 실행 | `tmux new -s ai './.sleepcode/run_forever.sh'` |
|
|
156
|
+
| 세션 생성 + 실행 | `tmux new -s ai './.sleepcode/scripts/run_forever.sh'` |
|
|
156
157
|
| 백그라운드 전환 | `Ctrl+B` → `D` |
|
|
157
158
|
| 세션 재접속 | `tmux attach -t ai` |
|
|
158
159
|
| 실시간 로그 | `tail -f .sleepcode/logs/worker_*.log` |
|
|
@@ -214,7 +215,7 @@ Windows에서는 `.sh` 대신 **PowerShell 스크립트(`.ps1`)가 자동 생성
|
|
|
214
215
|
- **AI 역할/규칙 변경**: `.sleepcode/rules.md` 수정
|
|
215
216
|
- **작업 목록 변경**: `.sleepcode/tasks.md` 수정
|
|
216
217
|
- **참고 자료 추가**: `.sleepcode/docs/`에 파일 추가 (스크린샷, 기획서 등)
|
|
217
|
-
- **반복 간격 변경**: `.sleepcode/run_forever.sh` (또는 `.ps1`)의 sleep 값 수정
|
|
218
|
+
- **반복 간격 변경**: `.sleepcode/scripts/run_forever.sh` (또는 `.ps1`)의 sleep 값 수정
|
|
218
219
|
- **Claude 권한 변경**: `.claude/settings.local.json` 수정
|
|
219
220
|
|
|
220
221
|
---
|
package/bin/index.js
CHANGED
|
@@ -250,18 +250,19 @@ function generateFiles(targetDir, { typeKey, projectName, role, buildCmd, testCm
|
|
|
250
250
|
const scDir = path.join(targetDir, '.sleepcode');
|
|
251
251
|
const claudeDir = path.join(targetDir, '.claude');
|
|
252
252
|
fs.mkdirSync(path.join(scDir, 'docs'), { recursive: true });
|
|
253
|
+
fs.mkdirSync(path.join(scDir, 'scripts'), { recursive: true });
|
|
253
254
|
fs.mkdirSync(path.join(scDir, 'logs'), { recursive: true });
|
|
254
255
|
fs.mkdirSync(claudeDir, { recursive: true });
|
|
255
256
|
|
|
256
|
-
//
|
|
257
|
+
// 스크립트 파일 → scripts/ 하위로 복사 (OS별 분기)
|
|
257
258
|
const scriptFiles = IS_WIN
|
|
258
259
|
? ['ai_worker.ps1', 'run_forever.ps1']
|
|
259
260
|
: ['ai_worker.sh', 'run_forever.sh'];
|
|
260
|
-
const
|
|
261
|
+
const allScriptFiles = [...scriptFiles, 'log_filter.py'];
|
|
261
262
|
|
|
262
|
-
for (const file of
|
|
263
|
+
for (const file of allScriptFiles) {
|
|
263
264
|
const src = path.join(TEMPLATES_DIR, 'common', file);
|
|
264
|
-
const dest = path.join(scDir, file);
|
|
265
|
+
const dest = path.join(scDir, 'scripts', file);
|
|
265
266
|
if (fs.existsSync(src)) {
|
|
266
267
|
let content = fs.readFileSync(src, 'utf-8');
|
|
267
268
|
content = content.replace(/\{\{SLEEP_INTERVAL\}\}/g, sleepInterval);
|
|
@@ -269,11 +270,17 @@ function generateFiles(targetDir, { typeKey, projectName, role, buildCmd, testCm
|
|
|
269
270
|
}
|
|
270
271
|
}
|
|
271
272
|
|
|
273
|
+
// README.md → .sleepcode/ 루트에 복사
|
|
274
|
+
const readmeSrc = path.join(TEMPLATES_DIR, 'common', 'README.md');
|
|
275
|
+
if (fs.existsSync(readmeSrc)) {
|
|
276
|
+
fs.writeFileSync(path.join(scDir, 'README.md'), fs.readFileSync(readmeSrc, 'utf-8'));
|
|
277
|
+
}
|
|
278
|
+
|
|
272
279
|
// 실행 권한 (Unix만)
|
|
273
280
|
if (!IS_WIN) {
|
|
274
|
-
fs.chmodSync(path.join(scDir, 'ai_worker.sh'), 0o755);
|
|
275
|
-
fs.chmodSync(path.join(scDir, 'run_forever.sh'), 0o755);
|
|
276
|
-
fs.chmodSync(path.join(scDir, 'log_filter.py'), 0o755);
|
|
281
|
+
fs.chmodSync(path.join(scDir, 'scripts', 'ai_worker.sh'), 0o755);
|
|
282
|
+
fs.chmodSync(path.join(scDir, 'scripts', 'run_forever.sh'), 0o755);
|
|
283
|
+
fs.chmodSync(path.join(scDir, 'scripts', 'log_filter.py'), 0o755);
|
|
277
284
|
}
|
|
278
285
|
|
|
279
286
|
// docs/.gitkeep
|
|
@@ -332,13 +339,13 @@ function printResult() {
|
|
|
332
339
|
const foreverScript = IS_WIN ? 'run_forever.ps1' : 'run_forever.sh';
|
|
333
340
|
|
|
334
341
|
console.log(`\n${C.bold}파일 생성 완료:${C.reset}\n`);
|
|
335
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode/rules.md`);
|
|
336
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode/tasks.md`);
|
|
337
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode
|
|
338
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode/${
|
|
339
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode/
|
|
342
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/rules.md ${C.dim}← 수정하세요${C.reset}`);
|
|
343
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/tasks.md ${C.dim}← 수정하세요${C.reset}`);
|
|
344
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/docs/ ${C.dim}← 참고자료 추가${C.reset}`);
|
|
345
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/scripts/${workerScript}`);
|
|
346
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/scripts/${foreverScript}`);
|
|
347
|
+
console.log(` ${C.green}✓${C.reset} .sleepcode/scripts/log_filter.py`);
|
|
340
348
|
console.log(` ${C.green}✓${C.reset} .sleepcode/README.md`);
|
|
341
|
-
console.log(` ${C.green}✓${C.reset} .sleepcode/docs/`);
|
|
342
349
|
console.log(` ${C.green}✓${C.reset} .claude/settings.local.json`);
|
|
343
350
|
|
|
344
351
|
if (IS_WIN) {
|
|
@@ -349,10 +356,10 @@ ${C.bold}${C.green}완료!${C.reset} 다음 단계:
|
|
|
349
356
|
${C.bold}2.${C.reset} .sleepcode/tasks.md 에 작업 목록 작성
|
|
350
357
|
${C.bold}3.${C.reset} 실행 (PowerShell):
|
|
351
358
|
${C.dim}# 1회 실행${C.reset}
|
|
352
|
-
powershell -File .\\.sleepcode\\ai_worker.ps1
|
|
359
|
+
powershell -File .\\.sleepcode\\scripts\\ai_worker.ps1
|
|
353
360
|
|
|
354
361
|
${C.dim}# 무한 루프${C.reset}
|
|
355
|
-
powershell -File .\\.sleepcode\\run_forever.ps1
|
|
362
|
+
powershell -File .\\.sleepcode\\scripts\\run_forever.ps1
|
|
356
363
|
`);
|
|
357
364
|
} else {
|
|
358
365
|
console.log(`
|
|
@@ -362,10 +369,10 @@ ${C.bold}${C.green}완료!${C.reset} 다음 단계:
|
|
|
362
369
|
${C.bold}2.${C.reset} .sleepcode/tasks.md 에 작업 목록 작성
|
|
363
370
|
${C.bold}3.${C.reset} 실행:
|
|
364
371
|
${C.dim}# 1회 실행${C.reset}
|
|
365
|
-
./.sleepcode/ai_worker.sh
|
|
372
|
+
./.sleepcode/scripts/ai_worker.sh
|
|
366
373
|
|
|
367
374
|
${C.dim}# 무한 루프 (tmux)${C.reset}
|
|
368
|
-
tmux new -s ai './.sleepcode/run_forever.sh'
|
|
375
|
+
tmux new -s ai './.sleepcode/scripts/run_forever.sh'
|
|
369
376
|
`);
|
|
370
377
|
}
|
|
371
378
|
}
|
package/package.json
CHANGED
|
@@ -8,13 +8,14 @@ AI codes while you sleep — 밤새 개발 작업을 자동화하는 시스템
|
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
.sleepcode/
|
|
11
|
-
rules.md
|
|
12
|
-
tasks.md
|
|
13
|
-
docs/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
rules.md # ✏️ AI 역할 + 작업 규칙 (수정하세요)
|
|
12
|
+
tasks.md # ✏️ 오늘 진행할 작업 목록 (수정하세요)
|
|
13
|
+
docs/ # ✏️ 개발 참고 자료 (피그마 스크린샷, 기획서 등)
|
|
14
|
+
scripts/ # ⚙️ 시스템 스크립트 (수정하지 마세요)
|
|
15
|
+
ai_worker.* # 1회 실행 스크립트
|
|
16
|
+
run_forever.* # 무한 루프 감시자 스크립트
|
|
17
|
+
log_filter.py # 로그 필터 (핵심 메시지만 추출)
|
|
18
|
+
logs/ # 실행 로그 (자동 생성)
|
|
18
19
|
```
|
|
19
20
|
|
|
20
21
|
---
|
|
@@ -30,13 +31,7 @@ AI codes while you sleep — 밤새 개발 작업을 자동화하는 시스템
|
|
|
30
31
|
|
|
31
32
|
## 실행 방법
|
|
32
33
|
|
|
33
|
-
### 1.
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
chmod +x .sleepcode/*.sh
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### 2. (최초 1회) --dangerously-skip-permissions 수락
|
|
34
|
+
### 1. (최초 1회) --dangerously-skip-permissions 수락
|
|
40
35
|
|
|
41
36
|
```bash
|
|
42
37
|
claude --dangerously-skip-permissions
|
|
@@ -44,24 +39,33 @@ claude --dangerously-skip-permissions
|
|
|
44
39
|
|
|
45
40
|
동의 프롬프트가 뜨면 수락 후 `Ctrl + C`로 나옵니다.
|
|
46
41
|
|
|
47
|
-
###
|
|
42
|
+
### 2. 실행
|
|
48
43
|
|
|
44
|
+
**macOS / Linux:**
|
|
49
45
|
```bash
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
# 권한 부여
|
|
47
|
+
chmod +x .sleepcode/scripts/*.sh
|
|
52
48
|
|
|
53
|
-
|
|
49
|
+
# 1회 실행
|
|
50
|
+
./.sleepcode/scripts/ai_worker.sh
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
# 무한 루프 (tmux)
|
|
53
|
+
tmux new -s ai './.sleepcode/scripts/run_forever.sh'
|
|
57
54
|
```
|
|
58
55
|
|
|
59
|
-
|
|
56
|
+
**Windows (PowerShell):**
|
|
57
|
+
```powershell
|
|
58
|
+
# 1회 실행
|
|
59
|
+
powershell -File .\.sleepcode\scripts\ai_worker.ps1
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
# 무한 루프
|
|
62
|
+
powershell -File .\.sleepcode\scripts\run_forever.ps1
|
|
63
|
+
```
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
### 3. tmux 분리 (백그라운드 전환, macOS/Linux)
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Ctrl + B → D
|
|
65
69
|
```
|
|
66
70
|
|
|
67
71
|
---
|
|
@@ -94,4 +98,3 @@ tail -100 .sleepcode/logs/worker_*.log
|
|
|
94
98
|
- **역할/규칙 변경**: `.sleepcode/rules.md` 수정
|
|
95
99
|
- **태스크 변경**: `.sleepcode/tasks.md` 수정
|
|
96
100
|
- **참고 자료 추가**: `.sleepcode/docs/` 에 파일 추가
|
|
97
|
-
- **반복 간격 변경**: `run_forever.sh` 의 `sleep` 값 수정
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# run_forever.ps1 (무한 루프) 대신 수동으로 1회만 돌릴 때 사용
|
|
3
3
|
|
|
4
4
|
$ErrorActionPreference = "Stop"
|
|
5
|
-
Set-Location (Split-Path $PSScriptRoot -Parent)
|
|
5
|
+
Set-Location (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent)
|
|
6
6
|
|
|
7
7
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
8
8
|
Write-Host "[$timestamp] AI 단일 실행 시작"
|
|
@@ -14,7 +14,7 @@ $prompt = "$rules`n`n---`n`n$tasks"
|
|
|
14
14
|
|
|
15
15
|
# stream-json + verbose: 토큰 단위 실시간 출력
|
|
16
16
|
$prompt | claude -p --dangerously-skip-permissions --output-format stream-json --verbose 2>&1 |
|
|
17
|
-
python .sleepcode/log_filter.py
|
|
17
|
+
python .sleepcode/scripts/log_filter.py
|
|
18
18
|
|
|
19
19
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
20
20
|
Write-Host "[$timestamp] AI 단일 실행 종료"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# AI Worker - 1회 실행 스크립트
|
|
4
4
|
# run_forever.sh (무한 루프) 대신 수동으로 1회만 돌릴 때 사용
|
|
5
5
|
|
|
6
|
-
cd "$(dirname "$0")
|
|
6
|
+
cd "$(dirname "$0")/../.." || exit 1
|
|
7
7
|
|
|
8
8
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] AI 단일 실행 시작"
|
|
9
9
|
|
|
@@ -18,6 +18,6 @@ ${TASKS}"
|
|
|
18
18
|
|
|
19
19
|
# stream-json + verbose: 토큰 단위 실시간 출력
|
|
20
20
|
claude -p "$PROMPT" --dangerously-skip-permissions --output-format stream-json --verbose 2>&1 \
|
|
21
|
-
| python3 .sleepcode/log_filter.py
|
|
21
|
+
| python3 .sleepcode/scripts/log_filter.py
|
|
22
22
|
|
|
23
23
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] AI 단일 실행 종료"
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# AI Night Worker - 감시자 스크립트 (Windows PowerShell)
|
|
2
|
-
# 사용법: powershell -File .\.sleepcode\run_forever.ps1
|
|
2
|
+
# 사용법: powershell -File .\.sleepcode\scripts\run_forever.ps1
|
|
3
3
|
|
|
4
4
|
$ErrorActionPreference = "Continue"
|
|
5
|
-
Set-Location (Split-Path $PSScriptRoot -Parent)
|
|
5
|
+
Set-Location (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent)
|
|
6
6
|
|
|
7
7
|
$logDir = ".sleepcode/logs"
|
|
8
8
|
if (!(Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
|
|
@@ -43,7 +43,7 @@ while ($true) {
|
|
|
43
43
|
Log "claude 실행 중..."
|
|
44
44
|
# stream-json -> log_filter.py 로 핵심 메시지만 추출
|
|
45
45
|
$prompt | claude -p --dangerously-skip-permissions --output-format stream-json --verbose 2>&1 |
|
|
46
|
-
python .sleepcode/log_filter.py |
|
|
46
|
+
python .sleepcode/scripts/log_filter.py |
|
|
47
47
|
Tee-Object -Append $logFile
|
|
48
48
|
$exitCode = $LASTEXITCODE
|
|
49
49
|
Log "claude 종료 (exit code: $exitCode)"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
3
|
# AI Night Worker - 감시자 스크립트
|
|
4
|
-
# 사용법: tmux new -s ai './.sleepcode/run_forever.sh'
|
|
4
|
+
# 사용법: tmux new -s ai './.sleepcode/scripts/run_forever.sh'
|
|
5
5
|
|
|
6
|
-
cd "$(dirname "$0")
|
|
6
|
+
cd "$(dirname "$0")/../.." || exit 1
|
|
7
7
|
|
|
8
8
|
LOG_DIR=".sleepcode/logs"
|
|
9
9
|
mkdir -p "$LOG_DIR"
|
|
@@ -44,7 +44,7 @@ ${TASKS}"
|
|
|
44
44
|
log "claude 실행 중..."
|
|
45
45
|
# stream-json → log_filter.py 로 핵심 메시지만 추출
|
|
46
46
|
claude -p "$PROMPT" --dangerously-skip-permissions --output-format stream-json --verbose 2>&1 \
|
|
47
|
-
| python3 .sleepcode/log_filter.py \
|
|
47
|
+
| python3 .sleepcode/scripts/log_filter.py \
|
|
48
48
|
| tee -a "$LOG_FILE"
|
|
49
49
|
EXIT_CODE=${PIPESTATUS[0]}
|
|
50
50
|
log "claude 종료 (exit code: $EXIT_CODE)"
|