feishu-doc-publisher
Analysis
This skill appears to do what it claims—publish a chosen Markdown file to Feishu—but it needs Feishu credentials and will upload the selected file’s contents to Feishu.
Findings (7)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
const mdContent = fs.readFileSync(filePath, 'utf-8');
The publisher reads the user-supplied local file before sending Markdown content to Feishu APIs. This is expected for the skill, but the file path determines what data is uploaded.
(cd "$SCRIPT_DIR" && npm install --production --silent 2>&1)
The installer fetches npm dependencies. The package-lock pins dotenv with integrity, which reduces but does not eliminate supply-chain exposure.
TOKEN_RESULT=$(node -e "... JSON.stringify({ app_id: '$APP_ID', app_secret: '$APP_SECRET' }) ...")The installer runs inline Node.js code during setup to test Feishu API connectivity and embeds credential values into that code. This is install-time code execution, though it is disclosed and related to validation.
ln -s "$SCRIPT_DIR" "$INSTALL_TARGET"
The installer persistently registers the skill by symlinking it into the OpenClaw skills directory. This is disclosed installation behavior, not hidden background activity.
Checks whether tool use, credentials, dependencies, identity, account access, or inter-agent boundaries are broader than the stated purpose.
FEISHU_APP_ID, FEISHU_APP_SECRET ... docx:document — 读写新版文档
The skill requires a Feishu app secret and document read/write permission. This authority is coherent with publishing documents, but it is sensitive account-level access.
Checks for exposed credentials, poisoned memory or context, unclear communication boundaries, or sensitive data that could leave the user's control.
const localEnvPath = path.join(process.cwd(), '.env'); if (fs.existsSync(localEnvPath)) { dotenv.config({ path: localEnvPath }); }The script loads persistent project-local .env configuration. This is common and disclosed, but a project .env can affect which Feishu credentials are used.
fetch(`${BASE_URL}/docx/v1/documents/blocks/convert`, ... body: JSON.stringify({ content: markdownContent, content_type: 'markdown' }))The skill sends document content to the Feishu provider API. The provider endpoint is explicit and purpose-aligned, but the content leaves the local machine.
