diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3c34a9f..1f751c1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -34,7 +34,7 @@ This page is a public claim about what the product does. For each capability or status the diff adds or changes, name where it is backed: diff --git a/CHANGELOG.md b/CHANGELOG.md index a88c990..ae467ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,26 @@ ## [Unreleased] -含 PR #3(feat: add Ordane marketing site)。 +含 PR #3(feat: add Ordane marketing site)与本次 RoleWeave 品牌 / 文案对齐。 + +### Changed + +- **全站更名 Ordane → RoleWeave**,事实口径统一改取自 `bytefolk/roleweave` 仓库 README 与 v0.1.1 release: + - 标识改用仓库内的 `branding/roleweave/roleweave-icon.svg`(紫 / 蓝 R+W 字母组合),内联进导航并编码为 favicon。 + - 主色跟随标识:token `--teal*` 更名 `--brand*`,取值来自 logo 的紫 `#722ed1`(OKLCH `49.4% 0.228 295.6`);新增 `--azure`(logo 的蓝 `#1677ff`)用于 hero 标题强调。`scripts/contrast-check.js` 的 token 名与配对表同步更新,并为大字号强调新增一对 azure / paper(3:1 门槛),明暗两套共 46 项全部通过。 + - 版本标注由 `v0.6.0 · Alpha` 改为 `v0.1.1 · 早期预览`;导航、hero、CTA 增加指向 releases 的下载入口。 + - `#concept` 由 line 原语改为「文件树即组织架构」,附 `examples/oss-maintainer` 的实际目录结构与工作区 / 岗位 / 会话三个概念的定义。 + - `#principles` 由「三条不动摇的原则」改为 README 的三类日常使用(组织一支团队 / 与岗位工作 / 看清发生了什么);能力清单重写为 v0.1.1 已发布的五项与仍在进行的三项。 + - `#runtime` 由「claude-local 与 qoder 均有本机验证证据」改为:默认适配器 Qoder CLI 1.1.x、macOS 已实机验证,Claude Code 未纳入验证基线,doc / mem / context 标为可选连接服务。 + - `#ladder` 由「个人 → 团队 → 组织」三级收编阶梯改为下载与上手:macOS(Apple Silicon)、Windows x64、Linux / Intel Mac 三张卡片加五步 get-started。后者在 v0.1.1 未提供安装包,如实标为暂未提供。 +- 修正两处超出仓库事实的表述:页脚「本地优先 · 数据不出域」改为「工作区文件本地存储 · 提示词仍会发送给所配置的 AI 提供方」——README 明确 local storage 不等于 offline AI;下载卡片角标由「已实机验证」改为「自动更新可用」——README 明确安装、卸载与跨版本自动更新未声称端到端验证。 +- hero 沿用同一张真实客户端截图(未经修饰),但其窗口标题仍是改名前的 `org-workbench` 开发版,已在图注中据实说明。 +- 下载入口改为悬浮下拉:导航、hero、CTA 三处的「下载」按钮悬停即展开菜单,直接列出 v0.1.1 的两个安装包(`roleweave-0.1.1-arm64.dmg` 与 `roleweave-0.1.1-x64.exe`),点哪个就下哪个——GitHub release 资产带 `Content-Disposition: attachment`,无需中转到 releases 页面再找文件。 + - 用 `
` 而不是纯 JS 菜单:JavaScript 关掉时点击仍能展开,脚本只负责悬停展开、点选后收起、Escape 与点击外部关闭。菜单与按钮之间的 10px 间隙由 `.dl-menu` 的 `padding-top` 承担,指针移进菜单不会触发 `mouseleave`。 + - 「当前设备」角标只认浏览器自报的平台:Windows 标 EXE,macOS 标 DMG;`navigator.userAgentData.getHighEntropyValues` 可用且报告非 arm 架构时撤掉 macOS 角标——mac 包只有 arm64,不能让 Intel Mac 用户以为那是给他们的。Linux 与 iOS 不标任何一项。检测整体包在 try/catch 里,失败也不影响下拉本身。 + - `.hero-inner` 的 `z-index` 由 1 提到 2:hero 的下拉菜单从这层里溢出,而 `.float-card`(截图卡)同为 `z-index: 1` 且在 DOM 里靠后,此前会把展开的菜单盖住并抢走指针事件。 + - `scripts/contrast-check.js` 新增下拉悬停态的 ink / band 一对,明暗两套共 48 项通过。 +- `package.json` / `package-lock.json` 包名 `@bytefolk/ordane-site` → `@bytefolk/roleweave-site`,README 重写为 RoleWeave 官网说明。仓库名与 Pages 地址仍是 `ordane`,重命名需单独处理。 ### Added diff --git a/README.md b/README.md index 6a8c383..c5ae239 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,33 @@ -# Ordane +# RoleWeave site -Official marketing site for **Ordane** — the goal-first organization workbench. +Official marketing site for **RoleWeave** — a desktop workspace for organizing +and working with AI employees. **Live:** https://bytefolk.github.io/ordane/ -Ordane is built on [`org-workbench`](https://github.com/bytefolk/org-workbench): -file tree is the org chart, positions are addressable digital employees, and -a goal is chartered as a `line` with ownership, order, and dedup. -This repository holds only the public site (static HTML, no build step) and -is deployed via GitHub Pages. +RoleWeave itself lives in [`roleweave`](https://github.com/bytefolk/roleweave): +the file tree is the org chart, roles live in folders, and nested folders define +reporting relationships. This repository holds only the public site (static +HTML, no build step) and is deployed via GitHub Pages. + +Every product claim on the page must be backed by the `roleweave` repository — +its README, release notes, or docs. Anything not yet delivered reads as +planned or preview, never as shipped. + +## Verify + +```bash +npm ci +npx --no-install playwright-core install chromium +npm run verify +``` + +`verify:contrast` audits every text/background pair the page renders, in both +themes, against the WCAG thresholds; tokens are parsed out of `index.html`, so +the audit cannot drift from the file. `verify:render` renders the page, +screenshots hero / `#runtime` / `#ladder`, asserts the reveal blocks and the +tab switcher, and fails closed on page errors. `verify:failclose` proves that +fail-close path still exits non-zero. ## Contributing diff --git a/index.html b/index.html index 594283d..d3beac6 100644 --- a/index.html +++ b/index.html @@ -3,11 +3,12 @@ - -Ordane — Studio + +RoleWeave — AI 员工桌面工作台 + -
-
- v0.6.0 · Alpha · Apache-2.0 -

