1. 디테일한 작업을 지시하는 것이 아니라, 플랜을 잡도록 시킵니다.
스트림덱과 같은 기능을 하는 맥북 앱을 만들거아.
Ventura 이상 OS 에서 가동되어야 하고.
앱을 실행하면 100x100 크기의 아이콘 같은 것이 모니터에 표시되고 이동 가능해야 해.
(디폴트 위치는 오른쪽 아래쪽, 크기 설정 가능)
아이콘에 커서를 올려놓으면 0.3 초 후에 스트림덱과 같은 5x3 칸의 윈도우가 표시되어야 해.
설정되어 있지 않은 칸을 클릭하면, 앱실행 or 단축키입력 두가지를 선택할 수 있고.
오른쪽 클릭하면 설정을 제거할 수 있어야 해.
위 내을을 위한 작업계획을 PLAN.md 파일에 작성해줘.
더 알아야 할 부분이 있으면 물어보고.핵심기능만 나열하고, UI 나 환경설정에 뭐가 들어가고 그런건 제외합니다.
디테일한 것들은 나중에 추가하면 되니까요.
이래야 PLAN.md 가 적당한 크기가 됩니다.
한가지 중요한 것은 요청이 디테일하지는 않아도 되는데,
모호하면 안됩니다.
2. 단계별 지시
저는 매 작업마다 항상 /clear 를 시켜줍니다.
그래도 요약문서를 계속 참조하게 시키기 때문에 클로드가 헤매지는 않습니다.
기능 테스트만 하고 코드 리뷰는 그닥 하지 않습니다.
@PLAN.md 3 단계 작업해줘.## 구현 단계
### Phase 1 — 프로젝트 셋업
- [x] Xcode 프로젝트 생성 (macOS App, AppKit, Swift)
- [x] `Info.plist` 설정
- `LSUIElement = YES` — Dock 아이콘 숨김, 메뉴바 전용 앱
- `NSAppleEventsUsageDescription` — 앱 실행 권한 설명
- `NSAccessibilityUsageDescription` — 키 이벤트 전송 권한 설명
- [x] 최소 배포 타깃: macOS 13.0
- [x] 폴더 구조 생성
### Phase 2 — 데이터 모델 및 설정 저장
**DeckButton**
```swift
struct DeckButton: Codable {
let index: Int // 0..<15
var action: ButtonAction?
var label: String // 표시 텍스트
var iconSource: IconSource? // 아이콘 출처
}
enum IconSource: Codable {
case appIcon(bundleID: String) // 앱 번들에서 추출
case customImage(path: String) // 사용자 지정 이미지
case text(String) // 텍스트 레이블만
}
enum ButtonAction: Codable {
case appLaunch(bundleID: String, appName: String)
case keystroke(keyCode: UInt16, modifierFlags: UInt64)
}
```
**DeckConfig**
```swift
struct DeckConfig: Codable {
var buttons: [DeckButton] // 15개 (index 0~14)
var iconPosition: CGPoint // 화면 좌표 (디폴트: 우측 하단)
var iconSize: CGFloat // 디폴트: 100
var hoverDelay: TimeInterval // 디폴트: 0.3초
var gridDismissDelay: TimeInterval // 디폴트: 1.0초
}
```
- [x] `ConfigurationManager`
- `~/Library/Application Support/VirtualDeck/` 디렉토리 생성
- `load()` / `save()` — Codable JSON 인코딩
- 초기 실행 시 기본값으로 15개 빈 버튼 생성
### Phase 3 — FloatingIconWindow (부유 아이콘)
- [x] `FloatingIconWindow: NSPanel`
- `styleMask`: `.borderless`
- `level`: `.floating`
- `collectionBehavior`: `.canJoinAllSpaces` + `.stationary`
- `isOpaque = false`, `backgroundColor = .clear`
- `hasShadow = true`
- 앱 시작 시 즉시 표시
- 기본 위치: 우측 하단 (화면 끝에서 20pt 여백)
- [x] `FloatingIconView: NSView`
- 반투명 둥근 사각형 배경 (cornerRadius = 16)
- 중앙에 SF Symbol `square.grid.3x3.fill` 또는 앱 로고
- **드래그 이동**: `mouseDown` + `mouseDragged` → `window.setFrameOrigin()`
- **드래그 완료**: `mouseUp` 시 새 위치를 `DeckConfig.iconPosition`에 저장
- `NSTrackingArea` 등록 (`.mouseEnteredAndExited`, `.activeAlways`)
- [x] 호버 로직
- `mouseEntered` → `hoverDelay`(0.3초) 타이머 시작
- `mouseExited` → 타이머 취소
- 타이머 완료 → `DeckGridWindow` 표시 + 위치 계산3. 클로드가 뻘짓을 하면 롤백하고 다시 시키는 것도 방법입니다.
작업을 시켰는데 오류가 발생하고, 현상(에러 메시지 등) 을 보여줘도 헤매면 그냥 롤백이 빠릅니다.
4. 디테일 작업 시작
버튼 모양 바꾸기, 환경설정에 설정 추가하기…
이런것들은 옆길로 새기가 힘들정도로 뻔한 작업이라 뻘짓을 그닥 안하더군요.
대략 이 방법으로 이틀만에 앱이 하나 나왔네요. ㅋㅋㅋㅋ.
ps. 처음 좋은 결과가 나온게 아니라, 여러 번 다른 작업을 시킬 때도 적용했던 방법론이라…
믿고 해보셔도 괜찮을거에요.
물어볼 것 있으면 물어보고.요것도 중요해요.
클로드가 제멋대로 하지 않고 물어보고 문서 작성하니까요.
9
0
댓글을 남기려면 로그인이 필요합니다.
로그인 후 이 페이지로 돌아와 바로 댓글을 남길 수 있습니다.