@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
- console.log(`\x1b[32m✅ Đã cấy ghép thành công thư mục .agent (v${pkg.version}) vào Project!\x1b[0m`);
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
- console.log('\x1b[35m👉 Bước tiếp theo: Hãy chọn menu "Build Bộ Não" để quét dự án.\x1b[0m');
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 match = fs.readFileSync(envPath, 'utf-8').match(/IDE_PORT=(\d+)/);
135
- if (match) targetPort = parseInt(match[1]);
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 riêng của dự án (${targetPort}) đang Online!\x1b[0m`);
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 dự án (${targetPort}) Offline. Hãy chạy IDE với port này.\x1b[0m`);
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. Khuyên dùng "ag-kit init" để cấp port.\x1b[0m`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrtrinhvn/ag-kit",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "description": "Antigravity Kit Base Framework - Generic Agentic AI Programming Core",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -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
- # 2. Logic Hợp thể & Mở mới linh hoạt
17
- if nc -z 127.0.0.1 $PORT &>/dev/null; then
18
- echo "✅ [HỢP THỂ]: Đã tìm thấy một IDE đang chạy riêng cho dự án ở cổng $PORT. Đang cắm ngầm Bot vào..."
19
- else
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' trong cửa sổ lệnh."
28
- echo "👉 Hãy tự mở IDE bằng tay cho thư mục này bằng lệnh: cursor --remote-debugging-port=$PORT ."
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
- echo "⏳ Đang đợi IDE kích hoạt cổng CDP..."
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
- # 2. Logic Hợp thể & Mở mới linh hoạt
17
- if nc -z 127.0.0.1 $PORT &>/dev/null; then
18
- echo "✅ [HỢP THỂ]: Đã tìm thấy một IDE đang chạy riêng cho dự án ở cổng $PORT. Đang cắm ngầm Bot vào..."
19
- else
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' trong Terminal này."
28
- echo "👉 Hãy tự mở IDE bằng tay cho thư mục này bằng lệnh: \cursor --remote-debugging-port=$PORT .\ "
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
- echo "⏳ Đang đợi IDE kích hoạt cổng CDP..."
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