Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Product Contract

Tasteful Intent is a greenfield Tauri desktop Markdown editor for human-authored intentions. The selected `libraryRoot` remains canonical Intent source data. AI keeps one ordered list of user-selected canonical folder tabs with one root-local session per tab; pinning is a tab property represented by an optional 1-2 grapheme label, not a separate source mode. AI edits content through the shared Edit, View, and Split modes and the existing atomic-save/mtime-conflict boundary; AI can create a new Markdown document in the selected folder from the document-list header, and the new document opens in Edit; AI folder creation, rename, move, and Trash remain unavailable. AI View adds a read-only git-diff view cycle (changes-only with collapsed context → full document with highlighted changes → off) that compares the active document body against its git HEAD baseline; it never runs mutating git commands and hides itself when git or a repository is unavailable. Do not add migration adapters for the former PromptPad product. LLM runtime, tags, toolbar, and wiki features are outside v0.2.
Tasteful Intent is a greenfield Tauri desktop Markdown editor for human-authored intentions. The selected `libraryRoot` remains canonical Intent source data. AI keeps one ordered list of user-selected canonical folder tabs with one root-local session per tab; pinning is a tab property represented by an optional 1-2 grapheme label, not a separate source mode. AI edits content through the shared Edit, View, and Split modes and the existing atomic-save/mtime-conflict boundary; AI can create a new Markdown document in the selected folder from the document-list header, and the new document opens in Edit; AI folder creation, rename, move, and Trash remain unavailable. AI View adds a read-only git-diff view cycle (changes-only with collapsed context → full document with highlighted changes → off) that compares the active document body against its git HEAD baseline; it never runs mutating git commands and hides itself when git or a repository is unavailable. When the active AI root is inside a git work tree, the AI document list adds a read-only git status filter (`All → Modified+New → Modified → New → All`) classified against HEAD like the diff view; it is hidden when git or a repository is unavailable. Do not add migration adapters for the former PromptPad product. LLM runtime, tags, toolbar, and wiki features are outside v0.2.

Read `docs/specs/intent-memo.md` and `DESIGN.md` before changing product behavior or UI.

