feat: expand multi-runtime workflows for 0.10.0
GoodBuddy previously exposed Runtime capabilities, MCP assignments, plugin controls, context compaction, usage reporting, and task-completion behavior through incomplete or inconsistent paths. This release unifies managed OpenCode, Continue, and DeepSeek Harness controls; adds DSH plugin and image workflows; strengthens MCP and Runtime lifecycle bounds; fixes Windows notification activation; validates cross-architecture packages; and presents the approved bilingual four-section release notes. The DSH plugin marketplace remains a default-off preview whose trusted third-party code runs with current-user permissions. Ask remains read-only, Execute keeps approval controls, and context compaction may use the selected model without deleting GoodBuddy chat history. Release note: GoodBuddy 0.10.0 重点完善多 Runtime 工作流,统一 OpenCode、Continue 与 DeepSeek Harness 的能力、MCP、插件和上下文管理,并提升长对话、多会话与任务通知的连贯性。
This commit is contained in:
+58
-19
@@ -32,13 +32,21 @@ function validateItems(value, label) {
|
||||
fail(`${label} contains a non-string item`)
|
||||
}
|
||||
const normalized = item.trim()
|
||||
if (!normalized || normalized.length > 240) {
|
||||
if (!normalized || normalized.length > 500) {
|
||||
fail(`${label} contains an empty or oversized item`)
|
||||
}
|
||||
return normalized
|
||||
})
|
||||
}
|
||||
|
||||
const releaseNoteSections = [
|
||||
'highlights',
|
||||
'features',
|
||||
'fixes',
|
||||
'notices'
|
||||
]
|
||||
const legacyReleaseNoteSections = ['features', 'fixes']
|
||||
|
||||
function validateRelease(value, index) {
|
||||
const label = `releases[${index}]`
|
||||
if (!hasExactKeys(value, ['version', 'releasedAt', 'notes'])) {
|
||||
@@ -63,28 +71,50 @@ function validateRelease(value, index) {
|
||||
const notes = Object.fromEntries(
|
||||
['zh-CN', 'en-US'].map((locale) => {
|
||||
const localized = value.notes[locale]
|
||||
if (!hasExactKeys(localized, ['features', 'fixes'])) {
|
||||
const isCurrentFormat = hasExactKeys(
|
||||
localized,
|
||||
releaseNoteSections
|
||||
)
|
||||
const isLegacyFormat = hasExactKeys(
|
||||
localized,
|
||||
legacyReleaseNoteSections
|
||||
)
|
||||
if (!isCurrentFormat && !isLegacyFormat) {
|
||||
fail(`${label}.notes.${locale} has invalid fields`)
|
||||
}
|
||||
const features = validateItems(
|
||||
localized.features,
|
||||
`${label}.notes.${locale}.features`
|
||||
const normalized = Object.fromEntries(
|
||||
releaseNoteSections.map((section) => [
|
||||
section,
|
||||
section in localized
|
||||
? validateItems(
|
||||
localized[section],
|
||||
`${label}.notes.${locale}.${section}`
|
||||
)
|
||||
: []
|
||||
])
|
||||
)
|
||||
const fixes = validateItems(
|
||||
localized.fixes,
|
||||
`${label}.notes.${locale}.fixes`
|
||||
)
|
||||
if (features.length + fixes.length === 0) {
|
||||
if (normalized.highlights.length > 3) {
|
||||
fail(
|
||||
`${label}.notes.${locale}.highlights must contain no more than 3 items`
|
||||
)
|
||||
}
|
||||
if (
|
||||
releaseNoteSections.every(
|
||||
(section) => normalized[section].length === 0
|
||||
)
|
||||
) {
|
||||
fail(`${label}.notes.${locale} must not be empty`)
|
||||
}
|
||||
return [locale, { features, fixes }]
|
||||
return [locale, normalized]
|
||||
})
|
||||
)
|
||||
if (
|
||||
notes['zh-CN'].features.length !== notes['en-US'].features.length ||
|
||||
notes['zh-CN'].fixes.length !== notes['en-US'].fixes.length
|
||||
) {
|
||||
fail(`${label} localized section counts do not match`)
|
||||
for (const section of releaseNoteSections) {
|
||||
if (
|
||||
notes['zh-CN'][section].length !==
|
||||
notes['en-US'][section].length
|
||||
) {
|
||||
fail(`${label} localized ${section} counts do not match`)
|
||||
}
|
||||
}
|
||||
return {
|
||||
version: value.version,
|
||||
@@ -126,14 +156,18 @@ const localizedDefinitions = [
|
||||
{
|
||||
locale: 'zh-CN',
|
||||
title: `GoodBuddy ${release.version} 更新内容`,
|
||||
highlights: '本次亮点',
|
||||
features: '功能更新',
|
||||
fixes: '问题修复'
|
||||
fixes: '问题修复',
|
||||
notices: '使用前请留意'
|
||||
},
|
||||
{
|
||||
locale: 'en-US',
|
||||
title: `What's New in GoodBuddy ${release.version}`,
|
||||
highlights: 'Highlights',
|
||||
features: 'Features',
|
||||
fixes: 'Bug Fixes'
|
||||
fixes: 'Bug Fixes',
|
||||
notices: 'Before You Start'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -151,8 +185,13 @@ const markdown = localizedDefinitions
|
||||
...(index === 0 ? [] : ['---', '']),
|
||||
`# ${definition.title}`,
|
||||
'',
|
||||
...markdownSection(
|
||||
definition.highlights,
|
||||
notes.highlights
|
||||
),
|
||||
...markdownSection(definition.features, notes.features),
|
||||
...markdownSection(definition.fixes, notes.fixes)
|
||||
...markdownSection(definition.fixes, notes.fixes),
|
||||
...markdownSection(definition.notices, notes.notices)
|
||||
]
|
||||
})
|
||||
.join('\n')
|
||||
|
||||
Reference in New Issue
Block a user