把每一个目标,立定成一条可核验的线。

+ v0.1.1 · 早期预览 · Apache-2.0 +

给每一个 AI 员工,一个看得见的岗位。

- Ordane 是一个以目标为纲的组织工作台:文件树即组织架构,岗位即可寻址的数字员工。协作只有被 line 管理时才产生效率——不再靠 Agent 互相猜测彼此在做什么。 + RoleWeave 是一个组织和使用 AI 员工的桌面工作台:为每个岗位写下指令、定好预算,然后在同一个地方与它们对话、查看岗位文档、回看活动报表。组织原则很简单——文件树即组织架构。

- 状态 Electron 桌面客户端 - 原则 本地优先 · 数据不出域 + 形态 Electron 桌面应用 + 本地 Node.js 服务 + 工作区 本地文件夹 许可 Apache-2.0
-
- org-workbench · examples/oss-maintainer - 引擎可用 + examples/oss-maintainer + 本地服务 127.0.0.1
- Ordane 桌面客户端实际界面:左侧组织树、中间组织图(岗位卡片带预算与审批状态)、右侧本地对话面板 + 客户端截图:左侧组织树、中间带预算标签的岗位组织图、右侧本地对话面板
-

真实客户端截图 · oss-maintainer 示例工作区 · 未经修饰

+

真实客户端截图 · examples/oss-maintainer 示例工作区 · 未经修饰(窗口标题为改名前的 org-workbench 开发版)

-
-
The Primitive
-

Agent 协作最大的成本,从来不是 token 单价。

-

是失控。多个 Agent 扑向同一个目标,形成的是竞争而不是分工——重复劳动、互相覆盖、用 token 空转。

+
The Principle
+

文件树即组织架构。

+

岗位住在文件夹里,嵌套的文件夹定义汇报关系。团队结构留在磁盘上,随时可以打开看、可以核对。

-
-

Ordane 引入 line 这个基本单位:一个 goal 立项即一条线,线上有归属、顺序、去重。Agent 是线上的岗位,协作只有在被线管理时才产生效率。

+

一个工作区是本地项目文件夹;一个岗位是 AI 员工的职位,有自己的指令和预算;一个会话把该岗位的本地对话轮次归到一起。

+
positions/
+└── repo-owner/
+    ├── SKILL.md
+    ├── budget.json
+    ├── issue-researcher/
+    ├── community-operator/
+    └── release-engineer/
+

仓库里的 examples/oss-maintainer 就是这样一个开源维护团队:一个仓库负责人带三个支撑岗位——issue 调研、社区运营、发版工程。移动一个岗位就改变了汇报关系;在应用内归档会把岗位保留在工作区的备份区,需要显式恢复。

