pilot-ai 0.1.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.
Files changed (213) hide show
  1. package/dist/agent/claude.d.ts +45 -0
  2. package/dist/agent/claude.d.ts.map +1 -0
  3. package/dist/agent/claude.js +114 -0
  4. package/dist/agent/claude.js.map +1 -0
  5. package/dist/agent/core.d.ts +17 -0
  6. package/dist/agent/core.d.ts.map +1 -0
  7. package/dist/agent/core.js +129 -0
  8. package/dist/agent/core.js.map +1 -0
  9. package/dist/agent/heartbeat.d.ts +51 -0
  10. package/dist/agent/heartbeat.d.ts.map +1 -0
  11. package/dist/agent/heartbeat.js +253 -0
  12. package/dist/agent/heartbeat.js.map +1 -0
  13. package/dist/agent/memory-commands.d.ts +11 -0
  14. package/dist/agent/memory-commands.d.ts.map +1 -0
  15. package/dist/agent/memory-commands.js +55 -0
  16. package/dist/agent/memory-commands.js.map +1 -0
  17. package/dist/agent/memory.d.ts +11 -0
  18. package/dist/agent/memory.d.ts.map +1 -0
  19. package/dist/agent/memory.js +109 -0
  20. package/dist/agent/memory.js.map +1 -0
  21. package/dist/agent/multi-agent.d.ts +47 -0
  22. package/dist/agent/multi-agent.d.ts.map +1 -0
  23. package/dist/agent/multi-agent.js +117 -0
  24. package/dist/agent/multi-agent.js.map +1 -0
  25. package/dist/agent/pipeline.d.ts +27 -0
  26. package/dist/agent/pipeline.d.ts.map +1 -0
  27. package/dist/agent/pipeline.js +52 -0
  28. package/dist/agent/pipeline.js.map +1 -0
  29. package/dist/agent/planner.d.ts +21 -0
  30. package/dist/agent/planner.d.ts.map +1 -0
  31. package/dist/agent/planner.js +51 -0
  32. package/dist/agent/planner.js.map +1 -0
  33. package/dist/agent/preference-detector.d.ts +6 -0
  34. package/dist/agent/preference-detector.d.ts.map +1 -0
  35. package/dist/agent/preference-detector.js +50 -0
  36. package/dist/agent/preference-detector.js.map +1 -0
  37. package/dist/agent/project-analyzer.d.ts +6 -0
  38. package/dist/agent/project-analyzer.d.ts.map +1 -0
  39. package/dist/agent/project-analyzer.js +108 -0
  40. package/dist/agent/project-analyzer.js.map +1 -0
  41. package/dist/agent/project.d.ts +28 -0
  42. package/dist/agent/project.d.ts.map +1 -0
  43. package/dist/agent/project.js +121 -0
  44. package/dist/agent/project.js.map +1 -0
  45. package/dist/agent/queue.d.ts +61 -0
  46. package/dist/agent/queue.d.ts.map +1 -0
  47. package/dist/agent/queue.js +167 -0
  48. package/dist/agent/queue.js.map +1 -0
  49. package/dist/agent/safety.d.ts +25 -0
  50. package/dist/agent/safety.d.ts.map +1 -0
  51. package/dist/agent/safety.js +77 -0
  52. package/dist/agent/safety.js.map +1 -0
  53. package/dist/agent/semantic-search.d.ts +34 -0
  54. package/dist/agent/semantic-search.d.ts.map +1 -0
  55. package/dist/agent/semantic-search.js +183 -0
  56. package/dist/agent/semantic-search.js.map +1 -0
  57. package/dist/agent/skills.d.ts +59 -0
  58. package/dist/agent/skills.d.ts.map +1 -0
  59. package/dist/agent/skills.js +161 -0
  60. package/dist/agent/skills.js.map +1 -0
  61. package/dist/agent/tool-descriptions.d.ts +7 -0
  62. package/dist/agent/tool-descriptions.d.ts.map +1 -0
  63. package/dist/agent/tool-descriptions.js +51 -0
  64. package/dist/agent/tool-descriptions.js.map +1 -0
  65. package/dist/agent/worktree.d.ts +28 -0
  66. package/dist/agent/worktree.d.ts.map +1 -0
  67. package/dist/agent/worktree.js +59 -0
  68. package/dist/agent/worktree.js.map +1 -0
  69. package/dist/api/server.d.ts +30 -0
  70. package/dist/api/server.d.ts.map +1 -0
  71. package/dist/api/server.js +135 -0
  72. package/dist/api/server.js.map +1 -0
  73. package/dist/cli/connection-test.d.ts +14 -0
  74. package/dist/cli/connection-test.d.ts.map +1 -0
  75. package/dist/cli/connection-test.js +82 -0
  76. package/dist/cli/connection-test.js.map +1 -0
  77. package/dist/cli/init.d.ts +2 -0
  78. package/dist/cli/init.d.ts.map +1 -0
  79. package/dist/cli/init.js +287 -0
  80. package/dist/cli/init.js.map +1 -0
  81. package/dist/cli/logs.d.ts +5 -0
  82. package/dist/cli/logs.d.ts.map +1 -0
  83. package/dist/cli/logs.js +32 -0
  84. package/dist/cli/logs.js.map +1 -0
  85. package/dist/cli/project.d.ts +3 -0
  86. package/dist/cli/project.d.ts.map +1 -0
  87. package/dist/cli/project.js +58 -0
  88. package/dist/cli/project.js.map +1 -0
  89. package/dist/cli/start.d.ts +5 -0
  90. package/dist/cli/start.d.ts.map +1 -0
  91. package/dist/cli/start.js +82 -0
  92. package/dist/cli/start.js.map +1 -0
  93. package/dist/cli/status.d.ts +8 -0
  94. package/dist/cli/status.d.ts.map +1 -0
  95. package/dist/cli/status.js +39 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/stop.d.ts +2 -0
  98. package/dist/cli/stop.d.ts.map +1 -0
  99. package/dist/cli/stop.js +28 -0
  100. package/dist/cli/stop.js.map +1 -0
  101. package/dist/config/keychain.d.ts +4 -0
  102. package/dist/config/keychain.d.ts.map +1 -0
  103. package/dist/config/keychain.js +54 -0
  104. package/dist/config/keychain.js.map +1 -0
  105. package/dist/config/schema.d.ts +60 -0
  106. package/dist/config/schema.d.ts.map +1 -0
  107. package/dist/config/schema.js +88 -0
  108. package/dist/config/schema.js.map +1 -0
  109. package/dist/config/store.d.ts +8 -0
  110. package/dist/config/store.d.ts.map +1 -0
  111. package/dist/config/store.js +48 -0
  112. package/dist/config/store.js.map +1 -0
  113. package/dist/index.d.ts +3 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +47 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/messenger/adapter.d.ts +30 -0
  118. package/dist/messenger/adapter.d.ts.map +1 -0
  119. package/dist/messenger/adapter.js +2 -0
  120. package/dist/messenger/adapter.js.map +1 -0
  121. package/dist/messenger/factory.d.ts +4 -0
  122. package/dist/messenger/factory.d.ts.map +1 -0
  123. package/dist/messenger/factory.js +19 -0
  124. package/dist/messenger/factory.js.map +1 -0
  125. package/dist/messenger/slack.d.ts +21 -0
  126. package/dist/messenger/slack.d.ts.map +1 -0
  127. package/dist/messenger/slack.js +127 -0
  128. package/dist/messenger/slack.js.map +1 -0
  129. package/dist/messenger/telegram.d.ts +21 -0
  130. package/dist/messenger/telegram.d.ts.map +1 -0
  131. package/dist/messenger/telegram.js +118 -0
  132. package/dist/messenger/telegram.js.map +1 -0
  133. package/dist/security/audit.d.ts +15 -0
  134. package/dist/security/audit.d.ts.map +1 -0
  135. package/dist/security/audit.js +41 -0
  136. package/dist/security/audit.js.map +1 -0
  137. package/dist/security/auth.d.ts +8 -0
  138. package/dist/security/auth.d.ts.map +1 -0
  139. package/dist/security/auth.js +15 -0
  140. package/dist/security/auth.js.map +1 -0
  141. package/dist/security/prompt-guard.d.ts +11 -0
  142. package/dist/security/prompt-guard.d.ts.map +1 -0
  143. package/dist/security/prompt-guard.js +30 -0
  144. package/dist/security/prompt-guard.js.map +1 -0
  145. package/dist/security/sandbox.d.ts +11 -0
  146. package/dist/security/sandbox.d.ts.map +1 -0
  147. package/dist/security/sandbox.js +76 -0
  148. package/dist/security/sandbox.js.map +1 -0
  149. package/dist/tools/browser.d.ts +61 -0
  150. package/dist/tools/browser.d.ts.map +1 -0
  151. package/dist/tools/browser.js +196 -0
  152. package/dist/tools/browser.js.map +1 -0
  153. package/dist/tools/calendar.d.ts +36 -0
  154. package/dist/tools/calendar.d.ts.map +1 -0
  155. package/dist/tools/calendar.js +146 -0
  156. package/dist/tools/calendar.js.map +1 -0
  157. package/dist/tools/clipboard.d.ts +13 -0
  158. package/dist/tools/clipboard.d.ts.map +1 -0
  159. package/dist/tools/clipboard.js +47 -0
  160. package/dist/tools/clipboard.js.map +1 -0
  161. package/dist/tools/email.d.ts +52 -0
  162. package/dist/tools/email.d.ts.map +1 -0
  163. package/dist/tools/email.js +211 -0
  164. package/dist/tools/email.js.map +1 -0
  165. package/dist/tools/figma-mcp.d.ts +30 -0
  166. package/dist/tools/figma-mcp.d.ts.map +1 -0
  167. package/dist/tools/figma-mcp.js +58 -0
  168. package/dist/tools/figma-mcp.js.map +1 -0
  169. package/dist/tools/figma.d.ts +52 -0
  170. package/dist/tools/figma.d.ts.map +1 -0
  171. package/dist/tools/figma.js +62 -0
  172. package/dist/tools/figma.js.map +1 -0
  173. package/dist/tools/filesystem.d.ts +9 -0
  174. package/dist/tools/filesystem.d.ts.map +1 -0
  175. package/dist/tools/filesystem.js +62 -0
  176. package/dist/tools/filesystem.js.map +1 -0
  177. package/dist/tools/github.d.ts +36 -0
  178. package/dist/tools/github.d.ts.map +1 -0
  179. package/dist/tools/github.js +93 -0
  180. package/dist/tools/github.js.map +1 -0
  181. package/dist/tools/image.d.ts +14 -0
  182. package/dist/tools/image.d.ts.map +1 -0
  183. package/dist/tools/image.js +57 -0
  184. package/dist/tools/image.js.map +1 -0
  185. package/dist/tools/linear.d.ts +41 -0
  186. package/dist/tools/linear.d.ts.map +1 -0
  187. package/dist/tools/linear.js +87 -0
  188. package/dist/tools/linear.js.map +1 -0
  189. package/dist/tools/notification.d.ts +8 -0
  190. package/dist/tools/notification.d.ts.map +1 -0
  191. package/dist/tools/notification.js +49 -0
  192. package/dist/tools/notification.js.map +1 -0
  193. package/dist/tools/notion.d.ts +23 -0
  194. package/dist/tools/notion.d.ts.map +1 -0
  195. package/dist/tools/notion.js +91 -0
  196. package/dist/tools/notion.js.map +1 -0
  197. package/dist/tools/obsidian.d.ts +17 -0
  198. package/dist/tools/obsidian.d.ts.map +1 -0
  199. package/dist/tools/obsidian.js +100 -0
  200. package/dist/tools/obsidian.js.map +1 -0
  201. package/dist/tools/shell.d.ts +10 -0
  202. package/dist/tools/shell.d.ts.map +1 -0
  203. package/dist/tools/shell.js +37 -0
  204. package/dist/tools/shell.js.map +1 -0
  205. package/dist/tools/voice.d.ts +28 -0
  206. package/dist/tools/voice.d.ts.map +1 -0
  207. package/dist/tools/voice.js +88 -0
  208. package/dist/tools/voice.js.map +1 -0
  209. package/dist/tools/vscode.d.ts +42 -0
  210. package/dist/tools/vscode.d.ts.map +1 -0
  211. package/dist/tools/vscode.js +80 -0
  212. package/dist/tools/vscode.js.map +1 -0
  213. package/package.json +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAW/E,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAA0C;gBAElD,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAqB;IAKtD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,MAAM;IAIjB,MAAM,CAAC,aAAa,IAAI,MAAM;YAIhB,aAAa;YA2Bb,aAAa;IAwC3B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,QAAQ;CAIjB"}
