<<<BEGIN_CHANGE operation="modify" path="package.json" original_sha256="5eddae1db7cd0732cac5ee79735ec739cc535617bddc11782fe3e3f9a998744d">>>
{
  "name": "picto-code-bundler",
  "displayName": "Code Bundler",
  "description": "Bundle selected files and folders into an AI-friendly text file",
  "version": "1.3.0",
  "publisher": "Picto",
  "icon": "icon.png",
  "license": "MIT",
  "engines": {
    "vscode": "^1.125.0"
  },
  "categories": [
    "Other"
  ],
  "keywords": [
    "ai",
    "code",
    "bundle",
    "context",
    "copilot",
    "text",
    "files",
    "folder"
  ],
  "activationEvents": [
    "onStartupFinished"
  ],
  "main": "./dist/extension.js",
  "l10n": "./l10n",
  "contributes": {
    "commands": [
      {
        "command": "code-bundler.addToBundleQueue",
        "title": "%codeBundler.addToBundleQueue.title%",
        "category": "%codeBundler.category%",
        "icon": "$(list-selection)"
      },
      {
        "command": "code-bundler.removeFromBundleQueue",
        "title": "%codeBundler.removeFromBundleQueue.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.packBundleQueue",
        "title": "%codeBundler.packBundleQueue.title%",
        "category": "%codeBundler.category%",
        "icon": "$(package)"
      },
      {
        "command": "code-bundler.clearBundleQueue",
        "title": "%codeBundler.clearBundleQueue.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.manageBundleQueue",
        "title": "%codeBundler.manageBundleQueue.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.packSelected",
        "title": "%codeBundler.packSelected.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.applyChangeBundle",
        "title": "%codeBundler.applyChangeBundle.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.previousChange",
        "title": "%codeBundler.previousChange.title%",
        "category": "%codeBundler.category%",
        "icon": "$(arrow-up)"
      },
      {
        "command": "code-bundler.nextChange",
        "title": "%codeBundler.nextChange.title%",
        "category": "%codeBundler.category%",
        "icon": "$(arrow-down)"
      },
      {
        "command": "code-bundler.previousPendingFile",
        "title": "%codeBundler.previousPendingFile.title%",
        "category": "%codeBundler.category%",
        "icon": "$(chevron-up)"
      },
      {
        "command": "code-bundler.nextPendingFile",
        "title": "%codeBundler.nextPendingFile.title%",
        "category": "%codeBundler.category%",
        "icon": "$(chevron-down)"
      },
      {
        "command": "code-bundler.openCurrentDiff",
        "title": "%codeBundler.openCurrentDiff.title%",
        "category": "%codeBundler.category%",
        "icon": "$(diff)"
      },
      {
        "command": "code-bundler.acceptCurrentChange",
        "title": "%codeBundler.acceptCurrentChange.title%",
        "category": "%codeBundler.category%",
        "icon": "$(check-all)"
      },
      {
        "command": "code-bundler.rejectCurrentChange",
        "title": "%codeBundler.rejectCurrentChange.title%",
        "category": "%codeBundler.category%",
        "icon": "$(discard)"
      },
      {
        "command": "code-bundler.acceptHunk",
        "title": "%codeBundler.acceptHunk.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.rejectHunk",
        "title": "%codeBundler.rejectHunk.title%",
        "category": "%codeBundler.category%"
      },
      {
        "command": "code-bundler.acceptAllChanges",
        "title": "%codeBundler.acceptAllChanges.title%",
        "category": "%codeBundler.category%",
        "icon": "$(check-all)"
      },
      {
        "command": "code-bundler.rejectAllChanges",
        "title": "%codeBundler.rejectAllChanges.title%",
        "category": "%codeBundler.category%",
        "icon": "$(trash)"
      }
    ],
    "menus": {
      "explorer/context": [
        {
          "command": "code-bundler.addToBundleQueue",
          "group": "0_codeBundler@1",
          "when": "!codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.packSelected",
          "group": "0_codeBundler@2"
        },
        {
          "command": "code-bundler.applyChangeBundle",
          "group": "0_codeBundler@3",
          "when": "resourceExtname == .txt && !codeBundler.reviewActive"
        }
      ],
      "commandPalette": [
        {
          "command": "code-bundler.packSelected"
        },
        {
          "command": "code-bundler.applyChangeBundle",
          "when": "!codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.previousChange",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.nextChange",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.previousPendingFile",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.nextPendingFile",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.openCurrentDiff",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.acceptCurrentChange",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.rejectCurrentChange",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.acceptAllChanges",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.rejectAllChanges",
          "when": "codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.addToBundleQueue",
          "when": "!codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.removeFromBundleQueue",
          "when": "codeBundler.bundleQueueNotEmpty && !codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.packBundleQueue",
          "when": "codeBundler.bundleQueueNotEmpty && !codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.clearBundleQueue",
          "when": "codeBundler.bundleQueueNotEmpty && !codeBundler.reviewActive"
        }
      ],
      "editor/title": [
        {
          "command": "code-bundler.acceptAllChanges",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@1"
        },
        {
          "command": "code-bundler.rejectAllChanges",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@2"
        },
        {
          "command": "code-bundler.previousChange",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@3"
        },
        {
          "command": "code-bundler.nextChange",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@4"
        },
        {
          "command": "code-bundler.previousPendingFile",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@5"
        },
        {
          "command": "code-bundler.nextPendingFile",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@6"
        },
        {
          "command": "code-bundler.openCurrentDiff",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@7"
        },
        {
          "command": "code-bundler.acceptCurrentChange",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@8"
        },
        {
          "command": "code-bundler.rejectCurrentChange",
          "when": "codeBundler.reviewActive && resourceScheme == file",
          "group": "navigation@9"
        }
      ],
      "editor/title/context": [
        {
          "command": "code-bundler.addToBundleQueue",
          "group": "0_codeBundler@1",
          "when": "resourceScheme == file && !codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.packSelected",
          "group": "0_codeBundler@2",
          "when": "resourceScheme == file && !codeBundler.reviewActive"
        },
        {
          "command": "code-bundler.applyChangeBundle",
          "group": "0_codeBundler@3",
          "when": "resourceScheme == file && resourceExtname == .txt && !codeBundler.reviewActive"
        }
      ]
    },
    "views": {
      "explorer": [
        {
          "type": "webview",
          "id": "codeBundler.reviewFileList",
          "name": "AI Changed Files",
          "when": "codeBundler.reviewActive"
        }
      ]
    }
  },
  "scripts": {
    "vscode:prepublish": "npm run package",
    "compile": "npm run check-types && npm run lint && node esbuild.js",
    "watch": "npm-run-all -p watch:*",
    "watch:esbuild": "node esbuild.js --watch",
    "watch:tsc": "tsc --noEmit --watch --project tsconfig.json",
    "package": "npm run check-types && npm run lint && node esbuild.js --production",
    "compile-tests": "tsc -p . --outDir out",
    "watch-tests": "tsc -p . -w --outDir out",
    "pretest": "npm run compile-tests && npm run compile && npm run lint",
    "check-types": "tsc --noEmit",
    "lint": "eslint src",
    "test": "vscode-test"
  },
  "devDependencies": {
    "@types/vscode": "^1.125.0",
    "@types/mocha": "^10.0.10",
    "@types/node": "24.x",
    "typescript-eslint": "^8.61.1",
    "eslint": "^10.5.0",
    "esbuild": "^0.28.1",
    "npm-run-all": "^4.1.5",
    "typescript": "^6.0.3",
    "@vscode/test-cli": "^0.0.15",
    "@vscode/test-electron": "^3.0.0"
  },
  "overrides": {
    "diff": "^8.0.4",
    "serialize-javascript": "^7.0.6"
  }
}
<<<END_CHANGE path="package.json">>>
<<<BEGIN_CHANGE operation="modify" path="src/extension.ts" original_sha256="76382ebe83659d9d24201d46f1ad9a4443c9ade48fda245759cf41c8560d5fd6">>>
import * as vscode from 'vscode';

