idea-manager 0.1.2 → 0.2.0

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/README.md CHANGED
@@ -38,33 +38,36 @@ AI가 브레인스토밍 텍스트를 분석하여 계층형 작업 트리로
38
38
 
39
39
  내장된 MCP Server를 통해 Claude 등 AI 에이전트가 작업을 조회하고, 상태를 업데이트하며, 순차적으로 실행할 수 있습니다.
40
40
 
41
- ## 설치 및 사용
41
+ ## 설치
42
42
 
43
43
  ```bash
44
44
  npm install -g idea-manager
45
45
  ```
46
46
 
47
- ### 웹 UI
47
+ ## 사용법
48
48
 
49
- ```bash
50
- # 개발 서버
51
- npm run dev
49
+ ### 웹 UI 실행
52
50
 
53
- # 또는 CLI로 실행
51
+ ```bash
54
52
  im start
55
53
  ```
56
54
 
57
- `http://localhost:3456` 에서 웹 UI 접속합니다.
55
+ 자동으로 `http://localhost:3456`에서 웹 UI 열립니다.
56
+
57
+ ```bash
58
+ # 포트 변경
59
+ im start -p 4000
60
+ ```
58
61
 
59
- ### MCP Server
62
+ ### MCP Server 실행
60
63
 
61
64
  ```bash
62
65
  im mcp
63
66
  ```
64
67
 
65
- Claude Desktop 등에서 MCP Server로 연결하여 사용할 수 있습니다.
68
+ Claude Desktop, Claude Code 등에서 MCP Server로 연결하여 AI 에이전트가 작업을 자율 실행할 수 있습니다.
66
69
 
67
- #### claude_desktop_config.json 설정 예시
70
+ #### Claude Desktop 설정 (claude_desktop_config.json)
68
71
 
69
72
  ```json
70
73
  {
@@ -77,6 +80,12 @@ Claude Desktop 등에서 MCP Server로 연결하여 사용할 수 있습니다.
77
80
  }
78
81
  ```
79
82
 
83
+ #### Claude Code 설정
84
+
85
+ ```bash
86
+ claude mcp add idea-manager -- npx -y idea-manager mcp
87
+ ```
88
+
80
89
  ### MCP 제공 도구
81
90
 
82
91
  | 도구 | 설명 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "idea-manager",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "AI 기반 브레인스토밍 → 구조화 → 프롬프트 생성 도구. MCP Server 내장.",
