idea-manager 2.4.2 → 2.4.3
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +14 -14
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/advisor-actions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/filesystem/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/filesystem/tree/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/global-advisor/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/global-memo/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/maintenance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/advisor/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/apply-distribute/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/auto-distribute/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/brainstorm/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/git-sync/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/reorder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[taskId]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page.js +11 -11
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +14 -14
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/static/chunks/app/page-811d22e486a3d87e.js +28 -0
- package/.next/standalone/package.json +1 -1
- package/package.json +1 -1
- package/src/components/advisor/GlobalAdvisorLayer.tsx +2 -1
- package/src/components/memo/GlobalMemoLayer.tsx +2 -1
- package/src/components/search/GlobalSearch.tsx +2 -1
- package/src/components/search/QuickCapture.tsx +2 -1
- package/src/components/task/NoteEditor.tsx +3 -2
- package/src/components/task/TaskDetail.tsx +4 -3
- package/src/components/ui/AiActivityIndicator.tsx +12 -8
- package/src/components/ui/ShortcutOverlay.tsx +17 -16
- package/src/components/workspace/ProjectAdvisor.tsx +2 -1
- package/src/components/workspace/WorkspacePanel.tsx +2 -1
- package/src/lib/platform.ts +42 -0
- package/.next/standalone/.next/static/chunks/app/page-835e6af14011d7a8.js +0 -28
- /package/.next/standalone/.next/static/{7pRC2QM2hsLqbyNWuLfB3 → IOW4LMC5sTd5lEGD1oowD}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{7pRC2QM2hsLqbyNWuLfB3 → IOW4LMC5sTd5lEGD1oowD}/_ssgManifest.js +0 -0
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { useAiActivity } from '@/hooks/useAiActivity';
|
|
5
|
+
import { mod } from '@/lib/platform';
|
|
5
6
|
|
|
6
7
|
function elapsed(startedAt: number): string {
|
|
7
8
|
const s = Math.floor((Date.now() - startedAt) / 1000);
|
|
8
9
|
return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m${s % 60}s`;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
function typeLabel(t: string): string {
|
|
13
|
+
switch (t) {
|
|
14
|
+
case 'refine': return `${mod()}K Refine`;
|
|
15
|
+
case 'task-chat': return 'Note Assistant';
|
|
16
|
+
case 'project-advisor': return 'Project Advisor';
|
|
17
|
+
case 'global-advisor': return 'Global Advisor';
|
|
18
|
+
case 'watch': return 'Watch';
|
|
19
|
+
default: return t;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
18
22
|
|
|
19
23
|
export default function AiActivityIndicator() {
|
|
20
24
|
const activities = useAiActivity();
|
|
@@ -53,7 +57,7 @@ export default function AiActivityIndicator() {
|
|
|
53
57
|
<span className="inline-block w-1.5 h-1.5 rounded-full bg-warning animate-pulse flex-shrink-0" />
|
|
54
58
|
<div className="flex-1 min-w-0">
|
|
55
59
|
<div className="text-foreground truncate">{a.label}</div>
|
|
56
|
-
<div className="text-muted-foreground/70">{
|
|
60
|
+
<div className="text-muted-foreground/70">{typeLabel(a.type)}</div>
|
|
57
61
|
</div>
|
|
58
62
|
<span className="text-muted-foreground font-mono flex-shrink-0">{elapsed(a.startedAt)}</span>
|
|
59
63
|
</div>
|
|
@@ -1,41 +1,42 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
|
+
import { fmtShortcut } from '@/lib/platform';
|
|
4
5
|
|
|
5
6
|
const SECTIONS: { title: string; shortcuts: { keys: string; desc: string }[] }[] = [
|
|
6
7
|
{
|
|
7
8
|
title: '전역',
|
|
8
9
|
shortcuts: [
|
|
9
|
-
{ keys: '
|
|
10
|
-
{ keys: '
|
|
11
|
-
{ keys: '
|
|
12
|
-
{ keys: '
|
|
10
|
+
{ keys: 'Mod-P', desc: '전역 검색' },
|
|
11
|
+
{ keys: 'Mod-N', desc: '빠른 태스크 생성' },
|
|
12
|
+
{ keys: 'Mod-M', desc: '전역 메모 (Quick Memo)' },
|
|
13
|
+
{ keys: 'Mod-J', desc: '전역 AI 어드바이저' },
|
|
13
14
|
{ keys: '?', desc: '이 도움말' },
|
|
14
15
|
],
|
|
15
16
|
},
|
|
16
17
|
{
|
|
17
18
|
title: '워크스페이스',
|
|
18
19
|
shortcuts: [
|
|
19
|
-
{ keys: '
|
|
20
|
+
{ keys: 'Mod-L', desc: 'Project Advisor 열기/닫기' },
|
|
20
21
|
{ keys: 'B', desc: '브레인스토밍 패널 토글' },
|
|
21
22
|
{ keys: 'N', desc: '새 프로젝트 추가' },
|
|
22
23
|
{ keys: 'T', desc: '새 태스크 추가' },
|
|
23
|
-
{ keys: '
|
|
24
|
-
{ keys: '
|
|
25
|
-
{ keys: '
|
|
26
|
-
{ keys: '
|
|
24
|
+
{ keys: 'Mod-1', desc: '상태 → Idea' },
|
|
25
|
+
{ keys: 'Mod-2', desc: '상태 → Doing' },
|
|
26
|
+
{ keys: 'Mod-3', desc: '상태 → Done' },
|
|
27
|
+
{ keys: 'Mod-4', desc: '상태 → Problem' },
|
|
27
28
|
],
|
|
28
29
|
},
|
|
29
30
|
{
|
|
30
31
|
title: '노트 에디터',
|
|
31
32
|
shortcuts: [
|
|
32
|
-
{ keys: '
|
|
33
|
-
{ keys: '
|
|
34
|
-
{ keys: '
|
|
33
|
+
{ keys: 'Mod-K', desc: 'AI 명령 팔레트' },
|
|
34
|
+
{ keys: 'Mod-Shift-T', desc: '체크박스/불릿 → 태스크 승격' },
|
|
35
|
+
{ keys: 'Mod-Shift-F', desc: '포커스 모드 (노트 풀스크린)' },
|
|
35
36
|
{ keys: '/', desc: '슬래시 명령 (/todo, /table, /code…)' },
|
|
36
|
-
{ keys: '
|
|
37
|
-
{ keys: '
|
|
38
|
-
{ keys: '
|
|
37
|
+
{ keys: 'Mod-Enter', desc: '체크박스 토글 [ ] ↔ [x]' },
|
|
38
|
+
{ keys: 'Mod-Shift-Enter', desc: '테이블 행 추가' },
|
|
39
|
+
{ keys: 'Mod-Shift-Backspace', desc: '테이블 행 삭제' },
|
|
39
40
|
{ keys: 'Tab', desc: '고스트 자동완성 수락' },
|
|
40
41
|
{ keys: 'Esc', desc: '고스트 해제' },
|
|
41
42
|
{ keys: 'Enter', desc: '리스트 자동 이어쓰기' },
|
|
@@ -91,7 +92,7 @@ export default function ShortcutOverlay() {
|
|
|
91
92
|
{section.shortcuts.map((s) => (
|
|
92
93
|
<div key={s.keys} className="contents">
|
|
93
94
|
<kbd className="text-xs font-mono px-1.5 py-0.5 rounded bg-muted border border-border text-foreground text-right whitespace-nowrap">
|
|
94
|
-
{s.keys}
|
|
95
|
+
{fmtShortcut(s.keys)}
|
|
95
96
|
</kbd>
|
|
96
97
|
<span className="text-xs text-muted-foreground self-center">{s.desc}</span>
|
|
97
98
|
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import AdvisorChat from '@/components/advisor/AdvisorChat';
|
|
4
|
+
import { mod } from '@/lib/platform';
|
|
4
5
|
|
|
5
6
|
export default function ProjectAdvisor({
|
|
6
7
|
projectId,
|
|
@@ -15,7 +16,7 @@ export default function ProjectAdvisor({
|
|
|
15
16
|
<AdvisorChat
|
|
16
17
|
basePath={`/api/projects/${projectId}/advisor`}
|
|
17
18
|
title="Project Advisor"
|
|
18
|
-
shortcutHint=
|
|
19
|
+
shortcutHint={`${mod()}L`}
|
|
19
20
|
placeholder="프로젝트에 대해 무엇이든 물어보세요…"
|
|
20
21
|
emptyIcon="🧭"
|
|
21
22
|
emptyHints={[
|
|
@@ -12,6 +12,7 @@ import GitSyncResultsModal from '@/components/dashboard/GitSyncResultsModal';
|
|
|
12
12
|
import FileTreeDrawer from '@/components/ui/FileTreeDrawer';
|
|
13
13
|
import AutoDistributeModal from '@/components/ui/AutoDistributeModal';
|
|
14
14
|
import ProjectAdvisor from '@/components/workspace/ProjectAdvisor';
|
|
15
|
+
import { mod } from '@/lib/platform';
|
|
15
16
|
import type { ISubProject, ITask, TaskStatus, ISubProjectWithStats, IGitSyncResult } from '@/types';
|
|
16
17
|
|
|
17
18
|
interface IProject {
|
|
@@ -491,7 +492,7 @@ export default function WorkspacePanel({
|
|
|
491
492
|
? 'bg-primary/15 text-primary border-primary/30'
|
|
492
493
|
: 'bg-muted hover:bg-card-hover text-muted-foreground border-border'
|
|
493
494
|
}`}
|
|
494
|
-
title=
|
|
495
|
+
title={`프로젝트 어드바이저 (${mod()}L)`}>
|
|
495
496
|
Advisor
|
|
496
497
|
</button>
|
|
497
498
|
{project.project_path ? (
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform detection + shortcut formatting helpers for the client UI.
|
|
3
|
+
* - macOS: ⌘, ⇧, ⌥, ⌃
|
|
4
|
+
* - Windows/Linux: Ctrl, Shift, Alt
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export function isMac(): boolean {
|
|
8
|
+
if (typeof navigator === 'undefined') return true; // SSR fallback
|
|
9
|
+
const nav = navigator as Navigator & { userAgentData?: { platform?: string } };
|
|
10
|
+
const plat = nav.userAgentData?.platform || navigator.platform || navigator.userAgent || '';
|
|
11
|
+
return /Mac|iPhone|iPad|iPod/i.test(plat);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const mod = (): string => (isMac() ? '⌘' : 'Ctrl');
|
|
15
|
+
export const shift = (): string => (isMac() ? '⇧' : 'Shift');
|
|
16
|
+
export const alt = (): string => (isMac() ? '⌥' : 'Alt');
|
|
17
|
+
export const enterKey = (): string => (isMac() ? '↵' : 'Enter');
|
|
18
|
+
export const backspaceKey = (): string => (isMac() ? '⌫' : 'Backspace');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Format a shortcut like "Mod-Shift-f" into ⌘⇧F or Ctrl+Shift+F
|
|
22
|
+
* for display. Accepts +/- separators. Tokens: Mod, Cmd, Ctrl, Shift, Alt, Enter, Backspace, or single char.
|
|
23
|
+
*/
|
|
24
|
+
export function fmtShortcut(spec: string): string {
|
|
25
|
+
const mac = isMac();
|
|
26
|
+
const sep = mac ? '' : '+';
|
|
27
|
+
const tokens = spec.split(/[-+]/).map(t => t.trim()).filter(Boolean);
|
|
28
|
+
const parts = tokens.map((t, i) => {
|
|
29
|
+
const isLast = i === tokens.length - 1;
|
|
30
|
+
const lower = t.toLowerCase();
|
|
31
|
+
if (lower === 'mod' || lower === 'cmd' || lower === 'ctrl') return mac ? '⌘' : 'Ctrl';
|
|
32
|
+
if (lower === 'shift') return mac ? '⇧' : 'Shift';
|
|
33
|
+
if (lower === 'alt' || lower === 'option') return mac ? '⌥' : 'Alt';
|
|
34
|
+
if (lower === 'enter' || lower === 'return') return mac ? '↵' : 'Enter';
|
|
35
|
+
if (lower === 'backspace') return mac ? '⌫' : 'Backspace';
|
|
36
|
+
if (lower === 'escape' || lower === 'esc') return 'Esc';
|
|
37
|
+
if (lower === 'tab') return 'Tab';
|
|
38
|
+
// single character — uppercase for display on last slot
|
|
39
|
+
return isLast ? t.toUpperCase() : t;
|
|
40
|
+
});
|
|
41
|
+
return parts.join(sep);
|
|
42
|
+
}
|