Etherpad Auto-Update Tier 4:基于维护窗口(Maintenance Window)的全自主升级实现解析
后端协同办公WebSocket前端富文本【免费下载链接】etherpadEtherpad: A modern really-real-time collaborative document editor.项目地址https://gitcode.com/gh_mirrors/et/etherpad点击查看免费下载Etherpad 的自更新子系统Auto-Update为实例管理员提供了一套分层的升级策略从notify仅通知到manual手动点击、auto宽限期后自动最终到autonomous在维护窗口内全自主升级。本文以仓库中的实施计划 docs/superpowers/plans/2026-05-15-auto-update-pr4-tier4-autonomous.md 为核心骨架结合已经落地的 MaintenanceWindow.ts、UpdatePolicy.ts、Scheduler.ts 等源码与测试系统讲解 Tier 4 的窗口模型、配置方法、调度逻辑、失效降级路径与运行验证方式。读完本文你将能够为 git 安装的 Etherpad 配置updates.maintenanceWindow并开启 Tier 4理解跨午夜、DST、UTC/local 等边界情况下窗口计算的确切语义掌握canAutonomous策略门控与“错过窗口即顺延”的调度行为并通过状态接口与冒烟手册独立验证全自主升级链路。一、Tier 4 在整个自更新分层中的位置Etherpad 的更新策略在 src/node/updater/types.ts 中定义了五个层级updates.tier含义写入型能力off完全关闭更新子系统无notify仅检测新版本并提示无manual管理员在/admin/update手动点击 ApplycanManualauto检测到新版本后在宽限期grace结束自动应用canAutoautonomous在auto之上叠加维护窗口仅窗口内自动应用canAutonomous从源码结构看所有写入型层级manual/auto/autonomous都要求安装方式为git——UpdatePolicy.ts 中WRITABLE_METHODS集合当前仅包含git其他安装方式docker、npm、managed会被静默降级为notify行为。Tier 4 不是一套独立的更新管线而是对 Tier 3 调度器的窗口化约束宽限期逻辑、邮件去重、排水drain与回滚全部复用唯一新增的是“什么时刻允许触发”这一层门控。实施计划的目标非常明确当检测到新版本且updates.tier autonomous时只有在now()位于配置的维护窗口内才启动排水窗口外发现的更新顺延到下一个窗口开启时刻管理端 UI 增加窗口选择器start/end 的 HH:MM、tz 选择、校验提示与“下次窗口开启时间”预览。二、维护窗口的数据模型与解析校验2.1 配置结构MaintenanceWindow类型定义在 src/node/updater/types.tsexport interface MaintenanceWindow { start: string; // 墙钟 HH:MM24 小时制 end: string; // 墙钟 HH:MM24 小时制end 为排他exclusive tz: local | utc; // 按宿主本地时钟还是 UTC 解释 start/end }配置入口位于settings.json的updates段默认值为null即关闭 Tier 4{ updates: { tier: autonomous, preApplyGraceMinutes: 15, maintenanceWindow: { start: 03:00, end: 05:00, tz: local } } }仓库根目录的 settings.json.template以及settings.json.docker在maintenanceWindow键上方的注释中给出了完整语义end排他end start表示跨午夜窗口。默认null意味着tier: autonomous但未配置窗口时策略会降级详见第五节。2.2 纯函数校验parseWindow实施计划要求校验逻辑做成可在策略、UI、状态接口中复用的纯函数落点即 src/node/updater/MaintenanceWindow.ts 导出的parseWindowconst HHMM /^([01]\d|2[0-3]):([0-5]\d)$/; export const parseWindow (raw: unknown): MaintenanceWindow | null { if (!raw || typeof raw ! object) return null; const r raw as Recordstring, unknown; if (typeof r.start ! string || typeof r.end ! string) return null; if (r.tz ! local r.tz ! utc) return null; const s toMinutes(r.start); const e toMinutes(r.end); if (s null || e null) return null; if (s e) return null; return {start: r.start, end: r.end, tz: r.tz}; };校验规则汇总start/end必须是形如HH:MM的字符串正则/^([01]\d|2[0-3]):([0-5]\d)$/限定了 00:00–23:59 的合法范围tz只能是local或utcstart end视为零长度窗口拒绝任何结构或格式失败统一返回null调用方将其解释为“Tier 4 关闭回退到 Tier 3”。单元测试 src/tests/backend-new/specs/updater/MaintenanceWindow.test.ts 覆盖了parseWindow的接受/拒绝矩阵合法同日窗口、合法跨午夜窗口、畸形 start/end、start end、未知 tz、非对象/缺字段等。2.3 启动期校验与日志在 src/node/utils/Settings.ts 的updates类型中maintenanceWindow默认值为null。实施计划明确启动时对窗口形状做校验非法时通过 log4js 的updater分类记录警告并视同null绝不因配置错误导致启动崩溃。冒烟手册 docs/superpowers/specs/2026-04-25-auto-update-runbook.md 第 12 节给出了可复现的验证方式配置{start:oops,end:05:00,tz:local}后重启日志应出现updater: ignoring malformed updates.maintenanceWindow (...)同时policy.reason变为maintenance-window-invalid。三、窗口计算的核心语义inWindow与nextWindowStartMaintenanceWindow.ts 文件头部的注释是理解整个模块的关键它明确了两条时间语义约定窗口是“墙钟”对而不是 UTC 偏移区间。tz: utc用getUTCHours/Minutes与Date.UTC(...)计算tz: local用宿主的本地墙钟。DST 迁移被 JSDate构造器的归一化吸收——例如春季拨快日一个不存在的02:30会静默落在本地03:30这是文档化的行为而非缺陷。end分钟在同日与跨午夜两种情况下都是排他的22:00-02:00窗口实际匹配[22:00, 24:00) ∪ [00:00, 02:00)。3.1inWindow(now, window)把当前时间折算为所选时区的“分钟数”0–1439再按同日/跨午夜两种区间判断export const inWindow (now: Date, window: MaintenanceWindow): boolean { const s toMinutes(window.start); const e toMinutes(window.end); if (s null || e null || s e) return false; const m wallMinutes(now, window.tz); return s e ? (m s m e) : (m s || m e); };要点同日窗口03:00-05:0003:30 在内02:59 在外05:00 整点在外end排他跨午夜窗口22:00-02:0023:00 与 01:00 都在内02:00 与 21:59 在外测试还专门以TZAmerica/Los_Angeles环境运行tzutc用例证明 UTC 窗口不随宿主时区漂移。3.2nextWindowStart(now, window)返回“大于等于now、且在所选时区中墙钟等于window.start的最早时刻”export const nextWindowStart (now: Date, window: MaintenanceWindow): Date { const s toMinutes(window.start); if (s null) return now; const isUtc window.tz utc; const year isUtc ? now.getUTCFullYear() : now.getFullYear(); const month isUtc ? now.getUTCMonth() : now.getMonth(); const day isUtc ? now.getUTCDate() : now.getDate(); const todayStart buildAt(year, month, day, s, window.tz); if (todayStart.getTime() now.getTime()) return todayStart; return buildAt(year, month, day 1, s, window.tz); };两个容易误用的边界测试与源码注释都做了显式约定如果now已经在窗口内nextWindowStart返回明天的开启时刻而不是折叠到now——因为“立刻触发”由调用方用inWindow单独把关两个函数职责分离DST 春令时America/New_York2026-03-08窗口 02:30-03:30 localnow 2026-03-08T06:00:00Z时nextWindowStart解析到下一个墙钟 02:30而该时刻在 DST 当天实际就是本地 03:30冬令时2026-11-01窗口 01:30-02:30 local则取墙钟 01:30 的第一次出现。测试文件中均以注释记录了这些预期。四、策略门控canAutonomous与失败原因策略计算是“本环境允许做什么”的唯一权威实现在 src/node/updater/UpdatePolicy.ts 的evaluatePolicy纯函数中。它接收PolicyInput含installMethod、tier、current、latest、executionStatus、maintenanceWindow返回PolicyResultlet canAutonomous false; let windowReason: string | null null; if (!terminal tier autonomous) { if (maintenanceWindow null) { windowReason maintenance-window-missing; } else if (parseWindow(maintenanceWindow) null) { windowReason maintenance-window-invalid; } else { canAutonomous true; } }canAutonomous为true需要同时满足全部条件安装方式为git可写tier autonomous没有终端态executionStatus rollback-failed此时canAuto也被拒绝必须由管理员先 Acknowledge 干预updates.maintenanceWindow非空且parseWindow校验通过。两个关键降级行为源码注释与 doc/admin/updates.md 的“Tier 4”一节相互印证窗口缺失时reason maintenance-window-missing窗口畸形时reason maintenance-window-invalid但两种情况下canAuto与canManual仍保持开启——即行为等价于 Tier 3auto自治更新被静默禁用但绝不整体瘫痪管理端 UI 会通过横幅把这种“配置缺失导致降级”显式暴露出来避免管理员误以为 autonomous 生效。PolicyResult的reason枚举完整集合见源码注释tier-off | up-to-date | install-method-not-writable | rollback-failed-terminal | maintenance-window-missing | maintenance-window-invalid | ok。单元测试 src/tests/backend-new/specs/updater/UpdatePolicy.test.ts 覆盖了三种窗口相关的策略结果。五、调度器窗口门控的两次检查点窗口约束在 src/node/updater/Scheduler.ts 中落为两个分离的检查点——排程时一次、触发时一次中间隔着可能长达数小时的宽限期。5.1 排程时把scheduledFor吸附到下一个窗口开启时刻decideSchedule在既有 Tier 3 逻辑scheduledFor now clamp(preApplyGraceMinutes)其中 grace 被钳制在[0, 7*24*60]分钟之后叠加 Tier 4 逻辑const graceMs clampGrace(preApplyGraceMinutes) * 60 * 1000; let scheduledForDate new Date(now.getTime() graceMs); // Tier 4: snap forward to the next opening if grace lands outside the window. if (policy.canAutonomous maintenanceWindow) { if (!inWindow(scheduledForDate, maintenanceWindow)) { scheduledForDate nextWindowStart(scheduledForDate, maintenanceWindow); } }测试覆盖的典型场景canAutonomous 窗口 03:00-05:00 now 10:00→scheduledFor吸附到次日 03:00而不是now gracecanAutonomous 窗口 03:00-05:00 now 03:30grace 0→scheduledFor now窗口内不吸附。邮件机制完全不受影响grace-start邮件仍然每个 tag 只发一次defer 不会触发新的 grace-start 邮件。5.2 触发时窗口关闭则deferdecideTriggerApply在计时器到点后重新检查当前时间。由于从 arm 到 fire 之间可能发生管理员取消、点击 Apply now、切换 tier、宿主挂起等事件触发时的复查是必须的if (policy.canAutonomous maintenanceWindow now !inWindow(now, maintenanceWindow)) { return { action: defer, nextStart: nextWindowStart(now, maintenanceWindow).toISOString(), reason: outside-maintenance-window, }; } return {action: fire};TriggerApplyDecision判别联合因此扩展为fire/abort/clear-schedule/defer。defer 语义窗口已关闭长宽限期、时钟偏移、宿主休眠恢复等本次不触发返回下一个开启时刻。5.3 运行器defer 后重新武装re-armSchedulerRunner的arm()是幂等的——重新武装会先清除旧计时器。在 src/node/updater/index.ts 的schedulerTriggerApply回调中defer 分支的处理是if (decision.action defer) { logger.info(scheduler deferred ${targetTag} to next maintenance window at ${decision.nextStart}); const sched state.execution.status scheduled ? state.execution : null; if (sched) { await saveState(stateFilePath(), { ...state, execution: {...sched, scheduledFor: decision.nextStart}, }); scheduler?.arm({targetTag, scheduledFor: decision.nextStart}); } return; }这里的关键设计是以持久化的var/update-state.json为唯一事实源defer 时把新的scheduledFor写盘再重新 arm这样即使进程在间隙中重启启动时也能通过rehydrating Tier 3 schedule ... at scheduledFor逻辑把计时器恢复见expressCreateServer中state.execution.status scheduled的重建分支。5.4 排程循环中的数据流performCheck周期检查在每次 tick 中先evaluatePolicy得出PolicyResult再把maintenanceWindow与策略一起传给decideSchedule只有canAutonomous为真时才传入解析后的窗口对象const decision decideSchedule({ state, now, policy, latest: state.latest, current, preApplyGraceMinutes: Number(settings.updates.preApplyGraceMinutes) || 0, adminEmail: settings.adminEmail, maintenanceWindow: policy.canAutonomous ? parseWindow(settings.updates.maintenanceWindow) : null, });另外注意performCheck的两个保护tier off直接短路checkInFlight防止并发 tick 竞态写盘与重复发信。六、状态接口把窗口状态暴露给管理端src/node/hooks/express/updateStatus.ts 的GET /admin/update/status响应在 Tier 4 中新增了两个字段const parsedWindow parseWindow(settings.updates.maintenanceWindow); const maintenanceWindow isAdmin ? parsedWindow : null; const nextWindowOpensAt isAdmin parsedWindow settings.updates.tier autonomous ? nextWindowStart(new Date(), parsedWindow).toISOString() : null;设计细节maintenanceWindow与nextWindowOpensAt仅在已认证管理员会话中返回未认证请求二者均为null——窗口配置属于运维敏感信息nextWindowOpensAt在请求时刻实时计算tier 为autonomous且窗口可解析时供管理端 UI 渲染“下次窗口开启于……”该接口默认开放requireAdminForStatus: false但execution/lastResult等诊断字段同样做了非管理员脱敏只保留状态枚举。七、管理端 UI窗口选择器与“顺延中”面板实施计划定义了完整的前端改动对应 admin/src/pages/UpdatePage.tsx、admin/src/components/UpdateBanner.tsx、admin/src/store/store.ts 与新增 admin/src/components/MaintenanceWindowPicker.tsxtier autonomous时渲染MaintenanceWindowPicker受控组件值为{start, end, tz} | null内联校验提示使用 i18n 键update.window.validation.format/update.window.validation.equal下方通过 prop 传入的nextWindowOpensAt渲染“下次窗口开启于……”execution.status scheduled且scheduledFor now时scheduled 面板追加顺延副标题update.page.scheduled.deferred_until即“窗口外。更新将在窗口开启时开始……”policy.reason为maintenance-window-missing/maintenance-window-invalid且 tier 为autonomous时顶部横幅渲染“Autonomous updates are disabled until a maintenance window is configured.”并链接回/admin/update所有文案必须走 i18nsrc/locales/en.json 新增update.window.*、update.page.policy.autonomous_*等键严禁硬编码。Playwright 测试 src/tests/frontend-new/admin-spec/update-autonomous.spec.ts 验证四条路径picker 保存后刷新恢复非法输入展示校验消息且不保存窗口外排程面板展示“Next window opens at HH:MM (local)”窗口缺失时横幅渲染/admin/update链接。八、边界与降级行为全景将计划、文档与源码三方对照Tier 4 的边界语义可以归纳为一张行为表场景行为tierautonomous窗口未配置canAutonomousfalsereasonmaintenance-window-missing降级为 Tier 3canAutotrueUI 横幅提示tierautonomous窗口畸形启动期日志警告并视同nullreasonmaintenance-window-invalid同样降级窗口外检测到新版本scheduledFor吸附到下一个窗口开启时刻不立即排水窗口内触发grace0直接 fire走 Tier 2/3 既有管线drain → executor → exit 75 → 监督进程重启计时器到点但窗口已关闭decideTriggerApply返回defer写盘新scheduledFor并重新 arm无排水、无退出窗口内但处于rollback-failed终端态canAutonomous与canAuto均被拒绝必须管理员 Acknowledge安装方式非 git写入型层级整体不可用降级为 notify关于跨午夜与 DST 的实践建议出自 doc/admin/updates.md跨 DST 边界的宿主优先使用tz: utc——窗口每天都锚定同一墙钟不随本地时区偏移变化tz: local的春令时缺失时刻由 JSDate构造器归一化到下一个有效时刻冬令时取第一次墙钟出现跨午夜窗口最多覆盖 24 小时end排他更长的“窗口”应拆成多个配置或直接改用 Tier 3。九、验证与运行手册9.1 自动化验证命令实施计划给出了四层验证矩阵全部可在仓库内复跑# 类型检查根 admin pnpm exec tsc --noEmit # 后端新测试vitest含 MaintenanceWindow / UpdatePolicy / Scheduler pnpm exec vitest run src/tests/backend-new/specs/updater/ # 后端集成测试mocha含窗口边界集成 pnpm exec mocha src/tests/backend/specs/updater-*.ts # 管理端 UIPlaywright端口 9003 pnpm --filter ep_etherpad-lite exec playwright test src/tests/frontend-new/admin-spec/update-autonomous.spec.ts # 前端构建 pnpm run build:ui窗口边界集成测试 src/tests/backend/specs/updater-window-integration.ts 覆盖四个场景窗口外发现新版本仅排程不排水进入窗口后 fire 并启动排水deferred-grace 期间取消返回idle窗口在宽限期内关闭则 defer 且不丢失排程。9.2 冒烟手册Tier 4 一节docs/superpowers/specs/2026-04-25-auto-update-runbook.md 第 12 节给出了针对一次性 VM 的完整冒烟流程核心步骤缺失窗口横幅tier: autonomousmaintenanceWindow: null访问/admin/update应见“Autonomous updates are disabled until a maintenance window is configured.”且policy.reason maintenance-window-missing畸形窗口{start:oops,end:05:00,tz:local}日志出现忽略警告policy.reason maintenance-window-invalid窗口外顺延把窗口设在 5 分钟后如 14:00 时配置{start:14:05,end:14:10,tz:local}强制检出旧 tag 触发新版本检测确认execution.status变为scheduled且scheduledFor位于窗口开启时刻而非now gracescheduled 面板同时显示倒计时与“Outside maintenance window…”说明窗口开启即触发等到窗口打开调度器 fire走 drain → executor → exit 75 → systemd 重启状态最终落在verified窗口中途关闭配置一个在now grace前关闭的窗口如{start:14:01,end:14:02,tz:local}配preApplyGraceMinutes: 5计时器到点时窗口已关闭日志出现updater: scheduler deferred ... to next maintenance window at ...var/update-state.json中出现约 24 小时后新的scheduledFor且无排水、无退出、无应用。实施计划要求冒烟在第 5 步基础上额外验证“窗口内回滚路径仍然可用”并将这些条目并入总签核清单。十、变更与演进轨迹实施计划把 Tier 4 拆为 8 个任务设置 schemaTask 1→ 窗口模块与单测Task 2→ 策略扩展Task 3→ 调度门控Task 4→ 运行器与状态接口接线Task 5→ 管理端 UITask 6→ 窗口边界集成测试Task 7→ 文档/运行手册/CHANGELOGTask 8并有跨任务总检查。PR 命名为feat(updater): tier 4 — autonomous update in maintenance window (#7607)并在文档 doc/admin/updates.md 中将 Tier 4 从“designed, not yet implemented”翻转为已实现状态。截至当前仓库状态MaintenanceWindow.ts、UpdatePolicy.ts、Scheduler.ts、updateStatus.ts 及对应的三个 vitest 测试文件均已存在settings.json.template已包含maintenanceWindow键——说明计划主体已经落地本文描述的即为仓库内真实可用的行为。若需从零体验可在一次性 VM 上按运行手册第 0–1 节搭建 systemd 托管的 git 安装git clonecorepack enablepnpm installpnpm run build:ui再按第九节配置与验证。赞分享后端协同办公WebSocket前端富文本【免费下载链接】etherpadEtherpad: A modern really-real-time collaborative document editor.项目地址https://gitcode.com/gh_mirrors/et/etherpad点击查看免费下载相关推荐Wails v3 Window API 实战基于 window 示例掌握 WebviewWindow 窗口控制全能力Wails v3 Window API 实战基于 window 示例掌握 WebviewWindow 窗口控制全能力 本文以 Wails v3 仓库中的 v3桌面应用跨平台CLI前端Fleet 维护窗口Maintenance Windows完全指南让修复操作自己走进用户的日历Fleet 维护窗口Maintenance Windows完全指南让修复操作自己走进用户的日历 Fleet 的维护窗口Maintenance Win后端前端企业应用运维网络安全ECC Auto Update 自动更新机制全解析基于 install-state 的安全重装流程ECC Auto Update 自动更新机制全解析基于 install state 的安全重装流程 ECCEverything Claude Code /人工智能AI 技能AI 插件AI 评测Agent 评测MCP Clients开发工具上一篇OpenAI GPT 1 vs GPT 2一文读懂两代语言模型的核心差异与演进下一篇GitHub Audio高级技巧利用事件过滤功能专注特定项目活动 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

