Not in the top 1,000 by GitHub stars
oil-oil/oil-icon
AI icon set generator skill for Claude Code & Codex. 帮你生成整套风格统一的图标。
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afb20072cb29 → afb20072cb29
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afb20072cb29
No earlier version was observed for comparison.
Heat
3.7- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- oil-icon
/
How it works
oil-icon
When your agent uses it
生成风格统一的图标集合,通过宫格生图、切分和去背景交付透明 PNG。用户需要成套自定义图标、栏目图标或匹配品牌风格的图标时使用;不用于单个简单矢量图标或小尺寸密集功能符号。
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
1,602 tokensWhen the skill is activated
Reference documents
9,732 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- API Key 配置入口
- Workflow
- Built-in styles
- Key rules (see `reference/design-rules.md`)
Scripts executed separately
scripts/credential-ui/package.jsonscripts/credential-ui/public/app.jsscripts/credential-ui/src/cli.tsscripts/credential-ui/src/config.tsscripts/credential-ui/src/page.tsscripts/credential-ui/src/profile.tsscripts/credential-ui/src/run.tsscripts/credential-ui/src/server.tsscripts/credential-ui/tests/configure.test.tsscripts/credential-ui/tests/credentials.test.tsscripts/credential-ui/tests/multi-key.test.tsscripts/credential-ui/tests/native-smoke.tsscripts/credential-ui/tests/page.test.tsscripts/credential-ui/tests/profile.test.tsscripts/credential-ui/tests/run.test.tsscripts/credential-ui/tests/ui.test.tsscripts/credential-ui/web/app.tsscripts/gen_image.pyscripts/setup.shscripts/slice_icons.pytests/test_profile_business.py
Files
.github/workflows/credential-ui.ymlasset601 bytes.gitignoreasset188 bytesLICENSEasset1,064 bytesREADME.mddoc6,942 bytesSKILL.mdcore6,601 bytesSKILL.mdcore6,601 bytesassets/readme/made-with-beautify.svgasset1,519 bytesassets/readme/readme-hero.pngasset488,260 bytesassets/readme/readme-section-consistency.svgasset1,420 bytesassets/readme/readme-section-start.svgasset1,358 bytesassets/readme/readme-section-styles.svgasset1,298 bytesassets/readme/readme-section-what.svgasset1,359 bytesassets/readme/readme-section-workflow.svgasset1,451 bytesassets/readme/showcase-isometric/01.pngasset154,135 bytesassets/readme/showcase-isometric/02.pngasset171,550 bytesassets/readme/showcase-isometric/03.pngasset89,402 bytesassets/readme/showcase-isometric/04.pngasset166,284 bytesassets/readme/showcase-isometric/05.pngasset161,670 bytesassets/readme/showcase-isometric/06.pngasset151,756 bytesassets/readme/showcase-isometric/07.pngasset126,971 bytesassets/readme/showcase-isometric/08.pngasset145,911 bytesassets/readme/showcase-isometric/09.pngasset148,321 bytesassets/readme/showcase-isometric/10.pngasset166,905 bytesassets/readme/showcase-isometric/11.pngasset141,442 bytesassets/readme/showcase-isometric/12.pngasset192,814 bytesassets/readme/showcase-isometric/13.pngasset134,572 bytesassets/readme/showcase-isometric/14.pngasset159,426 bytesassets/readme/showcase-isometric/15.pngasset154,304 bytesassets/readme/showcase-isometric/16.pngasset164,618 bytesassets/readme/showcase-soft3d/01.pngasset185,612 bytesassets/readme/showcase-soft3d/02.pngasset187,647 bytesassets/readme/showcase-soft3d/03.pngasset99,433 bytesassets/readme/showcase-soft3d/04.pngasset191,102 bytesassets/readme/showcase-soft3d/05.pngasset156,974 bytesassets/readme/showcase-soft3d/06.pngasset158,186 bytesassets/readme/showcase-soft3d/07.pngasset175,632 bytesassets/readme/showcase-soft3d/08.pngasset142,779 bytesassets/readme/showcase-soft3d/09.pngasset171,593 bytesassets/readme/showcase-soft3d/10.pngasset171,487 bytesassets/readme/showcase-soft3d/11.pngasset190,548 bytesassets/readme/showcase-soft3d/12.pngasset206,951 bytesassets/readme/showcase-soft3d/13.pngasset158,898 bytesassets/readme/showcase-soft3d/14.pngasset172,930 bytesassets/readme/showcase-soft3d/15.pngasset161,787 bytesassets/readme/showcase-soft3d/16.pngasset197,032 bytesassets/readme/source/hero.htmlasset4,687 bytesreference/construction.mddoc4,305 bytesreference/design-rules.mddoc5,078 bytesreference/image-providers.mddoc2,923 bytesreference/prompt-template.mddoc3,598 bytesreference/style-adaptation.mddoc2,410 bytesreferences/api-key-setup.mddoc3,888 bytesscripts/credential-ui/README.mddoc8,173 bytesscripts/credential-ui/component.jsonasset2,237 bytesscripts/credential-ui/manifests/default.jsonasset230 bytesscripts/credential-ui/manifests/profiles.jsonasset147 bytesscripts/credential-ui/package-lock.jsonasset8,679 bytesscripts/credential-ui/package.jsonruns656 bytesscripts/credential-ui/public/app.jsruns6,440 bytesscripts/credential-ui/public/favicon.svgasset315 bytesscripts/credential-ui/public/index.htmlasset1,188 bytesscripts/credential-ui/public/style.cssasset3,155 bytesscripts/credential-ui/src/cli.tsruns6,463 bytesscripts/credential-ui/src/config.tsruns5,876 bytesscripts/credential-ui/src/page.tsruns1,739 bytesscripts/credential-ui/src/profile.tsruns4,768 bytesscripts/credential-ui/src/run.tsruns3,335 bytesscripts/credential-ui/src/server.tsruns11,614 bytesscripts/credential-ui/tests/configure.test.tsruns2,532 bytesscripts/credential-ui/tests/credentials.test.tsruns6,595 bytesscripts/credential-ui/tests/multi-key.test.tsruns9,884 bytesscripts/credential-ui/tests/native-smoke.tsruns4,166 bytesscripts/credential-ui/tests/page.test.tsruns2,053 bytesscripts/credential-ui/tests/profile.test.tsruns4,149 bytesscripts/credential-ui/tests/run.test.tsruns2,799 bytesscripts/credential-ui/tests/ui.test.tsruns5,074 bytesscripts/credential-ui/tsconfig.jsonasset353 bytesscripts/credential-ui/tsconfig.web.jsonasset237 bytesscripts/credential-ui/web/app.tsruns6,438 bytesscripts/gen_image.pyruns1,425 bytesscripts/setup.shruns491 bytesscripts/slice_icons.pyruns5,573 bytesstyles/animal-badge.jsonasset1,092 bytesstyles/cartoon.jsonasset1,080 bytesstyles/colorblock.jsonasset1,072 bytesstyles/filled.jsonasset1,076 bytesstyles/isometric.jsonasset1,069 bytesstyles/linear.jsonasset1,124 bytesstyles/realistic.jsonasset1,129 bytesstyles/render3d.jsonasset1,129 bytesstyles/sticker.jsonasset1,105 bytestests/test_profile_business.pyruns1,190 bytes
Read SKILL.md
# oil-icon
Generate a **set** of icons that share one visual style, output as transparent PNGs.
Image generation runs on a flat grey backdrop as a 4×4 sheet — 16 icons in one generation, 有助于统一风格,但仍需逐个检查 — then each cell is sliced out and background-removed.
Agent owns the design decisions (which style, which palette, which metaphors, whether to match a brand); image generation and slicing are mechanical steps.
## API Key 配置入口
需要外部服务凭据时先读[API Key 配置与业务读取](references/api-key-setup.md):复用已有安全入口;本机缺少 Key 时使用随附固定页面,保存后通过业务包装入口读取。内置能力与纯本地流程不要求配置 Key。
## Workflow
View the complete source on GitHubSkills included
- oil-icon
Repository facts
- License
- MIT
- Created
- Jul 5, 2026
- Last pushed
- Sep 10, 2026
- Forks
- 31
- Open issues
- 1
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 1 note
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 4 dangerous shell commandsin 4 files: scripts/credential-ui/tests/configure.test.ts:3 scripts/credential-ui/tests/native-smoke.ts:2 scripts/credential-ui/tests/run.test.ts:3 and 1 more
- 136 network referencesin 17 files: scripts/credential-ui/package-lock.json:21 scripts/credential-ui/tests/credentials.test.ts:67 scripts/credential-ui/tests/multi-key.test.ts:30 and 14 more
- 1 obfuscation signalin 1 file: scripts/gen_image.py:36
- No instruction overrides
- 21 executable scriptsin 21 files: scripts/credential-ui/package.json:1 scripts/credential-ui/public/app.js:1 scripts/credential-ui/src/cli.ts:1 and 18 more
- 21 references to secretsin 10 files: scripts/credential-ui/tests/run.test.ts:17 scripts/credential-ui/README.md:101 scripts/gen_image.py:10 and 7 more
- No requests to vote in Hot
Show all 183 signals by file
README.md
- Network accessline 92
请安装这个 Skill:https://github.com/oil-oil/oil-icon - Network accessline 119
<p align="center"> <a href="https://github.com/oil-oil/beautify-github-readme"><img src="./assets/readme/made-with-beautify.svg" width="300" alt="README made with beautify-github-readme"></a> - Network accessline 120
<a href="https://github.com/oil-oil/beautify-github-readme"><img src="./assets/readme/made-with-beautify.svg" width="300" alt="README made with beautify-github-readme"></a>
assets/readme/made-with-beautify.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="420" height="64" viewBox="0 0 420 64" role="img" aria-labelledby="title desc">
assets/readme/readme-section-consistency.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="138" viewBox="0 0 1200 138" role="img" aria-label="03 为什么整套生成更统一">
assets/readme/readme-section-start.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="138" viewBox="0 0 1200 138" role="img" aria-label="06 怎么使用">
assets/readme/readme-section-styles.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="138" viewBox="0 0 1200 138" role="img" aria-label="05 支持哪些风格">
assets/readme/readme-section-what.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="138" viewBox="0 0 1200 138" role="img" aria-label="02 oil-icon 是什么">
assets/readme/readme-section-workflow.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="138" viewBox="0 0 1200 138" role="img" aria-label="04 一张图,得到 16 张透明 PNG">
reference/image-providers.md
- Access to secretsline 9
[Credential-related source omitted]
references/api-key-setup.md
- Access to secretsline 23
[Credential-related source omitted]
scripts/credential-ui/README.md
scripts/credential-ui/manifests/profiles.json
- Access to secretsline 7
[Credential-related source omitted]
scripts/credential-ui/package-lock.json
- Network accessline 21
"node_modules/@napi-rs/keyring": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-2.0.0.tgz", - Network accessline 22
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-2.0.0.tgz", "integrity": "sha512-TnrIt0nO9U2Ue9E9vJQjso1hqhIYiGrn2Ew1HBsMSqQe4+ceOqPJJwRVsV0/Wy7pqp04/doOLASyIFM3gGwZJw==", - Network accessline 23
"resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-2.0.0.tgz", - Network accessline 29
"funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 30
"type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - Network accessline 31
"url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 48
"node_modules/@napi-rs/keyring-darwin-arm64": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-2.0.0.tgz", - Network accessline 49
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-2.0.0.tgz", "integrity": "sha512-yvIfviiXpsDSsPdyzWWd7STZt7v774biPfMBpWkiK7rwauwWbOmVjUzgiJ11rbhJbWLqXE3CuQMyLgvcbm - Network accessline 50
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-2.0.0.tgz", - Network accessline 64
"node_modules/@napi-rs/keyring-darwin-x64": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-2.0.0.tgz", - Network accessline 65
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-2.0.0.tgz", "integrity": "sha512-XJUONH0c5cg7M9/1Vj3WeIi8TtWYdZlo8Jqho09ga8OWm9cFNxUv7+4QZx5UK/3JSp2qiyhTlresyKdcpwpnRw - Network accessline 66
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-2.0.0.tgz", - Network accessline 80
"node_modules/@napi-rs/keyring-freebsd-x64": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-2.0.0.tgz", - Network accessline 81
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-2.0.0.tgz", "integrity": "sha512-u/M114J9Lp3RqtIZihIqhvreNQ5f8wgLFo9tJFy+bIIO/xEHkMR0LENrfUF8hSY6FTNyS2kSbbkN6yOItBFY - Network accessline 82
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-2.0.0.tgz", - Network accessline 96
"node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-2.0.0.tgz", - Network accessline 97
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-2.0.0.tgz", "integrity": "sha512-CHMv/KTuELo/MsrGUha52KrFGPBuBkeAonnMFUd3nNcxBTSmeJbCAZTuVSXzpessdpb4 - Network accessline 98
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-2.0.0.tgz", - Network accessline 112
"node_modules/@napi-rs/keyring-linux-arm64-gnu": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-2.0.0.tgz", - Network accessline 113
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-2.0.0.tgz", "integrity": "sha512-BeUUPGSnW026yDGT4pKuNXDnwxw0xslwiSK6cuOIsDNLi3UO93rfF/7moqKznrBldgsZr8pl9LkM - Network accessline 114
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-2.0.0.tgz", - Network accessline 128
"node_modules/@napi-rs/keyring-linux-arm64-musl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-2.0.0.tgz", - Network accessline 129
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-2.0.0.tgz", "integrity": "sha512-zj7wZ23Vs7SL4odnGDbWnhZhiyrnEgBe4+8dzKHDi1mTBX1d00FYlGOubkjvx3AeK7mm6G2FyF - Network accessline 130
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-2.0.0.tgz", - Network accessline 144
"node_modules/@napi-rs/keyring-linux-riscv64-gnu": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-2.0.0.tgz", - Network accessline 145
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-2.0.0.tgz", "integrity": "sha512-xk/1SOhuk2yQvXiN+pBhR4njSfquLm1SUKUIJcPIeYV1bHFXbUsYrXdfy4NtynSW0lhs41zW - Network accessline 146
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-2.0.0.tgz", - Network accessline 160
"node_modules/@napi-rs/keyring-linux-x64-gnu": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-2.0.0.tgz", - Network accessline 161
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-2.0.0.tgz", "integrity": "sha512-12Dq6t2TOrQTibcJcfV5bnHbTvMwEz6zSDqQLHMO2x388gGFQBAeEvw7Hmt+R1QavxspTa2ptgI7axom - Network accessline 162
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-2.0.0.tgz", - Network accessline 176
"node_modules/@napi-rs/keyring-linux-x64-musl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-2.0.0.tgz", - Network accessline 177
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-2.0.0.tgz", "integrity": "sha512-7NJZvFUiL1FPCrSIQ1L4IUzN6l/2zoxT3IN6j3rHTuDdIEunJaycrUovDMvPlBNP1Vh3fSYz6Pp7tF - Network accessline 178
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-2.0.0.tgz", - Network accessline 192
"node_modules/@napi-rs/keyring-win32-arm64-msvc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-2.0.0.tgz", - Network accessline 193
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-2.0.0.tgz", "integrity": "sha512-JTktZGXKow0HF/rhaZiQYB8DUS/iSX7S7FvJDoGxPT8mGavKE3w/vadtfKSBNDL4uGef3wu2Ll - Network accessline 194
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-2.0.0.tgz", - Network accessline 208
"node_modules/@napi-rs/keyring-win32-ia32-msvc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-2.0.0.tgz", - Network accessline 209
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-2.0.0.tgz", "integrity": "sha512-AzvIFTqn1hJzCPu0foeYWn+kXruAIrVq3Z2IfJ24WPbIXUdD7+rcj49fqco7b14Z6C1aUfsSTyvr - Network accessline 210
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-2.0.0.tgz", - Network accessline 224
"node_modules/@napi-rs/keyring-win32-x64-msvc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-2.0.0.tgz", - Network accessline 225
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-2.0.0.tgz", "integrity": "sha512-POpEUTV6U+pb69cpuOgtLV4xhcyEWDWq+/9zdiZmNxTL1AenE0MllWrbepS+Hng4M7EarQ5TB3kX69 - Network accessline 226
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-2.0.0.tgz", - Network accessline 240
"node_modules/@types/node": { "version": "22.20.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - Network accessline 241
"version": "22.20.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", - Network accessline 242
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - Network accessline 250
"node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 251
"version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - Network accessline 252
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 264
"node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - Network accessline 265
"version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - Network accessline 266
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
scripts/credential-ui/package.json
- Executable scriptline 1
Executable file
scripts/credential-ui/public/app.js
- Executable scriptline 1
Executable file - Network accessline 11
let response; try { response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store', - Network accessline 12
try { response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store', headers: { 'Content-Type': 'application/json', 'X-Local-Request': '1', ...options.headers }, signal: AbortSignal.timeout(25_0 - Network accessline 13
response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store',
scripts/credential-ui/public/favicon.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><rect width="40" height="40" rx="12" fill="#292929"/><path d="M12 19v-4a8 8 0 0 1 16 0v4" fill="none" stroke="#eeeeee" stroke-width="3"/><rect x="9" y="18" width="22" height="16" r
scripts/credential-ui/src/cli.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/src/config.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/src/page.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/src/profile.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/src/run.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/src/server.ts
- Executable scriptline 1
Executable file - Network accessline 144
const addr = server.address(); if (!addr || typeof addr === 'string') throw new Error('无法启动本机服务。'); origin = `http://127.0.0.1:${addr.port}`; - Network accessline 145
if (!addr || typeof addr === 'string') throw new Error('无法启动本机服务。'); origin = `http://127.0.0.1:${addr.port}`; const expiry = setTimeout(() => { - Network accessline 146
origin = `http://127.0.0.1:${addr.port}`;
scripts/credential-ui/tests/configure.test.ts
scripts/credential-ui/tests/credentials.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 60
[Credential-related source omitted] - Network accessline 67
const app = await startServer({ manifest, backend: m.backend, onComplete: v => emitted.push(v) }); t.after(app.close); assert.equal((await fetch(app.origin + '/api/meta')).status, 401); - Network accessline 68
t.after(app.close); assert.equal((await fetch(app.origin + '/api/meta')).status, 401); const wrongHost = await new Promise<number | undefined>((resolve, reject) => { - Network accessline 69
assert.equal((await fetch(app.origin + '/api/meta')).status, 401); - Network accessline 73
}); assert.equal(wrongHost, 403); const html = await fetch(app.origin); - Network accessline 74
assert.equal(wrongHost, 403); const html = await fetch(app.origin); assert.match(html.headers.get('Content-Security-Policy')!, /frame-ancestors 'none'/); - Network accessline 75
const html = await fetch(app.origin); - Network accessline 77
[Credential-related source omitted] - Network accessline 78
[Credential-related source omitted] - Network accessline 79
const auth = await fetch(app.origin + '/api/session', { method: 'POST', headers, body: '{}' }); - Network accessline 80
assert.equal(auth.status, 200); headers.Cookie = auth.headers.get('set-cookie')!.split(';')[0]; const meta = await (await fetch(app.origin + '/api/meta', { headers })).json(); assert.equal(meta.label, manifest.label); - Network accessline 81
const meta = await (await fetch(app.origin + '/api/meta', { headers })).json(); - Network accessline 83
assert.deepEqual(meta.ui, manifest.ui); const payload = { revision: meta.revision, value: fake }; const post = (extras: Record<string, string>) => fetch(app.origin + '/api/save', { method: 'POST', headers: { ...headers, ...extras }, bod - Network accessline 84
const payload = { revision: meta.revision, value: fake }; const post = (extras: Record<string, string>) => fetch(app.origin + '/api/save', { method: 'POST', headers: { ...headers, ...extras }, body: JSON.stringify(payload) }); assert.eq - Network accessline 85
const post = (extras: Record<string, string>) => fetch(app.origin + '/api/save', { method: 'POST', headers: { ...headers, ...extras }, body: JSON.stringify(payload) }); - Network accessline 86
assert.equal((await post({ Origin: 'https://attacker.example' })).status, 403); - Network accessline 88
const result = await post({}); assert.equal(result.status, 200); const visible = [await result.text(), JSON.stringify(emitted)]; visible.push(await (await fetch(app.origin + '/api/meta', { headers })).text()); - Network accessline 89
const visible = [await result.text(), JSON.stringify(emitted)]; visible.push(await (await fetch(app.origin + '/api/meta', { headers })).text()); const agent = await (await fetch(app.origin + '/agent/status', { headers })).json(); - Network accessline 90
visible.push(await (await fetch(app.origin + '/api/meta', { headers })).text()); - Network accessline 91
const agent = await (await fetch(app.origin + '/agent/status', { headers })).json(); - Network accessline 97
const m = memory(); const app = await startServer({ manifest, backend: m.backend }); t.after(app.close); const headers: Record<string, string> = { Origin: app.origin, 'X-Local-Request': '1', 'Content-Type': 'application/json', Authorizati - Network accessline 98
[Credential-related source omitted] - Network accessline 99
const auth = await fetch(app.origin + '/api/session', { method: 'POST', headers, body: '{}' }); - Network accessline 100
headers.Cookie = auth.headers.get('set-cookie')!.split(';')[0]; assert.equal((await fetch(app.origin + '/api/cancel', { method: 'POST', headers, body: '{}' })).status, 200); assert.equal((await fetch(app.origin + '/api/save', { method: - Network accessline 101
assert.equal((await fetch(app.origin + '/api/cancel', { method: 'POST', headers, body: '{}' })).status, 200); - Network accessline 102
assert.equal((await fetch(app.origin + '/api/save', { method: 'POST', headers, body: '{}' })).status, 409);
scripts/credential-ui/tests/multi-key.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
const jar = new Map<string, string>(); for (const app of [one, two]) { const auth = await fetch(app.origin + '/api/session', { method: 'POST', - Network accessline 31
[Credential-related source omitted] - Network accessline 32
const auth = await fetch(app.origin + '/api/session', { method: 'POST', - Network accessline 40
for (const [app, ref, value] of [[one, a.credential, 'FAKE_FIRST_VALUE'], [two, b.credential, 'FAKE_SECOND_VALUE']] as const) { const headers = { Cookie: cookie, Origin: app.origin, 'X-Local-Request': '1', 'Content-Type': 'application/j - Network accessline 41
const headers = { Cookie: cookie, Origin: app.origin, 'X-Local-Request': '1', 'Content-Type': 'application/json' }; const response = await fetch(app.origin + '/api/meta', { headers }); assert.equal(response.status, 200); const meta - Network accessline 42
const response = await fetch(app.origin + '/api/meta', { headers }); assert.equal(response.status, 200); - Network accessline 43
const meta = await response.json(); const saved = await fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ revision: meta.revision, value }) }); assert.equal(saved.status, 200); - Network accessline 44
const saved = await fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ revision: meta.revision, value }) }); - Network accessline 45
[Credential-related source omitted] - Network accessline 46
[Credential-related source omitted] - Network accessline 48
[Credential-related source omitted] - Network accessline 49
[Credential-related source omitted] - Network accessline 50
[Credential-related source omitted] - Network accessline 62
[Credential-related source omitted] - Network accessline 63
'X-Local-Request': '1', 'Content-Type': 'application/json' }; const auth = await fetch(app.origin + '/api/session', { method: 'POST', headers }); headers.Cookie = auth.headers.get('set-cookie')!.split(';')[0]; - Network accessline 64
const auth = await fetch(app.origin + '/api/session', { method: 'POST', headers }); - Network accessline 65
headers.Cookie = auth.headers.get('set-cookie')!.split(';')[0]; return { meta: async () => (await fetch(app.origin + '/api/meta', { headers })).json(), - Network accessline 66
return { meta: async () => (await fetch(app.origin + '/api/meta', { headers })).json(), save: (entries: object[]) => fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ entries }) }), - Network accessline 67
meta: async () => (await fetch(app.origin + '/api/meta', { headers })).json(), - Network accessline 68
save: (entries: object[]) => fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ entries }) }), - Network accessline 69
agent: async () => (await fetch(app.origin + '/agent/status', { headers })).json(),
scripts/credential-ui/tests/native-smoke.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 2
import { mkdtemp, writeFile, rm } from 'node:fs/promises'; - Network accessline 25
[Credential-related source omitted] - Network accessline 26
[Credential-related source omitted] - Network accessline 27
const session = await fetch(app.origin + '/api/session', { method: 'POST', headers }); - Network accessline 28
headers.Cookie = session.headers.get('set-cookie')!.split(';')[0]; const metadata = await (await fetch(app.origin + '/api/meta', { headers })).json(); entries.forEach(entry => { entry.owned = true; }); - Network accessline 29
const metadata = await (await fetch(app.origin + '/api/meta', { headers })).json(); - Network accessline 30
entries.forEach(entry => { entry.owned = true; }); const saved = await fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ entries: metadata.fields.map((field: { credential: string; revision: string }, in - Network accessline 31
const saved = await fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted]
scripts/credential-ui/tests/page.test.ts
- Executable scriptline 1
Executable file
scripts/credential-ui/tests/profile.test.ts
- Executable scriptline 1
Executable file - Network accessline 23
[Credential-related source omitted] - Network accessline 24
[Credential-related source omitted] - Network accessline 25
const session = await fetch(app.origin + '/api/session', { method: 'POST', headers }); - Network accessline 26
headers.Cookie = session.headers.get('set-cookie')!.split(';')[0]; assert.equal((await fetch(app.origin)).status, 200); const meta = await (await fetch(app.origin + '/api/meta', { headers })).json(); - Network accessline 27
assert.equal((await fetch(app.origin)).status, 200); - Network accessline 28
const meta = await (await fetch(app.origin + '/api/meta', { headers })).json(); - Network accessline 29
const saved = await fetch(app.origin + '/api/save', { method: 'POST', headers, body: JSON.stringify({ entries: meta.fields.map((f: { credential: string; revision: string }, i: number) => ({ credential: f.credential, revision: f.revision, va - Access to secretsline 55
[Credential-related source omitted]
scripts/credential-ui/tests/run.test.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 3
import { mkdtemp, writeFile, rm } from 'node:fs/promises'; - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted]
scripts/credential-ui/tests/ui.test.ts
scripts/credential-ui/web/app.ts
- Executable scriptline 1
Executable file - Network accessline 13
let response: Response; try { response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store', - Network accessline 14
try { response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store', headers: { 'Content-Type': 'application/json', 'X-Local-Request': '1', ...options.headers }, signal: AbortSignal.timeout(25_000) }); - Network accessline 15
response = await fetch(url, { ...options, credentials: 'same-origin', cache: 'no-store',
scripts/gen_image.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 27
body = json.dumps({"model": a.model, "prompt": a.prompt, "size": a.size, "n": 1}).encode() req = urllib.request.Request( - Network accessline 28
req = urllib.request.Request( - Network accessline 29
"https://api.openai.com/v1/images/generations", - Network accessline 31
[Credential-related source omitted] - Network accessline 32
) with urllib.request.urlopen(req, timeout=300) as r: data = json.load(r) - Network accessline 33
with urllib.request.urlopen(req, timeout=300) as r: - Possible obfuscationline 36
f.write(base64.b64decode(data["data"][0]["b64_json"]))
scripts/setup.sh
- Executable scriptline 1
#!/bin/bash
scripts/slice_icons.py
- Executable scriptline 1
#!/usr/bin/env python3
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 1 fact
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/gen_image.py:29High confidence
Signal confidence: 124 facts
- Network access in code of documentationREADME.md:92Low confidence
- Network access in prose of documentationREADME.md:119Low confidence
- Network access in prose of documentationREADME.md:120Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valuereference/image-providers.md:9Low confidence
- Access to secrets in prose of documentationreferences/api-key-setup.md:23Low confidence
- Access to secrets in prose of documentationscripts/credential-ui/README.md:101Low confidence
- Access to secrets in code of documentationscripts/credential-ui/README.md:118Low confidence
- Access to secrets in code of documentationscripts/credential-ui/README.md:124Low confidence
- Executable script in code of a file that runsscripts/credential-ui/package.json:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/public/app.js:1High confidence
- Network access in code of a file that runsscripts/credential-ui/public/app.js:11High confidence
- Network access in code of a file that runsscripts/credential-ui/public/app.js:12High confidence
- Network access in code of a file that runsscripts/credential-ui/public/app.js:13High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/cli.ts:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/config.ts:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/page.ts:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/profile.ts:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/run.ts:1High confidence
- Executable script in code of a file that runsscripts/credential-ui/src/server.ts:1High confidence
- Network access in code of a file that runsscripts/credential-ui/src/server.ts:144High confidence
- Network access in code of a file that runsscripts/credential-ui/src/server.ts:145High confidence
- Network access in code of a file that runsscripts/credential-ui/src/server.ts:146High confidence
- Executable script in code of a testscripts/credential-ui/tests/configure.test.ts:1Low confidence
- Dangerous shell operation in code of a testscripts/credential-ui/tests/configure.test.ts:3Low confidence
- Executable script in code of a testscripts/credential-ui/tests/credentials.test.ts:1Low confidence
- Access to secrets in code of a testscripts/credential-ui/tests/credentials.test.ts:60Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:67Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:68Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:69Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:73Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:74Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:75Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:77Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:78Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:79Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:80Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:81Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:83Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:84Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:85Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:86Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:88Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:89Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:90Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:91Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:97Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:98Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:99Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:100Low confidence
- Network access in code of a testscripts/credential-ui/tests/credentials.test.ts:101Low confidence
and 74 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.