Expand Down Expand Up @@ -48,10 +48,10 @@ The filesystem is the database. Filenames are document titles. Frontmatter conta
- An icon-only pane button immediately before the tabs cycles three panes, two panes, and content-only. The folder pane alone owns the active root display and folder picker; `⌘1` remains a keyboard return path but is not shown as a badge on the switcher.
- The folder tree root and root move destination use the selected directory basename; never present a hardcoded `Library` default.
- Human keeps its fixed-height 78px two-row Source Card below the space switcher. AI uses a compact pinned-shortcut header followed by a vertically scrollable list of every open root. Each visible path keeps only its final two segments as `…/parent/leaf`; pinned list rows prefix the path with their label, while the header repeats only pinned labels as shortcuts. Every path row exposes a direct `Pin` toggle: unpinned is muted but enabled, pinned uses the current AI accent; pinning opens the existing label input before activation and clicking an active pin immediately unpins. The ellipsis menu contains only `Edit label` for pinned roots or `Close` for unpinned roots, plus targeted `Refresh` when unavailable. Pin moves a tab to the end of the pinned group, Unpin moves it to the front of the unpinned group without removing its session, and Edit label preserves root/session identity. Only unpinned tabs can close, removing that root-local session without touching disk files. Exact duplicate roots activate the existing tab; arbitrary visible non-symlink canonical roots, including ancestor/descendant pairs, are allowed. Root activation and close use the save barrier, while pin, unpin, and label edits only persist list transformations. The two-pane navigation fallback retains the AI controls; content-only does not.
- AI uses root-local one-line document tabs without a source badge; tooltip and accessible name retain the canonical full path. The AI rendered view opens with a muted fixed-font `…/parent/file.md` document-path line above the body that scrolls with the content, keeps the canonical full path as tooltip, and ends with the document's on-disk modified time so reloads make file updates visible; Human mode and PDF export omit it. The AI Explorer mixes folders and Markdown files under the selected root; folder activation selects and expands/collapses the branch, while file activation opens a tab and selects its parent folder. Restoring an active AI session applies the same parent-folder selection. The middle Document List shows only direct Markdown children of the selected folder, marks the active document selected, and keeps that row visible after document, snippet, density, or pane-size changes without moving focus. Folder selection, expanded-tree state, and root availability are runtime-only per root. A missing root keeps its folder tab, optional label, and saved session; targeted Refresh activates it only after a successful scan.
- AI uses root-local one-line document tabs without a source badge; tooltip and accessible name retain the canonical full path. The AI rendered view opens with a muted fixed-font `…/parent/file.md` document-path line above the body that scrolls with the content, keeps the canonical full path as tooltip, and ends with the document's on-disk modified time so reloads make file updates visible; Human mode and PDF export omit it. The AI Explorer mixes folders and Markdown files under the selected root; folder activation selects and expands/collapses the branch, while file activation opens a tab and selects its parent folder. Restoring an active AI session applies the same parent-folder selection. The middle Document List shows only direct Markdown children of the selected folder, marks the active document selected, and keeps that row visible after document, snippet, density, or pane-size changes without moving focus. While the git status filter is `Modified+New`, `Modified` (differs from HEAD), or `New` (path missing from HEAD), the Explorer keeps only matching files and the folders above them, fully expanded, and the Document List shows matches anywhere below the selected folder with a muted relative parent path; a selected folder the filter hides reads as the root, and returning to `All` restores the pre-filter selection and expansion. Git status is read with each AI scan (Refresh, root activation, post-mutation rescan) and when leaving `All`, never after saves; `All` only checks for a work tree. Folder selection, expanded-tree state, git filter, and root availability are runtime-only per root. A missing root keeps its folder tab, optional label, and saved session; targeted Refresh activates it only after a successful scan.
- `⌘1` toggles folders while the list is visible; `⌘2` toggles list plus folders.
- `⌘F` and `Ctrl+F` open a non-modal current-document Find overlay when an active document exists. Search is case-insensitive literal matching over the current Markdown body only; Enter/Shift+Enter and the next/previous buttons wrap through results, while Escape closes the overlay and restores the prior focus. Human/AI Edit/View/Split reflect the same active result without persisting search state or scanning the workspace.
- The document list has a global `documentDensity` shared by Human and AI and persisted in `settings.json`: Full shows title, up to two snippet lines, and updated date; Medium shows title and one snippet line; Simple shows title only. Its header cycles `Full → Medium → Simple → Full` with `Rows4`/`Rows3`/`Rows2` between the latest/title sort toggle and create. Human uses `Refresh → Sort → Density → Create`; AI uses the same `Refresh → Sort → Density → Create` order regardless of pin state; its Create button reads `New document`, creates in the selected folder through the shared NameDialog, opens the new document in Edit, and is disabled while the active AI root is unavailable. Opening another AI folder stays in the AI Source Card `FolderPlus` button and the empty content state. Folder rows have no numeric counts. The global `documentSort` preference remains shared by Human and AI and persisted.
- The document list has a global `documentDensity` shared by Human and AI and persisted in `settings.json`: Full shows title, up to two snippet lines, and updated date; Medium shows title and one snippet line; Simple shows title only. Its header cycles `Full → Medium → Simple → Full` with `Rows4`/`Rows3`/`Rows2` between the latest/title sort toggle and create. Human uses `Refresh → Sort → Density → Create`; AI uses the same order regardless of pin state, with the git status filter inserted as `Refresh → Filter → Sort → Density → Create` when the root is inside a git work tree; its Create button reads `New document`, creates in the selected folder through the shared NameDialog, opens the new document in Edit, and is disabled while the active AI root is unavailable. Opening another AI folder stays in the AI Source Card `FolderPlus` button and the empty content state. Folder rows have no numeric counts. The global `documentSort` preference remains shared by Human and AI and persisted.
- Settings has separate Appearance, Typography, and Language navigation. Appearance offers Light (default), Two-Tone, Dark, and System themes plus Classic, Terracotta & Teal, Plum & Moss, and Mono Duo Human/AI color palettes in independent 2×2 radio-tile groups; both choices apply immediately and persist independently. The persisted Two-Tone key remains `charcoal`, System follows the OS color mode, and the default palette key is `classic`. Typography offers Sans-serif (default) and Serif in 2-column cards with a live preview; it applies only to Markdown editing/reading and large empty-state copy while application chrome remains Sans-serif. Language offers English (default) and 한국어 in the same 2-column card pattern with a localized live preview, applies immediately across application chrome, and persists in `settings.json`. User filenames, folder names, Markdown titles, and Markdown bodies are never translated. The visible Settings button lives at the navigation bottom: folder pane in three-pane mode, document-list pane in two-pane mode, and nowhere in content-only mode. Settings has no keyboard shortcut.
- Reuse tokens and primitives from `DESIGN.md`. The development showcase is `?showcase=1`.

