graph-colorize — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited graph-colorize (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are rewriting $OBSIDIAN_VAULT_PATH/.obsidian/graph.json so Obsidian's graph view tints nodes by tag, folder, or visibility.
Obsidian stores graph settings in <vault>/.obsidian/graph.json. The colorGroups array is a list of {query, color} pairs; the first matching query wins per node. Queries use Obsidian's search syntax: tag:#foo, path:"concepts", file:foo, etc. Color is {"a": 1, "rgb": <packed-int>} where the int is (R << 16) | (G << 8) | B.
llm-wiki/SKILL.md (walk up CWD for .env → ~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH.$OBSIDIAN_VAULT_PATH/.obsidian/ exists. If it doesn't, the vault has never been opened in Obsidian — tell the user to open the vault once in Obsidian, then re-run.graph.json on close. Tell them to close the vault first, or be ready to reload (Cmd/Ctrl+R) and not touch the graph settings until they reload.Infer the mode from the user's phrasing. If ambiguous, default to by-tag.
| User intent | Mode |
|---|---|
| "color by tag", "color my graph", "make it colorful" (default) | by-tag |
| "color by folder", "color by category", "color by directory" | by-category |
| "highlight visibility", "show internal/pii in graph", "visibility colors" | by-visibility |
User provides explicit mapping (tag:#foo = red, or JSON blob) | custom |
| "combine tag and visibility" / "both" | combined (visibility first, then tag) |
colorGroups ArrayUse in order. If more groups than colors, cycle and add a lightness shift by dividing brightness ~20% via a second pass — or just cap at 10 and tell the user the remaining tags share the "other" color.
| # | Hex | rgb (packed int) | Role |
|---|---|---|---|
| 0 | #4E79A7 | 5142951 | blue |
| 1 | #F28E2B | 15896107 | orange |
| 2 | #E15759 | 14767961 | red |
| 3 | #76B7B2 | 7780786 | teal |
| 4 | #59A14F | 5873999 | green |
| 5 | #EDC948 | 15583048 | yellow |
| 6 | #B07AA1 | 11565217 | purple |
| 7 | #FF9DA7 | 16751527 | pink |
| 8 | #9C755F | 10253663 | brown |
| 9 | #BAB0AC | 12234924 | gray |
Every color is wrapped as {"a": 1, "rgb": <int>}.
by-tag$VAULT_PATH/**/*.md excluding _archives/, _raw/, .obsidian/, node_modules/, index.md, log.md, _insights.md.tags from each page. Count usage per tag. tags** from the frequency list — they are reserved system tags, handled only in by-visibility or combined` mode.T at index i: emit {"query": "tag:#T", "color": palette[i]}.{"query": "-[\"tag\":]", "color": palette[9]} — skip if color slot 9 is already taken by a real tag.by-categoryUse the seven vault top-level folders in this fixed order so colors are stable across runs:
| Folder | Color index |
|---|---|
concepts | 0 (blue) |
entities | 1 (orange) |
skills | 2 (red) |
references | 3 (teal) |
synthesis | 4 (green) |
projects | 5 (yellow) |
journal | 6 (purple) |
Emit one entry per folder that exists AND contains at least one .md file. Each entry is:
{"query": "path:\"<folder>\"", "color": {"a": 1, "rgb": <int>}}by-visibilityEmit exactly three entries, in this order (first-match wins, so most restrictive comes first):
visibility/pii → #E15759 (red, rgb 14767961)visibility/internal → #F28E2B (orange, rgb 15896107)visibility/public → #59A14F (green, rgb 5873999){"query": "tag:#visibility/pii", "color": {"a": 1, "rgb": 14767961}}Pages with no visibility/ tag remain Obsidian's default color — do not add a catch-all.
combinedEmit by-visibility entries first, then by-tag entries. Visibility wins on conflict because it appears first in the list.
customIf the user gave explicit mappings, honor them literally. Convert any hex they give (e.g. #FF00FF) to packed int using int(hex_without_hash, 16). Wrap each as {"a": 1, "rgb": <int>}.
$VAULT_PATH/.obsidian/graph.json. If it doesn't exist, start from this minimal default: {
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": false,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}.obsidian/graph.json.backup-<YYYYMMDD-HHMM> before writing. If a backup from the same minute exists, reuse it — don't pile up duplicates.colorGroups field with your new array. Leave every other field untouched. This preserves the user's zoom, physics, filter, search, and display preferences.Print a summary like:
Graph colorized → .obsidian/graph.json
Mode: by-tag
Groups: 7 color assignments
Palette: blue, orange, red, teal, green, yellow, purple
Backup: .obsidian/graph.json.backup-20260424-1432
Reload Obsidian (Cmd/Ctrl+R) to see the new colors.
If Obsidian is currently open, close it first OR reload immediately — Obsidian
overwrites graph.json on close and can erase these changes.Append to $VAULT_PATH/log.md:
- [TIMESTAMP] GRAPH_COLORIZE mode=<mode> groups=<N> backup=graph.json.backup-<stamp>by-tag mode → fall back to by-category and tell the user.graph.json.backup-* and note that in log.md.colorGroups: [], back up, log as GRAPH_COLORIZE mode=clear..obsidian/ yourself — Obsidian populates many files there on first open.path:"my folder"); tags with nested slashes work literally (tag:#visibility/internal); don't URL-encode.colorGroups is rewritten.combined mode or ask before overwriting.wiki-export's graph.html community colors, so the Obsidian graph and the exported visualization look consistent.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.