chore: rebuild release package

This commit is contained in:
shiyue
2026-07-20 16:58:47 +08:00
parent 9adc7c99f1
commit e5059e97c4
5 changed files with 30 additions and 11 deletions

View File

@@ -48,3 +48,9 @@
- Firefox `ui.prefersReducedMotion=1` 时:`animation-name: none``opacity: 1``transform: none`,图标仍正常显示且无描边。
- 1672×941、1440×900、500×844、390×844 均检查短计划与 12 图标长计划;标题、长计划和页面横向溢出量均为 0。
- 两枚 PNG、manifest、CSS、JS 均返回 HTTP 200专项、暗金主题、旧 Warframe 主题与全量回归均通过。
## 最终完成态同步修复
- 问题:展开列表使用最新 `result`,标题原先优先读取旧 `meta.progress`,会出现列表全部勾选但最后一个图标仍未点亮。
- 修复:标题进度来源调整为 `result → input → meta`;无法解析最新结果时仍保留兼容回退。
- Firefox 复现数据:`meta/input=7/8``result=8/8`;最终解析为 `8/8`DOM 生成 8 个 `.is-complete`、0 个 `.is-remaining`,横向溢出为 0。

View File

@@ -6519,7 +6519,8 @@
function resolveToolPlanProgress(tool) {
if (toolKind(tool) !== 'todo_list') return null;
const candidates = [tool?.meta?.progress, tool?.input, tool?.result];
// result 是展开列表实际使用的最新快照meta/input 可能仍停留在上一轮更新。
const candidates = [tool?.result, tool?.input, tool?.meta?.progress];
for (const candidate of candidates) {
const progress = planProgressFromPayload(candidate);
if (progress) return progress;

View File

@@ -24,7 +24,7 @@
document.documentElement.dataset.dividerTime = dividerTime;
})();
</script>
<link rel="stylesheet" href="style.css?v=20260720-plan-progress-icons">
<link rel="stylesheet" href="style.css?v=20260720-plan-progress-final-state">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
</head>
<body>
@@ -183,6 +183,6 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.1/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.9.1/mermaid.min.js"></script>
<script src="app.js?v=20260720-plan-progress-icons"></script>
<script src="app.js?v=20260720-plan-progress-final-state"></script>
</body>
</html>

View File

@@ -618,8 +618,8 @@ function assertFrontendSidebarCollapseContract() {
'Rich themes should provide isolated rail treatments on top of the shared semantic fallback'
);
assert(
indexSource.includes('style.css?v=20260720-plan-progress-icons')
&& indexSource.includes('app.js?v=20260720-plan-progress-icons'),
indexSource.includes('style.css?v=20260720-plan-progress-final-state')
&& indexSource.includes('app.js?v=20260720-plan-progress-final-state'),
'Sidebar interaction assets should share the reviewed cache-busting version'
);
}
@@ -839,6 +839,18 @@ function assertPlanListProgressContract() {
})) === JSON.stringify({ completed: 3, total: 5 }),
'Todo tool summaries should resolve progress from runtime metadata'
);
assert(
JSON.stringify(progressApi.resolveToolPlanProgress({
kind: 'todo_list',
meta: { progress: { completed: 7, total: 8 } },
input: { progress: { completed: 7, total: 8 } },
result: JSON.stringify({
type: 'todo_list',
items: Array.from({ length: 8 }, () => ({ completed: true })),
}),
})) === JSON.stringify({ completed: 8, total: 8 }),
'Latest todo result should override stale meta and input progress so the final icon lights up'
);
assert(progressApi.resolveToolPlanProgress({ kind: 'command_execution' }) === null, 'Non-plan tools should not render plan progress');
const sent = [];
@@ -930,8 +942,8 @@ function assertPlanListProgressContract() {
assert(extractorSource.includes('references/source-assets/wasteland-icon-sheet.webp'), 'Plan progress extractor should read the archived source sheet');
assert(!extractorSource.includes('sessions/_attachments'), 'Plan progress extractor should not depend on temporary session attachments');
assert(indexSource.includes('style.css?v=20260720-plan-progress-icons'), 'Plan progress CSS should use the current cache-busted URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-icons'), 'Plan progress frontend logic should use the current cache-busted URL');
assert(indexSource.includes('style.css?v=20260720-plan-progress-final-state'), 'Plan progress CSS should use the current cache-busted URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-final-state'), 'Plan progress frontend logic should use the current cache-busted URL');
}
function assertFrontendGildedThemeContract() {
@@ -1046,8 +1058,8 @@ function assertFrontendGildedThemeContract() {
assert(contrast('#655446', '#fff7ea') >= 4.5, 'Gilded muted text should remain readable on ivory panels');
assert(contrast('#fff7ea', '#7a3f20') >= 7, 'Gilded primary action text should reach AAA contrast on copper');
assert(themeStyle.includes('@media (prefers-reduced-motion: reduce)'), 'Gilded theme motion should respect reduced-motion preferences');
assert(indexSource.includes('style.css?v=20260720-plan-progress-icons'), 'Theme bundle stylesheet should use the current cache-busted asset URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-icons'), 'Theme bundle app script should use the current cache-busted asset URL');
assert(indexSource.includes('style.css?v=20260720-plan-progress-final-state'), 'Theme bundle stylesheet should use the current cache-busted asset URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-final-state'), 'Theme bundle app script should use the current cache-busted asset URL');
}
function assertFrontendWastelandThemeContract() {
@@ -1300,8 +1312,8 @@ function assertFrontendWastelandThemeContract() {
assert(contrast('#c9bda6', backgroundColor) >= 4.5, `Wasteland muted text should reach AA contrast on ${backgroundColor}`);
});
assert(indexSource.includes('style.css?v=20260720-plan-progress-icons'), 'Wasteland stylesheet should share the cache-busted theme bundle URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-icons'), 'Wasteland registration should share the cache-busted theme bundle URL');
assert(indexSource.includes('style.css?v=20260720-plan-progress-final-state'), 'Wasteland stylesheet should share the cache-busted theme bundle URL');
assert(indexSource.includes('app.js?v=20260720-plan-progress-final-state'), 'Wasteland registration should share the cache-busted theme bundle URL');
}
function assertFrontendCcwebPromptContract() {