@markus-global/cli 0.9.6 → 0.9.7-rc.1

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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/skill.d.ts +3 -0
  3. package/dist/commands/skill.d.ts.map +1 -0
  4. package/dist/commands/skill.js +148 -0
  5. package/dist/commands/skill.js.map +1 -0
  6. package/dist/commands/start.d.ts.map +1 -1
  7. package/dist/commands/start.js +17 -1
  8. package/dist/commands/start.js.map +1 -1
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/markus.mjs +5522 -2746
  12. package/dist/web-ui/assets/{CommentInput-CBNbViJY.js → CommentInput-CIxUL6dU.js} +1 -1
  13. package/dist/web-ui/assets/{ContentRenderer-DE3pZgeX.js → ContentRenderer-Bb_drUpO.js} +2 -2
  14. package/dist/web-ui/assets/DeliverableShareModal-BEeIlXig.js +1 -0
  15. package/dist/web-ui/assets/Deliverables-CJFzxbLw.js +3 -0
  16. package/dist/web-ui/assets/{Notifications-DnOdXHNc.js → Notifications-Cz2LKhGE.js} +1 -1
  17. package/dist/web-ui/assets/{Search-BxFLlgcf.js → Search-dq45wHQN.js} +1 -1
  18. package/dist/web-ui/assets/Settings-WAXEtxMR.js +8 -0
  19. package/dist/web-ui/assets/{Store-BELkjEqO.js → Store-DOGCOxTK.js} +1 -1
  20. package/dist/web-ui/assets/Team-NM2SsmjN.js +81 -0
  21. package/dist/web-ui/assets/Work-ornw-1Zh.js +11 -0
  22. package/dist/web-ui/assets/{arc-CyhYnNcy.js → arc-D4xcu8MX.js} +1 -1
  23. package/dist/web-ui/assets/{architectureDiagram-3BPJPVTR-BYIYNrCP.js → architectureDiagram-3BPJPVTR-DP3EZPSb.js} +1 -1
  24. package/dist/web-ui/assets/{blockDiagram-GPEHLZMM-Tj8Yz066.js → blockDiagram-GPEHLZMM-BnSHtwXa.js} +1 -1
  25. package/dist/web-ui/assets/{c4Diagram-AAUBKEIU-Ifa4IAJa.js → c4Diagram-AAUBKEIU-DpPSihlY.js} +1 -1
  26. package/dist/web-ui/assets/channel-DSB2MBEK.js +1 -0
  27. package/dist/web-ui/assets/{chunk-2J33WTMH-CNSbz4EK.js → chunk-2J33WTMH-DD5lZIGF.js} +1 -1
  28. package/dist/web-ui/assets/{chunk-4BX2VUAB-DhNtaIHh.js → chunk-4BX2VUAB-D9wu9GG0.js} +1 -1
  29. package/dist/web-ui/assets/{chunk-55IACEB6-WUpOSLP9.js → chunk-55IACEB6-p_n2ARjh.js} +1 -1
  30. package/dist/web-ui/assets/{chunk-727SXJPM-BJV_Jz1H.js → chunk-727SXJPM-BiTqi43c.js} +1 -1
  31. package/dist/web-ui/assets/{chunk-AQP2D5EJ-BHu_5o0Y.js → chunk-AQP2D5EJ-DVPMedje.js} +1 -1
  32. package/dist/web-ui/assets/{chunk-FMBD7UC4-CfxugWTK.js → chunk-FMBD7UC4-B53AqN8D.js} +1 -1
  33. package/dist/web-ui/assets/{chunk-ND2GUHAM-hIFBUDLZ.js → chunk-ND2GUHAM-sACe_lkd.js} +1 -1
  34. package/dist/web-ui/assets/{chunk-QZHKN3VN-DF0OYrsG.js → chunk-QZHKN3VN-B0qDAQUW.js} +1 -1
  35. package/dist/web-ui/assets/classDiagram-4FO5ZUOK-D5cDjaiz.js +1 -0
  36. package/dist/web-ui/assets/classDiagram-v2-Q7XG4LA2-D5cDjaiz.js +1 -0
  37. package/dist/web-ui/assets/{cose-bilkent-S5V4N54A-C3LM31P0.js → cose-bilkent-S5V4N54A-BzZayQQf.js} +1 -1
  38. package/dist/web-ui/assets/{dagre-BM42HDAG-C_m79Kes.js → dagre-BM42HDAG-DjcfWzm_.js} +1 -1
  39. package/dist/web-ui/assets/{diagram-2AECGRRQ-D8liSSSE.js → diagram-2AECGRRQ-CEK9T3rW.js} +1 -1
  40. package/dist/web-ui/assets/{diagram-5GNKFQAL-DqtsU-bB.js → diagram-5GNKFQAL-BJsJPwEI.js} +1 -1
  41. package/dist/web-ui/assets/{diagram-KO2AKTUF-C6zkMDRo.js → diagram-KO2AKTUF-BZlki2qo.js} +1 -1
  42. package/dist/web-ui/assets/{diagram-LMA3HP47-Dx2JnYqj.js → diagram-LMA3HP47-Bkmh3WcY.js} +1 -1
  43. package/dist/web-ui/assets/{diagram-OG6HWLK6-ZI_lN3Ui.js → diagram-OG6HWLK6-4THSXHiA.js} +1 -1
  44. package/dist/web-ui/assets/{erDiagram-TEJ5UH35-DQ5VepuZ.js → erDiagram-TEJ5UH35-CPj2HGe-.js} +1 -1
  45. package/dist/web-ui/assets/{flowDiagram-I6XJVG4X-6GiDnWFL.js → flowDiagram-I6XJVG4X-Bu8HgFqR.js} +1 -1
  46. package/dist/web-ui/assets/{ganttDiagram-6RSMTGT7-D6HROKP8.js → ganttDiagram-6RSMTGT7-C5gs9b9P.js} +1 -1
  47. package/dist/web-ui/assets/{gitGraphDiagram-PVQCEYII-CXm0stFt.js → gitGraphDiagram-PVQCEYII-DxnBgR_T.js} +1 -1
  48. package/dist/web-ui/assets/index-BbQpGkiM.css +1 -0
  49. package/dist/web-ui/assets/index-CiAGgfZx.js +672 -0
  50. package/dist/web-ui/assets/{infoDiagram-5YYISTIA-C1RxESvu.js → infoDiagram-5YYISTIA-D4M-cR8I.js} +1 -1
  51. package/dist/web-ui/assets/{ishikawaDiagram-YF4QCWOH-K65PlAf9.js → ishikawaDiagram-YF4QCWOH-Oiq6jknk.js} +1 -1
  52. package/dist/web-ui/assets/{journeyDiagram-JHISSGLW-_Rs_Vudv.js → journeyDiagram-JHISSGLW-D2gmyCKv.js} +1 -1
  53. package/dist/web-ui/assets/{kanban-definition-UN3LZRKU-Jf6WnoNW.js → kanban-definition-UN3LZRKU-DqjzkO8l.js} +1 -1
  54. package/dist/web-ui/assets/{mermaid.core-C6jfI8lj.js → mermaid.core-N5tL3hIv.js} +5 -5
  55. package/dist/web-ui/assets/{mindmap-definition-RKZ34NQL-CuVR_m6C.js → mindmap-definition-RKZ34NQL-ATHsVy0v.js} +1 -1
  56. package/dist/web-ui/assets/{pieDiagram-4H26LBE5-BiPJBXLU.js → pieDiagram-4H26LBE5-CprLr2Gv.js} +1 -1
  57. package/dist/web-ui/assets/{quadrantDiagram-W4KKPZXB-C4hoAfNv.js → quadrantDiagram-W4KKPZXB-0uN86dlU.js} +1 -1
  58. package/dist/web-ui/assets/{requirementDiagram-4Y6WPE33-BmjjjPuK.js → requirementDiagram-4Y6WPE33-CQmWbZXW.js} +1 -1
  59. package/dist/web-ui/assets/{sankeyDiagram-5OEKKPKP-ts7xFx2o.js → sankeyDiagram-5OEKKPKP-D6kdJsQI.js} +1 -1
  60. package/dist/web-ui/assets/{sequenceDiagram-3UESZ5HK-C3je_x5z.js → sequenceDiagram-3UESZ5HK-1Y79snKt.js} +1 -1
  61. package/dist/web-ui/assets/{stateDiagram-AJRCARHV-CREzVZ-3.js → stateDiagram-AJRCARHV-BqmCPSIN.js} +1 -1
  62. package/dist/web-ui/assets/stateDiagram-v2-BHNVJYJU-DRaoGsBn.js +1 -0
  63. package/dist/web-ui/assets/{timeline-definition-PNZ67QCA-CriALCTC.js → timeline-definition-PNZ67QCA-OG71KAzb.js} +1 -1
  64. package/dist/web-ui/assets/{vennDiagram-CIIHVFJN-Bc9NNe3M.js → vennDiagram-CIIHVFJN-V9c-71bn.js} +1 -1
  65. package/dist/web-ui/assets/{wardley-L42UT6IY-psF9We_q.js → wardley-L42UT6IY-C3A6_LpL.js} +1 -1
  66. package/dist/web-ui/assets/{wardleyDiagram-YWT4CUSO-DNZ9Jdgm.js → wardleyDiagram-YWT4CUSO-B54ZiT7U.js} +1 -1
  67. package/dist/web-ui/assets/{xychartDiagram-2RQKCTM6-COezi66E.js → xychartDiagram-2RQKCTM6-DpWlpUfV.js} +1 -1
  68. package/dist/web-ui/index.html +2 -2
  69. package/package.json +2 -2
  70. package/templates/roles/{SHARED.md → HANDBOOK.md} +17 -7
  71. package/templates/roles/org-manager/ROLE.md +1 -5
  72. package/templates/roles/skill-architect/ROLE.md +1 -1
  73. package/templates/skills/agent-building/SKILL.md +109 -11
  74. package/templates/skills/skill-building/SKILL.md +61 -0
  75. package/templates/skills/team-building/SKILL.md +110 -4
  76. package/dist/web-ui/assets/Deliverables-Cx97uG2f.js +0 -6
  77. package/dist/web-ui/assets/Settings-D0i8Lnsk.js +0 -8
  78. package/dist/web-ui/assets/Team-D_C3tvWh.js +0 -80
  79. package/dist/web-ui/assets/Work-DpRdSwD5.js +0 -11
  80. package/dist/web-ui/assets/channel-B33xJsNY.js +0 -1
  81. package/dist/web-ui/assets/classDiagram-4FO5ZUOK-BePK-BYt.js +0 -1
  82. package/dist/web-ui/assets/classDiagram-v2-Q7XG4LA2-BePK-BYt.js +0 -1
  83. package/dist/web-ui/assets/index-BMzsi3-i.js +0 -670
  84. package/dist/web-ui/assets/index-C9gwAZYM.css +0 -1
  85. package/dist/web-ui/assets/stateDiagram-v2-BHNVJYJU-CZU51KZ-.js +0 -1
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: agent-building
3
- description: Design and create AI agent packages — manifest format, directory structure, file writing workflow
3
+ description: Design and create AI agent packages — manifest format, directory structure, image asset generation (avatar/thumbnail/screenshots), file writing workflow, comprehensive field reference
4
4
  ---
