Gopeed File Category Icons
Maintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter IconData pipeline.
The canonical editable materials live in design/file-category-icons/ as tooling-only sources inside the Flutter project. Read its README.md before changing any source. Do not add that directory to Flutter assets.
Classification grammar
- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.
- A non-directory is always a file outline plus its classification mark.
- An unknown file is an empty file outline. Do not invent a generic interior mark.
- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.
- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.
Workflow
- Read
design/file-category-icons/README.md, then inspect its manifest, the classification mapping, real task-card size, and file-tree size. Read references/style-guide.md for every visual revision.
- Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.
- Create 24×24 SVG sources containing only closed, filled
<path> geometry. Convert strokes and lettering to paths; never leave <text>, live strokes, masks, clipping, filters, or external references.
- Keep every decorated mark inside the documented safe area. Reject any mark that touches or visually merges with the shell at 16 or 20 px.
- Preserve existing names and codepoints. Omit the codepoint only for a new category, then allocate it with the builder. Bump the font version for a visual revision.
- Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.
- Inspect 16, 20, 24, and 32 px in light and dark swatches. Check the actual Flutter task card and task-detail file tree when their sizes differ from the sheet.
- Run the relevant classification tests,
flutter analyze, and flutter test after integration changes.
Tool setup
The scripts require the pinned packages in scripts/requirements.txt. Keep the environment local and untracked:
python3 -m venv .agent/skills/gopeed-file-category-icons/.venv
.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt
Build and preview a manifest:
.agent/skills/gopeed-file-category-icons/.venv/bin/python .agent/skills/gopeed-file-category-icons/scripts/build_icon_font.py --manifest design/file-category-icons/manifest.json --allocate-codepoints
.agent/skills/gopeed-file-category-icons/.venv/bin/python .agent/skills/gopeed-file-category-icons/scripts/preview_icon_font.py --manifest design/file-category-icons/manifest.json
Use assets/manifest.example.json and assets/folder-symbol-template.svg only as structural starting points.
Invariants
- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.
design/file-category-icons/ is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.
- Never add the design-material directory to
pubspec.yaml; it must remain outside the packaged Flutter asset graph.
- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.
- Keep icon names lowercase
snake_case; the generator emits lowerCamelCase Dart fields.
- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.
- Prefer a recognizable classification symbol over lettering. If lettering is necessary, convert it to geometry and prove it remains legible at 16 px; PDF-like multi-letter marks need deliberate spacing rather than scaling text into the available area.
- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.
- Rebuild the complete font after every source change so all platforms consume the same binary.
1---2name: gopeed-file-category-icons3description: Design or revise Gopeed file-classification icons as one cohesive SVG-to-Flutter icon font. Use for file types, generic and protocol-marked folders, unknown files, and extension-to-icon taxonomy; do not use for launcher, navigation, action, or status icons.4---56# Gopeed File Category Icons78Maintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter `IconData` pipeline.910The canonical editable materials live in `design/file-category-icons/` as tooling-only sources inside the Flutter project. Read its `README.md` before changing any source. Do not add that directory to Flutter assets.1112## Classification grammar1314- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.15- A non-directory is always a file outline plus its classification mark.16- An unknown file is an empty file outline. Do not invent a generic interior mark.17- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.18- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.1920## Workflow21221. Read `design/file-category-icons/README.md`, then inspect its manifest, the classification mapping, real task-card size, and file-tree size. Read [references/style-guide.md](references/style-guide.md) for every visual revision.232. Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.243. Create 24×24 SVG sources containing only closed, filled `<path>` geometry. Convert strokes and lettering to paths; never leave `<text>`, live strokes, masks, clipping, filters, or external references.254. Keep every decorated mark inside the documented safe area. Reject any mark that touches or visually merges with the shell at 16 or 20 px.265. Preserve existing names and codepoints. Omit the codepoint only for a new category, then allocate it with the builder. Bump the font version for a visual revision.276. Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.287. Inspect 16, 20, 24, and 32 px in light and dark swatches. Check the actual Flutter task card and task-detail file tree when their sizes differ from the sheet.298. Run the relevant classification tests, `flutter analyze`, and `flutter test` after integration changes.3031## Tool setup3233The scripts require the pinned packages in `scripts/requirements.txt`. Keep the environment local and untracked:3435```bash36python3 -m venv .agent/skills/gopeed-file-category-icons/.venv37.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt38```3940Build and preview a manifest:4142```bash43.agent/skills/gopeed-file-category-icons/.venv/bin/python .agent/skills/gopeed-file-category-icons/scripts/build_icon_font.py --manifest design/file-category-icons/manifest.json --allocate-codepoints44.agent/skills/gopeed-file-category-icons/.venv/bin/python .agent/skills/gopeed-file-category-icons/scripts/preview_icon_font.py --manifest design/file-category-icons/manifest.json45```4647Use [assets/manifest.example.json](assets/manifest.example.json) and [assets/folder-symbol-template.svg](assets/folder-symbol-template.svg) only as structural starting points.4849## Invariants5051- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.52- `design/file-category-icons/` is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.53- Never add the design-material directory to `pubspec.yaml`; it must remain outside the packaged Flutter asset graph.54- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.55- Keep icon names lowercase `snake_case`; the generator emits lowerCamelCase Dart fields.56- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.57- Prefer a recognizable classification symbol over lettering. If lettering is necessary, convert it to geometry and prove it remains legible at 16 px; PDF-like multi-letter marks need deliberate spacing rather than scaling text into the available area.58- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.59- Rebuild the complete font after every source change so all platforms consume the same binary.