import {
    registerPackCommand
} from './commands/packCommand';

import {
    registerApplyChangeBundleCommand
} from './commands/applyChangeBundleCommand';

import {
    BundleQueueManager
} from './bundle/bundleQueueManager';

import {
    ChangeFileOpenPrompt
} from './changes/changeFileOpenPrompt';

import {
    AppliedReviewManager
} from './changes/appliedReviewManager';

import {
    PendingChangeDecorations
} from './changes/decorations';

import {
    ReviewCodeLensProvider
} from './changes/reviewCodeLens';

import {
    ReviewContentProvider
} from './changes/reviewContentProvider';

import {
    ReviewFileListView
} from './changes/reviewFileListView';

export function activate(
    context: vscode.ExtensionContext
): void {
    const outputChannel =
        vscode.window.createOutputChannel(
            'Code Bundler'
        );


    const bundleQueueManager =
        new BundleQueueManager(context);


    const changeFileOpenPrompt =
        new ChangeFileOpenPrompt();

    const decorations =
        new PendingChangeDecorations();

    const reviewContentProvider =
        new ReviewContentProvider();

    const reviewContentRegistration =
        vscode.workspace
            .registerTextDocumentContentProvider(
                ReviewContentProvider.scheme,
                reviewContentProvider
            );

    const reviewManager =
        new AppliedReviewManager(
            decorations,
            outputChannel,
            reviewContentProvider
        );

    const reviewFileListView =
        new ReviewFileListView(
            decorations
        );

    const reviewFileListRegistration =
        vscode.window.registerWebviewViewProvider(
            ReviewFileListView.viewType,
            reviewFileListView
        );

    const codeLensProvider =
        new ReviewCodeLensProvider(
            decorations
        );

    const codeLensRegistration =
        vscode.languages
            .registerCodeLensProvider(
                {
                    scheme: 'file'
                },
                codeLensProvider
            );

    const fileDecorationRegistration =
        vscode.window
            .registerFileDecorationProvider(
                decorations
            );

    const previousChangeCommand =
        vscode.commands.registerCommand(
            'code-bundler.previousChange',
            async () => {
                await runReviewCommand(
                    () =>
                        reviewManager.previousChange()
                );
            }
        );

    const nextChangeCommand =
        vscode.commands.registerCommand(
            'code-bundler.nextChange',
            async () => {
                await runReviewCommand(
                    () =>
                        reviewManager.nextChange()
                );
            }
        );

    const previousPendingFileCommand =
        vscode.commands.registerCommand(
            'code-bundler.previousPendingFile',
            async () => {
                await runReviewCommand(
                    () => reviewManager
                        .previousPendingFile()
                );
            }
        );

    const nextPendingFileCommand =
        vscode.commands.registerCommand(
            'code-bundler.nextPendingFile',
            async () => {
                await runReviewCommand(
                    () => reviewManager
                        .nextPendingFile()
                );
            }
        );

    const openDiffCommand =
        vscode.commands.registerCommand(
            'code-bundler.openCurrentDiff',
            async (uri?: vscode.Uri) => {
                await runReviewCommand(
                    () => reviewManager
                        .openCurrentDiff(uri)
                );
            }
        );

    const acceptCurrentCommand =
        vscode.commands.registerCommand(
            'code-bundler.acceptCurrentChange',
            async (uri?: vscode.Uri) => {
                await runReviewCommand(
                    () =>
                        reviewManager
                            .acceptCurrent(uri)
                );
            }
        );

    const rejectCurrentCommand =
        vscode.commands.registerCommand(
            'code-bundler.rejectCurrentChange',
            async (uri?: vscode.Uri) => {
                await runReviewCommand(
                    () =>
                        reviewManager
                            .rejectCurrent(uri)
                );
            }
        );

    const acceptHunkCommand =
        vscode.commands.registerCommand(
            'code-bundler.acceptHunk',
            async (
                uri: vscode.Uri,
                hunkId: string
            ) => {
                await runReviewCommand(
                    () =>
                        reviewManager.acceptHunk(
                            uri,
                            hunkId
                        )
                );
            }
        );

    const rejectHunkCommand =
        vscode.commands.registerCommand(
            'code-bundler.rejectHunk',
            async (
                uri: vscode.Uri,
                hunkId: string
            ) => {
                await runReviewCommand(
                    () =>
                        reviewManager.rejectHunk(
                            uri,
                            hunkId
                        )
                );
            }
        );

    const acceptAllCommand =
        vscode.commands.registerCommand(
            'code-bundler.acceptAllChanges',
            async () => {
                await runReviewCommand(
                    () =>
                        reviewManager.acceptAll()
                );
            }
        );

    const rejectAllCommand =
        vscode.commands.registerCommand(
            'code-bundler.rejectAllChanges',
            async () => {
                await runReviewCommand(
                    () =>
                        reviewManager.rejectAll()
                );
            }
        );

    context.subscriptions.push(
        outputChannel,
        bundleQueueManager,
        changeFileOpenPrompt,
        decorations,
        codeLensProvider,
        codeLensRegistration,
        fileDecorationRegistration,
        reviewContentRegistration,
        reviewFileListView,
        reviewFileListRegistration,

        registerPackCommand(
            outputChannel
        ),

        registerApplyChangeBundleCommand(
            reviewManager
        ),

        previousChangeCommand,
        previousPendingFileCommand,
        nextPendingFileCommand,
        openDiffCommand,
        nextChangeCommand,
        acceptCurrentCommand,
        rejectCurrentCommand,
        acceptHunkCommand,
        rejectHunkCommand,
        acceptAllCommand,
        rejectAllCommand
    );
}