- -

Agent 时代的 Jira —— 不是把人换成 Agent,是把 Jira 换成一个懂 Agent 语义的目标管理层。

+

结构不藏在某个配置里,它就是磁盘上的目录。

-
Non-Negotiable
-

三条不动摇的原则

-

本地优先,契约先行,披露即授权——点开每一条看细节。

+
What You Can Do
+

组织团队、与岗位工作、看清发生了什么

+

三件事构成日常使用的闭环——点开每一条看细节。

- -
- - - +
+ + +
- 本地优先,数据不出域 -

控制面跑在员工电脑上

-

127.0.0.1 + 每启动 boot-token,凭据经 0600 auth-payload 传递,从来不出本地边界。合规叙事天生干净。

+ 岗位 · 预算 · 汇报关系 +

组织一支 AI 团队

+

创建岗位时写明它的指令与明确的 token 预算,随时调整汇报关系,把不再需要的岗位归档、需要时再恢复。改变组织结构就是移动文件夹。

- 契约先行,可替换、可测评 -

Agent Loop as a Service

-

turn 契约、org 契约、Runtime 抽象层,模型 / Host 可换,上层业务不改。所有能力经 golden case 测评验证,不凭直觉路由。

+ 对话 · 本地历史 · 会话 +

与单个岗位一起工作

+

发起对话,回看本地历史;任务换了就开一个新会话。新会话保留此前的本地记录,但它不授予新的权限,也不代表底层 AI Host 恢复了上一次会话。

- 披露是授权动作,不是系统动作 -

秘书 vs 参谋

-

个人版零披露完整可用;每次披露员工可见、可撤、有 ledger。团队版只消费"事实",永远不碰"过程"。

+ 报表中心 · 本地存储 +

看清发生了什么

+

已记录的活动、组织变更、每一轮的结果与可用预算使用情况都在报表中心。工作区文件与对话记录存在本地——但本地存储不等于离线 AI:提示词与任务上下文仍会发送给你所配置的 AI 提供方。

-
-
●
workspace init一条命令把目录变成带组织树的数字业务工作区
Shipped
-
●
org tree / apply组织契约 v1alpha1,本地 0600 存储;apply 重算权限、留审计
Shipped
-
●
chat @position岗位寻址对话;turn 契约 R3;崩溃 → indeterminate,不自动重试
Shipped
-
●
org-permissions.v1Authority Scope / Context Scope 逐岗位派发;越权拒绝并给恢复指引
Shipped
-
◐
mem 长期 ContextStrict MemoryPort 架构与 agent/human token 分离已落地;跨会话长期召回与委派链仍在验证,未计入已发布能力
Building
-
◐
Windows 支持原生进程树清理、.cmd spawn、qoder Windows 使能
Building
+
●
工作区与组织树打开本地文件夹即成为工作区;岗位即文件夹,嵌套即汇报关系
Shipped
+
●
岗位对话与本地历史按岗位发起会话,回看此前的本地对话轮次
Shipped
+
●
岗位预算 budget.json每个岗位显式的 token 预算,与岗位指令放在一起
Shipped
+
●
报表中心活动记录、组织变更、轮次结果与可用预算使用情况
Shipped
+
●
本地 HTTP 服务绑定 127.0.0.1;除 GET /health 外均需每次启动新生成的 Bearer token
Shipped
+
◐
Windows 自动更新macOS 已有带签名清单的更新机制;Windows 仍待完成,新版本用安装包手动更新
Building
+
◐
有界上下文 · 独立派工 · 并行/接力分组已在源码分支,未包含在 v0.1.1 安装包中
Building
+
◐
Claude Code 实机执行与完整委派链连同端到端的长期上下文流程,尚未纳入当前验证基线
Building
-
Runtime Abstraction
-

模型 / Host 可换,上层业务不改。

-

Ordane 不绑定单一 Agent Host——同一套 turn 契约下,claude-local 与 qoder 已有本机验证证据,openai-compatible 处于预览阶段。

+
AI Host & Services
+

引擎跑在你的机器上。

+

桌面端默认适配器使用本机安装的 Qoder CLI(1.1.x 系列)。RoleWeave 不包含模型订阅;本机就绪检查确认的是 CLI 前置条件,不代表账号访问,也不代表一次成功的模型请求。

-
-
Ordaneturn 契约 R3
-
claude-localAgent Host
-
qoderAgent Host
-
openai-compatiblePreview · 未 live-qualified
+
RoleWeave127.0.0.1 本地服务
+
Qoder CLI 1.1.x默认适配器 · macOS 已实机验证
+
doc · mem · context可选连接服务 · 服务端配置
+
Claude Code未纳入验证基线
+

