@mrtrinhvn/ag-kit 1.4.3 → 1.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.
package/bin/cli.js
CHANGED
|
@@ -32,16 +32,44 @@ program
|
|
|
32
32
|
|
|
33
33
|
program.command('init')
|
|
34
34
|
.description('Cấy ghép Lõi Trí Nhớ (.agent) vào dự án này')
|
|
35
|
-
.action(() => {
|
|
35
|
+
.action(async () => {
|
|
36
36
|
console.log('\x1b[36m🚀 Đang khởi tạo bộ Tủy Não Lập Trình AI (AG-Kit)...\x1b[0m');
|
|
37
37
|
|
|
38
38
|
const srcAgent = path.join(TEMPLATE_DIR, '.agent');
|
|
39
39
|
if (!fs.existsSync(TARGET_AGENT_DIR)) {
|
|
40
40
|
copyRecursiveSync(srcAgent, TARGET_AGENT_DIR);
|
|
41
41
|
fs.writeFileSync(path.join(TARGET_AGENT_DIR, '.version'), pkg.version);
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
['scripts', 'start.sh', 'stop_bot.sh', '.gitignore'].forEach(item => {
|
|
44
|
+
const srcPath = path.join(TEMPLATE_DIR, item);
|
|
45
|
+
const destPath = path.join(process.cwd(), item);
|
|
46
|
+
if (fs.existsSync(srcPath) && !fs.existsSync(destPath)) {
|
|
47
|
+
copyRecursiveSync(srcPath, destPath);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const net = require('net');
|
|
52
|
+
const getPort = (port) => new Promise((resolve) => {
|
|
53
|
+
const s = net.createServer();
|
|
54
|
+
s.listen(port, () => { s.close(() => resolve(port)); });
|
|
55
|
+
s.on('error', () => { resolve(getPort(port + 1)); });
|
|
56
|
+
});
|
|
57
|
+
const bridgePort = await getPort(9656);
|
|
43
58
|
|
|
44
|
-
|
|
59
|
+
const envEx = path.join(TEMPLATE_DIR, '.env.example');
|
|
60
|
+
if (fs.existsSync(envEx) && !fs.existsSync('.env')) {
|
|
61
|
+
let content = fs.readFileSync(envEx, 'utf-8');
|
|
62
|
+
const projectName = path.basename(process.cwd());
|
|
63
|
+
content = content.replace(/PROJECT_NAME=.*/, `PROJECT_NAME=${projectName}`);
|
|
64
|
+
content = content.replace(/BRIDGE_PORT=.*/, `BRIDGE_PORT=${bridgePort}`);
|
|
65
|
+
fs.writeFileSync('.env', content);
|
|
66
|
+
console.log(`\x1b[32m✅ Đã cấp phát .env với BRIDGE_PORT=${bridgePort} độc quyền.\x1b[0m`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
console.log(`\x1b[32m✅ Đã cấy ghép thành công AG-Kit (v${pkg.version}) vào Project!\x1b[0m`);
|
|
70
|
+
|
|
71
|
+
console.log('\x1b[35m👉 Bước 1: Mở .env và điền TELEGRAM_BOT_TOKEN.\x1b[0m');
|
|
72
|
+
console.log('\x1b[35m👉 Bước 2: Chạy "./start.sh" để gọi Bot thức dậy.\x1b[0m');
|
|
45
73
|
} else {
|
|
46
74
|
console.log('\x1b[33m⚠️ Thư mục .agent đã tồn tại.\x1b[0m');
|
|
47
75
|
const vPath = path.join(TARGET_AGENT_DIR, '.version');
|
|
@@ -122,7 +150,7 @@ program.command('memory')
|
|
|
122
150
|
|
|
123
151
|
program.command('gateway')
|
|
124
152
|
.description('Kiểm tra trạng thái Agentic Gateway (IDE, Ollama, Telegram)')
|
|
125
|
-
.action(() => {
|
|
153
|
+
.action(async () => {
|
|
126
154
|
console.log('\x1b[36m🤖 Đang kiểm tra hệ sinh thái Agentic Gateway...\x1b[0m');
|
|
127
155
|
if (!fs.existsSync(TARGET_AGENT_DIR)) {
|
|
128
156
|
console.log('\x1b[31m❌ Chưa cấy ghép .agent.\x1b[0m');
|
|
@@ -130,20 +158,43 @@ program.command('gateway')
|
|
|
130
158
|
}
|
|
131
159
|
const envPath = path.join(process.cwd(), '.env');
|
|
132
160
|
let targetPort = null;
|
|
161
|
+
let bridgePort = null;
|
|
133
162
|
if (fs.existsSync(envPath)) {
|
|
134
|
-
const
|
|
135
|
-
|
|
163
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
164
|
+
const matchIde = content.match(/IDE_PORT=(\d+)/);
|
|
165
|
+
if (matchIde) targetPort = parseInt(matchIde[1]);
|
|
166
|
+
const matchBridge = content.match(/BRIDGE_PORT=(\d+)/);
|
|
167
|
+
if (matchBridge) bridgePort = parseInt(matchBridge[1]);
|
|
136
168
|
}
|
|
137
169
|
|
|
170
|
+
// 1. Kiểm tra lớp IDE (Hub)
|
|
138
171
|
if (targetPort) {
|
|
139
172
|
try {
|
|
140
173
|
execSync(`curl -s --max-time 2 http://127.0.0.1:${targetPort}/json/version`, { stdio: 'ignore' });
|
|
141
|
-
console.log(`\x1b[32m✅ IDE CDP: Cổng
|
|
174
|
+
console.log(`\x1b[32m✅ IDE CDP: Cổng Trạm (Hub ${targetPort}) đang Online!\x1b[0m`);
|
|
142
175
|
} catch (e) {
|
|
143
|
-
console.log(`\x1b[31m❌ IDE CDP: Cổng
|
|
176
|
+
console.log(`\x1b[31m❌ IDE CDP: Cổng Trạm (Hub ${targetPort}) Offline. Chạy ./start.sh để tự gọi.\x1b[0m`);
|
|
144
177
|
}
|
|
145
178
|
} else {
|
|
146
|
-
console.log(`\x1b[33m⚠️ IDE CDP: Không tìm thấy IDE_PORT trong .env
|
|
179
|
+
console.log(`\x1b[33m⚠️ IDE CDP: Không tìm thấy IDE_PORT trong .env.\x1b[0m`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 2. Kiểm tra lớp Bot Nodejs (Bridge)
|
|
183
|
+
if (bridgePort) {
|
|
184
|
+
const net = require('net');
|
|
185
|
+
const checkBridge = () => new Promise((resolve) => {
|
|
186
|
+
const s = new net.Socket();
|
|
187
|
+
s.setTimeout(2000);
|
|
188
|
+
s.on('connect', () => { s.destroy(); resolve(true); });
|
|
189
|
+
s.on('error', () => { resolve(false); });
|
|
190
|
+
s.on('timeout', () => { s.destroy(); resolve(false); });
|
|
191
|
+
s.connect(bridgePort, '127.0.0.1');
|
|
192
|
+
});
|
|
193
|
+
const up = await checkBridge();
|
|
194
|
+
if (up) console.log(`\x1b[32m✅ BRIDGE: Cổng nội bộ Bot (${bridgePort}) đang Online!\x1b[0m`);
|
|
195
|
+
else console.log(`\x1b[31m❌ BRIDGE: Cổng nội bộ Bot (${bridgePort}) đang Offline. Bot chưa nhúng.\x1b[0m`);
|
|
196
|
+
} else {
|
|
197
|
+
console.log(`\x1b[33m⚠️ BRIDGE: Không tìm thấy BRIDGE_PORT trong .env.\x1b[0m`);
|
|
147
198
|
}
|
|
148
199
|
|
|
149
200
|
try {
|
package/package.json
CHANGED
|
@@ -10,25 +10,38 @@ else
|
|
|
10
10
|
fi
|
|
11
11
|
|
|
12
12
|
PORT=${IDE_PORT:-9555}
|
|
13
|
+
PROJ=${PROJECT_NAME:-"UnknownProject"}
|
|
13
14
|
|
|
14
|
-
echo "🔍 Đang kiểm tra IDE tại cổng $PORT..."
|
|
15
|
+
echo "🔍 Đang kiểm tra IDE cho [$PROJ] tại cổng $PORT..."
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
if
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
echo "⚠️ [MỞ MỚI]: Không tìm thấy IDE ở cổng $PORT. Đang tự động phóng một IDE mới chuyên biệt cho dự án này..."
|
|
21
|
-
|
|
22
|
-
if command -v cursor &> /dev/null; then
|
|
17
|
+
open_ide() {
|
|
18
|
+
if command -v antigravity &> /dev/null; then
|
|
19
|
+
antigravity --remote-debugging-port=$PORT . &
|
|
20
|
+
elif command -v cursor &> /dev/null; then
|
|
23
21
|
cursor --remote-debugging-port=$PORT . &
|
|
24
22
|
elif command -v code &> /dev/null; then
|
|
25
23
|
code --remote-debugging-port=$PORT . &
|
|
26
24
|
else
|
|
27
|
-
echo "❌ Lỗi: Không tìm thấy lệnh 'cursor' hoặc 'code'
|
|
28
|
-
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này
|
|
25
|
+
echo "❌ Lỗi: Không tìm thấy lệnh 'antigravity', 'cursor' hoặc 'code'."
|
|
26
|
+
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này."
|
|
29
27
|
fi
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# 2. Logic Hợp thể & Mở mới linh hoạt
|
|
31
|
+
if nc -z 127.0.0.1 $PORT &>/dev/null; then
|
|
32
|
+
# Cổng đã mở, thám thính xem bên trong có dự án của mình không (lọc theo JSON Title/Url)
|
|
33
|
+
if curl -s --max-time 2 http://127.0.0.1:$PORT/json/list | grep -i "\"title\":.*$PROJ" &>/dev/null; then
|
|
34
|
+
echo "✅ [HỢP THỂ]: Cổng $PORT đang mở và Workspace [$PROJ] đang được hiển thị. Trực tiếp cắm ngầm Bot vào màn hình này..."
|
|
35
|
+
else
|
|
36
|
+
echo "⚠️ [GỌI CỬA]: Cổng $PORT có IDE đang chạy, nhưng chưa mở màn hình cho [$PROJ]. Đang ra lệnh mở thêm giao diện cho dự án này..."
|
|
37
|
+
open_ide
|
|
38
|
+
echo "⏳ Đang đợi màn hình phụ tải xong..."
|
|
39
|
+
sleep 4
|
|
40
|
+
fi
|
|
41
|
+
else
|
|
42
|
+
echo "⚠️ [MỞ MỚI TỪ ĐẦU]: Cổng CDP $PORT hoàn toàn trống. Đang phóng cỗ máy IDE chuyên biệt..."
|
|
43
|
+
open_ide
|
|
44
|
+
echo "⏳ Đang đợi rễ CDP bám rễ..."
|
|
32
45
|
sleep 4
|
|
33
46
|
fi
|
|
34
47
|
|
package/template/start.sh
CHANGED
|
@@ -10,25 +10,38 @@ else
|
|
|
10
10
|
fi
|
|
11
11
|
|
|
12
12
|
PORT=${IDE_PORT:-9555}
|
|
13
|
+
PROJ=${PROJECT_NAME:-"UnknownProject"}
|
|
13
14
|
|
|
14
|
-
echo "🔍 Đang kiểm tra IDE tại cổng $PORT..."
|
|
15
|
+
echo "🔍 Đang kiểm tra IDE cho [$PROJ] tại cổng $PORT..."
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
if
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
echo "⚠️ [MỞ MỚI]: Không tìm thấy IDE ở cổng $PORT. Đang tự động phóng một IDE mới chuyên biệt cho dự án này..."
|
|
21
|
-
|
|
22
|
-
if command -v cursor &> /dev/null; then
|
|
17
|
+
open_ide() {
|
|
18
|
+
if command -v antigravity &> /dev/null; then
|
|
19
|
+
antigravity --remote-debugging-port=$PORT . &
|
|
20
|
+
elif command -v cursor &> /dev/null; then
|
|
23
21
|
cursor --remote-debugging-port=$PORT . &
|
|
24
22
|
elif command -v code &> /dev/null; then
|
|
25
23
|
code --remote-debugging-port=$PORT . &
|
|
26
24
|
else
|
|
27
|
-
echo "❌ Lỗi: Không tìm thấy lệnh 'cursor' hoặc 'code'
|
|
28
|
-
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này
|
|
25
|
+
echo "❌ Lỗi: Không tìm thấy lệnh 'antigravity', 'cursor' hoặc 'code'."
|
|
26
|
+
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này."
|
|
29
27
|
fi
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# 2. Logic Hợp thể & Mở mới linh hoạt
|
|
31
|
+
if nc -z 127.0.0.1 $PORT &>/dev/null; then
|
|
32
|
+
# Cổng đã mở, thám thính xem bên trong có dự án của mình không (lọc theo JSON Title/Url)
|
|
33
|
+
if curl -s --max-time 2 http://127.0.0.1:$PORT/json/list | grep -i "\"title\":.*$PROJ" &>/dev/null; then
|
|
34
|
+
echo "✅ [HỢP THỂ]: Cổng $PORT đang mở và Workspace [$PROJ] đang được hiển thị. Trực tiếp cắm ngầm Bot vào màn hình này..."
|
|
35
|
+
else
|
|
36
|
+
echo "⚠️ [GỌI CỬA]: Cổng $PORT có IDE đang chạy, nhưng chưa mở màn hình cho [$PROJ]. Đang ra lệnh mở thêm giao diện cho dự án này..."
|
|
37
|
+
open_ide
|
|
38
|
+
echo "⏳ Đang đợi màn hình phụ tải xong..."
|
|
39
|
+
sleep 4
|
|
40
|
+
fi
|
|
41
|
+
else
|
|
42
|
+
echo "⚠️ [MỞ MỚI TỪ ĐẦU]: Cổng CDP $PORT hoàn toàn trống. Đang phóng cỗ máy IDE chuyên biệt..."
|
|
43
|
+
open_ide
|
|
44
|
+
echo "⏳ Đang đợi rễ CDP bám rễ..."
|
|
32
45
|
sleep 4
|
|
33
46
|
fi
|
|
34
47
|
|