5
5
 
6
6
  # Agent Building
7
7
 
8
- This skill teaches you how to create Markus agent packages — self-contained directory-based artifacts that define an AI agent's identity, capabilities, and constraints.
8
+ This skill teaches you how to create Markus agent packages — self-contained directory-based artifacts that define an AI agent's identity, capabilities, constraints, and visual assets.
9
9
 
10
10
  ## Artifact Directory
11
11
 
@@ -18,7 +18,9 @@ This skill teaches you how to create Markus agent packages — self-contained di
18
18
  ├── ROLE.md # Identity and system prompt (REQUIRED)
19
19
  ├── HEARTBEAT.md # Periodic self-check checklist (RECOMMENDED)
20
20
  ├── POLICIES.md # Constraints & guardrails (optional)
21
- └── CONTEXT.md # Domain context & references (optional)
21
+ ├── CONTEXT.md # Domain context & references (optional)
22
+ └── images/ # Image assets (avatar, screenshots)
23
+ └── avatar.jpg # Agent avatar/thumbnail image
22
24
  ```
23
25
 
24
26
  **Do NOT write artifacts to `~/.markus/shared/`, your working directory, or any other location.** Only `~/.markus/builder-artifacts/agents/` is recognized by the system.
@@ -38,8 +40,8 @@ The manifest `name` is the **package slug**: directory name, Hub URL segment (`/
38
40
 