Expand Down
5 changes: 3 additions & 2 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ Tasteful Intent는 조용한 종이 책상처럼 느껴져야 한다. 크롬은
### PaneHeader

- label, 현재 경로 또는 mode, 필요한 icon button 최대 4개.
- document list header action은 Human에서 `Refresh → Sort → Density → Create`, AI에서도 pin 여부와 무관하게 `Refresh → Sort → Density → Create` 순서다. AI Create는 `새 문서`로 표시하고 선택 folder에 Markdown을 만든 뒤 Edit로 열며, active AI root가 unavailable이면 비활성화한다. AI 폴더 열기는 AI Source Card의 `FolderPlus` button과 빈 content 상태가 담당한다. 정렬과 밀도 icon의 accessible copy는 현재 상태와 click 후 결과를 함께 설명한다.
- document list header action은 Human에서 `Refresh → Sort → Density → Create`, AI에서도 pin 여부와 무관하게 `Refresh → Sort → Density → Create` 순서다. AI root가 git work tree 안이면 Refresh 뒤에 git status filter cycle button을 넣어 `Refresh → Filter → Sort → Density → Create`가 된다. 순환 순서는 `All → Modified+New → Modified → New → All`이다. filter icon은 `All` `ListFilter`, `Modified+New` `FilePenLine`+`FilePlusCorner` 두 개(button 폭 44px), `Modified` `FilePenLine`, `New` `FilePlusCorner`이고, `All`이 아니면 `--space-tint`/`--space-text`로 강조하며 accessible copy와 tooltip은 현재 상태와 click 후 결과를 함께 설명한다. AI Create는 `새 문서`로 표시하고 선택 folder에 Markdown을 만든 뒤 Edit로 열며, active AI root가 unavailable이면 비활성화한다. AI 폴더 열기는 AI Source Card의 `FolderPlus` button과 빈 content 상태가 담당한다. 정렬과 밀도 icon의 accessible copy는 현재 상태와 click 후 결과를 함께 설명한다.
- hover에만 보이는 동작도 keyboard focus에서는 항상 보여야 한다.

### FolderTreeItem
Expand All @@ -129,6 +129,7 @@ Tasteful Intent는 조용한 종이 책상처럼 느껴져야 한다. 크롬은
- unpinned root row는 folder basename, pinned root row는 `[label] folder basename`을 표시한다. tooltip과 accessible name에는 canonical 전체 root를 유지한다.
- root 아래 folder와 Markdown file을 이름순으로 섞어 표시한다. folder row click은 해당 folder를 선택하고 branch를 inline expand/collapse하며, file row click은 문서를 tab에 열고 parent folder를 선택한다. active AI session 복원도 같은 parent-folder selection을 적용한다.
- selected folder는 기존 `--space-tint`/`--space-text`, active file은 동일 token과 file icon을 사용한다. depth는 14px 단위이고 chevron, folder/file icon, label 순서를 유지한다.
- git status filter가 `All`이 아니면 해당 문서와 그 상위 folder만 남기고 모두 펼친 상태로 시작한다. 이때 Document List row는 제목 아래에 선택 folder 기준 상위 경로를 `--muted`·`--fixed-font`·`--type-xs` 한 줄로 표시한다.
- hidden/ignored/symlink entry와 Markdown이 없는 branch는 native snapshot에 포함하지 않는다. 가운데 Document List는 selected folder의 direct Markdown children만 표시하고 active file row를 selected로 표시한다. 선택 row가 document·snippet·density·pane-size 변화 뒤 viewport 밖이면 nearest 위치로 scroll하되 이미 보이는 row와 DOM focus는 유지한다.
- keyboard focus-visible, `aria-expanded`, active file `aria-current`, full-path tooltip을 제공하고 216px pane에서 horizontal page scroll을 만들지 않는다.

