ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

IPTVnator 仓库级 AI Skills 与实现同步设计:审计漂移、发布正文过滤与 Stalker 系列身份契约

IPTVnator 仓库级 AI Skills 与实现同步设计:审计漂移、发布正文过滤与 Stalker 系列身份契约 IPTVnator 仓库级 AI Skills 与实现同步设计审计漂移、发布正文过滤与 Stalker 系列身份契约【免费下载链接】iptvnator:tv: Cross-platform IPTV player application with multiple features, such as support of m3u and m3u8 playlists, favorites, TV guide, TV archive/catchup and more.项目地址: https://gitcode.com/GitHub_Trending/ip/iptvnatorIPTVnator 在.codex/skills/下维护 8 个仓库专属 Codex 技能其中release-cut、release-notes同时镜像到.claude/skills/用来指导 Agent 在对应领域内安全地改代码、跑验证。一次只读审计发现技能文件的字面路径与大部分高层所有权规则仍然有效但若干技能内容已与当前实现、权威架构文档和发布自动化发生漂移同时暴露出两个 Stalker 具体缺陷布尔is_series分类绕过共享归一化器、懒加载 VOD 系列剧集的跟踪 ID 缺少父系列维度以及 release 契约被违反type: internal注释未从公开 GitHub Release 正文中排除。本设计文档定义了让技能、代码、文档、发布流水线与回归测试全链路对齐的同步方案。读完本文你将掌握 IPTVnator 的仓库技能治理模型、发布正文公开过滤的--public提取机制、Stalker 系列身份与播放进度兼容迁移的完整契约以及配套的验证阶梯。背景技能漂移、两个 Stalker 缺陷与失效的 Release 契约审计基线事实如下仓库现有 8 个 Codex 技能iptvnator-nx-architecture、iptvnator-sqlite-db-worker、iptvnator-theme-style、iptvnator-ui-design、release-cut、release-notes、stalker-portal、xtream-electron见 .codex/skillsrelease-cut与release-notes以字节一致byte-identical方式镜像到 .claude/skillsvalidate-repository-skills.mjs 中的MIRRORED_SKILLS [release-cut, release-notes]正是这一约束的校验点审计结论是字面路径和大部分高层所有权规则保持有效但多个技能与实现、规范文档或当前发布自动化脱节。审计发现的三个核心问题Stalker catalog 进度分类绕过共享归一化器catalog 的进度分类没有走共享的is_series归一化因而识别不了布尔trueselection/detail/resource 代码也在下游 selected-item 构建器已经归一化的情况下重复本地解释没有收敛到同一契约懒加载 VOD 系列剧集跟踪 ID 缺少父系列维度旧实现只用季/集坐标生成跟踪 ID导致两部不同剧集只要坐标同为 S01E01 就会共享同一个播放位置键Release 正文契约失效发布文档声明type: internal注释不进入公开 GitHub Release 正文但 tag 工作流当时提取的是整个 CHANGELOG 区块含折叠的内部区块流水线未兑现该契约。目标与非目标范围边界先行方案列出 8 个目标让每个仓库技能在其声明的领域内能准确指导工作不与其当前代码或权威文档矛盾把每个技能描述改写成仅含触发词的Use when...语句便于技能发现skill discovery保持.codex与.claude的 release 技能镜像字节一致把type: internal注释从公开 GitHub Release 正文中排除同时保留在CHANGELOG.md让 Stalkeris_series对true、1、1三种形态处理一致把懒加载 Stalker 剧集跟踪 ID 的作用域限定到父系列且不丢弃旧 ID 已保存的播放进度同步这些契约所触及的规范文档补齐回归覆盖并走完仓库要求的验证阶梯。非目标同样明确避免越界改动不做一次性的--mat-sys-*SCSS 引用大迁移不重设计 UI 视觉语言不改播放位置数据库的完整 schema不替换 Nx 项目布局或 tag 模型不改变 Snap/Docker/GitHub 发布自动化本身只记录其既有外部效应并过滤公开 Release 文本不把 VOD 多源扩展出既有 Xtream-movie/Electron 范围。变更领域总览领域主要文件责任Release 输出tools/release/extract-changelog-section.mjs、release 测试、.github/workflows/build-and-make.yaml产出不含内部注释的公开 Release 文本Release 指导.codex/skills/release-*、.claude/skills/release-*、.changes/README.md描述真实发布行为与安全执行方式Stalker 身份stalker-series.adapters.ts及其 spec生成系列作用域剧集 ID 并暴露旧身份Stalker 兼容性Stalker catalog/detail/resource 决策及 specs全链路使用共享is_series归一化并修复布尔进度分类Stalker 进度迁移Stalker series 视图 helpers/组件及 specs解析并懒迁移旧播放位置 ID仓库技能8 个.codex/skills/*/SKILL.md更新触发器、所有权、不变量与验证架构文档Stalker、SQLite worker、UI/theme、release 文档消除矛盾并记录当前契约Release 注释一条.changes/stalker-*.md描述用户可见的 Stalker 进度修复Release 正文设计--public提取模式设计原则是两份记录分工CHANGELOG.md仍是完整的发布记录其折叠的detailssummaryInternal changes/summary.../details区块原样保留公开 GitHub Release 正文由提取器在 public 模式下生成。提取器的 public 模式行为extract-changelog-section.mjs 被要求新增显式 public-body 模式核心语义原始区块提取raw section extraction继续保留供既有程序化调用方使用CLI 接受--public参数public 模式只删除renderChangelogSection产出的精确internal-details 区块——实现中用正则INTERNAL_DETAILS_BLOCK见源码 L27-28匹配details\nsummaryInternal changes/summary...完整折叠块与 internal 无关的其它details区块保持不动周围空行被归一化但不重写注释文本纯内部注释的 Release 可以产出空的 authored 正文此时 GitHub 自动生成的提交列表仍然可用。当前实现已落地extractPublicSectionL72-78在extractSection基础上执行section.replace(INTERNAL_DETAILS_BLOCK, ).trim()parseExtractArgumentsL80-100规定--public只能出现一次、位置参数恰好一个且必须是^\d\.\d\.\d$形式的裸 semver否则返回null并以退出码 2 打印用法。runExtractorCliL102-140对缺失区块返回退出码 1 并提示pnpm run release:notes:changelog/node tools/release/build-release-notes.mjs --consume流程——这是为了让忘了生成 changelog 就 tag直接失败而不是静默发布纯 PR 标题注释。tag 工作流的集成点tag 构建工作流 build-and-make.yaml 在 tag 事件下用以下命令生成公开正文BODY$(node tools/release/extract-changelog-section.mjs --public ${VERSION})工作流注释明确说明完整提交的 CHANGELOG 保留内部注释而 tag release 使用 authored public 提取纯内部 release 故意没有 authored public 文本GitHub 生成的提交列表独立保留。测试覆盖矩阵方案要求测试覆盖混合区块既有内部又有公开、纯公开区块、纯内部区块、无关的 details 区块、CLI 参数解析、非法参数以及纯内部 Release 时成功但空输出的 CLI 结果。release 技能需补充记录的外部效应发布技能.codex/skills/release-cut/SKILL.md与.claude/skills/release-cut/SKILL.md的字节一致镜像还需同步记录以下真实行为供 Agent 正确执行发布发布 GitHub Release 会自动触发已验证的 Snap 上传到edge见 publish-snap.yaml其在release: published事件上先验证 Snap 资产再上传candidate/stable 的 Snap 提升promotion保持手动推送到master和v*tag 可能发布 Docker 镜像发布推送必须指名远端、分支与精确 tag禁止使用宽泛的git push --tagsminor 与 patch 发布走不同的博客脚手架路径minor 运行release:notes:blog并完成所有编辑字段patch 只编辑既有vX-Y文章资产清单包含 Pacman 产物与linux-frame-copy-runtime-sources.tar.xzrelease-pipeline.md 记录了完整的 27 项资产集。.changes/README.md也已把这条契约写进文档type: internal注释在CHANGELOG.md中保持折叠、从博客脚手架中省略、由extract-changelog-section.mjs --public从 authored 公开正文中移除且highlight字段不允许用在type: internal上。Stalkeris_series规范化一个契约、三种形态所有对 Stalker 系列标志的解释统一走isStalkerSeriesFlag(...)。catalog selection、detail/resource 闸门与进度分类不得再重复本地比较或真值判断。共享归一化器的源码实现stalker-item.normalizer.ts L49-52 定义了唯一契约/** Portals spell the series marker as true, 1, or 1. */ export function isStalkerSeriesFlag(value: unknown): boolean { return value true || value 1 || value 1; }stalker-vod.utils.ts L55-61 显式重导出它并委托生成归一化正向标记export { isStalkerSeriesFlag, isStalkerSeriesItem }; export function normalizeStalkerSeriesFlag( value: unknown ): StalkerSeriesFlag | undefined { return isStalkerSeriesFlag(value) ? true : undefined; }shared interfaces 中的活动归一化器favorites/recent、dashboard 分类保持其依赖中立等价实现与 Stalker 门户代码中的这个谓词一致避免第二份拷贝漂移。回归覆盖与作用域边界回归测试覆盖布尔true、数字1、字符串1与非系列值四类输入。行为回归点是布尔进度分类——即此前true无法被识别为系列的那条路径selection 覆盖则锁定已归一化的下游结果同时移除冗余的本地比较。该改动刻意保持 provider-local共享门户工具仍然保持 provider 中立不引入任何 Stalker 语义。Stalker 剧集身份与兼容迁移新身份系列作用域的确定性跟踪 IDmapVodSeriesEpisodes(...)现在接收父系列身份MapVodSeriesEpisodesOptions.parentSeriesId生成的跟踪 seed 包含四元组父系列身份parent series identityprovider 剧集身份provider episode identity解析后的季键resolved season key集号episode number。源码实现见 stalker-series.adapters.tsgenerateVodEpisodeIdL75-90对JSON.stringify([vod, String(options.parentSeriesId), options.providerEpisodeId, options.seasonKey, options.episodeNum])做hashStringhashStringL58-66是 32 位取绝对值的字符串散列。因此同一门户记录下 ID 保持确定性但两部剧集即使坐标同为 S01E01 也不会再产生相同值。每个被映射的懒加载 VOD 系列剧集同时携带旧跟踪 ID 作为legacyTrackingIdStalkerMappedEpisode接口 L50-56 声明了该可选字段mapVodSeriesEpisodes在 L252 写入。普通regularStalker 系列映射保持不变——mapRegularSeriesEpisodes仍用season.cmdseed 生成 ID。现有进度的兼容迁移六步规则当加载当前系列的播放位置时按序执行精确命中优先与新的跟踪 ID 精确匹配的位置直接胜出任何兼容的 legacy 行只保留为已确认的清理元数据legacy 兼容解析否则若某位置的 ID 等于该剧集的legacyTrackingId且其seriesXtreamId与当前父系列匹配则视作该剧集季/集元数据兜底存在季/集元数据时作为额外守卫isCompatibleLegacyPosition比较seasonNumber/episodeNumber并对providerSeasonNumber做了兼容内存键用新 IDin-memory 位置以新 ID 为键使 quick start、badges、播放控制行为正常先写后删下一次成功的位置写入先保存新 ID再删除已确认的 legacy 行清除顺序防复活清除精确或已迁移位置时先删已确认的 legacy ID再删作用域 ID——部分失败不会制造复活窗口旧进度不会在 reconciliation 后重现。关键实现证据stalker-series-position-compatibility.tsreconcileStalkerSeriesPositionsL55-124精确行进入positionsByTrackingId兼容 legacy 行进入legacyPositionByTrackingId无精确行时把 legacy 行改写为新 IDcontentXtreamId: trackingId放入显示位置映射saveStalkerSeriesPositionL144-178先savePlaybackPosition新位置再通过ownsLegacyPosition校验要求同seriesXtreamId、同playlistId且 ID 不同后clearPlaybackPosition旧行若清理失败抛StalkerSeriesPositionPartialSaveError——作用域位置已保存但 legacy 清理失败保留 legacy 进度不丢clearStalkerSeriesPositionL180-212拥有 legacy 时先清 legacy 再清 scoped避免复活窗口。组件侧 stalker-series-view.component.ts 持有legacyPositionByTrackingIdsignal 并调用这三个函数。所有权守卫legacy 行绝不只凭坐标或 legacy ID 删除——父系列归属必须已由系列作用域的位置查询建立防止迁移误删另一系列的记录。回归覆盖清单specstalker-series-position-compatibility.spec.ts、stalker-series.adapters.spec.ts需要证明坐标相同但父系列不同的两个剧集获得不同新 ID同一剧集重复映射稳定legacy 位置能续播到匹配的新剧集两种形式都存在时精确新位置胜出精确胜出时仍保留兼容 legacy 行供安全清理属于另一父系列的 legacy 行被忽略迁移先写新行再删旧行清除精确 legacy 行后旧进度不再出现。八个技能Skills的同步设计通用原则每个技能保持简洁细节引用权威文档description以Use when...开头且只含触发词。Nxiptvnator-nx-architecture补充当前 app/tool 形态9 个 app 分组 eslint-tools/packaging/release-tools/repository-skills工具项目、完整类型方向表、域边界意识、path/tag 例外、可构建包命名、target-aware 验证发现、max-lines 策略与带引号的 lint glob 护栏。例如类型方向app, E2E, dev-app → feature, UI,>pnpm install --frozen-lockfile pnpm nx show projects随后按 8 步阶梯执行运行 release parser/gate/screenshot Node 测试套件运行pnpm run release:notes:validatepackage.json 中定义为node tools/release/build-release-notes.mjs --validateTDD red/green 周期中运行聚焦的 Stalker adapter 与 catalog 测试运行portal-stalker-data-access、portal-stalker-feature与shared-interfaces测试若位置归一化或 badge 预期变化运行 dashboard 测试通过 Nx 发现并运行受影响的 lint/build target运行最接近的原子化 web Stalker 流程 Electron recent/persistence 流程 Electron 构建记录当前 fixtures 无法在懒剧集映射前直接播种旧冲突行该迁移由聚焦的纯 helper 与 Angular 组件回归覆盖重跑字面技能路径校验、frontmatter 检查、镜像哈希与git diff --check。技能校验入口为pnpm run skills:validatenode tools/skills/validate-repository-skills.mjsvalidate-repository-skills.mjs 校验 SKILL_ROOT 下的路径前缀、frontmatter、镜像哈希与非法路径字符。文档与 Release 注释策略Stalker 播放位置修复对用户可见因此获得一条面向用户书写的.changes/fix 注释type: fix按 .changes/README.md 的格式area-short-slug.md正文 13 句、面向用户、400 字符上限。Release 工具、技能文本、CI 工作流与纯文档改动不再追加注释type: internal不可携带highlight可从no-release-note豁免策略覆盖。最终报告须点名每个更新的规范文档、每个新增/修改的测试、每条验证命令及结果以及被跳过的 E2E 及其原因。验收标准全部完成当且仅当8 个技能全部通过聚焦应用场景release 镜像字节一致公开 Release 提取排除内部注释且不改动 changelog所有受支持的is_series标志形态走同一 catalog 路径两部 Stalker 剧集不能仅凭相同季/集坐标生成相同跟踪 IDlegacy Stalker 进度通过兼容路径续播已确认的 legacy 行在作用域进度保存或清除时被移除旧进度不重现规范文档中不存在 eager-versus-first-playback 或 release 副作用矛盾定向测试、受影响验证、release-note 验证与仓库卫生检查全部通过。这套设计把仓库技能从静态提示词提升为与代码、文档、CI 契约强一致的可验证资产技能里的每一条所有权、不变量与验证命令都能在 .codex/skills、libs 与 tools 中找到可执行出处而新增的回归测试stalker-series.adapters.spec.ts、stalker-series-position-compatibility.spec.ts则为两个 Stalker 缺陷与 Release 契约提供了防回退保障。【免费下载链接】iptvnator:tv: Cross-platform IPTV player application with multiple features, such as support of m3u and m3u8 playlists, favorites, TV guide, TV archive/catchup and more.项目地址: https://gitcode.com/GitHub_Trending/ip/iptvnator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表