连接服务均为可选,未配置时显示为未连接。服务 token 放在服务端环境里,不进岗位文档、提示词和提交的文件。

-
Adoption Ladder
-

个人 → 团队 → 组织

-

每一级都独立完整,向上一级不是"升级",是"接入"。

+
Download & Get Started
+

装好,然后发出第一个任务。

+

v0.1.1 提供 macOS(Apple Silicon)与 Windows x64 安装包。这是早期预览版:macOS 包未做 Apple Developer ID 签名与公证,Windows 安装包未做 Authenticode 签名,系统可能在安装或首次启动时给出安全提示。

-
-
- ● 已跑通 -

个人版

-

零披露完整可用。一条命令把目录变成数字业务工作区,点人即聊。

+ - +
    +
  1. 安装并打开 RoleWeave。界面支持英文与简体中文;在右上角标题栏打开 Preferences,选择 Language 切换。
  2. +
  3. 新建或打开工作区。用项目菜单创建项目,或打开已有的 digital-employee 工作区;想看现成的团队,克隆仓库后打开 examples/oss-maintainer。
  4. +
  5. 选一个岗位。看它的指令与预算,或直接为你要做的事新建一个岗位。
  6. +
  7. 准备 AI Host。安装 Qoder CLI(1.1.x)并配置好账号访问。自定义安装路径用服务端环境变量 ORG_WORKBENCH_QODER_BIN 指向可执行文件,改动启动环境后需重启应用。
  8. +
  9. 发一个小任务。例如“总结你的岗位指令,并提出第一个任务”,然后回看记录下来的结果。
  10. +
-

我们不是给 AI 一个更聪明的搜索框。

-

是给 AI 一套可执行的企业业务模型——文件树即组织架构,岗位即可寻址的数字员工。

+

从一个文件夹开始,组织你的 AI 团队。

+

RoleWeave 是早期预览版。装好安装包,或者从源码构建;用不顺手就开一个 issue。

-
@@ -586,7 +702,58 @@

组织

