{"owner":"GopeedLab","repo":"gopeed","hasSkills":true,"totalSkillsCount":4,"totalTokensCount":1897,"categories":["anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md","ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml","ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json","ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md"],"skills":{"ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md":"---\nname: gopeed-file-category-icons\ndescription: 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.\n---\n\n# Gopeed File Category Icons\n\nMaintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter `IconData` pipeline.\n\nThe 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.\n\n## Classification grammar\n\n- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.\n- A non-directory is always a file outline plus its classification mark.\n- An unknown file is an empty file outline. Do not invent a generic interior mark.\n- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.\n- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.\n\n## Workflow\n\n1. 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.\n2. Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.\n3. 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.\n4. 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.\n5. 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.\n6. Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.\n7. 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.\n8. Run the relevant classification tests, `flutter analyze`, and `flutter test` after integration changes.\n\n## Tool setup\n\nThe scripts require the pinned packages in `scripts/requirements.txt`. Keep the environment local and untracked:\n\n```bash\npython3 -m venv .agent/skills/gopeed-file-category-icons/.venv\n.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt\n```\n\nBuild and preview a manifest:\n\n```bash\n.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\n.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\n```\n\nUse [assets/manifest.example.json](assets/manifest.example.json) and [assets/folder-symbol-template.svg](assets/folder-symbol-template.svg) only as structural starting points.\n\n## Invariants\n\n- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.\n- `design/file-category-icons/` is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.\n- Never add the design-material directory to `pubspec.yaml`; it must remain outside the packaged Flutter asset graph.\n- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.\n- Keep icon names lowercase `snake_case`; the generator emits lowerCamelCase Dart fields.\n- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.\n- 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.\n- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.\n- Rebuild the complete font after every source change so all platforms consume the same binary.\n","ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml":"interface:\n  display_name: \"Gopeed File Category Icons\"\n  short_description: \"Design cohesive Gopeed file-classification icons\"\n  default_prompt: \"Use $gopeed-file-category-icons to update the source materials and regenerate a consistent Gopeed file-category icon.\"\n","ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json":"{\n  \"fontFamily\": \"GopeedIcons\",\n  \"fontOutput\": \"../.build/GopeedIcons.ttf\",\n  \"dartOutput\": \"../.build/gopeed_icons.dart\",\n  \"previewOutput\": \"../.build/gopeed_icons_preview.png\",\n  \"dartClass\": \"GopeedIcons\",\n  \"codepointStart\": \"0xE900\",\n  \"unitsPerEm\": 1024,\n  \"ascent\": 896,\n  \"descent\": -128,\n  \"padding\": 0,\n  \"version\": \"1.0.0\",\n  \"icons\": [\n    {\n      \"name\": \"file_category_template\",\n      \"source\": \"folder-symbol-template.svg\",\n      \"codepoint\": \"0xE900\"\n    }\n  ]\n}\n","ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md":"# Gopeed file-category icon style\n\n## Composition\n\n- Unknown file: empty file shell.\n- Known file: file shell plus one classification mark.\n- Generic folder: empty folder shell.\n- Known or protocol folder: folder shell plus one classification mark.\n- Status and actions never belong inside a classification glyph.\n\n## Geometry\n\n- Use a `0 0 24 24` viewBox and keep the optical drawing inside `2…22` on both axes.\n- Use the current shared shell as the source of truth. The established file shell spans roughly `x=3…21` with a 1.5-unit outline; do not silently introduce a heavier one-off border.\n- Keep decorated marks approximately inside `x=6.2…17.8` and `y=9.2…19`. Preserve at least 1.5 units of visible separation from the shell wherever its interior edge is closer.\n- Prefer radii around 1.5–2 units, consistent terminal shapes, and simple silhouettes. Avoid details or gaps below 1.25 units.\n- Center by optical mass rather than bounding-box arithmetic when the shape has a tab, arrow, or asymmetric label.\n- Use non-zero winding for counters and holes; reverse inner-contour direction where a cutout is required.\n\n## Classification marks\n\n- Use one dominant mark, not several miniature objects.\n- Prefer semantic geometry: play for video, note for audio, image silhouette for images, grid for spreadsheets, a zipper for archive/compressed files, and a cylinder for databases.\n- Avoid lettering when a semantic mark is clearer. When a conventional label such as PDF is retained, build each letter as filled geometry with at least 1.25-unit stems and explicit inter-letter gaps.\n- Keep an empty file truly empty. A question mark, star, or extension text changes its meaning.\n\n## Protocol-marked folders\n\n- Keep the folder silhouette recognizable before adding the protocol symbol.\n- Place a simple filled protocol symbol in the lower folder body with clear space from every edge.\n- Prefer semantic marks such as a magnet/swarm for BitTorrent or a donkey/server-network mark for ED2K. Do not default to acronym lettering.\n- Let the visible folder occupy about 80–85% of the 24-unit canvas. Avoid adding generator padding on top of the SVG optical margin; double padding makes Flutter icons look undersized.\n- Compare optical center and occupied area against Flutter's `folder_outlined` at the actual widget size, not only in an enlarged preview.\n\n## Consistency checks\n\n- Compare new icons beside at least one existing folder icon and one file-type icon.\n- Inspect the generated contact sheet at 16, 20, 24, and 32 px on light and dark swatches.\n- Reject icons that depend on color, contain live text/strokes, have inconsistent baseline/weight, drift off center, become ambiguous at 16 px, or leave less than the shared safe-area separation from the shell.\n- Compare decorated icons against both empty shells. Interior marks must not make the shell look heavier by merging into its border.\n\n## Flutter usage\n\nRegister the generated TTF under `flutter.fonts` using the exact `fontFamily` from the manifest. Use the generated Dart constants rather than raw codepoints. Render icon-font glyphs with `Icon`; do not use `Text` because icon sizing and semantics should follow Flutter's icon pipeline.\n"},"files":{"ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md":"---\nname: gopeed-file-category-icons\ndescription: 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.\n---\n\n# Gopeed File Category Icons\n\nMaintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter `IconData` pipeline.\n\nThe 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.\n\n## Classification grammar\n\n- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.\n- A non-directory is always a file outline plus its classification mark.\n- An unknown file is an empty file outline. Do not invent a generic interior mark.\n- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.\n- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.\n\n## Workflow\n\n1. 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.\n2. Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.\n3. 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.\n4. 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.\n5. 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.\n6. Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.\n7. 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.\n8. Run the relevant classification tests, `flutter analyze`, and `flutter test` after integration changes.\n\n## Tool setup\n\nThe scripts require the pinned packages in `scripts/requirements.txt`. Keep the environment local and untracked:\n\n```bash\npython3 -m venv .agent/skills/gopeed-file-category-icons/.venv\n.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt\n```\n\nBuild and preview a manifest:\n\n```bash\n.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\n.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\n```\n\nUse [assets/manifest.example.json](assets/manifest.example.json) and [assets/folder-symbol-template.svg](assets/folder-symbol-template.svg) only as structural starting points.\n\n## Invariants\n\n- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.\n- `design/file-category-icons/` is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.\n- Never add the design-material directory to `pubspec.yaml`; it must remain outside the packaged Flutter asset graph.\n- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.\n- Keep icon names lowercase `snake_case`; the generator emits lowerCamelCase Dart fields.\n- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.\n- 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.\n- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.\n- Rebuild the complete font after every source change so all platforms consume the same binary.\n","ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml":"interface:\n  display_name: \"Gopeed File Category Icons\"\n  short_description: \"Design cohesive Gopeed file-classification icons\"\n  default_prompt: \"Use $gopeed-file-category-icons to update the source materials and regenerate a consistent Gopeed file-category icon.\"\n","ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json":"{\n  \"fontFamily\": \"GopeedIcons\",\n  \"fontOutput\": \"../.build/GopeedIcons.ttf\",\n  \"dartOutput\": \"../.build/gopeed_icons.dart\",\n  \"previewOutput\": \"../.build/gopeed_icons_preview.png\",\n  \"dartClass\": \"GopeedIcons\",\n  \"codepointStart\": \"0xE900\",\n  \"unitsPerEm\": 1024,\n  \"ascent\": 896,\n  \"descent\": -128,\n  \"padding\": 0,\n  \"version\": \"1.0.0\",\n  \"icons\": [\n    {\n      \"name\": \"file_category_template\",\n      \"source\": \"folder-symbol-template.svg\",\n      \"codepoint\": \"0xE900\"\n    }\n  ]\n}\n","ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md":"# Gopeed file-category icon style\n\n## Composition\n\n- Unknown file: empty file shell.\n- Known file: file shell plus one classification mark.\n- Generic folder: empty folder shell.\n- Known or protocol folder: folder shell plus one classification mark.\n- Status and actions never belong inside a classification glyph.\n\n## Geometry\n\n- Use a `0 0 24 24` viewBox and keep the optical drawing inside `2…22` on both axes.\n- Use the current shared shell as the source of truth. The established file shell spans roughly `x=3…21` with a 1.5-unit outline; do not silently introduce a heavier one-off border.\n- Keep decorated marks approximately inside `x=6.2…17.8` and `y=9.2…19`. Preserve at least 1.5 units of visible separation from the shell wherever its interior edge is closer.\n- Prefer radii around 1.5–2 units, consistent terminal shapes, and simple silhouettes. Avoid details or gaps below 1.25 units.\n- Center by optical mass rather than bounding-box arithmetic when the shape has a tab, arrow, or asymmetric label.\n- Use non-zero winding for counters and holes; reverse inner-contour direction where a cutout is required.\n\n## Classification marks\n\n- Use one dominant mark, not several miniature objects.\n- Prefer semantic geometry: play for video, note for audio, image silhouette for images, grid for spreadsheets, a zipper for archive/compressed files, and a cylinder for databases.\n- Avoid lettering when a semantic mark is clearer. When a conventional label such as PDF is retained, build each letter as filled geometry with at least 1.25-unit stems and explicit inter-letter gaps.\n- Keep an empty file truly empty. A question mark, star, or extension text changes its meaning.\n\n## Protocol-marked folders\n\n- Keep the folder silhouette recognizable before adding the protocol symbol.\n- Place a simple filled protocol symbol in the lower folder body with clear space from every edge.\n- Prefer semantic marks such as a magnet/swarm for BitTorrent or a donkey/server-network mark for ED2K. Do not default to acronym lettering.\n- Let the visible folder occupy about 80–85% of the 24-unit canvas. Avoid adding generator padding on top of the SVG optical margin; double padding makes Flutter icons look undersized.\n- Compare optical center and occupied area against Flutter's `folder_outlined` at the actual widget size, not only in an enlarged preview.\n\n## Consistency checks\n\n- Compare new icons beside at least one existing folder icon and one file-type icon.\n- Inspect the generated contact sheet at 16, 20, 24, and 32 px on light and dark swatches.\n- Reject icons that depend on color, contain live text/strokes, have inconsistent baseline/weight, drift off center, become ambiguous at 16 px, or leave less than the shared safe-area separation from the shell.\n- Compare decorated icons against both empty shells. Interior marks must not make the shell look heavier by merging into its border.\n\n## Flutter usage\n\nRegister the generated TTF under `flutter.fonts` using the exact `fontFamily` from the manifest. Use the generated Dart constants rather than raw codepoints. Render icon-font glyphs with `Icon`; do not use `Text` because icon sizing and semantics should follow Flutter's icon pipeline.\n"},"items":[{"name":"openai.yaml","path":"ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml","rawUrl":"https://raw.githubusercontent.com/GopeedLab/gopeed/HEAD/ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml","title":"Agents Skill","category":"anthropic-skill","format":"yaml","content":"interface:\n  display_name: \"Gopeed File Category Icons\"\n  short_description: \"Design cohesive Gopeed file-classification icons\"\n  default_prompt: \"Use $gopeed-file-category-icons to update the source materials and regenerate a consistent Gopeed file-category icon.\"\n","isInternal":false,"tokens":58,"sizeBytes":266},{"name":"manifest.example.json","path":"ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json","rawUrl":"https://raw.githubusercontent.com/GopeedLab/gopeed/HEAD/ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json","title":"Assets Skill","category":"anthropic-skill","format":"json","content":"{\n  \"fontFamily\": \"GopeedIcons\",\n  \"fontOutput\": \"../.build/GopeedIcons.ttf\",\n  \"dartOutput\": \"../.build/gopeed_icons.dart\",\n  \"previewOutput\": \"../.build/gopeed_icons_preview.png\",\n  \"dartClass\": \"GopeedIcons\",\n  \"codepointStart\": \"0xE900\",\n  \"unitsPerEm\": 1024,\n  \"ascent\": 896,\n  \"descent\": -128,\n  \"padding\": 0,\n  \"version\": \"1.0.0\",\n  \"icons\": [\n    {\n      \"name\": \"file_category_template\",\n      \"source\": \"folder-symbol-template.svg\",\n      \"codepoint\": \"0xE900\"\n    }\n  ]\n}\n","frontmatter":{"fontFamily":"GopeedIcons","fontOutput":"../.build/GopeedIcons.ttf","dartOutput":"../.build/gopeed_icons.dart","previewOutput":"../.build/gopeed_icons_preview.png","dartClass":"GopeedIcons","codepointStart":"0xE900","unitsPerEm":1024,"ascent":896,"descent":-128,"padding":0,"version":"1.0.0","icons":[{"name":"file_category_template","source":"folder-symbol-template.svg","codepoint":"0xE900"}]},"isInternal":false,"tokens":162,"sizeBytes":483},{"name":"style-guide.md","path":"ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md","rawUrl":"https://raw.githubusercontent.com/GopeedLab/gopeed/HEAD/ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Gopeed file-category icon style\n\n## Composition\n\n- Unknown file: empty file shell.\n- Known file: file shell plus one classification mark.\n- Generic folder: empty folder shell.\n- Known or protocol folder: folder shell plus one classification mark.\n- Status and actions never belong inside a classification glyph.\n\n## Geometry\n\n- Use a `0 0 24 24` viewBox and keep the optical drawing inside `2…22` on both axes.\n- Use the current shared shell as the source of truth. The established file shell spans roughly `x=3…21` with a 1.5-unit outline; do not silently introduce a heavier one-off border.\n- Keep decorated marks approximately inside `x=6.2…17.8` and `y=9.2…19`. Preserve at least 1.5 units of visible separation from the shell wherever its interior edge is closer.\n- Prefer radii around 1.5–2 units, consistent terminal shapes, and simple silhouettes. Avoid details or gaps below 1.25 units.\n- Center by optical mass rather than bounding-box arithmetic when the shape has a tab, arrow, or asymmetric label.\n- Use non-zero winding for counters and holes; reverse inner-contour direction where a cutout is required.\n\n## Classification marks\n\n- Use one dominant mark, not several miniature objects.\n- Prefer semantic geometry: play for video, note for audio, image silhouette for images, grid for spreadsheets, a zipper for archive/compressed files, and a cylinder for databases.\n- Avoid lettering when a semantic mark is clearer. When a conventional label such as PDF is retained, build each letter as filled geometry with at least 1.25-unit stems and explicit inter-letter gaps.\n- Keep an empty file truly empty. A question mark, star, or extension text changes its meaning.\n\n## Protocol-marked folders\n\n- Keep the folder silhouette recognizable before adding the protocol symbol.\n- Place a simple filled protocol symbol in the lower folder body with clear space from every edge.\n- Prefer semantic marks such as a magnet/swarm for BitTorrent or a donkey/server-network mark for ED2K. Do not default to acronym lettering.\n- Let the visible folder occupy about 80–85% of the 24-unit canvas. Avoid adding generator padding on top of the SVG optical margin; double padding makes Flutter icons look undersized.\n- Compare optical center and occupied area against Flutter's `folder_outlined` at the actual widget size, not only in an enlarged preview.\n\n## Consistency checks\n\n- Compare new icons beside at least one existing folder icon and one file-type icon.\n- Inspect the generated contact sheet at 16, 20, 24, and 32 px on light and dark swatches.\n- Reject icons that depend on color, contain live text/strokes, have inconsistent baseline/weight, drift off center, become ambiguous at 16 px, or leave less than the shared safe-area separation from the shell.\n- Compare decorated icons against both empty shells. Interior marks must not make the shell look heavier by merging into its border.\n\n## Flutter usage\n\nRegister the generated TTF under `flutter.fonts` using the exact `fontFamily` from the manifest. Use the generated Dart constants rather than raw codepoints. Render icon-font glyphs with `Icon`; do not use `Text` because icon sizing and semantics should follow Flutter's icon pipeline.\n","isInternal":false,"tokens":699,"sizeBytes":3211},{"name":"SKILL.md","path":"ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md","rawUrl":"https://raw.githubusercontent.com/GopeedLab/gopeed/HEAD/ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md","title":"gopeed-file-category-icons","category":"anthropic-skill","format":"markdown","content":"---\nname: gopeed-file-category-icons\ndescription: 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.\n---\n\n# Gopeed File Category Icons\n\nMaintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter `IconData` pipeline.\n\nThe 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.\n\n## Classification grammar\n\n- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.\n- A non-directory is always a file outline plus its classification mark.\n- An unknown file is an empty file outline. Do not invent a generic interior mark.\n- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.\n- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.\n\n## Workflow\n\n1. 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.\n2. Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.\n3. 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.\n4. 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.\n5. 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.\n6. Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.\n7. 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.\n8. Run the relevant classification tests, `flutter analyze`, and `flutter test` after integration changes.\n\n## Tool setup\n\nThe scripts require the pinned packages in `scripts/requirements.txt`. Keep the environment local and untracked:\n\n```bash\npython3 -m venv .agent/skills/gopeed-file-category-icons/.venv\n.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt\n```\n\nBuild and preview a manifest:\n\n```bash\n.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\n.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\n```\n\nUse [assets/manifest.example.json](assets/manifest.example.json) and [assets/folder-symbol-template.svg](assets/folder-symbol-template.svg) only as structural starting points.\n\n## Invariants\n\n- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.\n- `design/file-category-icons/` is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.\n- Never add the design-material directory to `pubspec.yaml`; it must remain outside the packaged Flutter asset graph.\n- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.\n- Keep icon names lowercase `snake_case`; the generator emits lowerCamelCase Dart fields.\n- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.\n- 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.\n- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.\n- Rebuild the complete font after every source change so all platforms consume the same binary.\n","frontmatter":{"name":"gopeed-file-category-icons","description":"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."},"isInternal":false,"tokens":978,"sizeBytes":4659}],"systemPromptSnippet":"<yakaai_skills repo=\"GopeedLab/gopeed\">\n<!-- File: ui/flutter/.agent/skills/gopeed-file-category-icons/agents/openai.yaml (Tokens: ~58 | Category: anthropic-skill) -->\ninterface:\n  display_name: \"Gopeed File Category Icons\"\n  short_description: \"Design cohesive Gopeed file-classification icons\"\n  default_prompt: \"Use $gopeed-file-category-icons to update the source materials and regenerate a consistent Gopeed file-category icon.\"\n\n<!-- File: ui/flutter/.agent/skills/gopeed-file-category-icons/assets/manifest.example.json (Tokens: ~162 | Category: anthropic-skill) -->\n{\n  \"fontFamily\": \"GopeedIcons\",\n  \"fontOutput\": \"../.build/GopeedIcons.ttf\",\n  \"dartOutput\": \"../.build/gopeed_icons.dart\",\n  \"previewOutput\": \"../.build/gopeed_icons_preview.png\",\n  \"dartClass\": \"GopeedIcons\",\n  \"codepointStart\": \"0xE900\",\n  \"unitsPerEm\": 1024,\n  \"ascent\": 896,\n  \"descent\": -128,\n  \"padding\": 0,\n  \"version\": \"1.0.0\",\n  \"icons\": [\n    {\n      \"name\": \"file_category_template\",\n      \"source\": \"folder-symbol-template.svg\",\n      \"codepoint\": \"0xE900\"\n    }\n  ]\n}\n\n<!-- File: ui/flutter/.agent/skills/gopeed-file-category-icons/references/style-guide.md (Tokens: ~699 | Category: anthropic-skill) -->\n# Gopeed file-category icon style\n\n## Composition\n\n- Unknown file: empty file shell.\n- Known file: file shell plus one classification mark.\n- Generic folder: empty folder shell.\n- Known or protocol folder: folder shell plus one classification mark.\n- Status and actions never belong inside a classification glyph.\n\n## Geometry\n\n- Use a `0 0 24 24` viewBox and keep the optical drawing inside `2…22` on both axes.\n- Use the current shared shell as the source of truth. The established file shell spans roughly `x=3…21` with a 1.5-unit outline; do not silently introduce a heavier one-off border.\n- Keep decorated marks approximately inside `x=6.2…17.8` and `y=9.2…19`. Preserve at least 1.5 units of visible separation from the shell wherever its interior edge is closer.\n- Prefer radii around 1.5–2 units, consistent terminal shapes, and simple silhouettes. Avoid details or gaps below 1.25 units.\n- Center by optical mass rather than bounding-box arithmetic when the shape has a tab, arrow, or asymmetric label.\n- Use non-zero winding for counters and holes; reverse inner-contour direction where a cutout is required.\n\n## Classification marks\n\n- Use one dominant mark, not several miniature objects.\n- Prefer semantic geometry: play for video, note for audio, image silhouette for images, grid for spreadsheets, a zipper for archive/compressed files, and a cylinder for databases.\n- Avoid lettering when a semantic mark is clearer. When a conventional label such as PDF is retained, build each letter as filled geometry with at least 1.25-unit stems and explicit inter-letter gaps.\n- Keep an empty file truly empty. A question mark, star, or extension text changes its meaning.\n\n## Protocol-marked folders\n\n- Keep the folder silhouette recognizable before adding the protocol symbol.\n- Place a simple filled protocol symbol in the lower folder body with clear space from every edge.\n- Prefer semantic marks such as a magnet/swarm for BitTorrent or a donkey/server-network mark for ED2K. Do not default to acronym lettering.\n- Let the visible folder occupy about 80–85% of the 24-unit canvas. Avoid adding generator padding on top of the SVG optical margin; double padding makes Flutter icons look undersized.\n- Compare optical center and occupied area against Flutter's `folder_outlined` at the actual widget size, not only in an enlarged preview.\n\n## Consistency checks\n\n- Compare new icons beside at least one existing folder icon and one file-type icon.\n- Inspect the generated contact sheet at 16, 20, 24, and 32 px on light and dark swatches.\n- Reject icons that depend on color, contain live text/strokes, have inconsistent baseline/weight, drift off center, become ambiguous at 16 px, or leave less than the shared safe-area separation from the shell.\n- Compare decorated icons against both empty shells. Interior marks must not make the shell look heavier by merging into its border.\n\n## Flutter usage\n\nRegister the generated TTF under `flutter.fonts` using the exact `fontFamily` from the manifest. Use the generated Dart constants rather than raw codepoints. Render icon-font glyphs with `Icon`; do not use `Text` because icon sizing and semantics should follow Flutter's icon pipeline.\n\n<!-- File: ui/flutter/.agent/skills/gopeed-file-category-icons/SKILL.md (Tokens: ~978 | Category: anthropic-skill) -->\n---\nname: gopeed-file-category-icons\ndescription: 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.\n---\n\n# Gopeed File Category Icons\n\nMaintain Gopeed's file-classification visual language and its deterministic SVG → TTF → Flutter `IconData` pipeline.\n\nThe 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.\n\n## Classification grammar\n\n- A directory is always a folder outline. Add a classification or protocol mark only when one is known; otherwise leave the folder empty.\n- A non-directory is always a file outline plus its classification mark.\n- An unknown file is an empty file outline. Do not invent a generic interior mark.\n- Transfer state is separate from classification. Never replace a file glyph with paused, failed, completed, or downloading artwork.\n- Keep this skill scoped to file browsing, task assets, extension classification, and the font that renders those categories.\n\n## Workflow\n\n1. 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.\n2. Preserve the shared file or folder shell. Redraw only the classification mark unless the task explicitly revises the complete system.\n3. 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.\n4. 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.\n5. 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.\n6. Rebuild the complete TTF and generated Dart class, then generate the multi-size contact sheet.\n7. 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.\n8. Run the relevant classification tests, `flutter analyze`, and `flutter test` after integration changes.\n\n## Tool setup\n\nThe scripts require the pinned packages in `scripts/requirements.txt`. Keep the environment local and untracked:\n\n```bash\npython3 -m venv .agent/skills/gopeed-file-category-icons/.venv\n.agent/skills/gopeed-file-category-icons/.venv/bin/pip install -r .agent/skills/gopeed-file-category-icons/scripts/requirements.txt\n```\n\nBuild and preview a manifest:\n\n```bash\n.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\n.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\n```\n\nUse [assets/manifest.example.json](assets/manifest.example.json) and [assets/folder-symbol-template.svg](assets/folder-symbol-template.svg) only as structural starting points.\n\n## Invariants\n\n- Existing codepoints are API: never renumber or reuse one unless the user explicitly approves a breaking migration.\n- `design/file-category-icons/` is the sole editable source of truth. The packaged Flutter runtime uses only the generated TTF and Dart constants.\n- Never add the design-material directory to `pubspec.yaml`; it must remain outside the packaged Flutter asset graph.\n- The manifest is the source of truth. Do not hand-edit generated Dart constants or patch the binary font.\n- Keep icon names lowercase `snake_case`; the generator emits lowerCamelCase Dart fields.\n- File and folder shells in the same revision must share outline weight, baseline, fold/tab geometry, and optical scale.\n- 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.\n- New classification groups require both an extension/domain mapping and a glyph. Do not add a glyph that no classifier can reach.\n- Rebuild the complete font after every source change so all platforms consume the same binary.\n</yakaai_skills>"}