@kaydash9999/banker-plugins 0.17.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +72 -0
- package/README.md +26 -8
- package/codex/manifest.json +3 -1
- package/codex/transform-matrix.md +5 -2
- package/commands/front-qa.md +3 -3
- package/hooks/graceful-pause.mjs +4 -2
- package/hooks/obsidize-hook.mjs +38 -28
- package/hooks/progress-plan.mjs +14 -8
- package/hooks/progress.mjs +174 -47
- package/hooks/register.mjs +14 -7
- package/hooks/update-checkin.mjs +29 -27
- package/package.json +1 -1
- package/skills/3d-intro-build/SKILL.md +1 -1
- package/skills/3d-intro-build/references/assemble.mjs +3 -3
- package/skills/3d-intro-setup/SKILL.md +3 -3
- package/skills/anti-drm/SKILL.md +254 -0
- package/skills/anti-drm/scripts/anti-drm.mjs +643 -0
- package/skills/anti-drm/scripts/instruction-toggle.mjs +733 -0
- package/skills/lineage/SKILL.md +3 -3
- package/skills/lineage/lineage.py +43 -7
- package/skills/omc-patch/SKILL.md +18 -6
- package/skills/omc-patch/scripts/omc-patch.mjs +400 -87
- package/skills/omc-reference/SKILL.md +1 -1
- package/skills/ralph-qa/SKILL.md +19 -19
- package/skills/theme-selection/SKILL.md +165 -0
- package/skills/theme-selection/assets/LICENSE +21 -0
- package/skills/theme-selection/assets/NOTICE.md +30 -0
- package/skills/theme-selection/assets/palettes.json +81 -0
- package/skills/theme-selection/references/contrast.md +138 -0
- package/skills/theme-selection/references/integrate.md +161 -0
- package/skills/theme-selection/scripts/themes.mjs +1067 -0
- package/skills/tone-compact/SKILL.md +8 -4
- package/skills/tone-compact/scripts/instruction-toggle.mjs +733 -0
- package/skills/tone-compact/scripts/tone-compact.mjs +48 -397
- package/skills/ultra-chain/SKILL.md +7 -6
- package/skills/update-banker/SKILL.md +1 -1
|
@@ -200,7 +200,7 @@ OMX 는 OMC 5 와 달리 `ultraqa`·`ultrawork`·`swarm`·`pipeline` 을 아직
|
|
|
200
200
|
- **외부 LLM**: `$ask`(로컬 Claude/Gemini CLI 자문).
|
|
201
201
|
- **MCP**: `codex mcp add <NAME> (--url <URL> | -- <COMMAND>...)`.
|
|
202
202
|
- **`/copy` 등 슬래시 명령은 Codex TUI 내장**(컴파일 바이너리 — `~/.codex/skills`·`prompts`·`--help` 목록엔 안 뜸).
|
|
203
|
-
- ⚠️ `~/.codex/AGENTS.md` 본문은 `omx setup/doctor` 가 재생성 → **직접 쓰지 말 것**(조각 소실). `omx setup --merge-agents` 로 다시 만들 때 남는 것은 `<!-- USER:OMX:POLICY:START -->` … `<!-- USER:OMX:POLICY:END -->` 로 감싼 블록뿐이고(banker `tone-compact`
|
|
203
|
+
- ⚠️ `~/.codex/AGENTS.md` 본문은 `omx setup/doctor` 가 재생성 → **직접 쓰지 말 것**(조각 소실). `omx setup --merge-agents` 로 다시 만들 때 남는 것은 `<!-- USER:OMX:POLICY:START -->` … `<!-- USER:OMX:POLICY:END -->` 로 감싼 블록뿐이고(banker `tone-compact`, `anti-drm` 이 이 방식), `--force` 나 덮어쓰기 확인으로 새로 쓰면 그 블록도 사라진다(백업은 `~/.omx/backups/setup/`). 비대화형 `omx setup` 은 기존 AGENTS.md 덮어쓰기를 건너뛴다.
|
|
204
204
|
|
|
205
205
|
### OMC ↔ OMX 대응
|
|
206
206
|
OMC(Claude) ↔ OMX(Codex) 는 대체로 대칭이다: `claude mcp`↔`codex mcp`, `~/.claude`↔`~/.codex`,
|
package/skills/ralph-qa/SKILL.md
CHANGED
|
@@ -125,11 +125,11 @@ node "<이 스킬 디렉터리 절대경로>/references/verifier-probe.mjs" --ru
|
|
|
125
125
|
- 인덱스 경로는 `rev-parse --git-path index` 로 얻고(셸의 `GIT_INDEX_FILE` 도 따른다), 상대 경로면 앞에 `<저장소>/` 를 붙인다. `--path-format` 은 쓰지 않는다. git 2.31 미만은 이 옵션을 모르는 채 글자 그대로 찍고 성공으로 끝난다.
|
|
126
126
|
- 인덱스 파일이 없을 때 빈 인덱스로 시작하는 것은 커밋이 없는 저장소뿐이다. 커밋이 있으면 사슬이 멈춘다. 커밋이 있는 저장소에서는 경로를 잘못 얻어도 사본 없이 진행하지 않는다.
|
|
127
127
|
- `<기준>` 은 커밋하지 않은 작업이면 `HEAD`, 이미 커밋한 작업이면 작업 전 커밋, 커밋이 없는 저장소면 빈 트리(`git -C '<저장소>' hash-object -t tree /dev/null`)다. `-C` 가 없으면 저장소 밖에서 SHA-1 빈 트리가 나와 SHA-256 저장소에서 사슬이 멈춘다.
|
|
128
|
-
- 새 파일은 변경에 속한 것만 올린다. 먼저 `git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard` 로 추적하지 않는 새 파일을 모두 본다(`status --short` 는 새 폴더를 한 줄로 접는다). 그중 변경에 속한 파일만 파일 도구로 `$d/new-files.
|
|
128
|
+
- 새 파일은 변경에 속한 것만 올린다. 먼저 `git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard` 로 추적하지 않는 새 파일을 모두 본다(`status --short` 는 새 폴더를 한 줄로 접는다). 그중 변경에 속한 파일만 파일 도구로 `$d/new-files.md` 에 저장소 루트 기준 경로로 한 줄에 하나씩 쓴다(없으면 빈 파일).
|
|
129
129
|
- 경로는 글자 그대로 읽는다(`--literal-pathspecs`). 무시되는 파일을 적으면 `add` 가 거부해 사슬이 멈춘다.
|
|
130
130
|
- 한 줄에 파일 하나다. 폴더 줄이나 `.` 은 그 아래 새 파일을 모두 올린다. 그래서 `add -N --dry-run` 이 올릴 파일 가운데 목록에 없는 것이 있으면 그 경로를 찍고 사슬이 멈춘다. 폴더와 그 안 파일을 함께 적은 목록도 같다.
|
|
131
|
-
- 보내지 않은 새 파일은 `$d/unsent.
|
|
132
|
-
- 하위 저장소(`unsent.
|
|
131
|
+
- 보내지 않은 새 파일은 `$d/unsent.md` 에 남는다. 그 수를 `외부 전송(선언)` 줄에 적는다.
|
|
132
|
+
- 하위 저장소(`unsent.md` 에서 `/` 로 끝나는 줄) 안의 파일은 목록에 적어도 실리지 않는다. 필요하면 원문 부분으로 붙인다. 하위 저장소와 서브모듈은 사용자 설정과 관계없이 커밋 줄(`Subproject commit`)만 실린다. 목록이 비면 stderr 에 `Nothing specified, nothing added.` 가 찍혀도 정상이다.
|
|
133
133
|
- `--pathspec-from-file` 은 git 2.25 이상이 필요하다. 그보다 옛 git 은 이 옵션을 몰라 사슬이 멈춘다.
|
|
134
134
|
- 다 쓴 뒤 그 id 의 표지가 두 줄(여는 표지와 닫는 표지)뿐인지 센다. 더 있으면 id 를 바꿔 다시 쓴다.
|
|
135
135
|
- diff 가 비거나 git 이 실패하면 사슬이 멈춰 닫는 표지가 붙지 않는다. 2 가 찍히지 않으면 보내지 않고 stderr 의 사유를 본다.
|
|
@@ -146,7 +146,7 @@ node "<이 스킬 디렉터리 절대경로>/references/verifier-probe.mjs" --ru
|
|
|
146
146
|
- 0건이면 크기를 본다: `wc -c < "$d/prompt.md"`(PowerShell 은 `(Get-Item -LiteralPath "$d\prompt.md").Length`). 512 KiB(524288 바이트)를 넘으면 보내기 전에 사용자에게 묻는다. 물을 수 없는 실행이면 보내지 않고 그 좌석은 `cli-call-failed` 다. 사용자가 보내지 않기로 하면 `model-declined` 다.
|
|
147
147
|
4. 플래그로 고른 좌석마다 `$d/<좌석>/prompt.md` 사본을 만들고 아래 명령으로 보낸다. 좌석은 서브셸에서 자기 폴더로 들어가 띄운다(Claude Code 의 Bash 도구는 `cd` 가 다음 호출까지 남는다).
|
|
148
148
|
- gemini 좌석은 같은 서브셸에서 `gemini-seat.mjs check` 가 먼저 확인한다. 정책 파일이 배포본과 같은지, 홈 밖 상위 폴더에 `.gemini/.env` 나 `.env` 가 없는지 본다. 실패하면 보내지 않는다(`cli-call-failed`). 정책 파일 경로는 그 출력을 쓰고, 출력이 비었거나 그 파일이 없어도 보내지 않는다.
|
|
149
|
-
- gemini 좌석은 `TMPDIR`, `TEMP`, `TMP` 를 답 폴더(`$o`)로 두고 stderr 를 `$o/err-gemini.
|
|
149
|
+
- gemini 좌석은 `TMPDIR`, `TEMP`, `TMP` 를 답 폴더(`$o`)로 두고 stderr 를 `$o/err-gemini.md` 로 받는다. 0.62.0 은 API 오류가 나면 요청 전문(페이로드)을 `os.tmpdir()` 에 `gemini-client-error-*.json` 으로 쓴다(umask 권한). node 의 `os.tmpdir()` 는 POSIX 에서 `TMPDIR` 을, Windows 에서 `TEMP` 와 `TMP` 를 읽는다(Claude Code 는 Windows 에서도 이 bash 블록을 Git Bash 로 돌린다). `$o` 에 두면 정리 때 함께 지워진다.
|
|
150
150
|
- gemini 자체 샌드박스는 `GEMINI_SANDBOX=false` 로 끈다. 이 env 는 설정의 `tools.sandbox` 보다 앞선다(0.62.0). 켜 두면 gemini 는 자체 샌드박스 안에서 다시 뜬다(docker, podman 컨테이너. macOS 에서 값이 `true` 면 `sandbox-exec`). 컨테이너 안에는 정책 파일이 없어 모든 도구가 열리고(`Policy file error` 도 나오지 않는다), 페이로드는 docker 명령줄에 실린다.
|
|
151
151
|
- stderr 에 `Policy file error` 가 있으면 정책을 읽지 못해 도구가 열렸을 수 있으므로 그 좌석은 `ERROR` 다. `Full report` 는 API 오류다. 첫 호출의 권한, 미존재 거절이면 갈아타고(외부 모델 결정 절), 그 밖은 `ERROR` 다.
|
|
152
152
|
5. 좌석 명령은 백그라운드 작업으로 돌린다(Claude Code 는 `run_in_background`, Codex 는 오래 도는 exec 세션). 끝났다는 알림을 받은 뒤 `$o` 의 답 파일을 읽는다.
|
|
@@ -170,7 +170,7 @@ d='<찍힌 d>' o='<찍힌 o>' R='<이 스킬 디렉터리 절대경로>/referenc
|
|
|
170
170
|
# 2단계-1(따로 호출): 추적하지 않는 새 파일을 모두 찍는다. status --short 와 달리 새 폴더를 한 줄로 접지 않는다
|
|
171
171
|
git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard
|
|
172
172
|
|
|
173
|
-
# 2단계-2: 짧은 부분과 "$d/new-files.
|
|
173
|
+
# 2단계-2: 짧은 부분과 "$d/new-files.md"(그중 변경에 속한 새 파일, 한 줄에 하나, 없으면 빈 파일)를 파일 도구로 쓴 뒤
|
|
174
174
|
# 원문과 닫는 표지를 붙이고, 표지가 두 줄인지 센다. 멈추면 stderr 에 사유를 찍는다
|
|
175
175
|
# 목록의 한 줄은 파일 하나다. textconv, 외부 diff 드라이버, 색, 하위 저장소 내용은 싣지 않는다
|
|
176
176
|
# grep 은 command 로 시스템 grep 을 부른다(Claude Code 의 grep 함수는 UTF-8 이 아닌 파일을 세지 않는다)
|
|
@@ -178,13 +178,13 @@ git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standar
|
|
|
178
178
|
# 실제 인덱스의 사본이라 스테이징도 담고 저장소 인덱스는 그대로다. 인덱스 파일이 없으면 커밋 없는 저장소만 이어 간다
|
|
179
179
|
i=$(git -C '<저장소>' rev-parse --git-path index) && case $i in /*|?:*) ;; *) i='<저장소>'/$i ;; esac && rm -f "$d/idx" &&
|
|
180
180
|
{ if [ -f "$i" ]; then cp -p "$i" "$d/idx"; elif git -C '<저장소>' rev-parse -q --verify HEAD > /dev/null; then echo "ralph-qa: 커밋이 있는데 인덱스 파일이 없다: $i" >&2; false; fi; } &&
|
|
181
|
-
LC_ALL=C GIT_INDEX_FILE="$d/idx" git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --dry-run --pathspec-from-file="$d/new-files.
|
|
182
|
-
tr -d '\r' < "$d/new-files.
|
|
183
|
-
{ sed -e "s/^add '//" -e "s/'\$//" "$d/added.
|
|
184
|
-
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --pathspec-from-file="$d/new-files.
|
|
185
|
-
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard > "$d/unsent.
|
|
181
|
+
LC_ALL=C GIT_INDEX_FILE="$d/idx" git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --dry-run --pathspec-from-file="$d/new-files.md" > "$d/added.md" &&
|
|
182
|
+
tr -d '\r' < "$d/new-files.md" > "$d/listed.md" &&
|
|
183
|
+
{ sed -e "s/^add '//" -e "s/'\$//" "$d/added.md" | LC_ALL=C command grep -Fxv -f "$d/listed.md" >&2; [ $? -eq 1 ] || { echo 'ralph-qa: 목록에 없는 새 파일이 올라간다(위 경로. 폴더 줄이나 겹친 줄)' >&2; false; }; } &&
|
|
184
|
+
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --pathspec-from-file="$d/new-files.md" &&
|
|
185
|
+
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard > "$d/unsent.md" &&
|
|
186
186
|
{ ! GIT_INDEX_FILE="$d/idx" git -C '<저장소>' diff --no-ext-diff --no-textconv --no-color --submodule=short --quiet '<기준>' || { echo 'ralph-qa: 보낼 diff 가 없다' >&2; false; }; } &&
|
|
187
|
-
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' -c core.quotePath=false diff --no-ext-diff --no-textconv --no-color --submodule=short '<기준>' >> "$d/prompt.md" && rm -f "$d/idx" "$d/added.
|
|
187
|
+
GIT_INDEX_FILE="$d/idx" git -C '<저장소>' -c core.quotePath=false diff --no-ext-diff --no-textconv --no-color --submodule=short '<기준>' >> "$d/prompt.md" && rm -f "$d/idx" "$d/added.md" "$d/listed.md" &&
|
|
188
188
|
cat '<기준 파일>' >> "$d/prompt.md" &&
|
|
189
189
|
printf '%s\n' '</review-data id="<id>">' >> "$d/prompt.md" && LC_ALL=C command grep -c 'review-data id="<id>"' "$d/prompt.md"
|
|
190
190
|
|
|
@@ -197,14 +197,14 @@ for s in codex gemini opencode; do mkdir -m 700 "$d/$s" && cp "$d/prompt.md" "$d
|
|
|
197
197
|
--disable multi_agent --disable hooks --disable plugins --disable apps --disable shell_tool \
|
|
198
198
|
-c 'notify=[]' -c 'analytics.enabled=false' -c 'web_search=disabled' <mcp> \
|
|
199
199
|
-c 'otel.exporter="none"' -c 'otel.trace_exporter="none"' -c 'otel.metrics_exporter="none"' \
|
|
200
|
-
-m '<model>' -s read-only --skip-git-repo-check -o "$o/out-codex.md" - < prompt.md 2> "$o/err-codex.
|
|
200
|
+
-m '<model>' -s read-only --skip-git-repo-check -o "$o/out-codex.md" - < prompt.md 2> "$o/err-codex.md" )
|
|
201
201
|
|
|
202
202
|
# gemini: 정책 파일과 홈 밖 상위 폴더의 .env 를 먼저 확인하고, 실패하면 보내지 않는다
|
|
203
203
|
( cd "$d/gemini" && pol=$(node "$R/gemini-seat.mjs" check "$d/gemini") && [ -n "$pol" ] && [ -f "$pol" ] &&
|
|
204
204
|
unset GEMINI_CLI_IDE_WORKSPACE_PATH &&
|
|
205
205
|
TMPDIR="$o" TEMP="$o" TMP="$o" GEMINI_SANDBOX=false GEMINI_TELEMETRY_LOG_PROMPTS=false <상한> gemini --skip-trust --approval-mode default --admin-policy "$pol" \
|
|
206
206
|
--allowed-mcp-server-names ralph-qa-none -e none \
|
|
207
|
-
-m '<model>' -p "첨부한 검토 지시를 따르라" < prompt.md > "$o/out-gemini.md" 2> "$o/err-gemini.
|
|
207
|
+
-m '<model>' -p "첨부한 검토 지시를 따르라" < prompt.md > "$o/out-gemini.md" 2> "$o/err-gemini.md" )
|
|
208
208
|
|
|
209
209
|
# opencode: <id> 는 워크플로 1단계의 무작위 id. 에이전트를 먼저 확인하고, 없으면 보내지 않는다
|
|
210
210
|
A='ralph-qa-review-<id>'
|
|
@@ -214,7 +214,7 @@ P='{"*":"deny"}'
|
|
|
214
214
|
OPENCODE_CONFIG_CONTENT="{\"share\":\"disabled\",\"agent\":{\"compaction\":{\"disable\":true},\"$A\":{\"mode\":\"primary\",\"description\":\"ralph-qa reviewer\",\"permission\":$P}}}" \
|
|
215
215
|
OPENCODE_DISABLE_PROJECT_CONFIG=1 OPENCODE_DISABLE_MODELS_FETCH=1 OPENCODE_DISABLE_AUTOUPDATE=1 OPENCODE_DISABLE_SHARE=1 OPENCODE_DISABLE_CLAUDE_CODE=1 &&
|
|
216
216
|
<상한> opencode debug agent "$A" --pure > /dev/null 2>&1 &&
|
|
217
|
-
<상한> opencode run --pure --agent "$A" --title "$A" -m '<provider/model>' "아래 검토 지시를 따르라" < prompt.md > "$o/out-opencode.md" 2> "$o/err-opencode.
|
|
217
|
+
<상한> opencode run --pure --agent "$A" --title "$A" -m '<provider/model>' "아래 검토 지시를 따르라" < prompt.md > "$o/out-opencode.md" 2> "$o/err-opencode.md" )
|
|
218
218
|
|
|
219
219
|
# 6단계: 좌석 작업이 모두 끝났거나 멈춘 뒤. gemini 는 이 좌석의 기록을 지우고, 하루 지난 폴더를 지운 뒤 앞서 끊긴 실행의 기록을 지운다
|
|
220
220
|
# opencode 는 목록에서 제목이 ralph-qa-review-<id> 인 세션과, 제목이 ralph-qa-review- 로 시작하고 directory 의 좌석 폴더가 없는 세션을 지운다
|
|
@@ -234,8 +234,8 @@ rm -rf "$d" "$o"
|
|
|
234
234
|
|
|
235
235
|
- 모델 플래그(`-m`)는 항상 준다. `fallback` 이 `@cli-default` 일 때만 뺀다. gemini 는 `-m auto`·`-m pro` 도 그대로 준다 — `-m` 이 없으면 설정 모델이 돌아 보고와 실제가 갈린다. 모델 이름과 `-c` 값은 작은따옴표로 감싼다.
|
|
236
236
|
- `-c model_reasoning_effort=<v>` 는 `--effort` 를 줄 때만 codex 명령에 붙인다.
|
|
237
|
-
- **codex 가 실제로 돌린 모델**은 `$o/err-codex.
|
|
238
|
-
- **opencode 에이전트 확인.** 1.3.10 은 `--agent` 의 에이전트를 찾지 못하면 기본 에이전트로 넘어가 사용자 설정의 도구(셸 포함)를 연다(모의 재현). 그래서 같은 서브셸에서 `opencode debug agent` 로 먼저 확인하고, 실패하면 보내지 않는다. `$o/err-opencode.
|
|
237
|
+
- **codex 가 실제로 돌린 모델**은 `$o/err-codex.md` 머리의 `model:` 줄이다. 판정을 집계하기 전에 확인한다. `-m` 으로 준 모델과 다르면 `ERROR` 다. `@cli-default` 로 돌렸으면 그 이름으로 `--codex=<이름>` 프로브를 한 번 더 돌린다. 저자 계열이거나(`self-family`) 계열을 읽지 못하면(`familyKnown: false`) 그 판정을 집계하지 않고 좌석을 `no-default-model` 로 미착석시킨다. 그 모델은 CLI 설정이 정해 저자 선택이 아니다. 첫 판정 전이라 좌석 상실이 아니다.
|
|
238
|
+
- **opencode 에이전트 확인.** 1.3.10 은 `--agent` 의 에이전트를 찾지 못하면 기본 에이전트로 넘어가 사용자 설정의 도구(셸 포함)를 연다(모의 재현). 그래서 같은 서브셸에서 `opencode debug agent` 로 먼저 확인하고, 실패하면 보내지 않는다. `$o/err-opencode.md` 에 `Falling back to default agent` 가 있으면 그 좌석은 `ERROR` 다.
|
|
239
239
|
- **남는 사본.** codex 는 `--ephemeral` 이라 세션을 남기지 않는다.
|
|
240
240
|
- gemini 0.62.0 은 헤드리스 실행마다 페이로드와 답 전문을 `<홈>/.gemini/tmp/<id>/chats/` 에 기록하고(끄는 설정이 없다, 기본 30일 보존), 좌석 폴더 경로를 `projects.json` 에 남긴다. `<홈>` 은 `$GEMINI_CLI_HOME` 이 있으면 그 폴더다. 반복마다 `$d` 를 지우기 전에 `gemini-seat.mjs clean "$d/gemini"` 로 그 좌석 폴더를 가리키는 기록 폴더(`tmp/<id>`, `history/<id>`)를 지운다. `projects.json` 항목에는 경로만 있어 남긴다. `.project_root` 없이 다시 만든 기록 폴더는 `projects.json` 의 좌석 경로로 찾는다. `clean` 과 `sweep` 이 그 폴더도 지운다. `--list-sessions` 는 요약을 만들려고 모델을 한 번 더 부르므로 쓰지 않는다.
|
|
241
241
|
- 좌석 명령과 정리 사이에 실행이 끊기면 gemini 기록과 페이로드 사본이 남는다.
|
|
@@ -252,14 +252,14 @@ rm -rf "$d" "$o"
|
|
|
252
252
|
- Windows PowerShell 에는 `<` 재지정이 없다(실기 미검증).
|
|
253
253
|
- 먼저 `$OutputEncoding` 과 `[Console]::OutputEncoding` 을 UTF-8 로 둔다. 기준 폴더는 `$env:TEMP` 다. 두 폴더는 `$d = Join-Path $env:TEMP ('ralph-qa.' + [guid]::NewGuid().ToString('N'))` 와 `$o = Join-Path $env:TEMP ('ralph-qa-out.' + [guid]::NewGuid().ToString('N'))` 로 이름을 짓는다. 정리 규칙과 `sweep` 이 이 이름을 찾는다. 만든 두 폴더에는 bash 처럼 빈 표지 파일을 둔다(`New-Item -ItemType File -Path (Join-Path $d '.ralph-qa'), (Join-Path $o '.ralph-qa')`).
|
|
254
254
|
- env 는 그 좌석을 띄우는 같은 호출 안에서 `$env:이름='값'` 으로 준다. 다른 호출로 나누면 새 셸이라 사라지고, opencode 는 그때 기본 에이전트로 넘어간다.
|
|
255
|
-
- 2단계 원문 붙이기: 먼저 bash 와 같은 `git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard` 로 새 파일을 보고, 그중 변경에 속한 것만 파일 도구로 `$d\new-files.
|
|
255
|
+
- 2단계 원문 붙이기: 먼저 bash 와 같은 `git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard` 로 새 파일을 보고, 그중 변경에 속한 것만 파일 도구로 `$d\new-files.md` 에 쓴다. 5.1 의 `Out-File` 과 `>` 는 BOM 이나 UTF-16 으로 써서 git 이 그 경로를 읽지 못한다. `$i = git -C '<저장소>' rev-parse --git-path index` 로 경로를 얻고, `$i` 가 문자열 하나가 아니면 멈춘다. `[IO.Path]::IsPathRooted($i)` 가 거짓이면 `$i = Join-Path '<저장소>' $i` 로 바꾼다. `Remove-Item -LiteralPath "$d\idx" -ErrorAction Ignore` 뒤 `Test-Path -LiteralPath $i` 가 참이면 `Copy-Item -LiteralPath $i "$d\idx"` 로 실제 인덱스를 복사한다. 거짓이면 `git -C '<저장소>' rev-parse -q --verify HEAD > $null` 의 `$LASTEXITCODE` 가 0 이면(커밋이 있으면) `커밋이 있는데 인덱스 파일이 없다` 를 찍고 멈춘다. `-LiteralPath` 없는 `Test-Path` 는 경로의 `[ ]` 를 와일드카드로 읽어 있는 파일에도 거짓을 낸다. 같은 호출에서 `$env:GIT_INDEX_FILE="$d\idx"` 와 `$env:LC_ALL='C'` 를 두고, 먼저 `$added = @(git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --dry-run --pathspec-from-file="$d\new-files.md" | ForEach-Object { $_ -replace "^add '(.*)'$", '$1' })` 로 올라갈 파일을 얻는다. 그 가운데 `$listed = @(Get-Content -LiteralPath "$d\new-files.md" -Encoding utf8)` 에 없는 것(`$added | Where-Object { $listed -cnotcontains $_ }`)이 있으면 그 경로와 `목록에 없는 새 파일이 올라간다` 를 찍고 멈춘다. 그다음 `git -C '<저장소>' --literal-pathspecs -c advice.addEmptyPathspec=false add -N --pathspec-from-file="$d\new-files.md"`, `git -C '<저장소>' -c core.quotePath=false ls-files --others --exclude-standard`(보내지 않은 새 파일이 찍힌다), `git -C '<저장소>' diff --no-ext-diff --no-textconv --no-color --submodule=short --quiet '<기준>'`, `git -C '<저장소>' -c core.quotePath=false diff --no-ext-diff --no-textconv --no-color --submodule=short --output="$d\diff.md" '<기준>'` 를 차례로 실행한다. 5.1 에는 `&&` 가 없어 git 마다 `$LASTEXITCODE` 를 본다: `diff --quiet` 는 1 일 때만 계속하고(0 이면 `보낼 diff 가 없다` 를 찍고 멈춘다), 나머지는 0 이 아니면 멈춘다. 그다음 `[IO.File]::AppendAllText("$d\prompt.md", [IO.File]::ReadAllText("$d\diff.md"))` 로 붙이고, `Remove-Item Env:GIT_INDEX_FILE, Env:LC_ALL` 와 `Remove-Item -LiteralPath "$d\idx", "$d\diff.md"` 로 치운다. 5.1 은 git 출력을 파이프로 받으면 콘솔 인코딩으로 읽어 한글을 깨뜨리고, `>>` 는 UTF-16 으로 붙인다.
|
|
256
256
|
- 표지 세기: `(Select-String -SimpleMatch -Pattern 'review-data id="<id>"' -LiteralPath "$d\prompt.md").Count`.
|
|
257
257
|
- 세 좌석 모두 `Get-Content -Raw -Encoding utf8 -LiteralPath "$d\<좌석>\prompt.md" |` 로 페이로드를 파이프로 넘긴다. codex 는 끝에 `-` 를 둔다. 좌석 폴더로는 `Push-Location -LiteralPath "$d\<좌석>"` 으로 들어가고 끝나면 `Pop-Location` 한다.
|
|
258
258
|
- 답은 `| Out-File -Encoding utf8 -LiteralPath "$o\out-<좌석>.md"` 로 받는다. 5.1 의 `>` 는 UTF-16 으로 쓴다.
|
|
259
259
|
- PowerShell 에는 `<상한>` 에 넣을 명령이 없다. 600 초가 지나도 끝나지 않은 좌석은 그 작업을 멈추고 `ERROR` 로 적는다.
|
|
260
260
|
- 경로를 받는 명령은 모두 `-LiteralPath` 로 준다. 없으면 경로의 `[ ]` 를 와일드카드로 읽는다.
|
|
261
|
-
- gemini 좌석은 같은 호출에서 `$pol = node "$R\gemini-seat.mjs" check "$d\gemini"` 가 `$LASTEXITCODE` 0 이고 `$pol` 이 비지 않았으며 `Test-Path -LiteralPath $pol` 이 참일 때만 띄운다. 그 호출에 `Remove-Item Env:GEMINI_CLI_IDE_WORKSPACE_PATH -ErrorAction Ignore`, `$env:GEMINI_TELEMETRY_LOG_PROMPTS='false'`, `$env:GEMINI_SANDBOX='false'`, `$env:TEMP=$o`, `$env:TMP=$o` 를 두고 stderr 는 `2> "$o\err-gemini.
|
|
262
|
-
- 보고의 `외부 전송(선언)` 줄에 좌석별 목적지, 페이로드 크기, 비밀 검사 결과, 보내지 않은 새 파일 수(`unsent.
|
|
261
|
+
- gemini 좌석은 같은 호출에서 `$pol = node "$R\gemini-seat.mjs" check "$d\gemini"` 가 `$LASTEXITCODE` 0 이고 `$pol` 이 비지 않았으며 `Test-Path -LiteralPath $pol` 이 참일 때만 띄운다. 그 호출에 `Remove-Item Env:GEMINI_CLI_IDE_WORKSPACE_PATH -ErrorAction Ignore`, `$env:GEMINI_TELEMETRY_LOG_PROMPTS='false'`, `$env:GEMINI_SANDBOX='false'`, `$env:TEMP=$o`, `$env:TMP=$o` 를 두고 stderr 는 `2> "$o\err-gemini.md"` 로 받는다. 정리는 좌석 작업이 모두 끝났거나 멈춘 뒤 `node "$R\gemini-seat.mjs" clean "$d\gemini"`, 하루 규칙 `Get-ChildItem -LiteralPath (Split-Path $d) -Directory | Where-Object { $_.Name -match '^ralph-qa(-out)?\.[A-Za-z0-9]+$' -and -not ($_.Attributes -band [IO.FileAttributes]::ReparsePoint) -and $_.LastWriteTime -lt (Get-Date).AddDays(-1) -and (Test-Path -LiteralPath (Join-Path $_.FullName '.ralph-qa') -PathType Leaf) } | Remove-Item -Recurse -Force`, `node "$R\gemini-seat.mjs" sweep (Split-Path $d)` 순서다.
|
|
262
|
+
- 보고의 `외부 전송(선언)` 줄에 좌석별 목적지, 페이로드 크기, 비밀 검사 결과, 보내지 않은 새 파일 수(`unsent.md` 의 줄 수)를 적는다.
|
|
263
263
|
|
|
264
264
|
## 정족수
|
|
265
265
|
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: theme-selection
|
|
3
|
+
description: "프로젝트에 테마 74종을 라이트와 다크 한 쌍씩(148 조합) CSS 사용자 지정 속성으로 입힘. 대비 보정을 거친 값을 내고, 테마 고르개(HTML과 스크립트)와 대비 감사(check)도 냄. 프로젝트의 DESIGN.md 도 읽어 테마로 더함. Node 만 쓰고 인터넷을 쓰지 않음. 'theme-selection'/'테마 선택'/'테마 추가'/'테마 입히기'/'다크모드 추가' 시 사용. 일반 UI 작업에서는 자동 실행 금지."
|
|
4
|
+
argument-hint: "list | css | json | widget | check [--design-md PATH] [--only SLUGS] [--default SLUG] [--prefix STR] [--dark-via attr|media|class] [--out FILE] [--json]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# theme-selection - 테마 74종, 라이트와 다크, 대비 보정
|
|
8
|
+
|
|
9
|
+
테마 74종, 라이트와 다크 148 조합, 대비 보정 포함, 인터넷 없음. 엔진은 Node 하나(`scripts/themes.mjs`)이고 의존성이 없다.
|
|
10
|
+
붙이는 방법은 `references/integrate.md`, 보정이 이 모양인 이유는 `references/contrast.md` 에 있다.
|
|
11
|
+
번들 팔레트의 출처와 라이선스는 `assets/NOTICE.md` 에 있다.
|
|
12
|
+
|
|
13
|
+
인자: `$ARGUMENTS`
|
|
14
|
+
- 명령과 옵션이 있으면 그것으로 아래 절차를 따른다. 비어 있으면 절차대로 묻는다.
|
|
15
|
+
- Codex: 사용자 메시지에서 읽는다.
|
|
16
|
+
- 사용자 입력을 셸 명령에 그대로 붙이지 않는다. 명령과 옵션은 아래 표에 있는 것만 쓴다.
|
|
17
|
+
- 🔴 경로는 작은따옴표로 감싼다(bash, zsh, PowerShell 모두). 큰따옴표 안의 `$(...)` 와 백틱은 셸이 엔진보다 먼저 실행한다.
|
|
18
|
+
- 경로에 작은따옴표(`'`, 그리고 PowerShell 이 같게 읽는 `‘` `’` `‚` `‛`), `$`, 백틱, 줄바꿈이 있으면 실행하지 않고 사용자에게 알린다.
|
|
19
|
+
|
|
20
|
+
## 절차
|
|
21
|
+
|
|
22
|
+
1. 스킬 디렉터리의 절대경로를 정한다. 경로를 추측하지 않는다. 아래 `<스킬>` 은 그 경로다.
|
|
23
|
+
|
|
24
|
+
| 런타임 | 스킬 디렉터리 |
|
|
25
|
+
|---|---|
|
|
26
|
+
| Claude Code | 이 파일 맨 위에 넣어 준 "Base directory for this skill:" 줄의 경로 |
|
|
27
|
+
| Codex | `~/.codex/skills/banker-theme-selection/` 의 절대경로. 프로젝트 범위 설치면 `./.codex/skills/banker-theme-selection/` |
|
|
28
|
+
|
|
29
|
+
- `~` 는 따옴표 안에서 펼쳐지지 않으니 절대경로를 쓴다.
|
|
30
|
+
2. 프로젝트에 `DESIGN.md` 가 있으면 `--design-md` 로 함께 먹인다. 없으면 번들 74종만 쓴다.
|
|
31
|
+
- 파일, `DESIGN.md` 를 담은 폴더, `<이름>/DESIGN.md` 를 담은 폴더를 모두 받는다.
|
|
32
|
+
- `<이름>/DESIGN.md` 가 여럿이면 그 부모 폴더 하나를 넘긴다. 하위 경로를 하나씩 셸에 적지 않는다. 폴더 이름은 엔진이 검사한다.
|
|
33
|
+
- 여러 번 줄 수 있고 뒤가 이긴다. 슬러그가 같으면 번들을 덮는다.
|
|
34
|
+
- 슬러그(폴더 이름이나 확장자를 뗀 파일 이름)는 글자(한글 포함), 숫자, `.`, `-`, `_` 만 받는다. 빈칸, 다른 기호, 보이지 않는 글자가 있으면 종료 코드 2 로 멈춘다. 이름을 바꾸자고 사용자에게 알린다.
|
|
35
|
+
- 한글 이름은 NFC 로 맞춰 읽는다. macOS 의 분해형 폴더 이름도 `--only 쇼핑몰` 과 맞는다.
|
|
36
|
+
3. 쓸 테마를 정한다. 사용자가 고르면 `--only` 로 줄인다.
|
|
37
|
+
- 74종 전부를 내면 테마 규칙만 148 개다. 쓸 것만 `--only` 로 고르는 쪽을 먼저 권한다.
|
|
38
|
+
- 모르면 `node <스킬>/scripts/themes.mjs list` 로 목록을 보고 사용자에게 묻는다. 2단계에서 `--design-md` 를 정했으면 `list` 에도 준다.
|
|
39
|
+
4. CSS 를 낸다.
|
|
40
|
+
- `node <스킬>/scripts/themes.mjs css --only a,b,c --out <프로젝트 CSS 경로>`
|
|
41
|
+
- `--out` 은 이미 있는 파일을 묻지 않고 덮어쓴다. 그 경로에 파일이 있으면 먼저 사용자에게 묻는다.
|
|
42
|
+
- 프로젝트가 다크를 `class` 나 `@media` 로 다루면 `--dark-via class` 나 `--dark-via media` 를 준다.
|
|
43
|
+
5. 테마를 고르는 사람이 있는 화면이면 고르개를 붙인다.
|
|
44
|
+
- `node <스킬>/scripts/themes.mjs widget --only a,b,c` 가 세 덩이를 낸다. CSS 를 낼 때와 같은 `--only`, `--default`, `--dark-via` 를 준다. `--default` 가 다르면 첫 방문의 고르개 테마와 `:root` 테마가 갈린다.
|
|
45
|
+
- 모드 버튼은 `data-mode` 속성과 `.dark` 클래스를 함께 바꾼다. 그래서 `attr`, `class` 둘 다 맞는다. `media` 면 모드 버튼 없이 낸다(다크는 OS 설정을 따름).
|
|
46
|
+
- 어디에 두는지는 `references/integrate.md` 의 고르개 절을 따른다.
|
|
47
|
+
- 모드만 쓰는 화면은 고르개 없이 `--dark-via media` 로 끝낸다. `:root` 가 기본 테마의 다크도 들고 있어 `<html>` 에 속성이 없어도 OS 가 다크면 다크가 된다.
|
|
48
|
+
6. 프로젝트 CSS 가 변수를 읽게 한다. 순서는 `references/integrate.md` 에 있다.
|
|
49
|
+
7. `check` 로 확인한다. CSS 를 낼 때 준 `--only`, `--design-md`, `--target`, `--label-target` 을 같게 준다.
|
|
50
|
+
- 🔴 `--out` 은 주지 않는다. 주면 그 파일이 감사 결과로 덮인다.
|
|
51
|
+
- 종료 코드 0 이 되고, 실제 화면까지 본 뒤에 끝났다고 말한다. 확인 절을 따른다.
|
|
52
|
+
|
|
53
|
+
## 경고
|
|
54
|
+
|
|
55
|
+
- 🔴 배선 스크립트를 `ready` 래퍼 없이 넣으면 고르개가 영원히 안 움직인다.
|
|
56
|
+
- 이 스크립트는 자기가 배선할 마크업보다 먼저 돌 수 있다. `getElementById` 가 빈손이 된다.
|
|
57
|
+
- `widget` 이 낸 배선 스크립트는 `readyState` 를 보고 즉시 또는 `DOMContentLoaded` 에서 부르는 래퍼로 감싸져 있다. 래퍼를 떼지 않는다.
|
|
58
|
+
- head 스크립트는 DOM 을 안 보므로 `<head>` 에서 즉시 돈다. 배선 스크립트와 합치지 않는다.
|
|
59
|
+
- 🔴 `-on-surface` 가 붙은 변수는 `--bg` 위 규칙에 쓰지 않는다. 본문이 흐려진다.
|
|
60
|
+
- 🔴 `--target` 을 4.5 로 올리지 않는다. 74 테마의 색이 전부 평평해져 테마가 테마가 아니게 된다.
|
|
61
|
+
- 🔴 `--rule` 은 대비가 보장되지 않는다. 경계선만으로 정보를 전달하지 않는다.
|
|
62
|
+
- 148 조합 중 122 조합이 `--bg` 대비 3.0 아래이고, 35 조합은 1.5 아래다.
|
|
63
|
+
- `lamborghini/light` 은 `--rule` 과 `--bg` 가 같은 색이라 대비가 1.00 이다. 경계선이 안 보인다.
|
|
64
|
+
- 누를 수 있는 것, 고른 것, 틀린 칸은 경계선 말고 글자색이나 배경색으로도 표시한다.
|
|
65
|
+
- `--no-correct` 는 대조군 전용이다. 프로젝트에 나가는 CSS 에 쓰지 않는다.
|
|
66
|
+
|
|
67
|
+
## 명령
|
|
68
|
+
|
|
69
|
+
실행 형식: `node <스킬>/scripts/themes.mjs <명령> [옵션]`
|
|
70
|
+
|
|
71
|
+
| 명령 | 내는 것 |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `list` | `슬러그<탭>표시명` 한 줄에 하나 |
|
|
74
|
+
| `css` | CSS 사용자 지정 속성. 라이트와 다크 |
|
|
75
|
+
| `json` | 보정된 팔레트를 JSON 으로 |
|
|
76
|
+
| `widget` | 테마 고르개 HTML 과 스크립트 둘 |
|
|
77
|
+
| `check` | 대비 감사. 하나라도 어긋나면 종료 코드 1 |
|
|
78
|
+
|
|
79
|
+
| 옵션 | 뜻 |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `--design-md PATH` | DESIGN.md 를 읽어 테마를 더하거나 덮는다. 여러 번 줄 수 있고 뒤가 이김 |
|
|
82
|
+
| `--only SLUGS` | 쉼표로 가른 허용 목록. 기본은 전부 |
|
|
83
|
+
| `--default SLUG` | `:root` 가 들 테마. 기본 `superhuman`. 걸러져 없으면 첫 슬러그 |
|
|
84
|
+
| `--prefix STR` | 변수 13개와 `--shadow` 앞에 붙는 문자열. 영문, 숫자, `-`, `_` 만. 기본은 빈 문자열 |
|
|
85
|
+
| `--dark-via MODE` | `attr`(기본), `media`, `class`. `css` 와 `widget` 에 같은 값을 준다 |
|
|
86
|
+
| `--target N` | `-on-surface` 와 `accent` 의 목표 대비. 기본 3.0 |
|
|
87
|
+
| `--label-target N` | 버튼 글자 목표 대비. 기본 4.5. 4.58 을 넘기면 답 없는 조합이 생기고 `check` 가 그 자리를 보고함 |
|
|
88
|
+
| `--no-correct` | 보정 없이 원본 값을 냄. 대조군 전용 |
|
|
89
|
+
| `--out FILE` | 표준출력 대신 파일로. 있는 파일은 덮어씀. 그 파일 자체가 심볼릭 링크면 쓰지 않음(종료 2). 상위 폴더의 링크는 따라감 |
|
|
90
|
+
| `--json` | `check` 에서만. 기계가 읽는 감사 결과 |
|
|
91
|
+
|
|
92
|
+
| 종료 코드 | 뜻 |
|
|
93
|
+
|---|---|
|
|
94
|
+
| 0 | 정상 |
|
|
95
|
+
| 1 | `check` 가 어긋난 자리를 찾음 |
|
|
96
|
+
| 2 | 인자가 틀림(허용 밖 슬러그와 접두사 포함). 파일을 읽거나 쓰지 못함(`--out` 이 심볼릭 링크 포함) |
|
|
97
|
+
|
|
98
|
+
`check --json` 은 아래 필드를 낸다. 사람이 읽는 출력 대신 쓸 수 있다.
|
|
99
|
+
|
|
100
|
+
| 필드 | 뜻 |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `themes` | 잰 테마 수 |
|
|
103
|
+
| `combos` | 잰 조합 수. 테마당 둘 |
|
|
104
|
+
| `checks` | 단언 수 |
|
|
105
|
+
| `corrected` | 보정을 켰는지 |
|
|
106
|
+
| `violations` | 어긋난 자리 수 |
|
|
107
|
+
| `bad` | 어긋난 자리 목록 |
|
|
108
|
+
| `detail` | 조합마다 `slug`, `mode`, `body`(본문 대비), `violations` |
|
|
109
|
+
|
|
110
|
+
선택자는 `--dark-via` 에 따라 갈린다. `:root` 는 언제나 먼저 나오고 기본 테마의 라이트와 다크를 든다.
|
|
111
|
+
JS 가 꺼졌거나, 저장된 이름이 목록 밖이거나, `<html>` 에 `data-theme` 이 없어도 화면이 읽히는 이유다.
|
|
112
|
+
테마 규칙은 같은 모드의 `:root` 규칙보다 특정성이 높아 이긴다.
|
|
113
|
+
|
|
114
|
+
| `--dark-via` | 라이트 | 다크 | `:root` 의 다크 |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| `attr` | `html[data-theme="<슬러그>"]` | `html[data-theme="<슬러그>"][data-mode="dark"]` | `:root[data-mode="dark"]` |
|
|
117
|
+
| `class` | `html[data-theme="<슬러그>"]` | `html[data-theme="<슬러그>"].dark` | `:root.dark` |
|
|
118
|
+
| `media` | `html[data-theme="<슬러그>"]` | `@media (prefers-color-scheme: dark){html[data-theme="<슬러그>"]{...}}` | `@media (prefers-color-scheme: dark){:root{...}}` |
|
|
119
|
+
|
|
120
|
+
## 변수
|
|
121
|
+
|
|
122
|
+
조합 하나가 13개를 낸다. 순서도 이대로다.
|
|
123
|
+
|
|
124
|
+
🔴 `-on-surface` 가 붙은 넷은 배경이 `--surface` 인 규칙에서만 쓴다. `--bg` 위 규칙이 이것을 쓰면 본문이 흐려진다.
|
|
125
|
+
|
|
126
|
+
| 변수 | 쓰는 자리 |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `--bg` | 페이지 배경 |
|
|
129
|
+
| `--surface` | 카드, 상자, 패널 배경 |
|
|
130
|
+
| `--ink` | `--bg` 위 본문 글자 |
|
|
131
|
+
| `--dim` | `--bg` 위 보조 글자 |
|
|
132
|
+
| `--rule` | 구분선, 경계선 |
|
|
133
|
+
| `--accent` | `--bg` 위 링크, 강조, 버튼 경계 |
|
|
134
|
+
| `--warn` | `--bg` 위 경고, 위험 표시 |
|
|
135
|
+
| `--ink-on-surface` | `--surface` 위 본문 글자 |
|
|
136
|
+
| `--dim-on-surface` | `--surface` 위 보조 글자 |
|
|
137
|
+
| `--accent-on-surface` | `--surface` 위 강조, 버튼 배경 |
|
|
138
|
+
| `--warn-on-surface` | `--surface` 위 경고, 위험 버튼 |
|
|
139
|
+
| `--label-on-accent` | `--accent-on-surface` 를 배경으로 한 버튼 글자 |
|
|
140
|
+
| `--label-on-page-accent` | `--accent` 를 배경으로 한 버튼 글자 |
|
|
141
|
+
|
|
142
|
+
`--shadow` 는 테마가 아니라 모드의 성질이라 테마마다 넣지 않고 한 번만 낸다.
|
|
143
|
+
|
|
144
|
+
html{--shadow:rgba(0,0,0,.08)}
|
|
145
|
+
html[data-mode="dark"]{--shadow:rgba(0,0,0,.45)}
|
|
146
|
+
|
|
147
|
+
148 조합 중 `ink` 와 `dim` 값이 `-on-surface` 쪽과 실제로 갈라지는 것은 3 조합(값 넷)뿐이다. 나머지 145 조합은 두 변수가 같은 값이라 화면이 안 바뀐다.
|
|
148
|
+
|
|
149
|
+
## 확인
|
|
150
|
+
|
|
151
|
+
끝났다고 말하기 전에 둘 다 한다.
|
|
152
|
+
|
|
153
|
+
1. `check` 종료 코드.
|
|
154
|
+
- `node <스킬>/scripts/themes.mjs check` 에 CSS 를 낼 때 준 `--only`, `--design-md`, `--target`, `--label-target` 을 같게 준다. `--out` 은 주지 않는다.
|
|
155
|
+
- 0 이면 통과다. 1 이면 출력의 어긋난 자리를 사용자에게 보여 준다.
|
|
156
|
+
- 2 이면 인자를 고쳐 다시 돌린다.
|
|
157
|
+
2. 실제 화면.
|
|
158
|
+
- 브라우저로 페이지를 열고 테마를 바꿔 본다. 라이트와 다크를 둘 다 본다.
|
|
159
|
+
- 🔴 마크업에 속성이 있다는 것과 그 속성을 읽는 코드가 돌았다는 것은 다른 사실이다. JS 가 하는 일은 JS 를 돌려서 잰다.
|
|
160
|
+
- 고르개로 테마를 고른 뒤 `document.documentElement.dataset.theme` 이 바뀌었는지 읽는다.
|
|
161
|
+
- 다크는 고르개의 모드 버튼으로 본다. 고르개가 없으면 OS 다크 설정이나 브라우저 개발 도구의 색 구성 흉내로 본다.
|
|
162
|
+
- 새로고침한 뒤 같은 테마가 첫 그림부터 나오는지 본다.
|
|
163
|
+
- 브라우저를 쓸 수 없으면 확인하지 못했다고 적는다. 통과로 적지 않는다.
|
|
164
|
+
|
|
165
|
+
`check` 는 본문 대비(`--ink` 대 `--bg`)를 보고만 하고 판정하지 않는다.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 VoltAgent
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# NOTICE - 서드파티 출처 (theme-selection)
|
|
2
|
+
|
|
3
|
+
이 스킬의 번들 팔레트 `palettes.json` 은 서드파티 문서에서 색 값을 읽어 만든 것이다.
|
|
4
|
+
아래는 그 출처와 라이선스를 실제로 쓴 범위에 한정해 밝힌 것이다.
|
|
5
|
+
|
|
6
|
+
## 색 값을 읽어 만든 것
|
|
7
|
+
|
|
8
|
+
대상: `palettes.json` 의 테마 74종
|
|
9
|
+
|
|
10
|
+
| 항목 | 내용 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| 출처 | awesome-design-md (https://github.com/VoltAgent/awesome-design-md) 의 `design-md/<슬러그>/DESIGN.md` |
|
|
13
|
+
| 라이선스 | MIT, Copyright (c) 2026 VoltAgent. 전문은 이 폴더의 `LICENSE` |
|
|
14
|
+
| 쓴 범위 | DESIGN.md 의 색 값. 테마마다 라이트와 다크 7색으로 다시 계산함 |
|
|
15
|
+
| 슬러그 | 원본의 폴더 이름 |
|
|
16
|
+
|
|
17
|
+
- 문서 본문은 옮기지 않았다.
|
|
18
|
+
- MIT 조건에 따라 원본의 저작권 고지와 허가 고지를 `LICENSE` 로 함께 배포한다.
|
|
19
|
+
- `LICENSE` 는 2026-10-15 에 원본 저장소의 `LICENSE`(GitHub blob `5cea5d78a41df83eafe1fb9fc0710675a5b7acf6`)를 글자 그대로 옮긴 것이다.
|
|
20
|
+
|
|
21
|
+
## 상표
|
|
22
|
+
|
|
23
|
+
- 테마 이름(예: Airbnb, Apple)은 그 디자인이 참고한 사이트를 가리킬 뿐이다.
|
|
24
|
+
- 각 이름과 상표는 그 소유자의 것이다.
|
|
25
|
+
- banker 는 그 회사들과 관계가 없고, 그 회사들의 보증을 받지 않았다.
|
|
26
|
+
|
|
27
|
+
## 이 스킬의 자작 파일
|
|
28
|
+
|
|
29
|
+
- `SKILL.md`, `scripts/`, `references/` 는 banker 의 파일이다.
|
|
30
|
+
- banker 의 MIT 라이선스(저장소 루트 `LICENSE`)를 따른다.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fields": ["bg", "surface", "ink", "dim", "rule", "accent", "warn"],
|
|
3
|
+
"default": "superhuman",
|
|
4
|
+
"source": "VoltAgent/awesome-design-md (MIT) design-md/<slug>/DESIGN.md, see assets/NOTICE.md",
|
|
5
|
+
"themes": {
|
|
6
|
+
"airbnb": {"label":"Airbnb","light":["#ffffff","#ffffff","#222222","#6a6a6a","#dddddd","#ff385c","#9c4a12"],"dark":["#0f0f0f","#202020","#ffffff","#939393","#444444","#ff385c","#e0a04a"]},
|
|
7
|
+
"airtable": {"label":"Airtable","light":["#ffffff","#f8fafc","#181d26","#41454d","#dddddd","#181d26","#9c4a12"],"dark":["#181d26","#1d1f25","#ffffff","#97999d","#4b4f56","#696c72","#e0a04a"]},
|
|
8
|
+
"apple": {"label":"Apple","light":["#ffffff","#ffffff","#1d1d1f","#1d1d1f","#e0e0e0","#0066cc","#9c4a12"],"dark":["#0d0d0e","#1e1e1f","#ffffff","#929293","#424243","#599cde","#e0a04a"]},
|
|
9
|
+
"binance": {"label":"Binance","light":["#eaeef2","#ffffff","#181a20","#707a8a","#c0c4c8","#fcd535","#9c4a12"],"dark":["#0b0c0e","#1c1d1f","#ffffff","#919293","#414143","#fcd535","#e0a04a"]},
|
|
10
|
+
"bmw": {"label":"Bmw","light":["#ffffff","#fafafa","#262626","#6b6b6b","#e6e6e6","#1c69d4","#f59e0b"],"dark":["#1a2129","#262e38","#ffffff","#bbbbbb","#4c5258","#6b9ee3","#f59e0b"]},
|
|
11
|
+
"bmw-m": {"label":"Bmw M","light":["#ededed","#ffffff","#262626","#7e7e7e","#3c3c3c","#ffffff","#f4b400"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#ffffff","#f4b400"]},
|
|
12
|
+
"bugatti": {"label":"Bugatti","light":["#ededed","#ffffff","#262626","#6c6c6c","#262626","#ffffff","#d4a017"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#ffffff","#d4a017"]},
|
|
13
|
+
"cal": {"label":"Cal","light":["#ffffff","#f5f5f5","#111111","#6b7280","#e5e7eb","#111111","#f59e0b"],"dark":["#101010","#1a1a1a","#ffffff","#a1a1aa","#454545","#646464","#f59e0b"]},
|
|
14
|
+
"claude": {"label":"Claude","light":["#faf9f5","#efe9de","#141413","#6c6a64","#e6dfd8","#cc785c","#d4a017"],"dark":["#181715","#252320","#faf9f5","#a09d96","#4a4946","#cc785c","#d4a017"]},
|
|
15
|
+
"clay": {"label":"Clay","light":["#fffaf0","#f5f0e0","#0a0a0a","#6a6a6a","#e5e5e5","#0a0a0a","#f59e0b"],"dark":["#0a1a1a","#1a2a2a","#ffffff","#a0a0a0","#404c4c","#606060","#f59e0b"]},
|
|
16
|
+
"clickhouse": {"label":"Clickhouse","light":["#eeeeee","#ffffff","#262626","#888888","#2a2a2a","#faff69","#f59e0b"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#faff69","#f59e0b"]},
|
|
17
|
+
"cohere": {"label":"Cohere","light":["#ffffff","#ffffff","#212121","#93939f","#d9d9dd","#17171c","#b30000"],"dark":["#0f0f0f","#202020","#ffffff","#939393","#444444","#68686b","#b30000"]},
|
|
18
|
+
"coinbase": {"label":"Coinbase","light":["#ffffff","#ffffff","#0a0b0d","#7c828a","#dee1e6","#0052ff","#9c4a12"],"dark":["#0a0b0d","#16181c","#ffffff","#a8acb3","#404142","#598fff","#e0a04a"]},
|
|
19
|
+
"composio": {"label":"Composio","light":["#eeeeee","#ffffff","#262626","#888888","#222222","#0007cd","#9c4a12"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#595ede","#e0a04a"]},
|
|
20
|
+
"cursor": {"label":"Cursor","light":["#f7f7f4","#ffffff","#26251e","#807d72","#e6e5e0","#f54e00","#9c4a12"],"dark":["#11110e","#22221f","#fbfbfa","#929290","#444442","#f54e00","#e0a04a"]},
|
|
21
|
+
"dell-1996": {"label":"Dell 1996","light":["#ffffff","#ffffff","#000000","#737373","#cccccc","#e91d2a","#9c4a12"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#e91d2a","#e0a04a"]},
|
|
22
|
+
"elevenlabs": {"label":"Elevenlabs","light":["#f5f5f5","#ffffff","#0c0a09","#777169","#e7e5e4","#292524","#9c4a12"],"dark":["#0c0a09","#1c1917","#ffffff","#a8a29e","#41403f","#747171","#e0a04a"]},
|
|
23
|
+
"expo": {"label":"Expo","light":["#ffffff","#ffffff","#171717","#686868","#f0f0f3","#000000","#9c4a12"],"dark":["#171717","#1a1a1a","#ffffff","#b0b4ba","#4a4a4a","#595959","#e0a04a"]},
|
|
24
|
+
"ferrari": {"label":"Ferrari","light":["#efefef","#ffffff","#262626","#666666","#303030","#da291c","#9c4a12"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#e7746b","#e0a04a"]},
|
|
25
|
+
"figma": {"label":"Figma","light":["#ffffff","#f7f7f5","#000000","#737373","#e6e6e6","#000000","#9c4a12"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#595959","#e0a04a"]},
|
|
26
|
+
"framer": {"label":"Framer","light":["#eeeeee","#ffffff","#262626","#6c6c6c","#262626","#ffffff","#9c4a12"],"dark":["#111111","#222222","#f7f7f7","#909090","#444444","#ffffff","#e0a04a"]},
|
|
27
|
+
"hashicorp": {"label":"Hashicorp","light":["#ededed","#ffffff","#262626","#6c6c6c","#3b3d45","#000000","#9c4a12"],"dark":["#111111","#222222","#f7f7f7","#909090","#444444","#595959","#e0a04a"]},
|
|
28
|
+
"hp": {"label":"HP","light":["#ffffff","#ffffff","#1a1a1a","#818181","#e8e8e8","#024ad8","#b3262b"],"dark":["#0c0c0c","#1d1d1d","#ffffff","#929292","#414141","#5b89e6","#b3262b"]},
|
|
29
|
+
"ibm": {"label":"Ibm","light":["#ffffff","#ffffff","#161616","#7f7f7f","#e0e0e0","#0f62fe","#9c4a12"],"dark":["#0a0a0a","#1b1b1b","#ffffff","#919191","#404040","#6399fe","#e0a04a"]},
|
|
30
|
+
"intercom": {"label":"Intercom","light":["#f5f1ec","#ffffff","#111111","#787674","#d3cec6","#111111","#9c4a12"],"dark":["#080808","#191919","#faf9f6","#8d8d8b","#3d3d3c","#646464","#e0a04a"]},
|
|
31
|
+
"kraken": {"label":"Kraken","light":["#f5f1fe","#ffffff","#020303","#101114","#5741d8","#7132f5","#9c4a12"],"dark":["#010101","#131313","#faf9ff","#8a898d","#383839","#a37af8","#e0a04a"]},
|
|
32
|
+
"lamborghini": {"label":"Lamborghini","light":["#ffc000","#000000","#000000","#000000","#ffc000","#ffc000","#9c4a12"],"dark":["#000000","#121212","#ffe38c","#8c7d4d","#38321f","#ffc000","#e0a04a"]},
|
|
33
|
+
"linear.app": {"label":"Linear.app","light":["#ededed","#ffffff","#252525","#6b6b6b","#23252a","#5e6ad2","#9c4a12"],"dark":["#111111","#222222","#f7f7f7","#909090","#444444","#969ee2","#e0a04a"]},
|
|
34
|
+
"lovable": {"label":"Lovable","light":["#f7f4ed","#f7f4ed","#000000","#1c1c1c","#1c1c1c","#1c1c1c","#9c4a12"],"dark":["#6f6e6b","#797875","#fbfaf7","#cac9c6","#8e8d8a","#6b6b6b","#e0a04a"]},
|
|
35
|
+
"mastercard": {"label":"Mastercard","light":["#f3f0ee","#f3f0ee","#141413","#626160","#141413","#141413","#9c4a12"],"dark":["#090909","#1a1a1a","#faf8f7","#8e8c8c","#3e3e3d","#666666","#e0a04a"]},
|
|
36
|
+
"meta": {"label":"Meta","light":["#ffffff","#f1f4f7","#1c1e21","#8595a4","#ced0d4","#0064e0","#f7b928"],"dark":["#0d0e0f","#1e1f20","#ffffff","#929393","#424344","#599aeb","#f7b928"]},
|
|
37
|
+
"minimax": {"label":"Minimax","light":["#ffffff","#f2f3f5","#0a0a0a","#606060","#e5e7eb","#0a0a0a","#9c4a12"],"dark":["#040404","#161616","#ffffff","#8e8e8e","#3b3b3b","#606060","#e0a04a"]},
|
|
38
|
+
"mintlify": {"label":"Mintlify","light":["#ffffff","#fafafa","#0a0a0a","#606060","#e5e5e5","#0a0a0a","#9c4a12"],"dark":["#040404","#161616","#ffffff","#8e8e8e","#3b3b3b","#606060","#e0a04a"]},
|
|
39
|
+
"miro": {"label":"Miro","light":["#ffffff","#fafbfc","#1c1c1e","#6b6b6d","#e0e2e8","#1c1c1e","#9c4a12"],"dark":["#0d0d0e","#1e1e1f","#ffffff","#929293","#424243","#6b6b6d","#e0a04a"]},
|
|
40
|
+
"mistral.ai": {"label":"Mistral.ai","light":["#ffffff","#fafafa","#1f1f1f","#6d6d6d","#e5e5e5","#fa520f","#9c4a12"],"dark":["#0e0e0e","#1f1f1f","#ffffff","#939393","#434343","#fa520f","#e0a04a"]},
|
|
41
|
+
"mongodb": {"label":"Mongodb","light":["#ffffff","#f4f7f6","#001e2b","#596d75","#e1e5e8","#00ed64","#9c4a12"],"dark":["#000e13","#121f24","#ffffff","#8c9395","#384347","#00ed64","#e0a04a"]},
|
|
42
|
+
"nike": {"label":"Nike","light":["#ffffff","#ffffff","#111111","#707072","#cacacb","#111111","#9c4a12"],"dark":["#080808","#191919","#ffffff","#909090","#3e3e3e","#646464","#e0a04a"]},
|
|
43
|
+
"nintendo-2001": {"label":"Nintendo 2001","light":["#f6f7fa","#ffffff","#050507","#49526d","#5a5f8c","#e60012","#e60012"],"dark":["#020203","#141415","#fbfbfd","#8b8b8c","#39393a","#ef5965","#e60012"]},
|
|
44
|
+
"notion": {"label":"Notion","light":["#ffffff","#fafaf9","#1a1a1a","#6a6a6a","#e5e3df","#5645d4","#9c4a12"],"dark":["#0c0c0c","#1d1d1d","#ffffff","#929292","#414141","#9186e3","#e0a04a"]},
|
|
45
|
+
"nvidia": {"label":"Nvidia","light":["#ffffff","#f7f7f7","#000000","#757575","#cccccc","#76b900","#df6500"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#76b900","#df6500"]},
|
|
46
|
+
"ollama": {"label":"Ollama","light":["#ffffff","#ffffff","#000000","#595959","#e5e5e5","#000000","#9c4a12"],"dark":["#171717","#272727","#ffffff","#979797","#4a4a4a","#595959","#e0a04a"]},
|
|
47
|
+
"opencode.ai": {"label":"Opencode.ai","light":["#fdfcfc","#f1eeee","#201d1d","#646262","#646262","#201d1d","#ff9f0a"],"dark":["#201d1d","#302c2c","#fdfcfc","#9a9898","#514e4e","#6e6c6c","#ff9f0a"]},
|
|
48
|
+
"pinterest": {"label":"Pinterest","light":["#ffffff","#f6f6f3","#000000","#62625b","#dadad3","#e60023","#9e0a0a"],"dark":["#262622","#353531","#ffffff","#9d9d9c","#565653","#ef5970","#9e0a0a"]},
|
|
49
|
+
"playstation": {"label":"Playstation","light":["#f3f3f3","#f5f7fa","#000000","#6d6d6d","#c2c2c2","#0070d1","#c81b3a"],"dark":["#000000","#121314","#ffffff","#8c8c8c","#383838","#59a2e1","#c81b3a"]},
|
|
50
|
+
"posthog": {"label":"Posthog","light":["#eeefe9","#ffffff","#23251d","#6c6e63","#bfc1b7","#f7a501","#9c4a12"],"dark":["#23251d","#32342d","#ffffff","#9c9d99","#53554f","#f7a501","#e0a04a"]},
|
|
51
|
+
"raycast": {"label":"Raycast","light":["#eeeeee","#ffffff","#252525","#6b6b6b","#242728","#ffffff","#9c4a12"],"dark":["#111111","#222222","#ffffff","#949494","#454545","#ffffff","#e0a04a"]},
|
|
52
|
+
"renault": {"label":"Renault","light":["#ffffff","#ffffff","#000000","#666666","#f2f2f2","#ffed00","#f0ad4e"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#ffed00","#f0ad4e"]},
|
|
53
|
+
"replicate": {"label":"Replicate","light":["#f9f7f3","#ffffff","#202020","#646464","#202020","#ea2804","#9c4a12"],"dark":["#202020","#303030","#fcfcfc","#999999","#505050","#ea2804","#e0a04a"]},
|
|
54
|
+
"resend": {"label":"Resend","light":["#ededed","#ffffff","#262626","#6c6c6c","#323333","#fcfdff","#9c4a12"],"dark":["#111111","#222222","#f7f7f7","#909090","#444444","#fcfdff","#e0a04a"]},
|
|
55
|
+
"revolut": {"label":"Revolut","light":["#f4f4f4","#ffffff","#191c1f","#505a63","#191c1f","#494fdf","#9c4a12"],"dark":["#0b0d0e","#1c1e1f","#ffffff","#919293","#414243","#898dea","#e0a04a"]},
|
|
56
|
+
"runwayml": {"label":"Runwayml","light":["#ededed","#ffffff","#000000","#535353","#27272a","#0b6e99","#9c4a12"],"dark":["#000000","#121212","#f7f7f7","#888888","#363636","#60a1bd","#e0a04a"]},
|
|
57
|
+
"sanity": {"label":"Sanity","light":["#eeeeee","#ffffff","#020202","#0b0b0b","#000000","#f36458","#dd0000"],"dark":["#010101","#131313","#f7f7f7","#888888","#373737","#f36458","#dd0000"]},
|
|
58
|
+
"sentry": {"label":"Sentry","light":["#eaeef2","#ffffff","#1f1633","#7a7789","#c1c3cc","#150f23","#9c4a12"],"dark":["#0e0a17","#1f1b27","#f6f7f9","#8e8c93","#413e49","#676370","#e0a04a"]},
|
|
59
|
+
"shopify": {"label":"Shopify","light":["#eaeef2","#ffffff","#000000","#696b6d","#bbbec2","#000000","#9c4a12"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#595959","#e0a04a"]},
|
|
60
|
+
"slack": {"label":"Slack","light":["#ffffff","#ffffff","#1d1d1d","#838383","#e6e6e6","#4a154b","#9c4a12"],"dark":["#0d0d0d","#1e1e1e","#ffffff","#929292","#424242","#89678a","#e0a04a"]},
|
|
61
|
+
"spacex": {"label":"Spacex","light":["#eaeef2","#ffffff","#000000","#696b6d","#bbbec2","#000000","#9c4a12"],"dark":["#000000","#121212","#f6f7f9","#878889","#363637","#595959","#e0a04a"]},
|
|
62
|
+
"spotify": {"label":"Spotify","light":["#eeeeee","#ffffff","#030303","#555555","#4d4d4d","#1ed760","#f3727f"],"dark":["#010101","#131313","#f7f7f7","#888888","#373737","#1ed760","#f3727f"]},
|
|
63
|
+
"starbucks": {"label":"Starbucks","light":["#f2f0eb","#f2f0eb","#1e3932","#687973","#00754a","#cba258","#c82014"],"dark":["#0e1a16","#1f2a26","#f9f8f6","#8f9491","#424b47","#cba258","#c82014"]},
|
|
64
|
+
"stripe": {"label":"Stripe","light":["#ffffff","#ffffff","#0d253d","#7a8794","#e3e8ee","#533afd","#9c4a12"],"dark":["#06111b","#17222b","#ffffff","#8f9498","#3d454d","#8f7ffe","#e0a04a"]},
|
|
65
|
+
"supabase": {"label":"Supabase","light":["#ffffff","#ffffff","#171717","#7f7f7f","#dfdfdf","#3ecf8e","#9c4a12"],"dark":["#0a0a0a","#1b1b1b","#ffffff","#919191","#404040","#3ecf8e","#e0a04a"]},
|
|
66
|
+
"superhuman": {"label":"Superhuman","light":["#ffffff","#ffffff","#292827","#898988","#e8e4dd","#1b1938","#9c4a12"],"dark":["#121212","#232323","#ffffff","#949494","#464646","#6b6a7e","#e0a04a"]},
|
|
67
|
+
"tesla": {"label":"Tesla","light":["#f1f5fd","#ffffff","#091022","#3e6ae1","#3e6ae1","#3e6ae1","#9c4a12"],"dark":["#04070f","#161820","#f9fafe","#8b8d92","#3a3c44","#829eec","#e0a04a"]},
|
|
68
|
+
"theverge": {"label":"Theverge","light":["#eeeeee","#ffffff","#030303","#131313","#ffffff","#131313","#5200ff"],"dark":["#010101","#131313","#f7f7f7","#888888","#373737","#666666","#5200ff"]},
|
|
69
|
+
"together.ai": {"label":"Together.ai","light":["#ffffff","#ffffff","#000000","#959494","#959494","#000000","#9c4a12"],"dark":["#313641","#3f444e","#ffffff","#a2a5aa","#5e626b","#595959","#e0a04a"]},
|
|
70
|
+
"uber": {"label":"Uber","light":["#ffffff","#ffffff","#000000","#595959","#cccccc","#000000","#9c4a12"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#595959","#e0a04a"]},
|
|
71
|
+
"vercel": {"label":"Vercel","light":["#ffffff","#ffffff","#171717","#888888","#ebebeb","#171717","#f5a623"],"dark":["#0a0a0a","#1b1b1b","#ffffff","#919191","#404040","#686868","#f5a623"]},
|
|
72
|
+
"vodafone": {"label":"Vodafone","light":["#ffffff","#ffffff","#25282b","#717375","#d3d4d5","#e60000","#9c4a12"],"dark":["#111213","#222324","#ffffff","#949495","#454647","#ef5959","#e0a04a"]},
|
|
73
|
+
"voltagent": {"label":"Voltagent","light":["#eeeeee","#ffffff","#242424","#6b6b6b","#3d3a39","#00d992","#9c4a12"],"dark":["#101010","#212121","#f7f7f7","#8f8f8f","#434343","#00d992","#e0a04a"]},
|
|
74
|
+
"warp": {"label":"Warp","light":["#f0f0f0","#ffffff","#252524","#6c6c6b","#3f3a36","#f7f5f0","#9c4a12"],"dark":["#111110","#222221","#f8f8f8","#909090","#444443","#f7f5f0","#e0a04a"]},
|
|
75
|
+
"webflow": {"label":"Webflow","light":["#ffffff","#ffffff","#080808","#898989","#d8d8d8","#080808","#9c4a12"],"dark":["#040404","#161616","#ffffff","#8e8e8e","#3b3b3b","#5e5e5e","#e0a04a"]},
|
|
76
|
+
"wired": {"label":"Wired","light":["#ffffff","#ffffff","#000000","#757575","#e0e0e0","#000000","#9c4a12"],"dark":["#000000","#121212","#ffffff","#8c8c8c","#383838","#595959","#e0a04a"]},
|
|
77
|
+
"wise": {"label":"Wise","light":["#ffffff","#ffffff","#0e0f0c","#868685","#cfcfce","#9fe870","#ffd11a"],"dark":["#060705","#171816","#ffffff","#8f8f8e","#3d3e3c","#9fe870","#ffd11a"]},
|
|
78
|
+
"x.ai": {"label":"X.ai","light":["#eeeeee","#ffffff","#262626","#7d8187","#212327","#ffffff","#9c4a12"],"dark":["#111111","#222222","#f7f7f7","#909090","#444444","#ffffff","#e0a04a"]},
|
|
79
|
+
"zapier": {"label":"Zapier","light":["#fffefb","#ffffff","#201515","#6e6766","#d2cfcd","#ff4f00","#9c4a12"],"dark":["#0e0909","#1f1a1a","#fffffd","#93908f","#433f3f","#ff4f00","#e0a04a"]}
|
|
80
|
+
}
|
|
81
|
+
}
|