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

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit afb20072cb29a7b45d6f36a203648beb0535c710

331GitHub stars
8stars in 7 days
1skill in this repository
0commits in 30 days

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

Oct 25, 2026Nov 5, 2026331

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

oil-icon

When your agent uses it

生成风格统一的图标集合,通过宫格生图、切分和去背景交付透明 PNG。用户需要成套自定义图标、栏目图标或匹配品牌风格的图标时使用;不用于单个简单矢量图标或小尺寸密集功能符号。

What it loads into context

Frontmatter

75 tokens

Always available to the agent

SKILL.md

1,602 tokens

When the skill is activated

Reference documents

9,732 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. API Key 配置入口
  2. Workflow
  3. Built-in styles
  4. Key rules (see `reference/design-rules.md`)

Scripts executed separately

  • scripts/credential-ui/package.json
  • scripts/credential-ui/public/app.js
  • scripts/credential-ui/src/cli.ts
  • scripts/credential-ui/src/config.ts
  • scripts/credential-ui/src/page.ts
  • scripts/credential-ui/src/profile.ts
  • scripts/credential-ui/src/run.ts
  • scripts/credential-ui/src/server.ts
  • scripts/credential-ui/tests/configure.test.ts
  • scripts/credential-ui/tests/credentials.test.ts
  • scripts/credential-ui/tests/multi-key.test.ts
  • scripts/credential-ui/tests/native-smoke.ts
  • scripts/credential-ui/tests/page.test.ts
  • scripts/credential-ui/tests/profile.test.ts
  • scripts/credential-ui/tests/run.test.ts
  • scripts/credential-ui/tests/ui.test.ts
  • scripts/credential-ui/web/app.ts
  • scripts/gen_image.py
  • scripts/setup.sh
  • scripts/slice_icons.py
  • tests/test_profile_business.py

