✨ feat(vscode): 工单挂原型插件,详情面板一键导入 Figma
- prototypeFile 走通 state → Issue → webview 全链路(gitea/youtrack 两个
loader、两份 KNOWN_STATE_FIELDS、issue/patch、webview types),按 planFile
同款当共享字段;路径校验换成 .json 版,允许绝对路径
- 详情面板「计划文件」下加「原型插件路径」行:双击开 manifest.json,
行尾按钮「在 Figma 中导入并打开」;没挂插件时只显示空态
- src/figma/:把 manifest 写进 Figma 桌面版的 localFileExtensions 再拉起
Figma。坑是 Figma 退出会用内存状态覆盖 settings.json,所以写之前先
osascript 优雅退出并轮询等它真没了(10s 等不到就让用户手动关,不强杀);
写前备份 settings.json.bak-<时间戳>;已导入过就跳过写入直接打开;
非 macOS 只把路径复制到剪贴板
- webhook 里 spec/plan 的 marker 同步改成表驱动,顺带认第三种 prototype
- 提示词:prototype.md 要求画完挂 marker;brainstorm-continue.md 新增
{prototypeRef} 占位符,有原型插件时让续聊先读它别从零重画,没有时
连同整段抹掉
Claude-Session: https://claude.ai/code/session_01Kgmb1LvrPmFX3NoUDB4zZC
This commit is contained in:
1 parent
def5f4e88c
commit
142af57d9d
24 files changed
+628
-85
No files matched your search
@@ -69,6 +69,11 @@ interface IssueDetailPanelProps {
|
||||
onStartPrototypeSession: (issueNumber: number) => void
|
||||
/** Open a workspace-relative file in the editor. */
|
||||
onOpenFile: (path: string) => void
|
||||
/**
|
||||
* 把工单的 Figma 插件 manifest 导进本机 Figma 桌面版并拉起 Figma。
|
||||
* 「原型插件路径」行尾那个按钮。
|
||||
*/
|
||||
onOpenPrototypeInFigma: (issueNumber: number, path: string) => void
|
||||
/** Kick off the end-to-end implementation flow for the given plan file. */
|
||||
onImplement: (issueNumber: number, planFile: string, profilePath?: string, sessionId?: string) => void
|
||||
/** Open the gitea PR page in the browser. */
|
||||
@@ -151,6 +156,7 @@ export function IssueDetailPanel({
|
||||
onStartTestSession,
|
||||
onStartPrototypeSession,
|
||||
onOpenFile,
|
||||
onOpenPrototypeInFigma,
|
||||
onImplement,
|
||||
onOpenPr,
|
||||
onGeneratePrDiffSummary,
|
||||
@@ -567,6 +573,24 @@ export function IssueDetailPanel({
|
||||
}]
|
||||
: [],
|
||||
},
|
||||
{
|
||||
key: 'prototypeFile',
|
||||
label: '原型插件路径',
|
||||
type: 'file-link',
|
||||
description: '双击在编辑器打开 Figma 插件的 manifest.json;点右侧按钮把插件导入本机 Figma 并打开;cc 通过 issue body 的 <!-- spx:prototype=路径 --> 注释同步',
|
||||
onOpen: (p: string) => onOpenFile(p),
|
||||
// 没挂原型插件时整个按钮不渲染,行只显示空态。
|
||||
secondaryActions: issue?.prototypeFile
|
||||
? [{
|
||||
icon: <ExternalLink className="size-3.5" />,
|
||||
title: '在 Figma 中导入并打开',
|
||||
onClick: () => {
|
||||
if (issue?.prototypeFile)
|
||||
onOpenPrototypeInFigma(issue.number, issue.prototypeFile)
|
||||
},
|
||||
}]
|
||||
: [],
|
||||
},
|
||||
{
|
||||
key: 'pr',
|
||||
label: '合并请求',
|
||||
@@ -641,7 +665,7 @@ export function IssueDetailPanel({
|
||||
],
|
||||
},
|
||||
],
|
||||
[onResumeSession, onResumeReviewSession, onResumeTestSession, onStartTestSession, onResumePrototypeSession, onStartPrototypeSession, onOpenFile, onImplement, onOpenPr, onGeneratePrDiffSummary, onOpenWorktree, onDeleteWorktree, onMergeBranch, onCloseSessionTab, onContinueBrainstorm, onClearBrainstormSession, onOpenLogs, issue, locked, lockTitle, globalAutoReview, prDiffSummaryRunning, profiles, isSessionTabPending, onStartReviewSession],
|
||||
[onResumeSession, onResumeReviewSession, onResumeTestSession, onStartTestSession, onResumePrototypeSession, onStartPrototypeSession, onOpenFile, onOpenPrototypeInFigma, onImplement, onOpenPr, onGeneratePrDiffSummary, onOpenWorktree, onDeleteWorktree, onMergeBranch, onCloseSessionTab, onContinueBrainstorm, onClearBrainstormSession, onOpenLogs, issue, locked, lockTitle, globalAutoReview, prDiffSummaryRunning, profiles, isSessionTabPending, onStartReviewSession],
|
||||
)
|
||||
|
||||
// 同事的工单只读:属性表统一消毒,顶部只留查看类按钮。
|
||||
@@ -671,6 +695,7 @@ export function IssueDetailPanel({
|
||||
prototypeProfilePath: matchProfileOption(issue.prototypeProfilePath, profiles) || null,
|
||||
specFile: issue.specFile ?? null,
|
||||
planFile: issue.planFile ?? null,
|
||||
prototypeFile: issue.prototypeFile ?? null,
|
||||
prDiffFile: issue.prDiffFile ?? null,
|
||||
pr: issue.pr
|
||||
? `${issue.pr}${issue.prMerged ? '(已合并)' : ''}`
|
||||
|
||||
Reference in new issue
Block a user