39
41
  | User language | `name` (slug) | `displayName` |
40
42
  |---|---|---|
41
- | Chinese “论文导师” | `paper-mentor` | `论文导师` |
42
- | English Code Reviewer | `code-reviewer` | `Code Reviewer` |
43
+ | Chinese "论文导师" | `paper-mentor` | `论文导师` |
44
+ | English "Code Reviewer" | `code-reviewer` | `Code Reviewer` |
43
45
 
44
46
  If the user only gives a Chinese title, **you invent an English kebab slug** that captures the meaning, set `displayName` to their title, and use the slug for the directory path `~/.markus/builder-artifacts/agents/{name}/`.
45
47
 
@@ -71,6 +73,11 @@ This JSON contains ONLY metadata — **no file content**.
71
73
  "author": "",
72
74
  "category": "development | devops | management | productivity | general",
73
75
  "tags": ["tag1", "tag2"],
76
+ "icon": "images/avatar.jpg",
77
+ "thumbnail": "images/avatar.jpg",
78
+ "screenshots": ["images/avatar.jpg"],
79
+ "license": "MIT",
80
+ "originalSource": "https://github.com/...",
74
81
  "dependencies": {
75
82
  "skills": ["skill-id-1", "skill-id-2"],
76
83
  "env": ["git", "node"]
@@ -121,6 +128,8 @@ After the JSON is saved, write each file individually using `file_write`. The ba
121
128
 
122
129
  5. **CONTEXT.md** (optional) — Additional domain context, references, or knowledge.
123
130
 
131
+ 6. **images/avatar.jpg** — Agent visual assets (see [Image Assets](#image-assets) section below).
132
+
124
133
  **Example file_write calls:**
125
134
 
126
135
  ```
@@ -130,6 +139,86 @@ file_write("~/.markus/builder-artifacts/agents/code-reviewer/HEARTBEAT.md", "# H
130
139
  file_write("~/.markus/builder-artifacts/agents/code-reviewer/POLICIES.md", "# Policies\n\n- Only use shell_execute for read-only commands...\n- Always show file contents before overwriting...")
131
140
  ```
132
141
 
142
+ ## Image Assets
143
+
144
+ Agent avatars are **digital employee portraits** — they should depict a person (realistic human style), not abstract icons, logos, or illustrations. Users should recognize the agent as a team member, not a mascot.
145
+
146
+ ### Image Generation
147
+
148
+ Use the `generate_image` tool to create agent portraits. Prompt style guide:
149
+
150
+ ```
151
+ Good prompt (do this):
152
+ "Professional headshot of a friendly male product manager in a business casual attire,
153
+ warm blue tones, clean background, digital art style, realistic portrait"
154
+ "Creative female content writer with glasses, warm orange tones, looking thoughtful,
155
+ holding a notebook, realistic digital portrait, professional yet approachable"
156
+
157
+ Bad prompt (don't do this):
158
+ "Abstract icon of a roadmap with sticky notes" ✗ — user said "不知所云"
159
+ "A laptop with writing bubbles floating above it" ✗ — not a person
160
+ "Logo design for a content creator" ✗ — not a digital employee
161
+ ```
162
+
163
+ Key prompt rules:
164
+ - **Subject is always a person** — realistic digital portrait
165
+ - **Match the role's personality** — PM = organized/strategic, Creator = creative/warm
166
+ - **Use color palette** that aligns with the role (blue for analytical, orange for creative, green for growth)
167
+ - **Background**: clean, professional, non-distracting
168
+ - **Style**: `"realistic digital portrait", "professional headshot", "digital art style"`
169
+
170
+ ### Image Size & Compression
171
+
172
+ The `generate_image` tool typically outputs large images (e.g., 2048x2048, 400KB+). **Always compress before saving to the artifact directory.**
173
+
174
+ Recommended specifications:
175
+
176
+ | Property | Value |
177
+ |:---------|:------|
178
+ | **Final resolution** | 512×512 (square) |
179
+ | **File format** | JPEG |
180
+ | **Max file size** | ≤50KB |
181
+ | **Compression method** | Python Pillow (`pip3 install Pillow`) resize + save |
182
+
183
+ Compression procedure:
184
+ ```python
185
+ # Using Python Pillow
186
+ python3 -c "
187
+ from PIL import Image
188
+ img = Image.open('source.jpg')
189
+ img = img.resize((512, 512), Image.LANCZOS)
190
+ img.save('avatar.jpg', 'JPEG', quality=85)
191
+ "
192
+ ```
193
+
194
+ Typical result: 2048×2048 (426KB) → 512×512 (19KB), saving ~96%.
195
+
196
+ ### File Placement
197
+
198
+ | File | Directory | Purpose |
199
+ |:----|:----------|:--------|
200
+ | `avatar.jpg` | `images/` | Agent avatar, used for both `icon` and `thumbnail` |
201
+ | Additional screenshots | `images/` | Optional, for feature showcase |
202
+
203
+ **Always** place images under an `images/` subdirectory — NOT at the artifact root. This follows the existing convention used by `paper-mentor`, `prompt-engineer`, and other agents.
204
+
205
+ ### Local Path vs Hub CDN URL
206
+
207
+ This is a critical distinction:
208
+
209
+ | Phase | Field | Value | Where |
210
+ |:------|:------|:------|:------|
211
+ | **Local artifact (builder-artifacts/)** | `icon` | `"images/avatar.jpg"` | Relative path in agent.json |
212
+ | **Local artifact (builder-artifacts/)** | `thumbnail` | `"images/avatar.jpg"` | Relative path in agent.json |
213
+ | **Local artifact (builder-artifacts/)** | `screenshots` | `["images/avatar.jpg"]` | Relative paths in agent.json |
214
+ | **Published to Hub** | `icon` | Emoji or CDN URL | Hub DB field (`hub_items.icon`) |
215
+ | **Published to Hub** | `thumbnailUrl` | `"https://hub.markus.global/uploads/img_xxx.jpg"` | Hub DB field (`hub_items.thumbnail_url`) |
216
+ | **Published to Hub** | `images` | `[{"url":"...","alt":"...","order":0}]` | Hub DB field (`hub_items.images`) |
217
+
218
+ **Note:** Hub DB schema uses `thumbnailUrl` (not `thumbnail`), and `images` (not `screenshots`). The local artifact file uses `thumbnail` and `screenshots` for compatibility with the local install system. When publishing to Hub via API, map:
219
+ - Local `thumbnail` → Hub `thumbnailUrl`
220
+ - Local `screenshots` → Hub `images` (converted to `{url, alt, order}[]` format)
221
+
133
222
  ## Field Reference
134
223
 
135
224
  ### Top-level fields
@@ -138,14 +227,19 @@ file_write("~/.markus/builder-artifacts/agents/code-reviewer/POLICIES.md", "# Po
138
227
  - **`displayName`**: Human-readable name, can be in any language (e.g., `"论文学习导师"`, `"Code Reviewer"`)
139
228
  - **`version`**: Semver (default `"1.0.0"`)
140
229
  - **`description`**: What this agent does (can be in any language)
141
- - **`category`**: One of `development`, `devops`, `management`, `productivity`, `general`
230
+ - **`category`**: One of `development`, `devops`, `management`, `productivity`, `general`, `marketing`, `engineering`, `product-management`
142
231
  - **`tags`**: Array of descriptive tags
232
+ - **`icon`** (optional): Can be emoji OR image path. Emoji is lighter (zero network cost). Image path is visually richer. Both work in the Hub UI. Example: `"🚀"` or `"images/avatar.jpg"`
233
+ - **`thumbnail`** (optional): Relative path to avatar image in artifact. Shows as large preview. Must be under `images/` directory. Example: `"images/avatar.jpg"`
234
+ - **`screenshots`** (optional): Array of image paths for gallery/展示. Each path under `images/`. Example: `["images/avatar.jpg"]`
235
+ - **`license`** (optional): License type, e.g. MIT, Apache-2.0. Example: `"MIT"`
236
+ - **`originalSource`** (optional): URL to original source repository for attribution. Example: `"https://github.com/..."`
143
237
  - **`dependencies.skills`**: Skill IDs from the dynamic context. **Actively assign — don't leave empty!**
144
238
  - **`dependencies.env`**: Required CLI tools (e.g., `["git", "node"]`). Omit if none needed.
145
239
 
146
240
  ### `agent` section (REQUIRED)
147
241
  - **`agentRole`**: `"worker"` (executes tasks) or `"manager"` (coordinates, assigns, reviews)
148
- - **`llmProvider`**, **`llmModel`**, **`temperature`**: LLM configuration. Leave empty for system defaults.
242
+ - **`llmProvider`**, **`llmModel`**, **`temperature`**: LLM configuration. Leave empty for system defaults. Temperature: 0.7 general, 0.3-0.5 precision, 0.8-1.0 creative.
149
243
 
150
244
  **Note**: The `roleName` field is **not needed**. The agent's identity is fully defined by its `ROLE.md` file. Do NOT include `roleName` unless you specifically want to inherit default tools from a built-in role template (rare).
151
245
 
@@ -164,9 +258,10 @@ If an agent needs to be cautious with certain tools, write that into `POLICIES.m
164
258
 
165
259
  Once all files are written, tell the user:
166
260
 
167
- 1. **The agent has been created and saved** — summarize what was created (name, purpose, key skills).
168
- 2. **Ready to install** — the user can install from the Builder page, or ask you to install it (you would use `package_install`). Do NOT install unless asked.
169
- 3. **To modify or improve** this agent (e.g., update the role, change skills, adjust policies), just continue the conversation here describe what you want to change and I'll update the files directly.
261
+ 1. **The agent has been created and saved** — summarize what was created (name, purpose, key skills, image asset).
262
+ 2. **Visual asset included** — note the avatar image and its compressed size.
263
+ 3. **Ready to install** the user can install from the Builder page, or ask you to install it (you would use `package_install`). Do NOT install unless asked.
264
+ 4. **To modify or improve** this agent (e.g., update the role, change skills, adjust policies, regenerate the avatar), just continue the conversation here — describe what you want to change and I'll update the files directly.
170
265
 
171
266
  ## Rules
172
267
 
@@ -176,6 +271,9 @@ Once all files are written, tell the user:
176
271
  - **DO NOT** write artifacts to `~/.markus/shared/` or your working directory. Always use `~/.markus/builder-artifacts/agents/{name}/`.
177
272
  - **The `name` field MUST be a valid English kebab-case slug** (see Package Slug). Never use Chinese as `name`. Invalid `name` → write/save/share fails.
178
273
  - **All top-level fields must be the correct type**: `author` must be a plain string (e.g. `"John"`) — NOT an object. `tags` must be an array of strings. `version` must be semver string. `description` must be a string. The system validates the manifest on write and will reject malformed files.
274
+ - **Agent avatars MUST be human/digital employee portraits** — not abstract icons or logos. Users should see a person.
275
+ - **Always compress images** — from raw generation output (often ~400KB+) to ≤50KB (512×512 JPEG).
276
+ - **Images go in `images/` subdirectory** — never at the artifact root.
179
277
  - The `ROLE.md` is what makes the agent unique — write at least 5 substantive paragraphs. A generic one-liner is useless.
180
278
  - Default `temperature` to 0.7 for general tasks, lower (0.3-0.5) for precision tasks, higher (0.8-1.0) for creative tasks.
181
- - After outputting the JSON, immediately proceed to write files via `file_write` — announce what you're writing.
279
+ - After outputting the JSON, immediately proceed to write files via `file_write` — announce what you're writing.
@@ -21,6 +21,8 @@ Most skills are instruction-based. Use MCP-based skills when the capability requ
21
21
  ├── skill.json # Manifest (auto-created from your JSON output)
22
22
  ├── SKILL.md # Instruction document (you write via file_write)
23
23
  ├── README.md # Human-readable documentation (optional)
24
+ ├── images/ # Skill icon images (optional)
25
+ │ └── icon.png # Skill icon — used in UI after install
24
26
  └── ... # Any other files: scripts, MCP servers, configs, templates, etc.
25
27
  ```
26
28
 
@@ -60,6 +62,7 @@ This JSON contains ONLY metadata — **no file content**.
60
62
  "version": "1.0.0",
61
63
  "description": "When and why an agent should use this skill",
62
64
  "author": "Your Name",
65
+ "icon": "images/icon.png",
63
66
  "category": "custom",
64
67
  "tags": ["tag1", "tag2"],
65
68
  "skill": {
@@ -77,6 +80,7 @@ This JSON contains ONLY metadata — **no file content**.
77
80
  "version": "1.0.0",
78
81
  "description": "Connect to My API for data retrieval and actions",
79
82
  "author": "Your Name",
83
+ "icon": "images/icon.png",
80
84
  "category": "custom",
81
85
  "tags": ["api", "connector"],
82
86
  "skill": {
@@ -120,6 +124,63 @@ After the JSON is saved, write each file individually using `file_write`. The ba
120
124
 
121
125
  4. **Any other files** — Helper scripts, templates, config files, data files, etc.
122
126
 
127
+ 5. **images/icon.png** (optional) — Skill icon for UI display (see [Image Assets](#image-assets)).
128
+
129
+ ## Image Assets
130
+
131
+ Skill icons are **abstract representations** of the skill's capability — like an app icon or tool symbol. They should be clean, recognizable, and work well at small sizes.
132
+
133
+ | Image | Location | Style | Purpose |
134
+ |:------|:---------|:------|:--------|
135
+ | **Skill icon** | `images/icon.png` | Abstract icon / symbol | Skill card in UI, published to Hub as `icon` |
136
+
137
+ **Do NOT use portraits for skill icons.** Skills are tools, not team members. Portraits belong on agents.
138
+
139
+ ### Image Generation
140
+
141
+ Prompt style guide for `generate_image`:
142
+ ```
143
+ Good prompt (do this):
144
+ "Clean icon design for a git changelog tool, stylized git branch merging into a document,
145
+ flat vector style, teal and white palette, square format, modern minimal"
146
+ "Minimalist icon for a GitHub automation skill, octagon cat silhouette combined with
147
+ gear, flat design, purple gradients, square format"
148
+ "Abstract icon representing web scraping capability, spider-web pattern with a magnifying
149
+ glass, geometric style, blue and orange accents, square format"
150
+
151
+ Bad prompt (don't do this):
152
+ "Developer sitting at a computer" ✗ — portraits are for agents, not skills
153
+ "Abstract colorful splash without meaning" ✗ — too vague, no clear concept
154
+ "Screenshot of a terminal window" ✗ — not an icon
155
+ ```
156
+
157
+ Key rules:
158
+ - **Style**: flat vector / geometric / minimal — NOT photographic, NOT portraits
159
+ - **Subject**: abstract concept representing the skill's capability
160
+ - **Format**: square, clean background, recognizable at small sizes (64×64)
161
+ - **Match skill function**: git → branching, browser → window/globe, API → connector/plug
162
+
163
+ ### Image Size & Compression
164
+
165
+ | Property | Value |
166
+ |:---------|:------|
167
+ | **Final resolution** | 512×512 (square) |
168
+ | **File format** | PNG (recommended for icons — crisp lines, transparency) |
169
+ | **Max file size** | ≤30KB |
170
+ | **Compression method** | Python Pillow (`pip3 install Pillow`) resize + save |
171
+
172
+ Compression procedure:
173
+ ```python
174
+ python3 -c "
175
+ from PIL import Image
176
+ img = Image.open('source.png')
177
+ img = img.resize((512, 512), Image.LANCZOS)
178
+ img.save('icon.png', 'PNG', optimize=True)
179
+ "
180
+ ```
181
+
182
+ **Always** place images under an `images/` subdirectory — NOT at the artifact root.
183
+
123
184
  **Example file_write calls:**
124
185
 
125
186
  ```
@@ -21,6 +21,8 @@ This skill teaches you how to create Markus team packages — self-contained dir
21
21
  ├── README.md # Public-facing team overview for Hub/Builder (REQUIRED)
22
22
  ├── ANNOUNCEMENT.md # Team announcement (you write via file_write)
23
23
  ├── NORMS.md # Working norms (you write via file_write)
24
+ ├── images/ # Team-level images (icon, etc.)
25
+ │ └── icon.png # Team icon — used as avatar after install
24
26
  ├── workflows/ # Workflow templates (optional)
25
27
  │ └── {workflow-name}.yaml # YAML workflow DAG definition
26
28
  └── members/
@@ -28,12 +30,14 @@ This skill teaches you how to create Markus team packages — self-contained dir
28
30
  │ ├── ROLE.md # Identity and system prompt (REQUIRED)
29
31
  │ ├── HEARTBEAT.md # Periodic self-check checklist (RECOMMENDED)
30
32
  │ ├── POLICIES.md # Constraints and guardrails (optional)
31
- └── CONTEXT.md # Domain context and references (optional)
33
+ ├── CONTEXT.md # Domain context and references (optional)
34
+ │ └── images/ # Member avatar images (e.g. avatar.jpg)
32
35
  └── {worker-slug}/
33
36
  ├── ROLE.md # Identity and system prompt (REQUIRED)
34
37
  ├── HEARTBEAT.md # Periodic self-check checklist (RECOMMENDED)
35
38
  ├── POLICIES.md # Constraints and guardrails (optional)
36
- └── CONTEXT.md # Domain context and references (optional)
39
+ ├── CONTEXT.md # Domain context and references (optional)
40
+ └── images/ # Member avatar images (e.g. avatar.jpg)
37
41
  ```
38
42
 
39
43
  **Do NOT write artifacts to `~/.markus/shared/`, your agent `workspace/`, or any other location.** Only `~/.markus/builder-artifacts/teams/` is recognized by `package_list` / `package_install`. The `agents/`, `teams/`, and `skills/` subdirs are created automatically at startup — still write files yourself with `file_write`.
@@ -66,6 +70,7 @@ If the user only gives a Chinese title, **you invent an English kebab slug** tha
66
70
  | `members/{name}/HEARTBEAT.md` | `~/.markus/agents/{agentId}/role/HEARTBEAT.md` | Periodic self-check checklist (every ~30 min) |
67
71
  | `members/{name}/POLICIES.md` | `~/.markus/agents/{agentId}/role/POLICIES.md` | Additional agent constraints |
68
72
  | `members/{name}/CONTEXT.md` | `~/.markus/agents/{agentId}/role/CONTEXT.md` | Domain context and references |
73
+ | `members/{name}/images/` | `~/.markus/agents/{agentId}/role/images/` | Member avatar images (copied on install; first image used as agent avatar) |
69
74
  | `workflows/*.yaml` | `~/.markus/teams/{teamId}/workflows/*.yaml` | Workflow templates (runnable as task DAGs) |
70
75
 
71
76
  ## Creation Workflow
@@ -94,6 +99,7 @@ This JSON contains ONLY metadata and structure — **no file content**.
94
99
  "version": "1.0.0",
95
100
  "description": "Team purpose and goals",
96
101
  "author": "",
102
+ "icon": "images/icon.png",
97
103
  "category": "development | devops | management | productivity | general",
98
104
  "tags": ["tag1", "tag2"],
99
105
  "team": {
@@ -122,6 +128,13 @@ This JSON contains ONLY metadata and structure — **no file content**.
122
128
  }
123
129
  ```
124
130
 
131
+ > ⚠️ **CRITICAL — manifest field rules:**
132
+ > - `members` MUST be nested under `team`, NOT at the root level.
133
+ > - `role` MUST be exactly `"manager"` or `"worker"` — no descriptions, no other values. The UI uses this to color-code tabs and determine sidebar counts.
134
+ > - `count` is REQUIRED for every member (typically `1`).
135
+ > - `category` MUST be one of: `development`, `devops`, `management`, `productivity`, `general`.
136
+ > - The root level should NOT contain `members` or `skills` directly — put `skills` under `dependencies.skills`.
137
+
125
138
  After `team.json` is written, proceed to write the remaining files with `file_write`.
126
139
 
127
140
  ### Step 2: Write Files with file_write
@@ -166,6 +179,97 @@ After the JSON is saved, write each file individually using `file_write`. The ba
166
179
 
167
180
  7. **CONTEXT.md** (optional) — Additional domain context, references, or knowledge specific to a member.
168
181
 
182
+ ## Image Assets
183
+
184
+ Teams use **two kinds of images**, stored in separate locations:
185
+
186
+ | Image | Location | Style | Purpose |
187
+ |:------|:---------|:------|:--------|
188
+ | **Team icon** | `images/icon.png` | Abstract logo / icon | Team card in UI, published to Hub as `icon` |
189
+ | **Member avatar** | `members/{slug}/images/avatar.jpg` | Realistic digital portrait | Agent card in UI (same as agent-building) |
190
+
191
+ ### Team Icon
192
+
193
+ A team icon should represent the team's **identity as a whole** — like a department logo or squad badge. Use abstract, geometric, or emblematic styles. **Do NOT use portraits for the team icon** (portraits belong on individual member agents).
194
+
195
+ Prompt style guide for `generate_image`:
196
+ ```
197
+ Good prompt (do this):
198
+ "Clean vector-style icon for a research team, geometric shapes forming a magnifying glass
199
+ over interconnected nodes, modern flat design, blue and indigo palette, square format"
200
+ "Minimalist tech squad badge, circuit board pattern forming a shield, clean lines,
201
+ dark blue and cyan accents, flat vector illustration, square format"
202
+
203
+ Bad prompt (don't do this):
204
+ "A group of people sitting around a conference table" ✗ — this is a scene, not an icon
205
+ "Smiling project manager portrait" ✗ — portraits are for members, not the team
206
+ "Abstract colorful blob" ✗ — too vague, no recognizable meaning
207
+ ```
208
+
209
+ Key rules:
210
+ - **Style**: vector / flat design / geometric / emblematic — NOT photographic
211
+ - **Subject**: abstract concept (shield, gear, nodes, stars, etc.) — NOT people
212
+ - **Format**: square, clean background, recognizable at small sizes (64×64)
213
+ - **Match team purpose**: research → magnifying glass / beaker, dev → code brackets / gear, ops → shield / cog
214
+
215
+ ### Member Avatars
216
+
217
+ Member avatars follow the **same rules as agent-building** — they are **digital employee portraits**. Each member gets a realistic headshot that matches their role.
218
+
219
+ Prompt style guide:
220
+ ```
221
+ Good prompt (do this):
222
+ "Professional headshot of a friendly male research director in business casual attire,
223
+ warm blue tones, clean background, realistic digital portrait"
224
+ "Creative female content strategist with glasses, warm orange tones, looking thoughtful,
225
+ realistic digital portrait, professional yet approachable"
226
+
227
+ Bad prompt (don't do this):
228
+ "Abstract icon of a roadmap with sticky notes" ✗ — not a person
229
+ "A laptop with writing bubbles floating above it" ✗ — not a person
230
+ ```
231
+
232
+ Key rules (same as agent-building):
233
+ - **Subject is always a person** — realistic digital portrait
234
+ - **Match the role's personality** — manager = organized/strategic, creator = creative/warm
235
+ - **Color palette** aligns with the role (blue = analytical, orange = creative, green = growth)
236
+ - **Background**: clean, professional, non-distracting
237
+ - **Style**: `"realistic digital portrait", "professional headshot", "digital art style"`
238
+
239
+ ### Image Size & Compression
240
+
241
+ Same specs as agent-building:
242
+
243
+ | Property | Value |
244
+ |:---------|:------|
245
+ | **Final resolution** | 512×512 (square) |
246
+ | **File format** | JPEG (members) / PNG (team icon — for transparency) |
247
+ | **Max file size** | ≤50KB |
248
+ | **Compression method** | Python Pillow (`pip3 install Pillow`) resize + save |
249
+
250
+ Compression procedure:
251
+ ```python
252
+ # Using Python Pillow
253
+ python3 -c "
254
+ from PIL import Image
255
+ img = Image.open('source.jpg')
256
+ img = img.resize((512, 512), Image.LANCZOS)
257
+ img.save('avatar.jpg', 'JPEG', quality=85)
258
+ "
259
+ ```
260
+
261
+ For team icons (PNG):
262
+ ```python
263
+ python3 -c "
264
+ from PIL import Image
265
+ img = Image.open('source.png')
266
+ img = img.resize((512, 512), Image.LANCZOS)
267
+ img.save('icon.png', 'PNG', optimize=True)
268
+ "
269
+ ```
270
+
271
+ **Always** place images under an `images/` subdirectory — NOT at the artifact root.
272
+
169
273
  **Example file_write calls:**
170
274
 
171
275
  ```
@@ -251,12 +355,14 @@ For the full YAML format reference, DAG patterns, scheduling, and more examples,
251
355
  - **`tags`**: Descriptive tags
252
356
 
253
357
  ### `team.members[]` — Member Specifications (REQUIRED)
254
- - **`name`**: Display name (the slug for file paths is derived from this)
358
+ - **`name`**: Display name Chinese / any language is fine (e.g., "Agent 创建者")
359
+ - **`slug`** *(recommended)*: Explicit kebab-case slug matching the `members/{slug}/` directory name (e.g., `"agent-creator"`). **CRITICAL when `name` contains non-ASCII characters** — the auto-derived slug from `kebab(name)` strips Chinese/Unicode, causing directory mismatch and broken avatars.
360
+ - **`roleName`** *(recommended)*: English version of the display name (e.g., `"Agent Creator"`). Used as a fallback for directory matching when `slug` is not set. `kebab("Agent Creator")` → `"agent-creator"` matches the directory correctly.
255
361
  - **`role`**: `"manager"` or `"worker"`
256
362
  - **`count`**: Number of instances (default 1)
257
363
  - **`skills`**: Skill IDs from the dynamic context. **Actively assign skills — don't leave empty!**
258
364
 
259
- **Note**: The `roleName` field is **not needed** for team members. Each member's identity is fully defined by their `ROLE.md` file under `members/{slug}/`. Do NOT include `roleName` unless you specifically want to inherit defaults from a built-in role template (rare).
365
+ > ⚠️ **CRITICAL — Avatar Mapping**: The UI maps each manifest member to its on-disk `members/{slug}/` directory using slug matching. If the member name is in Chinese (e.g., "Agent 创建者"), `kebab()` strips all Unicode → produces `"agent"` which does NOT match `"agent-creator"`. **Always set `slug` (preferred) or `roleName` (fallback)** for members whose display names contain non-ASCII characters. Without this, member avatars, file tabs, and role colors will be mapped to the wrong members or not shown at all.
260
366
 
261
367
  ### `team.workflow` — Workflow Configuration (recommended)
262
368
  - **`phases`**: Array of phase names defining the team's workflow (e.g., `["plan", "implement", "review", "validate"]`)