Files

  • .github/workflows/credential-ui.ymlasset601 bytes
  • .gitignoreasset188 bytes
  • LICENSEasset1,064 bytes
  • README.mddoc6,942 bytes
  • SKILL.mdcore6,601 bytes
  • SKILL.mdcore6,601 bytes
  • assets/readme/made-with-beautify.svgasset1,519 bytes
  • assets/readme/readme-hero.pngasset488,260 bytes
  • assets/readme/readme-section-consistency.svgasset1,420 bytes
  • assets/readme/readme-section-start.svgasset1,358 bytes
  • assets/readme/readme-section-styles.svgasset1,298 bytes
  • assets/readme/readme-section-what.svgasset1,359 bytes
  • assets/readme/readme-section-workflow.svgasset1,451 bytes
  • assets/readme/showcase-isometric/01.pngasset154,135 bytes
  • assets/readme/showcase-isometric/02.pngasset171,550 bytes
  • assets/readme/showcase-isometric/03.pngasset89,402 bytes
  • assets/readme/showcase-isometric/04.pngasset166,284 bytes
  • assets/readme/showcase-isometric/05.pngasset161,670 bytes
  • assets/readme/showcase-isometric/06.pngasset151,756 bytes
  • assets/readme/showcase-isometric/07.pngasset126,971 bytes
  • assets/readme/showcase-isometric/08.pngasset145,911 bytes
  • assets/readme/showcase-isometric/09.pngasset148,321 bytes
  • assets/readme/showcase-isometric/10.pngasset166,905 bytes
  • assets/readme/showcase-isometric/11.pngasset141,442 bytes
  • assets/readme/showcase-isometric/12.pngasset192,814 bytes
  • assets/readme/showcase-isometric/13.pngasset134,572 bytes
  • assets/readme/showcase-isometric/14.pngasset159,426 bytes
  • assets/readme/showcase-isometric/15.pngasset154,304 bytes
  • assets/readme/showcase-isometric/16.pngasset164,618 bytes
  • assets/readme/showcase-soft3d/01.pngasset185,612 bytes
  • assets/readme/showcase-soft3d/02.pngasset187,647 bytes
  • assets/readme/showcase-soft3d/03.pngasset99,433 bytes
  • assets/readme/showcase-soft3d/04.pngasset191,102 bytes
  • assets/readme/showcase-soft3d/05.pngasset156,974 bytes
  • assets/readme/showcase-soft3d/06.pngasset158,186 bytes
  • assets/readme/showcase-soft3d/07.pngasset175,632 bytes
  • assets/readme/showcase-soft3d/08.pngasset142,779 bytes
  • assets/readme/showcase-soft3d/09.pngasset171,593 bytes
  • assets/readme/showcase-soft3d/10.pngasset171,487 bytes
  • assets/readme/showcase-soft3d/11.pngasset190,548 bytes
  • assets/readme/showcase-soft3d/12.pngasset206,951 bytes
  • assets/readme/showcase-soft3d/13.pngasset158,898 bytes
  • assets/readme/showcase-soft3d/14.pngasset172,930 bytes
  • assets/readme/showcase-soft3d/15.pngasset161,787 bytes
  • assets/readme/showcase-soft3d/16.pngasset197,032 bytes
  • assets/readme/source/hero.htmlasset4,687 bytes
  • reference/construction.mddoc4,305 bytes
  • reference/design-rules.mddoc5,078 bytes
  • reference/image-providers.mddoc2,923 bytes
  • reference/prompt-template.mddoc3,598 bytes
  • reference/style-adaptation.mddoc2,410 bytes
  • references/api-key-setup.mddoc3,888 bytes
  • scripts/credential-ui/README.mddoc8,173 bytes
  • scripts/credential-ui/component.jsonasset2,237 bytes
  • scripts/credential-ui/manifests/default.jsonasset230 bytes
  • scripts/credential-ui/manifests/profiles.jsonasset147 bytes
  • scripts/credential-ui/package-lock.jsonasset8,679 bytes
  • scripts/credential-ui/package.jsonruns656 bytes
  • scripts/credential-ui/public/app.jsruns6,440 bytes
  • scripts/credential-ui/public/favicon.svgasset315 bytes
  • scripts/credential-ui/public/index.htmlasset1,188 bytes
  • scripts/credential-ui/public/style.cssasset3,155 bytes
  • scripts/credential-ui/src/cli.tsruns6,463 bytes
  • scripts/credential-ui/src/config.tsruns5,876 bytes
  • scripts/credential-ui/src/page.tsruns1,739 bytes
  • scripts/credential-ui/src/profile.tsruns4,768 bytes
  • scripts/credential-ui/src/run.tsruns3,335 bytes
  • scripts/credential-ui/src/server.tsruns11,614 bytes
  • scripts/credential-ui/tests/configure.test.tsruns2,532 bytes
  • scripts/credential-ui/tests/credentials.test.tsruns6,595 bytes
  • scripts/credential-ui/tests/multi-key.test.tsruns9,884 bytes
  • scripts/credential-ui/tests/native-smoke.tsruns4,166 bytes
  • scripts/credential-ui/tests/page.test.tsruns2,053 bytes
  • scripts/credential-ui/tests/profile.test.tsruns4,149 bytes
  • scripts/credential-ui/tests/run.test.tsruns2,799 bytes
  • scripts/credential-ui/tests/ui.test.tsruns5,074 bytes
  • scripts/credential-ui/tsconfig.jsonasset353 bytes
  • scripts/credential-ui/tsconfig.web.jsonasset237 bytes
  • scripts/credential-ui/web/app.tsruns6,438 bytes
  • scripts/gen_image.pyruns1,425 bytes
  • scripts/setup.shruns491 bytes
  • scripts/slice_icons.pyruns5,573 bytes
  • styles/animal-badge.jsonasset1,092 bytes
  • styles/cartoon.jsonasset1,080 bytes
  • styles/colorblock.jsonasset1,072 bytes
  • styles/filled.jsonasset1,076 bytes
  • styles/isometric.jsonasset1,069 bytes
  • styles/linear.jsonasset1,124 bytes
  • styles/realistic.jsonasset1,129 bytes
  • styles/render3d.jsonasset1,129 bytes
  • styles/sticker.jsonasset1,105 bytes
  • tests/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 GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Access to secretsline 101
    [Credential-related source omitted]
  • Access to secretsline 118
    [Credential-related source omitted]
  • Access to secretsline 124
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 3
    import { mkdtemp, readFile, rm } from 'node:fs/promises';

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 38
    runInNewContext(await readFile(new URL('../public/app.js', import.meta.url), 'utf8'), context);

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

tests/test_profile_business.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 18
    [Credential-related source omitted]

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

and 74 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.