@comate/zulu 1.4.1 → 1.4.2
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/comate-engine/assets/skills/code-security/SKILL.md +254 -63
- package/comate-engine/assets/skills/code-security/references/credential_hosting.md +263 -97
- package/comate-engine/assets/skills/code-security/references/framework_detection.md +91 -0
- package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +143 -74
- package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +12 -3
- package/comate-engine/assets/skills/code-security/scripts/credential_open_page.py +3 -3
- package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +1 -1
- package/comate-engine/assets/skills/code-security/scripts/credential_print_url.py +43 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_url.py +22 -2
- package/comate-engine/assets/skills/code-security/scripts/dodo/dodo_session.sh +183 -0
- package/comate-engine/assets/skills/code-security/scripts/ducc/get_claude_session_id.sh +8 -4
- package/comate-engine/assets/skills/code-security/scripts/ducc/open_browser.py +15 -18
- package/comate-engine/assets/skills/code-security/scripts/http_client.py +2 -3
- package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +3 -3
- package/comate-engine/assets/skills/code-security/scripts/report_chat.py +2 -2
- package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +7 -7
- package/comate-engine/assets/skills/code-security/scripts/utils.py +26 -11
- package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
- package/comate-engine/package.json +2 -0
- package/comate-engine/server.js +26 -26
- package/dist/bundle/index.js +3 -3
- package/package.json +1 -1
|
@@ -17,6 +17,7 @@ import os
|
|
|
17
17
|
import subprocess
|
|
18
18
|
import socket
|
|
19
19
|
import sys
|
|
20
|
+
import tempfile
|
|
20
21
|
|
|
21
22
|
# 导入公共 URL 构建模块
|
|
22
23
|
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
|
@@ -42,22 +43,21 @@ def find_kernel_socket() -> str | None:
|
|
|
42
43
|
适用于 DUCC/Comate 两种环境:无论脚本由哪个父进程调用,
|
|
43
44
|
都能找到当前 VSCode 窗口对应的 kernel socket。
|
|
44
45
|
"""
|
|
45
|
-
tmpdir =
|
|
46
|
+
tmpdir = tempfile.gettempdir()
|
|
46
47
|
pid = os.getpid()
|
|
47
48
|
for _ in range(20): # 最多向上追溯 20 层
|
|
48
49
|
pid = get_parent_pid(pid)
|
|
49
50
|
if not pid or pid == 1:
|
|
50
51
|
break
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return sock_path
|
|
52
|
+
sock_path = f"{tmpdir}/comate-kernel-{pid}.sock"
|
|
53
|
+
if os.path.exists(sock_path):
|
|
54
|
+
return sock_path
|
|
55
55
|
return None
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
def open_url(url: str, pid: str = None, title: str = "网页") -> bool:
|
|
59
59
|
"""在当前 DUCC 聊天框所在 VSCode 窗口的内嵌浏览器中打开 URL"""
|
|
60
|
-
tmpdir =
|
|
60
|
+
tmpdir = tempfile.gettempdir()
|
|
61
61
|
|
|
62
62
|
body = json.dumps({
|
|
63
63
|
"action": "executeVirtualEditor",
|
|
@@ -92,22 +92,20 @@ def open_url(url: str, pid: str = None, title: str = "网页") -> bool:
|
|
|
92
92
|
|
|
93
93
|
# 如果指定了 PID,直接使用
|
|
94
94
|
if pid:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return True
|
|
95
|
+
sock_path = f"{tmpdir}/comate-kernel-{pid}.sock"
|
|
96
|
+
if os.path.exists(sock_path) and send_request(sock_path):
|
|
97
|
+
print(f"✅ 已在内嵌浏览器中打开 (PID: {pid})")
|
|
98
|
+
return True
|
|
100
99
|
print(f"❌ 连接失败 (PID: {pid})")
|
|
101
100
|
return False
|
|
102
101
|
|
|
103
102
|
# 优先使用 init_env.sh 在 shell 层检测到的 kernel PID
|
|
104
103
|
env_kernel_pid = os.environ.get("_KERNEL_PID", "").strip()
|
|
105
104
|
if env_kernel_pid:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return True
|
|
105
|
+
sock_path = f"{tmpdir}/comate-kernel-{env_kernel_pid}.sock"
|
|
106
|
+
if os.path.exists(sock_path) and send_request(sock_path):
|
|
107
|
+
print(f"✅ 已在内嵌浏览器中打开 (当前窗口 PID: {env_kernel_pid})")
|
|
108
|
+
return True
|
|
111
109
|
|
|
112
110
|
# 次选:Python 进程树向上查找
|
|
113
111
|
kernel_sock = find_kernel_socket()
|
|
@@ -124,8 +122,7 @@ def open_url(url: str, pid: str = None, title: str = "网页") -> bool:
|
|
|
124
122
|
except Exception:
|
|
125
123
|
return False
|
|
126
124
|
|
|
127
|
-
socket_candidates = set(glob.glob(f"{tmpdir}/comate-kernel-*.sock")
|
|
128
|
-
glob.glob("/tmp/comate-kernel-*.sock"))
|
|
125
|
+
socket_candidates = set(glob.glob(f"{tmpdir}/comate-kernel-*.sock"))
|
|
129
126
|
|
|
130
127
|
active_sockets = []
|
|
131
128
|
for sock_path in socket_candidates:
|
|
@@ -12,6 +12,7 @@ import json
|
|
|
12
12
|
import logging
|
|
13
13
|
import os
|
|
14
14
|
import subprocess
|
|
15
|
+
import tempfile
|
|
15
16
|
|
|
16
17
|
try:
|
|
17
18
|
import ssl
|
|
@@ -26,9 +27,7 @@ except ImportError:
|
|
|
26
27
|
from urllib2 import Request, urlopen, HTTPError, URLError
|
|
27
28
|
|
|
28
29
|
# ---- 统一日志配置 ----
|
|
29
|
-
|
|
30
|
-
_skill_dir = os.path.dirname(_scripts_dir)
|
|
31
|
-
_log_dir = os.path.join(_skill_dir, "logs")
|
|
30
|
+
_log_dir = os.path.join(tempfile.gettempdir(), ".code-security", "logs")
|
|
32
31
|
os.makedirs(_log_dir, exist_ok=True)
|
|
33
32
|
|
|
34
33
|
# 清理超过 7 天的日志文件
|
|
@@ -25,7 +25,7 @@ import os
|
|
|
25
25
|
import sys
|
|
26
26
|
import time
|
|
27
27
|
|
|
28
|
-
import http_client
|
|
28
|
+
import http_client
|
|
29
29
|
import utils
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger("repair")
|
|
@@ -113,7 +113,7 @@ def upload_files_for_repair(root_path, missing_files, username, user_id, chat_id
|
|
|
113
113
|
print("警告: 读取文件失败 {}: {}".format(file_path, e), file=sys.stderr)
|
|
114
114
|
|
|
115
115
|
http_client.put(
|
|
116
|
-
"
|
|
116
|
+
utils.build_url("/api/v1/upload"),
|
|
117
117
|
headers=utils.build_headers(username, user_id, chat_id),
|
|
118
118
|
json_body=payload,
|
|
119
119
|
)
|
|
@@ -131,7 +131,7 @@ def repair_vulnerability(root_path, vulnerability_info, username, user_id, chat_
|
|
|
131
131
|
repair_type = vulnerability_info.get("type", 2)
|
|
132
132
|
file_count = len(vulnerability_info.get("files", []))
|
|
133
133
|
logger.info("repair start: type=%d, files=%d", repair_type, file_count)
|
|
134
|
-
api_url = "
|
|
134
|
+
api_url = utils.build_url("/api/v2/repair_file")
|
|
135
135
|
print("开始修复...", file=sys.stderr)
|
|
136
136
|
|
|
137
137
|
poll_count = 0
|
|
@@ -16,7 +16,7 @@ import logging
|
|
|
16
16
|
import os
|
|
17
17
|
import sys
|
|
18
18
|
|
|
19
|
-
import http_client
|
|
19
|
+
import http_client
|
|
20
20
|
import utils
|
|
21
21
|
|
|
22
22
|
logger = logging.getLogger("report")
|
|
@@ -95,7 +95,7 @@ def report_chat(chat_id, scan_result, git_url, git_branch, ide, query, root_path
|
|
|
95
95
|
headers = utils.build_headers(username, user_id, chat_id)
|
|
96
96
|
logger.info("report_chat: chat_id=%s, vuls_count=%d, git_url=%s, git_branch=%s",
|
|
97
97
|
chat_id, len(vuls), git_url, git_branch)
|
|
98
|
-
return http_client.post("
|
|
98
|
+
return http_client.post(utils.build_url("/api/v1/chats"), headers=headers, json_body=body)
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
def main():
|
|
@@ -97,7 +97,7 @@ def is_ignored(path, gitignore_patterns, root_dir):
|
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
def walk_dir(directory, extensions=None, gitignore_patterns=None):
|
|
100
|
-
# type: (str, list
|
|
100
|
+
# type: (str, list or None, list or None) -> list
|
|
101
101
|
"""递归遍历目录,按扩展名过滤并排除 .gitignore 中的文件。"""
|
|
102
102
|
files = []
|
|
103
103
|
resolved_dir = os.path.realpath(directory)
|
|
@@ -131,7 +131,7 @@ def get_settings(username, user_id):
|
|
|
131
131
|
# type: (str, str) -> dict
|
|
132
132
|
"""获取扫描配置。"""
|
|
133
133
|
return http_client.get(
|
|
134
|
-
"
|
|
134
|
+
utils.build_url("/api/v2/analysis/settings", utils.SCAN_API_HOST),
|
|
135
135
|
headers=utils.build_headers(username, user_id),
|
|
136
136
|
)
|
|
137
137
|
|
|
@@ -140,7 +140,7 @@ def create_bundle(file_hashes, username, user_id):
|
|
|
140
140
|
# type: (dict, str, str) -> tuple
|
|
141
141
|
"""创建扫描 bundle,返回 (bundle_hash, missing_files)。"""
|
|
142
142
|
data = http_client.post(
|
|
143
|
-
"
|
|
143
|
+
utils.build_url("/api/v1/bundle", utils.SCAN_API_HOST),
|
|
144
144
|
headers=utils.build_headers(username, user_id),
|
|
145
145
|
json_body=file_hashes,
|
|
146
146
|
)
|
|
@@ -166,9 +166,9 @@ def upload_files(bundle_hash, root_path, missing_files, file_hashes, username, u
|
|
|
166
166
|
print("警告: 读取文件失败 {}: {}".format(file_path, e), file=sys.stderr)
|
|
167
167
|
|
|
168
168
|
if upload_type == "scan":
|
|
169
|
-
url = "
|
|
169
|
+
url = utils.build_url("/api/v1/bundle/{}".format(bundle_hash), utils.SCAN_API_HOST)
|
|
170
170
|
else:
|
|
171
|
-
url = "
|
|
171
|
+
url = utils.build_url("/api/v1/upload", utils.SCAN_API_HOST)
|
|
172
172
|
|
|
173
173
|
data = http_client.put(url, headers=utils.build_headers(username, user_id), json_body=payload)
|
|
174
174
|
|
|
@@ -276,7 +276,7 @@ def _poll_ai_analysis(scan_info, chat_id, username, user_id, ai_analysis_timeout
|
|
|
276
276
|
time.sleep(poll_interval)
|
|
277
277
|
|
|
278
278
|
result = http_client.post(
|
|
279
|
-
"
|
|
279
|
+
utils.build_url("/api/v2/analysis", utils.SCAN_API_HOST),
|
|
280
280
|
headers=utils.build_headers(username, user_id, chat_id),
|
|
281
281
|
json_body=scan_info,
|
|
282
282
|
)
|
|
@@ -347,7 +347,7 @@ def scan_vulnerability(root_path, chat_id="", username="", user_id="", wait_ai=T
|
|
|
347
347
|
poll_count = 0
|
|
348
348
|
while poll_count < MAX_SCAN_POLLS:
|
|
349
349
|
result = http_client.post(
|
|
350
|
-
"
|
|
350
|
+
utils.build_url("/api/v2/analysis", utils.SCAN_API_HOST), headers=headers, json_body=scan_info
|
|
351
351
|
)
|
|
352
352
|
if result.get("status") != 1:
|
|
353
353
|
break
|
|
@@ -8,13 +8,28 @@ import hashlib
|
|
|
8
8
|
import os
|
|
9
9
|
import shutil
|
|
10
10
|
import subprocess
|
|
11
|
+
import tempfile
|
|
11
12
|
import time
|
|
12
13
|
import uuid
|
|
13
14
|
from typing import Optional
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
|
|
17
|
+
SCAN_API_HOST = "https://comate-sec.baidu-int.com"
|
|
18
|
+
API_HOST = "https://comate-sec.baidu-int.com"
|
|
19
|
+
FE_HOST = "https://comate-sec.baidu-int.com"
|
|
16
20
|
WS_HOST = "wss://comate-sec.baidu-int.com"
|
|
17
21
|
|
|
22
|
+
def build_url(path, api_host=None):
|
|
23
|
+
# type: (str, str) -> str
|
|
24
|
+
"""根据路径构建完整 URL。
|
|
25
|
+
|
|
26
|
+
当 path 以 /api 开头时使用 api_host(默认 API_HOST),否则使用 FE_HOST。
|
|
27
|
+
"""
|
|
28
|
+
if path.startswith("/api"):
|
|
29
|
+
return (api_host or API_HOST) + path
|
|
30
|
+
else:
|
|
31
|
+
return FE_HOST + path
|
|
32
|
+
|
|
18
33
|
# 常见应跳过的大目录(即使 .gitignore 未列出)
|
|
19
34
|
SKIP_DIRS = {".git", ".svn", ".hg", "node_modules", "__pycache__", "vendor", ".idea", ".vscode"}
|
|
20
35
|
|
|
@@ -101,27 +116,26 @@ def get_git_info(root_path):
|
|
|
101
116
|
|
|
102
117
|
def get_output_dir(root_path, output_dir=None):
|
|
103
118
|
# type: (str, Optional[str]) -> str
|
|
104
|
-
"""获取输出目录,默认为
|
|
119
|
+
"""获取输出目录,默认为 <tempdir>/.code-security/<项目名>_<哈希>/ 下的项目隔离子目录。
|
|
105
120
|
|
|
106
121
|
每次调用时自动清理超过 24 小时的过期临时数据。
|
|
107
122
|
"""
|
|
108
|
-
|
|
123
|
+
base_dir = os.path.join(tempfile.gettempdir(), ".code-security")
|
|
109
124
|
project_name = os.path.basename(os.path.realpath(root_path))
|
|
110
125
|
path_hash = hashlib.md5(os.path.realpath(root_path).encode("utf-8")).hexdigest()[:8]
|
|
111
|
-
default_output = os.path.join(
|
|
126
|
+
default_output = os.path.join(base_dir, "{}_{}".format(project_name, path_hash))
|
|
112
127
|
result = os.path.realpath(output_dir) if output_dir else default_output
|
|
113
128
|
|
|
114
129
|
# 清理过期临时数据
|
|
115
|
-
_cleanup_expired_tmp(
|
|
130
|
+
_cleanup_expired_tmp(base_dir)
|
|
116
131
|
|
|
117
132
|
os.makedirs(result, exist_ok=True)
|
|
118
133
|
return result
|
|
119
134
|
|
|
120
135
|
|
|
121
|
-
def _cleanup_expired_tmp(
|
|
136
|
+
def _cleanup_expired_tmp(tmp_dir):
|
|
122
137
|
# type: (str) -> None
|
|
123
|
-
"""
|
|
124
|
-
tmp_dir = os.path.join(skill_dir, ".tmp")
|
|
138
|
+
"""清理临时目录下超过 24 小时的子目录。"""
|
|
125
139
|
if not os.path.isdir(tmp_dir):
|
|
126
140
|
return
|
|
127
141
|
|
|
@@ -143,10 +157,11 @@ def _cleanup_expired_tmp(skill_dir):
|
|
|
143
157
|
|
|
144
158
|
def safe_rmtree(dir_path):
|
|
145
159
|
# type: (str) -> None
|
|
146
|
-
"""安全删除临时目录,校验路径位于
|
|
160
|
+
"""安全删除临时目录,校验路径位于 <tempdir>/.code-security/ 下防止误删。"""
|
|
147
161
|
dir_path = os.path.realpath(dir_path)
|
|
148
|
-
#
|
|
149
|
-
|
|
162
|
+
# 安全校验:确保路径在临时目录的 .code-security 目录下
|
|
163
|
+
tmp_base = os.path.join(tempfile.gettempdir(), ".code-security")
|
|
164
|
+
if not dir_path.startswith(tmp_base + os.sep):
|
|
150
165
|
return
|
|
151
166
|
if not os.path.isdir(dir_path):
|
|
152
167
|
return
|
|
@@ -6,9 +6,9 @@ case `uname` in
|
|
|
6
6
|
esac
|
|
7
7
|
|
|
8
8
|
if [ -z "$NODE_PATH" ]; then
|
|
9
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
9
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/prebuild-install@7.1.3/node_modules/prebuild-install/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/prebuild-install@7.1.3/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules"
|
|
10
10
|
else
|
|
11
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
11
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/prebuild-install@7.1.3/node_modules/prebuild-install/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/prebuild-install@7.1.3/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
12
12
|
fi
|
|
13
13
|
if [ -x "$basedir/node" ]; then
|
|
14
14
|
exec "$basedir/node" "$basedir/../../../../../prebuild-install@7.1.3/node_modules/prebuild-install/bin.js" "$@"
|
|
@@ -6,9 +6,9 @@ case `uname` in
|
|
|
6
6
|
esac
|
|
7
7
|
|
|
8
8
|
if [ -z "$NODE_PATH" ]; then
|
|
9
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
9
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules"
|
|
10
10
|
else
|
|
11
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
11
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
12
12
|
fi
|
|
13
13
|
if [ -x "$basedir/node" ]; then
|
|
14
14
|
exec "$basedir/node" "$basedir/../../../../../node-gyp-build@4.8.4/node_modules/node-gyp-build/bin.js" "$@"
|
package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional
CHANGED
|
@@ -6,9 +6,9 @@ case `uname` in
|
|
|
6
6
|
esac
|
|
7
7
|
|
|
8
8
|
if [ -z "$NODE_PATH" ]; then
|
|
9
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
9
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules"
|
|
10
10
|
else
|
|
11
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
11
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
12
12
|
fi
|
|
13
13
|
if [ -x "$basedir/node" ]; then
|
|
14
14
|
exec "$basedir/node" "$basedir/../../../../../node-gyp-build@4.8.4/node_modules/node-gyp-build/optional.js" "$@"
|
|
@@ -6,9 +6,9 @@ case `uname` in
|
|
|
6
6
|
esac
|
|
7
7
|
|
|
8
8
|
if [ -z "$NODE_PATH" ]; then
|
|
9
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
9
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules"
|
|
10
10
|
else
|
|
11
|
-
export NODE_PATH="/Users/wangshenyu/
|
|
11
|
+
export NODE_PATH="/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules:/Users/wangshenyu/baidu/ide/comate-plugin-host/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
12
12
|
fi
|
|
13
13
|
if [ -x "$basedir/node" ]; then
|
|
14
14
|
exec "$basedir/node" "$basedir/../../../../../node-gyp-build@4.8.4/node_modules/node-gyp-build/build-test.js" "$@"
|
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
"qs": "^6.11.2",
|
|
82
82
|
"reflect-metadata": "^0.1.13",
|
|
83
83
|
"region-vanilla": "^12.0.0",
|
|
84
|
+
"proper-lockfile": "^4.1.2",
|
|
84
85
|
"simple-git": "^3.33.0",
|
|
85
86
|
"sqlite-vec": "0.1.7-alpha.2",
|
|
86
87
|
"sqlite-vec-darwin-arm64": "0.1.7-alpha.2",
|
|
@@ -122,6 +123,7 @@
|
|
|
122
123
|
"@types/js-yaml": "^4.0.9",
|
|
123
124
|
"@types/node": "18.15.3",
|
|
124
125
|
"@types/picomatch": "^4.0.0",
|
|
126
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
125
127
|
"@types/which": "^3.0.4",
|
|
126
128
|
"@types/ws": "^8.18.1",
|
|
127
129
|
"rollup": "^4.9.2",
|