在 Zephyr RTOS 中使用 MCK-RA4T1:Renesas RA4T1 电机控制套件开发指南

在 Zephyr RTOS 中使用 MCK-RA4T1:Renesas RA4T1 电机控制套件开发指南

操作系统嵌入式RTOS物联网 【免费下载链接】zephyr Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures. 项目地址: https://gitcode.com/GitHub_Trending/ze/zep…

2026/9/21 18:51:39 阅读更多 →
3个坑点拆解fast迅捷选型,新手避坑指南

3个坑点拆解fast迅捷选型,新手避坑指南

3个坑点拆解fast迅捷选型,新手避坑指南 看了一堆教程还是不会写项目?这是很多刚入行同学的真实写照。大家往往沉迷于刷LeetCode或者背诵语法糖,却忽略了工程化落地的核心: 如何在有限的时间与资源下,选对那个“快”且“稳”的技术栈…

2026/9/21 18:50:39 阅读更多 →
怎么解锁手机图案底层逻辑与完整示例解析

怎么解锁手机图案底层逻辑与完整示例解析

怎么解锁手机图案底层逻辑与完整示例解析 版本升级后 API 全变了,这是很多底层开发者最头疼的事。以前一套调用逻辑跑得好好的,换个系统版本直接报 NullPointerException 或者 SecurityException…