@@ -0,0 +1,135 @@
1
+ import http from 'node:http';
2
+ import crypto from 'node:crypto';
3
+ const DEFAULT_PORT = 3847;
4
+ const RATE_LIMIT_WINDOW_MS = 60_000;
5
+ const RATE_LIMIT_MAX = 30;
6
+ export class ApiServer {
7
+ server = null;
8
+ token;
9
+ handler = null;
10
+ port;
11
+ rateLimitMap = new Map();
12
+ constructor(token, port = DEFAULT_PORT) {
13
+ this.token = token;
14
+ this.port = port;
15
+ }
16
+ onCommand(handler) {
17
+ this.handler = handler;
18
+ }
19
+ async start() {
20
+ return new Promise((resolve, reject) => {
21
+ this.server = http.createServer((req, res) => {
22
+ this.handleRequest(req, res).catch(() => {
23
+ this.sendJson(res, 500, { ok: false, error: 'Internal server error' });
24
+ });
25
+ });
26
+ this.server.on('error', reject);
27
+ // Bind to localhost only
28
+ this.server.listen(this.port, '127.0.0.1', () => resolve());
29
+ });
30
+ }
31
+ async stop() {
32
+ return new Promise((resolve) => {
33
+ if (!this.server)
34
+ return resolve();
35
+ this.server.close(() => resolve());
36
+ this.server = null;
37
+ });
38
+ }
39
+ isRunning() {
40
+ return this.server !== null && this.server.listening;
41
+ }
42
+ getPort() {
43
+ return this.port;
44
+ }
45
+ static generateToken() {
46
+ return crypto.randomBytes(32).toString('hex');
47
+ }
48
+ async handleRequest(req, res) {
49
+ // CORS preflight
50
+ if (req.method === 'OPTIONS') {
51
+ res.writeHead(204, {
52
+ 'Access-Control-Allow-Origin': 'http://localhost',
53
+ 'Access-Control-Allow-Methods': 'POST, GET',
54
+ 'Access-Control-Allow-Headers': 'Authorization, Content-Type',
55
+ });
56
+ res.end();
57
+ return;
58
+ }
59
+ // Health check
60
+ if (req.method === 'GET' && req.url === '/health') {
61
+ this.sendJson(res, 200, { ok: true, status: 'running' });
62
+ return;
63
+ }
64
+ // Command endpoint
65
+ if (req.method === 'POST' && req.url === '/api/command') {
66
+ await this.handleCommand(req, res);
67
+ return;
68
+ }
69
+ this.sendJson(res, 404, { ok: false, error: 'Not found' });
70
+ }
71
+ async handleCommand(req, res) {
72
+ // Auth check
73
+ const authHeader = req.headers['authorization'];
74
+ if (!authHeader || authHeader !== `Bearer ${this.token}`) {
75
+ this.sendJson(res, 401, { ok: false, error: 'Unauthorized' });
76
+ return;
77
+ }
78
+ // Rate limiting by remote address
79
+ const ip = req.socket.remoteAddress ?? 'unknown';
80
+ if (this.isRateLimited(ip)) {
81
+ this.sendJson(res, 429, { ok: false, error: 'Rate limit exceeded' });
82
+ return;
83
+ }
84
+ // Parse body
85
+ const body = await this.readBody(req);
86
+ if (!body) {
87
+ this.sendJson(res, 400, { ok: false, error: 'Invalid JSON body' });
88
+ return;
89
+ }
90
+ if (!body.command || typeof body.command !== 'string') {
91
+ this.sendJson(res, 400, { ok: false, error: 'Missing "command" field' });
92
+ return;
93
+ }
94
+ if (!this.handler) {
95
+ this.sendJson(res, 503, { ok: false, error: 'No command handler registered' });
96
+ return;
97
+ }
98
+ const result = await this.handler({
99
+ command: body.command,
100
+ project: typeof body.project === 'string' ? body.project : undefined,
101
+ });
102
+ this.sendJson(res, result.ok ? 200 : 500, result);
103
+ }
104
+ isRateLimited(ip) {
105
+ const now = Date.now();
106
+ const entry = this.rateLimitMap.get(ip);
107
+ if (!entry || now >= entry.resetAt) {
108
+ this.rateLimitMap.set(ip, { count: 1, resetAt: now + RATE_LIMIT_WINDOW_MS });
109
+ return false;
110
+ }
111
+ entry.count++;
112
+ return entry.count > RATE_LIMIT_MAX;
113
+ }
114
+ readBody(req) {
115
+ return new Promise((resolve) => {
116
+ const chunks = [];
117
+ req.on('data', (chunk) => chunks.push(chunk));
118
+ req.on('end', () => {
119
+ try {
120
+ const raw = Buffer.concat(chunks).toString('utf-8');
121
+ resolve(JSON.parse(raw));
122
+ }
123
+ catch {
124
+ resolve(null);
125
+ }
126
+ });
127
+ req.on('error', () => resolve(null));
128
+ });
129
+ }
130
+ sendJson(res, status, data) {
131
+ res.writeHead(status, { 'Content-Type': 'application/json' });
132
+ res.end(JSON.stringify(data));
133
+ }
134
+ }
135
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tests messenger connections during onboarding.
3
+ * Step 1: Verify token validity (auth.test / getMe)
4
+ * Step 2: Send a test message to the user
5
+ */
6
+ export declare function testSlackConnection(botToken: string, userId: string): Promise<{
7
+ ok: boolean;
8
+ error?: string;
9
+ }>;
10
+ export declare function testTelegramConnection(botToken: string, chatId: string): Promise<{
11
+ ok: boolean;
12
+ error?: string;
13
+ }>;
14
+ //# sourceMappingURL=connection-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-test.d.ts","sourceRoot":"","sources":["../../src/cli/connection-test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD1C;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B1C"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Tests messenger connections during onboarding.
3
+ * Step 1: Verify token validity (auth.test / getMe)
4
+ * Step 2: Send a test message to the user
5
+ */
6
+ export async function testSlackConnection(botToken, userId) {
7
+ try {
8
+ // 1. Verify token
9
+ const authRes = await fetch('https://slack.com/api/auth.test', {
10
+ method: 'POST',
11
+ headers: {
12
+ Authorization: `Bearer ${botToken}`,
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ });
16
+ const authData = (await authRes.json());
17
+ if (!authData.ok) {
18
+ return { ok: false, error: `Token invalid: ${authData.error}` };
19
+ }
20
+ // 2. Open DM channel with user
21
+ const convRes = await fetch('https://slack.com/api/conversations.open', {
22
+ method: 'POST',
23
+ headers: {
24
+ Authorization: `Bearer ${botToken}`,
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ body: JSON.stringify({ users: userId }),
28
+ });
29
+ const convData = (await convRes.json());
30
+ if (!convData.ok) {
31
+ return { ok: false, error: `Cannot open DM: ${convData.error}` };
32
+ }
33
+ // 3. Send test message
34
+ const msgRes = await fetch('https://slack.com/api/chat.postMessage', {
35
+ method: 'POST',
36
+ headers: {
37
+ Authorization: `Bearer ${botToken}`,
38
+ 'Content-Type': 'application/json',
39
+ },
40
+ body: JSON.stringify({
41
+ channel: convData.channel.id,
42
+ text: 'Pilot AI connected successfully! Ready to receive commands.',
43
+ }),
44
+ });
45
+ const msgData = (await msgRes.json());
46
+ if (!msgData.ok) {
47
+ return { ok: false, error: `Cannot send message: ${msgData.error}` };
48
+ }
49
+ return { ok: true };
50
+ }
51
+ catch (err) {
52
+ return { ok: false, error: err.message };
53
+ }
54
+ }
55
+ export async function testTelegramConnection(botToken, chatId) {
56
+ try {
57
+ // 1. Verify token
58
+ const meRes = await fetch(`https://api.telegram.org/bot${botToken}/getMe`);
59
+ const meData = (await meRes.json());
60
+ if (!meData.ok) {
61
+ return { ok: false, error: `Token invalid: ${meData.description}` };
62
+ }
63
+ // 2. Send test message
64
+ const msgRes = await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
65
+ method: 'POST',
66
+ headers: { 'Content-Type': 'application/json' },
67
+ body: JSON.stringify({
68
+ chat_id: chatId,
69
+ text: 'Pilot AI connected successfully! Ready to receive commands.',
70
+ }),
71
+ });
72
+ const msgData = (await msgRes.json());
73
+ if (!msgData.ok) {
74
+ return { ok: false, error: `Cannot send message: ${msgData.description}` };
75
+ }
76
+ return { ok: true };
77
+ }
78
+ catch (err) {
79
+ return { ok: false, error: err.message };
80
+ }
81
+ }
82
+ //# sourceMappingURL=connection-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-test.js","sourceRoot":"","sources":["../../src/cli/connection-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAaA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B7C"}
@@ -0,0 +1,287 @@
1
+ import inquirer from 'inquirer';
2
+ import { execFile } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ import { checkClaudeCli } from '../agent/claude.js';
5
+ import { saveConfig, ensurePilotDir } from '../config/store.js';
6
+ import { setSecret } from '../config/keychain.js';
7
+ import { defaultConfig } from '../config/schema.js';
8
+ import { testSlackConnection, testTelegramConnection } from './connection-test.js';
9
+ import { registerFigmaMcp } from '../tools/figma-mcp.js';
10
+ const execFileAsync = promisify(execFile);
11
+ export async function runInit() {
12
+ console.log('\n🚀 Pilot-AI 셋업을 시작합니다.\n');
13
+ await ensurePilotDir();
14
+ // 1. Claude 연결
15
+ const claudeConfig = await setupClaude();
16
+ // 2. 메신저 선택 및 설정
17
+ const messengerConfig = await setupMessenger();
18
+ // 3. 선택적 통합 서비스 설정
19
+ const integrationConfig = await setupIntegrations();
20
+ // 4. Playwright 브라우저 설치
21
+ await installPlaywright();
22
+ // 5. 설정 저장
23
+ const config = {
24
+ ...defaultConfig,
25
+ claude: claudeConfig,
26
+ messenger: messengerConfig,
27
+ ...integrationConfig,
28
+ };
29
+ await saveConfig(config);
30
+ console.log('\n✅ 설정 완료! "npx pilot-ai start"로 에이전트를 시작하세요.\n');
31
+ }
32
+ async function setupClaude() {
33
+ console.log('── Claude 연결 ──\n');
34
+ const cliExists = await checkClaudeCli();
35
+ if (cliExists) {
36
+ console.log('✅ Claude Code CLI가 설치되어 있습니다.\n');
37
+ const { useApi } = await inquirer.prompt([
38
+ {
39
+ type: 'confirm',
40
+ name: 'useApi',
41
+ message: 'API Key 모드를 대신 사용하시겠습니까? (기본: CLI 모드)',
42
+ default: false,
43
+ },
44
+ ]);
45
+ if (!useApi) {
46
+ return { mode: 'cli', cliBinary: 'claude', apiKey: null };
47
+ }
48
+ }
49
+ else {
50
+ console.log('⚠️ Claude Code CLI를 찾을 수 없습니다. API Key 모드로 설정합니다.\n');
51
+ console.log(' CLI 설치: npm install -g @anthropic-ai/claude-code\n');
52
+ }
53
+ const { apiKey } = await inquirer.prompt([
54
+ {
55
+ type: 'password',
56
+ name: 'apiKey',
57
+ message: 'Anthropic API Key를 입력하세요:',
58
+ mask: '*',
59
+ validate: (input) => input.startsWith('sk-') || 'sk-로 시작하는 유효한 API Key를 입력하세요.',
60
+ },
61
+ ]);
62
+ await setSecret('anthropic-api-key', apiKey);
63
+ return { mode: 'api', cliBinary: 'claude', apiKey: '***keychain***' };
64
+ }
65
+ async function setupMessenger() {
66
+ console.log('\n── 메신저 설정 ──\n');
67
+ const { platform } = await inquirer.prompt([
68
+ {
69
+ type: 'list',
70
+ name: 'platform',
71
+ message: '사용할 메신저를 선택하세요:',
72
+ choices: [
73
+ { name: 'Slack', value: 'slack' },
74
+ { name: 'Telegram', value: 'telegram' },
75
+ ],
76
+ },
77
+ ]);
78
+ if (platform === 'slack') {
79
+ return setupSlack();
80
+ }
81
+ return setupTelegram();
82
+ }
83
+ async function setupSlack() {
84
+ console.log('\n📋 Slack App 설정 가이드:');
85
+ console.log(' 1. https://api.slack.com/apps 에서 새 App 생성');
86
+ console.log(' 2. Socket Mode 활성화');
87
+ console.log(' 3. Event Subscriptions → message.im 추가');
88
+ console.log(' 4. OAuth & Permissions → chat:write, im:history 추가');
89
+ console.log(' 5. App을 워크스페이스에 설치\n');
90
+ const answers = await inquirer.prompt([
91
+ {
92
+ type: 'password',
93
+ name: 'botToken',
94
+ message: 'Bot Token (xoxb-...):',
95
+ mask: '*',
96
+ validate: (input) => input.startsWith('xoxb-') || 'xoxb-로 시작하는 토큰을 입력하세요.',
97
+ },
98
+ {
99
+ type: 'password',
100
+ name: 'appToken',
101
+ message: 'App-Level Token (xapp-...):',
102
+ mask: '*',
103
+ validate: (input) => input.startsWith('xapp-') || 'xapp-로 시작하는 토큰을 입력하세요.',
104
+ },
105
+ {
106
+ type: 'password',
107
+ name: 'signingSecret',
108
+ message: 'Signing Secret:',
109
+ mask: '*',
110
+ },
111
+ {
112
+ type: 'input',
113
+ name: 'userId',
114
+ message: '허용할 Slack User ID (본인):',
115
+ validate: (input) => input.startsWith('U') || 'U로 시작하는 User ID를 입력하세요.',
116
+ },
117
+ ]);
118
+ // Connection test
119
+ console.log('\n Testing Slack connection...');
120
+ const slackTest = await testSlackConnection(answers.botToken, answers.userId);
121
+ if (slackTest.ok) {
122
+ console.log(' Connected successfully!\n');
123
+ }
124
+ else {
125
+ console.log(` Warning: Connection test failed (${slackTest.error}). Saving tokens anyway.\n`);
126
+ }
127
+ // Save to Keychain
128
+ await setSecret('slack-bot-token', answers.botToken);
129
+ await setSecret('slack-app-token', answers.appToken);
130
+ await setSecret('slack-signing-secret', answers.signingSecret);
131
+ return {
132
+ platform: 'slack',
133
+ slack: {
134
+ botToken: '***keychain***',
135
+ appToken: '***keychain***',
136
+ signingSecret: '***keychain***',
137
+ },
138
+ };
139
+ }
140
+ async function setupTelegram() {
141
+ console.log('\n📋 Telegram Bot 설정 가이드:');
142
+ console.log(' 1. Telegram에서 @BotFather에게 /newbot 명령');
143
+ console.log(' 2. Bot 이름과 username 설정');
144
+ console.log(' 3. 발급된 Bot Token 복사\n');
145
+ const answers = await inquirer.prompt([
146
+ {
147
+ type: 'password',
148
+ name: 'botToken',
149
+ message: 'Bot Token:',
150
+ mask: '*',
151
+ validate: (input) => /^\d+:/.test(input) || '유효한 Telegram Bot Token을 입력하세요.',
152
+ },
153
+ {
154
+ type: 'input',
155
+ name: 'chatId',
156
+ message: '허용할 Telegram Chat ID (본인):',
157
+ validate: (input) => /^\d+$/.test(input) || '숫자로 된 Chat ID를 입력하세요.',
158
+ },
159
+ ]);
160
+ // Connection test
161
+ console.log('\n Testing Telegram connection...');
162
+ const telegramTest = await testTelegramConnection(answers.botToken, answers.chatId);
163
+ if (telegramTest.ok) {
164
+ console.log(' Connected successfully!\n');
165
+ }
166
+ else {
167
+ console.log(` Warning: Connection test failed (${telegramTest.error}). Saving token anyway.\n`);
168
+ }
169
+ await setSecret('telegram-bot-token', answers.botToken);
170
+ return {
171
+ platform: 'telegram',
172
+ telegram: {
173
+ botToken: '***keychain***',
174
+ },
175
+ };
176
+ }
177
+ async function setupIntegrations() {
178
+ console.log('\n── 통합 서비스 설정 (선택) ──\n');
179
+ const result = {};
180
+ // Notion
181
+ const { setupNotion } = await inquirer.prompt([
182
+ { type: 'confirm', name: 'setupNotion', message: 'Notion Integration을 설정하시겠습니까?', default: false },
183
+ ]);
184
+ if (setupNotion) {
185
+ console.log('\n📋 Notion Integration 가이드:');
186
+ console.log(' 1. https://www.notion.so/my-integrations 에서 새 Integration 생성');
187
+ console.log(' 2. 이름 설정 후 "Submit" 클릭');
188
+ console.log(' 3. Internal Integration Secret 복사');
189
+ console.log(' 4. 연동할 페이지/DB에서 "Connections"로 Integration 추가\n');
190
+ const { notionApiKey } = await inquirer.prompt([
191
+ {
192
+ type: 'password',
193
+ name: 'notionApiKey',
194
+ message: 'Notion API Key (ntn_ or secret_...):',
195
+ mask: '*',
196
+ validate: (input) => input.length > 10 || 'Valid Notion API Key required.',
197
+ },
198
+ ]);
199
+ await setSecret('notion-api-key', notionApiKey);
200
+ result.notion = { apiKey: '***keychain***' };
201
+ console.log(' Notion configured.\n');
202
+ }
203
+ // Obsidian
204
+ const { setupObsidian } = await inquirer.prompt([
205
+ { type: 'confirm', name: 'setupObsidian', message: 'Obsidian vault를 설정하시겠습니까?', default: false },
206
+ ]);
207
+ if (setupObsidian) {
208
+ const { vaultPath } = await inquirer.prompt([
209
+ {
210
+ type: 'input',
211
+ name: 'vaultPath',
212
+ message: 'Obsidian vault 경로 (예: ~/Documents/MyVault):',
213
+ validate: (input) => input.length > 0 || 'Path required.',
214
+ },
215
+ ]);
216
+ result.obsidian = { vaultPath };
217
+ console.log(' Obsidian vault configured.\n');
218
+ }
219
+ // Figma
220
+ const { setupFigma } = await inquirer.prompt([
221
+ { type: 'confirm', name: 'setupFigma', message: 'Figma를 설정하시겠습니까?', default: false },
222
+ ]);
223
+ if (setupFigma) {
224
+ console.log('\n📋 Figma Personal Access Token 가이드:');
225
+ console.log(' 1. Figma > Account Settings > Personal access tokens');
226
+ console.log(' 2. "Generate new token" 클릭 후 복사\n');
227
+ const { figmaToken } = await inquirer.prompt([
228
+ {
229
+ type: 'password',
230
+ name: 'figmaToken',
231
+ message: 'Figma Personal Access Token:',
232
+ mask: '*',
233
+ validate: (input) => input.length > 10 || 'Valid Figma token required.',
234
+ },
235
+ ]);
236
+ await setSecret('figma-personal-access-token', figmaToken);
237
+ await registerFigmaMcp(figmaToken);
238
+ result.figma = { personalAccessToken: '***keychain***' };
239
+ console.log(' Figma configured (MCP server registered).\n');
240
+ }
241
+ // Linear
242
+ const { setupLinear } = await inquirer.prompt([
243
+ { type: 'confirm', name: 'setupLinear', message: 'Linear를 설정하시겠습니까?', default: false },
244
+ ]);
245
+ if (setupLinear) {
246
+ console.log('\n📋 Linear API Key 가이드:');
247
+ console.log(' 1. Linear > Settings > API > Personal API keys');
248
+ console.log(' 2. "Create key" 클릭 후 복사\n');
249
+ const { linearApiKey } = await inquirer.prompt([
250
+ {
251
+ type: 'password',
252
+ name: 'linearApiKey',
253
+ message: 'Linear API Key:',
254
+ mask: '*',
255
+ validate: (input) => input.startsWith('lin_api_') || 'lin_api_로 시작하는 키를 입력하세요.',
256
+ },
257
+ ]);
258
+ await setSecret('linear-api-key', linearApiKey);
259
+ result.linear = { apiKey: '***keychain***' };
260
+ console.log(' Linear configured.\n');
261
+ }
262
+ return result;
263
+ }
264
+ async function installPlaywright() {
265
+ const { install } = await inquirer.prompt([
266
+ {
267
+ type: 'confirm',
268
+ name: 'install',
269
+ message: 'Playwright Chromium 브라우저를 설치하시겠습니까? (브라우저 자동화에 필요)',
270
+ default: true,
271
+ },
272
+ ]);
273
+ if (!install) {
274
+ console.log(' Skipping Playwright install. Run "npx playwright install chromium" later.\n');
275
+ return;
276
+ }
277
+ console.log(' Installing Playwright Chromium...');
278
+ try {
279
+ await execFileAsync('npx', ['playwright', 'install', 'chromium'], { timeout: 300_000 });
280
+ console.log(' Playwright Chromium installed.\n');
281
+ }
282
+ catch (err) {
283
+ const msg = err instanceof Error ? err.message : String(err);
284
+ console.log(` Warning: Playwright install failed (${msg}). Run "npx playwright install chromium" manually.\n`);
285
+ }
286
+ }
287
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function getLogPath(): string;
2
+ export declare function runLogs(options?: {
3
+ follow?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB/E"}
@@ -0,0 +1,32 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { getPilotDir } from '../config/store.js';
5
+ export function getLogPath() {
6
+ return path.join(getPilotDir(), 'logs', 'agent.log');
7
+ }
8
+ export async function runLogs(options = {}) {
9
+ const logPath = getLogPath();
10
+ try {
11
+ await fs.access(logPath);
12
+ }
13
+ catch {
14
+ console.log('로그 파일이 아직 없습니다.');
15
+ return;
16
+ }
17
+ if (options.follow) {
18
+ const child = spawn('tail', ['-f', logPath], { stdio: 'inherit' });
19
+ process.on('SIGINT', () => {
20
+ child.kill();
21
+ process.exit(0);
22
+ });
23
+ }
24
+ else {
25
+ const content = await fs.readFile(logPath, 'utf-8');
26
+ const lines = content.split('\n');
27
+ // Show last 50 lines
28
+ const tail = lines.slice(-50).join('\n');
29
+ console.log(tail);
30
+ }
31
+ }
32
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAgC,EAAE;IAC9D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,qBAAqB;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProjectCommand(): Command;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,oBAAoB,IAAI,OAAO,CAyD9C"}