export function deactivate(): void {
    // Resources are disposed through
    // context.subscriptions.
}

async function runReviewCommand(
    action: () => Promise<void>
): Promise<void> {
    try {
        await action();
    } catch (error) {
        const message =
            error instanceof Error
                ? error.message
                : String(error);

        vscode.window.showErrorMessage(
            vscode.l10n.t(
                'Change review failed: {0}',
                message
            )
        );
    }
}
<<<END_CHANGE path="src/extension.ts">>>
<<<BEGIN_CHANGE operation="create" path="src/changes/changeFileOpenPrompt.ts">>>
import * as vscode from 'vscode';

const changeFileNamePattern =
    /^code-change-[a-f0-9]+\.txt$/i;

export class ChangeFileOpenPrompt
implements vscode.Disposable {
    private readonly promptedDocuments =
        new Set<string>();
    private readonly disposables:
        vscode.Disposable[];

    public constructor() {
        this.disposables = [
            vscode.workspace.onDidOpenTextDocument(
                (document) => {
                    void this.promptIfChangeFile(document);
                }
            ),
            vscode.workspace.onDidCloseTextDocument(
                (document) => {
                    this.promptedDocuments.delete(
                        document.uri.toString()
                    );
                }
            )
        ];

        for (const document of vscode.workspace.textDocuments) {
            void this.promptIfChangeFile(document);
        }
    }

    public dispose(): void {
        for (const disposable of this.disposables) {
            disposable.dispose();
        }
    }

    private async promptIfChangeFile(
        document: vscode.TextDocument
    ): Promise<void> {
        if (!isChangeFile(document)) {
            return;
        }

        const documentKey = document.uri.toString();

        if (this.promptedDocuments.has(documentKey)) {
            return;
        }

        this.promptedDocuments.add(documentKey);

        const applyLabel = vscode.l10n.t('Apply');
        const openNormallyLabel =
            vscode.l10n.t('Open Normally');
        const selection =
            await vscode.window.showInformationMessage(
                vscode.l10n.t(
                    'This looks like an AI CHANGE file. Apply it to the current workspace?'
                ),
                {
                    modal: true
                },
                applyLabel,
                openNormallyLabel
            );

        if (selection !== applyLabel) {
            return;
        }

        await vscode.commands.executeCommand(
            'code-bundler.applyChangeBundle',
            document.uri
        );
    }
}

