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.
- package/dist/agent/claude.d.ts +45 -0
- package/dist/agent/claude.d.ts.map +1 -0
- package/dist/agent/claude.js +114 -0
- package/dist/agent/claude.js.map +1 -0
- package/dist/agent/core.d.ts +17 -0
- package/dist/agent/core.d.ts.map +1 -0
- package/dist/agent/core.js +129 -0
- package/dist/agent/core.js.map +1 -0
- package/dist/agent/heartbeat.d.ts +51 -0
- package/dist/agent/heartbeat.d.ts.map +1 -0
- package/dist/agent/heartbeat.js +253 -0
- package/dist/agent/heartbeat.js.map +1 -0
- package/dist/agent/memory-commands.d.ts +11 -0
- package/dist/agent/memory-commands.d.ts.map +1 -0
- package/dist/agent/memory-commands.js +55 -0
- package/dist/agent/memory-commands.js.map +1 -0
- package/dist/agent/memory.d.ts +11 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +109 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/multi-agent.d.ts +47 -0
- package/dist/agent/multi-agent.d.ts.map +1 -0
- package/dist/agent/multi-agent.js +117 -0
- package/dist/agent/multi-agent.js.map +1 -0
- package/dist/agent/pipeline.d.ts +27 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +52 -0
- package/dist/agent/pipeline.js.map +1 -0
- package/dist/agent/planner.d.ts +21 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +51 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/preference-detector.d.ts +6 -0
- package/dist/agent/preference-detector.d.ts.map +1 -0
- package/dist/agent/preference-detector.js +50 -0
- package/dist/agent/preference-detector.js.map +1 -0
- package/dist/agent/project-analyzer.d.ts +6 -0
- package/dist/agent/project-analyzer.d.ts.map +1 -0
- package/dist/agent/project-analyzer.js +108 -0
- package/dist/agent/project-analyzer.js.map +1 -0
- package/dist/agent/project.d.ts +28 -0
- package/dist/agent/project.d.ts.map +1 -0
- package/dist/agent/project.js +121 -0
- package/dist/agent/project.js.map +1 -0
- package/dist/agent/queue.d.ts +61 -0
- package/dist/agent/queue.d.ts.map +1 -0
- package/dist/agent/queue.js +167 -0
- package/dist/agent/queue.js.map +1 -0
- package/dist/agent/safety.d.ts +25 -0
- package/dist/agent/safety.d.ts.map +1 -0
- package/dist/agent/safety.js +77 -0
- package/dist/agent/safety.js.map +1 -0
- package/dist/agent/semantic-search.d.ts +34 -0
- package/dist/agent/semantic-search.d.ts.map +1 -0
- package/dist/agent/semantic-search.js +183 -0
- package/dist/agent/semantic-search.js.map +1 -0
- package/dist/agent/skills.d.ts +59 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +161 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/tool-descriptions.d.ts +7 -0
- package/dist/agent/tool-descriptions.d.ts.map +1 -0
- package/dist/agent/tool-descriptions.js +51 -0
- package/dist/agent/tool-descriptions.js.map +1 -0
- package/dist/agent/worktree.d.ts +28 -0
- package/dist/agent/worktree.d.ts.map +1 -0
- package/dist/agent/worktree.js +59 -0
- package/dist/agent/worktree.js.map +1 -0
- package/dist/api/server.d.ts +30 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +135 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli/connection-test.d.ts +14 -0
- package/dist/cli/connection-test.d.ts.map +1 -0
- package/dist/cli/connection-test.js +82 -0
- package/dist/cli/connection-test.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +287 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/logs.d.ts +5 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +32 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/project.d.ts +3 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +58 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/start.d.ts +5 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +82 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +39 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +2 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +28 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/config/keychain.d.ts +4 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +54 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/schema.d.ts +60 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +88 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +8 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +48 -0
- package/dist/config/store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/messenger/adapter.d.ts +30 -0
- package/dist/messenger/adapter.d.ts.map +1 -0
- package/dist/messenger/adapter.js +2 -0
- package/dist/messenger/adapter.js.map +1 -0
- package/dist/messenger/factory.d.ts +4 -0
- package/dist/messenger/factory.d.ts.map +1 -0
- package/dist/messenger/factory.js +19 -0
- package/dist/messenger/factory.js.map +1 -0
- package/dist/messenger/slack.d.ts +21 -0
- package/dist/messenger/slack.d.ts.map +1 -0
- package/dist/messenger/slack.js +127 -0
- package/dist/messenger/slack.js.map +1 -0
- package/dist/messenger/telegram.d.ts +21 -0
- package/dist/messenger/telegram.d.ts.map +1 -0
- package/dist/messenger/telegram.js +118 -0
- package/dist/messenger/telegram.js.map +1 -0
- package/dist/security/audit.d.ts +15 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +41 -0
- package/dist/security/audit.js.map +1 -0
- package/dist/security/auth.d.ts +8 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +15 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/prompt-guard.d.ts +11 -0
- package/dist/security/prompt-guard.d.ts.map +1 -0
- package/dist/security/prompt-guard.js +30 -0
- package/dist/security/prompt-guard.js.map +1 -0
- package/dist/security/sandbox.d.ts +11 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +76 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/tools/browser.d.ts +61 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +196 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +36 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +146 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/clipboard.d.ts +13 -0
- package/dist/tools/clipboard.d.ts.map +1 -0
- package/dist/tools/clipboard.js +47 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/email.d.ts +52 -0
- package/dist/tools/email.d.ts.map +1 -0
- package/dist/tools/email.js +211 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/figma-mcp.d.ts +30 -0
- package/dist/tools/figma-mcp.d.ts.map +1 -0
- package/dist/tools/figma-mcp.js +58 -0
- package/dist/tools/figma-mcp.js.map +1 -0
- package/dist/tools/figma.d.ts +52 -0
- package/dist/tools/figma.d.ts.map +1 -0
- package/dist/tools/figma.js +62 -0
- package/dist/tools/figma.js.map +1 -0
- package/dist/tools/filesystem.d.ts +9 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +62 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/github.d.ts +36 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +93 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/image.d.ts +14 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +57 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/linear.d.ts +41 -0
- package/dist/tools/linear.d.ts.map +1 -0
- package/dist/tools/linear.js +87 -0
- package/dist/tools/linear.js.map +1 -0
- package/dist/tools/notification.d.ts +8 -0
- package/dist/tools/notification.d.ts.map +1 -0
- package/dist/tools/notification.js +49 -0
- package/dist/tools/notification.js.map +1 -0
- package/dist/tools/notion.d.ts +23 -0
- package/dist/tools/notion.d.ts.map +1 -0
- package/dist/tools/notion.js +91 -0
- package/dist/tools/notion.js.map +1 -0
- package/dist/tools/obsidian.d.ts +17 -0
- package/dist/tools/obsidian.d.ts.map +1 -0
- package/dist/tools/obsidian.js +100 -0
- package/dist/tools/obsidian.js.map +1 -0
- package/dist/tools/shell.d.ts +10 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +37 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/voice.d.ts +28 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +88 -0
- package/dist/tools/voice.js.map +1 -0
- package/dist/tools/vscode.d.ts +42 -0
- package/dist/tools/vscode.d.ts.map +1 -0
- package/dist/tools/vscode.js +80 -0
- package/dist/tools/vscode.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAaA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B7C"}
|
package/dist/cli/init.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/cli/logs.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|