augushong
|
57873080df
|
feat(log): 新增 debug_log_import 定时导入任务(时间窗口+事务对齐+当天文件保护)
|
2026-08-16 08:45:19 +08:00 |
|
augushong
|
c0cae93562
|
feat(log): 新增 DebugLogReader 增量读服务(JSONL 按行 + CSV fgetcsv 多行安全)
|
2026-08-16 08:17:52 +08:00 |
|
augushong
|
8cbe62a402
|
feat(admin): 初始化菜单重组运行管理分组并补录 XHProf 菜单
系统管理下新增运行管理目录(309),含定时任务(310)、Web日志(311)两个子目录;定时器配置/日志、访问统计仪表盘、原始访问日志、性能分析、系统状态、日志管理、主机列表共 8 条菜单挪入新分组;补录此前遗漏的 XHProf 四条菜单(304-307,叶子带 auth_node),新装环境与开发库结构对齐(26 条)。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-08-15 19:11:39 +08:00 |
|
augushong
|
a43a9a48b9
|
feat(tools): XHProf 日志导入三层服务与函数监控物化
- XhprofProfileParserService(Base/App):纯数组解析 jsonl 行,
meta 字段以真实 fixture 为准;simple_url 缺失兜底与采集端回调同算法;
watch 正则按 callee 物化(ct/wt_sum/wt_max),非法正则编译计 fail 跳过
- XhprofLogReaderService(Base/App):增量读取,半行缓冲超限整行丢弃
(不照抄 nginx 8MB 强制切行);EOF 无换行半行不 yield 不推进 offset;
进度不自动落盘,由导入侧在同一事务内显式 savePosition
- XhprofLogImport 定时任务(Base/App):不受 XHPROF_ENABLE 门控,
runs-*.jsonl 按文件名序增量导入;run 逐条 insert + detail chunk 20
insertAll + run_watch insertAll 与 position 同事务落盘;导至 EOF 后
只删已导完文件
- 修复 T1 缺陷:request_time decimal(12,3) 装不下 10 位时间戳,
Scheme 与 migration 同步改 decimal(13,3)
- 新增 parser 单元测试(真实 fixture 断言,9 用例 42 断言)
与 jsonl fixture;phpunit 注册 unit 测试套件
|
2026-08-15 06:11:01 +08:00 |
|
augushong
|
b472df8c1d
|
feat(tools): XHProf 数据清理任务与定时注册
|
2026-08-15 05:47:34 +08:00 |
|
augushong
|
0e1df3852d
|
feat(update): 新增 admin:update --fetch-only 纯拉取模式
|
2026-08-08 19:09:21 +08:00 |
|
augushong
|
ad96755ff5
|
docs(permission): 统一校准权限节点措辞,消除更新节点误解
admin:permission:nodes 是查看型命令(实时扫描注解、不写库、改注解即生效),但文档/注释多处用一键更新/自动更新/生成等动作词描述,导致开发者系统性误以为它是更新权限节点命令。本次校准 8 个文件 10 处误导措辞,并在命令输出末尾追加机制提示。@NodeAnotation 拼写保持不变(框架故意少一个 t)。
|
2026-08-08 18:21:25 +08:00 |
|
augushong
|
8faa52ce90
|
feat(nginx-log): 多节点适配(node_id 全链路 + 全局/按节点聚合 + 节点筛选 + v2.4.0 升级脚本)
- 6 张表加 node_id 字段 + position/stat 改复合唯一键(migration)
- 6 个 Scheme 同步 node_id 注解 + 唯一键
- Reader 带 node_id 参数 + 懒加载接管(getLastPosition 回退查 node_id='')
- Aggregator 全局行(node_id='')+ 按节点循环 insertAggregatesForScope
- Stat 所有查询方法加 where node_id 条件
- Dashboard 控制器/视图加节点筛选下拉框 + AJAX 带 node_id
- AccessLog 列表加节点列 + 采集进度卡片显示节点信息
- import 定时任务 run_type 改 all(每节点采集自己的日志)
- v2.4.0 升级脚本追加 ALTER TABLE(幂等 check-then-alter)
- 菜单调整:去掉 Nginx 顶级菜单 + 读取位置管理,改为系统管理下挂两个子菜单
- ulthon-timer 文档补充 run_type=all 多节点部署注意事项
|
2026-08-08 10:33:20 +08:00 |
|
augushong
|
f1a2e8fd5d
|
fix(nginx-log): service 文件加 Service 后缀(命名规范合规)
F2 Code quality review 发现:3 个新增 service 未遵守
.agents/rules/ulthon-naming-convention.md 第 19 行规定
(service 模块文件名需带 Service 后缀)。
变更:
- 重命名 6 个文件(3 Base + 3 App):
NginxLogParser(Base)→NginxLogParserService(Base)
NginxLogReader(Base)→NginxLogReaderService(Base)
NginxLogAggregator(Base)→NginxLogAggregatorService(Base)
- 同步类名、use、类型 hint、new 引用
- NginxLogReaderServiceBase 异常消息前缀同步加 Service
- controller Base 引用更新(NginxLogImportBase / NginxLogStatAggregateBase)
验证:
- php -l 全部 8 个文件语法通过
- grep 残留旧名 = 0 结果(24 处引用全部带 Service 后缀)
|
2026-07-28 06:57:13 +08:00 |
|
augushong
|
0f9f12174c
|
test(nginx-log): 权限节点扫描 + 端到端 QA 验证 + curd 路径修复
- 跑 admin:permission:nodes 扫描 138 个权限节点(17 个 nginx 相关节点)
- 17 个 nginx 节点 assign 给 role-id=1(写入 ul_system_auth_node 满足 plan 验收)
- curd 路径修复:菜单 href 由 system.nginx_access_log/index 改为 nginx.access_log/index(匹配 curd 生成的实际 URL,方案 B)
- SystemMenu.php / v2.4.0.php / DB ul_system_menu 三处同步(含 id=303 log_position)
- dashboard id=301 system.nginx_log_stat/index 保持不变(控制器确实在 system 模块)
- 端到端 QA 全通过:100 行日志 → import 74 行(静态过滤)→ aggregate stat_hour=1/url=6 → dashboard 数据完整
- 修复 T10 遗留 bug:cleanStatTables 用 Unix 时间戳当阈值,与 stat_date YYYYMMDD 不匹配导致误删
- threshold 从 strtotime('today')-days*86400 改为 (int) date('Ymd', strtotime('today')-days*86400)
- 验证:366 天前 stat 数据被删,今天 stat 数据保留
- 权限隔离:超管可访问,未登录被拦(code=40101 请先登录后台)
- Evidence: .omo/evidence/task-16-nginx-log-analytics-e2e/(15 个文件)
|
2026-07-28 06:47:24 +08:00 |
|
augushong
|
8a5a0d9877
|
feat(nginx-log): NginxLogStat dashboard 视图与 JS(echarts 趋势图)
|
2026-07-28 06:34:30 +08:00 |
|
augushong
|
3e983d8b8f
|
feat(nginx-log): adminUpdateCodeData v2.4.0 存量升级代码(sysconfig + 菜单幂等补齐)
|
2026-07-28 06:28:17 +08:00 |
|
augushong
|
d5329cdd45
|
feat(nginx-log): curd 生成 raw/position 后台并改只读
- NginxAccessLog + NginxLogPosition Scheme 加 #[Component] 注解
- Scheme Table name 补 ul_ 前缀(curd 严格校验要求)
- curd 生成 nginx 模块完整后台(controller/model/view/js)
- Base/App 双层只读控制器(参照 TimerLogBase 范式)
- AccessLogBase: add/edit/delete/modify 全部 error
- LogPositionBase: 同上
- 视图改造:
- access_log 裁剪到 8 列核心字段(time_local/method/uri/status/remote_addr/request_time/body_bytes_sent/http_user_agent)
- status/request_time 自定义 badge 渲染
- toolbar 清空 + operat 仅保留详情(B 类只读页面)
- log_position 全字段 + 只读化
- HTTP 验证:index 200 OK + add/edit/delete/modify 全部返回错误
|
2026-07-28 06:21:13 +08:00 |
|
augushong
|
7987001cd2
|
feat(nginx-log): NginxLogStat dashboard 控制器(Base/App 双层,日/周/月/年聚合)
- extend/base/admin/controller/system/NginxLogStatBase.php:完整逻辑
- @ControllerAnnotation(title=Nginx访问统计) + @NodeAnotation(title=访问统计)
- index() 页面/接口同体:isAjax() 返回 JSON,否则 fetch()
- period 解析:day(24h)/week(7d)/month(30d)/year(12m)/custom,invalid 自动 fallback day
- custom start>end 自动 swap
- 整体指标:SUM stat_hour,avg_request_time 按 PV 加权平均
- 趋势:day 按 stat_hour 聚合补 0-23;week/month/custom 按 stat_date 补日期序列;year 按 (stat_date DIV 100) 聚合补 1-12 月
- Top N:sysconfig('nginx_log','topn_default',10),topN=0 不截断
- 跨周期 UV 标注:uv_is_estimate = period !== 'day'
- 空表/空范围不崩(返回 0/[])
- app/admin/controller/system/NginxLogStat.php:App 入口,仅 extends Base
性能:stat_hour 10 万行 + period=year 服务端 < 700ms(< 2s 要求)
依赖:T1 stat 模型、T9 Aggregate;blocks:T13 视图
|
2026-07-28 06:17:22 +08:00 |
|
augushong
|
2b677c6f89
|
feat(nginx-log): NginxLogStatAggregate 定时任务 + timer config 注册
|
2026-07-28 06:02:07 +08:00 |
|
augushong
|
8eaa672ed6
|
feat(nginx-log): NginxLogClean 定时任务 + timer config 注册(完成 3 个 nginx 任务)
|
2026-07-28 06:00:15 +08:00 |
|
augushong
|
13b1313e92
|
feat(nginx-log): NginxLogImport 定时任务 + timer config 注册(Base/App 双层)
|
2026-07-28 05:48:46 +08:00 |
|
augushong
|
ceb73c750a
|
feat(nginx-log): NginxLogAggregator 聚合 service(Base/App 双层,delete-then-insert 幂等)
|
2026-07-28 00:52:51 +08:00 |
|
augushong
|
9fe55f81bf
|
feat(nginx-log): NginxLogReader 增量读取 service(Base/App 双层,含轮转检测)
|
2026-07-28 00:39:11 +08:00 |
|
augushong
|
7d707c2150
|
feat(nginx-log): NginxLogParser 解析器 service(Base/App 双层)
|
2026-07-28 00:38:25 +08:00 |
|
augushong
|
ce191adfd8
|
feat(nginx-log): 4 个 stack 模板增加 log_format 与 access_log 配置(Docker 开箱即用)
|
2026-07-28 00:24:26 +08:00 |
|
augushong
|
3405f8de60
|
feat(nginx-log): adminInitData 增加 nginx_log 默认配置(保留策略/topN/静态排除)
|
2026-07-28 00:18:56 +08:00 |
|
augushong
|
97eb8ca99a
|
fix(timer): timer_log 列表页补全刷新按钮与事件监听方法修正
toolbar 从 [] 改为 ['refresh'](B 类只读页面保留刷新),ua.table.on 修正为 layui.table.on。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-26 09:53:27 +08:00 |
|
augushong
|
739b536f8d
|
fix(host): Host 控制器禁用手动增删改与按钮配置修正
HostBase 补 add/edit/delete/modify 禁用方法(节点自动注册,不支持手动操作)。_common.js 的 addUrl/editUrl/deleteUrl/exportUrl/modifyUrl 改空字符串。index.js 补 toolbar: ['refresh'](C 类页面,去掉默认的 add/delete/export)。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 22:40:05 +08:00 |
|
augushong
|
908f84ee9f
|
refactor(timer): TimerLog 控制器迁移到 Base 层 + toolbar 与事件监听修正
控制器逻辑移入 extend/base/admin/controller/system/TimerLogBase.php,app 层改为空壳继承。index.js 补 toolbar:[] + defaultToolbar:['filter'](B 类只读页面),修正 ua.table.on → layui.table.on。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 22:39:53 +08:00 |
|
augushong
|
009647f96f
|
refactor(timer): TimerConfig 控制器与视图迁移到 Base 层
控制器逻辑移入 extend/base/admin/controller/system/TimerConfigBase.php,app 层改为空壳继承。9 个视图文件迁移到 extend/base/admin/view/system/timer_config/。index.js 补 toolbar: ['refresh', 'export'] 声明(C 类页面,去掉默认的 add/delete)。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 22:39:20 +08:00 |
|
augushong
|
3db3f7de78
|
feat(timer): syncConfig concurrency 不变量与控制器 cap 防御
TimerServiceBase syncConfig 不覆盖 DB concurrency(NULL=继承代码默认)。TimerControllerBase cap 改 >= 语义,放行 concurrency_id < cap 的 0-indexed 分片。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 21:57:39 +08:00 |
|
augushong
|
f478ae0e4e
|
feat(timer): runLoop 热加载并发实例与运行时配置参数
TimerBase 实现 shouldExecuteTask 手动触发原子消费、reloadRequestList 合并式扩缩容、runLoop 脏标记检测+定时兜底+有效域钳制+drain 优雅缩容+checkTriggerTtl 超时复位。config/timer.php 新增 trigger_ttl/force_reload_interval/drain_max_lifetime 三参数。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 21:57:25 +08:00 |
|
augushong
|
236a343fa9
|
feat(timer): 新增并发数/触发节点/触发时间三字段及幂等分发
Scheme 定义 concurrency(nullable)/trigger_node_id/last_trigger_time 三字段,Model 声明属性,v2.3.0 分发代码幂等 ALTER 保证升级自动同步。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-25 21:57:14 +08:00 |
|
augushong
|
387d89c596
|
breaking(stack): 彻底移除 stack:mode 命令(含 app/extend/base/注册)
|
2026-07-22 00:50:56 +08:00 |
|
augushong
|
600ee5b085
|
refactor(agents): 删除 tools:agent:publish 命令,补全 helper.php 函数覆盖机制,修正多处文档 bug
- 删除 tools:agent:publish 整套(不再兼容多套 IDE,只保留 .agents 目录)
- helper.php 全部 27 个全局函数加 if (!function_exists()) 包裹,项目侧可在 app/common.php 定义同名函数覆盖
- ulthon-file-override-mechanism.md 新增全局函数覆盖章节
- AGENTS.md 删除智能体指导章节,PHP 8+ 改为 8.0+,MySQL 8+ 改为 5.7+
- AGENTS.md 项目结构树补全 tests/、extend/think/、source/ 子项
- README.md PHP 版本统一为 8.0+
- ulthon-base-app-architecture SKILL 路径补 admin/service/ 段
- ulthon-tools-http-call SKILL 补 --page-data 参数
- ulthon-naming-convention 补元数据头
- ulthon-update-workflow 统一 extend/think/ 归类
|
2026-07-21 19:35:28 +08:00 |
|
augushong
|
e40d497515
|
fix(curd): 修正关联表 onlyFields 键名拼写错误
- CurdBase 注释解析只识别 onlyFields(正确拼写),不再支持历史错误拼写 onlyFileds
- BuildCurdServiceBase 内部局部变量 onlyShowFileds 改为 onlyShowFields(按位置传参,外部 API 不变)
- 同步文档(ulthon-database-design 已删除,ulthon-scheme-definition 技能已使用正确拼写)
|
2026-07-19 09:07:49 +08:00 |
|
augushong
|
51d0ed7331
|
fix(auth): 修复角色分配用户列表layui filter传参导致参数绑定错误
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-18 21:33:33 +08:00 |
|
augushong
|
3f7050bf65
|
feat(test): 框架测试基建基类TestCaseBase+app层入口+冒烟测试
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-18 00:12:41 +08:00 |
|
augushong
|
1ca1f86150
|
feat(auth): 角色分配用户页面视图与列表入口按钮
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-17 23:44:33 +08:00 |
|
augushong
|
50cb069677
|
feat(auth): 角色管理新增分配用户后端方法(assignUsers+toggleUser)
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-17 23:44:23 +08:00 |
|
augushong
|
e4965e05b6
|
fix(timer): call 任务执行加异常捕获防止单任务崩溃定时器
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-17 23:33:41 +08:00 |
|
augushong
|
ccb7540356
|
fix(host): 心跳更新失败仅记日志不再重复抛异常
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-17 23:33:25 +08:00 |
|
augushong
|
17ef7af860
|
fix(role): 修复角色删除按 auth_ids 查用户的子串混淆(like→FIND_IN_SET)
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-07-17 23:33:11 +08:00 |
|
augushong
|
76b23d4c70
|
refactor(timer): 使用 CurlMultiHandler 替代 Workerman,统一为非阻塞模式
- 删除 runParallel() 方法和所有 Workerman 引用(死代码)
- 重写 runLoop() 为 Guzzle CurlMultiHandler 非阻塞事件循环
- 新增 pending 数组追踪进行中的请求,handler.tick() 非阻塞推进
- 自适应 sleep 策略(有任务 50ms,空闲 200ms)
- 简化 config/timer.php:移除 mode,适配 Guzzle 参数
- 更新 SKILL.md:移除 parallel 描述,修正 --quit 文档 bug
- 验证发现:--quiet 是 ThinkPHP 全局选项,不需要在 configure() 注册
- 验证发现:方法名不能用 run(),与 ThinkPHP Command::run() 签名冲突
|
2026-06-02 21:19:53 +08:00 |
|
augushong
|
c4fbd60bbc
|
fix(timer): 修正定时器参数拼写 quit -> quiet(静默模式)
|
2026-06-02 20:09:37 +08:00 |
|
augushong
|
288724efc8
|
chore: 发布 v2.2.8
|
2026-06-01 23:15:18 +08:00 |
|
augushong
|
f5db5abb17
|
chore: bump version to v2.2.7
|
2026-06-01 22:46:18 +08:00 |
|
augushong
|
4e3de27c51
|
chore: bump version to v2.2.6
|
2026-06-01 21:52:57 +08:00 |
|
augushong
|
afd614e563
|
feat(timer): ClearLog 清理天数改为从配置读取,支持 env 覆盖
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-06-01 20:28:25 +08:00 |
|
augushong
|
8c766d7e07
|
chore: bump version to v2.2.5
|
2026-05-27 21:54:50 +08:00 |
|
augushong
|
ceed8d3e71
|
feat(stack): CLI handleUse() 增加 skipped_files 和 deleted_files 展示
|
2026-05-27 21:42:52 +08:00 |
|
augushong
|
c7cfa40539
|
chore: bump version to v2.2.4
|
2026-05-27 20:52:13 +08:00 |
|
augushong
|
7ecbd03730
|
chore: bump version to v2.2.3
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-05-27 20:24:23 +08:00 |
|
augushong
|
c16964679d
|
feat(menu): 补充定时器和主机列表的默认菜单初始化数据
在 SystemMenu 初始化数据中新增定时器配置(id=256)、定时器日志(id=257)、主机列表(id=258)三条菜单,确保 seed:run 后菜单自动可用
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-05-27 20:22:23 +08:00 |
|