From c3f907e10853bc19abc76dd632bf9ea0ae6de762 Mon Sep 17 00:00:00 2001 From: Erik van der Boom Date: Fri, 29 May 2026 23:23:49 +0200 Subject: [PATCH 1/2] default to existing --- obsidian-plugin/src/main.ts | 9 ++++----- vscode-ext/src/extension.ts | 21 ++++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/obsidian-plugin/src/main.ts b/obsidian-plugin/src/main.ts index f1bc4c2..5c5896c 100644 --- a/obsidian-plugin/src/main.ts +++ b/obsidian-plugin/src/main.ts @@ -932,21 +932,20 @@ export default class BinderyPlugin extends Plugin { const binderyFolder = path.join(bookPath, BINDERY_FOLDER); const settingsPath = path.join(binderyFolder, SETTINGS_FILENAME); - if (fs.existsSync(settingsPath)) { - return; // already initialised - } + const isNew = !fs.existsSync(settingsPath); // Derive the default book title from the folder name (or vault name for root mode) const vaultName = trimmedBookRoot ? path.basename(bookPath) : this.app.vault.getName(); try { - loadAuthoringTools().toolInitWorkspace(bookPath, { + loadAuthoringTools().toolInitWorkspace(bookPath, isNew ? { bookTitle: vaultName, author: '', storyFolder: 'Story', - }); + } : {}); } catch { + if (!isNew) { return; } // already initialised — skip fallback for re-init fs.mkdirSync(binderyFolder, { recursive: true }); const defaultSettings = { bookTitle: vaultName, diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index 17085a6..5e16d1a 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -295,21 +295,26 @@ async function initWorkspaceCommand(context?: vscode.ExtensionContext) { if (!root) { vscode.window.showErrorMessage('No workspace folder open.'); return; } const settingsPath = getSettingsPath(root); + let existingSettings: WorkspaceSettings | undefined; if (fs.existsSync(settingsPath)) { const choice = await vscode.window.showQuickPick( [ - { label: 'Re-initialize', description: 'Overwrites settings.json (translations.json is kept)', value: true as const }, - { label: 'Cancel', value: false as const }, + { label: 'Re-initialize', description: 'Merges updates into existing settings; existing values are pre-filled', value: true as const }, + { label: 'Cancel', value: false as const }, ], { placeHolder: '.bindery/settings.json already exists' } ); if (!choice?.value) { return; } + try { existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as WorkspaceSettings; } + catch { /* corrupt — proceed as new */ } } + const existingTitle = typeof existingSettings?.bookTitle === 'string' ? existingSettings.bookTitle : undefined; const title = await vscode.window.showInputBox({ title: 'Bindery: Initialize (1/4)', prompt: 'Book title', placeHolder: 'e.g. The Hollow Road', + value: existingTitle, }); if (title === undefined) { return; } @@ -317,13 +322,14 @@ async function initWorkspaceCommand(context?: vscode.ExtensionContext) { title: 'Bindery: Initialize (2/4)', prompt: 'Author name', placeHolder: 'e.g. Jane Smith', + value: existingSettings?.author, }); if (author === undefined) { return; } const storyFolder = await vscode.window.showInputBox({ title: 'Bindery: Initialize (3/4)', prompt: 'Story folder name (relative to workspace root)', - value: 'Story', + value: existingSettings?.storyFolder ?? 'Story', }); if (!storyFolder) { return; } @@ -331,14 +337,15 @@ async function initWorkspaceCommand(context?: vscode.ExtensionContext) { title: 'Bindery: Initialize (4/5)', prompt: 'Target audience (used for AI review feedback)', placeHolder: 'e.g. 12+, adults, 8-10', + value: existingSettings?.targetAudience, }); if (audience === undefined) { return; } + const currentFormatOnSave = existingSettings?.formatOnSave ?? false; const formatOption = await vscode.window.showQuickPick( - [ - { label: 'No', value: false as const }, - { label: 'Yes', value: true as const }, - ], + currentFormatOnSave + ? [{ label: 'Yes', value: true as const }, { label: 'No', value: false as const }] + : [{ label: 'No', value: false as const }, { label: 'Yes', value: true as const }], { title: 'Bindery: Initialize (5/5)', placeHolder: 'Auto-apply typography on save (Story folder only)?' } ); if (!formatOption) { return; } From c5abd13798325cc00a8b1724aed4887378f6d2e2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:04:51 +0000 Subject: [PATCH 2/2] Preserve existing settings in init fallback path --- vscode-ext/src/extension.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index 5e16d1a..8ddf0e3 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -373,19 +373,20 @@ async function initWorkspaceCommand(context?: vscode.ExtensionContext) { const languages = detectedLangs.length > 0 ? detectedLangs : [DEFAULT_LANGUAGE]; const slug = title.replaceAll(/[^a-zA-Z0-9]+/g, '_').replaceAll(/^_|_$/g, '') || 'Book'; settings = { + ...existingSettings, ...(title ? { bookTitle: title } : {}), ...(author ? { author } : {}), ...(audience ? { targetAudience: audience } : {}), storyFolder, - notesFolder: 'Notes', - arcFolder: 'Arc', - charactersFolder: 'Notes/Characters', - sessionFile: 'SESSION.md', - preferencesFile: 'PREFERENCES.md', - mergedOutputDir: 'Merged', - mergeFilePrefix: slug, - formatOnSave: false, - languages, + notesFolder: existingSettings?.notesFolder ?? 'Notes', + arcFolder: existingSettings?.arcFolder ?? 'Arc', + charactersFolder: existingSettings?.charactersFolder ?? 'Notes/Characters', + sessionFile: existingSettings?.sessionFile ?? 'SESSION.md', + preferencesFile: existingSettings?.preferencesFile ?? 'PREFERENCES.md', + mergedOutputDir: existingSettings?.mergedOutputDir ?? 'Merged', + mergeFilePrefix: existingSettings?.mergeFilePrefix ?? slug, + formatOnSave: existingSettings?.formatOnSave ?? false, + languages: existingSettings?.languages?.length ? existingSettings.languages : languages, }; const writeIfMissing = (filePath: string, content: string): void => { if (fs.existsSync(filePath)) { return; }