AI-powered Storybook story generator — works with any framework, any design system, any LLM provider
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in southleft/story-ui
- HIGH code analysis flagged dynamic code execution in southleft/story-ui
- HIGH code analysis flagged dynamic code execution in southleft/story-ui
- HIGH code analysis flagged dynamic code execution in southleft/story-ui
- HIGH code analysis flagged dynamic code execution in southleft/story-ui
transport stdio · streamable-http · http · sse counts 8 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
delete-story
-
generate-story
-
get-component-props
-
get-story
-
list-components
-
list-stories
-
test-connection
-
update-story
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit f8b2ba4 · analyzer v33 · 1w ago
skills & prompt files 1
- agent-rules southleft-story-ui-f8b2ba4/CLAUDE.md
danger signals2
- dynamic code execution vm exec southleft-story-ui-f8b2ba4/story-generator/configLoader.ts :182
userConfig = vm.runInNewContext(`(${configObj})`, Object.create(null), { timeout: 1000 }); - dynamic code execution eval() southleft-story-ui-f8b2ba4/templates/StoryUIV2/elementTargeting.ts :476
const componentFrom = eval(`(${componentFromMarkupSrc})`);
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 298
filesystem 103
- fs (weak) southleft-story-ui-f8b2ba4/__tests__/attachments-and-tokens.test.ts :2
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/canvas-scope-and-versions.test.ts :2
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/checker-props.test.ts :14
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/component-shape.test.ts :13
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/deep-import-path-resolves.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/federated-barrel-props.test.ts :21
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/generation-narration.test.ts :20
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/helpers/hostProject.ts :27
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/host-contract.test.ts :20
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/icon-vocabulary.test.ts :8
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/import-isolation.test.ts :2
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/init-nondestructive.test.ts :6
import fs from 'fs';
show 28 more
- fs (weak) southleft-story-ui-f8b2ba4/__tests__/init-noninteractive.test.ts :7
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/init-workspace.test.ts :15
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/install-fidelity.test.ts :8
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/installer-fresh-project.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/integration/editable-props-local-source.test.ts :18
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/integration/generation-pipeline.test.ts :12
import * as fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/integration/helpers/fixtureProject.ts :1
import * as fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/knowledge-cache-fingerprint.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/layout-behaviour.test.ts :18
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/library-source-dependencies.test.ts :8
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/local-component-facts.test.ts :13
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/local-named-imports.test.ts :18
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/local-prop-facts-conformance.test.ts :10
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/manifest-updated-at.test.ts :11
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/prop-conformance.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/prop-doc-extraction.test.ts :15
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/prop-extractor-local-root.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/props-cache-per-package-root.test.ts :17
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/reexport-discovery.test.ts :18
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/relocate-imports.test.ts :2
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/source-facts-jsdoc.test.ts :13
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/spacing-vocabulary.test.ts :12
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/story-artifacts.test.ts :2
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/story-file-name.test.ts :7
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/story-history.test.ts :16
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/storybook-config.test.ts :16
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/storybook-watcher.test.ts :15
import fs from 'fs'; - fs (weak) southleft-story-ui-f8b2ba4/__tests__/styling-facts.test.ts :22
import fs from 'fs';
63 more not shown — this panel samples each group; the count above is the real total.
shell / exec 7
- shell southleft-story-ui-f8b2ba4/bench/resolution.mjs :685
const { spawnSync } = await import('child_process'); - shell southleft-story-ui-f8b2ba4/cli/deploy.ts :1
import { execSync, spawnSync } from 'child_process'; - shell southleft-story-ui-f8b2ba4/cli/index.ts :4
import { spawn } from 'child_process'; - shell southleft-story-ui-f8b2ba4/cli/setup.ts :13
import { execSync } from 'child_process'; - shell southleft-story-ui-f8b2ba4/cli/update.ts :3
import { execSync } from 'child_process'; - shell southleft-story-ui-f8b2ba4/mcp-server/routes/canvasGenerate.ts :20
import { exec } from 'child_process'; - shell southleft-story-ui-f8b2ba4/mcp-server/routes/handoff.ts :21
import { execFile } from 'child_process';
network 34
- net (weak) southleft-story-ui-f8b2ba4/__tests__/component-shape.test.ts :85
class Api { fetch() { return 1; } } - net (weak) southleft-story-ui-f8b2ba4/__tests__/recompile-wait.test.ts :15
import http from 'http'; - net (weak) southleft-story-ui-f8b2ba4/__tests__/workspace-chrome.test.ts :83
expect(cleanNotice('Storybook was unreachable\n at fetch (node:internal)\n at run')).toBe('Storybook was unreachable'); - net southleft-story-ui-f8b2ba4/bench/componentSelection.mjs :372
const res = await fetch(`${MCP}/mcp/generate-story-stream`, { - net southleft-story-ui-f8b2ba4/bench/fidelity.mjs :210
const r = await fetch(`${opts.server}${route}`, { signal: AbortSignal.timeout(120_000) }); - net southleft-story-ui-f8b2ba4/bench/fidelity/screenshot.mjs :36
const res = await fetch(`${base}/index.json?t=${Date.now()}`, { headers: { 'Cache-Control': 'no-cache' }, signal: AbortSignal.timeout(5000) }); - net southleft-story-ui-f8b2ba4/bench/fidelity/sse.mjs :34
res = await fetch(`${server.replace(/\/+$/, '')}/mcp/generate-story-stream`, { - net southleft-story-ui-f8b2ba4/bench/firstAttempt.mjs :118
const res = await fetch(`${server}/mcp/generate-story-stream`, { - net southleft-story-ui-f8b2ba4/bench/resolution.mjs :469
const res = await fetch(`${env.storybook.replace(/\/+$/, '')}/manifests/components.json`, { - net southleft-story-ui-f8b2ba4/bench/smoke.mjs :973
health = await fetch(`http://127.0.0.1:${spec.split(':')[1]}/health`, { signal: AbortSignal.timeout(4000) }).then(r => r.ok).catch(() => false); - net southleft-story-ui-f8b2ba4/cli/check.ts :376
const res = await fetch(`${server}/health`, { signal: AbortSignal.timeout(1500) }); - net southleft-story-ui-f8b2ba4/cli/index.ts :11
import net from 'net';
show 22 more
- net southleft-story-ui-f8b2ba4/cli/setup.ts :12
import net from 'net'; - net southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :9
import fetch from 'node-fetch'; - net southleft-story-ui-f8b2ba4/mcp-server/routes/canvasGenerate.ts :421
{ pattern: /\bfetch\s*\(/g, label: 'fetch()', replacement: '/* [sanitized: fetch] */void(' }, - net southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :27
import fetch from 'node-fetch'; - net southleft-story-ui-f8b2ba4/story-generator/imageProcessor.ts :296
const response = await fetch(url); - net southleft-story-ui-f8b2ba4/story-generator/knowledge/storybookCatalog.ts :75
const res = await fetch(`${base}/index.json`, { signal: controller.signal }); - net southleft-story-ui-f8b2ba4/story-generator/llm-providers/claude-provider.ts :481
const response = await fetch(ANTHROPIC_API_URL, { - net southleft-story-ui-f8b2ba4/story-generator/llm-providers/gemini-provider.ts :353
const response = await fetch(url, { - net southleft-story-ui-f8b2ba4/story-generator/llm-providers/http-utils.ts :51
* fetch() with exponential backoff on 429/5xx and transient network errors. - net southleft-story-ui-f8b2ba4/story-generator/llm-providers/openai-provider.ts :343
const response = await fetch(OPENAI_API_URL, { - net southleft-story-ui-f8b2ba4/story-generator/runtimeValidator.ts :199
const response = await fetch(url, { signal: controller.signal }); - net southleft-story-ui-f8b2ba4/story-generator/storybook-redirect-addon-auto.js :29
const response = await fetch(`http://localhost:${port}/story-ui/redirects.js`, { - net southleft-story-ui-f8b2ba4/story-generator/storybookMcpClient.ts :575
const response = await fetch(url, { - net southleft-story-ui-f8b2ba4/story-generator/storybookOrigin.ts :49
const res = await fetch(`${trim(url)}/index.json`, { signal: controller.signal, cache: 'no-store' } as RequestInit); - net southleft-story-ui-f8b2ba4/story-generator/verify/renderHarness.ts :407
const res = await fetch(`${storybookUrl.replace(/\/+$/, '')}/index.json?t=${Date.now()}`, { - net southleft-story-ui-f8b2ba4/templates/StoryUI/DesignContextPanel.tsx :73
const res = await fetch(api()); - net southleft-story-ui-f8b2ba4/templates/StoryUI/HandoffDialog.tsx :68
const res = await fetch(`${apiBase}/story-ui/handoff`, { - net southleft-story-ui-f8b2ba4/templates/StoryUI/StoryUIPanel.tsx :38
if (!token) return fetch(input, init); - net southleft-story-ui-f8b2ba4/templates/StoryUI/manager.tsx :169
const res = await fetch('index.json'); - net southleft-story-ui-f8b2ba4/templates/StoryUI/voice/VoiceCanvas.tsx :175
const response = await fetch(`${apiBase}/mcp/canvas-generate`, { - net southleft-story-ui-f8b2ba4/templates/StoryUIV2/api.ts :26
if (!token) return fetch(input, init); - net southleft-story-ui-f8b2ba4/templates/StoryUIV2/useGeneration.ts :834
const res = await fetch(`/index.json?t=${Date.now()}`, { cache: 'no-store' });
secrets 2
- secrets (weak) southleft-story-ui-f8b2ba4/__tests__/claude-stream-finish-reason.test.ts :199
process.env.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY || 'test-key'; - secrets southleft-story-ui-f8b2ba4/story-generator/llm-providers/index.ts :212
const claudeKey = process.env.CLAUDE_API_KEY || process.env.ANTHROPIC_API_KEY;
tool registrations 16
- test-connection southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :90
- generate-story southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :98
- list-components southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :116
- list-stories southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :129
- get-story southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :137
- delete-story southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :151
- get-component-props southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :165
- update-story southleft-story-ui-f8b2ba4/mcp-server/mcp-stdio-server.ts :179
- test-connection southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :120
- generate-story southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :128
- list-components southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :146
- list-stories southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :159
show 4 more
- get-story southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :167
- delete-story southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :181
- get-component-props southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :195
- update-story southleft-story-ui-f8b2ba4/mcp-server/routes/mcpRemote.ts :209
install hooks 2
- prepublishOnly southleft-story-ui-f8b2ba4/package.json :52
npm run build - prepare southleft-story-ui-f8b2ba4/package.json :58
test -d .git && husky || true; npm run build
declared dependencies 39
- @modelcontextprotocol/sdk@^1.23.0
- @radix-ui/themes@^3.3.0
- chalk@^5.3.0
- commander@^11.0.0
- cors@^2.8.5
- dotenv@^16.3.1
- express@^4.18.2
- glob@^11.0.3
- http-proxy-middleware@^3.0.0
- inquirer@^9.2.0
- node-fetch@^2.6.7
- react-live@^4.1.8
show 27 more
- typescript@^5.8.3
- @commitlint/cli@^19.6.1
- @commitlint/config-conventional@^19.6.0
- @semantic-release/changelog@^6.0.3
- @semantic-release/commit-analyzer@^13.0.0
- @semantic-release/git@^10.0.1
- @semantic-release/github@^10.3.5
- @semantic-release/npm@^12.0.1
- @semantic-release/release-notes-generator@^14.0.1
- @types/cors@^2.8.17
- @types/express@^4.17.21
- @types/glob@^8.1.0
- @types/inquirer@^9.0.0
- @types/node@^20.4.2
- @types/node-fetch@^2.6.12
- @types/react@^19.2.7
- @types/react-dom@^19.2.3
- commitizen@^4.3.1
- concurrently@^8.2.0
- cz-conventional-changelog@^3.3.0
- esbuild@^0.25.5
- husky@^9.1.7
- semantic-release@^24.2.0
- ts-node@^10.9.2
- vitest@^4.1.0
- @storybook/react@>=8.0.0
- react@>=16.8.0
obfuscation 2
- dynamic require()/import() southleft-story-ui-f8b2ba4/bench/resolution.mjs :373
const { loadUserConfig } = await import(pathToFileURL(`${DIST}/story-generator/configLoader.js`).href); - dynamic require()/import() southleft-story-ui-f8b2ba4/cli/setup.ts :2233
const mod = await import('${registryImport}');