2026/9/21 18:50:39 阅读更多 →

最新新闻

3个方案对比:卡点视频生成技术图解原理

3个方案对比:卡点视频生成技术图解原理

3个方案对比:卡点视频生成技术图解原理 别再去翻那几百页的官方文档了,真的,没人有那个耐心。想搞懂 卡点视频 怎么在代码里实现,盯着 FFmpeg 或者 MoviePy 的英文 API 看,眼睛都花了还是抓不住重点。这时候,你需要的是…

2026/9/21 19:12:51 阅读更多 →
Handsontable 服务端数据实战:用 Django REST Framework 实现分页、排序、过滤与批量 CRUD 数据网格

Handsontable 服务端数据实战:用 Django REST Framework 实现分页、排序、过滤与批量 CRUD 数据网格

前端UI组件 【免费下载链接】handsontable JavaScript Data Grid / Data Table with a Spreadsheet Look & Feel. Works with React, Angular, and Vue. Supported by the Handsontable team ⚡ 项目地址: https://gitcode.com/gh_mirrors/ha/handsontable 点击…

2026/9/21 19:12:51 阅读更多 →
罗技鼠标宏源码解析:避开官方文档的5个隐形坑

罗技鼠标宏源码解析:避开官方文档的5个隐形坑

罗技鼠标宏源码解析:避开官方文档的5个隐形坑 Logitech G Hub 的官方文档像天书,翻半天只看到“支持按键映射”,却没人告诉你底层怎么跑。想搞懂罗技鼠标宏的 源码解析 ,别死磕 PDF,直接看执行逻辑。…

