github JavaScript analyzed a6ab171

xiaoanbucai/docwarden

github

跑在 GitHub Actions / GitLab CI 上的模块文档守护:源码一变就标失效,没人确认过的绝不冒充结论。零依赖,可直接 uses 引用。

maintainer
xiaoanbucai
licence
MIT
first seen
2026-09-15
last seen
2026-09-16
releases · 30d
1
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit a6ab171 · analyzer v33 · 2d ago

skills & prompt files 2

code evidence vv1.2.0 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 31

filesystem 20

  • fs xiaoanbucai-docwarden-a6ab171/bin/cli.mjs :21 import { readFileSync, existsSync } from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/docs-kit/scripts/docs-update.mjs :42 import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/docs-kit/scripts/lib/freshness.mjs :17 import fs from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/docwarden-mcp.mjs :20 import fs from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/docwarden.mjs :29 import fs from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/lib/knowledge.mjs :19 import fs from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/src/detect.mjs :19 import { readdirSync, readFileSync, existsSync } from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/src/install.mjs :15 } from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/ci-smoke.test.mjs :9 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/freshness-parity.test.mjs :11 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/init-smoke.test.mjs :12 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/mcp.test.mjs :5 import fs from 'node:fs'
show 8 more
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/no-secret-leak.test.mjs :6 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/status-lifecycle.test.mjs :7 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-persist.test.mjs :2 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-retry.test.mjs :4 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-selfcheck.test.mjs :3 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-status.test.mjs :3 import fs from 'node:fs'
  • fs (weak) xiaoanbucai-docwarden-a6ab171/tests/validate-cli.test.mjs :8 import fs from 'node:fs'
  • fs xiaoanbucai-docwarden-a6ab171/tools/check-zero-dep.mjs :15 import { readFileSync, existsSync } from 'node:fs'

shell / exec 9

  • shell xiaoanbucai-docwarden-a6ab171/bin/cli.mjs :20 import { spawn } from 'node:child_process'
  • shell (weak) xiaoanbucai-docwarden-a6ab171/docs-kit/scripts/docs-update.mjs :41 import { execFileSync } from 'node:child_process'
  • shell xiaoanbucai-docwarden-a6ab171/docwarden.mjs :34 import { exec } from 'node:child_process'
  • shell xiaoanbucai-docwarden-a6ab171/src/install.mjs :514 const { execFileSync } = await import('node:child_process')
  • shell (weak) xiaoanbucai-docwarden-a6ab171/tests/ci-smoke.test.mjs :13 import { execFileSync } from 'node:child_process'
  • shell (weak) xiaoanbucai-docwarden-a6ab171/tests/init-smoke.test.mjs :16 import { execFileSync, execFile } from 'node:child_process'
  • shell (weak) xiaoanbucai-docwarden-a6ab171/tests/mcp.test.mjs :8 import { spawn } from 'node:child_process'
  • shell (weak) xiaoanbucai-docwarden-a6ab171/tests/validate-cli.test.mjs :11 import { spawnSync } from 'node:child_process'
  • shell xiaoanbucai-docwarden-a6ab171/tools/run-all-tests.mjs :20 import { spawn, execFile } from 'node:child_process'

network 11

  • net (weak) xiaoanbucai-docwarden-a6ab171/docs-kit/scripts/docs-update.mjs :508 const res = await fetch(url, {
  • net xiaoanbucai-docwarden-a6ab171/docwarden.mjs :28 import http from 'node:http'
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/fake-llm.mjs :3 import http from 'node:http'
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/init-smoke.test.mjs :15 import http from 'node:http'
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/mcp.test.mjs :14 const post = async (p, body) => (await fetch(BASE + p, {
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/no-secret-leak.test.mjs :38 return fetch(url.startsWith('http') ? url : BASE + url, init)
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/status-lifecycle.test.mjs :15 const r = await fetch(BASE + p, {
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-persist.test.mjs :28 return fetch(url.startsWith('http') ? url : BASE + url, init)
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-retry.test.mjs :25 return fetch(url.startsWith('http') ? url : BASE + url, init)
  • net (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-status.test.mjs :23 return fetch(url.startsWith('http') ? url : BASE + url, init)
  • net xiaoanbucai-docwarden-a6ab171/tools/run-all-tests.mjs :21 import net from 'node:net'

secrets 3

  • secrets (weak) xiaoanbucai-docwarden-a6ab171/docs-kit/scripts/docs-update.mjs :488 const key = process.env.LLM_API_KEY
  • secrets xiaoanbucai-docwarden-a6ab171/docwarden.mjs :523 const apiKey = config.apiKey || process.env.LLM_API_KEY || ''
  • secrets xiaoanbucai-docwarden-a6ab171/src/install.mjs :502 if (!process.env.LLM_API_KEY) {

declared dependencies 1

  • jsdom@^26.1.0

obfuscation 1

  • dynamic require()/import() xiaoanbucai-docwarden-a6ab171/tests/init-smoke.test.mjs :92 loaded = (await import(new URL(`file://${path.join(WORK, '.knowledge.mjs').replace(/\\/g, '/')}?t=1`).href)).default

perm:untrusted 1

  • untrusted (weak) xiaoanbucai-docwarden-a6ab171/tests/ui-retry.test.mjs :89 const stat = await fetch('http://127.0.0.1:5402').then((r) => r.json())