Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ web/.vite/
# Local UI automation artifacts
.playwright-cli/
output/playwright/
output/branding/

# CyberAgent runtime data must stay local
.cyberagent-workbench/
Expand Down
1 change: 1 addition & 0 deletions README.en.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<div align="center">
<img src="assets/branding/traverse-board-mark.png" alt="Traverse Board · 针路簿 icon" width="180">
<h1>Traverse Board · 针路簿</h1>
<p><strong>A local-first, resumable, and auditable workbench for general-purpose AI agents</strong></p>
<p>
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<div align="center">
<img src="assets/branding/traverse-board-mark.png" alt="Traverse Board · 针路簿图标" width="180">
<h1>Traverse Board · 针路簿</h1>
<p><strong>本地优先、可恢复、可审计的通用 AI Agent 工作台</strong></p>
<p>
Expand Down
13 changes: 13 additions & 0 deletions assets/branding/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Traverse Board Brand Mark

`traverse-board-mark.png` is the maintainer-approved canonical project icon:
a compass rose over a celestial chart with a recorded route and chart scroll.

- Canvas: 1254×1254 RGBA PNG
- Background: transparent
- SHA-256: `fb1260a41b49d7959dc731f4455d2022e55008bef9f73be6cbd674b08fa59a14`
- Source treatment: preserved exactly as supplied; no generative redraw

Web, Windows, and macOS assets are deterministic resize or container-format
derivatives of this master. The master is the source of truth when another
platform size is needed.
Binary file added assets/branding/traverse-board-mark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
21 changes: 21 additions & 0 deletions docs/branding/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,27 @@ canonical repository URLs while preserving compatibility identifiers.
| [Compatibility and migration matrix](compatibility-matrix.md) | 展示名、仓库地址、协议、数据目录、包身份和发布件的迁移边界 |
| [ADR 0124](../adr/0124-traverse-board-branding-migration.md) | 品牌决策、仓库 slug、后果与兼容边界 |

## 官方图形标志 / Official Mark

维护者提供的航向玫瑰、星图与航迹卷轴图形是项目的正式图标。规范母版位于
[`assets/branding/traverse-board-mark.png`](../../assets/branding/traverse-board-mark.png),
尺寸为 1254×1254,保留透明背景;SHA-256 为
`fb1260a41b49d7959dc731f4455d2022e55008bef9f73be6cbd674b08fa59a14`。

Web、Windows 与 macOS 资产只允许从该母版进行确定性的缩放和容器格式转换,
不得用字母 `T`、旧 `P` 标志或生成式重绘替代。小尺寸界面使用图形标志本身,
并由周围的可访问名称提供完整产品名。

The maintainer-supplied compass rose, celestial chart, and route-scroll artwork is the
official project icon. Platform assets are deterministic size/container derivatives of the
transparent master above; generative redraws and letter placeholders are not canonical.

| Surface | Derived assets |
|---|---|
| React/Web | `web/src/assets/traverse-board-mark.png`, 32px favicon, 180px touch icon |
| Windows | MSIX Store/44/150px PNGs, multi-resolution ICO, amd64/arm64 executable resources |
| macOS | Multi-resolution `TraverseBoard.icns` copied into the signed app bundle |

## 当前结论 / Current Decision

- 历史航海主题与当前 Go-owned、可恢复、可审计架构相符。
Expand Down
3 changes: 2 additions & 1 deletion docs/branding/theme-and-naming-v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ decision, not a trademark opinion.

- 中文 locale:`针路簿`
- 英文 locale:`Traverse Board`
- icon-only surface:使用经审阅的图形标志,不用孤立字母代替最终 logo
- icon-only surface:使用维护者批准的航向玫瑰、星图与航迹卷轴图形标志;规范母版见
`assets/branding/traverse-board-mark.png`,不用孤立字母代替
- accessibility name:始终包含当前 locale 的完整产品名

### 2.2 产品与架构层
Expand Down
2 changes: 2 additions & 0 deletions packaging/macos/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<string>cyberagent-desktop</string>
<key>CFBundleIdentifier</key>
<string>workbench.prayu.desktop</string>
<key>CFBundleIconFile</key>
<string>TraverseBoard.icns</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
Expand Down
Binary file added packaging/macos/TraverseBoard.icns
Binary file not shown.
Binary file added packaging/windows/Assets/Square150x150Logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added packaging/windows/Assets/Square44x44Logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added packaging/windows/Assets/StoreLogo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added packaging/windows/TraverseBoard.ico
Binary file not shown.
7 changes: 5 additions & 2 deletions scripts/build-desktop-darwin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,15 @@ metadataPath="$outputRoot/release-metadata.json"
launcherName="Start-Prayu-Operator-Preview.command"
guideName="LOCAL-TEST-GUIDE.txt"
plistSourcePath="packaging/macos/Info.plist"
iconSourcePath="packaging/macos/TraverseBoard.icns"
launcherSourcePath="packaging/macos/$launcherName"
guideSourcePath="packaging/macos/$guideName"
launcherPath="$outputRoot/$launcherName"
guidePath="$outputRoot/$guideName"
plistPath="$bundleDir/Contents/Info.plist"
iconPath="$bundleDir/Contents/Resources/TraverseBoard.icns"

