diff --git a/vscode/prompts/prototype.md b/vscode/prompts/prototype.md index 94a11af..c3c1216 100644 --- a/vscode/prompts/prototype.md +++ b/vscode/prompts/prototype.md @@ -1,3 +1,11 @@ -/ecc:figma-plugin-prototyping 给 {{issueNumber}} 号工单画原型:先读工单正文锁定要画的界面和状态,再写本地 Figma 插件把画板和点击流做出来。画完汇报插件路径和怎么导入,不要改业务代码。 +/ecc:ui-prototyping 给 {{issueNumber}} 号工单画原型。 -画完用 `opencli spx issue marker --issue {{issueNumber}} --type prototype --value ` 把原型插件挂到工单上,再汇报。 +先读工单正文,锁定要确认的界面和状态。画法按这个技能来:工单正文已经指定 Figma 插件或 OpenPencil 就用指定的那个;没指定就先问用哪一个,再按技能里对应的做法画。不要改业务代码。 + +画完把原型源文件的仓库相对路径挂到工单上: + +``` +opencli spx issue marker --issue {{issueNumber}} --type prototype --value <路径> +``` + +Figma 插件填 `manifest.json` 的路径,OpenPencil 填画板文件的路径。挂完再汇报路径和怎么打开。 diff --git a/vscode/prompts/test.md b/vscode/prompts/test.md index 6ee73aa..cb8f5b9 100644 --- a/vscode/prompts/test.md +++ b/vscode/prompts/test.md @@ -1,3 +1,5 @@ /pr-acceptance-testing 验收 {{issueNumber}} 号工单({{prRef}})。 验收目标以工单正文为准,不要再问验收哪个。测出问题就停下报告,不要顺手改代码。 + +先看下目前有没有合进main 如果已经手动合过了 就发main到测试服验证 如果没合 就发当前pr对应的分支去测试服验证 diff --git a/vscode/src/settings/promptMigration.test.ts b/vscode/src/settings/promptMigration.test.ts index 4962a41..691d1cb 100644 --- a/vscode/src/settings/promptMigration.test.ts +++ b/vscode/src/settings/promptMigration.test.ts @@ -4,8 +4,10 @@ import { describe, expect, it } from 'vitest' import { PREVIOUS_DEFAULT_REVIEW_PROMPT } from './previousReviewPrompt' import { composeBrainstormTemplate, + planDefaultPromptReplacement, planPromptMigration, planReviewPromptMigration, + PREVIOUS_PROTOTYPE_PROMPTS, PROMPT_TEMPLATE_VERSION, splitIfBlock, upgradePlaceholders, @@ -189,3 +191,15 @@ describe('planReviewPromptMigration', () => { expect(planReviewPromptMigration(undefined, PREVIOUS_DEFAULT_REVIEW_PROMPT, nextDefault)).toBeNull() }) }) + +describe('planDefaultPromptReplacement', () => { + it('旧的 Figma 插件提示词换成通用技能', () => { + const next = '/ecc:ui-prototyping 给 {{issueNumber}} 号工单画原型。\n' + const out = planDefaultPromptReplacement(PREVIOUS_PROTOTYPE_PROMPTS[0], PREVIOUS_PROTOTYPE_PROMPTS, next, '已换成通用技能') + expect(out?.prompt).toBe(next) + }) + + it('改过的提示词不动', () => { + expect(planDefaultPromptReplacement('我自己写的原型提示词', PREVIOUS_PROTOTYPE_PROMPTS, '新的', '已换')).toBeNull() + }) +}) diff --git a/vscode/src/settings/promptMigration.ts b/vscode/src/settings/promptMigration.ts index 8f33d2f..0b7edcb 100644 --- a/vscode/src/settings/promptMigration.ts +++ b/vscode/src/settings/promptMigration.ts @@ -237,3 +237,31 @@ export function planReviewPromptMigration( notes: [{ level: 'info', message: '审查提示词末尾已追加「审查结论」,其余段落未改' }], } } + +/** 存的提示词和旧默认一样时,整段换成新默认。改过的不动。 */ +export function planDefaultPromptReplacement( + stored: unknown, + previousDefaults: string[], + nextDefault: string, + note: string, +): { prompt: string, notes: MigrationNote[] } | null { + if (typeof stored !== 'string' || stored.length === 0) + return null + const now = normalizePrompt(stored) + const next = normalizePrompt(nextDefault) + if (!next || now === next) + return null + if (!previousDefaults.some(prev => normalizePrompt(prev) === now)) + return null + return { + prompt: nextDefault.endsWith('\n') ? nextDefault : `${nextDefault}\n`, + notes: [{ level: 'info', message: note }], + } +} + +export const PREVIOUS_PROTOTYPE_PROMPTS = [ + '/ecc:figma-plugin-prototyping 给 {{issueNumber}} 号工单画原型:先读工单正文锁定要画的界面和状态,再写本地 Figma 插件把画板和点击流做出来。画完汇报插件路径和怎么导入,不要改业务代码。', + `/ecc:figma-plugin-prototyping 给 {{issueNumber}} 号工单画原型:先读工单正文锁定要画的界面和状态,再写本地 Figma 插件把画板和点击流做出来。画完汇报插件路径和怎么导入,不要改业务代码。 + +画完用 \`opencli spx issue marker --issue {{issueNumber}} --type prototype --value \` 把原型插件挂到工单上,再汇报。`, +] diff --git a/vscode/src/settings/store.ts b/vscode/src/settings/store.ts index 928c9d7..f436b38 100644 --- a/vscode/src/settings/store.ts +++ b/vscode/src/settings/store.ts @@ -19,7 +19,7 @@ import { seedCommitProfilePath } from '../cc/commitProfile' import { listClaudeProfiles } from '../cc/profiles' import { normalizeReleasePrefix } from '../git/release' import { PREVIOUS_DEFAULT_REVIEW_PROMPT } from './previousReviewPrompt' -import { planPromptMigration, planReviewPromptMigration } from './promptMigration' +import { planDefaultPromptReplacement, planPromptMigration, planReviewPromptMigration, PREVIOUS_PROTOTYPE_PROMPTS } from './promptMigration' /** * Fallback prompt strings used when the on-disk markdown can't be read. @@ -524,9 +524,17 @@ export function migratePromptTemplates(ctx: ExtensionContext): MigrationNote[] { PREVIOUS_DEFAULT_REVIEW_PROMPT, readDefaultPrompt(ctx.extensionPath, 'review'), ) - const blob = review + let blob = review ? { ...(planned.blob ?? stored), reviewPrompt: review.prompt } : planned.blob + const prototype = planDefaultPromptReplacement( + (blob ?? stored).prototypePrompt, + PREVIOUS_PROTOTYPE_PROMPTS, + readDefaultPrompt(ctx.extensionPath, 'prototype'), + '原型提示词还是旧的 Figma 插件技能,已换成通用的 ui-prototyping', + ) + if (prototype) + blob = { ...(blob ?? stored), prototypePrompt: prototype.prompt } if (!blob) return [] const out: MigrationNote[] = [] @@ -548,6 +556,8 @@ export function migratePromptTemplates(ctx: ExtensionContext): MigrationNote[] { out.push(...planned.notes) if (review) out.push(...review.notes) + if (prototype) + out.push(...prototype.notes) if (planned.blob) out.push({ level: 'info', message: '提示词模板已迁到 Handlebars' }) return out