function isChangeFile(
    document: vscode.TextDocument
): boolean {
    if (document.uri.scheme !== 'file') {
        return false;
    }

    const fileName = document.uri.path
        .split('/')
        .pop() ?? '';

    if (!changeFileNamePattern.test(fileName)) {
        return false;
    }

    const text = document.getText();

    return (
        text.includes('<<<BEGIN_CHANGE ') &&
        text.includes('<<<END_CHANGE ')
    );
}
<<<END_CHANGE path="src/changes/changeFileOpenPrompt.ts">>>
<<<BEGIN_CHANGE operation="modify" path="l10n/bundle.l10n.json" original_sha256="2aa201912ecce9af4208512b7493faf8eb8adba5e59a9ada622c473873f466ee">>>
{
  "Please select one or more files or folders first.": "Please select one or more files or folders first.",
  "Please open a workspace folder first.": "Please open a workspace folder first.",
  "Code Bundler is bundling files...": "Code Bundler is bundling files...",
  "Scanning selected files and folders...": "Scanning selected files and folders...",
  "No regular files were scanned.": "No regular files were scanned.",
  "Scanned {0} files, but no text files could be packed.": "Scanned {0} files, but no text files could be packed.",
  "Scanned {0} files, generating AI-friendly format...": "Scanned {0} files, generating AI-friendly format...",
  "Writing {0}...": "Writing {0}...",
  "Copying {0} file to clipboard...": "Copying {0} file to clipboard...",
  "Code Bundler did not complete bundling.": "Code Bundler did not complete bundling.",
  "Reason: {0}": "Reason: {0}",
  "Code Bundler completed bundling.": "Code Bundler completed bundling.",
  "Total scanned files: {0}": "Total scanned files: {0}",
  "Packed files: {0}": "Packed files: {0}",
  "Skipped files: {0}": "Skipped files: {0}",
  "Skipped directories: {0}": "Skipped directories: {0}",
  "Output file: {0}": "Output file: {0}",
  "Output size: {0}": "Output size: {0}",
  "Clipboard status: {0}": "Clipboard status: {0}",
  "the generated txt file has been copied to the system clipboard.": "the generated txt file has been copied to the system clipboard.",
  "Tip: you can now paste the file into another folder with Ctrl+V.": "Tip: you can now paste the file into another folder with Ctrl+V.",
  "Open File": "Open File",
  "Bundle failed: {0}": "Bundle failed: {0}",
  "Select files or folders to bundle": "Select files or folders to bundle",
  "Unable to read file status": "Unable to read file status",
  "Ignored directory": "Ignored directory",
  "Unable to read directory": "Unable to read directory",
  "Not a regular file": "Not a regular file",
  "Ignored file": "Ignored file",
  "Obvious binary file": "Obvious binary file",
  "File is too large, larger than {0}": "File is too large, larger than {0}",
  "Content does not look like a text file": "Content does not look like a text file",
  "Copied to clipboard.": "Copied to clipboard.",
  "The current platform does not support copying file objects to the clipboard.": "The current platform does not support copying file objects to the clipboard.",
  "Select an AI change bundle": "Select an AI change bundle",
  "A change review is already active.": "A change review is already active.",
  "AI changes were applied. You can now run the project, then accept or reject each change.": "AI changes were applied. You can now run the project, then accept or reject each change.",
  "Unable to apply change bundle: {0}": "Unable to apply change bundle: {0}",
  "Change review failed: {0}": "Change review failed: {0}",
  "Added {0} item(s) to the bundle queue.": "Added {0} item(s) to the bundle queue.",
  "Select queued items to remove": "Select queued items to remove",
  "The bundle queue is empty.": "The bundle queue is empty.",
  "Bundle queue cleared.": "Bundle queue cleared.",
  "Bundle Queue: {0}": "Bundle Queue: {0}",
  "Click to manage the bundle queue.": "Click to manage the bundle queue.",
  "Bundle queued items": "Bundle queued items",
  "View or remove queued items": "View or remove queued items",
  "Clear bundle queue": "Clear bundle queue",
  "Choose a bundle queue action": "Choose a bundle queue action",
  "Apply": "Apply",
  "Open Normally": "Open Normally",
  "This looks like an AI CHANGE file. Apply it to the current workspace?": "This looks like an AI CHANGE file. Apply it to the current workspace?"
}
<<<END_CHANGE path="l10n/bundle.l10n.json">>>
<<<BEGIN_CHANGE operation="modify" path="l10n/bundle.l10n.zh-cn.json" original_sha256="e9cbae90b7c9865b1026243868e2595c95053148b09444536acd13a421f0a8e0">>>
{
  "Please select one or more files or folders first.": "请先选择一个或多个文件或文件夹。",
  "Please open a workspace folder first.": "请先打开一个工作区文件夹。",
  "Code Bundler is bundling files...": "Code Bundler 正在打包文件...",
  "Scanning selected files and folders...": "正在扫描选中的文件和文件夹...",
  "No regular files were scanned.": "没有扫描到普通文件。",
  "Scanned {0} files, but no text files could be packed.": "扫描了 {0} 个文件，但没有可打包的文本文件。",
  "Scanned {0} files, generating AI-friendly format...": "已扫描 {0} 个文件，正在生成适合 AI 阅读的格式...",
  "Writing {0}...": "正在写入 {0}...",
  "Copying {0} file to clipboard...": "正在将 {0} 文件复制到剪贴板...",
  "Code Bundler did not complete bundling.": "Code Bundler 未完成打包。",
  "Reason: {0}": "原因：{0}",
  "Code Bundler completed bundling.": "Code Bundler 已完成打包。",
  "Total scanned files: {0}": "扫描文件总数：{0}",
  "Packed files: {0}": "已打包文件：{0}",
  "Skipped files: {0}": "已跳过文件：{0}",
  "Skipped directories: {0}": "已跳过目录：{0}",
  "Output file: {0}": "输出文件：{0}",
  "Output size: {0}": "输出大小：{0}",
  "Clipboard status: {0}": "剪贴板状态：{0}",
  "the generated txt file has been copied to the system clipboard.": "生成的 txt 文件已复制到系统剪贴板。",
  "Tip: you can now paste the file into another folder with Ctrl+V.": "提示：现在可以使用 Ctrl+V 将文件粘贴到其他文件夹。",
  "Open File": "打开文件",
  "Bundle failed: {0}": "打包失败：{0}",
  "Select files or folders to bundle": "选择要打包的文件或文件夹",
  "Unable to read file status": "无法读取文件状态",
  "Ignored directory": "已忽略目录",
  "Unable to read directory": "无法读取目录",
  "Not a regular file": "不是普通文件",
  "Ignored file": "已忽略文件",
  "Obvious binary file": "明显的二进制文件",
  "File is too large, larger than {0}": "文件过大，超过 {0}",
  "Content does not look like a text file": "文件内容看起来不是文本",
  "Copied to clipboard.": "已复制到剪贴板。",
  "The current platform does not support copying file objects to the clipboard.": "当前平台不支持将文件对象复制到剪贴板。",
  "Select an AI change bundle": "选择 AI 变更包",
  "A change review is already active.": "已有一个变更审阅正在进行。",
  "AI changes were applied. You can now run the project, then accept or reject each change.": "AI 变更已应用。你现在可以运行项目，然后接受或拒绝每项变更。",
  "Unable to apply change bundle: {0}": "无法应用变更包：{0}",
  "Change review failed: {0}": "变更审阅失败：{0}",
  "Added {0} item(s) to the bundle queue.": "已将 {0} 个项目添加到待打包队列。",
  "Select queued items to remove": "选择要从待打包队列移除的项目",
  "The bundle queue is empty.": "待打包队列为空。",
  "Bundle queue cleared.": "已清空待打包队列。",
  "Bundle Queue: {0}": "待打包：{0}",
  "Click to manage the bundle queue.": "点击管理待打包队列。",
  "Bundle queued items": "打包队列中的项目",
  "View or remove queued items": "查看或移除队列项目",
  "Clear bundle queue": "清空待打包队列",
  "Choose a bundle queue action": "选择待打包队列操作",
  "Apply": "应用",
  "Open Normally": "正常打开",
  "This looks like an AI CHANGE file. Apply it to the current workspace?": "这看起来是一个 AI CHANGE 文件。是否将它应用到当前工作区？"
}
<<<END_CHANGE path="l10n/bundle.l10n.zh-cn.json">>>
<<<BEGIN_CHANGE operation="modify" path="l10n/bundle.l10n.ja.json" original_sha256="53a3bd6dcd9a7382062242266b045c91eaa9b74f6f66c1a7d638c44c4be77cac">>>
{
  "Please select one or more files or folders first.": "最初に1つ以上のファイルまたはフォルダーを選択してください。",
  "Please open a workspace folder first.": "最初にワークスペースフォルダーを開いてください。",
  "Code Bundler is bundling files...": "Code Bundler がファイルをまとめています...",
  "Scanning selected files and folders...": "選択したファイルとフォルダーをスキャンしています...",
  "No regular files were scanned.": "通常のファイルはスキャンされませんでした。",
  "Scanned {0} files, but no text files could be packed.": "{0} 個のファイルをスキャンしましたが、パック可能なテキストファイルはありませんでした。",
  "Scanned {0} files, generating AI-friendly format...": "{0} 個のファイルをスキャンしました。AI 向けの形式を生成しています...",
  "Writing {0}...": "{0} を書き込んでいます...",
  "Copying {0} file to clipboard...": "{0} ファイルをクリップボードにコピーしています...",
  "Code Bundler did not complete bundling.": "Code Bundler のバンドルは完了しませんでした。",
  "Reason: {0}": "理由: {0}",
  "Code Bundler completed bundling.": "Code Bundler のバンドルが完了しました。",
  "Total scanned files: {0}": "スキャンしたファイル数: {0}",
  "Packed files: {0}": "パックしたファイル数: {0}",
  "Skipped files: {0}": "スキップしたファイル数: {0}",
  "Skipped directories: {0}": "スキップしたディレクトリ数: {0}",
  "Output file: {0}": "出力ファイル: {0}",
  "Output size: {0}": "出力サイズ: {0}",
  "Clipboard status: {0}": "クリップボードの状態: {0}",
  "the generated txt file has been copied to the system clipboard.": "生成された txt ファイルはシステムクリップボードにコピーされました。",
  "Tip: you can now paste the file into another folder with Ctrl+V.": "ヒント: Ctrl+V で別のフォルダーにファイルを貼り付けできます。",
  "Open File": "ファイルを開く",
  "Bundle failed: {0}": "バンドルに失敗しました: {0}",
  "Select files or folders to bundle": "まとめるファイルまたはフォルダーを選択",
  "Unable to read file status": "ファイルの状態を読み取れません",
  "Ignored directory": "無視されたディレクトリ",
  "Unable to read directory": "ディレクトリを読み取れません",
  "Not a regular file": "通常のファイルではありません",
  "Ignored file": "無視されたファイル",
  "Obvious binary file": "明らかなバイナリファイル",
  "File is too large, larger than {0}": "ファイルが大きすぎます。{0} を超えています",
  "Content does not look like a text file": "内容がテキストファイルのように見えません",
  "Copied to clipboard.": "クリップボードにコピーしました。",
  "The current platform does not support copying file objects to the clipboard.": "現在のプラットフォームでは、ファイルオブジェクトをクリップボードにコピーできません。",
  "Select an AI change bundle": "AI 変更バンドルを選択",
  "A change review is already active.": "変更レビューがすでに実行中です。",
  "AI changes were applied. You can now run the project, then accept or reject each change.": "AI の変更が適用されました。プロジェクトを実行した後、各変更を承認または拒否できます。",
  "Unable to apply change bundle: {0}": "変更バンドルを適用できませんでした: {0}",
  "Change review failed: {0}": "変更レビューに失敗しました: {0}",
  "Added {0} item(s) to the bundle queue.": "{0} 個の項目をバンドルキューに追加しました。",
  "Select queued items to remove": "バンドルキューから削除する項目を選択",
  "The bundle queue is empty.": "バンドルキューは空です。",
  "Bundle queue cleared.": "バンドルキューをクリアしました。",
  "Bundle Queue: {0}": "バンドルキュー: {0}",
  "Click to manage the bundle queue.": "クリックしてバンドルキューを管理します。",
  "Bundle queued items": "キュー内の項目をバンドル",
  "View or remove queued items": "キュー内の項目を表示または削除",
  "Clear bundle queue": "バンドルキューをクリア",
  "Choose a bundle queue action": "バンドルキューの操作を選択",
  "Apply": "適用",
  "Open Normally": "通常どおり開く",
  "This looks like an AI CHANGE file. Apply it to the current workspace?": "AI CHANGE ファイルのようです。現在のワークスペースに適用しますか？"
}
<<<END_CHANGE path="l10n/bundle.l10n.ja.json">>>