select(next, true); }); })(); + (function () { + var dls = Array.prototype.slice.call(document.querySelectorAll('[data-dl]')); + if (!dls.length) return; + + // "当前设备" only claims what the browser actually reports. The mac build + // is arm64-only, so an Intel Mac must not be told it is theirs: the + // synchronous hint is withdrawn if the UA later reports a non-arm arch. + try { + var uaData = navigator.userAgentData; + var plat = (uaData && uaData.platform) || navigator.platform || ''; + var ua = navigator.userAgent || ''; + var mark = function (key, on) { + dls.forEach(function (dl) { + var el = dl.querySelector('[data-plat="' + key + '"] .dl-here'); + if (el) el.hidden = !on; + }); + }; + var here = null; + if (/Win/i.test(plat) || /Windows/i.test(ua)) here = 'win'; + else if (/Mac/i.test(plat) && !/iPhone|iPad|iPod/i.test(ua)) here = 'mac'; + if (here) mark(here, true); + if (here === 'mac' && uaData && uaData.getHighEntropyValues) { + uaData.getHighEntropyValues(['architecture']).then(function (v) { + if (v && v.architecture && v.architecture !== 'arm') mark('mac', false); + }).catch(function () {}); + } + } catch (e) { /* the hint is decoration; a failure must not cost a download */ } + + var hoverable = !!(window.matchMedia && window.matchMedia('(hover: hover) and (pointer: fine)').matches); + dls.forEach(function (dl) { + if (hoverable) { + dl.addEventListener('mouseenter', function () { dl.open = true; }); + dl.addEventListener('mouseleave', function () { dl.open = false; }); + } + dl.addEventListener('keydown', function (e) { + if (e.key !== 'Escape' || !dl.open) return; + dl.open = false; + var s = dl.querySelector('summary'); + if (s) s.focus(); + }); + // Picking a file starts the download; leaving the menu open would hide it. + dl.addEventListener('click', function (e) { + var t = e.target; + if (t && t.closest && t.closest('a')) dl.open = false; + }); + }); + var closeOutside = function (e) { + dls.forEach(function (dl) { if (dl.open && !dl.contains(e.target)) dl.open = false; }); + }; + document.addEventListener('click', closeOutside); + document.addEventListener('focusin', closeOutside); + })(); - diff --git a/package-lock.json b/package-lock.json index 8c44071..ce37b03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@bytefolk/ordane-site", + "name": "@bytefolk/roleweave-site", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@bytefolk/ordane-site", + "name": "@bytefolk/roleweave-site", "version": "0.0.0", "license": "Apache-2.0", "devDependencies": { diff --git a/package.json b/package.json index 60ce9e5..ff90dac 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "@bytefolk/ordane-site", + "name": "@bytefolk/roleweave-site", "private": true, "version": "0.0.0", - "description": "Static marketing site for Ordane. No build step; this manifest only pins the verification toolchain.", + "description": "Static marketing site for RoleWeave. No build step; this manifest only pins the verification toolchain.", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/scripts/contrast-check.js b/scripts/contrast-check.js index 6789cb1..85bc5f3 100644 --- a/scripts/contrast-check.js +++ b/scripts/contrast-check.js @@ -71,29 +71,33 @@ const dark = tokensFrom(':root[data-theme="dark"] {'); if (!light.card) light.card = [100, 0, 0]; const SMALL = 4.5; +// Large-scale text (>= 24px regular / 18.66px bold) only needs 3:1. +const LARGE = 3; const PAIRS = [ ['nav + body text ink-2 on paper', 'ink-2', 'paper', SMALL], ['headings ink on paper', 'ink', 'paper', SMALL], - ['section eyebrow teal on paper', 'teal', 'paper', SMALL], - ['section eyebrow teal on band', 'teal', 'band', SMALL], + ['section eyebrow brand on paper', 'brand', 'paper', SMALL], + ['section eyebrow brand on band', 'brand', 'band', SMALL], ['cap rows / tab label ink-2 on band', 'ink-2', 'band', SMALL], ['tier body ink-2 on card', 'ink-2', 'card', SMALL], - ['tier status teal on card', 'teal', 'card', SMALL], - ['shipped state teal on band', 'teal', 'band', SMALL], - ['float head live teal on card', 'teal', 'card', SMALL], + ['tier status brand on card', 'brand', 'card', SMALL], + ['shipped state brand on band', 'brand', 'band', SMALL], + ['float head live brand on card', 'brand', 'card', SMALL], ['orbit node label ink on card', 'ink', 'card', SMALL], ['hero meta / caption ink-3 on paper', 'ink-3', 'paper', SMALL], ['caption on band ink-3 on band', 'ink-3', 'band', SMALL], ['tier mind / node tag ink-3 on card', 'ink-3', 'card', SMALL], ['building state amber on band', 'amber', 'band', SMALL], - ['primary button label teal-ink on teal', 'teal-ink', 'teal', SMALL], - ['selected tab label teal-ink on teal', 'teal-ink', 'teal', SMALL], - ['orbit centre label teal-ink on teal', 'teal-ink', 'teal', SMALL], - ['cta band body teal-ink on teal', 'teal-ink', 'teal', SMALL], - ['cta button label teal on teal-ink', 'teal', 'teal-ink', SMALL], - ['eyebrow pill teal on teal-soft', 'teal', 'teal-soft', SMALL], - ['inline code teal on band', 'teal', 'band', SMALL], - ['primary button hover teal-ink on teal-hover', 'teal-ink', 'teal-hover', SMALL], + ['primary button label brand-ink on brand', 'brand-ink', 'brand', SMALL], + ['selected tab label brand-ink on brand', 'brand-ink', 'brand', SMALL], + ['orbit centre label brand-ink on brand', 'brand-ink', 'brand', SMALL], + ['cta band body brand-ink on brand', 'brand-ink', 'brand', SMALL], + ['cta button label brand on brand-ink', 'brand', 'brand-ink', SMALL], + ['eyebrow pill brand on brand-soft', 'brand', 'brand-soft', SMALL], + ['inline code brand on band', 'brand', 'band', SMALL], + ['download menu hover ink on band', 'ink', 'band', SMALL], + ['hero headline accent azure on paper', 'azure', 'paper', LARGE], + ['primary button hover brand-ink on brand-hover', 'brand-ink', 'brand-hover', SMALL], ]; let failed = 0; diff --git a/scripts/render-check.js b/scripts/render-check.js index dbc27bb..7f28fa7 100644 --- a/scripts/render-check.js +++ b/scripts/render-check.js @@ -1,4 +1,4 @@ -// Renders the Ordane site headlessly, screenshots the three sections the PR +// Renders the RoleWeave site headlessly, screenshots the three sections the PR // description claims to check, asserts page health, and FAILS CLOSED // (process.exitCode = 1) on any page error or failed assertion. Webfont // requests to fonts.googleapis.com / fonts.gstatic.com failing is reported but