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 AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ On a machine that already has clones of Makepad, OctoScript or Octoscript-Makepa
9. **Keep docs honest and bilingual.** Every command in a doc was run; anything not run is marked **unverified**. User-facing docs are `README.md` plus `README.zh-CN.md`, linked by the single switcher line under the title (`English | [简体中文](README.zh-CN.md)`), and change together. `AGENTS.md` files are English only.
10. **Keep signing keys, keystores, tokens and personal paths out of the repository.** `rom/tests/test_no_local_paths.py` checks for local paths.
11. **App icon shapes belong to the shell style.** Use `octosense::style::AppIconDraw` on shell app-icon surfaces; never draw a bundle PNG/SVG directly. Keep new identities in the shared platform frame policy (`crates/shell/src/octosense/icon_frame.rs`), including App Hub and Assistant. Supply square artwork with its important content in the central safe area, without baked platform corners or shadows. Verify Android, macOS and iOS styles, including PNG/SVG and transparent artwork. Native Android package icons already have the system's mask and badges; do not mask them again. See [app icon guidelines](apps/README.md#launcher-icon-artwork).
New app artwork follows the [approved icon family](docs/design/icon-family/README.md#authoring-a-new-app-icon): a 64-point square master, foreground inside the central 66%, one dominant illustrated object, restrained ivory/ink materials and supporting accents. Give each new app its own identity; never ship the starter icon or copy another app's mark. Store apps ship their own declared bundle icon; only built-in replacements enter the local `icon_family.rs` overlay. Keep Makepad's theme files and runtime patches unchanged.
12. **Capability declarations describe usage.** `capabilities` and `network.hosts` do not grant or deny execution of public APIs. Apply this consistently to Splash, app-agent tools and components. Keep verified bundle and profile identity, device consent, OS permissions, account scope, trusted write review, storage jail/quota and inter-app tool sharing. `requires` and `host_api.required` remain compatibility checks. Capture intent is explicit (`audio`/`library` options), never inferred from API availability. See [capabilities and execution boundaries](docs/capabilities.md).

## Architecture documentation and code walkthroughs
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ The script apps share [responsive, theme-aware interface styles](apps/README.md#
across desktop and phone. [Local native UX checks](tools/app-ux/README.md) cover
saved state and actual interaction; phone-size previews remain separate from device acceptance.

The [icon design system](docs/design/icon-family/README.md) defines a shared
visual language and provides 28 SVG replacements plus the original Rinx icon, with before/after and size
reviews. The approved icons are connected to the shared shell and system
bundles in source builds, including Browser's C5 Night rose compass. A local
catalog overlay keeps Makepad's icon files untouched and preserves new upstream identities.

| Product | What it is | Where |
| --- | --- | --- |
| **OctoSense desktop** | The shell as one Makepad window on macOS, Windows or Linux; platform requirements and validation are recorded in the release notes | [`desktop/`](desktop/README.md) |
Expand Down
2 changes: 2 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ OctoSense 是运行在普通操作系统之上的 Agent Shell。从屏幕上看

脚本应用在桌面和手机端共用[自适应主题与布局](apps/README.zh-CN.md#共用外观)。[本机原生 UX 检查](tools/app-ux/README.zh-CN.md)验证真实交互和保存状态;手机尺寸预览与真机验收分别记录。

[图标设计规范](docs/design/icon-family/README.zh-CN.md)定义共用的视觉语言,并提供 28 个 SVG 替换图标与 Rinx 原始图标,附前后对比、尺寸检查图。批准的图标已接入源码构建的共享 Shell 及系统应用包,包括浏览器的 C5 夜色罗盘。本地图标覆盖层保持 Makepad 图标文件原样,并保留上游新增的应用身份。

| 产品 | 是什么 | 位置 |
| --- | --- | --- |
| **OctoSense 桌面端** | 在 macOS、Windows 或 Linux 上作为一个 Makepad 窗口运行的 Shell;各平台要求和验收范围见发行说明 | [`desktop/`](desktop/README.zh-CN.md) |
Expand Down
20 changes: 18 additions & 2 deletions apps/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,10 @@ See [capabilities and execution boundaries](../docs/capabilities.md).
engine" and keep the draft; `writer/tests/ui.py` runs every screen there,
light and dark (see Writer's tests, below). Writer is desktop only, so
there is no phone run.
- Camera and AI providers ship PNG launcher artwork; YouTube, Quick Deck and
Writer ship SVG artwork. The shell frames bundle icons for the selected platform style.
- Camera and AI providers ship PNG launcher artwork; Mail, Calendar, YouTube,
Quick Deck, PDF Tools and Writer ship SVG artwork. The shell frames bundle
icons for the selected platform style. Native and optional app identities
use the [approved icon family](../docs/design/icon-family/README.md).

## How the shells pack them

Expand Down Expand Up @@ -408,6 +410,20 @@ switching styles updates installed icons too. Review Android, macOS and iOS
at launcher and badge sizes, on light and dark backgrounds. The shell's
icon-frame/style tests run in the Phone workflow.

OctoSense's [approved family](../docs/design/icon-family/README.md), including
Browser's C5 Night rose compass, overlays the Makepad catalog by explicit app ID
in `crates/shell/src/octosense/icon_family.rs`. These local replacements win over
system bundle icons in every style. Other bundles and installed `hub:` apps keep
their own artwork. Keep replacement assets under the shared shell's resources;
updating Makepad must not require editing its theme icons or reapplying an icon patch.

Every new app needs a distinct icon following the
[new-icon authoring checklist](../docs/design/icon-family/README.md#authoring-a-new-app-icon).
Use the same illustrated materials and safe area as the approved family; the
template icon demonstrates the format and must be replaced before submission.
Store apps declare their own bundle artwork in `listing.json`; they do not need
an entry in the shell's built-in replacement list.

For a visual regression check, build the `icon_shapes` example from `phone/`
with `mobile-apps`. Run it with an isolated `OCTOSENSE_HOME`, hidden windows
and the Makepad remote control surface (see the root `AGENTS.md`). It shows
Expand Down
6 changes: 5 additions & 1 deletion apps/README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ WebView 页面、图库导出、邮件、新闻、Glance 或单次模型调用
切换后输入的文字也被保留并保存。`card-host` 没有 `word` 服务,保存和预览在那里回答
“Writer can't … here: this device has no word engine”并保留草稿;`writer/tests/ui.py` 在那里以浅色和深色运行
每个界面(见下文的 Writer 的测试)。Writer 只在桌面端,所以没有手机上的运行。
- Camera 和 AI providers 自带 PNG 启动器图案,YouTube、Quick Deck 和 Writer 自带 SVG 图案;Shell 按当前平台风格统一绘制外形。
- Camera 和 AI providers 自带 PNG 启动器图案,Mail、Calendar、YouTube、Quick Deck、PDF Tools 和 Writer 自带 SVG 图案;Shell 按当前平台风格统一绘制外形。原生和可选应用使用[已批准的图标家族](../docs/design/icon-family/README.zh-CN.md)。

## Shell 如何打包它们

Expand Down Expand Up @@ -330,6 +330,10 @@ PNG/SVG 在绘制时使用同一外框策略,因此切换风格也会更新已
图标。检查 Android、macOS、iOS 风格下的启动器和小标识尺寸,以及明暗
背景。外框和风格回归测试随 Phone 工作流执行。

OctoSense 的[已批准图标家族](../docs/design/icon-family/README.zh-CN.md)(包括浏览器的 C5 夜色罗盘)通过 `crates/shell/src/octosense/icon_family.rs` 中的明确应用 ID 覆盖 Makepad 图标目录。这些本地替换在所有样式下均优先于系统应用包图标;其他应用包及已安装的 `hub:` 应用保留自己的图案。替换资源放在共享 Shell 的资源目录中;更新 Makepad 不应需要修改其主题图标或重新应用图标补丁。

每个新应用都需要独立的图标,并遵循[新图标创作清单](../docs/design/icon-family/README.zh-CN.md#为新应用创作图标)。沿用已批准家族的插画材质与安全区域;模板图标只演示格式,提交前必须替换。商店应用在 `listing.json` 中声明自己随包发布的图案,无需加入 Shell 的内置替换清单。

需要视觉回归检查时,在 `phone/` 中启用 `mobile-apps` 构建 `icon_shapes`
示例。使用隔离的 `OCTOSENSE_HOME`、隐藏窗口和 Makepad 远程控制接口运行
(参见根目录 `AGENTS.md`)。示例覆盖七种风格、内置和商店 PNG/SVG 图案、
Expand Down
1 change: 1 addition & 0 deletions apps/calendar/bundle/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/calendar/bundle/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schema": 1,
"id": "os.calendar",
"version": "1.0.0",
"version": "1.0.1",
"name": "Calendar",
"integrity": {
"bundle_blake3": ""
Expand Down
1 change: 1 addition & 0 deletions apps/mail/bundle/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/mail/bundle/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schema": 1,
"id": "os.mail",
"version": "1.0.0",
"version": "1.0.1",
"name": "Mail",
"integrity": {
"bundle_blake3": ""
Expand Down
23 changes: 20 additions & 3 deletions crates/shell/examples/icon_shapes.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! Visual regression sheet using the production shell renderer.
//! Run from phone/ with mobile-apps so Camera is in the bundled catalog.
//! --family-page=0 through 3 reviews the approved family through this same renderer.
pub use makepad_widgets;
use makepad_widgets::*;
use octosense_shell::octosense::style::{AppIconDraw, DesktopStyle};
Expand Down Expand Up @@ -41,7 +42,7 @@ impl AppMain for App {
let root = std::env::var_os("OCTOSENSE_HOME").expect("set an isolated OCTOSENSE_HOME for this preview");
let root = std::path::PathBuf::from(root).join("icon-fixtures");
for (id, icon) in [("shape-svg", "icon.svg"), ("shape-png", "icon.png")] {
let bundle = root.join(id).join("bundle");
let bundle = octosense_app_hub::installed_bundle_dir(&root, id);
std::fs::create_dir_all(&bundle).unwrap();
std::fs::write(bundle.join("listing.json"), serde_json::json!({
"schema":1, "description":"Icon shape regression fixture", "category":"utilities",
Expand Down Expand Up @@ -83,7 +84,7 @@ impl Widget for IconSheet {
fn draw_walk(&mut self, cx: &mut Cx2d, _: &mut Scope, walk: Walk) -> DrawStep {
let canvas = cx.walk_turtle(walk);
self.background.draw_abs(cx, canvas);
let names = ["photos", "apphub", "assistant", "camera", "ai-providers", "youtube", "hub:shape-svg", "hub:shape-png"];
let names = preview_names();
for (row, style) in [DesktopStyle::Android, DesktopStyle::Macos, DesktopStyle::Ios,
DesktopStyle::Windows, DesktopStyle::NextStep, DesktopStyle::Omarchy, DesktopStyle::Windows2000].into_iter().enumerate() {
let y = canvas.pos.y + 32. + row as f64 * 120.;
Expand All @@ -93,10 +94,26 @@ impl Widget for IconSheet {
if row == 0 { self.text.draw_abs(cx, dvec2(x - 8., canvas.pos.y + 8.), name.strip_prefix("hub:").unwrap_or(name)); }
for (size, dx, dy) in [(64., 0., 0.), (24., 0., 74.), (24., 34., 74.)] {
self.icons.draw(cx, name, style, Rect { pos: dvec2(x + dx, y + dy), size: dvec2(size, size) },
if dx > 0. {0.5} else {1.}, vec4(0.9, 0.94, 1., 1.));
if dx > 0. {0.5} else {1.},
if dy > 0. {vec4(0.14, 0.19, 0.27, 1.)} else {vec4(0.9, 0.94, 1., 1.)});
}
}
}
DrawStep::done()
}
}

fn preview_names() -> [&'static str; 8] {
static NAMES: std::sync::OnceLock<[&'static str; 8]> = std::sync::OnceLock::new();
*NAMES.get_or_init(|| {
let pages = [
["mail", "calendar", "calculator", "clock", "notes", "reminders", "weather", "sheets"],
["settings", "updater", "terminal", "octoscode", "rinx", "reference", "appcard", "browser"],
["files", "task", "finance", "route", "image", "pdf", "mixer", "fabric"],
["score", "video", "vj", "fab", "studio", "photos", "apphub", "assistant"],
];
let page = std::env::args().find_map(|arg| arg.strip_prefix("--family-page=").and_then(|n| n.parse::<usize>().ok()));
page.map(|n| *pages.get(n).expect("family page must be 0 through 3"))
.unwrap_or(["photos", "apphub", "assistant", "camera", "ai-providers", "youtube", "hub:shape-svg", "hub:shape-png"])
})
}
1 change: 1 addition & 0 deletions crates/shell/resources/icons/apps/family/appcard.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions crates/shell/resources/icons/apps/family/browser.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions crates/shell/resources/icons/apps/family/calculator.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions crates/shell/resources/icons/apps/family/calendar.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions crates/shell/resources/icons/apps/family/clock.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading