feat(vscode): 冲突解决会话 profile 可在设置面板配置

This commit is contained in:
2026-07-09 08:41:58 +08:00
parent 38f15a6fe1
commit 7b4f737ce5
10 changed files with 85 additions and 17 deletions
+7 -3
View File
@@ -854,6 +854,7 @@ export class KanbanWebviewPanel {
worktreePreRemoveScript: s.worktreePreRemoveScript, worktreePreRemoveScript: s.worktreePreRemoveScript,
implTabPreCreateScript: s.implTabPreCreateScript, implTabPreCreateScript: s.implTabPreCreateScript,
implTabPostCloseScript: s.implTabPostCloseScript, implTabPostCloseScript: s.implTabPostCloseScript,
conflictResolutionProfilePath: s.conflictResolutionProfilePath,
}) })
return return
} }
@@ -916,6 +917,7 @@ export class KanbanWebviewPanel {
worktreePreRemoveScript: s.worktreePreRemoveScript, worktreePreRemoveScript: s.worktreePreRemoveScript,
implTabPreCreateScript: s.implTabPreCreateScript, implTabPreCreateScript: s.implTabPreCreateScript,
implTabPostCloseScript: s.implTabPostCloseScript, implTabPostCloseScript: s.implTabPostCloseScript,
conflictResolutionProfilePath: s.conflictResolutionProfilePath,
}) })
return return
} }
@@ -926,13 +928,15 @@ export class KanbanWebviewPanel {
} }
/** /**
* Pick the profile.json that the *implement-class* cc sessions * Pick the profile.json that implement-class cc sessions
* (handleImplement / handleResumeSession when sessionKind === 'implement' / * (handleImplement / handleResumeSession when sessionKind === 'implement')
* startConflictResolution) should launch with. Priority: * should launch with. Priority:
* 1. The per-issue `profilePath` recorded in state JSON (preserves the * 1. The per-issue `profilePath` recorded in state JSON (preserves the
* brainstorm-time choice, overridable from the issue detail panel). * brainstorm-time choice, overridable from the issue detail panel).
* 2. The hard-coded `DEFAULT_PROFILE_PATH` fallback. * 2. The hard-coded `DEFAULT_PROFILE_PATH` fallback.
* *
* Conflict-resolution sessions use the global
* `settings.conflictResolutionProfilePath` instead of this helper.
* Brainstorm sessions deliberately don't go through this helper — they * Brainstorm sessions deliberately don't go through this helper — they
* keep the legacy `profilePath || DEFAULT_PROFILE_PATH` so creators can * keep the legacy `profilePath || DEFAULT_PROFILE_PATH` so creators can
* still pick a profile per issue at brainstorm time. * still pick a profile per issue at brainstorm time.
-4
View File
@@ -107,7 +107,6 @@ export async function handleColumnChange(panel: KanbanWebviewPanel, issueNumber:
let implementSessionId: string | undefined let implementSessionId: string | undefined
let testSessionId: string | undefined let testSessionId: string | undefined
let featureBranch: string | undefined let featureBranch: string | undefined
let profilePath: string | undefined
try { try {
const comments = await listIssueComments({ const comments = await listIssueComments({
host: remote.host, host: remote.host,
@@ -139,8 +138,6 @@ export async function handleColumnChange(panel: KanbanWebviewPanel, issueNumber:
testSessionId = obj.testSessionId testSessionId = obj.testSessionId
if (typeof obj.branch === 'string' && obj.branch.length > 0) if (typeof obj.branch === 'string' && obj.branch.length > 0)
featureBranch = obj.branch featureBranch = obj.branch
if (typeof obj.profilePath === 'string' && obj.profilePath.length > 0)
profilePath = obj.profilePath
} }
} }
catch { catch {
@@ -340,7 +337,6 @@ export async function handleColumnChange(panel: KanbanWebviewPanel, issueNumber:
workspaceRoot, workspaceRoot,
featureBranch, featureBranch,
worktreePath, worktreePath,
profilePath,
}) })
} }
else { else {
+11 -10
View File
@@ -67,8 +67,8 @@ export async function handleResumeSession(panel: KanbanWebviewPanel, sessionId:
existing.show(false) existing.show(false)
return return
} }
// 实施 resume 走工单级 profilePath > 默认 的优先级(同 handleImplement / // 实施 resume 走工单级 profilePath > 默认 的优先级(同 handleImplement);
// startConflictResolution);头脑风暴 resume 保持现状,只看工单级 + 默认。 // 头脑风暴 resume 保持现状,只看工单级 + 默认。
const effectiveProfilePath const effectiveProfilePath
= sessionKind === 'implement' = sessionKind === 'implement'
? panel.resolveImplementProfilePath(profilePath) ? panel.resolveImplementProfilePath(profilePath)
@@ -1396,9 +1396,8 @@ export async function startConflictResolution(panel: KanbanWebviewPanel, opts: {
workspaceRoot: string workspaceRoot: string
featureBranch: string featureBranch: string
worktreePath: string worktreePath: string
profilePath?: string
}): Promise<void> { }): Promise<void> {
const { issueNumber, prIndex, workspaceRoot, featureBranch, worktreePath, profilePath } = opts const { issueNumber, prIndex, workspaceRoot, featureBranch, worktreePath } = opts
const settings = getSettings(panel.context) const settings = getSettings(panel.context)
const devBranch = settings.devBranch || 'main' const devBranch = settings.devBranch || 'main'
@@ -1553,9 +1552,9 @@ export async function startConflictResolution(panel: KanbanWebviewPanel, opts: {
return return
} }
terminal.show(false) terminal.show(false)
// 与 handleImplement 保持一致:走工单级 profilePath > 默认 fallback 的优先级, // 冲突解决只用全局设置 conflictResolutionProfilePath;空串 = DEFAULT_PROFILE_PATH。
// 让冲突解决会话和实施会话用同一份 profile。 const effectiveProfilePath
const effectiveProfilePath = panel.resolveImplementProfilePath(profilePath) = settings.conflictResolutionProfilePath.trim() || DEFAULT_PROFILE_PATH
if (effectiveProfilePath.includes('\'')) { if (effectiveProfilePath.includes('\'')) {
logger.add({ logger.add({
level: 'error', level: 'error',
@@ -1590,13 +1589,15 @@ export async function startConflictResolution(panel: KanbanWebviewPanel, opts: {
} }
/** /**
* Pick the profile.json that the *implement-class* cc sessions * Pick the profile.json that implement-class cc sessions
* (handleImplement / handleResumeSession when sessionKind === 'implement' / * (handleImplement / handleResumeSession when sessionKind === 'implement')
* startConflictResolution) should launch with. Priority: * should launch with. Priority:
* 1. The per-issue `profilePath` recorded in state JSON (preserves the * 1. The per-issue `profilePath` recorded in state JSON (preserves the
* brainstorm-time choice, overridable from the issue detail panel). * brainstorm-time choice, overridable from the issue detail panel).
* 2. The hard-coded `DEFAULT_PROFILE_PATH` fallback. * 2. The hard-coded `DEFAULT_PROFILE_PATH` fallback.
* *
* Conflict-resolution sessions use the global
* `settings.conflictResolutionProfilePath` instead of this helper.
* Brainstorm sessions deliberately don't go through this helper — they * Brainstorm sessions deliberately don't go through this helper — they
* keep the legacy `profilePath || DEFAULT_PROFILE_PATH` so creators can * keep the legacy `profilePath || DEFAULT_PROFILE_PATH` so creators can
* still pick a profile per issue at brainstorm time. * still pick a profile per issue at brainstorm time.
+6
View File
@@ -32,6 +32,7 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string
@@ -58,6 +59,8 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
const trimmedPreRemove = payload.worktreePreRemoveScript.trim() const trimmedPreRemove = payload.worktreePreRemoveScript.trim()
const trimmedImplPre = payload.implTabPreCreateScript.trim() const trimmedImplPre = payload.implTabPreCreateScript.trim()
const trimmedImplPost = payload.implTabPostCloseScript.trim() const trimmedImplPost = payload.implTabPostCloseScript.trim()
// conflict-resolution profile: '' is meaningful (= DEFAULT_PROFILE_PATH).
const trimmedConflictProfile = payload.conflictResolutionProfilePath.trim()
const prev = getSettings(panel.context) const prev = getSettings(panel.context)
// Capture the previous token *for this host* before overwriting it, so // Capture the previous token *for this host* before overwriting it, so
// we can decide below whether the kanban needs a re-fetch. (Only host // we can decide below whether the kanban needs a re-fetch. (Only host
@@ -87,6 +90,7 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
worktreePreRemoveScript: trimmedPreRemove, worktreePreRemoveScript: trimmedPreRemove,
implTabPreCreateScript: trimmedImplPre, implTabPreCreateScript: trimmedImplPre,
implTabPostCloseScript: trimmedImplPost, implTabPostCloseScript: trimmedImplPost,
conflictResolutionProfilePath: trimmedConflictProfile,
}) })
return return
} }
@@ -108,6 +112,7 @@ export async function handleSettingsSave(panel: KanbanWebviewPanel, payload: {
worktreePreRemoveScript: trimmedPreRemove, worktreePreRemoveScript: trimmedPreRemove,
implTabPreCreateScript: trimmedImplPre, implTabPreCreateScript: trimmedImplPre,
implTabPostCloseScript: trimmedImplPost, implTabPostCloseScript: trimmedImplPost,
conflictResolutionProfilePath: trimmedConflictProfile,
youtrackBaseUrl: trimmedYtBase, youtrackBaseUrl: trimmedYtBase,
youtrackProjectShortName: trimmedYtProject, youtrackProjectShortName: trimmedYtProject,
youtrackCloseCommand: trimmedYtClose, youtrackCloseCommand: trimmedYtClose,
@@ -190,6 +195,7 @@ export async function handleEditSettingsRequest(panel: KanbanWebviewPanel): Prom
worktreePreRemoveScript: s.worktreePreRemoveScript, worktreePreRemoveScript: s.worktreePreRemoveScript,
implTabPreCreateScript: s.implTabPreCreateScript, implTabPreCreateScript: s.implTabPreCreateScript,
implTabPostCloseScript: s.implTabPostCloseScript, implTabPostCloseScript: s.implTabPostCloseScript,
conflictResolutionProfilePath: s.conflictResolutionProfilePath,
youtrackBaseUrl: s.youtrackBaseUrl, youtrackBaseUrl: s.youtrackBaseUrl,
youtrackProjectShortName: s.youtrackProjectShortName, youtrackProjectShortName: s.youtrackProjectShortName,
youtrackCloseCommand: s.youtrackCloseCommand, youtrackCloseCommand: s.youtrackCloseCommand,
+2
View File
@@ -66,6 +66,7 @@ export type ExtensionToWebview
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl?: string youtrackBaseUrl?: string
youtrackProjectShortName?: string youtrackProjectShortName?: string
youtrackCloseCommand?: string youtrackCloseCommand?: string
@@ -127,6 +128,7 @@ export type WebviewToExtension
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string
+12
View File
@@ -164,6 +164,11 @@ export interface Settings {
* extension finds the project's first `isResolved` state value and uses that. * extension finds the project's first `isResolved` state value and uses that.
*/ */
youtrackCloseCommand: string youtrackCloseCommand: string
/**
* Claude settings profile path for the conflict-resolution cc session
* (drag to 完成 when PR merge conflicts). Empty = DEFAULT_PROFILE_PATH.
*/
conflictResolutionProfilePath: string
} }
export const SETTINGS_KEY = 'superpowers.settings' export const SETTINGS_KEY = 'superpowers.settings'
@@ -188,6 +193,7 @@ function defaults(ctx: ExtensionContext): Settings {
youtrackBaseUrl: '', youtrackBaseUrl: '',
youtrackProjectShortName: '', youtrackProjectShortName: '',
youtrackCloseCommand: '', youtrackCloseCommand: '',
conflictResolutionProfilePath: '',
} }
} }
@@ -267,6 +273,11 @@ export function getSettings(ctx: ExtensionContext): Settings {
const youtrackCloseCommand = typeof stored.youtrackCloseCommand === 'string' const youtrackCloseCommand = typeof stored.youtrackCloseCommand === 'string'
? stored.youtrackCloseCommand ? stored.youtrackCloseCommand
: base.youtrackCloseCommand : base.youtrackCloseCommand
// conflict-resolution profile: '' is meaningful (= DEFAULT_PROFILE_PATH at
// launch time), so don't coerce. Non-string legacy values collapse to ''.
const conflictResolutionProfilePath = typeof stored.conflictResolutionProfilePath === 'string'
? stored.conflictResolutionProfilePath
: base.conflictResolutionProfilePath
return { return {
webhookPort, webhookPort,
@@ -287,6 +298,7 @@ export function getSettings(ctx: ExtensionContext): Settings {
youtrackBaseUrl, youtrackBaseUrl,
youtrackProjectShortName, youtrackProjectShortName,
youtrackCloseCommand, youtrackCloseCommand,
conflictResolutionProfilePath,
} }
} }
+2
View File
@@ -452,10 +452,12 @@ export function App() {
initialWorktreePreRemoveScript={settings?.worktreePreRemoveScript ?? ''} initialWorktreePreRemoveScript={settings?.worktreePreRemoveScript ?? ''}
initialImplTabPreCreateScript={settings?.implTabPreCreateScript ?? ''} initialImplTabPreCreateScript={settings?.implTabPreCreateScript ?? ''}
initialImplTabPostCloseScript={settings?.implTabPostCloseScript ?? ''} initialImplTabPostCloseScript={settings?.implTabPostCloseScript ?? ''}
initialConflictResolutionProfilePath={settings?.conflictResolutionProfilePath ?? ''}
initialYoutrackBaseUrl={settings?.youtrackBaseUrl ?? ''} initialYoutrackBaseUrl={settings?.youtrackBaseUrl ?? ''}
initialYoutrackProjectShortName={settings?.youtrackProjectShortName ?? ''} initialYoutrackProjectShortName={settings?.youtrackProjectShortName ?? ''}
initialYoutrackCloseCommand={settings?.youtrackCloseCommand ?? ''} initialYoutrackCloseCommand={settings?.youtrackCloseCommand ?? ''}
initialYoutrackTokenSaved={settings?.youtrackTokenSaved ?? false} initialYoutrackTokenSaved={settings?.youtrackTokenSaved ?? false}
profiles={profiles}
youtrackProjects={youtrackProjects} youtrackProjects={youtrackProjects}
onListYouTrackProjects={listYouTrackProjects} onListYouTrackProjects={listYouTrackProjects}
onSubmit={saveSettings} onSubmit={saveSettings}
@@ -10,6 +10,7 @@
import type { ReactElement } from 'react' import type { ReactElement } from 'react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { X } from 'lucide-react' import { X } from 'lucide-react'
import type { ClaudeProfile } from '../hooks/useIssues'
type GroupKey = 'auth' | 'network' | 'youtrack' | 'prompts' | 'hooks' type GroupKey = 'auth' | 'network' | 'youtrack' | 'prompts' | 'hooks'
@@ -30,6 +31,7 @@ interface SubmitValues {
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string
@@ -69,10 +71,12 @@ export interface SettingsModalProps {
initialWorktreePreRemoveScript: string initialWorktreePreRemoveScript: string
initialImplTabPreCreateScript: string initialImplTabPreCreateScript: string
initialImplTabPostCloseScript: string initialImplTabPostCloseScript: string
initialConflictResolutionProfilePath: string
initialYoutrackBaseUrl: string initialYoutrackBaseUrl: string
initialYoutrackProjectShortName: string initialYoutrackProjectShortName: string
initialYoutrackCloseCommand: string initialYoutrackCloseCommand: string
initialYoutrackTokenSaved: boolean initialYoutrackTokenSaved: boolean
profiles: ClaudeProfile[]
youtrackProjects: YouTrackProjectsState youtrackProjects: YouTrackProjectsState
onListYouTrackProjects: (baseUrl: string, token: string) => void onListYouTrackProjects: (baseUrl: string, token: string) => void
onSubmit: (values: SubmitValues) => void onSubmit: (values: SubmitValues) => void
@@ -141,10 +145,12 @@ export function SettingsModal({
initialWorktreePreRemoveScript, initialWorktreePreRemoveScript,
initialImplTabPreCreateScript, initialImplTabPreCreateScript,
initialImplTabPostCloseScript, initialImplTabPostCloseScript,
initialConflictResolutionProfilePath,
initialYoutrackBaseUrl, initialYoutrackBaseUrl,
initialYoutrackProjectShortName, initialYoutrackProjectShortName,
initialYoutrackCloseCommand, initialYoutrackCloseCommand,
initialYoutrackTokenSaved, initialYoutrackTokenSaved,
profiles,
youtrackProjects, youtrackProjects,
onListYouTrackProjects, onListYouTrackProjects,
onSubmit, onSubmit,
@@ -167,6 +173,7 @@ export function SettingsModal({
const [worktreePreRemoveScript, setWorktreePreRemoveScript] = useState(initialWorktreePreRemoveScript) const [worktreePreRemoveScript, setWorktreePreRemoveScript] = useState(initialWorktreePreRemoveScript)
const [implTabPreCreateScript, setImplTabPreCreateScript] = useState(initialImplTabPreCreateScript) const [implTabPreCreateScript, setImplTabPreCreateScript] = useState(initialImplTabPreCreateScript)
const [implTabPostCloseScript, setImplTabPostCloseScript] = useState(initialImplTabPostCloseScript) const [implTabPostCloseScript, setImplTabPostCloseScript] = useState(initialImplTabPostCloseScript)
const [conflictResolutionProfilePath, setConflictResolutionProfilePath] = useState(initialConflictResolutionProfilePath)
const [youtrackBaseUrl, setYoutrackBaseUrl] = useState(initialYoutrackBaseUrl) const [youtrackBaseUrl, setYoutrackBaseUrl] = useState(initialYoutrackBaseUrl)
const [youtrackProjectShortName, setYoutrackProjectShortName] = useState(initialYoutrackProjectShortName) const [youtrackProjectShortName, setYoutrackProjectShortName] = useState(initialYoutrackProjectShortName)
const [youtrackCloseCommand, setYoutrackCloseCommand] = useState(initialYoutrackCloseCommand) const [youtrackCloseCommand, setYoutrackCloseCommand] = useState(initialYoutrackCloseCommand)
@@ -189,10 +196,14 @@ export function SettingsModal({
setReviewPrompt(initialReviewPrompt) setReviewPrompt(initialReviewPrompt)
setDevBranch(initialDevBranch) setDevBranch(initialDevBranch)
setAutoBuildBranch(initialAutoBuildBranch) setAutoBuildBranch(initialAutoBuildBranch)
setWorktreeDirectory(initialWorktreeDirectory)
setWorktreeOpenWith(initialWorktreeOpenWith)
setPycharmCommand(initialPycharmCommand)
setWorktreePostCreateScript(initialWorktreePostCreateScript) setWorktreePostCreateScript(initialWorktreePostCreateScript)
setWorktreePreRemoveScript(initialWorktreePreRemoveScript) setWorktreePreRemoveScript(initialWorktreePreRemoveScript)
setImplTabPreCreateScript(initialImplTabPreCreateScript) setImplTabPreCreateScript(initialImplTabPreCreateScript)
setImplTabPostCloseScript(initialImplTabPostCloseScript) setImplTabPostCloseScript(initialImplTabPostCloseScript)
setConflictResolutionProfilePath(initialConflictResolutionProfilePath)
setYoutrackBaseUrl(initialYoutrackBaseUrl) setYoutrackBaseUrl(initialYoutrackBaseUrl)
setYoutrackProjectShortName(initialYoutrackProjectShortName) setYoutrackProjectShortName(initialYoutrackProjectShortName)
setYoutrackCloseCommand(initialYoutrackCloseCommand) setYoutrackCloseCommand(initialYoutrackCloseCommand)
@@ -274,6 +285,8 @@ export function SettingsModal({
worktreePreRemoveScript: worktreePreRemoveScript.trim(), worktreePreRemoveScript: worktreePreRemoveScript.trim(),
implTabPreCreateScript: implTabPreCreateScript.trim(), implTabPreCreateScript: implTabPreCreateScript.trim(),
implTabPostCloseScript: implTabPostCloseScript.trim(), implTabPostCloseScript: implTabPostCloseScript.trim(),
// 冲突解决 profile:空串 = 用 DEFAULT_PROFILE_PATH
conflictResolutionProfilePath: conflictResolutionProfilePath.trim(),
youtrackBaseUrl: youtrackBaseUrl.trim(), youtrackBaseUrl: youtrackBaseUrl.trim(),
youtrackProjectShortName: youtrackProjectShortName.trim(), youtrackProjectShortName: youtrackProjectShortName.trim(),
youtrackCloseCommand: youtrackCloseCommand.trim(), youtrackCloseCommand: youtrackCloseCommand.trim(),
@@ -424,6 +437,32 @@ export function SettingsModal({
className={inputClass} className={inputClass}
/> />
</Field> </Field>
<Field
label="冲突解决配置文件"
hint={(
<>
PR main/dev 使 profile official
</>
)}
>
<select
value={conflictResolutionProfilePath}
onChange={e => setConflictResolutionProfilePath(e.target.value)}
className={inputClass}
>
<option value=""></option>
{profiles.map(p => (
<option key={p.path} value={p.path}>{p.name}</option>
))}
{conflictResolutionProfilePath
&& !profiles.some(p => p.path === conflictResolutionProfilePath) && (
<option value={conflictResolutionProfilePath}>
{`自定义:${conflictResolutionProfilePath}`}
</option>
)}
</select>
</Field>
</> </>
)} )}
+4
View File
@@ -40,6 +40,7 @@ export interface SettingsValues {
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string
@@ -65,6 +66,7 @@ export interface SettingsOverlayState {
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string
@@ -278,6 +280,7 @@ export function useIssues(): UseIssuesResult {
worktreePreRemoveScript: values.worktreePreRemoveScript, worktreePreRemoveScript: values.worktreePreRemoveScript,
implTabPreCreateScript: values.implTabPreCreateScript, implTabPreCreateScript: values.implTabPreCreateScript,
implTabPostCloseScript: values.implTabPostCloseScript, implTabPostCloseScript: values.implTabPostCloseScript,
conflictResolutionProfilePath: values.conflictResolutionProfilePath,
youtrackBaseUrl: values.youtrackBaseUrl, youtrackBaseUrl: values.youtrackBaseUrl,
youtrackProjectShortName: values.youtrackProjectShortName, youtrackProjectShortName: values.youtrackProjectShortName,
youtrackCloseCommand: values.youtrackCloseCommand, youtrackCloseCommand: values.youtrackCloseCommand,
@@ -606,6 +609,7 @@ export function useIssues(): UseIssuesResult {
worktreePreRemoveScript: msg.worktreePreRemoveScript, worktreePreRemoveScript: msg.worktreePreRemoveScript,
implTabPreCreateScript: msg.implTabPreCreateScript, implTabPreCreateScript: msg.implTabPreCreateScript,
implTabPostCloseScript: msg.implTabPostCloseScript, implTabPostCloseScript: msg.implTabPostCloseScript,
conflictResolutionProfilePath: msg.conflictResolutionProfilePath,
youtrackBaseUrl: msg.youtrackBaseUrl ?? '', youtrackBaseUrl: msg.youtrackBaseUrl ?? '',
youtrackProjectShortName: msg.youtrackProjectShortName ?? '', youtrackProjectShortName: msg.youtrackProjectShortName ?? '',
youtrackCloseCommand: msg.youtrackCloseCommand ?? '', youtrackCloseCommand: msg.youtrackCloseCommand ?? '',
+2
View File
@@ -81,6 +81,7 @@ export type ExtensionToWebview
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl?: string youtrackBaseUrl?: string
youtrackProjectShortName?: string youtrackProjectShortName?: string
youtrackCloseCommand?: string youtrackCloseCommand?: string
@@ -142,6 +143,7 @@ export type WebviewToExtension
worktreePreRemoveScript: string worktreePreRemoveScript: string
implTabPreCreateScript: string implTabPreCreateScript: string
implTabPostCloseScript: string implTabPostCloseScript: string
conflictResolutionProfilePath: string
youtrackBaseUrl: string youtrackBaseUrl: string
youtrackProjectShortName: string youtrackProjectShortName: string
youtrackCloseCommand: string youtrackCloseCommand: string