5
5
  "keywords": [
6
6
  "brainstorm",
package/public/icon.svg CHANGED
@@ -5,15 +5,6 @@
5
5
  <stop offset="100%" stop-color="#8b5cf6"/>
6
6
  </linearGradient>
7
7
  </defs>
8
- <rect width="512" height="512" rx="96" fill="url(#bg)"/>
9
- <text x="256" y="310" font-family="system-ui, -apple-system, sans-serif" font-size="260" font-weight="800" fill="white" text-anchor="middle" letter-spacing="-12">IM</text>
10
- <circle cx="390" cy="130" r="28" fill="#fbbf24"/>
11
- <line x1="390" y1="90" x2="390" y2="70" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
12
- <line x1="390" y1="170" x2="390" y2="190" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
13
- <line x1="350" y1="130" x2="330" y2="130" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
14
- <line x1="430" y1="130" x2="450" y2="130" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
15
- <line x1="362" y1="102" x2="348" y2="88" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
16
- <line x1="418" y1="158" x2="432" y2="172" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
17
- <line x1="418" y1="102" x2="432" y2="88" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
18
- <line x1="362" y1="158" x2="348" y2="172" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
8
+ <rect width="512" height="512" rx="108" fill="url(#bg)"/>
9
+ <text x="256" y="390" font-family="system-ui, -apple-system, sans-serif" font-size="420" font-weight="900" fill="white" text-anchor="middle">I</text>
19
10
  </svg>
package/src/app/icon.svg CHANGED
@@ -5,15 +5,6 @@
5
5
  <stop offset="100%" stop-color="#8b5cf6"/>
6
6
  </linearGradient>
7
7
  </defs>
8
- <rect width="512" height="512" rx="96" fill="url(#bg)"/>
9
- <text x="256" y="310" font-family="system-ui, -apple-system, sans-serif" font-size="260" font-weight="800" fill="white" text-anchor="middle" letter-spacing="-12">IM</text>
10
- <circle cx="390" cy="130" r="28" fill="#fbbf24"/>
11
- <line x1="390" y1="90" x2="390" y2="70" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
12
- <line x1="390" y1="170" x2="390" y2="190" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
13
- <line x1="350" y1="130" x2="330" y2="130" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
14
- <line x1="430" y1="130" x2="450" y2="130" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
15
- <line x1="362" y1="102" x2="348" y2="88" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
16
- <line x1="418" y1="158" x2="432" y2="172" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
17
- <line x1="418" y1="102" x2="432" y2="88" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
18
- <line x1="362" y1="158" x2="348" y2="172" stroke="#fbbf24" stroke-width="8" stroke-linecap="round"/>
8
+ <rect width="512" height="512" rx="108" fill="url(#bg)"/>
9
+ <text x="256" y="390" font-family="system-ui, -apple-system, sans-serif" font-size="420" font-weight="900" fill="white" text-anchor="middle">I</text>
19
10
  </svg>
package/src/cli.ts CHANGED
@@ -6,13 +6,20 @@ import { listProjects, getProject } from '@/lib/db/queries/projects';
6
6
  import { getItemTree, getItems, updateItem } from '@/lib/db/queries/items';
7
7
  import { getPrompt } from '@/lib/db/queries/prompts';
8
8
  import type { McpToolContext } from '@/lib/mcp/tools';
9
+ import { spawn } from 'child_process';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ const PKG_ROOT = path.resolve(__dirname, '..');
9
16
 
10
17
  const program = new Command();
11
18
 
12
19
  program
13
20
  .name('im')
14
- .description('Idea Manager CLI')
15
- .version('1.0.0');
21
+ .description('Idea Manager - AI 기반 브레인스토밍 → 구조화 → 프롬프트 생성 도구')
22
+ .version('0.1.0');
16
23
 
17
24
  program
18
25
  .command('mcp')
@@ -32,10 +39,35 @@ program
32
39
 
33
40
  program
34
41
  .command('start')
35
- .description('Start the web UI')
36
- .action(async () => {
37
- const open = (await import('open')).default;
38
- await open('http://localhost:3456');
42
+ .description('Start the web UI (Next.js dev server on port 3456)')
43
+ .option('-p, --port <port>', 'Port number', '3456')
44
+ .action(async (opts) => {
45
+ const port = opts.port;
46
+ console.log(`\n IM - 아이디어 매니저`);
47
+ console.log(` Starting on http://localhost:${port}\n`);
48
+
49
+ const nextBin = path.join(PKG_ROOT, 'node_modules', '.bin', 'next');
50
+ const child = spawn(nextBin, ['dev', '-p', port], {
51
+ cwd: PKG_ROOT,
52
+ stdio: 'inherit',
53
+ env: { ...process.env, NODE_ENV: 'development' },
54
+ });
55
+
56
+ child.on('error', (err) => {
57
+ console.error('Failed to start server:', err.message);
58
+ process.exit(1);
59
+ });
60
+
61
+ // 서버 시작 후 브라우저 오픈
62
+ setTimeout(async () => {
63
+ try {
64
+ const open = (await import('open')).default;
65
+ await open(`http://localhost:${port}`);
66
+ } catch { /* ignore */ }
67
+ }, 3000);
68
+
69
+ process.on('SIGINT', () => { child.kill(); process.exit(0); });
70
+ process.on('SIGTERM', () => { child.kill(); process.exit(0); });
39
71
  });
40
72
 
41
73
  program.parse();