Merge branch 'chat-messages' of https://github.com/runjinz/devchat-vscode into chat-messages
This commit is contained in:
commit
b405e41ebf
@ -32,7 +32,7 @@ function initClipboard(codeBlocks, onApplyButtonClick, onApplyCodeButtonClick, o
|
||||
// Add 'Apply' button
|
||||
const applyButton = document.createElement('button');
|
||||
applyButton.classList.add('apply-button');
|
||||
applyButton.innerText = 'Apply Patch';
|
||||
applyButton.innerText = 'Show Diff';
|
||||
block.appendChild(applyButton);
|
||||
|
||||
applyButton.addEventListener('click', () => {
|
||||
|
@ -1 +0,0 @@
|
||||
You are a software developer assistant.
|
35
package.json
35
package.json
@ -18,6 +18,41 @@
|
||||
"README.md"
|
||||
],
|
||||
"contributes": {
|
||||
"configuration": {
|
||||
"title": "DevChat",
|
||||
"properties": {
|
||||
"DevChat.llmModel": {
|
||||
"type": "string",
|
||||
"default": "OpenAI",
|
||||
"enum": ["OpenAI"],
|
||||
"description": "Select whose llm to use."
|
||||
},
|
||||
"DevChat.OpenAI.model": {
|
||||
"type": "string",
|
||||
"default": "gpt-4",
|
||||
"description": "Specify llm model",
|
||||
"when": "DevChat.llmModel == 'OpenAI'"
|
||||
},
|
||||
"DevChat.OpenAI.temperature": {
|
||||
"type": "number",
|
||||
"default": 0.2,
|
||||
"description": "Specify llm temperature",
|
||||
"when": "DevChat.llmModel == 'OpenAI'"
|
||||
},
|
||||
"DevChat.OpenAI.stream": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Specify llm stream",
|
||||
"when": "DevChat.llmModel == 'OpenAI'"
|
||||
},
|
||||
"DevChat.OpenAI.apiKey": {
|
||||
"type": "string",
|
||||
"default": "",
|
||||
"description": "Open API Key",
|
||||
"when": "DevChat.llmModel == 'OpenAI'"
|
||||
}
|
||||
}
|
||||
},
|
||||
"views": {
|
||||
"explorer": [
|
||||
{
|
||||
|
@ -1,4 +1,6 @@
|
||||
const vscode = require('vscode');
|
||||
import * as path from 'path';
|
||||
import { createTempSubdirectory } from './commonUtil';
|
||||
|
||||
|
||||
export async function applyCodeFile(text: string) {
|
||||
@ -23,7 +25,7 @@ export async function applyCodeFile(text: string) {
|
||||
});
|
||||
}
|
||||
|
||||
async function applyCode(text: string) {
|
||||
export async function applyCode(text: string) {
|
||||
if (vscode.window.visibleTextEditors.length > 1) {
|
||||
vscode.window.showErrorMessage(`There are more then one visible text editors. Please close all but one and try again.`);
|
||||
return;
|
||||
@ -43,4 +45,43 @@ async function applyCode(text: string) {
|
||||
});
|
||||
}
|
||||
|
||||
export default applyCode;
|
||||
export async function diffView(code: string) {
|
||||
if (vscode.window.visibleTextEditors.length > 1) {
|
||||
vscode.window.showErrorMessage(`There are more then one visible text editors. Please close all but one and try again.`);
|
||||
return;
|
||||
}
|
||||
|
||||
const editor = vscode.window.visibleTextEditors[0];
|
||||
if (!editor) {
|
||||
return;
|
||||
}
|
||||
|
||||
const selectedText = editor.document.getText(editor.selection);
|
||||
|
||||
const curFile = editor.document.fileName;
|
||||
|
||||
// get file name from fileSelected
|
||||
const fileName = path.basename(curFile);
|
||||
|
||||
// create temp directory and file
|
||||
const tempDir = await createTempSubdirectory('devchat/context');
|
||||
const tempFile = path.join(tempDir, fileName);
|
||||
|
||||
// save code to temp file
|
||||
await vscode.workspace.fs.writeFile(vscode.Uri.file(tempFile), Buffer.from(code));
|
||||
|
||||
if (selectedText) {
|
||||
// create temp directory and file
|
||||
const tempDir = await createTempSubdirectory('devchat/context');
|
||||
const tempSelectCodeFile = path.join(tempDir, fileName);
|
||||
|
||||
// save code to temp file
|
||||
await vscode.workspace.fs.writeFile(vscode.Uri.file(tempSelectCodeFile), Buffer.from(selectedText));
|
||||
|
||||
// open diff view
|
||||
vscode.commands.executeCommand('vscode.diff', vscode.Uri.file(tempSelectCodeFile), vscode.Uri.file(tempFile), 'Diff View');
|
||||
} else {
|
||||
// open diff view
|
||||
vscode.commands.executeCommand('vscode.diff', vscode.Uri.file(curFile), vscode.Uri.file(tempFile), 'Diff View');
|
||||
}
|
||||
}
|
||||
|
@ -44,15 +44,22 @@ async function writeDiffFile(diff_file: string) {
|
||||
|
||||
export const commitMessageCommand: Command = {
|
||||
name: 'commitMessageCommand',
|
||||
pattern: 'git: commit message',
|
||||
pattern: 'commit_meesage',
|
||||
description: 'commit message for changes',
|
||||
handler: async (userInput: string) => {
|
||||
const tempDir = createTempSubdirectory('devchat/context');
|
||||
|
||||
// 创建临时目录
|
||||
const diff_file = path.join(tempDir, 'diff_output.txt');
|
||||
await writeDiffFile(diff_file);
|
||||
// // 创建临时目录
|
||||
// const diff_file = path.join(tempDir, 'diff_output.txt');
|
||||
// await writeDiffFile(diff_file);
|
||||
|
||||
return `[context|${diff_file}] Write a commit message`;
|
||||
// return `[context|${diff_file}] Write a commit message`;
|
||||
|
||||
const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
|
||||
if (workspaceDir) {
|
||||
const commitmessageInstruction = path.join(workspaceDir, '.chat', 'instructions', 'commit_message', 'instCommitMessage.txt');
|
||||
return `[instruction|${commitmessageInstruction}] Write a commit message`;
|
||||
}
|
||||
return 'Write a commit message';
|
||||
},
|
||||
};
|
||||
|
@ -5,6 +5,7 @@ import { promisify } from "util";
|
||||
import * as vscode from 'vscode';
|
||||
import * as dotenv from 'dotenv';
|
||||
import * as path from 'path';
|
||||
import * as fs from 'fs';
|
||||
|
||||
const spawnAsync = async (command: string, args: string[], options: any, onData: (data: string) => void): Promise<{code: number, stdout: string; stderr: string }> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -82,7 +83,28 @@ class DevChat {
|
||||
args.push(content)
|
||||
|
||||
const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
|
||||
const openaiApiKey = process.env.OPENAI_API_KEY;
|
||||
// const openaiApiKey = process.env.OPENAI_API_KEY;
|
||||
|
||||
const openaiApiKey = vscode.workspace.getConfiguration('DevChat').get('OpenAI.apiKey');
|
||||
|
||||
const openaiModel = vscode.workspace.getConfiguration('DevChat').get('OpenAI.model');
|
||||
const openaiTemperature = vscode.workspace.getConfiguration('DevChat').get('OpenAI.temperature');
|
||||
const openaiStream = vscode.workspace.getConfiguration('DevChat').get('OpenAI.stream');
|
||||
const llmModel = vscode.workspace.getConfiguration('DevChat').get('llmModel');
|
||||
|
||||
const devchatConfig = {
|
||||
llm: llmModel,
|
||||
OpenAI: {
|
||||
model: openaiModel,
|
||||
temperature: openaiTemperature,
|
||||
stream: openaiStream
|
||||
}
|
||||
}
|
||||
// write to config file
|
||||
const configPath = path.join(workspaceDir!, '.chatconfig.json');
|
||||
// write devchatConfig to configPath
|
||||
const configJson = JSON.stringify(devchatConfig, null, 2);
|
||||
fs.writeFileSync(configPath, configJson);
|
||||
|
||||
try {
|
||||
const {code, stdout, stderr } = await spawnAsync('devchat', args, {
|
||||
|
@ -6,7 +6,7 @@ import * as path from 'path';
|
||||
import { promisify } from 'util';
|
||||
import DevChat, { LogOptions } from './devchat';
|
||||
import DtmWrapper from './dtm';
|
||||
import applyCode, {applyCodeFile} from './applyCode';
|
||||
import {applyCodeFile, diffView, applyCode} from './applyCode';
|
||||
|
||||
import './loadCommands';
|
||||
import './loadContexts'
|
||||
@ -87,7 +87,7 @@ function getInstructionFiles(): string[] {
|
||||
const instructionFiles: string[] = [];
|
||||
const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
|
||||
if (workspaceDir) {
|
||||
const chatInstructionsPath = path.join(workspaceDir, '.chat', 'instructions');
|
||||
const chatInstructionsPath = path.join(workspaceDir, '.chat', 'instructions', 'default');
|
||||
try {
|
||||
// 读取 chatInstructionsPath 目录下的所有文件和目录
|
||||
const files = fs.readdirSync(chatInstructionsPath);
|
||||
@ -126,6 +126,9 @@ async function handleMessage(
|
||||
}
|
||||
|
||||
chatOptions.header = getInstructionFiles();
|
||||
if (parsedMessage.instruction.length > 0) {
|
||||
chatOptions.header = parsedMessage.instruction;
|
||||
}
|
||||
|
||||
if (parsedMessage.reference.length > 0) {
|
||||
chatOptions.reference = parsedMessage.reference;
|
||||
@ -147,20 +150,12 @@ async function handleMessage(
|
||||
const logEntries = await devChat.log(logOptions);
|
||||
panel.webview.postMessage({ command: 'loadHistoryMessages', entries: logEntries });
|
||||
return;
|
||||
case 'show_diff':
|
||||
diffView(message.content);
|
||||
return;
|
||||
// TODO: remove block_apply
|
||||
case 'block_apply':
|
||||
const tempPatchFile = await saveTempPatchFile(message.content);
|
||||
try {
|
||||
const patchResult = await dtmWrapper.patch(tempPatchFile);
|
||||
await deleteTempPatchFile(tempPatchFile);
|
||||
if (patchResult.status === 0) {
|
||||
vscode.window.showInformationMessage('Patch applied successfully.');
|
||||
} else {
|
||||
vscode.window.showErrorMessage(`Error applying patch: ${patchResult.message} ${patchResult.log}`);
|
||||
}
|
||||
} catch (error) {
|
||||
await deleteTempPatchFile(tempPatchFile);
|
||||
vscode.window.showErrorMessage(`Error applying patch: ${error}`);
|
||||
}
|
||||
diffView(message.content);
|
||||
return;
|
||||
case 'code_apply':
|
||||
await applyCode(message.content);
|
||||
|
Loading…
x
Reference in New Issue
Block a user