diff --git a/Brand/Exports/headers/apple-cli-dark.png b/Brand/Exports/headers/apple-cli-dark.png
index 9b419e5..f26de29 100644
Binary files a/Brand/Exports/headers/apple-cli-dark.png and b/Brand/Exports/headers/apple-cli-dark.png differ
diff --git a/Brand/Exports/headers/apple-cli-light.png b/Brand/Exports/headers/apple-cli-light.png
index 9353540..1d4bf54 100644
Binary files a/Brand/Exports/headers/apple-cli-light.png and b/Brand/Exports/headers/apple-cli-light.png differ
diff --git a/Brand/Exports/headers/homebrew-tap-dark.png b/Brand/Exports/headers/homebrew-tap-dark.png
index b878c30..f606606 100644
Binary files a/Brand/Exports/headers/homebrew-tap-dark.png and b/Brand/Exports/headers/homebrew-tap-dark.png differ
diff --git a/Brand/Exports/headers/homebrew-tap-light.png b/Brand/Exports/headers/homebrew-tap-light.png
index 384d238..2012c11 100644
Binary files a/Brand/Exports/headers/homebrew-tap-light.png and b/Brand/Exports/headers/homebrew-tap-light.png differ
diff --git a/Brand/Exports/headers/plugin-claude-dark.png b/Brand/Exports/headers/plugin-claude-dark.png
index 73fbd35..f9dab07 100644
Binary files a/Brand/Exports/headers/plugin-claude-dark.png and b/Brand/Exports/headers/plugin-claude-dark.png differ
diff --git a/Brand/Exports/headers/plugin-claude-light.png b/Brand/Exports/headers/plugin-claude-light.png
index e77f810..6ec4950 100644
Binary files a/Brand/Exports/headers/plugin-claude-light.png and b/Brand/Exports/headers/plugin-claude-light.png differ
diff --git a/Brand/Exports/headers/plugin-codex-dark.png b/Brand/Exports/headers/plugin-codex-dark.png
index c779886..f5a84e8 100644
Binary files a/Brand/Exports/headers/plugin-codex-dark.png and b/Brand/Exports/headers/plugin-codex-dark.png differ
diff --git a/Brand/Exports/headers/plugin-codex-light.png b/Brand/Exports/headers/plugin-codex-light.png
index 4ed6fce..49de793 100644
Binary files a/Brand/Exports/headers/plugin-codex-light.png and b/Brand/Exports/headers/plugin-codex-light.png differ
diff --git a/Brand/Exports/headers/plugin-computer-use-dark.png b/Brand/Exports/headers/plugin-computer-use-dark.png
index cac79e6..5989d12 100644
Binary files a/Brand/Exports/headers/plugin-computer-use-dark.png and b/Brand/Exports/headers/plugin-computer-use-dark.png differ
diff --git a/Brand/Exports/headers/plugin-computer-use-light.png b/Brand/Exports/headers/plugin-computer-use-light.png
index 69948e1..defb99b 100644
Binary files a/Brand/Exports/headers/plugin-computer-use-light.png and b/Brand/Exports/headers/plugin-computer-use-light.png differ
diff --git a/Brand/Exports/headers/plugin-cursor-dark.png b/Brand/Exports/headers/plugin-cursor-dark.png
index 0469dc6..b444f2f 100644
Binary files a/Brand/Exports/headers/plugin-cursor-dark.png and b/Brand/Exports/headers/plugin-cursor-dark.png differ
diff --git a/Brand/Exports/headers/plugin-cursor-light.png b/Brand/Exports/headers/plugin-cursor-light.png
index 910d035..1b226b5 100644
Binary files a/Brand/Exports/headers/plugin-cursor-light.png and b/Brand/Exports/headers/plugin-cursor-light.png differ
diff --git a/Brand/Exports/headers/plugin-swift-format-dark.png b/Brand/Exports/headers/plugin-swift-format-dark.png
index 51f0839..65ab7b4 100644
Binary files a/Brand/Exports/headers/plugin-swift-format-dark.png and b/Brand/Exports/headers/plugin-swift-format-dark.png differ
diff --git a/Brand/Exports/headers/plugin-swift-format-light.png b/Brand/Exports/headers/plugin-swift-format-light.png
index 1e0c124..2ff1d75 100644
Binary files a/Brand/Exports/headers/plugin-swift-format-light.png and b/Brand/Exports/headers/plugin-swift-format-light.png differ
diff --git a/Brand/Exports/headers/plugin-trae-dark.png b/Brand/Exports/headers/plugin-trae-dark.png
index ffe793d..ad0f129 100644
Binary files a/Brand/Exports/headers/plugin-trae-dark.png and b/Brand/Exports/headers/plugin-trae-dark.png differ
diff --git a/Brand/Exports/headers/plugin-trae-light.png b/Brand/Exports/headers/plugin-trae-light.png
index a7aee95..4032216 100644
Binary files a/Brand/Exports/headers/plugin-trae-light.png and b/Brand/Exports/headers/plugin-trae-light.png differ
diff --git a/Brand/Exports/icons/apple-cli.png b/Brand/Exports/icons/apple-cli.png
index e7398ef..c549f2c 100644
Binary files a/Brand/Exports/icons/apple-cli.png and b/Brand/Exports/icons/apple-cli.png differ
diff --git a/Brand/Exports/icons/apple-cli.svg b/Brand/Exports/icons/apple-cli.svg
index 3205445..644caf0 100644
--- a/Brand/Exports/icons/apple-cli.svg
+++ b/Brand/Exports/icons/apple-cli.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/homebrew-tap.png b/Brand/Exports/icons/homebrew-tap.png
index 0323a2a..37b7b2c 100644
Binary files a/Brand/Exports/icons/homebrew-tap.png and b/Brand/Exports/icons/homebrew-tap.png differ
diff --git a/Brand/Exports/icons/homebrew-tap.svg b/Brand/Exports/icons/homebrew-tap.svg
index 0a96ec9..88e1344 100644
--- a/Brand/Exports/icons/homebrew-tap.svg
+++ b/Brand/Exports/icons/homebrew-tap.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-claude.png b/Brand/Exports/icons/plugin-claude.png
index 51b1bb3..55e0b61 100644
Binary files a/Brand/Exports/icons/plugin-claude.png and b/Brand/Exports/icons/plugin-claude.png differ
diff --git a/Brand/Exports/icons/plugin-claude.svg b/Brand/Exports/icons/plugin-claude.svg
index 9d0e762..d2777a8 100644
--- a/Brand/Exports/icons/plugin-claude.svg
+++ b/Brand/Exports/icons/plugin-claude.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-codex.png b/Brand/Exports/icons/plugin-codex.png
index df8a261..8b1905b 100644
Binary files a/Brand/Exports/icons/plugin-codex.png and b/Brand/Exports/icons/plugin-codex.png differ
diff --git a/Brand/Exports/icons/plugin-codex.svg b/Brand/Exports/icons/plugin-codex.svg
index f2050fc..0980f71 100644
--- a/Brand/Exports/icons/plugin-codex.svg
+++ b/Brand/Exports/icons/plugin-codex.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-computer-use.png b/Brand/Exports/icons/plugin-computer-use.png
index 9b2b5fb..f95ce5b 100644
Binary files a/Brand/Exports/icons/plugin-computer-use.png and b/Brand/Exports/icons/plugin-computer-use.png differ
diff --git a/Brand/Exports/icons/plugin-computer-use.svg b/Brand/Exports/icons/plugin-computer-use.svg
index fe5a81c..1f232fb 100644
--- a/Brand/Exports/icons/plugin-computer-use.svg
+++ b/Brand/Exports/icons/plugin-computer-use.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-cursor.png b/Brand/Exports/icons/plugin-cursor.png
index df39b04..1770707 100644
Binary files a/Brand/Exports/icons/plugin-cursor.png and b/Brand/Exports/icons/plugin-cursor.png differ
diff --git a/Brand/Exports/icons/plugin-cursor.svg b/Brand/Exports/icons/plugin-cursor.svg
index 71a92b4..6abb6f9 100644
--- a/Brand/Exports/icons/plugin-cursor.svg
+++ b/Brand/Exports/icons/plugin-cursor.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-swift-format.png b/Brand/Exports/icons/plugin-swift-format.png
index a590c1a..c87f367 100644
Binary files a/Brand/Exports/icons/plugin-swift-format.png and b/Brand/Exports/icons/plugin-swift-format.png differ
diff --git a/Brand/Exports/icons/plugin-swift-format.svg b/Brand/Exports/icons/plugin-swift-format.svg
index 23b5e66..aa504df 100644
--- a/Brand/Exports/icons/plugin-swift-format.svg
+++ b/Brand/Exports/icons/plugin-swift-format.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/icons/plugin-trae.png b/Brand/Exports/icons/plugin-trae.png
index 1948c08..ee504b2 100644
Binary files a/Brand/Exports/icons/plugin-trae.png and b/Brand/Exports/icons/plugin-trae.png differ
diff --git a/Brand/Exports/icons/plugin-trae.svg b/Brand/Exports/icons/plugin-trae.svg
index bd654fb..3e4b9ce 100644
--- a/Brand/Exports/icons/plugin-trae.svg
+++ b/Brand/Exports/icons/plugin-trae.svg
@@ -1,4 +1 @@
-
+
diff --git a/Brand/Exports/manifest.json b/Brand/Exports/manifest.json
index f254469..e4466c9 100644
--- a/Brand/Exports/manifest.json
+++ b/Brand/Exports/manifest.json
@@ -1,12 +1,16 @@
{
"schema_version": 1,
"inputs": {
- "DESIGN.md": "c3f499e7cbd755914f80e1216b370e39c76097dbfdcddb9b3c65343aae241722",
- "Brand/config.json": "20078d557968e6dc4ff27904f71dd8dab73b63d5c5d90adf1c0ab85d5c108cab",
- "Brand/icons.mjs": "19ef1b5d8e73b07228f814b1db1e84e2182c890a66459f24f4597ec10e9d6621",
- "Brand/render.mjs": "280e5d9ec6bbfab51680b2a685b369669885efa094fa98879d0771cd617de3bb",
+ "DESIGN.md": "17ff4ae03d20d8514fe71bb5d61c758bf9c844ecb4ce11f13d8fb5a30d0f1488",
+ "Brand/config.json": "636d3c83defbb1af45cffee9a19df862894a69bf42e9c01ee911914070c01e89",
+ "Brand/render.mjs": "66051eaa35863a104342c206b721afaa4e89b708b4ad9c5ce37b11b63180e7e0",
"Brand/package.json": "c5d5e11a37021178ac682ce2fd64a2f55dc4dfe4f333b64f0079cb1ef54686cd",
"Brand/package-lock.json": "20c5a9a8deb540da6cd2a0bbce74c944c80436b770268b0a84938058b483c169",
+ "Brand/app-icon/layers/apple-cli-calendar.svg": "6dcd1a69edbde44b6a55215d911f7e7d6c24be1660c8e1ef229eeddf76aa27c8",
+ "Brand/app-icon/layers/apple-cli-mail.svg": "4ee7ee525558c7854ba80a03846e583aab6301a4ae1c4039c083051a6eeb4726",
+ "Brand/app-icon/layers/apple-cli-notes.svg": "832b748e671542a134198bbb03597b2ed555bbbd765f6dfbe186c8c7c5fac26e",
+ "Brand/app-icon/layers/apple-cli-prompt.svg": "25593d655215f129153b46a7bb14870e7242c030a57de34edc64992792097112",
+ "Brand/app-icon/layers/apple-cli-terminal.svg": "21246452da8dfefb0a851a44f2469a761654c3de0aa5df26bf15165dbf9a1aba",
"Brand/app-icon/layers/crt-base.svg": "ab43ecd6e819f7f8713ddf9deecf02198c81d6ebcd0f1b86d4f159db506f98c7",
"Brand/app-icon/layers/crt-body.svg": "1323e36e89c20fce714888872965af41b2f5a17738d7a49aa69a198b95d9af54",
"Brand/app-icon/layers/crt-light.svg": "497967f011f5147ccf039ff5fee3993764aad2c45746ce411f5058a392ca65a4",
@@ -22,7 +26,9 @@
"bundle-version": "129",
"short-bundle-version": "27.0"
},
- "app_icons_sha256": "afeef6b0ed8a88dae42d09283633b321e29890a526b775fa506b23d27ea2fd9e"
+ "app_icons_sha256": "afeef6b0ed8a88dae42d09283633b321e29890a526b775fa506b23d27ea2fd9e",
+ "framework_icons_sha256": "fd9db95220d5d27f11cace4ee2bd8bc37b8e9a6ce000f070efc11554fd8fc29d",
+ "framework_generator_sha256": "1cd4b2c098ea4cca8fb7fe9a154f47962d837b044f083d186a144a506e2e7fd2"
},
"exports": {
"app/AppIcon.icon/Assets/01-01.svg": "5695b3bb0134f47ca6950438df98dce38c92591b57af14ff6114135e857b9d0c",
@@ -31,52 +37,52 @@
"app/AppIcon.icon/Assets/04-01.svg": "1323e36e89c20fce714888872965af41b2f5a17738d7a49aa69a198b95d9af54",
"app/AppIcon.icon/icon.json": "5daf706ea7f4aba95985a2efc9a2cf1eeea797d4ef59db1c20920e61db10a2dd",
"app/app-icon.png": "71cbd902b28a083e7726abfa5d2fe506c860b5d954fd398686af1478e6250e80",
- "headers/apple-cli-dark.png": "db2fe834c1d26a2fd16af2625f93f0c8d0a260966be7028868a2bf7cfb5f4883",
- "headers/apple-cli-light.png": "b31e03d2cb86ae2f30f1d8aa72ba17a6b8be43570869fb71faca03e08ab74254",
+ "headers/apple-cli-dark.png": "6be2dc34ef034f93d4eac966a7968a7476706027263e46a8ed4d746859dbde59",
+ "headers/apple-cli-light.png": "f45ca1abb4436ef023349d7583248837e76e9a898acd12e8988732fe40d8975b",
"headers/computer-mcp-dark.png": "3a0be729610516dfcd3e882e2c0af351eda5d02dcc83ec12c970f53bcd875355",
"headers/computer-mcp-light.png": "b60214fdb6aef03b13bbd46bbbfebbde43b8c74eeb3825b300013e17d19494f5",
"headers/computer-mcp-zh-CN-dark.png": "e257d6196952680a48bd3ffcbfa7a6564e07babadc8c29bed889058f9b8d0942",
"headers/computer-mcp-zh-CN-light.png": "c63b65ad7a8ec26313ade9d53fcf94cc84f4da2753860e84c663eaf9d270b627",
- "headers/homebrew-tap-dark.png": "959c4e2854a36dc62923a9e21b445474cff79621c0bf33ab0c2424fc9661e4d0",
- "headers/homebrew-tap-light.png": "a2ff3b55357f0660245b5222b895e649043f58e1e9bda77dad940c8d07024ee3",
- "headers/plugin-claude-dark.png": "db4614eaccf0ce6317e2e7ff910b89ad499ad98c3f50865840a55c791011cb01",
- "headers/plugin-claude-light.png": "0fbf2b5e98ce6e4984bed19c1df0e4e21fde7b5bb4e0cfb76273d644ffcb3576",
- "headers/plugin-codex-dark.png": "284e75d364ae05f1c25ad3bd241dd4cf6c2c012e1112378922ae65e7ea94cf83",
- "headers/plugin-codex-light.png": "c6245f769253420f441ffd4f7dc4984568e44a682ce8b73e0a13d7d8a5cf77df",
- "headers/plugin-computer-use-dark.png": "a5aca2c9ca572d8674dde94f54dbdcb6e81aa605865b474065c2782cf899d46a",
- "headers/plugin-computer-use-light.png": "85f5bff21ad8d9df003bd32586a1ce47e16a6e3e90ae44469932332f705a4b95",
- "headers/plugin-cursor-dark.png": "6533afb9b7d33c62539f23dd230d18d36d919ea5e9939e1774b2aac228820768",
- "headers/plugin-cursor-light.png": "afc62a6d4050a347a5e8c886b428078fc562411205ca5cd0c73a7057f8317a51",
- "headers/plugin-swift-format-dark.png": "3648814c79748e095b07786f991df96ad693cf7ff077e0832df7229e0490e069",
- "headers/plugin-swift-format-light.png": "6a59533af90f3d52e98b06efab35493641f2a7ef5faaaeda95c35dc7bcaa9a39",
- "headers/plugin-trae-dark.png": "b5753e68b2f63547a6215e5b3268c1de4616e7c74b383db5e41e37db7940903b",
- "headers/plugin-trae-light.png": "db2afc4f2f225aba3a5aeed617756dd0cbe218d054285ab249edd67c5d087d59",
- "icons/apple-cli.png": "429006c506ba0ddf4c218a002588cfe5cf19138f720d1370f48e89ff3c18eb80",
- "icons/apple-cli.svg": "b44de71eb1244590bdd752064a26b8b20131b2cd9e0db60437d1dfd1aed44892",
- "icons/homebrew-tap.png": "4a9cbcb80d21dfaa3c1c0efa201c71ac0156e69384a7c7a8992968208b13fe77",
- "icons/homebrew-tap.svg": "4c0eea8ef355377530499b8cece54c6b341c44c5faa33c172409cf8134c1b93f",
- "icons/plugin-claude.png": "7ea95e7110c9da8c0394363169df89f6afbeb8226873d0f81b98704e69150ae8",
- "icons/plugin-claude.svg": "38583f222d0e6bd40a7b78b2db366d244d409294aeb7152bf4690ae068507d04",
- "icons/plugin-codex.png": "f95c8d4675b535584b9d864617b259949ca7c737b942151b2421abffc74b1938",
- "icons/plugin-codex.svg": "9c7fcee5e8f89f2d4a66c387b9d2c982d09a8a9a88983376d7e5dc0c229b0143",
- "icons/plugin-computer-use.png": "acf55d5c9804cb9249e9df7064ae35a97ccb6a21ab5106b6e6d76e3b5aee5501",
- "icons/plugin-computer-use.svg": "8bf7fabb5fefd88481d7e4ff1ac023c3775f48b8295ed91262fe12ea2a386503",
- "icons/plugin-cursor.png": "4cb36aaf0fcf28c49fc95aa02aa3197f8054f5d2a6057574494f8d9b698d3be0",
- "icons/plugin-cursor.svg": "c356fecbcc73f0116aa93395d2d9ece24404948f809f902285148fb376f3a558",
- "icons/plugin-swift-format.png": "1d22788a6bd1db301ece9cc16208490d775fbd5e43eab2522e3f49d57abe6a02",
- "icons/plugin-swift-format.svg": "8fa67ce483693f49fbe16b2c6cc74607880ca1405b2d77a53d0189548162fe63",
- "icons/plugin-trae.png": "d4fa00856cfcd5ab1208050f83780dfe4fb9ff882a00deca7233742622735a77",
- "icons/plugin-trae.svg": "ad5636b21cb4feedd6253df84b2cdcdac55ae7c7bdd7a4d2e405600ccc04d2b1",
- "social/apple-cli.png": "03195e26b2d1ddbe68a97b0ea1b544f93b16ff9f9ce9a97572c096ad919531b1",
+ "headers/homebrew-tap-dark.png": "f8820931baf8977af69b624d3f7f39adb6db5a5dc530036f14afda5b16af40fb",
+ "headers/homebrew-tap-light.png": "888169682bb55a3f6da246867985b06f59f44729b91b0288acc77811414ffede",
+ "headers/plugin-claude-dark.png": "2c4fccaf8aa17c45a106941d50f85f48ff40d0797b2569e3442a09d13a9d230a",
+ "headers/plugin-claude-light.png": "10908cb5292ccaa048db0bc4ad39e4c65c5fe4eb904636c5ea4a0e6228d53aeb",
+ "headers/plugin-codex-dark.png": "b898a5adbb5c4839e342fe87f7fbcfa873252e0a3648f7aff50c4ded3dd8d133",
+ "headers/plugin-codex-light.png": "2be839fa143e82d24ad9d57f6c600a177aec90f1473d87c810abb6a6899efa98",
+ "headers/plugin-computer-use-dark.png": "53d684caada0cf9a6a1ad51cb13ac8e594c6131901ed9b5085d5c4ef25b787b2",
+ "headers/plugin-computer-use-light.png": "0a39db776f527583a764216df0458f03f7a1a0ff073f43de2daa462761ac8ea3",
+ "headers/plugin-cursor-dark.png": "4e3f6d8edaf3dcc9ab39d6220e316c695e7f78c9210828c0470447293f623d77",
+ "headers/plugin-cursor-light.png": "7de614de9d82c3b7a0713a598aa3c4d1713a1d8c59e33d205fcc646c3e50db28",
+ "headers/plugin-swift-format-dark.png": "8572eb615cd68728411977fca8e7300595056ca38f9ffddee2699d6545013e55",
+ "headers/plugin-swift-format-light.png": "5a79ef81d7fefc32b09af676096405612b4cff9a6a5f377fb82f9497b572db74",
+ "headers/plugin-trae-dark.png": "734d82de63b9925fd1516d42d197570a2894b45ed5ed38a76f2e581d0821358f",
+ "headers/plugin-trae-light.png": "bb9b7fa15bf272aa305e70eec318f0715592e55a00968370c950867065acf657",
+ "icons/apple-cli.png": "593f5673ad49444caf49cae789d6d587ee4de044a95e81c31699a565fac3a63a",
+ "icons/apple-cli.svg": "0e9cfd1e5abf33ca3a50a7a64e5a3cf7382505ff2cac23d7743f0a4a70a3a559",
+ "icons/homebrew-tap.png": "84a1347105ffeb0837aa6836fffb5d542915d8d95b6fca27f04ffe7305a0ea91",
+ "icons/homebrew-tap.svg": "decae21df93a4fce8a7569a5d2a578e78b25fc102297183ddce3edc18e10a41c",
+ "icons/plugin-claude.png": "03c035a8927ba4aabaf662bc914e65ce9231d09c0ca184b124d25e99562dbb62",
+ "icons/plugin-claude.svg": "d2e451cb368fbe69066c6c9afd377a50b37420807029011eeb52f9d45767377d",
+ "icons/plugin-codex.png": "0befd060527f9006b375fbd81e739d13646da590e6ac53f54d99ae13aa2b00cf",
+ "icons/plugin-codex.svg": "3dad79ae64db570ebc68a27edb54da16e4810c9c8239eb1ec334f46671f80d91",
+ "icons/plugin-computer-use.png": "15f4a29f897f471d701cbeee77af6d8440fe5669765aabe9f64b8dabb955239d",
+ "icons/plugin-computer-use.svg": "f12762274e9a246cd8e0961480ab3a942516306715393313d6d22c77374c0b3d",
+ "icons/plugin-cursor.png": "e2463c259c0dc113d9ecfbfe036ce5f77790e36a5f6eed5d6d880939c9888d17",
+ "icons/plugin-cursor.svg": "bfd9a052e702eb110e68b3cac73c6604dbe1e6727d3aafe3462666ea75d2dea1",
+ "icons/plugin-swift-format.png": "f834ed504720fe916c0ba0de81546a0690267fc1ece0c059523e08a23aba0199",
+ "icons/plugin-swift-format.svg": "a8f315bc88ece6cfffd5baa4cba8c1b21f78ec6f0b6a7ee0093b2f8fc01332c3",
+ "icons/plugin-trae.png": "5f5773dafcfed8b929c1dd26386f93cb7a4476725c08fe70bc724d9e126beebe",
+ "icons/plugin-trae.svg": "ae120f5536be39dd528775575898da8717f7f3d08cd2a21fb9163ac6c90dea5e",
+ "social/apple-cli.png": "414206f5b4f996b47c92a91b91da60942c4c612fbcf182b89b2a880cbfad828e",
"social/computer-mcp-zh-CN.png": "9a66ef45c7077dafb8bc4d348a7107534b1c5e7cacad91ab98fcc83e660937f8",
"social/computer-mcp.png": "ce522f0113e87d6c453b05cebd6d71ddaa8477b3380a03f40c7e9fd72726f12b",
- "social/homebrew-tap.png": "d0b5f9d95c6b2bf86d745875090b535c38e1fc8f7dc84a44850818701d9bef76",
- "social/plugin-claude.png": "3bf6daa858095b3784c2b996367a3a5129bcc0baf9551b5f2bdef7da1866ed82",
- "social/plugin-codex.png": "81cc536d5b242607328b170d6e91304619b21721451785118df1eae43c3615bf",
- "social/plugin-computer-use.png": "19ee560444285a2d5b77fbf4d58614a20b3fcff190c72a54c816e1bce66b4856",
- "social/plugin-cursor.png": "62b3c54b74b0d05f2abb5b168641dd261e36aa49cb4aa0d55b42393d8c46d5ca",
- "social/plugin-swift-format.png": "1898726c1de37f94c766fcc5e5a15d0fd3b796b5db482473021fb90942d34ed1",
- "social/plugin-trae.png": "2849270390305db1a00aed7945a802ceec7fd133f55bb2b076e0cce5c530018f",
+ "social/homebrew-tap.png": "90f2ce3932b0b3e7979ee48f348bbb828fa08d44d3072b37d185d976da1f0668",
+ "social/plugin-claude.png": "c55b173342b0098cb3319009770616c37ae07d7e2cc10e3ca9592ad3564a1e3c",
+ "social/plugin-codex.png": "068e40fe201504795a8a7db771fcb224b8bd89e77d2a1d2203f168e59775e8e0",
+ "social/plugin-computer-use.png": "d45fd9e87d9554e47d098edd222eaf27fcf8d56ca123d0cd79d4d3095712caa6",
+ "social/plugin-cursor.png": "5439826c330e307190798ab7b8476f89426bad099b73cc4dacc588d043f01207",
+ "social/plugin-swift-format.png": "ea577bc96c3cd1dc5b20dc13efb60df4dc2879537804ba042d80990ca6e4ee4f",
+ "social/plugin-trae.png": "9cad5baaa4e5b8c4b7b30fe8b41d82a3b32809a08c565a390d544904f049e02b",
"web/apple-touch-icon.png": "a03354d9ef09076806c88e46acef5ecee3739e0e20137ff8741c57df68cd6c92",
"web/avatar.png": "34ce8f1feb34c6f19f9927679fc3b6532bfaa3e884920d9374d61b70d54d9134",
"web/favicon-32.png": "8897fa0aac13eb5719376881018579175d3536f0c6e6a21f617049cf8e435156",
diff --git a/Brand/Exports/social/apple-cli.png b/Brand/Exports/social/apple-cli.png
index 4929a40..a288d34 100644
Binary files a/Brand/Exports/social/apple-cli.png and b/Brand/Exports/social/apple-cli.png differ
diff --git a/Brand/Exports/social/homebrew-tap.png b/Brand/Exports/social/homebrew-tap.png
index 4e10db0..0d96e3c 100644
Binary files a/Brand/Exports/social/homebrew-tap.png and b/Brand/Exports/social/homebrew-tap.png differ
diff --git a/Brand/Exports/social/plugin-claude.png b/Brand/Exports/social/plugin-claude.png
index 2072d81..89041f2 100644
Binary files a/Brand/Exports/social/plugin-claude.png and b/Brand/Exports/social/plugin-claude.png differ
diff --git a/Brand/Exports/social/plugin-codex.png b/Brand/Exports/social/plugin-codex.png
index e8d105c..a463f41 100644
Binary files a/Brand/Exports/social/plugin-codex.png and b/Brand/Exports/social/plugin-codex.png differ
diff --git a/Brand/Exports/social/plugin-computer-use.png b/Brand/Exports/social/plugin-computer-use.png
index c18085e..2f61953 100644
Binary files a/Brand/Exports/social/plugin-computer-use.png and b/Brand/Exports/social/plugin-computer-use.png differ
diff --git a/Brand/Exports/social/plugin-cursor.png b/Brand/Exports/social/plugin-cursor.png
index 49450b3..dbbf968 100644
Binary files a/Brand/Exports/social/plugin-cursor.png and b/Brand/Exports/social/plugin-cursor.png differ
diff --git a/Brand/Exports/social/plugin-swift-format.png b/Brand/Exports/social/plugin-swift-format.png
index 63371f1..455beb4 100644
Binary files a/Brand/Exports/social/plugin-swift-format.png and b/Brand/Exports/social/plugin-swift-format.png differ
diff --git a/Brand/Exports/social/plugin-trae.png b/Brand/Exports/social/plugin-trae.png
index 242120a..0544eec 100644
Binary files a/Brand/Exports/social/plugin-trae.png and b/Brand/Exports/social/plugin-trae.png differ
diff --git a/Brand/app-icon/layers/apple-cli-calendar.svg b/Brand/app-icon/layers/apple-cli-calendar.svg
new file mode 100644
index 0000000..45791b5
--- /dev/null
+++ b/Brand/app-icon/layers/apple-cli-calendar.svg
@@ -0,0 +1 @@
+
diff --git a/Brand/app-icon/layers/apple-cli-mail.svg b/Brand/app-icon/layers/apple-cli-mail.svg
new file mode 100644
index 0000000..b62b4bb
--- /dev/null
+++ b/Brand/app-icon/layers/apple-cli-mail.svg
@@ -0,0 +1 @@
+
diff --git a/Brand/app-icon/layers/apple-cli-notes.svg b/Brand/app-icon/layers/apple-cli-notes.svg
new file mode 100644
index 0000000..e34b648
--- /dev/null
+++ b/Brand/app-icon/layers/apple-cli-notes.svg
@@ -0,0 +1 @@
+
diff --git a/Brand/app-icon/layers/apple-cli-prompt.svg b/Brand/app-icon/layers/apple-cli-prompt.svg
new file mode 100644
index 0000000..e5e325e
--- /dev/null
+++ b/Brand/app-icon/layers/apple-cli-prompt.svg
@@ -0,0 +1 @@
+
diff --git a/Brand/app-icon/layers/apple-cli-terminal.svg b/Brand/app-icon/layers/apple-cli-terminal.svg
new file mode 100644
index 0000000..e6fa43a
--- /dev/null
+++ b/Brand/app-icon/layers/apple-cli-terminal.svg
@@ -0,0 +1 @@
+
diff --git a/Brand/config.json b/Brand/config.json
index a4be204..59eda00 100644
--- a/Brand/config.json
+++ b/Brand/config.json
@@ -47,56 +47,57 @@
},
{
"repository": "plugin-codex",
- "glyph": "braces",
+ "request": "Hand the parser refactor to Codex and show me the diff.",
"title": "Codex",
"eyebrow": "Computer MCP plugin",
"line": { "en": "Codex execution and protocol inspection" }
},
{
"repository": "plugin-computer-use",
- "glyph": "pointer",
+ "request": "Export the open Keynote deck as a PDF.",
"title": "Computer Use",
"eyebrow": "Computer MCP plugin",
"line": { "en": "Native desktop observation and actions" }
},
{
"repository": "plugin-claude",
- "glyph": "speech",
+ "request": "Ask Claude Code to fix the failing test on this branch.",
"title": "Claude Code",
"eyebrow": "Computer MCP plugin",
"line": { "en": "Claude Code CLI and streaming MCP adapter" }
},
{
"repository": "plugin-cursor",
- "glyph": "caret",
+ "request": "Have Cursor's agent rename the settings screen everywhere.",
"title": "Cursor",
"eyebrow": "Computer MCP plugin",
"line": { "en": "Cursor Agent CLI and ACP integration" }
},
{
"repository": "plugin-swift-format",
- "glyph": "bars",
+ "request": "Format the package and fix the lint warnings.",
"title": "Swift Format",
"eyebrow": "Computer MCP plugin",
"line": { "en": "Verified Swift formatting and linting" }
},
{
"repository": "plugin-trae",
- "glyph": "play",
+ "request": "Start a TRAE session to add a dark mode.",
"title": "TRAE",
"eyebrow": "Computer MCP plugin",
"line": { "en": "TRAE sessions through ACP" }
},
{
"repository": "apple-cli",
- "glyph": "prompt",
+ "request": "Add “Renew passport” to Reminders for Friday.",
+ "screen": { "ink": ["apple-cli-notes", "apple-cli-calendar", "apple-cli-mail", "apple-cli-terminal"], "inlay": ["apple-cli-prompt"], "box": [205, 205, 614, 614] },
"title": "Apple CLI",
"eyebrow": "Computer MCP tool",
"line": { "en": "A local macOS CLI and MCP server for Apple apps" }
},
{
"repository": "homebrew-tap",
- "glyph": "tray",
+ "commands": ["brew install --cask computer-mcp/tap/computer-mcp", "brew install computer-mcp/tap/apple-cli"], "installs": ["computer-mcp", "apple-cli"],
"title": "Homebrew Tap",
"eyebrow": "Computer MCP distribution",
"line": { "en": "Install Computer MCP and Apple CLI with Homebrew" }
diff --git a/Brand/icons.mjs b/Brand/icons.mjs
deleted file mode 100644
index 71bc11d..0000000
--- a/Brand/icons.mjs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Computer MCP component icons and glyphs. Geometry is drawn on Apple's 1024 canvas with the body on
-// the 824 grid; glyphs live in a 100-unit box. Colors come from DESIGN.md tokens.
-
-export const GLYPHS = {
- pointer: { strokes: ['M32 16 L32 78 L46 65 L56 86 L67 81 L57 60 L76 60 Z'] },
- prompt: { strokes: ['M24 30 L46 50 L24 70', 'M56 72 L80 72'] },
- braces: {
- strokes: [
- 'M40 18 C30 18 32 28 32 36 C32 44 28 50 20 50 C28 50 32 56 32 64 C32 72 30 82 40 82',
- 'M60 18 C70 18 68 28 68 36 C68 44 72 50 80 50 C72 50 68 56 68 64 C68 72 70 82 60 82',
- ],
- },
- bars: { strokes: ['M22 30 L78 30', 'M36 50 L78 50', 'M36 70 L64 70'] },
- speech: { strokes: ['M30 22 L70 22 Q80 22 80 32 L80 54 Q80 64 70 64 L46 64 L32 78 L33 64 L30 64 Q20 64 20 54 L20 32 Q20 22 30 22 Z'] },
- caret: { strokes: ['M38 20 L62 20', 'M38 80 L62 80', 'M50 20 L50 80'] },
- play: { strokes: ['M34 22 L76 50 L34 78 Z'] },
- tray: { strokes: ['M50 16 L50 56', 'M34 42 L50 58 L66 42', 'M20 62 L20 80 L80 80 L80 62'] },
-};
-
-const SVG = (body, defs = '', size = 1024) =>
- `\n`;
-
-export function squircle(cx = 512, cy = 512, r = 412, n = 5, steps = 360) {
- let d = '';
- for (let i = 0; i < steps; i++) {
- const t = (i / steps) * 2 * Math.PI;
- const c = Math.cos(t), s = Math.sin(t);
- const x = cx + r * Math.sign(c) * Math.abs(c) ** (2 / n);
- const y = cy + r * Math.sign(s) * Math.abs(s) ** (2 / n);
- d += (i ? 'L' : 'M') + x.toFixed(2) + ' ' + y.toFixed(2);
- }
- return d + 'Z';
-}
-
-export function glyph(name, { cx, cy, size, color, stroke }) {
- const g = GLYPHS[name];
- if (!g) throw new Error(`Unknown glyph: ${name}`);
- const s = size / 100;
- const strokes = (g.strokes || [])
- .map((d) => ``)
- .join('');
- const fills = (g.fills || []).map((d) => ``).join('');
- return `${strokes}${fills}`;
-}
-
-// The mark: three planes stacked up and to the right, centred on the canvas.
-function geometry() {
- const W = 430, H = 324, R = 64, off = 58, n = 2;
- const x0 = 512 - (W + n * off) / 2, y0 = 512 - (H + n * off) / 2;
- const planes = ['workspace', 'capabilities', 'result'].map((role, i) => ({ role, x: x0 + i * off, y: y0 + (n - i) * off }));
- const front = planes[n];
- return { W, H, R, planes, glyph: { cx: front.x + W / 2, cy: front.y + H / 2, size: 210, stroke: 9 } };
-}
-
-const planeFill = (c, role) => ({ workspace: c['icon-plane-back'], capabilities: c['icon-plane-mid'], result: c['icon-plane-front'] })[role];
-
-// Layers in front-to-back order; each is a self-contained SVG fragment on the 1024 canvas.
-function layers(c, glyphName) {
- const g = geometry();
- return [
- ['glyph', glyph(glyphName, { ...g.glyph, color: c['icon-glyph'] })],
- ...g.planes.slice().reverse().map((p) => [`plane-${p.role}`, ``]),
- ];
-}
-
-const SHADOW = '';
-const LIFTED = new Set(['plane-capabilities', 'plane-result']);
-
-function artwork(c, glyphName) {
- return layers(c, glyphName).reverse()
- .map(([name, body]) => (LIFTED.has(name) ? `${body}` : body)).join('');
-}
-
-// A component icon: squircle body on the 824 grid with a soft drop shadow.
-export function componentIcon(c, glyphName) {
- const body = squircle();
- const defs = `
- ${SHADOW}
- `;
- return SVG(`
- ${artwork(c, glyphName)}`, defs);
-}
diff --git a/Brand/render.mjs b/Brand/render.mjs
index 2c7fb86..1ae3e34 100644
--- a/Brand/render.mjs
+++ b/Brand/render.mjs
@@ -1,5 +1,5 @@
// Render every Computer MCP brand asset from DESIGN.md and config.json into Exports/.
-// Usage: APP_ICONS_SCRIPT=/path/to/app_icons.py node Brand/render.mjs
+// Usage: APP_ICONS_SCRIPT=/path/to/app_icons.py FRAMEWORK_ICONS_SCRIPT=/path/to/design_icons.py node Brand/render.mjs
import { execFileSync } from 'node:child_process';
import crypto from 'node:crypto';
@@ -7,23 +7,26 @@ import fs from 'node:fs';
import path from 'node:path';
import YAML from 'yaml';
import { chromium } from 'playwright';
-import { componentIcon, glyph } from './icons.mjs';
const BRAND = path.dirname(new URL(import.meta.url).pathname);
const ROOT = path.dirname(BRAND);
const EXPORTS = path.join(BRAND, 'Exports');
const CACHE = path.join(BRAND, '.cache');
const INPUTS = [
- 'DESIGN.md', 'Brand/config.json', 'Brand/icons.mjs', 'Brand/render.mjs', 'Brand/package.json', 'Brand/package-lock.json',
+ 'DESIGN.md', 'Brand/config.json', 'Brand/render.mjs', 'Brand/package.json', 'Brand/package-lock.json',
...fs.readdirSync(path.join(BRAND, 'app-icon', 'layers')).filter((name) => name.endsWith('.svg')).sort()
.map((name) => `Brand/app-icon/layers/${name}`),
];
const APP_ICONS_SCRIPT = process.env.APP_ICONS_SCRIPT;
if (!APP_ICONS_SCRIPT?.trim()) throw new Error('Set APP_ICONS_SCRIPT to the apple-app-icon-design generator script (app_icons.py). Icon Composer from Xcode is required; IC_TOOL can select its ictool.');
+const FRAMEWORK_ICONS_SCRIPT = process.env.FRAMEWORK_ICONS_SCRIPT;
+if (!FRAMEWORK_ICONS_SCRIPT?.trim()) throw new Error('Set FRAMEWORK_ICONS_SCRIPT to the apple-framework-icon-design generator script (design_icons.py).');
const sha256 = (data) => crypto.createHash('sha256').update(data).digest('hex');
const config = JSON.parse(fs.readFileSync(path.join(BRAND, 'config.json'), 'utf8'));
-const design = YAML.parse(fs.readFileSync(path.join(ROOT, 'DESIGN.md'), 'utf8').match(/^---\n([\s\S]*?)\n---\n/)[1]);
+const designText = fs.readFileSync(path.join(ROOT, 'DESIGN.md'), 'utf8');
+const design = YAML.parse(designText.match(/^---\n([\s\S]*?)\n---\n/)[1]);
+const iconography = JSON.parse(designText.split('\n## Iconography\n')[1].match(/```json\n([\s\S]*?)\n```/)[1]);
const c = design.colors, t = design.typography, r = design.rounded;
async function fonts() {
@@ -116,14 +119,40 @@ function link(p, points, width = 30) {
const check = (color) => ``;
-const glyphSvg = (name, color, size) => ``;
+// A member's mark on the computer's screen: its icon's glyph flat in ink, with inlaid parts in the
+// screen's amber. Framework glyphs inlay their surface parts; an app icon names its layers in config.
+function mark(member, p, size) {
+ if (member.installs) {
+ const side = Math.round(size * 0.68);
+ return `
${member.installs.map((name) => `

`).join('')}
`;
+ }
+ const ink = c['on-signal'];
+ const entry = iconography.icons[member.repository];
+ if (entry) {
+ const parts = entry.custom_glyph.layers.map((layer) => {
+ const paint = layer.surface ? p.signal : ink;
+ const look = layer.stroke
+ ? `fill="none" stroke="${paint}" stroke-width="${layer.width ?? 0.16}" stroke-linecap="round" stroke-linejoin="round"`
+ : `fill="${paint}"${layer.round ? ` stroke="${paint}" stroke-width="${layer.round}" stroke-linejoin="round"` : ''}`;
+ return layer.circle ? `` : ``;
+ });
+ return ``;
+ }
+ const { ink: inked, inlay, box } = member.screen;
+ const art = (names, paint) => names.map((name) => `${LAYER(name)}`).join('');
+ return ``;
+}
+
+// The code-block component carrying a member's commands, each behind an amber prompt.
+const commandCard = (p, commands, style) => `
+ ${commands.map((x) => `
$ ${esc(x)}
`).join('')}
`;
function header(faces, member, mode, locale = 'en') {
const p = palette(mode);
const isApp = member.repository === 'computer-mcp';
- const icon = isApp ? appIconPng : dataUri(componentIcon(c, member.glyph));
- const screen = isApp ? '' : glyphSvg(member.glyph, c['on-signal'], 84);
- const ask = esc(config.copy.request[locale] ?? config.copy.request.en);
+ const icon = icons[member.repository];
+ const screen = isApp ? '' : mark(member, p, 84);
+ const ask = esc(member.request ?? config.copy.request[locale] ?? config.copy.request.en);
return page(faces, 1280, 320, `
body{background:${p.bg};color:${p.fg}}
.id{position:absolute;left:64px;top:0;height:320px;display:flex;align-items:center;gap:36px;z-index:2}
@@ -135,14 +164,14 @@ function header(faces, member, mode, locale = 'en') {
.req div{${typo('body-md', { fontSize: '15px', lineHeight: 1.35 })};word-break:keep-all;background:${p.signal};color:${c['on-signal']};border-radius:16px 16px 6px 16px;padding:9px 13px}
`, `${link(p, [[972, 79], [1120, 79], [1120, 116]], 22)}
${computer(p, { cx: 1120, top: 116, h: 184 }, screen)}
-
+ ${member.commands ? commandCard(p, member.commands, 'right:302px;top:44px') : ``}

${member.eyebrow ? `
${esc(member.eyebrow)}
` : ''}
${esc(member.title)}
${esc(member.line[locale])}
`);
}
function appSocial(faces, member, locale) {
const p = palette('light');
const zh = locale === 'zh-CN';
- const icon = appIconPng;
+ const icon = icons[member.repository];
const card = { x: 744, y: 64, w: 372 };
const lx = 1000, top = 268;
const result = `
@@ -172,7 +201,7 @@ function appSocial(faces, member, locale) {
function memberSocial(faces, member) {
const p = palette('light');
- const icon = dataUri(componentIcon(c, member.glyph));
+ const icon = icons[member.repository];
const B = { x: 760, y: 96, w: 210, h: 150 }, cx = 1060, top = 290;
return page(faces, 1280, 640, `
body{background:${p.bg};color:${p.fg}}
@@ -184,11 +213,12 @@ function memberSocial(faces, member) {
.url{position:absolute;left:80px;bottom:76px;${typo('label-lg')};color:${p.muted}}
.bubble{position:absolute;z-index:2;background:${p.raised};border:1px solid ${p.line};border-radius:28px;box-shadow:${p.shadow};display:flex;align-items:center;justify-content:center;gap:16px}
.bubble i{width:18px;height:18px;border-radius:50%;background:${c['on-surface']}}
- `, `${link(p, [[B.x + B.w - 24, B.y + B.h / 2], [cx, B.y + B.h / 2], [cx, top + 4]], 34)}
+ `, `${member.commands ? `${link(p, [[1000, 145], [cx, 145], [cx, top + 4]], 34)}
+ ${commandCard(p, member.commands, 'right:256px;top:110px')}` : `${link(p, [[B.x + B.w - 24, B.y + B.h / 2], [cx, B.y + B.h / 2], [cx, top + 4]], 34)}
-
- ${computer(p, { cx, top, h: 286 }, glyphSvg(member.glyph, c['on-signal'], 120))}
+
`}
+ ${computer(p, { cx, top, h: 286 }, mark(member, p, 120))}

${esc(member.eyebrow)}
${esc(member.title)}
${esc(member.line.en)}
github.com/computer-mcp/${member.repository}
`);
@@ -211,30 +241,51 @@ function copyDirectory(source, target) {
}
}
-function generateAppIcon() {
- fs.mkdirSync(CACHE, { recursive: true });
- const temporary = fs.mkdtempSync(path.join(CACHE, 'app-icon-'));
- const output = path.join(temporary, 'output');
- try {
- execFileSync('python3', [APP_ICONS_SCRIPT, path.join(ROOT, 'DESIGN.md'), '--name', 'computer-mcp', '--style', 'liquid-glass', '--out', output], { stdio: 'inherit' });
+// App icons from the app_icons entries. The App's document, rendition and web icons serve the App and
+// the website; another app icon becomes that member's icon.
+function generateAppIcons(work) {
+ let renderer;
+ for (const name of Object.keys(iconography.app_icons)) {
+ const output = path.join(work, name);
+ execFileSync('python3', [APP_ICONS_SCRIPT, path.join(ROOT, 'DESIGN.md'), '--name', name, '--style', 'liquid-glass', '--out', output], { stdio: 'inherit' });
const manifest = JSON.parse(fs.readFileSync(path.join(output, 'manifest.json'), 'utf8'));
+ renderer = typeof manifest.renderer === 'string' ? JSON.parse(manifest.renderer) : manifest.renderer;
const png = fs.readFileSync(path.join(output, 'renditions', 'macOS-Default.png'));
- fs.rmSync(EXPORTS, { recursive: true, force: true });
- copyDirectory(path.join(output, 'computer-mcp.icon'), 'app/AppIcon.icon');
- write('app/app-icon.png', png);
- for (const name of ['favicon.svg', 'favicon-32.png', 'apple-touch-icon.png']) {
- write(`web/${name}`, fs.readFileSync(path.join(output, 'web', name)));
+ icons[name] = dataUri(png, 'image/png');
+ if (name === 'computer-mcp') {
+ copyDirectory(path.join(output, `${name}.icon`), 'app/AppIcon.icon');
+ write('app/app-icon.png', png);
+ for (const file of ['favicon.svg', 'favicon-32.png', 'apple-touch-icon.png']) {
+ write(`web/${file}`, fs.readFileSync(path.join(output, 'web', file)));
+ }
+ write('web/avatar.png', fs.readFileSync(path.join(output, 'web', 'avatar-1024.png')));
+ } else {
+ write(`icons/${name}.svg`, fs.readFileSync(path.join(output, 'web', 'favicon.svg')));
+ write(`icons/${name}.png`, fs.readFileSync(path.join(output, 'web', 'icon-512.png')));
}
- write('web/avatar.png', fs.readFileSync(path.join(output, 'web', 'avatar-1024.png')));
- const renderer = typeof manifest.renderer === 'string' ? JSON.parse(manifest.renderer) : manifest.renderer;
- return { png: dataUri(png, 'image/png'), renderer, generator: sha256(fs.readFileSync(APP_ICONS_SCRIPT)) };
- } finally {
- fs.rmSync(temporary, { recursive: true, force: true });
}
+ return renderer;
}
-const app = generateAppIcon();
-const appIconPng = app.png;
+// Component icons from the icons entries; their PNGs are rasterized with the other exports.
+function generateFrameworkIcons(work) {
+ const output = path.join(work, 'framework');
+ execFileSync('python3', [FRAMEWORK_ICONS_SCRIPT, path.join(ROOT, 'DESIGN.md'), '--out', output], { stdio: 'inherit' });
+ return Object.fromEntries(Object.keys(iconography.icons).map((name) => [name, fs.readFileSync(path.join(output, `${name}.svg`), 'utf8')]));
+}
+
+const icons = {};
+fs.mkdirSync(CACHE, { recursive: true });
+const work = fs.mkdtempSync(path.join(CACHE, 'icons-'));
+let appRenderer, frameworkSvgs;
+try {
+ fs.rmSync(EXPORTS, { recursive: true, force: true });
+ appRenderer = generateAppIcons(work);
+ frameworkSvgs = generateFrameworkIcons(work);
+} finally {
+ fs.rmSync(work, { recursive: true, force: true });
+}
+for (const [name, svg] of Object.entries(frameworkSvgs)) icons[name] = dataUri(svg);
const faces = await fonts();
const browser = await chromium.launch();
const context = await browser.newContext();
@@ -262,8 +313,8 @@ const S = config.sizes;
for (const member of config.members) {
const repo = member.repository;
- if (repo !== 'computer-mcp') {
- const svg = componentIcon(c, member.glyph);
+ const svg = frameworkSvgs[repo];
+ if (svg) {
write(`icons/${repo}.svg`, svg);
await shot(`icons/${repo}.png`, raster(faces, svg, S.icon), S.icon, true);
}
@@ -278,7 +329,12 @@ const pkg = JSON.parse(fs.readFileSync(path.join(BRAND, 'node_modules/playwright
const manifest = {
schema_version: 1,
inputs: Object.fromEntries(INPUTS.map((name) => [name, sha256(fs.readFileSync(path.join(ROOT, name)))])),
- renderer: { playwright: pkg.version, chromium: browser.version(), node: process.version, platform: process.platform, architecture: process.arch, ictool: app.renderer, app_icons_sha256: app.generator },
+ renderer: {
+ playwright: pkg.version, chromium: browser.version(), node: process.version, platform: process.platform, architecture: process.arch,
+ ictool: appRenderer, app_icons_sha256: sha256(fs.readFileSync(APP_ICONS_SCRIPT)),
+ framework_icons_sha256: sha256(fs.readFileSync(FRAMEWORK_ICONS_SCRIPT)),
+ framework_generator_sha256: sha256(fs.readFileSync(path.join(path.dirname(FRAMEWORK_ICONS_SCRIPT), 'stack_logo.py'))),
+ },
exports: Object.fromEntries([...written].sort().map((name) => [name, sha256(fs.readFileSync(path.join(EXPORTS, name)))])),
};
await browser.close();
diff --git a/DESIGN.md b/DESIGN.md
index bcaa931..5b6d15a 100644
--- a/DESIGN.md
+++ b/DESIGN.md
@@ -41,11 +41,6 @@ colors:
caution: "#FFCC00"
focus: "#5A4BF5"
focus-dark: "#8B80FF"
- icon-body: "#17161F"
- icon-plane-back: "#2B2740"
- icon-plane-mid: "#FFB347"
- icon-plane-front: "#F4EFE3"
- icon-glyph: "#17161F"
typography:
headline-display:
fontFamily: Inter
@@ -118,7 +113,6 @@ rounded:
md: 12px
lg: 20px
xl: 28px
- plane: 64px
full: 9999px
spacing:
unit: 4px
@@ -295,19 +289,6 @@ components:
focus-ring-dark:
backgroundColor: "{colors.focus-dark}"
width: 2px
- component-icon-body:
- backgroundColor: "{colors.icon-body}"
- size: 824px
- component-icon-plane-workspace:
- backgroundColor: "{colors.icon-plane-back}"
- rounded: "{rounded.plane}"
- component-icon-plane-capabilities:
- backgroundColor: "{colors.icon-plane-mid}"
- rounded: "{rounded.plane}"
- component-icon-plane-result:
- backgroundColor: "{colors.icon-plane-front}"
- textColor: "{colors.icon-glyph}"
- rounded: "{rounded.plane}"
---
# Computer MCP
@@ -339,18 +320,18 @@ About window.
## Colors
-- **Ink (#17161F):** text, the component icon body and code surfaces. Never pure black.
+- **Ink (#17161F):** text, the glyph on the computer's screen and code surfaces. Never pure black.
- **Slate (#5F5B70):** secondary text, captions and metadata.
- **Violet (#5A4BF5; #8B80FF on dark):** actions and navigation — primary buttons, links and the
App icon's field. Labels on violet are white (#121019 on the dark-mode violet). Hover darkens the
fill to **#4A3BE0**.
- **Amber (#FFB347; #FFC266 on dark):** the active path — the chat request, the active link and the
- screen it lights — plus the App icon's screen and the middle plane of component icons. Labels on
- amber are ink; amber is never used as text on light surfaces.
+ screen it lights — plus the App icon's screen. Labels on amber are ink; amber is never used as
+ text on light surfaces.
- **Ivory (#F4EFE3):** chips, the computer's case (**#DDD5C3** edge, **#E3DAC6** chin; **#E9E2D2**,
- **#BFB6A3** and **#CFC5B0** on dark), the front plane of component icons and text on code
- surfaces.
-- **Violet ink (#2B2740):** the back plane of component icons.
+ **#BFB6A3** and **#CFC5B0** on dark) and text on code surfaces.
+- **Product colors:** each component icon takes the main color of the product it serves, as listed
+ in the [Icon Family](#icon-family); these colors appear only in those icons.
- **Link rail (#E6E2FF; #2A2547 on dark):** the band under the active link.
- **Surfaces:** page **#FBF8F1** and raised **#FFFFFF** in light mode; **#121019** and **#1C1A26**
in dark mode, with lines **#E7E1D3** and **#2C2938**.
@@ -410,34 +391,45 @@ a 1px line border.
Cards use a 20px radius; buttons 12px; chips 6px; packets are fully rounded. The link is a
straight band with round caps that bends at most once. The computer is drawn from the App icon's own
-layers with continuous corners; component icons use a 64px plane radius on the 824px grid at 1024
-scale.
+layers with continuous corners; component icons take the framework generator's slab geometry.
## Icon Family
-- **Structure:** component icons are an ink body carrying a centred three-plane stack — violet-ink
- workspace, amber capabilities, ivory result — each plane 58px up and to the right of the one
- beneath it. Icons never carry the chat card or the link; those appear only in compositions around the icons. No isometric projection; avoid any resemblance to cube marks.
-- **Glyph:** the front plane carries one ink glyph with a 9% stroke; the same glyph appears on the
- computer's screen in that member's compositions. Each component swaps only this glyph:
- computer-use pointer, apple-cli prompt, codex braces, swift-format aligned bars, claude speech
- bracket, cursor text caret, trae play wedge, homebrew-tap install tray.
-- **App icon:** an original compact computer in ivory glass with an amber screen and a recessed
- chin, over a violet design grid; defined by the `computer-mcp` entry in
- [Iconography](#iconography) and delivered as an Icon Composer document plus a legacy
- `AppIcon.icns` for macOS 14 and 15.
-- **Never:** vendor logos, the Apple or Swift logo, SF Symbols or SF Pro inside brand artwork. The
- swift-sdk fork keeps its upstream identity.
+- **Component icons:** plugins and the Homebrew tap are framework slabs, generated from the `icons`
+ entries in [Iconography](#iconography) with the `apple-framework-icon-design` generator. Each slab
+ takes the main color of the product it serves, and its three bands deepen from it: Claude's
+ terracotta, Codex's blue, Cursor's graphite, Computer Use's sky-to-pink, Swift's orange,
+ Homebrew's amber, and TRAE's black with green. The face carries the App's design grid and one
+ glyph that follows the product's own mark: the Claude spark, the Codex cloud with a prompt, the
+ Cursor cube, the Computer Use pointer, the Swift bird, the Homebrew mug and the TRAE pixel face.
+- **App icons:** executables have Liquid Glass app icons on the App's violet field and design grid,
+ generated from the `app_icons` entries with the `apple-app-icon-design` generator. The App is an
+ original compact computer in ivory glass with an amber screen and a recessed chin, delivered as
+ an Icon Composer document plus a legacy `AppIcon.icns` for macOS 14 and 15. Apple CLI is four
+ glass tiles in the colors of Notes, Calendar and Mail, the fourth a dark terminal with a prompt.
+- **Screen glyph:** in a member's compositions the computer's screen shows its icon's glyph flat in
+ ink, with inlaid details in the screen's amber: a framework glyph's surface parts, and Apple
+ CLI's prompt. The Homebrew tap's screen shows the icons of the App and Apple CLI it installs.
+ Icons never carry the chat card or the link.
+- **Never:** SF Symbols or SF Pro inside brand artwork. The swift-sdk fork keeps its upstream
+ identity.
## Iconography
-The App icon is a Liquid Glass icon generated from this entry with the `apple-app-icon-design`
-generator. Its layers are original artwork in `Brand/app-icon/layers/`: a design grid, the
-computer's recessed chin, its amber screen light and its ivory glass case. Accepted lint findings,
-each by design: four groups keep the grid, chin, screen light and case in separate materials; the
-grid lines run to the outline, so 0.7% of the grid falls outside the shape; the grid lines are
-hairlines that fade below 32 px; the chin and the case sit over the white grid; and the case and the
-chin share the ivory lightness, separated by depth rather than tone.
+App icons are Liquid Glass icons generated from the `app_icons` entries with the
+`apple-app-icon-design` generator. Their layers are original artwork in `Brand/app-icon/layers/`,
+and both share its design grid. The App's layers are the computer's recessed chin, its amber screen
+light and its ivory glass case; Apple CLI's are its three app tiles, its terminal tile and its
+prompt. Accepted lint findings, each by design: four groups keep the grid and three materials
+apart in each icon (the App's chin, screen light and case; Apple CLI's app tiles, terminal glass
+and prompt); the grid lines run to the outline, so 0.7% of the grid falls outside the shape; the
+grid lines are hairlines that fade below 32 px; the App's chin and case sit over the white grid; and
+the App's case and chin share the ivory lightness, separated by depth rather than tone.
+
+Component icons are generated from the `icons` entries with the `apple-framework-icon-design`
+generator; their palette lint is clean. Glyphs are layered: each part has its own color, and parts
+marked `surface` lie only on the glyph's top. The face texture is the App's design grid redrawn in
+face units.
```json
{
@@ -542,6 +534,660 @@ chin share the ivory lightness, separated by depth rather than tone.
"design_generation": 27
}
}
+ },
+ "apple-cli": {
+ "background": "#5A4BF5",
+ "gradient": true,
+ "groups": [
+ {
+ "name": "Grid",
+ "layers": [
+ {
+ "source": "Brand/app-icon/layers/grid.svg",
+ "name": "grid",
+ "fill": {
+ "solid": "#FFFFFF"
+ },
+ "opacity": 0.2
+ }
+ ],
+ "shadow": {
+ "kind": "none",
+ "opacity": 0
+ },
+ "specular": false
+ },
+ {
+ "name": "Apps",
+ "layers": [
+ {
+ "source": "Brand/app-icon/layers/apple-cli-notes.svg",
+ "name": "apple-cli-notes",
+ "fill": {
+ "automatic-gradient": "#FFD60A"
+ }
+ },
+ {
+ "source": "Brand/app-icon/layers/apple-cli-calendar.svg",
+ "name": "apple-cli-calendar",
+ "fill": {
+ "automatic-gradient": "#FF453A"
+ }
+ },
+ {
+ "source": "Brand/app-icon/layers/apple-cli-mail.svg",
+ "name": "apple-cli-mail",
+ "fill": {
+ "automatic-gradient": "#0A84FF"
+ }
+ }
+ ],
+ "shadow": {
+ "kind": "layer-color",
+ "opacity": 0.5
+ },
+ "translucency": {
+ "enabled": true,
+ "value": 0.1
+ }
+ },
+ {
+ "name": "Terminal",
+ "layers": [
+ {
+ "source": "Brand/app-icon/layers/apple-cli-terminal.svg",
+ "name": "apple-cli-terminal",
+ "fill": {
+ "automatic-gradient": "#1D1B26D9"
+ }
+ }
+ ],
+ "shadow": {
+ "kind": "neutral",
+ "opacity": 0.5
+ },
+ "translucency": {
+ "enabled": true,
+ "value": 0.35
+ },
+ "blur-material": 0.5,
+ "refractivity": {
+ "enabled": true,
+ "strength": 0.6,
+ "depth": 0
+ }
+ },
+ {
+ "name": "Prompt",
+ "layers": [
+ {
+ "source": "Brand/app-icon/layers/apple-cli-prompt.svg",
+ "name": "apple-cli-prompt",
+ "fill": {
+ "automatic-gradient": "#F6EEDB"
+ }
+ }
+ ],
+ "shadow": {
+ "kind": "layer-color",
+ "opacity": 0.5
+ },
+ "translucency": {
+ "enabled": true,
+ "value": 0.1
+ }
+ }
+ ],
+ "styles": {
+ "liquid-glass": {
+ "design_generation": 27
+ }
+ }
+ }
+ },
+ "icons": {
+ "plugin-claude": {
+ "hue": 40,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.16,
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M0.023 -0.039 L0.121 -0.886 A0.09 0.09 0 0 0 -0.059 -0.893 L-0.021 -0.041 Z M0.039 -0.023 L0.407 -0.531 A0.075 0.075 0 0 0 0.278 -0.609 L0.002 -0.046 Z M0.046 -0.0 L0.78 -0.335 A0.085 0.085 0 0 0 0.698 -0.484 L0.024 -0.039 Z M0.038 0.025 L0.714 0.158 A0.095 0.095 0 0 0 0.731 -0.031 L0.042 -0.018 Z M0.022 0.04 L0.728 0.568 A0.08 0.08 0 0 0 0.815 0.434 L0.046 0.003 Z M-0.005 0.045 L0.19 0.626 A0.07 0.07 0 0 0 0.318 0.571 L0.036 0.028 Z M-0.026 0.037 L-0.179 0.846 A0.09 0.09 0 0 0 -0.0 0.865 L0.018 0.042 Z M-0.04 0.022 L-0.459 0.56 A0.08 0.08 0 0 0 -0.325 0.647 L-0.003 0.046 Z M-0.046 -0.003 L-0.851 0.292 A0.095 0.095 0 0 0 -0.771 0.464 L-0.027 0.037 Z M-0.038 -0.025 L-0.676 -0.134 A0.075 0.075 0 0 0 -0.689 0.015 L-0.042 0.018 Z M-0.021 -0.041 L-0.645 -0.537 A0.085 0.085 0 0 0 -0.74 -0.396 L-0.045 -0.004 Z M0.002 -0.046 L-0.261 -0.718 A0.08 0.08 0 0 0 -0.405 -0.648 L-0.037 -0.026 Z",
+ "fill": "oklch(0.97 0.012 70)",
+ "round": 0.02
+ },
+ {
+ "circle": [
+ 0,
+ 0,
+ 0.09
+ ],
+ "fill": "oklch(0.97 0.012 70)"
+ }
+ ]
+ },
+ "glyph_scale": 0.36,
+ "face_colors": [
+ "oklch(0.72 0.13 42)",
+ "oklch(0.64 0.145 40)"
+ ],
+ "band_colors": [
+ "oklch(0.58 0.145 39)",
+ "oklch(0.51 0.135 37)",
+ "oklch(0.44 0.12 35)"
+ ],
+ "glyph_side": "oklch(0.86 0.04 50)"
+ },
+ "plugin-codex": {
+ "hue": 272,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.16,
+ "custom_glyph": {
+ "layers": [
+ {
+ "circle": [
+ 0,
+ 0,
+ 0.62
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ 0.48,
+ 0.191,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ 0.199,
+ 0.462,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ -0.199,
+ 0.462,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ -0.48,
+ 0.191,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ -0.48,
+ -0.191,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ -0.199,
+ -0.462,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ 0.199,
+ -0.462,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "circle": [
+ 0.48,
+ -0.191,
+ 0.36
+ ],
+ "fill": {
+ "colors": [
+ "#FFFFFF",
+ "oklch(0.9 0.045 280)"
+ ],
+ "from": [
+ 0,
+ -0.9
+ ],
+ "to": [
+ 0,
+ 0.9
+ ]
+ }
+ },
+ {
+ "d": "M-0.34 -0.22 L-0.12 0 L-0.34 0.22",
+ "stroke": "oklch(0.5 0.25 268)",
+ "width": 0.13,
+ "surface": true
+ },
+ {
+ "d": "M0.04 0.24 H0.34",
+ "stroke": "oklch(0.5 0.25 268)",
+ "width": 0.13,
+ "surface": true
+ }
+ ]
+ },
+ "glyph_scale": 0.34,
+ "face_colors": [
+ "oklch(0.68 0.16 285)",
+ "oklch(0.52 0.24 270)"
+ ],
+ "band_colors": [
+ "oklch(0.46 0.24 270)",
+ "oklch(0.4 0.22 270)",
+ "oklch(0.34 0.19 271)"
+ ],
+ "glyph_side": "oklch(0.8 0.07 275)"
+ },
+ "plugin-cursor": {
+ "hue": 85,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.12,
+ "face": "graphite",
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M0 -0.92 L0.8 -0.46 L0.8 0.46 L0 0.92 L-0.8 0.46 L-0.8 -0.46 Z",
+ "fill": "oklch(0.44 0.006 85)",
+ "round": 0.03
+ },
+ {
+ "d": "M0 -0.92 L0 -0.46 L-0.8 -0.46 Z",
+ "fill": "oklch(0.51 0.006 85)",
+ "round": 0.03
+ },
+ {
+ "d": "M-0.8 -0.46 L0 0 L-0.8 0.46 Z",
+ "fill": "oklch(0.51 0.006 85)",
+ "round": 0.03
+ },
+ {
+ "d": "M-0.8 0.46 L0 0 L0 0.92 Z",
+ "fill": "oklch(0.63 0.006 85)",
+ "round": 0.03
+ },
+ {
+ "d": "M0.44 0.161 L0.8 0.46 L0 0.92 Z",
+ "fill": "oklch(0.63 0.006 85)",
+ "round": 0.03
+ },
+ {
+ "d": "M-0.8 -0.46 L0.8 -0.46 L0 0 Z",
+ "fill": "oklch(0.97 0.004 85)",
+ "round": 0.03,
+ "surface": true
+ },
+ {
+ "d": "M0.8 -0.46 L0 0.92 L0 0 Z",
+ "fill": "oklch(0.88 0.004 85)",
+ "round": 0.03,
+ "surface": true
+ }
+ ]
+ },
+ "glyph_scale": 0.38,
+ "face_colors": [
+ "oklch(0.3 0.008 85)",
+ "oklch(0.2 0.008 85)"
+ ],
+ "band_colors": [
+ "oklch(0.27 0.008 85)",
+ "oklch(0.33 0.008 85)",
+ "oklch(0.4 0.008 85)"
+ ],
+ "glyph_side": "oklch(0.3 0.006 85)",
+ "texture_color": "oklch(0.75 0.01 85)"
+ },
+ "plugin-computer-use": {
+ "hue": 250,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.16,
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M-0.62 -0.66 L0.80 -0.10 L0.10 0.12 L-0.12 0.82 Z",
+ "fill": "#FFFFFF",
+ "round": 0.3
+ },
+ {
+ "d": "M-0.62 -0.66 L0.80 -0.10 L0.10 0.12 L-0.12 0.82 Z",
+ "fill": {
+ "colors": [
+ "oklch(0.8 0.14 225)",
+ "oklch(0.57 0.21 266)"
+ ],
+ "from": [
+ -0.6,
+ -0.6
+ ],
+ "to": [
+ 0.4,
+ 0.6
+ ]
+ },
+ "round": 0.14,
+ "surface": true
+ }
+ ]
+ },
+ "face_colors": [
+ "oklch(0.79 0.135 236)",
+ "oklch(0.78 0.13 330)"
+ ],
+ "band_colors": [
+ "oklch(0.72 0.14 265)",
+ "oklch(0.62 0.17 268)",
+ "oklch(0.53 0.19 272)"
+ ],
+ "glyph_side": "oklch(0.62 0.15 262)"
+ },
+ "plugin-swift-format": {
+ "hue": 40,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.16,
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M0.18 -0.86 C0.66 -0.52 0.84 -0.02 0.64 0.40 C0.74 0.50 0.80 0.62 0.80 0.80 C0.70 0.66 0.58 0.62 0.46 0.64 C0.06 0.86 -0.48 0.74 -0.86 0.30 C-0.44 0.56 -0.02 0.52 0.22 0.30 C-0.12 0.08 -0.50 -0.28 -0.80 -0.62 C-0.42 -0.36 -0.10 -0.14 0.12 0.00 C-0.10 -0.26 -0.34 -0.56 -0.48 -0.82 C-0.12 -0.50 0.20 -0.24 0.40 -0.06 C0.50 -0.34 0.40 -0.62 0.18 -0.86 Z",
+ "fill": "#FFFFFF",
+ "round": 0.03
+ }
+ ]
+ },
+ "face_colors": [
+ "oklch(0.78 0.16 62)",
+ "oklch(0.66 0.21 36)"
+ ],
+ "band_colors": [
+ "oklch(0.6 0.21 33)",
+ "oklch(0.53 0.2 30)",
+ "oklch(0.46 0.18 28)"
+ ],
+ "glyph_side": "oklch(0.86 0.06 45)"
+ },
+ "homebrew-tap": {
+ "hue": 70,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.16,
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M0.36 -0.10 H0.60 A0.18 0.18 0 0 1 0.78 0.08 V0.30 A0.18 0.18 0 0 1 0.60 0.48 H0.36",
+ "stroke": "#FFFFFF",
+ "width": 0.15
+ },
+ {
+ "d": "M-0.64 -0.30 H0.36 V0.62 A0.18 0.18 0 0 1 0.18 0.80 H-0.46 A0.18 0.18 0 0 1 -0.64 0.62 Z",
+ "fill": "#FFFFFF",
+ "round": 0.03
+ },
+ {
+ "circle": [
+ -0.44,
+ -0.4,
+ 0.21
+ ],
+ "fill": "#FFFFFF"
+ },
+ {
+ "circle": [
+ -0.12,
+ -0.5,
+ 0.25
+ ],
+ "fill": "#FFFFFF"
+ },
+ {
+ "circle": [
+ 0.18,
+ -0.4,
+ 0.2
+ ],
+ "fill": "#FFFFFF"
+ },
+ {
+ "d": "M-0.52 -0.14 H0.24 V0.58 A0.10 0.10 0 0 1 0.14 0.68 H-0.42 A0.10 0.10 0 0 1 -0.52 0.58 Z",
+ "fill": {
+ "colors": [
+ "oklch(0.84 0.15 82)",
+ "oklch(0.72 0.16 62)"
+ ],
+ "from": [
+ 0,
+ -0.14
+ ],
+ "to": [
+ 0,
+ 0.68
+ ]
+ },
+ "surface": true
+ },
+ {
+ "circle": [
+ -0.26,
+ 0.34,
+ 0.05
+ ],
+ "fill": "#FFFFFF",
+ "surface": true
+ },
+ {
+ "circle": [
+ 0.02,
+ 0.12,
+ 0.04
+ ],
+ "fill": "#FFFFFF",
+ "surface": true
+ },
+ {
+ "circle": [
+ -0.08,
+ 0.48,
+ 0.035
+ ],
+ "fill": "#FFFFFF",
+ "surface": true
+ }
+ ]
+ },
+ "glyph_scale": 0.34,
+ "face_colors": [
+ "oklch(0.86 0.15 88)",
+ "oklch(0.76 0.16 72)"
+ ],
+ "band_colors": [
+ "oklch(0.68 0.15 64)",
+ "oklch(0.59 0.13 57)",
+ "oklch(0.5 0.11 52)"
+ ],
+ "glyph_side": "oklch(0.88 0.05 75)"
+ },
+ "plugin-trae": {
+ "hue": 155,
+ "bands": 3,
+ "glyph_rotation": -45,
+ "texture": {
+ "d": "M0 -0.6 V0.6 M-0.6 0 H0.6 M-0.25 -0.25 V0.25 M-0.25 -0.25 H0.25 M0.25 -0.25 V0.25 M-0.25 0.25 H0.25 M0.25 0.25 V0.452 Q0.25 0.47 0.268 0.47 H0.31 Q0.47 0.47 0.47 0.31 V0.25 Z M0.25 -0.25 V-0.452 Q0.25 -0.47 0.268 -0.47 H0.31 Q0.47 -0.47 0.47 -0.31 V-0.25 Z M-0.25 0.25 V0.452 Q-0.25 0.47 -0.268 0.47 H-0.31 Q-0.47 0.47 -0.47 0.31 V0.25 Z M-0.25 -0.25 V-0.452 Q-0.25 -0.47 -0.268 -0.47 H-0.31 Q-0.47 -0.47 -0.47 -0.31 V-0.25 Z",
+ "width": 0.009
+ },
+ "texture_opacity": 0.12,
+ "face": "graphite",
+ "custom_glyph": {
+ "layers": [
+ {
+ "d": "M-0.875 -0.625 h0.25 v0.25 h-0.25 Z M-0.625 -0.625 h0.25 v0.25 h-0.25 Z M-0.375 -0.625 h0.25 v0.25 h-0.25 Z M-0.125 -0.625 h0.25 v0.25 h-0.25 Z M0.125 -0.625 h0.25 v0.25 h-0.25 Z M0.375 -0.625 h0.25 v0.25 h-0.25 Z M0.625 -0.625 h0.25 v0.25 h-0.25 Z M0.625 -0.375 h0.25 v0.25 h-0.25 Z M0.625 -0.125 h0.25 v0.25 h-0.25 Z M0.625 0.125 h0.25 v0.25 h-0.25 Z M0.625 0.375 h0.25 v0.25 h-0.25 Z M-0.875 -0.375 h0.25 v0.25 h-0.25 Z M-0.875 -0.125 h0.25 v0.25 h-0.25 Z M-0.875 0.125 h0.25 v0.25 h-0.25 Z M-0.625 0.375 h0.25 v0.25 h-0.25 Z M-0.375 0.375 h0.25 v0.25 h-0.25 Z M-0.125 0.375 h0.25 v0.25 h-0.25 Z M0.125 0.375 h0.25 v0.25 h-0.25 Z M0.375 0.375 h0.25 v0.25 h-0.25 Z",
+ "fill": "oklch(0.85 0.2 155)"
+ },
+ {
+ "d": "M-0.162 -0.17 L0.008 0.0 L-0.162 0.17 L-0.333 0.0 Z M0.35 -0.17 L0.52 0.0 L0.35 0.17 L0.18 0.0 Z",
+ "fill": "oklch(0.85 0.2 155)"
+ }
+ ]
+ },
+ "face_colors": [
+ "oklch(0.3 0.006 260)",
+ "oklch(0.21 0.006 260)"
+ ],
+ "band_colors": [
+ "oklch(0.27 0.03 158)",
+ "oklch(0.33 0.05 158)",
+ "oklch(0.4 0.07 158)"
+ ],
+ "glyph_side": "oklch(0.55 0.14 158)",
+ "texture_color": "oklch(0.8 0.08 158)"
}
}
}
@@ -552,7 +1198,10 @@ chin share the ivory lightness, separated by depth rather than tone.
- **Primary button:** violet fill, white label in the interface sans, 12px radius.
- **Secondary button:** raised surface with a 1px line border.
- **Chat card:** raised surface, 20px radius, a title row naming the chat, and the request as an
- amber bubble with ink text.
+ amber bubble with ink text. Each member's request is one it serves, from `Brand/config.json`.
+- **Command card:** the code block carrying real commands behind amber prompts, with a 1px line
+ border in dark mode; it takes the chat card's place for the Homebrew tap, which people reach
+ from a terminal.
- **Computer:** the App icon's machine drawn flat — ivory case with a hairline edge, recessed chin,
amber screen carrying the member glyph or, for the App, the command and its result. Capability
chips beside the composition name Files, Shell, CLI, MCP, Skills and Computer Use.
@@ -566,11 +1215,12 @@ chin share the ivory lightness, separated by depth rather than tone.
- Do keep amber for the active path and violet for actions and links; never set amber text on a
light surface.
-- Do show both the chat and the computer whenever the link appears.
+- Do show both the request — a chat, or a command card — and the computer whenever the link
+ appears.
- Do draw the computer from the App icon's layers; never redraw or restyle it per surface.
- Do render every image text with the bundled OFL fonts, in both light and dark.
- Don't use gradients on cards or the computer, or rotate them.
-- Don't draw clouds, globes or padlocks; the link carries the meaning.
+- Don't draw clouds, globes or padlocks for the connection; the link carries it.
- Don't put text inside the App icon.
## Responsive
@@ -584,7 +1234,8 @@ keyboard operation and reduced-motion support.
## Iteration Guide
Change tokens here first, then regenerate every asset with the organization renderer and deliver
-them through each repository's brand lock. A new component swaps only its glyph — on the front plane
-of its icon and on the computer's screen — and never introduces a new color. Check the App icon in
+them through each repository's brand lock. A new component gets its own Iconography entry — a slab in the
+colors of the product it serves, with a glyph that follows that product's mark — and the same glyph
+on the computer's screen. Check the App icon in
every macOS rendition, including Clear and Tinted, before delivery. The repository README lists the
render, check and delivery commands.
diff --git a/README.md b/README.md
index 33ac65d..5c24c5d 100644
--- a/README.md
+++ b/README.md
@@ -33,13 +33,16 @@ Text rendered into images (`Brand/config.json` `copy` and `members`) must match
## Updating the brand
-Install Icon Composer from Xcode and set `APP_ICONS_SCRIPT` to the
-`apple-app-icon-design` generator script (`skills/apple-app-icon-design/scripts/app_icons.py` in the
-[showxu/skills](https://github.com/showxu/skills) repository). The manifest
-records the script's SHA-256 next to the renderer versions. The generator finds
-Icon Composer's `ictool` in the selected Xcode installation; set `IC_TOOL` to
-select another export-capable renderer. Python 3 and `rsvg-convert` are also
-required by the generator.
+The icons come from two generators in the
+[showxu/skills](https://github.com/showxu/skills) repository. Install Icon
+Composer from Xcode and set `APP_ICONS_SCRIPT` to the `apple-app-icon-design`
+generator (`skills/apple-app-icon-design/scripts/app_icons.py`), which renders
+the App icons; it finds Icon Composer's `ictool` in the selected Xcode
+installation, and `IC_TOOL` selects another export-capable renderer. Set
+`FRAMEWORK_ICONS_SCRIPT` to the `apple-framework-icon-design` generator
+(`skills/apple-framework-icon-design/scripts/design_icons.py`), which renders
+the component icons. The manifest records the generators' SHA-256 digests next
+to the renderer versions. Python 3 and `rsvg-convert` are also required.
1. Edit `DESIGN.md` or `Brand/config.json`.
2. Render: `npm ci --prefix Brand`, `npx --prefix Brand playwright install --only-shell chromium`,
@@ -49,8 +52,12 @@ required by the generator.
--output-file Brand/.cache/app-icon-preview.png --width 1024 --height 1024
--scale 1 --design-generation
`
for Default, Dark, ClearLight, ClearDark, TintedLight and TintedDark, using
- the `design_generation` from the Iconography entry.
-4. Check: `npm --prefix Brand run lint` and `python3 Brand/brand.py check`.
+ the `design_generation` from the Iconography entry. Review the other App
+ icons with the generator's contact sheet:
+ `python3 "$APP_ICONS_SCRIPT" DESIGN.md --name --style liquid-glass --out Brand/.cache/`.
+4. Check: `npm --prefix Brand run lint`, `python3 "$APP_ICONS_SCRIPT" DESIGN.md --name --lint`
+ for each App icon, `python3 "$FRAMEWORK_ICONS_SCRIPT" DESIGN.md --lint` and
+ `python3 Brand/brand.py check`.
5. Commit `DESIGN.md`, `Brand/` and the exports together.
## Delivering to a repository