@@ -138,8 +138,32 @@ export class Cvb {
138138CVB 格式介绍:
139139- 文件以 "## BEGIN_CVB" 开头,以 "## END_CVB" 结尾。
140140- 元数据部分以 "## META" 开头,以 "## END_META" 结尾,包含用户需求和时间戳。
141- - 每个文件以 "## FILE:文件路径" 开头,紧接着是 Markdown 格式的代码块,包含文件内容 。
141+ - 每个文件以 "## FILE:文件路径" 开头,紧接着是 Markdown 格式的代码块,也就是一定要用 \`\`\` 包裹文件内容 。
142142- 多个文件按顺序拼接在一起。
143+ - 所有 ## 开头的指令提示符前面都不能有空格,必须在行首
144+ 例子:
145+ ## BEGIN_CVB
146+ ## META
147+ 需求: 代码重构
148+ 时间戳: 2025-02-26 12:34:56
149+ ## END_META
150+
151+ ## FILE: /src/main.cpp
152+ \`\`\`c++
153+ #include <iostream>
154+ int main() {
155+ std::cout << "Hello, world!" << std::endl;
156+ return 0;
157+ }
158+ \`\`\`
159+ ## FILE: /src/utils.cpp
160+ \`\`\`c++
161+ #include <cmath>
162+ double add(double a, double b) {
163+ return a + b;
164+ }
165+ \`\`\`
166+ ## END_CVB
143167` ;
144168 }
145169}
@@ -414,44 +438,158 @@ export class TCVB {
414438 return `
415439TCVB 格式规范:
416440
417- ## BEGIN_TCVB
418- [文件块1]
419- [文件块2]
420- ...
421- ## END_TCVB
441+ ## BEGIN_TCVB
442+ [文件块1]
443+ [文件块2]
444+ ...
445+ ## END_TCVB
422446
423- 文件块格式:
424- ## FILE:<文件绝对路径>
425- [操作1]
426- [操作2]
427- ...
447+ 文件块格式:
448+ ## FILE:<文件绝对路径>
449+ [操作1]
450+ [操作2]
451+ ...
428452
429453操作类型:
430454
431- 1. 全局替换操作(GLOBAL-REPLACE):
432- ## OPERATION:GLOBAL-REPLACE
433- ## OLD_CONTENT
434- [markdown代码块:被全局替换的内容, 可以在需要被替换的文本前后包含一些上下文帮助精确替换,一般是上下各3行。不要太长,不要带太多不必要的上下文,因为输出越长就越可能出错导致匹配不上。总长度不要超过10行,尽量不要大块的替换代码,而是切成很多小块替换。]
435- ## NEW_CONTENT
436- [markdown代码块:新内容]
455+ 1. **全局替换操作(GLOBAL-REPLACE)**:
456+ - 适用于需要在文件中替换某一段内容的情况。
457+ - 提供被替换的旧内容(OLD_CONTENT)和新的替换内容(NEW_CONTENT)。
458+ - 内容应尽量保持简洁,避免过长的上下文。上下文一般保留前后3行,可以根据需要增加,但总长度不要超过10行,避免出错。
459+ - 替换操作中的内容需要完整包含在三个反引号(\`\`\`)包裹的代码块中。
460+
461+ 示例:
462+ ## OPERATION:GLOBAL-REPLACE
463+ ## OLD_CONTENT
464+ \`\`\`
465+ #include <iostream>
466+ int main() {
467+ std::cout << "Hello, world!" << std::endl;
468+ return 0;
469+ }
470+ \`\`\`
471+ ## NEW_CONTENT
472+ \`\`\`
473+ #include <iostream>
474+ int main() {
475+ std::cout << "Welcome to TCVB format!" << std::endl;
476+ return 0;
477+ }
478+ \`\`\`
479+
480+ - **操作说明**:
481+ - **OLD_CONTENT**:包含旧代码,通常保留必要的上下文。
482+ - **NEW_CONTENT**:包含新代码,将替换掉旧内容。
483+ - **重要提示**:尽量避免长段内容的替换,细化为多个小块进行替换。不要丢失注释、空行等结构信息。
484+
485+ 2. **创建操作(CREATE)**:
486+ - 创建一个新文件,后面直接给全文代码。
487+ - 新文件的全部内容应完整写入代码块中。
488+ - 如果文件已经存在,应该有GLOBAL-REPLACE来插入,而不是用CREATE
489+
490+ 示例:
491+ ## OPERATION:CREATE
492+ \`\`\`
493+ #include <cmath>
494+ double add(double a, double b) {
495+ return a + b;
496+ }
497+ \`\`\`
498+
499+ - **操作说明**:
500+ - 该操作用于新文件的创建或新增代码块。
501+ - 新的代码必须以 Markdown 格式代码块包裹。
502+ - 如果在已有文件中插入大块代码,应该使用替换操作,而不是 CREATE 操作。
503+
504+ ### 省略标识符规则:
505+
506+ 3. **省略标识符(//...CCVB)**:
507+ - \`//...CCVB\` 是一个省略标识符,表示代码的某一部分过长或不需要显示,已被省略或删除。
508+ - **注意**:省略标识符 **不能** 出现在被替换的内容中。
509+ - 如果某段代码包含省略标识符 \`//...CCVB\`,则不能将该标识符的行当作替换操作的锚点的一部分。
510+ - 被替换的内容必须位于 \`//...CCVB\` 标识符的上下方,不能跨越该标识符。
511+
512+ 示例:
513+ 假设以下代码中有一段被省略:
514+ \`\`\`cpp
515+ // Some initial setup code...
516+ //...CCVB
517+ // Remaining logic code...
518+ \`\`\`
519+
520+ 在进行全局替换操作时,不能选择跨越 \`//...CCVB\` 标识符的范围。例如:
521+ 错误的替换示例(跨越省略标识符):
522+ "
523+ ## OPERATION:GLOBAL-REPLACE
524+ ## OLD_CONTENT
525+ \`\`\`
526+ // Some initial setup code...
527+ //...CCVB
528+ // Remaining logic code...
529+ \`\`\`
530+ "
531+
532+ 正确的替换示例(避免跨越省略标识符):
533+ "
534+ ## OPERATION:GLOBAL-REPLACE
535+ ## OLD_CONTENT
536+ \`\`\`
537+ // Some initial setup code...
538+ \`\`\`
539+ ## NEW_CONTENT
540+ \`\`\`
541+ // New code after the initial setup
542+ \`\`\`
543+ "
544+
545+ ### 注意:
546+ 1. 所有 OPERATION 操作以行为单位。
547+ 2. 一个 '## FILE' 下可以有多个 '## OPERATION'。
548+ 3. 锚点为连续的多行内容:使用至少3行唯一文本作为锚点,用来标定范围,防止混淆(如果需要可以超过3行)。
549+ 4. [markdown代码块] 一定要用 \`\`\` ... \`\`\` 包裹,仔细检查不要漏掉。
550+ 5. 注意 TCVB 和 CVB 的区别。CVB 是完整的内容,而 TCVB 是用来生成差量同步的,通过多个 OPERATION 去操作已有 CVB 合成新 CVB。
551+ 6. 插入和删除操作都可以转化为替换操作。
552+ 7. 用来匹配的锚点必须和原文的格式完全一致,不能有缺失,不能丢弃注释。
553+ 8. 注意不要丢失 OPERATION 而直接输出代码块。
554+ 9. 不要私自加入不必要的空行。
555+ 10. 如果是在一个已有文件里插入大块代码,不应该用 CREATE,而是用替换的方式插入。
556+ 11. 所有## 开头的提示符前面都不能有空格,要在行首
557+
558+ 示例:
559+ ## BEGIN_TCVB
560+
561+ ## FILE:/src/main.cpp
562+ ## OPERATION:GLOBAL-REPLACE
563+ ## OLD_CONTENT
564+ \`\`\`
565+ #include <iostream>
566+ int main() {
567+ std::cout << "Hello, world!" << std::endl;
568+ return 0;
569+ }
570+ \`\`\`
571+ ## NEW_CONTENT
572+ \`\`\`
573+ #include <iostream>
574+ int main() {
575+ std::cout << "Welcome to TCVB format!" << std::endl;
576+ return 0;
577+ }
578+ \`\`\`
579+
580+ ## FILE:/src/utils.cpp
581+ ## OPERATION:CREATE
582+ \`\`\`
583+ #include <cmath>
584+ double add(double a, double b) {
585+ return a + b;
586+ }
587+ \`\`\`
437588
438- 2. 创建操作(CREATE):
439- ## OPERATION:CREATE
440- [markdown代码块:直接跟正文内容,表示新文件的全部内容]
589+ ## END_TCVB
590+ ` ;
591+ }
441592
442- 注意:
443- 1. 所有OPERATION操作以行为单位
444- 2. 一个'## FILE'下可以有多个'## OPERATION'
445- 3. 锚点为连续的多行内容:使用至少3行唯一文本作为锚点,用来标定范围,防止混淆(如果需要可以超过3行)
446- 4. [markdown代码块], 一定要用\`\`\` ... \`\`\` 包裹,仔细检查不要漏掉。
447- 5. 注意TCVB和CVB的区别。CVB是完整的内容,而TCVB是用来生成差量同步的,通过多个OPERATION去操作已有CVB合成新CVB
448- 6. 插入和删除操作都可以转化为替换操作
449- 7. 用来匹配的锚点必须和原文的格式完全一致,不能有缺失,不能丢弃注释。
450- 8. 注意不要丢失OPERATION而直接输出代码块
451- 9. 不要私自加入不必要的空行
452- 10.如果是在一个已有文件里插入大块代码,不应该用CREATE,而是用替换的方式插入
453- ` ;
454- }
455593}
456594
457595// ================== 合并函数 ==================
@@ -707,61 +845,61 @@ export async function compressCvb(cvb: Cvb, userRequest: string): Promise<Cvb> {
707845 for ( const [ filePath , fileContent ] of Object . entries ( files ) ) {
708846 // 构造 API 请求内容
709847 const requestContent = `
710- 文件路径: ${ filePath }
711-
712- 文件内容:
713- \`\`\`
714- ${ fileContent }
715- \`\`\`
716-
717- 用户请求:
718- \`\`\`
719- ${ userRequest }
720- \`\`\`
721-
722- 请从文件内容中识别并提取出有价值的代码片段,这些片段对理解代码在用户请求中的上下文非常重要。你需要关注以下几点:
723- 1. 提取出关键信息的代码块,这些代码块帮助理解用户请求中的核心上下文。比如在重构任务中,需要关注相关的函数、变量及其上下级调用等。
724- 2. 需要被处理的内容(如重构代码),应该被提取出来。
725- 3. 确定有必要作为“锚点”的代码段,以便后续处理时可以方便地替换。
726-
727- 例如:
728- 假设给定代码如下:
729- \`\`\`
730- function func1() {
731- // 代码块1
732- }
733-
734- function func2() {
735- // 代码块2
736- }
737-
738- function func3() {
739- // 代码块3
740- }
741- \`\`\`
742-
743- 用户请求关注 \`func1\` 和 \`func2\`,并希望忽略 \`func3\`。你应该返回如下结果:
744-
745- \`\`\`
746- function func1() {
747- // 代码块1
748- }
749- ===SEGMENT===
750- function func2() {
751- // 代码块2
752- }
753- \`\`\`
754-
755- 注意:
756- 1. 只保留 \`func1\` 和 \`func2\`,并通过 \`===SEGMENT===\` 分隔。
757- 2. \`func3\` 被丢弃,**但其位置仍然被正确地分隔开**,以确保后续的处理不会出现问题。
758- 3. 例子里的 \`\`\` 只是为了便于说明格式清楚,你输出的时候不要有 \`\`\` 包裹代码
759-
760- 返回时,请确保**每个代码片段**都保持原始结构,不要有任何多余的文字,并且使用 \`===SEGMENT===\` 来分隔它们,而不是使用 \`\`\`code\`\`\` 或其他分隔符。
761-
762- 确保返回的格式是干净且可解析的,只包括代码片段和分隔符,不要包含任何额外的解释或注释信息!
763-
764- ` ;
848+ 文件路径: ${ filePath }
849+
850+ 文件内容:
851+ \`\`\`
852+ ${ fileContent }
853+ \`\`\`
854+
855+ 用户请求:
856+ \`\`\`
857+ ${ userRequest }
858+ \`\`\`
859+
860+ 请从文件内容中识别并提取出有价值的代码片段,这些片段对理解代码在用户请求中的上下文非常重要。你需要关注以下几点:
861+ 1. 提取出关键信息的代码块,这些代码块帮助理解用户请求中的核心上下文。比如在重构任务中,需要关注相关的函数、变量及其上下级调用等。
862+ 2. 需要被处理的内容(如重构代码),应该被提取出来。
863+ 3. 确定有必要作为“锚点”的代码段,以便后续处理时可以方便地替换。
864+
865+ 例如:
866+ 假设给定代码如下:
867+ \`\`\`
868+ function func1() {
869+ // 代码块1
870+ }
871+
872+ function func2() {
873+ // 代码块2
874+ }
875+
876+ function func3() {
877+ // 代码块3
878+ }
879+ \`\`\`
880+
881+ 用户请求关注 \`func1\` 和 \`func2\`,并希望忽略 \`func3\`。你应该返回如下结果:
882+
883+ \`\`\`
884+ function func1() {
885+ // 代码块1
886+ }
887+ ===SEGMENT===
888+ function func2() {
889+ // 代码块2
890+ }
891+ \`\`\`
892+
893+ 注意:
894+ 1. 只保留 \`func1\` 和 \`func2\`,并通过 \`===SEGMENT===\` 分隔。
895+ 2. \`func3\` 被丢弃,**但其位置仍然被正确地分隔开**,以确保后续的处理不会出现问题。
896+ 3. 例子里的 \`\`\` 只是为了便于说明格式清楚,你输出的时候不要有 \`\`\` 包裹代码
897+
898+ 返回时,请确保**每个代码片段**都保持原始结构,不要有任何多余的文字,并且使用 \`===SEGMENT===\` 来分隔它们,而不是使用 \`\`\`code\`\`\` 或其他分隔符。
899+
900+ 确保返回的格式是干净且可解析的,只包括代码片段和分隔符,不要包含任何额外的解释或注释信息!
901+
902+ ` ;
765903
766904 // 系统提示
767905 const systemContent = "你是一个代码分析助手。给定一个文件的内容和用户的请求,识别并提取出对理解代码在请求上下文中的有价值的代码片段。注意输出的时候不要有 \`\`\`" ;
0 commit comments