for required in "$plistSourcePath" "$launcherSourcePath" "$guideSourcePath"; do
for required in "$plistSourcePath" "$iconSourcePath" "$launcherSourcePath" "$guideSourcePath"; do
if [ ! -f "$required" ]; then
die "Desktop macOS packaging assets are required: $required"
fi
Expand Down Expand Up @@ -129,9 +131,10 @@ case "$targetArch" in
*) die "Go macOS build architecture is invalid" ;;
esac

mkdir -p "$bundleDir/Contents/MacOS"
mkdir -p "$bundleDir/Contents/MacOS" "$bundleDir/Contents/Resources"
cp "$launcherSourcePath" "$launcherPath"
cp "$guideSourcePath" "$guidePath"
cp "$iconSourcePath" "$iconPath"
chmod +x "$launcherPath"
sed "s/@VERSION@/$Version/g" "$plistSourcePath" > "$plistPath"

Expand Down
31 changes: 15 additions & 16 deletions scripts/package-msix.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ param(
Packages the per-user MSIX and (optionally) signs it (issue #57).

.DESCRIPTION
Stages the desktop EXE, AppxManifest.xml, and generated placeholder logos, then
Stages the desktop EXE, AppxManifest.xml, and reviewed Traverse Board logos, then
runs makeappx to produce PrayuDesktop.msix. Signing is fail-closed: without a
code-signing certificate the script writes an unsigned MSIX and reports
signed=false; with --CertificatePath it runs signtool and fails on any signing,
Expand All @@ -27,9 +27,16 @@ $repositoryRoot = [System.IO.Path]::GetFullPath((Split-Path -Parent $PSScriptRoo
$outputRoot = [System.IO.Path]::GetFullPath((Join-Path $repositoryRoot $OutputDirectory))
$binaryPath = Join-Path $outputRoot "cyberagent-desktop.exe"
$manifestPath = Join-Path $repositoryRoot "packaging/windows/AppxManifest.xml"
$assetRoot = Join-Path $repositoryRoot "packaging/windows/Assets"
$msixPath = Join-Path $outputRoot "PrayuDesktop.msix"

foreach ($required in @($binaryPath, $manifestPath)) {
foreach ($required in @(
$binaryPath,
$manifestPath,
(Join-Path $assetRoot "StoreLogo.png"),
(Join-Path $assetRoot "Square150x150Logo.png"),
(Join-Path $assetRoot "Square44x44Logo.png")
)) {
if (-not (Test-Path -LiteralPath $required -PathType Leaf)) {
throw "MSIX input is missing: $required"
}
Expand All @@ -48,17 +55,6 @@ function Find-SDKTool {
return $null
}

function New-PlaceholderLogo {
param([string]$Path, [int]$Size)
Add-Type -AssemblyName System.Drawing -ErrorAction Stop
$bitmap = New-Object System.Drawing.Bitmap($Size, $Size)
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)
$graphics.Clear([System.Drawing.Color]::FromArgb(255, 0, 120, 212))
$bitmap.Save($Path, [System.Drawing.Imaging.ImageFormat]::Png)
$graphics.Dispose()
$bitmap.Dispose()
}

# ---- Stage ----
$staging = Join-Path $outputRoot (".msix-staging-" + [guid]::NewGuid().ToString("N"))
[System.IO.Directory]::CreateDirectory((Join-Path $staging "Assets")) | Out-Null
Expand All @@ -69,9 +65,12 @@ try {
$manifestContent = $manifestContent.Replace('Version="0.1.0.0"', "Version=`"$Version`"")
[System.IO.File]::WriteAllText($stagedManifest, $manifestContent,
[System.Text.UTF8Encoding]::new($false))
New-PlaceholderLogo (Join-Path $staging "Assets\StoreLogo.png") 50
New-PlaceholderLogo (Join-Path $staging "Assets\Square150x150Logo.png") 150
New-PlaceholderLogo (Join-Path $staging "Assets\Square44x44Logo.png") 44
Copy-Item -LiteralPath (Join-Path $assetRoot "StoreLogo.png") `
-Destination (Join-Path $staging "Assets\StoreLogo.png")
Copy-Item -LiteralPath (Join-Path $assetRoot "Square150x150Logo.png") `
-Destination (Join-Path $staging "Assets\Square150x150Logo.png")
Copy-Item -LiteralPath (Join-Path $assetRoot "Square44x44Logo.png") `
-Destination (Join-Path $staging "Assets\Square44x44Logo.png")

$makeappx = Find-SDKTool "makeappx"
if ($null -eq $makeappx) { throw "makeappx.exe was not found in the Windows SDK" }
Expand Down
3 changes: 2 additions & 1 deletion web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
<meta name="referrer" content="no-referrer" />
<meta name="color-scheme" content="light dark" />
<meta name="theme-color" content="#171614" />
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='16' fill='%23171614'/%3E%3Cpath fill='%23f8f7f4' d='M14 14h36v9H37v28H27V23H14z'/%3E%3C/svg%3E" />
<link rel="icon" type="image/png" sizes="32x32" href="/traverse-board-favicon-32.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<title>Traverse Board · 针路簿</title>
</head>
<body>
Expand Down
Binary file added web/public/apple-touch-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/public/traverse-board-favicon-32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added web/src/assets/traverse-board-mark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 2 additions & 4 deletions web/src/components/prayu-brand.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useLocale } from "../lib/locale";
import brandMark from "../assets/traverse-board-mark.png";

type PrayuBrandVariant = "compact" | "hero" | "icon";

Expand All @@ -12,10 +13,7 @@ export function PrayuBrand({ className = "", variant = "compact" }: {
return (
<span aria-label={displayName} className={`prayu-brand prayu-brand-${variant} ${className}`.trim()}
role="img">
<span aria-hidden="true" className="prayu-brand-icon">
<span className="prayu-brand-glyph">T</span>
<span className="prayu-brand-glint" />
</span>
<img alt="" aria-hidden="true" className="prayu-brand-icon" src={brandMark} />
{!iconOnly && <span aria-hidden="true" className="prayu-brand-copy">
<strong>{variant === "hero" ? <><span>Traverse Board</span><span>针路簿</span></> : displayName}</strong>
<small>{t("Agent 工作台", "Agent Workbench")}</small>
Expand Down
42 changes: 3 additions & 39 deletions web/src/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -3268,36 +3268,12 @@ summary:focus-visible {
}

.prayu-brand-icon {
position: relative;
width: 48px;
aspect-ratio: 1;
flex: 0 0 auto;
display: grid;
place-items: center;
overflow: hidden;
border: 1px solid var(--prayu-border-strong);
border-radius: 14px;
color: var(--prayu-selected-ink);
background: var(--prayu-selected);
box-shadow:
0 10px 28px rgb(0 0 0 / 20%),
inset 0 1px 0 rgb(255 255 255 / 88%),
inset 0 -1px 0 rgb(0 0 0 / 8%);
}

.prayu-brand-glyph {
position: relative;
z-index: 1;
font-size: 28px;
font-weight: 650;
line-height: 1;
}

.prayu-brand-glint {
position: absolute;
inset: 0 0 56%;
border-bottom: 1px solid rgb(255 255 255 / 68%);
background: rgb(255 255 255 / 28%);
display: block;
object-fit: contain;
filter: drop-shadow(0 8px 14px rgb(0 0 0 / 24%));
}

.prayu-brand-copy {
Expand Down Expand Up @@ -3329,10 +3305,8 @@ summary:focus-visible {

.prayu-brand-hero .prayu-brand-icon {
width: 68px;
border-radius: 20px;
}

.prayu-brand-hero .prayu-brand-glyph { font-size: 39px; }
.prayu-brand-hero .prayu-brand-copy strong {
display: grid;
gap: 1px;
Expand Down Expand Up @@ -3374,18 +3348,12 @@ summary:focus-visible {

.profile-avatar .prayu-brand-icon {
width: 84px;
border-radius: 23px;
}

.profile-avatar .prayu-brand-glyph { font-size: 46px; }

.about-mark .prayu-brand-icon {
width: 78px;
border-radius: 21px;
}

.about-mark .prayu-brand-glyph { font-size: 43px; }

.profile-identity p,
.profile-identity p span,
.capability-activity header span,
Expand Down Expand Up @@ -4582,9 +4550,7 @@ summary:focus-visible {
}
.prayu-sidebar .prayu-brand-icon {
width: 42px;
border-radius: 12px;
}
.prayu-sidebar .prayu-brand-glyph { font-size: 25px; }
.prayu-sidebar .prayu-brand-copy strong { font-size: 17px; }
.run-activity-header { align-items: stretch; flex-direction: column; }
.run-activity-safety { align-self: flex-start; }
Expand Down Expand Up @@ -5552,10 +5518,8 @@ samp {

.prayu-sidebar .prayu-brand-icon {
width: 36px;
border-radius: 10px;
}

.prayu-sidebar .prayu-brand-glyph { font-size: 22px; }
.prayu-sidebar .prayu-brand-copy strong { font-size: 15px; }
.prayu-sidebar .prayu-brand-copy small { font-size: 9px; }
.prayu-sidebar .sidebar-brand-action { top: 12px; right: 10px; }
Expand Down