Skip to content

feat: save named workspace presets locally #43

Description

@woosublee

User problem

Coding, Writing, Meeting 등 반복하는 앱·창 배치를 이름 붙여 저장할 수 없다. 현재 Zap은 frontmost window에 즉시 action을 적용할 뿐 여러 application window의 identity, display와 normalized frame을 하나의 재사용 가능한 local preset으로 보존하지 않으며, title 같은 민감하고 불안정한 값을 저장하지 않는 privacy contract도 없다.

Product value

Coding, Writing, Meeting 등 반복하는 앱·창 배치를 명시적으로 저장한다. 사용자는 저장 전에 포함·제외·ambiguity 위험을 확인하고, window content나 title을 수집하지 않는 versioned local-only preset을 만든다.

Scope

  • 사용자 지정 preset name과 R-34의 eligible window enumeration 결과를 받아 versioned local preset으로 저장한다.
  • 각 stored window entry는 app bundle identifier, AX role/subrole, optional application-provided AXIdentifier, session window identity로 구성된 matching descriptor와 display information, normalized frame을 포함한다.
  • Save preview에서 포함될 window, policy로 제외된 unsupported window, missing app 상태와 stable AXIdentifier가 없는 multi-window app의 future ambiguity 위험을 설명한다.
  • duplicate preset name을 silently overwrite하지 않고 사용자가 이름 변경 또는 명시적 교체를 선택하기 전에는 저장하지 않는다.
  • preset data는 Zap의 local storage에만 기록하고 network, account 또는 remote service로 전송하지 않는다.

Acceptance criteria

  • preset name, window matching descriptor, display information, normalized frame을 저장한다.
  • window title은 저장하지 않는다.
  • stable AXIdentifier가 없는 multi-window app은 restore 시 ambiguous가 될 수 있음을 Save preview에서 알린다.
  • preset schema version을 둔다.
  • duplicate name, missing app, unsupported window를 설명한다.
  • 모든 data는 local-only다.
  • stored descriptor에는 app bundle identifier, AX role/subrole, optional application-provided AXIdentifier와 session window identity만 포함하며 R-34가 제외한 sheet/system dialog/비표준 window는 preset entry로 저장하지 않는다.
  • window title, document title, file path, URL, window content, screenshot 또는 thumbnail이 serialized preset과 diagnostics에 포함되지 않는다.
  • Save preview 승인 전에는 preset store를 변경하지 않고, validation 또는 persistence 실패 시 기존 preset과 새 candidate의 partial data가 남지 않는다.
  • duplicate name은 actionable validation으로 표시되고 explicit replace 승인 없이 기존 preset을 덮어쓰지 않는다.
  • 저장된 file/store를 다시 load하면 schema version, name, descriptor, display information과 normalized frame이 loss 없이 복원되며 unsupported future schema는 기존 preset store를 변경하지 않고 거부된다.

Dependencies

External prerequisites

  • Save 시점의 macOS Accessibility authorization. 권한이 없으면 window를 추측하거나 빈 preset을 성공으로 저장하지 않고 authorization requirement를 설명한다.

Non-goals

  • preset의 window를 실제로 이동하거나 global undo를 만드는 restore execution은 R-36의 범위다.
  • display configuration association과 display change/wake automatic trigger는 R-37과 R-38의 범위다.
  • cloud sync, account, sharing, collaboration, network storage 또는 cross-device merge를 제공하지 않는다.
  • window title·document metadata·file path·URL·window content·screenshot을 수집하거나 저장하지 않는다.
  • R-34의 ambiguous matching을 Save 시점의 title 또는 geometry heuristic으로 해결했다고 가장하지 않는다.

Evidence

  • 현재 Accessibility contract는 frontmost window 한 개만 제공해 named multi-window preset을 capture할 수 없다: AccessibilityWindowService.swift lines 68–72.
  • Rectangle Pro의 공식 layouts page는 named/reusable window layout이라는 인접 product evidence다. Zap의 contract는 R-34 descriptor와 local-only privacy 경계로 제한된다: Rectangle Pro.

Milestone exit-gate impact

  • workspace는 사용자가 명시적으로 Save/Restore한다. 이 Issue는 explicit Save, preview와 local persistence를 제공하며 explicit Restore는 R-36이 담당한다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:settings-uiSettings와 사용자 설정 흐름area:window-management창 위치, 크기, history, workspaceenhancementNew feature or requestpriority:P1핵심 사용자 흐름의 정확성, 복구, 높은 가치 작업roadmap승인된 Zap 제품 roadmap 항목status:blocked명시적 dependency가 완료되지 않은 작업

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions