Commit Graph
6 Commits
Author SHA1 Message Date
PMon Dev e0bd64fe81 chore(release): 1.1.2 —— 交付包统一命名 inkwatch-arm64-<版本>.apk
配合项目定名「墨观 InkWatch」:

- client/README.md 的发布步骤改为输出 inkwatch-arm64-*.apk,
  并标注「包名与 FFI 符号仍是 pmon」(两件事,见 docs/rename-inkwatch.md)
- pubspec 版本 1.1.1+11 → 1.1.2+12

真机核验(F50):

- 界面标题「墨观 采集端」;APK 内 AndroidManifest 含「墨观」、不含 PMon
- 因未改 applicationId,覆盖安装成功 —— 本地配置与会话令牌原样保留。
  若改了包名,这一步会变成「装成另一个 App」,要重装并重新认领

生产已同步:~/pmon → ~/inkwatch。容器名与卷名(pmon_pg_data)均未变,
4 个容器 Up 18 hours healthy;从新路径 compose 照常认得 ——
这正是「只改显示名、不动 compose project name」的价值所在。
2026-09-16 12:14:58 +08:00
PMon Dev 427994853c merge(main): 合入「墨观 InkWatch」改名(分支沿用主干显示名) 2026-09-16 12:09:53 +08:00
PMon Dev b3db58df06 rename: 项目对外名定为「墨观 InkWatch」
<user> 2026-09-16 定名。本次只改**用户看得见的那一半**,
内部标识(包名 / FFI 符号 / applicationId / compose project name / 卷名 / 数据库名)
一律保持 `pmon` 不动 —— 理由与"若要彻底改名该怎么做"见 docs/rename-inkwatch.md。

已改:
  · 界面标题:采集页「墨观 采集端」、查看页「墨观 查看端」、MaterialApp.title「墨观」
  · 桌面图标名 android:label="墨观"(刻意短,避免被系统截断)
  · 前台服务通知「墨观 正在采集」
  · 日志前缀 [PMon] → [inkwatch](**刻意用 ASCII**:中文在 Dart AOT 里按 UTF-16LE
    存,拿 grep -F 核验恒为 0 —— 这个坑踩过,日志前缀别用中文)
  · pubspec description 换成正式描述(顺手清掉 Flutter 模板残留 "A new Flutter project.")
  · README / docs 抬头与标题;方案文档改名
    docs/pmon-v4-architecture.md → docs/inkwatch-v4-architecture.md(引用同步)
  · 命名约束落地:对外文案不得出现"监视/监听/追踪/窥"类词
    (方案 2.1:产品不提供任何绕过对方操作的隐蔽监控能力,这是过审与杀软信誉的前提)

刻意没改(改了会出事):
  · Dart 包名 pmon_client —— 全部 import 失效,纯风险无收益
  · applicationId com.pmon.pmon_client —— 已装机变成"另一个 App",无法覆盖升级、
    令牌与设备归属断链。越接近上架越不该改
  · Rust 39 个 _pmon_* FFI 符号 —— 要与 .so 严格配对
  · ★ docker compose 的 name: pmon —— **它是卷名锚点**(pmon_pg_data),
    改成 inkwatch 会让 compose 去找一套新空卷 = 生产清库。
    故在其上方加了防呆注释,防止后来者顺手改掉

新增 docs/rename-inkwatch.md:完整记录改了什么、没改什么、为什么,
以及"若要连内部标识一起改"的正确顺序与风险评估(结论:不建议)。

验证:客户端 282/282、dart analyze 干净、codec/protocol 离线契约通过。
2026-09-16 12:09:53 +08:00
PMon Dev 5a860cd555 feat(eink): 水墨屏专属版面 —— 横屏默认 / 极简 / 字号统一(1.1.1)
<user> 2026-09-16 的四条要求,逐条落地并各有可执行断言:

① 横屏为默认、可切竖屏
   · 新增配置 einkLandscape(默认 true);看板里的「转屏」按钮切换并落盘
   · 屏幕方向由宿主锁(SystemChrome),看板只发指令、保持"纯展示"以利测试
   · 列数按**可用空间宽高比**决定(宽→3 列 / 高→2 列),不写死方向 ——
     Flutter 只拿得到一个矩形,分屏/折叠/多窗口下方向与矩形并不一致

② 聚焦核心数据、隐藏次要信息与冗余控件
   · 在线时顶部只有「实心圆 + 设备名」:形状已表达在线,
     "在线"二字与"数据新鲜"都是冗余;一旦离线/疑似/未知才把状态与原因铺出来
   · 底部两行说明合并为一行("最后刷新 xx" + "每 N 秒自动刷新" → "xx · 每 N 秒")

③ 对比度与刷新
   · 延续零动画(静止等待图标、NoSplash、无无限动画),有源码结构断言守着
   · 支撑"永不溢出":横屏/竖屏/极窄/极矮/极宽多套尺寸全部覆盖

④ 统一字体与样式(避免字号大小不一)
   · PmonEinkText 收敛为 5 档(label 与 action 同号,靠字重而非字号区分);
     界面里**不得写就地字号**,有源码断言(`fontSize: 数字` 即红)
   · 数值改为「大数值 + 小单位」:此前 `1.42 Mb/s` 整串按 40px 渲染宽 360px,
     而 3 列时每格仅 207px → 统一比例被拖到 0.575,**一屏数值全被它压小**
   · 全屏数值共用**同一个**缩放比例(按最长那条算);
     并改用**实测字形二次收敛**替代纯线性估算(渲染期文本宽度非线性,
     实测在极窄格 + 极长值时溢出 3.7~9.3px);最外层留一层 FittedBox 兜底,
     保证"绝不裁掉内容"(正常尺寸下它不生效,同号不受影响)
   · 数值加**无损紧凑化**(`310.00` → `310`):只删数学上无信息的零尾,绝不四舍五入

实测(F50 代跑):
  · 横屏 3 列 × 2 行、大数值 + 小单位、数值明显大于标签 —— 见 dist/水墨屏走查/03
  · 竖屏**未能在 F50 干净验证**(它的 wm size/density 覆盖 + 强制旋转使 Flutter 视口
    变成近正方形,于是按设计走了 3 列)。竖屏布局由 widget 测试覆盖
    (536×724 → 2 列),待真机(Neo2)上机复核。

测试:客户端 321/321;其中 eink_board_test 32 项。
变异测试:把"统一缩放"退回"逐格 FittedBox"会被"渲染高度一致"那条抓住。

主干 main 不受影响 —— 本分支相对 main 只新增、未修改任何主干代码。
2026-09-16 01:27:49 +08:00
PMon Dev b585d780e0 feat(eink): 水墨屏专属版本(iReader Neo 2 副屏)
从主干(1.0.9)长出,**只新增、不改动主干**。本提交带过来的是
已交付的水墨屏看板 1.1.0 那批改动(下一步会在此基础上做横屏与统一字号):

  · ui/eink_board.dart     单台设备大字看板(6 大格、一屏放下)
  · ui/eink_mode.dart      全局零动画开关 + 静止等待指示
  · ui/theme.dart          PmonEink 三档明度令牌 + statusGlyph 形状化状态
  · host/app_config.dart   einkMode / einkRefreshSec(默认关,不影响彩色版)
  · 平台通道               setKeepScreenOn(副屏常亮)
  · 刷新节流               数据每秒到,只在间隔到点重建

之后本分支会继续做:横屏为默认、竖屏可切、隐藏次要信息、统一字体与样式。
主干(main)不含以上任何代码。
2026-09-16 01:06:51 +08:00
PMon Dev f632672a82 feat: PMon V4.0 功能开发收口(1.0.9)—— 主干
把 V4.0 骨架以来的全部功能开发固化为主干基线,内容包括:
  · client/            全量 Android/macOS 客户端(Flutter + Rust 核心)
  · server/            网关、业务服务、仓储层
  · deploy/            compose、Dockerfile、init.sql + migrate.sql(幂等迁移)
  · shared/ tests/     协议、编解码、指标清单与全部测试套件
  · docs/ README       架构方案与运维手册

本轮之前修复的主要缺陷(详见各文件注释与 client/README.md):
  · 首次部署路径(init.sql 的 device_tokens 建表顺序)
  · 每 20 分钟硬切以外的设备身份漂移与**设备归并**(shared/device-identity.js)
  · 配置无版本号、无校验导致的病态残留(host/config_migration.dart)
  · 数据库迁移从不执行(deploy/migrate.sql + compose 的 migrate 服务)

验证:客户端 282/282、全量回归 20 套件 0 失败。

⚠️ 水墨屏专属实现(看板、水墨屏令牌、einkMode、常亮)**不在本分支**,
   由 feature/eink 承载,主干不受其影响。
2026-09-16 01:06:24 +08:00