2053466b79
docs(readme): add animated demo GIF
...
CI / test (push) Has been cancelled
Generate docs/screenshots/demo.gif from the 5 screenshots (1200x600, 3s per frame, two-pass palette) and surface it at the top of README.md.
2026-06-25 14:36:06 +02:00
571b8ae0c4
feat(seed): ~5x richer demo data via deterministic generators
...
Rewrite scripts/seed-demo.ts as a thin orchestrator over a new scripts/seed/ module (rng, pools, helpers, content, schedule, logs, generators). Scales demo data from 6 users/3 projects to ~30 users/15 projects with ~5-8x per-table content (~6.8x total rows) via a seeded mulberry32 PRNG for full reproducibility (incl. bcrypt salts and file/URL identifiers). FK-safe ordering, real captured IDs for activity logs, enum pools typed against lib/types. Preserves canonical login credentials and projects.
2026-06-25 14:35:56 +02:00
0756bba2e5
Merge branch 'feature/fix-chat-immediate-todo-reorder' - chat immediate display + todo reorder
CI / test (push) Has been cancelled
2026-06-25 13:06:18 +02:00
03cf27a148
fix(chat,todo): show sent chat messages immediately + kanban drag-and-drop reorder
...
チャット送信の即時表示とKanbanのDnD並べ替えを修正。
- chat: 送信成功時に返却メッセージを楽観的にローカルへ先頭追加(SSE到着前でも即表示、idで重複排除)。setSending(false) をレスポンス処理後に移動し二重送信窓を縮小。
- todo: TodoService.reorderItems(projectId, columnId, itemIds[]) を追加(1トランザクションでカラム内を再採番、メンバーシップ+同プロジェクト検証、活動ログ/SSEは1件)。POST /todos/items/reorder を追加。
- KanbanBoard: カード単位のドロップターゲット(ポインタYで前/後挿入)+カラム空き領域は末尾追加。楽観的にorderIndex/columnIdを更新しrenderをorderIndexでソート(即時反映)、失敗時はエラー表示+再取得で巻き戻し。ドラッグ直後の誤クリック(ダイアログ誘起)をdragEndタイムスタンプで抑制。空の並べ替えはSSE/ログを出さない。
2026-06-25 13:06:05 +02:00
2588c0247b
Merge branch 'feature/pwa-mobile-support' - PWA + mobile support
CI / test (push) Has been cancelled
2026-06-25 12:01:13 +02:00
a845f51a35
feat(pwa): installable PWA + mobile responsive chrome
...
PWA対応とモバイルUX改善。
- app/manifest.ts: Nextファイルベースでマニフェスト生成(name/short_name/display:standalone/icons 192+512 any+maskable + svg)
- public/icon.svg + 生成PNG(192/512): scripts/generate-icons.mjs で sharp を用いてSVGをラスタライズ
- public/sw.js: アプリシェルのプリキャッシュ、ナビゲーションはネットワーク優先(オフラインはキャッシュ/'/'にフォールバック)、静的アセットはキャッシュ優先。API/非GET/クロスオリジンはキャッシュせず、res.ok&&basic でエラー/リダイレクト結果を弾く
- components/pwa/ServiceWorkerRegister: 本番のみ /sw.js を登録(開発HMRとの衝突回避)
- app/layout.tsx: export const viewport(device-width, cover, themeColor) + metadata.icons/appleWebApp
- middleware: sw.js/manifest/icon を認証ガードから除外(ログイン前でも取得可能)
- ProjectNav: 横スクロールStrip(折り返さない)、Header: モバイルでダッシュボードテキストリンクを非表示
2026-06-25 12:01:01 +02:00
9d7a23ea94
Merge branch 'feature/theme-i18n-settings' - dark/light theme + en/ja i18n
CI / test (push) Has been cancelled
2026-06-25 11:38:09 +02:00
921cdc457d
feat(ux): dark/light theme + en/ja i18n + user preferences
...
UX全体にテーマと言語設定を追加。
- lib/db/migrations/004_user_prefs.sql: users に theme/locale 列を追加(既定 dark/en)
- lib/i18n/: dictionary(en/ja) + I18nProvider(クライアントcontext: locale/theme/t/setLocale/setTheme) + server.ts(SSR用 getLocale/getTheme/translate) + constants.ts
- app/layout.tsx: theme/locale Cookie を読み <html class/lang> をSSR、I18nProvider でラップ(フラッシュなし)
- tailwind darkMode:'class' + 全画面に dark: バリアントを一括付与(Nodeスクリプト lookbehind で安全に変換)
- components/layout/ThemeToggle: 即時クラス切替+Cookie+永続化
- app/profile: テーマ/言語セレクタ、chrome翻訳(Header/ProjectNav/login/dashboard/profile)
- PATCH /api/users/me: theme/locale を受理(バリデーション→400)、Cookieを設定
- E2E: locale=ja storageState で既存JAアサーションを維持、theme-i18n.spec で既定en/darkと切替を検証
2026-06-25 11:37:44 +02:00
6a134a29bd
Merge branch 'feature/todo-metadata-edit-dialog' - todo metadata + edit dialog
CI / test (push) Has been cancelled
2026-06-25 10:52:20 +02:00
91dd05ba7b
feat(todo): richer metadata (tags, startDate, files) + edit/detail dialog
...
ToDoアイテムのメタデータを拡充し、編集/詳細ダイアログを追加。
- lib/db/migrations/003_todo_tags.sql: todo_items に tags 列を追加
- TodoRepository/TodoService: startDate(従来ハードコードNULL)とtagsをcreate/updateで永続化、fileIdsで添付紐付け(トランザクション)、deleteItemで添付クリーンアップ、getItem/getItemAttachments を追加
- API: GET /todos/items/[itemId] ({item, attachments}) を追加、POST/PATCH で startDate/tags/fileIds を受理、PATCH は null(クリア)と undefined(更新しない)を区別
- UI: TodoDialog(タイトル/説明/担当/優先度/開始日/期限/タグ/添付を編集、完了日時・タイムスタンプは読み取り専用)、KanbanBoard のカードクリックでダイアログを開きメタデータを表示
- MilestoneRepository の todo マッピングに tags を追加し as never キャストを修正
- docs/functional-design.md に tags / file_assets.source / attachments テーブルを追記
2026-06-25 10:51:50 +02:00
b2b3fb00b5
Merge branch 'feature/chat-board-attachments' - file/image attachments for chat & board
CI / test (push) Has been cancelled
2026-06-25 10:07:40 +02:00
25d800a529
feat(chat,board): file/image attachments on chat, board threads and comments
...
チャット・掲示板(スレッド/コメント)へファイル/画像添付を追加。
- lib/db/migrations/002_attachments.sql: attachments テーブル + file_assets.source 列
- repositories/AttachmentRepository + services/AttachmentService: 添付紐付け(プロジェクト/アップロード者チェック)
- FileStorageService.uploadForAttachment: 通知/SSE/アクティビティを行わない添付専用アップロード(source='attachment')
- ChatService/BoardService: fileIds 受理・添付紐付け・履歴/詳細表示・削除クリーンアップ(トランザクション)
- API: POST /attachments + chat/board の fileIds 受理
- UI: AttachmentList(画像サムネイル+Lightbox/ダウンロード) + AttachmentPicker(複数アップロード・送信中は送信不可) をチャット/スレッド/コメントに統合
- 添付ファイルは既存の /api/files/[fileId]/download(権限チェック済)で配信
2026-06-25 10:07:02 +02:00
c747978f3d
Merge branch 'feature/calendar-grid-view' - calendar grid view (month/week/day)
CI / test (push) Has been cancelled
2026-06-25 08:47:19 +02:00
41d65f58bb
feat(calendar): replace list view with month/week/day grid + date detail dialog
...
カレンダー画面を一覧表示から実際のカレンダーグリッドへ変更。
- lib/calendar/grid.ts: 月グリッド/週/時間グリッド/取得範囲(rangeForView)の純粋な日付ヘルパー (+22 unit tests)
- components/calendar/: CalendarView(月/週/日 切替・prev/next/今日)・MonthView(truncateチップ)・WeekView・DayView(時間グリッド+終日)・EventDetailDialog(詳細・フォーカス管理)・sourceColors
- page.tsx: view/date searchParamsから範囲を計算しServer Componentで取得、CalendarViewへ渡す
- e2e: 表示切替・詳細ダイアログ・ナビステップ(週=7日/日=1日)を追加
2026-06-25 08:46:58 +02:00
9fce9e9215
add seeding feature with initial demo data
CI / test (push) Has been cancelled
2026-06-25 08:09:07 +02:00
f65f3c435c
Merge branch 'feature/m15-full-tests' - M15 full test completion & quality
2026-06-25 02:54:51 +02:00
f9720850b2
feat(m15): full test completion + quality gate + validation fixes
...
- Add E2E notifications.spec (member-added notification -> list -> mark read)
and activity-log.spec (board_posted + todo_created recorded)
- Set Playwright workers=1 for deterministic full-suite runs (SSE test under
parallel load); full E2E suite (18 tests / 13 specs incl. 12 mandated
scenarios) green
- Quality gate: 251 unit/integration tests, lint clean, typecheck clean,
build succeeds, coverage 91.13% Repository/Service (>=80%)
- Validation fixes (mandatory): SearchService now searches ALL items
(large pageSize) instead of first page only; MeetingService.
checkScheduleConflicts now requires membership (actorId) to prevent
non-member info enumeration
2026-06-25 02:54:48 +02:00
2bc883cb6f
Merge branch 'feature/m14-backup-admin' - M14 backup & admin
2026-06-25 02:35:37 +02:00
0026edd22b
feat(m14): backup & admin (zip via fflate, admin guard, tests, e2e)
...
- BackupService (admin-only: createBackup zips DB+uploads via fflate to
backups/backup-<ts>.zip, listBackups newest-first, getBackupPath with
path-traversal guard)
- Admin backup APIs: GET/POST /api/admin/backups, GET /api/admin/backups/:filename
- Admin backups screen (admin-only) + BackupCreateButton
- Playwright globalSetup seeds a system_admin user for admin E2E
- add fflate dependency
- Unit tests (BackupService: zip content, list, admin guard, traversal) +
e2e backup (create/list/download + non-admin 403)
2026-06-25 02:35:35 +02:00
384e61386a
Merge branch 'feature/m13-search-dashboard' - M13 search & dashboard
2026-06-25 02:28:20 +02:00
755c242d2b
feat(m13): cross-resource search + dashboard completion, tests, e2e
...
- SearchService (cross-resource keyword search across board/chat/todo/file/
event/meeting/milestone/note with type filter, project isolation)
- DashboardService (project dashboard: in-progress todos, near-due(7d),
latest chat/board/notes/files(5), next meeting, milestones w/ progress,
recent activity(10); personal dashboard: my projects, incomplete todos,
upcoming meetings, unread notifications, overdue tasks, recent activity)
- CalendarRepository.findByProject
- APIs: GET /api/projects/:projectId/search, GET /api/dashboard
- Screens: complete personal dashboard, complete project overview,
search page + SearchForm, ProjectNav 検索 link
- Unit tests (SearchService, DashboardService) + e2e dashboard
2026-06-25 02:28:17 +02:00
a632574fb0
Merge branch 'feature/m12-meetings' - M12 meetings & schedule conflict
2026-06-25 02:19:29 +02:00
29e4bc6650
feat(m12): meetings + schedule conflict detection, tests, e2e
...
- MeetingRepository (CRUD, soft-delete, members, findMeetingsByUserInRange
overlap) + CalendarRepository.findByCreatorInRange + TodoRepository.
findHighPriorityByAssignee
- MeetingService (createMeeting tx+members, meeting_invited notify,
meeting_created activity, SSE meeting.created; updateMeeting/updateMinutes/
deleteMeeting; checkScheduleConflicts = other meetings overlap + calendar
events overlap + high-priority todos due +-3d, time-overlap logic,
excludeMeetingId; conflicts are warnings)
- APIs: meetings list/create/edit + /check conflict check
- Screens: meetings page + MeetingForm(member checkboxes, conflict display)
+ ConflictWarning, ProjectNav link
- Unit tests (MeetingRepository, MeetingService incl. conflict algorithm)
+ e2e meetings
2026-06-25 02:19:25 +02:00
09e1e5e22a
Merge branch 'feature/m11-calendar-milestones' - M11 calendar & milestones
2026-06-25 02:11:13 +02:00
31d8ad1325
feat(m11): calendar + milestones with progress calc, tests, e2e
...
- CalendarRepository (event CRUD, range query, soft-delete, project isolation)
+ MilestoneRepository (CRUD, findToDosByMilestone) + ScheduleService
(aggregated getCalendarEvents = custom events+milestones+todos in range,
milestone CRUD, milestone_updated activity, progress auto-calc 0-100)
- APIs: calendar events GET/POST/PATCH/DELETE, milestones GET/POST/PATCH +
progress
- Screens: calendar list view + CalendarEventForm, milestones list with
progress bars + MilestoneForm, ProjectNav links
- Unit tests (CalendarRepository, MilestoneRepository, ScheduleService incl.
progress calc 0/33/100) + e2e calendar
2026-06-25 02:11:10 +02:00
d9d2ba9819
Merge branch 'feature/m10-file-sharing' - M10 file sharing & lightbox
2026-06-25 02:02:42 +02:00
60fef5c0c9
feat(m10): file sharing with upload, lightbox, permission, tests, e2e
...
- FileRepository (CRUD, soft-delete, pagination, project isolation) +
FileStorageService (local FS save data/uploads/<projectId>/<uuid>.<ext>,
MIME allowlist, filename sanitize, unique uuid name, member permission,
file_shared notification to other members, file_uploaded activity log,
SSE file.uploaded, uploader/admin delete + FS unlink)
- APIs: files list/upload(multipart), download (membership), delete
- Screens: files page + Uploader(multipart) + FileList(image Lightbox,
PDF link, delete), ProjectNav ファイル link
- Unit tests (FileRepository, FileStorageService) + e2e file-sharing
2026-06-25 02:02:39 +02:00
1425773cd4
Merge branch 'feature/m9-todo-kanban' - M9 todo/kanban
2026-06-25 01:54:27 +02:00
385b251cc7
feat(m9): todo/kanban with DnD, assignee notify, completion, tests, e2e
...
- TodoRepository (column CRUD, item CRUD, soft-delete, ordering, maxOrderIndex,
project isolation) + TodoService (lazy standard-column init, member/admin
permission, create/update/move/toggleComplete/delete, todo_assigned notify,
todo_created/updated/completed activity logs, SSE todo.updated)
- APIs: columns + items (GET/POST/PATCH/DELETE), toggleComplete + move
- KanbanBoard client (HTML5 drag&drop move, new task per column, complete),
todos page, ProjectNav ToDo link
- Unit tests (TodoRepository, TodoService) + e2e todo-kanban
2026-06-25 01:54:24 +02:00
d2a4d56543
Merge branch 'feature/m8-sse-chat' - M8 SSE hub & realtime chat
2026-06-25 01:45:37 +02:00
ddad5ae78c
feat(m8): SSE hub + realtime chat with mentions, tests, e2e
...
- SseHub (project-scoped client mgmt + broadcast, implements SseBroadcaster)
with SSE-formatted payload; singleton getSseHub
- ChatRepository (message CRUD, soft-delete, search, pagination, project
isolation) + ChatService (membership permission, send/edit/delete,
@email mention -> mention notification, SSE broadcast of created/updated/deleted)
- SSE stream endpoint (ReadableStream + heartbeat + abort cleanup, membership)
- Chat message API routes (history/send/edit/delete)
- ChatWindow client (EventSource auto-reconnect, history fetch, realtime
append/update/delete), chat page, ProjectNav チャット link
- SseEvent type now carries ChatMessage for chat events
- Unit (SseHub, ChatRepository, ChatService) + integration chat-sse-broadcast
+ e2e chat-sse (two contexts realtime)
2026-06-25 01:45:34 +02:00
83a02265f5
Merge branch 'feature/m7-markdown-notes' - M7 markdown notes
2026-06-25 01:36:14 +02:00
e45aea8e27
feat(m7): markdown notes with CRUD, preview, search, tests, e2e
...
- ProjectNoteRepository (CRUD, soft-delete, search title/body/tags,
pinned-first ordering, index usage) + NoteService (membership permission,
author/admin edit/delete, note_updated notification to other members,
note_created/note_updated activity logs, pin/tags)
- APIs: notes list/create/detail/edit/delete
- Screens: notes list + NoteForm, note detail + NoteEditor + MarkdownBody
preview, ProjectNav メモ link
- Unit tests (ProjectNoteRepository, NoteService) + e2e markdown-notes.spec
2026-06-25 01:36:10 +02:00
fb61a7f592
Merge branch 'feature/m6-board' - M6 board (threads, comments, markdown, tests)
2026-06-25 01:28:11 +02:00
2017585f84
feat(m6): board with threads/comments, markdown, tests, e2e
...
- BoardRepository (thread/comment CRUD, soft-delete, search, pagination,
pinned-first ordering) + BoardService (membership permission,
author/admin edit/delete, comment->board_commented notification,
board_posted/comment_added activity logs, category validation)
- APIs: threads list/create/detail/edit/delete, comments create/edit/delete
- MarkdownBody (react-markdown + remark-gfm + rehype-sanitize),
ThreadForm, CommentForm, board list + thread detail screens, ProjectNav link
- Unit tests (BoardRepository, BoardService) + e2e board.spec
2026-06-25 01:28:08 +02:00
ac598a50f2
Merge branch 'feature/m5-notifications-activity' - M5 notifications & activity log
2026-06-25 01:20:27 +02:00
3e02feb221
feat(m5): notifications & activity log foundation
...
- Expand NotificationRepository (unread list paginated, count, markRead
ownership-scoped); new ActivityLogRepository (create, findByProject
paginated) with deterministic created_at+id ordering
- NotificationService (notifyOnEvent, resolveTargets for 8 event types,
injectable SseBroadcaster for M8) + ActivityLogService (logActivity,
listByProject)
- NotificationEvent/SseEvent/SseBroadcaster types in lib/types
- APIs: GET /api/notifications, POST /api/notifications/:id/read,
GET /api/projects/:projectId/activity
- Screens: notifications list + MarkReadButton, NotificationBadge in
Header, project activity page + ProjectNav link
- Unit tests for both repositories and services (28 new)
2026-06-25 01:20:24 +02:00
95722e99f1
Merge branch 'fix/post-m4-validation' - post-M4 validation fixes
2026-06-25 01:11:38 +02:00
3dc0318011
fix: post-M4 validation improvements
...
- Session: verify server-side iat expiry (not just cookie maxAge)
- Validate ProjectMemberRole on member add (reject arbitrary strings)
- Scope coverage threshold to Repository/Service layers (per guidelines)
- Add session expiry/fresh-token unit tests
2026-06-25 01:11:35 +02:00
abef2c58d9
Merge branch 'feature/m4-project-member' - M4 project & member management (repos, service, API, screens, tests)
2026-06-25 01:02:20 +02:00
9eb391ea8d
feat(m4): project & member management with tests and e2e
...
- ProjectRepository, ProjectMemberRepository, minimal NotificationRepository
- ProjectService: create/update/archive/delete project, add/remove member,
permission checks (isMember/admin), member-added notification, getDashboard
skeleton, getMyProjects, getMemberRole
- projectValidator, API services factory
- API routes: projects CRUD, members list/add/remove
- Screens: dashboard (project list + create form), project overview, members,
settings; layout (Header/Sidebar/ProjectNav) and project components
- Unit tests (Project/ProjectMember repositories, ProjectService),
integration project-member-permission, e2e project-management
2026-06-25 01:02:10 +02:00
8a67523c0e
Merge branch 'feature/m3-auth-user' - M3 auth & user management (session, AuthService, API, screens, tests)
2026-06-25 00:36:50 +02:00
21b9f03e9d
feat(m3): auth & user management with session, tests, and e2e
...
- Custom error classes (lib/errors.ts) and signed-cookie session
(lib/auth/session.ts, HMAC-SHA256, httpOnly+sameSite=lax)
- UserRepository + AuthService (bcrypt hashing, role/status checks,
register/login/logout/getCurrentUser/updateProfile)
- Auth helpers (getCurrentUser), user validator, API error handler
- API routes: register (auto-login), login, logout, me, PATCH users/me,
GET admin/migrations (admin-only guard)
- middleware.ts redirects unauthenticated page access to /login
- Screens: login (login/register toggle), profile, dashboard skeleton,
home redirect
- vitest: exclude e2e specs, setupFiles for SESSION_SECRET
- playwright: run migrate before dev server, set SESSION_SECRET
- Unit tests (UserRepository, AuthService, session), integration
auth-flow, e2e auth.spec (register/login/logout/protected/401)
2026-06-25 00:36:42 +02:00
40ff4fb909
Merge branch 'feature/m2-db-foundation' - M2 DB foundation (SQL wrapper, migrator, schema, tests)
2026-06-25 00:21:37 +02:00
d7c4cd5e58
feat(m2): DB foundation tests + multi-statement migration fix
...
- Add SqliteDatabase.exec() using better-sqlite3 exec() so the migrator
can run multi-statement SQL files (prepare() rejected 001_initial.sql)
- Migrator now uses exec() for migration file content
- Fix tests/helpers/db.ts: replace CJS require() with ESM import
- Add unit tests for SqliteDatabase (query/get/execute/transaction/exec,
WAL & foreign_keys pragmas) and Migrator (ordering, idempotency,
rollback, real 001_initial.sql applies)
- Restore .gitignore steering exclusion; remove stale steering files
2026-06-25 00:21:26 +02:00
07c7d424e5
add steering files for M1-M4 foundation and M1-M4 milestones
2026-06-24 23:54:04 +02:00
a9aef7e484
save current changes
2026-06-24 23:53:30 +02:00
cfcc91a670
Merge branch 'feature/m1-setup' - M1 project foundation setup
CI / test (push) Has been cancelled
2026-06-24 23:47:40 +02:00
9253164fd3
feat(m1): project foundation setup - Next.js 15, Tailwind, tooling, CI
...
- Configure Next.js 15 (App Router, Node.js runtime, serverExternalPackages for better-sqlite3/bcrypt)
- Add Tailwind CSS, PostCSS, tsconfig with @/* alias
- Create app structure (layout, page, globals.css)
- Create directory structure (lib, repositories, services, components, tests)
- Configure Vitest (alias, coverage), Playwright
- Add dependencies: next, react, better-sqlite3, bcrypt, react-markdown, etc.
- Add .env.example, CI workflow, next-env.d.ts
- Remove boilerplate src/example files
2026-06-24 23:47:27 +02:00
80e195b3dc
chore: initialize repository with project docs and tooling
...
- Add persistent docs: PRD, functional design, architecture, repository structure, development guidelines, milestones
- Add brainstorming notes (docs/ideas/)
- Configure tooling: package.json, tsconfig, eslint, prettier, vitest
- Add opencode configuration (commands, skills, agents)
- Add .gitignore for node_modules, .env, data/, backups/, build outputs
2026-06-24 23:31:06 +02:00