Expand Down Expand Up @@ -192,7 +193,7 @@ Tasteful Intent는 조용한 종이 책상처럼 느껴져야 한다. 크롬은
- 새 canonical root는 tab으로 추가하고 exact root 재선택은 기존 tab을 활성화한다. ancestor/descendant 관계는 허용한다. root 전환은 모든 열린 문서 save와 target scan 성공 후에만 settings와 mounted workspace를 변경한다.
- missing root는 tab, optional label, root-local session을 유지한다. 선택 실패는 현재 workspace를 유지하고 대상만 unavailable로 표시하며, targeted Refresh 성공 후에만 활성화한다.
- root close는 target을 다시 scan하지 않는다. active unpinned tab을 닫으면 오른쪽 우선, 없으면 왼쪽 root를 선택하고 해당 session만 제거한다. Pin, Unpin, Edit label은 mounted workspace를 바꾸지 않아 save barrier가 필요 없다.
- settings는 `settingsSchemaVersion: 2`, `docsRoots`, `docsRoot`, root-indexed `tabSessions.docs`를 사용한다. 저장 성공 후에만 React state와 mounted workspace를 변경하며 Explorer navigation과 availability는 root별 runtime-only map이다.
- settings는 `settingsSchemaVersion: 2`, `docsRoots`, `docsRoot`, root-indexed `tabSessions.docs`를 사용한다. 저장 성공 후에만 React state와 mounted workspace를 변경하며 Explorer navigation, git status filter, availability는 root별 runtime-only map이다.
- AI는 in-app folder picker만 제공하고 외부 drag/drop은 이 slice에 포함하지 않는다. tooltip과 accessible name에는 canonical 전체 root/path를 유지한다.
- folder pane이 숨겨진 2-pane fallback은 동일 AI Source Card를 문서 목록 pane에 한 번만 표시하고 content-only에는 반복하지 않는다.

Expand Down
1 change: 1 addition & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Apple silicon과 Intel용 DMG는 [Releases 페이지](https://github.com/tkhwang
- `⌘F` 또는 `Ctrl+F`로 현재 문서를 검색하고 Edit, View, Split에서 결과를 강조합니다.
- root-relative 로컬 이미지를 10 MiB까지 표시하고 현재 문서의 rendering 결과를 PDF로 내보냅니다.
- 최신순과 제목순으로 정렬하고 문서 목록 밀도를 Full, Medium, Simple로 전환합니다.
- git repository 안의 AI 폴더에서는 마지막 commit 이후 수정되었거나 새로 생긴 문서만 걸러 보고, View에서 열린 문서를 마지막 commit과 비교합니다.
- Keyboard로 접근 가능한 context menu에서 Human 파일과 폴더를 만들고, 이름을 바꾸고, 이동하고, 시스템 휴지통으로 보냅니다.
- 3-pane, 2-pane, content-only mode를 사용합니다. 영어·한국어 UI와 테마 4개, Human·AI 색상 조합 4개, 글꼴 2개를 제공합니다.

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Apple silicon and Intel DMGs are also available on the [Releases page](https://g
- Find text in the current document with `⌘F` or `Ctrl+F`, including highlighted matches in Edit, View, and Split.
- Render root-relative local images up to 10 MiB and export the current rendered document as a PDF.
- Sort by latest update or title and switch the document list between Full, Medium, and Simple density.
- In AI folders inside a git repository, filter the list to documents modified or new since the last commit, and compare the open document with the last commit in View.
- Create, rename, move, and send Human files or folders to the system Trash through keyboard-accessible context menus.
- Work in three panes, two panes, or content-only mode. The app includes English and Korean UI, four themes, four Human/AI color palettes, and two writing typefaces.

Expand Down
Loading
Loading