From 3b43391515a573fa950b9b3df7f187af9310ed89 Mon Sep 17 00:00:00 2001 From: dldyou Date: Thu, 13 Aug 2026 12:53:03 +0900 Subject: [PATCH 01/11] feat: add extension marketplace icon (#27) --- images/icon.png | Bin 0 -> 54645 bytes package.json | 1 + 2 files changed, 1 insertion(+) create mode 100644 images/icon.png diff --git a/images/icon.png b/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8de9f104a63d5542e488d218c08c0b401a1ccbae GIT binary patch literal 54645 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

(b#z)09= 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 Date: Thu, 13 Aug 2026 12:55:32 +0900 Subject: [PATCH 02/11] feat: add markdown setup diagnostics (#25) --- src/extension.ts | 69 +++++++++++++++++++++++++++++- src/readmeUpdater.ts | 70 +++++++++++++++++++++++++++++++ src/test/readmeTargetFile.test.ts | 52 +++++++++++++++++++++++ src/webview.ts | 29 +++++++++++++ 4 files changed, 218 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 7c5e391..f8d9254 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,6 +1,11 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import { updateReadmeTreeBlock } from './readmeUpdater'; +import { + ensureReadmeTreeBlock, + inspectReadmeTreeBlock, + ReadmeSetupStatus, + updateReadmeTreeBlock, +} from './readmeUpdater'; import { scanDirectory, ScanOptions } from './scanner'; import { deleteTreeStateFile, loadTreeStateFile, saveTreeStateFile } from './treeMetaStore'; import { generateTreeString, TreeGeneratorOptions } from './treeGenerator'; @@ -92,6 +97,41 @@ function getGeneratorOptions(rootPath: string): TreeGeneratorOptions { }; } +function getReadmeDiagnostic( + status: ReadmeSetupStatus, + autoUpdateReadme: boolean, + targetPath: string, +): { text: string; canSetup: boolean; isError: boolean } { + switch (status) { + case 'missing-file': + return { + text: `${targetPath} does not exist. Set it up to create the Markdown tree block.`, + canSetup: true, + isError: false, + }; + case 'missing-markers': + return { + text: `${targetPath} has no tree markers, so automatic updates cannot run.`, + canSetup: true, + isError: false, + }; + case 'incomplete-markers': + return { + text: `${targetPath} contains only one tree marker. Remove the incomplete marker before setup.`, + canSetup: false, + isError: true, + }; + default: + return { + text: autoUpdateReadme + ? `${targetPath} is ready for automatic updates.` + : 'Automatic Markdown updates are disabled.', + canSetup: false, + isError: false, + }; + } +} + async function loadSavedTreeState( context: vscode.ExtensionContext, rootPath: string, @@ -143,20 +183,37 @@ function openTreeEditor( let readmeUpdateError: string | undefined; const autoUpdateReadme = getAutoUpdateReadme(rootPath); + const readmePath = getReadmePath(rootPath); if (autoUpdateReadme) { try { - await updateReadmeTreeBlock(rootPath, treeString, getReadmePath(rootPath)); + await updateReadmeTreeBlock(rootPath, treeString, readmePath); } catch (error) { readmeUpdateError = `Failed to update markdown file: ${String(error)}`; } } + let readmeDiagnostic; + try { + readmeDiagnostic = getReadmeDiagnostic( + await inspectReadmeTreeBlock(rootPath, readmePath), + autoUpdateReadme, + readmePath, + ); + } catch (error) { + readmeDiagnostic = { + text: `Could not inspect ${readmePath}: ${String(error)}`, + canSetup: false, + isError: true, + }; + } + await panel.webview.postMessage({ type: 'update', tree, treeString, respectGitignore: scanOptions.respectGitignore, autoUpdateReadme, + readmeDiagnostic, status, }); @@ -400,6 +457,14 @@ function openTreeEditor( await updateAutoUpdateReadme(message.autoUpdateReadme); break; + case 'setupMarkdown': + await ensureReadmeTreeBlock( + rootPath, + generateTreeString(tree, getGeneratorOptions(rootPath)), + getReadmePath(rootPath), + ); + await sendUpdate('Markdown tree block created'); + break; case 'copy': await vscode.env.clipboard.writeText( generateTreeString(tree, getGeneratorOptions(rootPath)), diff --git a/src/readmeUpdater.ts b/src/readmeUpdater.ts index c4bc6da..9547f3a 100644 --- a/src/readmeUpdater.ts +++ b/src/readmeUpdater.ts @@ -14,6 +14,12 @@ export interface ReadmeCheckResult { matches: boolean; } +export type ReadmeSetupStatus = + | 'ready' + | 'missing-file' + | 'missing-markers' + | 'incomplete-markers'; + function resolveReadmePath(rootPath: string, targetPath = 'README.md'): string { if (path.isAbsolute(targetPath)) { throw new Error('README target path must be relative and within the root path.'); @@ -39,6 +45,70 @@ export function renderReadmeTreeBlock(treeString: string): string { ].join('\n'); } +function getSetupStatus(readme: string): ReadmeSetupStatus { + const hasStartMarker = readme.includes(README_TREE_START_MARKER); + const hasEndMarker = readme.includes(README_TREE_END_MARKER); + if (hasStartMarker && hasEndMarker) { + return 'ready'; + } + if (hasStartMarker || hasEndMarker) { + return 'incomplete-markers'; + } + return 'missing-markers'; +} + +export async function inspectReadmeTreeBlock( + rootPath: string, + targetPath?: string, +): Promise { + try { + return getSetupStatus( + await fs.readFile(resolveReadmePath(rootPath, targetPath), 'utf8'), + ); + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return 'missing-file'; + } + throw error; + } +} + +export async function ensureReadmeTreeBlock( + rootPath: string, + treeString: string, + targetPath?: string, +): Promise { + const target = resolveReadmePath(rootPath, targetPath); + let readme = ''; + try { + readme = await fs.readFile(target, 'utf8'); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error; + } + await fs.mkdir(path.dirname(target), { recursive: true }); + } + + const status = getSetupStatus(readme); + if (status === 'incomplete-markers') { + throw new Error('Markdown target contains only one tree marker. Remove the incomplete marker and try again.'); + } + + if (status === 'ready') { + await updateReadmeTreeBlock(rootPath, treeString, targetPath); + return; + } + + const separator = readme.length === 0 || readme.endsWith('\n\n') + ? '' + : readme.endsWith('\n') ? '\n' : '\n\n'; + await fs.writeFile( + target, + `${readme}${separator}${renderReadmeTreeBlock(treeString)}\n`, + 'utf8', + ); +} + export function replaceReadmeTreeBlock( readme: string, treeString: string, diff --git a/src/test/readmeTargetFile.test.ts b/src/test/readmeTargetFile.test.ts index 82b0121..bde69a9 100644 --- a/src/test/readmeTargetFile.test.ts +++ b/src/test/readmeTargetFile.test.ts @@ -4,6 +4,8 @@ import * as os from 'os'; import * as path from 'path'; import { checkReadmeTreeBlock, + ensureReadmeTreeBlock, + inspectReadmeTreeBlock, README_TREE_END_MARKER, README_TREE_START_MARKER, updateReadmeTreeBlock, @@ -11,6 +13,56 @@ import { import { runCli } from '../cli'; suite('README target file', () => { + test('creates a missing target file with tree markers', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'tree-generator-')); + + try { + assert.strictEqual( + await inspectReadmeTreeBlock(rootPath, 'docs/structure.md'), + 'missing-file', + ); + await ensureReadmeTreeBlock(rootPath, 'project/\n', 'docs/structure.md'); + const content = await fs.readFile(path.join(rootPath, 'docs', 'structure.md'), 'utf8'); + assert.ok(content.includes(README_TREE_START_MARKER)); + assert.ok(content.includes(README_TREE_END_MARKER)); + assert.strictEqual( + await inspectReadmeTreeBlock(rootPath, 'docs/structure.md'), + 'ready', + ); + } finally { + await fs.rm(rootPath, { recursive: true, force: true }); + } + }); + + test('appends markers without replacing existing Markdown', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'tree-generator-')); + + try { + await fs.writeFile(path.join(rootPath, 'README.md'), '# Project\n'); + await ensureReadmeTreeBlock(rootPath, 'project/\n'); + const content = await fs.readFile(path.join(rootPath, 'README.md'), 'utf8'); + assert.ok(content.startsWith('# Project\n')); + assert.ok(content.includes(README_TREE_START_MARKER)); + } finally { + await fs.rm(rootPath, { recursive: true, force: true }); + } + }); + + test('reports incomplete marker pairs', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'tree-generator-')); + + try { + await fs.writeFile(path.join(rootPath, 'README.md'), README_TREE_START_MARKER); + assert.strictEqual(await inspectReadmeTreeBlock(rootPath), 'incomplete-markers'); + await assert.rejects( + ensureReadmeTreeBlock(rootPath, 'project/\n'), + /only one tree marker/, + ); + } finally { + await fs.rm(rootPath, { recursive: true, force: true }); + } + }); + test('updates nested targets, defaults to README.md, and rejects unsafe paths', async () => { const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'tree-generator-')); const nestedReadmePath = path.join(rootPath, 'docs', 'guide.md'); diff --git a/src/webview.ts b/src/webview.ts index 7d42cce..f953f1a 100644 --- a/src/webview.ts +++ b/src/webview.ts @@ -288,6 +288,19 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { color: var(--vscode-errorForeground); } + .diagnostic { + display: flex; + align-items: center; + gap: 8px; + min-height: 28px; + margin: -4px 0 12px; + color: var(--vscode-descriptionForeground); + } + + .diagnostic.error { + color: var(--vscode-errorForeground); + } + @media (max-width: 760px) { .layout { grid-template-columns: 1fr; @@ -310,6 +323,10 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { +

+ + +

Add descriptions, drag items to change their order, or exclude them from the output. Descriptions are aligned as # comments in the preview.

@@ -329,6 +346,9 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { const statusElement = document.getElementById('status'); const respectGitignoreCheckbox = document.getElementById('respect-gitignore-checkbox'); const autoUpdateReadmeCheckbox = document.getElementById('auto-update-readme-checkbox'); + const markdownDiagnosticElement = document.getElementById('markdown-diagnostic'); + const markdownDiagnosticText = document.getElementById('markdown-diagnostic-text'); + const setupMarkdownButton = document.getElementById('setup-markdown-button'); const searchInput = document.getElementById('search-input'); const collapsedPaths = new Set(); let matchingPaths = new Set(); @@ -363,6 +383,11 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { }); }); + setupMarkdownButton.addEventListener('click', () => { + setStatus('Setting up Markdown...'); + vscode.postMessage({ type: 'setupMarkdown' }); + }); + searchInput.addEventListener('input', renderTree); window.addEventListener('message', event => { @@ -373,6 +398,10 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { previewElement.textContent = message.treeString; respectGitignoreCheckbox.checked = Boolean(message.respectGitignore); autoUpdateReadmeCheckbox.checked = Boolean(message.autoUpdateReadme); + const diagnostic = message.readmeDiagnostic; + markdownDiagnosticText.textContent = diagnostic?.text ?? ''; + markdownDiagnosticElement.classList.toggle('error', Boolean(diagnostic?.isError)); + setupMarkdownButton.hidden = !diagnostic?.canSetup; renderTree(); setStatus(message.status ?? ''); } else if (message.type === 'status') { From a1998e86adf1069afecde82bab971cc255bdcae6 Mon Sep 17 00:00:00 2001 From: dldyou Date: Thu, 13 Aug 2026 12:56:55 +0900 Subject: [PATCH 03/11] feat: expose output settings in webview (#26) --- src/extension.ts | 55 ++++++++++++++++++++++++++++++++++++++- src/webview.ts | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index f8d9254..f11ba4b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -179,7 +179,8 @@ function openTreeEditor( }; const sendUpdate = async (status?: string): Promise => { - const treeString = generateTreeString(tree, getGeneratorOptions(rootPath)); + const generatorOptions = getGeneratorOptions(rootPath); + const treeString = generateTreeString(tree, generatorOptions); let readmeUpdateError: string | undefined; const autoUpdateReadme = getAutoUpdateReadme(rootPath); @@ -214,6 +215,9 @@ function openTreeEditor( respectGitignore: scanOptions.respectGitignore, autoUpdateReadme, readmeDiagnostic, + readmePath, + outputStyle: generatorOptions.style ?? 'unicode', + maxDepth: generatorOptions.maxDepth ?? -1, status, }); @@ -276,6 +280,32 @@ function openTreeEditor( ); }; + const updateOutputSettings = async ( + readmePath: string, + outputStyle: 'unicode' | 'ascii', + maxDepth: number, + ): Promise => { + const configuration = vscode.workspace.getConfiguration( + 'tree-generator', + vscode.Uri.file(rootPath), + ); + await configuration.update( + 'readmePath', + readmePath, + vscode.ConfigurationTarget.WorkspaceFolder, + ); + await configuration.update( + 'outputStyle', + outputStyle, + vscode.ConfigurationTarget.WorkspaceFolder, + ); + await configuration.update( + 'maxDepth', + maxDepth, + vscode.ConfigurationTarget.WorkspaceFolder, + ); + }; + const scheduleFileTreeRefresh = (uri: vscode.Uri): void => { if (path.basename(uri.fsPath) === '.gitignore') { return; @@ -465,6 +495,29 @@ function openTreeEditor( ); await sendUpdate('Markdown tree block created'); break; + case 'setOutputSettings': + if ( + typeof message.readmePath !== 'string' + || message.readmePath.trim().length === 0 + || (message.outputStyle !== 'unicode' && message.outputStyle !== 'ascii') + || !Number.isInteger(message.maxDepth) + || message.maxDepth < -1 + ) { + await panel.webview.postMessage({ + type: 'status', + text: 'Could not update output settings.', + isError: true, + }); + break; + } + + await updateOutputSettings( + message.readmePath.trim(), + message.outputStyle, + message.maxDepth, + ); + await sendUpdate('Output settings updated'); + break; case 'copy': await vscode.env.clipboard.writeText( generateTreeString(tree, getGeneratorOptions(rootPath)), diff --git a/src/webview.ts b/src/webview.ts index f953f1a..aed43df 100644 --- a/src/webview.ts +++ b/src/webview.ts @@ -301,6 +301,35 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { color: var(--vscode-errorForeground); } + .settings { + display: flex; + align-items: end; + flex-wrap: wrap; + gap: 10px; + margin-bottom: 12px; + } + + .setting { + display: grid; + gap: 4px; + color: var(--vscode-descriptionForeground); + font-size: 12px; + } + + .setting input, + .setting select { + min-width: 110px; + height: 28px; + border: 1px solid var(--vscode-input-border, transparent); + padding: 2px 7px; + color: var(--vscode-input-foreground); + background: var(--vscode-input-background); + } + + .setting:first-child input { + min-width: 220px; + } + @media (max-width: 760px) { .layout { grid-template-columns: 1fr; @@ -327,6 +356,20 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { +
+ + + +

Add descriptions, drag items to change their order, or exclude them from the output. Descriptions are aligned as # comments in the preview.

@@ -349,6 +392,9 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { const markdownDiagnosticElement = document.getElementById('markdown-diagnostic'); const markdownDiagnosticText = document.getElementById('markdown-diagnostic-text'); const setupMarkdownButton = document.getElementById('setup-markdown-button'); + const readmePathInput = document.getElementById('readme-path-input'); + const outputStyleSelect = document.getElementById('output-style-select'); + const maxDepthInput = document.getElementById('max-depth-input'); const searchInput = document.getElementById('search-input'); const collapsedPaths = new Set(); let matchingPaths = new Set(); @@ -388,6 +434,25 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { vscode.postMessage({ type: 'setupMarkdown' }); }); + function updateOutputSettings() { + const maxDepth = Number(maxDepthInput.value); + if (!readmePathInput.value.trim() || !Number.isInteger(maxDepth) || maxDepth < -1) { + setStatus('Enter a Markdown target and a depth of -1 or greater.', true); + return; + } + setStatus('Updating output settings...'); + vscode.postMessage({ + type: 'setOutputSettings', + readmePath: readmePathInput.value, + outputStyle: outputStyleSelect.value, + maxDepth, + }); + } + + readmePathInput.addEventListener('change', updateOutputSettings); + outputStyleSelect.addEventListener('change', updateOutputSettings); + maxDepthInput.addEventListener('change', updateOutputSettings); + searchInput.addEventListener('input', renderTree); window.addEventListener('message', event => { @@ -402,6 +467,9 @@ export function getTreeEditorHtml(webview: vscode.Webview): string { markdownDiagnosticText.textContent = diagnostic?.text ?? ''; markdownDiagnosticElement.classList.toggle('error', Boolean(diagnostic?.isError)); setupMarkdownButton.hidden = !diagnostic?.canSetup; + readmePathInput.value = message.readmePath ?? 'README.md'; + outputStyleSelect.value = message.outputStyle ?? 'unicode'; + maxDepthInput.value = String(message.maxDepth ?? -1); renderTree(); setStatus(message.status ?? ''); } else if (message.type === 'status') { From 91fb17e1228c59d7d51a03c52193d9141bd5d9d1 Mon Sep 17 00:00:00 2001 From: dldyou Date: Thu, 13 Aug 2026 13:02:12 +0900 Subject: [PATCH 04/11] feat: add undo and redo for tree edits (#28) --- src/extension.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++++- src/webview.ts | 20 +++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index f11ba4b..4e92fe1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -19,6 +19,13 @@ import { applyTreeState, captureTreeState, PersistedTreeState } from './treeStat import { TreeNode } from './types'; import { getTreeEditorHtml } from './webview'; +function cloneTree(node: TreeNode): TreeNode { + return { + ...node, + children: node.children?.map(cloneTree), + }; +} + export function activate(context: vscode.ExtensionContext) { const disposable = vscode.commands.registerCommand('tree-generator.generateTree', async () => { const workspaceFolders = vscode.workspace.workspaceFolders; @@ -173,6 +180,16 @@ function openTreeEditor( let scanOptions = initialScanOptions; let refreshTimer: NodeJS.Timeout | undefined; let pendingRefreshStatus = 'Tree refreshed'; + const undoStack: TreeNode[] = []; + const redoStack: TreeNode[] = []; + + const recordMutation = (previousTree: TreeNode): void => { + undoStack.push(previousTree); + if (undoStack.length > 50) { + undoStack.shift(); + } + redoStack.length = 0; + }; const saveTree = async (): Promise => { await saveTreeStateFile(rootPath, captureTreeState(tree)); @@ -218,6 +235,8 @@ function openTreeEditor( readmePath, outputStyle: generatorOptions.style ?? 'unicode', maxDepth: generatorOptions.maxDepth ?? -1, + canUndo: undoStack.length > 0, + canRedo: redoStack.length > 0, status, }); @@ -239,6 +258,8 @@ function openTreeEditor( } tree = refreshedTree; + undoStack.length = 0; + redoStack.length = 0; await sendUpdate(status); } catch (error) { await panel.webview.postMessage({ @@ -378,6 +399,7 @@ function openTreeEditor( await sendUpdate(); break; case 'reorder': + const treeBeforeReorder = cloneTree(tree); if ( typeof message.parentPath !== 'string' || !Array.isArray(message.orderedChildPaths) @@ -395,10 +417,12 @@ function openTreeEditor( break; } + recordMutation(treeBeforeReorder); await saveTree(); await sendUpdate('Order updated'); break; case 'setExcluded': + const treeBeforeExclusion = cloneTree(tree); if ( typeof message.nodePath !== 'string' || typeof message.excluded !== 'boolean' @@ -413,6 +437,7 @@ function openTreeEditor( break; } + recordMutation(treeBeforeExclusion); await saveTree(); await sendUpdate( message.excluded @@ -421,6 +446,7 @@ function openTreeEditor( ); break; case 'setDescendantsExcluded': + const treeBeforeBulkExclusion = cloneTree(tree); if ( typeof message.directoryPath !== 'string' || typeof message.excluded !== 'boolean' @@ -438,6 +464,7 @@ function openTreeEditor( break; } + recordMutation(treeBeforeBulkExclusion); await saveTree(); await sendUpdate( message.excluded @@ -446,6 +473,7 @@ function openTreeEditor( ); break; case 'setDescription': + const treeBeforeDescription = cloneTree(tree); if ( typeof message.nodePath !== 'string' || typeof message.description !== 'string' @@ -460,6 +488,7 @@ function openTreeEditor( break; } + recordMutation(treeBeforeDescription); await saveTree(); await sendUpdate('Description updated'); break; @@ -528,11 +557,36 @@ function openTreeEditor( }); break; case 'reset': + const treeBeforeReset = cloneTree(tree); + const defaultTree = await scanDirectory(rootPath, scanOptions); await deleteTreeStateFile(rootPath); await context.workspaceState.update(stateKey, undefined); - tree = await scanDirectory(rootPath, scanOptions); + tree = defaultTree; + recordMutation(treeBeforeReset); await sendUpdate('Default order restored'); break; + case 'undo': + const previousTree = undoStack.pop(); + if (!previousTree) { + await sendUpdate(); + break; + } + redoStack.push(cloneTree(tree)); + tree = previousTree; + await saveTree(); + await sendUpdate('Change undone'); + break; + case 'redo': + const nextTree = redoStack.pop(); + if (!nextTree) { + await sendUpdate(); + break; + } + undoStack.push(cloneTree(tree)); + tree = nextTree; + await saveTree(); + await sendUpdate('Change restored'); + break; } } catch (error) { await panel.webview.postMessage({ diff --git a/src/webview.ts b/src/webview.ts index aed43df..1fa4bdd 100644 --- a/src/webview.ts +++ b/src/webview.ts @@ -340,6 +340,8 @@ export function getTreeEditorHtml(webview: vscode.Webview): string {
+ +