mirror of
https://github.com/cjo4m06/mcp-shrimp-task-manager.git
synced 2025-07-26 07:52:25 +08:00
移除無用程式
This commit is contained in:
parent
04f55cb2e3
commit
ea40e782b3
@ -1,43 +0,0 @@
|
||||
// 任務狀態枚舉:定義任務在工作流程中的當前階段
|
||||
export var TaskStatus;
|
||||
(function (TaskStatus) {
|
||||
TaskStatus["PENDING"] = "\u5F85\u8655\u7406";
|
||||
TaskStatus["IN_PROGRESS"] = "\u9032\u884C\u4E2D";
|
||||
TaskStatus["COMPLETED"] = "\u5DF2\u5B8C\u6210";
|
||||
TaskStatus["BLOCKED"] = "\u88AB\u963B\u64CB";
|
||||
})(TaskStatus || (TaskStatus = {}));
|
||||
// 相關文件類型:定義文件與任務的關係類型
|
||||
export var RelatedFileType;
|
||||
(function (RelatedFileType) {
|
||||
RelatedFileType["TO_MODIFY"] = "\u5F85\u4FEE\u6539";
|
||||
RelatedFileType["REFERENCE"] = "\u53C3\u8003\u8CC7\u6599";
|
||||
RelatedFileType["OUTPUT"] = "\u8F38\u51FA\u7D50\u679C";
|
||||
RelatedFileType["DEPENDENCY"] = "\u4F9D\u8CF4\u6587\u4EF6";
|
||||
RelatedFileType["OTHER"] = "\u5176\u4ED6";
|
||||
})(RelatedFileType || (RelatedFileType = {}));
|
||||
// 任務複雜度級別:定義任務的複雜程度分類
|
||||
export var TaskComplexityLevel;
|
||||
(function (TaskComplexityLevel) {
|
||||
TaskComplexityLevel["LOW"] = "\u4F4E\u8907\u96DC\u5EA6";
|
||||
TaskComplexityLevel["MEDIUM"] = "\u4E2D\u7B49\u8907\u96DC\u5EA6";
|
||||
TaskComplexityLevel["HIGH"] = "\u9AD8\u8907\u96DC\u5EA6";
|
||||
TaskComplexityLevel["VERY_HIGH"] = "\u6975\u9AD8\u8907\u96DC\u5EA6";
|
||||
})(TaskComplexityLevel || (TaskComplexityLevel = {}));
|
||||
// 任務複雜度閾值:定義任務複雜度評估的參考標準
|
||||
export const TaskComplexityThresholds = {
|
||||
DESCRIPTION_LENGTH: {
|
||||
MEDIUM: 500, // 超過此字數判定為中等複雜度
|
||||
HIGH: 1000, // 超過此字數判定為高複雜度
|
||||
VERY_HIGH: 2000, // 超過此字數判定為極高複雜度
|
||||
},
|
||||
DEPENDENCIES_COUNT: {
|
||||
MEDIUM: 2, // 超過此依賴數量判定為中等複雜度
|
||||
HIGH: 5, // 超過此依賴數量判定為高複雜度
|
||||
VERY_HIGH: 10, // 超過此依賴數量判定為極高複雜度
|
||||
},
|
||||
NOTES_LENGTH: {
|
||||
MEDIUM: 200, // 超過此字數判定為中等複雜度
|
||||
HIGH: 500, // 超過此字數判定為高複雜度
|
||||
VERY_HIGH: 1000, // 超過此字數判定為極高複雜度
|
||||
},
|
||||
};
|
@ -92,6 +92,3 @@ export interface TaskComplexityAssessment {
|
||||
};
|
||||
recommendations: string[]; // 處理建議列表
|
||||
}
|
||||
|
||||
// 思維鏈資料結構
|
||||
export * from "./thoughtChain.js";
|
||||
|
@ -1,34 +0,0 @@
|
||||
/**
|
||||
* 思維鏈資料結構定義
|
||||
*
|
||||
* 此文件定義了思維鏈工具所需的核心資料結構,僅包含處理單一思維所需的介面,
|
||||
* 不包含儲存歷史記錄的功能。設計符合現有專案架構風格。
|
||||
*/
|
||||
|
||||
/**
|
||||
* 思維階段枚舉:定義思考過程中的不同階段
|
||||
*/
|
||||
export enum ThoughtStage {
|
||||
PROBLEM_DEFINITION = "問題定義", // 定義問題和目標的階段
|
||||
COLLECT_INFORMATION = "收集資訊", // 收集和分析資訊的階段
|
||||
RESEARCH = "研究", // 研究資訊的階段
|
||||
ANALYSIS = "分析", // 深入解析問題和可能解決方案的階段
|
||||
SYNTHESIS = "綜合", // 整合分析結果形成方案的階段
|
||||
CONCLUSION = "結論", // 總結思考過程並提出最終解決方案的階段
|
||||
QUESTIONING = "質疑", // 質疑和批判的階段
|
||||
PLANNING = "規劃", // 規劃和計劃的階段
|
||||
}
|
||||
|
||||
/**
|
||||
* 思維資料介面:定義思維的完整資料結構
|
||||
*/
|
||||
export interface ThoughtData {
|
||||
thought: string; // 思維內容(字串)
|
||||
thoughtNumber: number; // 當前思維編號(數字)
|
||||
totalThoughts: number; // 預估總思維數量(數字)
|
||||
nextThoughtNeeded: boolean; // 是否需要更多思維(布林值)
|
||||
stage: string; // 思維階段(字串,如「問題定義」、「研究」、「分析」、「綜合」、「結論」、「質疑」)
|
||||
tags?: string[]; // 可選的思維關鍵詞或分類(字串陣列)
|
||||
axioms_used?: string[]; // 可選的此思維中使用的原則或公理(字串陣列)
|
||||
assumptions_challenged?: string[]; // 可選的此思維挑戰的假設(字串陣列)
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
import { RelatedFileType } from "../types/index.js";
|
||||
/**
|
||||
* 生成任務相關文件的內容摘要
|
||||
*
|
||||
* 此函數根據提供的 RelatedFile 物件列表,生成文件的摘要信息,而不實際讀取檔案內容。
|
||||
* 這是一個輕量級的實現,僅基於檔案元數據(如路徑、類型、描述等)生成格式化的摘要,
|
||||
* 適用於需要提供文件上下文信息但不需要訪問實際檔案內容的情境。
|
||||
*
|
||||
* @param relatedFiles 相關文件列表 - RelatedFile 物件數組,包含文件的路徑、類型、描述等資訊
|
||||
* @param maxTotalLength 摘要內容的最大總長度 - 控制生成摘要的總字符數,避免過大的返回內容
|
||||
* @returns 格式化的文件摘要資訊
|
||||
*/
|
||||
export async function loadTaskRelatedFiles(
|
||||
relatedFiles,
|
||||
maxTotalLength = 15000 // 控制生成內容的總長度
|
||||
) {
|
||||
if (!relatedFiles || relatedFiles.length === 0) {
|
||||
return "## 相關文件\n\n無相關文件";
|
||||
}
|
||||
|
||||
let filesSummary = `## 相關文件內容摘要 (共 ${relatedFiles.length} 個文件)\n\n`;
|
||||
let totalLength = 0;
|
||||
|
||||
// 按文件類型優先級排序(首先處理待修改的文件)
|
||||
const priorityOrder = {
|
||||
[RelatedFileType.TO_MODIFY]: 1,
|
||||
[RelatedFileType.REFERENCE]: 2,
|
||||
[RelatedFileType.DEPENDENCY]: 3,
|
||||
[RelatedFileType.OUTPUT]: 4,
|
||||
[RelatedFileType.OTHER]: 5,
|
||||
};
|
||||
|
||||
const sortedFiles = [...relatedFiles].sort(
|
||||
(a, b) => priorityOrder[a.type] - priorityOrder[b.type]
|
||||
);
|
||||
|
||||
// 處理每個文件
|
||||
for (const file of sortedFiles) {
|
||||
if (totalLength >= maxTotalLength) {
|
||||
filesSummary += `\n### 已達到上下文長度限制,部分文件未載入\n`;
|
||||
break;
|
||||
}
|
||||
|
||||
// 生成文件基本資訊
|
||||
const fileInfo = generateFileInfo(file);
|
||||
|
||||
// 添加到總內容
|
||||
const fileHeader = `\n### ${file.type}: ${file.path}${
|
||||
file.description ? ` - ${file.description}` : ""
|
||||
}${
|
||||
file.lineStart && file.lineEnd
|
||||
? ` (行 ${file.lineStart}-${file.lineEnd})`
|
||||
: ""
|
||||
}\n\n`;
|
||||
|
||||
filesSummary += fileHeader + "```\n" + fileInfo + "\n```\n\n";
|
||||
totalLength += fileInfo.length + fileHeader.length + 8; // 8 for "```\n" and "\n```"
|
||||
}
|
||||
|
||||
return filesSummary;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成文件基本資訊摘要
|
||||
*
|
||||
* 根據檔案的元數據生成格式化的資訊摘要,包含檔案路徑、類型和相關提示。
|
||||
* 不讀取實際檔案內容,僅基於提供的 RelatedFile 物件生成信息。
|
||||
*
|
||||
* @param file 相關文件物件 - 包含檔案路徑、類型、描述等基本資訊
|
||||
* @returns 格式化的檔案資訊摘要文字
|
||||
*/
|
||||
function generateFileInfo(file) {
|
||||
let fileInfo = `檔案: ${file.path}\n`;
|
||||
fileInfo += `類型: ${file.type}\n`;
|
||||
if (file.description) {
|
||||
fileInfo += `描述: ${file.description}\n`;
|
||||
}
|
||||
if (file.lineStart && file.lineEnd) {
|
||||
fileInfo += `行範圍: ${file.lineStart}-${file.lineEnd}\n`;
|
||||
}
|
||||
fileInfo += `若需查看實際內容,請直接查看檔案: ${file.path}\n`;
|
||||
|
||||
return fileInfo;
|
||||
}
|
@ -1,266 +0,0 @@
|
||||
/**
|
||||
* 摘要提取工具:從對話內容中提取關鍵信息
|
||||
*
|
||||
* 本模塊提供從完整對話中提取關鍵信息的功能,使用多種策略來識別重要內容:
|
||||
* 1. 關鍵詞匹配:識別含有特定關鍵詞的句子
|
||||
* 2. 句子重要性評分:基於位置、長度等因素評估句子重要性
|
||||
* 3. 上下文關聯:考慮句子間的邏輯關聯
|
||||
*/
|
||||
|
||||
// 定義關鍵詞與其權重
|
||||
const KEYWORDS = {
|
||||
// 任務相關
|
||||
任務: 1.5,
|
||||
功能: 1.3,
|
||||
實現: 1.3,
|
||||
開發: 1.3,
|
||||
完成: 1.2,
|
||||
執行: 1.2,
|
||||
驗證: 1.2,
|
||||
錯誤: 1.5,
|
||||
問題: 1.5,
|
||||
修復: 1.5,
|
||||
失敗: 1.8,
|
||||
成功: 1.5,
|
||||
依賴: 1.2,
|
||||
阻擋: 1.4,
|
||||
風險: 1.4,
|
||||
優化: 1.3,
|
||||
改進: 1.3,
|
||||
|
||||
// 決策相關
|
||||
決定: 1.6,
|
||||
選擇: 1.5,
|
||||
決策: 1.6,
|
||||
方案: 1.5,
|
||||
架構: 1.5,
|
||||
設計: 1.4,
|
||||
結構: 1.4,
|
||||
|
||||
// 技術相關
|
||||
代碼: 1.3,
|
||||
測試: 1.3,
|
||||
函數: 1.2,
|
||||
接口: 1.2,
|
||||
類型: 1.2,
|
||||
模塊: 1.2,
|
||||
組件: 1.2,
|
||||
數據: 1.3,
|
||||
文件: 1.2,
|
||||
路徑: 1.1,
|
||||
|
||||
// 系統狀態
|
||||
狀態: 1.3,
|
||||
啟動: 1.3,
|
||||
停止: 1.3,
|
||||
創建: 1.3,
|
||||
刪除: 1.4,
|
||||
更新: 1.3,
|
||||
查詢: 1.2,
|
||||
|
||||
// 負面信息(需要重點關注)
|
||||
警告: 1.8,
|
||||
異常: 1.8,
|
||||
崩潰: 2.0,
|
||||
嚴重: 1.8,
|
||||
危險: 1.8,
|
||||
緊急: 1.9,
|
||||
};
|
||||
|
||||
/**
|
||||
* 從文本中提取簡短摘要
|
||||
* @param text 要提取摘要的文本
|
||||
* @param maxLength 摘要的最大長度
|
||||
* @returns 提取的摘要文本
|
||||
*/
|
||||
export function extractSummary(text: string, maxLength: number = 100): string {
|
||||
if (!text) return "";
|
||||
|
||||
// 移除 Markdown 格式
|
||||
const plainText = text
|
||||
.replace(/```[\s\S]*?```/g, "") // 移除代碼塊
|
||||
.replace(/#+\s/g, "") // 移除標題標記
|
||||
.replace(/\*\*/g, "") // 移除粗體標記
|
||||
.replace(/\*/g, "") // 移除斜體標記
|
||||
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // 將連結替換為文本
|
||||
.replace(/\n/g, " ") // 將換行符替換為空格
|
||||
.replace(/\s+/g, " ") // 將多個空格替換為單個空格
|
||||
.trim();
|
||||
|
||||
// 如果文本長度在允許範圍內,直接返回
|
||||
if (plainText.length <= maxLength) {
|
||||
return plainText;
|
||||
}
|
||||
|
||||
// 取前段並添加省略號
|
||||
return plainText.substring(0, maxLength - 3) + "...";
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成任務完成摘要
|
||||
* @param taskName 任務名稱
|
||||
* @param taskDescription 任務描述
|
||||
* @param completionDetails 完成細節(可選)
|
||||
* @returns 生成的任務摘要
|
||||
*/
|
||||
export function generateTaskSummary(
|
||||
taskName: string,
|
||||
taskDescription: string,
|
||||
completionDetails?: string
|
||||
): string {
|
||||
// 如果提供了完成細節,優先使用
|
||||
if (completionDetails) {
|
||||
return extractSummary(completionDetails, 250);
|
||||
}
|
||||
|
||||
// 否則從任務名稱和描述生成摘要
|
||||
const baseText = `${taskName}已成功完成。該任務涉及${extractSummary(
|
||||
taskDescription,
|
||||
200
|
||||
)}`;
|
||||
return extractSummary(baseText, 250);
|
||||
}
|
||||
|
||||
/**
|
||||
* 將文本分割為句子
|
||||
*
|
||||
* @param text 要分割的文本
|
||||
* @returns 句子數組
|
||||
*/
|
||||
function splitIntoSentences(text: string): string[] {
|
||||
// 使用正則表達式分割句子
|
||||
// 匹配中文和英文的句號、問號、驚嘆號,以及換行符
|
||||
const sentenceSplitters = /(?<=[。.!!??\n])\s*/g;
|
||||
const sentences = text
|
||||
.split(sentenceSplitters)
|
||||
.filter((s) => s.trim().length > 0);
|
||||
|
||||
return sentences;
|
||||
}
|
||||
|
||||
/**
|
||||
* 為句子評分,決定其在摘要中的重要性
|
||||
*
|
||||
* @param sentence 要評分的句子
|
||||
* @param index 句子在原文中的位置索引
|
||||
* @param totalSentences 原文中的總句子數
|
||||
* @returns 句子的重要性評分
|
||||
*/
|
||||
function scoreSentence(
|
||||
sentence: string,
|
||||
index: number,
|
||||
totalSentences: number
|
||||
): number {
|
||||
let score = 1.0;
|
||||
|
||||
// 位置因素:文檔開頭和結尾的句子通常更重要
|
||||
if (index === 0 || index === totalSentences - 1) {
|
||||
score *= 1.5;
|
||||
} else if (
|
||||
index < Math.ceil(totalSentences * 0.2) ||
|
||||
index >= Math.floor(totalSentences * 0.8)
|
||||
) {
|
||||
score *= 1.25;
|
||||
}
|
||||
|
||||
// 句子長度因素:過短的句子可能信息量較少,過長的句子可能包含太多信息
|
||||
const wordCount = sentence.split(/\s+/).length;
|
||||
if (wordCount < 3) {
|
||||
score *= 0.8;
|
||||
} else if (wordCount > 25) {
|
||||
score *= 0.9;
|
||||
} else if (wordCount >= 5 && wordCount <= 15) {
|
||||
score *= 1.2;
|
||||
}
|
||||
|
||||
// 關鍵詞因素:包含關鍵詞的句子更重要
|
||||
for (const [keyword, weight] of Object.entries(KEYWORDS)) {
|
||||
if (sentence.includes(keyword)) {
|
||||
score *= weight;
|
||||
}
|
||||
}
|
||||
|
||||
// 句子結構因素:特殊句式可能更重要
|
||||
if (
|
||||
sentence.includes("總結") ||
|
||||
sentence.includes("結論") ||
|
||||
sentence.includes("因此") ||
|
||||
sentence.includes("所以")
|
||||
) {
|
||||
score *= 1.5;
|
||||
}
|
||||
|
||||
// 數字和專有名詞因素:包含數字和專有名詞的句子通常更重要
|
||||
if (/\d+/.test(sentence)) {
|
||||
score *= 1.3;
|
||||
}
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
/**
|
||||
* 從指定內容中提取一個簡短標題
|
||||
*
|
||||
* @param content 要提取標題的內容
|
||||
* @param maxLength 標題的最大長度
|
||||
* @returns 提取的標題
|
||||
*/
|
||||
export function extractTitle(content: string, maxLength: number = 50): string {
|
||||
// 防禦性檢查
|
||||
if (!content || content.trim().length === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// 分割為句子
|
||||
const sentences = splitIntoSentences(content);
|
||||
if (sentences.length === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// 先考慮第一個句子
|
||||
let title = sentences[0];
|
||||
|
||||
// 如果第一個句子太長,找到第一個逗號或其他分隔符截斷
|
||||
if (title.length > maxLength) {
|
||||
const firstPart = title.split(/[,,::]/)[0];
|
||||
if (firstPart && firstPart.length < maxLength) {
|
||||
title = firstPart;
|
||||
} else {
|
||||
title = title.substring(0, maxLength - 3) + "...";
|
||||
}
|
||||
}
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* 基於對話上下文智能提取摘要
|
||||
*
|
||||
* @param messages 對話消息列表,每條消息包含角色和內容
|
||||
* @param maxLength 摘要的最大長度
|
||||
* @returns 提取的摘要
|
||||
*/
|
||||
export function extractSummaryFromConversation(
|
||||
messages: Array<{ role: string; content: string }>,
|
||||
maxLength: number = 200
|
||||
): string {
|
||||
// 防禦性檢查
|
||||
if (!messages || messages.length === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// 如果只有一條消息,直接提取其摘要
|
||||
if (messages.length === 1) {
|
||||
return extractSummary(messages[0].content, maxLength);
|
||||
}
|
||||
|
||||
// 連接所有消息,但保留角色信息
|
||||
const combinedText = messages
|
||||
.map((msg) => `${msg.role}: ${msg.content}`)
|
||||
.join("\n");
|
||||
|
||||
// 從組合文本提取摘要
|
||||
const summary = extractSummary(combinedText, maxLength);
|
||||
|
||||
return summary;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user