Codex, Plugin
Llmwiki Lite Codex Plugin
这是与旧 llmwiki-research 架构完全分离的轻量版科研与项目知识助手,同一份源码同时支持 Codex、Claude Code 和 opencode。
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
NETWORK_HOST_FROM_INPUT SECRETS_PATH_CREDENTIAL
Why this grade
- NETWORK_HOST_FROM_INPUT High
A file takes a URL or endpoint as input and has no fixed host list.
plugins/llmwiki-lite/scripts/git_web.py, line 814
def fetch(repo, payload): - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
plugins/llmwiki-lite/scripts/research_sources.py, line 40
*capture.DEFAULT_EXCLUDE_PATTERNS, '*.p12', '*.pfx', 'id_rsa*', 'id_ed25519*',
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
desktop/run_native_acceptance.py, line 76
subprocess.run(["git", "-C", str(source), *command], check=True,
desktop/run_native_acceptance.py, line 87
process = subprocess.Popen([*command, "--port", "0"], cwd=root, creationflags=flags)
desktop/run_native_acceptance.py, line 91
repeated = subprocess.run(command, cwd=root, timeout=8, creationflags=flags)
Show more
desktop/run_native_acceptance.py, line 97
subprocess.run([os.environ.get("NODE", "node"), str(Path(__file__).with_name("native_acceptance.cjs")),
desktop/run_native_acceptance.py, line 107
process = subprocess.Popen(command, cwd=root, creationflags=flags)
desktop/run_native_acceptance.py, line 112
subprocess.run([os.environ.get("NODE", "node"), str(Path(__file__).with_name("native_acceptance.cjs")),
plugins/llmwiki-lite/scripts/git_recovery.py, line 355
shutil.rmtree(recovery_dir, ignore_errors=True)
plugins/llmwiki-lite/scripts/git_service.py, line 307
return subprocess.run([git_exe, '-c', 'diff.autoRefreshIndex=false'] + args, **kwargs)
plugins/llmwiki-lite/scripts/research_sources.py, line 216
proc = subprocess.Popen(argv, shell=False, stdin=subprocess.PIPE if input_data is not None else subprocess.DEVNULL,
Install and update
Concern
dependencies are not pinned.
INSTALL_UNPINNED
requirements.txt, line 6
pypdf>=3.0.0
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
plugins/llmwiki-lite/scripts/git_web.py, line 814
def fetch(repo, payload):
plugins/llmwiki-lite/scripts/git_web.py, line 1009
result = fetch(repo, data)
plugins/llmwiki-lite/scripts/static/code.js, line 90
const response = await fetch(url.href, {
Show more
plugins/llmwiki-lite/scripts/static/document-editor.js, line 7
const response = await fetch(url, data === undefined ? {signal: controller.signal} : {
plugins/llmwiki-lite/scripts/static/knowledge-maintenance.js, line 14
const res = await fetch(url, payload ? {method:'POST', headers:{'Content-Type':'application/json','X-Notebook-Request':'1'},body:JSON.stringify(payload)} : {});
plugins/llmwiki-lite/scripts/static/literature-catalog.js, line 17
const response = await fetch(api + action, {method:'POST', headers:{'Content-Type':'application/json','X-Literature-Request':'1'}, body:JSON.stringify(data)});
plugins/llmwiki-lite/scripts/static/literature-catalog.js, line 38
const response=await fetch(url);
plugins/llmwiki-lite/scripts/static/literature-catalog.js, line 101
try {const response=await fetch(api+'collection');const value=await response.json();if(!response.ok)throw new Error(value.error?.message||'状态不可用');
plugins/llmwiki-lite/scripts/static/progress.js, line 49
const response=await fetch(url,payload===undefined?{cache:'no-store
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
plugins/llmwiki-lite/scripts/knowledge_maintenance.py, line 202
re.search(r"(?i)(^\.env|credential|secret|token|private[-_]key)", p)
plugins/llmwiki-lite/scripts/llmwiki_core.py, line 101
".env",
plugins/llmwiki-lite/scripts/research_sources.py, line 40
*capture.DEFAULT_EXCLUDE_PATTERNS, '*.p12', '*.pfx', 'id_rsa*', 'id_ed25519*',
Show more
plugins/llmwiki-lite/scripts/research_capture.py, line 50
DEFAULT_EXCLUDE_PATTERNS = (".env", ".env.*", "*.pem", "*.key", "**/secrets/**")
.gitignore, line 10
# Local development files
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
plugins/llmwiki-lite/docs/acceptance-hook-closure-2026-09-23.html, line 1
<!doctype html>
plugins/llmwiki-lite/docs/acceptance-hook-closure-2026-09-23.html, line 17
<section><h2>页面证据</h2><p class="sub">点击图片可放大查看自动化测试的原始截图。日期、任务名和项目名均为临时测试数据。</p><div class="shots"><div class="shot"><header>01 · 待审批<span>Agent 已交付,但还没有 Done</span></header><a hre
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit 20051df21ce1. can delete files. dependencies are not pinned. accepts a host from input, with no fixed list in this file. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: 20051df21ce1b7c91f7b9f1baa5e4f29af1dc4b5
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.