2026/9/21 19:12:51 阅读更多 →
FreshRSS WebSub 订阅数据目录全解析:`data/PubSubHubbub/feeds` 目录结构与推送机制

FreshRSS WebSub 订阅数据目录全解析:`data/PubSubHubbub/feeds` 目录结构与推送机制

FreshRSS WebSub 订阅数据目录全解析:data/PubSubHubbub/feeds 目录结构与推送机制 【免费下载链接】FreshRSS A free, self-hostable news aggregator… 项目地址: https://gitcode.com/gh_mirrors/fr/FreshRSS FreshRSS 原生支持 WebSub(原名 P…

2026/9/21 19:12:51 阅读更多 →
Vitess v23.0.6 发布详解:VReplication、VTGate 表达式引擎与复制链路的关键修复

Vitess v23.0.6 发布详解:VReplication、VTGate 表达式引擎与复制链路的关键修复

Vitess v23.0.6 发布详解:VReplication、VTGate 表达式引擎与复制链路的关键修复 【免费下载链接】vitess Vitess is a database clustering system for horizontal scaling of MySQL. 项目地址: https://gitcode.com/gh_mirrors/vi/vitess 本篇文章基于 Vit…

2026/9/21 19:12:51 阅读更多 →
gbrain 工作区模板仓库(template-repo)完全指南:从 Use this template 到持久化个人 Agent

gbrain 工作区模板仓库(template-repo)完全指南:从 Use this template 到持久化个人 Agent

gbrain 工作区模板仓库(template-repo)完全指南:从 Use this template 到持久化个人 Agent 【免费下载链接】gbrain Garrys Opinionated OpenClaw/Hermes Agent Brain 项目地址: https://gitcode.com/gh_mirrors/gb/gbrain 本指南以 g…

2026/9/21 19:11:51 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →