// npm 패키지
ai-figure
Generate clean SVG diagrams (flowchart, tree, architecture, sequence) from a JSON config. Auto-layout, zero coordinates, works in browser and Node.js.
버전
4
메인테이너
1
라이선스
MIT
최초 publish
2026-04-19
publisher
atool
tarball
2,631,586 B
AUTO-PUBLISHED·1개 버전 인덱싱됨·최근 publish: 2026-04-28
// publisher 캠페인by atool
이 계정에서 catch된 패키지 9건고립된 catch가 아닙니다. 동일 publisher가 8개의 다른 패키지를 추가로 발행했고, 모두 파이프라인이 catch했습니다 — 일회성이 아닌 조직적 캠페인의 형태. 아래 링크는 각 형제 catch의 분석으로 이동합니다.
// offending code· @0.4.0· no static-pattern hits
llm: benign · 0.85→ 의심 전송지 없음, 원격 실행 형태 없음 — 2 known-vendor host(s).
- @0.4.0··AUTO-PUBLISHED·publisher: atoolheuristic 75/100static flags 0llm benign (0.85) via ollamapublisher-multi-name-burst:5osv-flagged:MAL-2026-4126
→ 의심 전송지 없음, 원격 실행 형태 없음 — 2 known-vendor host(s).
// offending code· no static-pattern hits
--- package.json (entry) --- { "name": "ai-figure", "version": "0.4.0", "description": "Generate clean SVG diagrams (flowchart, tree, architecture, sequence) from a JSON config. Auto-layout, zero coordinates, works in browser and Node.js.", "keywords": [ "flowchart", "svg", "diagram", "dagre", "excalidraw", "sequence-diagram", "architecture-diagram", "tree-diagram" ], "author": "hustcc", "license": "MIT", "type": "module", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.cjs" } }, "files": [ "dist", "assets", "SKILL.md" ], "scripts": { "build": "tsup", "dev": "tsup --watch", "test": "vitest run", "test:watch": "vitest", "typecheck": "tsc --noEmit" }, "dependencies": { "dagre": "^0.8.5" }, "devDependencies": { "@types/dagre": "^0.7.52", "@types/node": "^22.0.0", "tsup": "^8.3.0", "typescript": "^5.6.0", "vitest": "^3.2.4" } } --- index.js (entry) --- var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); var __commonJS = (cb, mod) => function __require2() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) --- bundled output (OSV-MAL flagged — LLM scope expansion) --- --- dist/index.cjs (bundled) --- 'use strict'; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); var __commonJS = (cb, mod) => function __require2() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. __defProp(target, "default", { value: mod, enumerable: true }) , mod )); // node_modules/lodash/_listCacheClear.js var require_listCacheClear = __commonJS({ "node_modules/lodash/_listCacheClear.js"(exports$1, module) { function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; } }); // node_modules/lodash/eq.js var require_eq = __commonJS({ "node_ --- dist/index.d.ts (bundled) --- /** * Node type in the flowchart. * - process: default rectangle * - decision: diamond shape (for conditionals) * - terminal: rounded rectangle (start / end) * - io: parallelogram (input / output) */ type NodeType = 'process' | 'decision' | 'terminal' | 'io'; /** Layout direction of the graph. */ type Direction = 'TB' | 'LR'; /** Light or dark rendering mode. */ type ThemeType = 'light' | 'dark'; /** * Color palette — one of: * - `'default'` — built-in multi-hue palette: process=blue, decision=amber, terminal=green, io=purple * - `'antv'` — AntV G2 categorical palette (cornflower-blue, orange, teal, violet) * - `'drawio'` — draw.io / diagrams.net shape palette (sky-blue, amber, sage, red) * - `'figma'` — Figma / design-tool palette (indigo process, cyan decision, emerald terminal, rose io) * - `'vega'` — Vega / Vega-Lite categorical palette (steel-blue process, orange decision, teal terminal, crimson io) * - `'mono-blue'` — four shades of blue; all node types share the blue hue family * - `'mono-green'` — four shades of green; all node types share the green hue family * - `'mono-purple'` — four shades of purple; all node types share the purple hue family * - `'mono-orange'` — four shades of orange; all node types share the orange hue family * - Custom 4-element hex array `[process, decision, terminal, io]` */ type PaletteType = string | string[]; /** A single node in the flowchart. */ interface FlowNode { /** Unique identifier. */ id: string; /** Text displayed inside the node. */ label: string; /** Visual shape of the node (default: 'process'). */ type?: NodeType; } /** A directed edge connecting two nodes. */ interface FlowEdge { /** ID of the source node. */ from: string; /** ID of the target node. */ to: string; /** Optional label displayed along the edge. */ label?: string; } /** A logical group of nodes rendered with a dashed border. */ interface FlowGroup { /** Unique identifier. */ id: --- dist/index.js (bundled) --- var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); var __commonJS = (cb, mod) => function __require2() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. __defProp(target, "default", { value: mod, enumerable: true }) , mod )); // node_modules/lodash/_listCacheClear.js var require_listCacheClear = __commonJS({ "node_modules/lodash/_listCacheClear.js"(exports$1, module) { function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; } }); // node_modules/lodash/eq.js var require_eq = __commonJS({ "node_modules/lodash/
