idea-manager 2.4.2 → 2.4.4

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.
Files changed (88) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +6 -6
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  6. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  15. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/api/advisor-actions/route_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/archive/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/filesystem/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/filesystem/tree/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/global-advisor/route.js +5 -3
  27. package/.next/standalone/.next/server/app/api/global-advisor/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/global-memo/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/maintenance/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/projects/[id]/advisor/route.js +8 -3
  32. package/.next/standalone/.next/server/app/api/projects/[id]/advisor/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/projects/[id]/apply-distribute/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/projects/[id]/auto-distribute/route.js +2 -2
  35. package/.next/standalone/.next/server/app/api/projects/[id]/auto-distribute/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/projects/[id]/brainstorm/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/projects/[id]/git-sync/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route.js +4 -2
  41. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/prompt/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route.js +1 -1
  44. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/refine/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/reorder/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/[subId]/tasks/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/projects/[id]/sub-projects/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/api/tasks/[taskId]/move/route_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/index.html +2 -2
  56. package/.next/standalone/.next/server/app/index.rsc +2 -2
  57. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  59. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  60. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  62. package/.next/standalone/.next/server/app/page.js +11 -11
  63. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app-paths-manifest.json +6 -6
  66. package/.next/standalone/.next/server/pages/404.html +2 -2
  67. package/.next/standalone/.next/server/pages/500.html +2 -2
  68. package/.next/standalone/.next/static/chunks/app/page-811d22e486a3d87e.js +28 -0
  69. package/.next/standalone/package.json +1 -1
  70. package/package.json +1 -1
  71. package/src/app/api/global-advisor/route.ts +4 -2
  72. package/src/app/api/projects/[id]/advisor/route.ts +4 -2
  73. package/src/app/api/projects/[id]/sub-projects/[subId]/tasks/[taskId]/chat/route.ts +4 -2
  74. package/src/components/advisor/GlobalAdvisorLayer.tsx +2 -1
  75. package/src/components/memo/GlobalMemoLayer.tsx +2 -1
  76. package/src/components/search/GlobalSearch.tsx +2 -1
  77. package/src/components/search/QuickCapture.tsx +2 -1
  78. package/src/components/task/NoteEditor.tsx +3 -2
  79. package/src/components/task/TaskDetail.tsx +4 -3
  80. package/src/components/ui/AiActivityIndicator.tsx +12 -8
  81. package/src/components/ui/ShortcutOverlay.tsx +17 -16
  82. package/src/components/workspace/ProjectAdvisor.tsx +2 -1
  83. package/src/components/workspace/WorkspacePanel.tsx +2 -1
  84. package/src/lib/ai/client.ts +8 -1
  85. package/src/lib/platform.ts +42 -0
  86. package/.next/standalone/.next/static/chunks/app/page-835e6af14011d7a8.js +0 -28
  87. /package/.next/standalone/.next/static/{7pRC2QM2hsLqbyNWuLfB3 → fX5pGBcLOdRVyNur2EExF}/_buildManifest.js +0 -0
  88. /package/.next/standalone/.next/static/{7pRC2QM2hsLqbyNWuLfB3 → fX5pGBcLOdRVyNur2EExF}/_ssgManifest.js +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
4
4
  import type { ITask, TaskStatus, ItemPriority } from '@/types';
5
+ import { mod } from '@/lib/platform';
5
6
  import StatusFlow from './StatusFlow';
6
7
  import TaskChat from './TaskChat';
7
8
  import NoteEditor, { getPromotableLine } from './NoteEditor';
@@ -432,11 +433,11 @@ export default function TaskDetail({
432
433
 
433
434
  <button
434
435
  onClick={openPalette}
435
- title="AI 명령 (K)"
436
+ title={`AI 명령 (${mod()}K)`}
436
437
  className="text-xs px-2 py-0.5 rounded transition-colors border border-border
437
438
  text-muted-foreground hover:text-foreground hover:border-muted-foreground"
438
439
  >
439
- K
440
+ {mod()}K
440
441
  </button>
441
442
  <button
442
443
  onClick={copyAsPrompt}
@@ -525,7 +526,7 @@ export default function TaskDetail({
525
526
  <div className="px-4 pt-2 pb-1 flex items-center justify-between">
526
527
  <span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">Note</span>
527
528
  <span className="text-[10px] text-muted-foreground/60">
528
- Tab 제안 수락 · K AI 명령 · 자동 저장
529
+ Tab 제안 수락 · {mod()}K AI 명령 · 자동 저장
529
530
  </span>
530
531
  </div>
531
532
  <div className="flex-1 min-h-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
- const TYPE_LABEL: Record<string, string> = {
12
- refine: '⌘K Refine',
13
- 'task-chat': 'Note Assistant',
14
- 'project-advisor': 'Project Advisor',
15
- 'global-advisor': 'Global Advisor',
16
- watch: 'Watch',
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">{TYPE_LABEL[a.type] ?? a.type}</div>
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: 'P', desc: '전역 검색' },
10
- { keys: 'N', desc: '빠른 태스크 생성' },
11
- { keys: 'M', desc: '전역 메모 (Quick Memo)' },
12
- { keys: 'J', desc: '전역 AI 어드바이저' },
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: 'L', desc: 'Project Advisor 열기/닫기' },
20
+ { keys: 'Mod-L', desc: 'Project Advisor 열기/닫기' },
20
21
  { keys: 'B', desc: '브레인스토밍 패널 토글' },
21
22
  { keys: 'N', desc: '새 프로젝트 추가' },
22
23
  { keys: 'T', desc: '새 태스크 추가' },
23
- { keys: '1', desc: '상태 → Idea' },
24
- { keys: '2', desc: '상태 → Doing' },
25
- { keys: '3', desc: '상태 → Done' },
26
- { keys: '4', desc: '상태 → Problem' },
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: 'K', desc: 'AI 명령 팔레트' },
33
- { keys: '⌘⇧T', desc: '체크박스/불릿 → 태스크 승격' },
34
- { keys: '⌘⇧F', desc: '포커스 모드 (노트 풀스크린)' },
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: '⌘↵', desc: '체크박스 토글 [ ] ↔ [x]' },
37
- { keys: '⌘⇧↵', desc: '테이블 행 추가' },
38
- { keys: '⌘⇧⌫', desc: '테이블 행 삭제' },
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="⌘L"
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="프로젝트 어드바이저 (L)">
495
+ title={`프로젝트 어드바이저 (${mod()}L)`}>
495
496
  Advisor
496
497
  </button>
497
498
  {project.project_path ? (
@@ -1,4 +1,5 @@
1
1
  import { spawn } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
2
3
  import { AGENTS } from './agents';
3
4
  import type { AgentType } from '../../types';
4
5
 
@@ -33,8 +34,14 @@ export function runAgent(
33
34
  const args = config.buildArgs({ streaming: useStreamJson, model: options?.model });
34
35
  const env = config.buildEnv();
35
36
 
37
+ // If a cwd was requested but doesn't exist on this machine (e.g. a Mac path
38
+ // synced to a Windows box), fall back to process.cwd() instead of failing
39
+ // with the opaque ENOENT that spawn throws.
40
+ const requestedCwd = options?.cwd;
41
+ const effectiveCwd = requestedCwd && existsSync(requestedCwd) ? requestedCwd : process.cwd();
42
+
36
43
  const proc = spawn(config.binary, args, {
37
- cwd: options?.cwd || process.cwd(),
44
+ cwd: effectiveCwd,
38
45
  stdio: ['pipe', 'pipe', 'pipe'],
39
46
  shell: process.platform === 'win32',
40
47
  windowsHide: true,
@@ -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
+ }