evo-skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.eslintrc.json +36 -0
  2. package/.prettierrc +11 -0
  3. package/README.md +227 -0
  4. package/USER-GUIDE.md +382 -0
  5. package/dist/cli/commands/diff.d.ts +7 -0
  6. package/dist/cli/commands/diff.d.ts.map +1 -0
  7. package/dist/cli/commands/diff.js +126 -0
  8. package/dist/cli/commands/diff.js.map +1 -0
  9. package/dist/cli/commands/freeze.d.ts +12 -0
  10. package/dist/cli/commands/freeze.d.ts.map +1 -0
  11. package/dist/cli/commands/freeze.js +93 -0
  12. package/dist/cli/commands/freeze.js.map +1 -0
  13. package/dist/cli/commands/log.d.ts +7 -0
  14. package/dist/cli/commands/log.d.ts.map +1 -0
  15. package/dist/cli/commands/log.js +76 -0
  16. package/dist/cli/commands/log.js.map +1 -0
  17. package/dist/cli/commands/rollback.d.ts +7 -0
  18. package/dist/cli/commands/rollback.d.ts.map +1 -0
  19. package/dist/cli/commands/rollback.js +92 -0
  20. package/dist/cli/commands/rollback.js.map +1 -0
  21. package/dist/cli/commands/status.d.ts +7 -0
  22. package/dist/cli/commands/status.d.ts.map +1 -0
  23. package/dist/cli/commands/status.js +88 -0
  24. package/dist/cli/commands/status.js.map +1 -0
  25. package/dist/cli/index.d.ts +3 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +25 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config/defaults.d.ts +6 -0
  30. package/dist/config/defaults.d.ts.map +1 -0
  31. package/dist/config/defaults.js +31 -0
  32. package/dist/config/defaults.js.map +1 -0
  33. package/dist/config/index.d.ts +68 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +195 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/core/evaluator/base-rule.d.ts +50 -0
  38. package/dist/core/evaluator/base-rule.d.ts.map +1 -0
  39. package/dist/core/evaluator/base-rule.js +69 -0
  40. package/dist/core/evaluator/base-rule.js.map +1 -0
  41. package/dist/core/evaluator/index.d.ts +33 -0
  42. package/dist/core/evaluator/index.d.ts.map +1 -0
  43. package/dist/core/evaluator/index.js +74 -0
  44. package/dist/core/evaluator/index.js.map +1 -0
  45. package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
  46. package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
  47. package/dist/core/evaluator/rules/repeated-drift.js +82 -0
  48. package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
  49. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
  50. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
  51. package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
  52. package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
  53. package/dist/core/journal/index.d.ts +76 -0
  54. package/dist/core/journal/index.d.ts.map +1 -0
  55. package/dist/core/journal/index.js +207 -0
  56. package/dist/core/journal/index.js.map +1 -0
  57. package/dist/core/observer/base-observer.d.ts +64 -0
  58. package/dist/core/observer/base-observer.d.ts.map +1 -0
  59. package/dist/core/observer/base-observer.js +142 -0
  60. package/dist/core/observer/base-observer.js.map +1 -0
  61. package/dist/core/observer/codex-observer.d.ts +71 -0
  62. package/dist/core/observer/codex-observer.d.ts.map +1 -0
  63. package/dist/core/observer/codex-observer.js +248 -0
  64. package/dist/core/observer/codex-observer.js.map +1 -0
  65. package/dist/core/observer/index.d.ts +7 -0
  66. package/dist/core/observer/index.d.ts.map +1 -0
  67. package/dist/core/observer/index.js +7 -0
  68. package/dist/core/observer/index.js.map +1 -0
  69. package/dist/core/observer/trace-manager.d.ts +82 -0
  70. package/dist/core/observer/trace-manager.d.ts.map +1 -0
  71. package/dist/core/observer/trace-manager.js +196 -0
  72. package/dist/core/observer/trace-manager.js.map +1 -0
  73. package/dist/core/origin-registry/index.d.ts +59 -0
  74. package/dist/core/origin-registry/index.d.ts.map +1 -0
  75. package/dist/core/origin-registry/index.js +235 -0
  76. package/dist/core/origin-registry/index.js.map +1 -0
  77. package/dist/core/patch-generator/base-strategy.d.ts +35 -0
  78. package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
  79. package/dist/core/patch-generator/base-strategy.js +55 -0
  80. package/dist/core/patch-generator/base-strategy.js.map +1 -0
  81. package/dist/core/patch-generator/index.d.ts +32 -0
  82. package/dist/core/patch-generator/index.d.ts.map +1 -0
  83. package/dist/core/patch-generator/index.js +101 -0
  84. package/dist/core/patch-generator/index.js.map +1 -0
  85. package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
  86. package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
  87. package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
  88. package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
  89. package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
  90. package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
  91. package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
  92. package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
  93. package/dist/core/shadow-manager/index.d.ts +65 -0
  94. package/dist/core/shadow-manager/index.d.ts.map +1 -0
  95. package/dist/core/shadow-manager/index.js +229 -0
  96. package/dist/core/shadow-manager/index.js.map +1 -0
  97. package/dist/core/shadow-registry/index.d.ts +68 -0
  98. package/dist/core/shadow-registry/index.d.ts.map +1 -0
  99. package/dist/core/shadow-registry/index.js +173 -0
  100. package/dist/core/shadow-registry/index.js.map +1 -0
  101. package/dist/daemon/index.d.ts +43 -0
  102. package/dist/daemon/index.d.ts.map +1 -0
  103. package/dist/daemon/index.js +144 -0
  104. package/dist/daemon/index.js.map +1 -0
  105. package/dist/storage/index.d.ts +7 -0
  106. package/dist/storage/index.d.ts.map +1 -0
  107. package/dist/storage/index.js +7 -0
  108. package/dist/storage/index.js.map +1 -0
  109. package/dist/storage/markdown.d.ts +66 -0
  110. package/dist/storage/markdown.d.ts.map +1 -0
  111. package/dist/storage/markdown.js +227 -0
  112. package/dist/storage/markdown.js.map +1 -0
  113. package/dist/storage/ndjson.d.ts +118 -0
  114. package/dist/storage/ndjson.d.ts.map +1 -0
  115. package/dist/storage/ndjson.js +238 -0
  116. package/dist/storage/ndjson.js.map +1 -0
  117. package/dist/storage/sqlite.d.ts +131 -0
  118. package/dist/storage/sqlite.d.ts.map +1 -0
  119. package/dist/storage/sqlite.js +415 -0
  120. package/dist/storage/sqlite.js.map +1 -0
  121. package/dist/types/index.d.ts +158 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +5 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/utils/diff.d.ts +20 -0
  126. package/dist/utils/diff.d.ts.map +1 -0
  127. package/dist/utils/diff.js +47 -0
  128. package/dist/utils/diff.js.map +1 -0
  129. package/dist/utils/hash.d.ts +17 -0
  130. package/dist/utils/hash.d.ts.map +1 -0
  131. package/dist/utils/hash.js +28 -0
  132. package/dist/utils/hash.js.map +1 -0
  133. package/dist/utils/index.d.ts +8 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +8 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/logger.d.ts +11 -0
  138. package/dist/utils/logger.d.ts.map +1 -0
  139. package/dist/utils/logger.js +64 -0
  140. package/dist/utils/logger.js.map +1 -0
  141. package/dist/utils/path.d.ts +67 -0
  142. package/dist/utils/path.d.ts.map +1 -0
  143. package/dist/utils/path.js +115 -0
  144. package/dist/utils/path.js.map +1 -0
  145. package/docs/ENGINEERING_PLAN.md +1065 -0
  146. package/docs/PRD.md +1004 -0
  147. package/docs/PROGRESS.md +523 -0
  148. package/package.json +60 -0
  149. package/src/cli/commands/diff.ts +158 -0
  150. package/src/cli/commands/freeze.ts +108 -0
  151. package/src/cli/commands/log.ts +87 -0
  152. package/src/cli/commands/rollback.ts +99 -0
  153. package/src/cli/commands/status.ts +101 -0
  154. package/src/cli/index.ts +31 -0
  155. package/src/config/defaults.ts +32 -0
  156. package/src/config/index.ts +220 -0
  157. package/src/core/evaluator/base-rule.ts +90 -0
  158. package/src/core/evaluator/index.ts +86 -0
  159. package/src/core/evaluator/rules/repeated-drift.ts +109 -0
  160. package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
  161. package/src/core/journal/index.ts +286 -0
  162. package/src/core/observer/base-observer.ts +200 -0
  163. package/src/core/observer/codex-observer.ts +309 -0
  164. package/src/core/observer/index.ts +7 -0
  165. package/src/core/observer/trace-manager.ts +250 -0
  166. package/src/core/origin-registry/index.ts +264 -0
  167. package/src/core/patch-generator/base-strategy.ts +67 -0
  168. package/src/core/patch-generator/index.ts +118 -0
  169. package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
  170. package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
  171. package/src/core/shadow-manager/index.ts +278 -0
  172. package/src/core/shadow-registry/index.ts +200 -0
  173. package/src/daemon/index.ts +174 -0
  174. package/src/storage/index.ts +7 -0
  175. package/src/storage/markdown.ts +267 -0
  176. package/src/storage/ndjson.ts +273 -0
  177. package/src/storage/sqlite.ts +555 -0
  178. package/src/types/index.ts +212 -0
  179. package/src/utils/diff.ts +60 -0
  180. package/src/utils/hash.ts +31 -0
  181. package/src/utils/index.ts +8 -0
  182. package/src/utils/logger.ts +78 -0
  183. package/src/utils/path.ts +129 -0
  184. package/tests/unit/config.test.ts +65 -0
  185. package/tests/unit/path.test.ts +89 -0
  186. package/tests/unit/utils.test.ts +45 -0
  187. package/tsconfig.json +31 -0
  188. package/vitest.config.ts +19 -0
@@ -0,0 +1,59 @@
1
+ import type { OriginSkill } from '../../types/index.js';
2
+ /**
3
+ * Origin Skill 注册表
4
+ * 负责扫描和管理用户本机已安装的 skills
5
+ */
6
+ export declare class OriginRegistry {
7
+ private skills;
8
+ private lastScanTime;
9
+ /**
10
+ * 扫描所有配置的 skill 目录
11
+ */
12
+ scan(): Promise<OriginSkill[]>;
13
+ /**
14
+ * 扫描单个目录
15
+ */
16
+ private scanDirectory;
17
+ /**
18
+ * 从目录读取 skill
19
+ */
20
+ private readSkillFromDirectory;
21
+ /**
22
+ * 从文件读取 skill
23
+ */
24
+ private readSkillFromFile;
25
+ /**
26
+ * 检测 skill 来源
27
+ */
28
+ private detectSource;
29
+ /**
30
+ * 获取指定 skill
31
+ */
32
+ get(skillId: string): OriginSkill | null;
33
+ /**
34
+ * 获取所有 skills
35
+ */
36
+ list(): OriginSkill[];
37
+ /**
38
+ * 检查 skill 是否有更新
39
+ */
40
+ checkUpdate(skillId: string): boolean;
41
+ /**
42
+ * 读取 origin skill 内容
43
+ */
44
+ readContent(skillId: string): string | null;
45
+ /**
46
+ * 刷新单个 skill 的版本信息
47
+ */
48
+ refreshSkill(skillId: string): OriginSkill | null;
49
+ /**
50
+ * 获取上次扫描时间
51
+ */
52
+ getLastScanTime(): number;
53
+ /**
54
+ * 检查是否需要重新扫描
55
+ */
56
+ needsRescan(): boolean;
57
+ }
58
+ export declare const originRegistry: OriginRegistry;
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/origin-registry/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,YAAY,CAAa;IAEjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA+BpC;;OAEG;YACW,aAAa;IAgC3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIxC;;OAEG;IACH,IAAI,IAAI,WAAW,EAAE;IAIrB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAcrC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA+B3C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAiBjD;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,WAAW,IAAI,OAAO;CAIvB;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,235 @@
1
+ import { readdirSync, existsSync } from 'node:fs';
2
+ import { join, basename } from 'node:path';
3
+ import { createChildLogger } from '../../utils/logger.js';
4
+ import { hashFile } from '../../utils/hash.js';
5
+ import { expandHome, isDirectory, isFile } from '../../utils/path.js';
6
+ import { configManager } from '../../config/index.js';
7
+ const logger = createChildLogger('origin-registry');
8
+ /**
9
+ * Origin Skill 注册表
10
+ * 负责扫描和管理用户本机已安装的 skills
11
+ */
12
+ export class OriginRegistry {
13
+ skills = new Map();
14
+ lastScanTime = 0;
15
+ /**
16
+ * 扫描所有配置的 skill 目录
17
+ */
18
+ async scan() {
19
+ const paths = configManager.getOriginPaths();
20
+ const allSkills = [];
21
+ for (const skillPath of paths) {
22
+ const expandedPath = expandHome(skillPath);
23
+ if (!existsSync(expandedPath)) {
24
+ logger.debug(`Skill path not found: ${expandedPath}`);
25
+ continue;
26
+ }
27
+ try {
28
+ const skills = await this.scanDirectory(expandedPath);
29
+ allSkills.push(...skills);
30
+ }
31
+ catch (error) {
32
+ logger.warn(`Failed to scan directory: ${expandedPath}`, { error });
33
+ }
34
+ }
35
+ // 更新内部缓存
36
+ this.skills.clear();
37
+ for (const skill of allSkills) {
38
+ this.skills.set(skill.skill_id, skill);
39
+ }
40
+ this.lastScanTime = Date.now();
41
+ logger.info(`Scanned ${allSkills.length} origin skills`);
42
+ return allSkills;
43
+ }
44
+ /**
45
+ * 扫描单个目录
46
+ */
47
+ async scanDirectory(dirPath) {
48
+ const skills = [];
49
+ if (!isDirectory(dirPath)) {
50
+ return skills;
51
+ }
52
+ const entries = readdirSync(dirPath);
53
+ for (const entry of entries) {
54
+ const fullPath = join(dirPath, entry);
55
+ // 检查是否是目录(skill 通常是目录形式)
56
+ if (isDirectory(fullPath)) {
57
+ const skill = this.readSkillFromDirectory(fullPath, entry);
58
+ if (skill) {
59
+ skills.push(skill);
60
+ }
61
+ }
62
+ // 或者是单个 .md 文件
63
+ else if (entry.endsWith('.md') && isFile(fullPath)) {
64
+ const skillId = basename(entry, '.md');
65
+ const skill = this.readSkillFromFile(fullPath, skillId);
66
+ if (skill) {
67
+ skills.push(skill);
68
+ }
69
+ }
70
+ }
71
+ return skills;
72
+ }
73
+ /**
74
+ * 从目录读取 skill
75
+ */
76
+ readSkillFromDirectory(dirPath, skillId) {
77
+ try {
78
+ // 查找主要的 skill 文件(通常是 current.md 或 skill.md)
79
+ const possibleFiles = ['current.md', 'skill.md', `${skillId}.md`];
80
+ let mainFile = null;
81
+ for (const filename of possibleFiles) {
82
+ const filePath = join(dirPath, filename);
83
+ if (isFile(filePath)) {
84
+ mainFile = filePath;
85
+ break;
86
+ }
87
+ }
88
+ if (!mainFile) {
89
+ logger.debug(`No skill file found in directory: ${dirPath}`);
90
+ return null;
91
+ }
92
+ const version = hashFile(mainFile);
93
+ const now = new Date().toISOString();
94
+ return {
95
+ skill_id: skillId,
96
+ origin_path: dirPath,
97
+ origin_version: version,
98
+ source: this.detectSource(dirPath),
99
+ installed_at: now,
100
+ last_seen_at: now,
101
+ };
102
+ }
103
+ catch (error) {
104
+ logger.warn(`Failed to read skill from directory: ${dirPath}`, { error });
105
+ return null;
106
+ }
107
+ }
108
+ /**
109
+ * 从文件读取 skill
110
+ */
111
+ readSkillFromFile(filePath, skillId) {
112
+ try {
113
+ const version = hashFile(filePath);
114
+ const now = new Date().toISOString();
115
+ return {
116
+ skill_id: skillId,
117
+ origin_path: filePath,
118
+ origin_version: version,
119
+ source: this.detectSource(filePath),
120
+ installed_at: now,
121
+ last_seen_at: now,
122
+ };
123
+ }
124
+ catch (error) {
125
+ logger.warn(`Failed to read skill from file: ${filePath}`, { error });
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * 检测 skill 来源
131
+ */
132
+ detectSource(path) {
133
+ if (path.includes('.git') || path.includes('github')) {
134
+ return 'git';
135
+ }
136
+ if (path.includes('marketplace') || path.includes('registry')) {
137
+ return 'marketplace';
138
+ }
139
+ return 'local';
140
+ }
141
+ /**
142
+ * 获取指定 skill
143
+ */
144
+ get(skillId) {
145
+ return this.skills.get(skillId) ?? null;
146
+ }
147
+ /**
148
+ * 获取所有 skills
149
+ */
150
+ list() {
151
+ return Array.from(this.skills.values());
152
+ }
153
+ /**
154
+ * 检查 skill 是否有更新
155
+ */
156
+ checkUpdate(skillId) {
157
+ const skill = this.skills.get(skillId);
158
+ if (!skill) {
159
+ return false;
160
+ }
161
+ try {
162
+ const currentVersion = hashFile(skill.origin_path);
163
+ return currentVersion !== skill.origin_version;
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * 读取 origin skill 内容
171
+ */
172
+ readContent(skillId) {
173
+ const skill = this.skills.get(skillId);
174
+ if (!skill) {
175
+ return null;
176
+ }
177
+ try {
178
+ const { readFileSync } = require('node:fs');
179
+ // 如果是目录,查找主文件
180
+ if (isDirectory(skill.origin_path)) {
181
+ const possibleFiles = ['current.md', 'skill.md', `${skillId}.md`];
182
+ for (const filename of possibleFiles) {
183
+ const filePath = join(skill.origin_path, filename);
184
+ if (isFile(filePath)) {
185
+ return readFileSync(filePath, 'utf-8');
186
+ }
187
+ }
188
+ }
189
+ // 如果是文件,直接读取
190
+ else if (isFile(skill.origin_path)) {
191
+ return readFileSync(skill.origin_path, 'utf-8');
192
+ }
193
+ return null;
194
+ }
195
+ catch (error) {
196
+ logger.warn(`Failed to read skill content: ${skillId}`, { error });
197
+ return null;
198
+ }
199
+ }
200
+ /**
201
+ * 刷新单个 skill 的版本信息
202
+ */
203
+ refreshSkill(skillId) {
204
+ const skill = this.skills.get(skillId);
205
+ if (!skill) {
206
+ return null;
207
+ }
208
+ try {
209
+ const newVersion = hashFile(skill.origin_path);
210
+ skill.origin_version = newVersion;
211
+ skill.last_seen_at = new Date().toISOString();
212
+ return skill;
213
+ }
214
+ catch (error) {
215
+ logger.warn(`Failed to refresh skill: ${skillId}`, { error });
216
+ return null;
217
+ }
218
+ }
219
+ /**
220
+ * 获取上次扫描时间
221
+ */
222
+ getLastScanTime() {
223
+ return this.lastScanTime;
224
+ }
225
+ /**
226
+ * 检查是否需要重新扫描
227
+ */
228
+ needsRescan() {
229
+ const scanInterval = 3600 * 1000; // 1 小时
230
+ return Date.now() - this.lastScanTime > scanInterval;
231
+ }
232
+ }
233
+ // 导出单例实例
234
+ export const originRegistry = new OriginRegistry();
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/origin-registry/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { PatchResult, ChangeType } from '../../types/index.js';
2
+ /**
3
+ * Patch 策略基类
4
+ */
5
+ export declare abstract class BaseStrategy {
6
+ protected name: string;
7
+ protected description: string;
8
+ protected changeType: ChangeType;
9
+ constructor(name: string, description: string, changeType: ChangeType);
10
+ /**
11
+ * 生成 patch
12
+ */
13
+ abstract generate(currentContent: string, context: Record<string, unknown>): PatchResult;
14
+ /**
15
+ * 获取策略名称
16
+ */
17
+ getName(): string;
18
+ /**
19
+ * 获取策略描述
20
+ */
21
+ getDescription(): string;
22
+ /**
23
+ * 获取变更类型
24
+ */
25
+ getChangeType(): ChangeType;
26
+ /**
27
+ * 创建成功的 PatchResult
28
+ */
29
+ protected createSuccessResult(patch: string, newContent: string): PatchResult;
30
+ /**
31
+ * 创建失败的 PatchResult
32
+ */
33
+ protected createFailureResult(error: string): PatchResult;
34
+ }
35
+ //# sourceMappingURL=base-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-strategy.d.ts","sourceRoot":"","sources":["../../../src/core/patch-generator/base-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;GAEG;AACH,8BAAsB,YAAY;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;gBAErB,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAMrE;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAExF;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,aAAa,IAAI,UAAU;IAI3B;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAS7E;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CAS1D"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Patch 策略基类
3
+ */
4
+ export class BaseStrategy {
5
+ name;
6
+ description;
7
+ changeType;
8
+ constructor(name, description, changeType) {
9
+ this.name = name;
10
+ this.description = description;
11
+ this.changeType = changeType;
12
+ }
13
+ /**
14
+ * 获取策略名称
15
+ */
16
+ getName() {
17
+ return this.name;
18
+ }
19
+ /**
20
+ * 获取策略描述
21
+ */
22
+ getDescription() {
23
+ return this.description;
24
+ }
25
+ /**
26
+ * 获取变更类型
27
+ */
28
+ getChangeType() {
29
+ return this.changeType;
30
+ }
31
+ /**
32
+ * 创建成功的 PatchResult
33
+ */
34
+ createSuccessResult(patch, newContent) {
35
+ return {
36
+ success: true,
37
+ patch,
38
+ newContent,
39
+ changeType: this.changeType,
40
+ };
41
+ }
42
+ /**
43
+ * 创建失败的 PatchResult
44
+ */
45
+ createFailureResult(error) {
46
+ return {
47
+ success: false,
48
+ patch: '',
49
+ newContent: '',
50
+ changeType: this.changeType,
51
+ error,
52
+ };
53
+ }
54
+ }
55
+ //# sourceMappingURL=base-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-strategy.js","sourceRoot":"","sources":["../../../src/core/patch-generator/base-strategy.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAgB,YAAY;IACtB,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,UAAU,CAAa;IAEjC,YAAY,IAAY,EAAE,WAAmB,EAAE,UAAsB;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAOD;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACO,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QAC7D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK;YACL,UAAU;YACV,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,mBAAmB,CAAC,KAAa;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK;SACN,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import { BaseStrategy } from './base-strategy.js';
2
+ import type { PatchResult, ChangeType } from '../../types/index.js';
3
+ /**
4
+ * Patch Generator
5
+ * 负责生成具体的 patch
6
+ */
7
+ export declare class PatchGenerator {
8
+ private strategies;
9
+ constructor();
10
+ /**
11
+ * 注册默认策略
12
+ */
13
+ private registerDefaultStrategies;
14
+ /**
15
+ * 注册策略
16
+ */
17
+ registerStrategy(strategy: BaseStrategy): void;
18
+ /**
19
+ * 生成 patch
20
+ */
21
+ generate(changeType: ChangeType, currentContent: string, context: Record<string, unknown>): PatchResult;
22
+ /**
23
+ * 获取所有策略
24
+ */
25
+ getStrategies(): BaseStrategy[];
26
+ /**
27
+ * 检查是否支持某个变更类型
28
+ */
29
+ supportsChangeType(changeType: ChangeType): boolean;
30
+ }
31
+ export declare const patchGenerator: PatchGenerator;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/patch-generator/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIpE;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAA4C;;IAM9D;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK9C;;OAEG;IACH,QAAQ,CACN,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,WAAW;IAyDd;;OAEG;IACH,aAAa,IAAI,YAAY,EAAE;IAI/B;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;CAGpD;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { createChildLogger } from '../../utils/logger.js';
2
+ import { configManager } from '../../config/index.js';
3
+ import { BaseStrategy } from './base-strategy.js';
4
+ import { AddFallbackStrategy } from './strategies/add-fallback.js';
5
+ import { PruneNoiseStrategy } from './strategies/prune-noise.js';
6
+ const logger = createChildLogger('patch-generator');
7
+ /**
8
+ * Patch Generator
9
+ * 负责生成具体的 patch
10
+ */
11
+ export class PatchGenerator {
12
+ strategies = new Map();
13
+ constructor() {
14
+ this.registerDefaultStrategies();
15
+ }
16
+ /**
17
+ * 注册默认策略
18
+ */
19
+ registerDefaultStrategies() {
20
+ this.registerStrategy(new AddFallbackStrategy());
21
+ this.registerStrategy(new PruneNoiseStrategy());
22
+ logger.info('Default patch strategies registered');
23
+ }
24
+ /**
25
+ * 注册策略
26
+ */
27
+ registerStrategy(strategy) {
28
+ this.strategies.set(strategy.getChangeType(), strategy);
29
+ logger.info(`Strategy registered: ${strategy.getName()}`);
30
+ }
31
+ /**
32
+ * 生成 patch
33
+ */
34
+ generate(changeType, currentContent, context) {
35
+ const strategy = this.strategies.get(changeType);
36
+ if (!strategy) {
37
+ logger.warn(`No strategy found for change type: ${changeType}`);
38
+ return {
39
+ success: false,
40
+ patch: '',
41
+ newContent: '',
42
+ changeType,
43
+ error: `No strategy found for change type: ${changeType}`,
44
+ };
45
+ }
46
+ // 检查是否允许此类型的 patch
47
+ const allowedTypes = configManager.getPatchConfig().allowed_types;
48
+ if (!allowedTypes.includes(changeType)) {
49
+ logger.warn(`Change type ${changeType} is not allowed`);
50
+ return {
51
+ success: false,
52
+ patch: '',
53
+ newContent: '',
54
+ changeType,
55
+ error: `Change type ${changeType} is not allowed`,
56
+ };
57
+ }
58
+ logger.debug(`Generating patch with strategy: ${strategy.getName()}`);
59
+ try {
60
+ const result = strategy.generate(currentContent, context);
61
+ if (result.success) {
62
+ logger.info(`Patch generated successfully`, {
63
+ strategy: strategy.getName(),
64
+ changeType,
65
+ });
66
+ }
67
+ else {
68
+ logger.warn(`Patch generation failed`, {
69
+ strategy: strategy.getName(),
70
+ error: result.error,
71
+ });
72
+ }
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ logger.error(`Strategy execution failed`, { error });
77
+ return {
78
+ success: false,
79
+ patch: '',
80
+ newContent: '',
81
+ changeType,
82
+ error: `Strategy execution failed: ${error}`,
83
+ };
84
+ }
85
+ }
86
+ /**
87
+ * 获取所有策略
88
+ */
89
+ getStrategies() {
90
+ return Array.from(this.strategies.values());
91
+ }
92
+ /**
93
+ * 检查是否支持某个变更类型
94
+ */
95
+ supportsChangeType(changeType) {
96
+ return this.strategies.has(changeType);
97
+ }
98
+ }
99
+ // 导出单例实例
100
+ export const patchGenerator = new PatchGenerator();
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/patch-generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,MAAM,MAAM,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,UAAU,GAAkC,IAAI,GAAG,EAAE,CAAC;IAE9D;QACE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,yBAAyB;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAsB;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,UAAsB,EACtB,cAAsB,EACtB,OAAgC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;YAChE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,EAAE;gBACd,UAAU;gBACV,KAAK,EAAE,sCAAsC,UAAU,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,iBAAiB,CAAC,CAAC;YACxD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,EAAE;gBACd,UAAU;gBACV,KAAK,EAAE,eAAe,UAAU,iBAAiB;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mCAAmC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;oBAC1C,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE;oBAC5B,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;oBACrC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE;oBAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,EAAE;gBACd,UAAU;gBACV,KAAK,EAAE,8BAA8B,KAAK,EAAE;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAAsB;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF;AAED,SAAS;AACT,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { BaseStrategy } from '../base-strategy.js';
2
+ import type { PatchResult } from '../../../types/index.js';
3
+ /**
4
+ * Add Fallback 策略
5
+ * 在相关步骤后添加 fallback 说明
6
+ */
7
+ export declare class AddFallbackStrategy extends BaseStrategy {
8
+ constructor();
9
+ generate(currentContent: string, context: Record<string, unknown>): PatchResult;
10
+ }
11
+ //# sourceMappingURL=add-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-fallback.d.ts","sourceRoot":"","sources":["../../../../src/core/patch-generator/strategies/add-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;;IASnD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CAmDhF"}
@@ -0,0 +1,57 @@
1
+ import { BaseStrategy } from '../base-strategy.js';
2
+ import { createUnifiedDiff } from '../../../utils/diff.js';
3
+ /**
4
+ * Add Fallback 策略
5
+ * 在相关步骤后添加 fallback 说明
6
+ */
7
+ export class AddFallbackStrategy extends BaseStrategy {
8
+ constructor() {
9
+ super('add-fallback', 'Add fallback instructions after relevant steps', 'add_fallback');
10
+ }
11
+ generate(currentContent, context) {
12
+ try {
13
+ const pattern = context.pattern;
14
+ const reason = context.reason;
15
+ if (!pattern) {
16
+ return this.createFailureResult('Pattern not provided');
17
+ }
18
+ // 查找插入点(在文件末尾或特定 section 后)
19
+ const lines = currentContent.split('\n');
20
+ let insertIndex = lines.length;
21
+ // 尝试找到 "## Fallback" 或类似的 section
22
+ for (let i = 0; i < lines.length; i++) {
23
+ if (lines[i]?.toLowerCase().includes('fallback') ||
24
+ lines[i]?.toLowerCase().includes('error handling')) {
25
+ // 在这个 section 后插入
26
+ insertIndex = i + 1;
27
+ while (insertIndex < lines.length && lines[insertIndex]?.startsWith('-')) {
28
+ insertIndex++;
29
+ }
30
+ break;
31
+ }
32
+ }
33
+ // 创建新的 fallback 内容
34
+ const fallbackContent = [
35
+ '',
36
+ `## Additional Fallback`,
37
+ '',
38
+ `- If the agent output does not include "${pattern}", manually add it`,
39
+ `- Reason: ${reason}`,
40
+ '',
41
+ ];
42
+ // 插入内容
43
+ const newLines = [
44
+ ...lines.slice(0, insertIndex),
45
+ ...fallbackContent,
46
+ ...lines.slice(insertIndex),
47
+ ];
48
+ const newContent = newLines.join('\n');
49
+ const patch = createUnifiedDiff('skill.md', currentContent, newContent);
50
+ return this.createSuccessResult(patch, newContent);
51
+ }
52
+ catch (error) {
53
+ return this.createFailureResult(`Failed to generate patch: ${error}`);
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=add-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-fallback.js","sourceRoot":"","sources":["../../../../src/core/patch-generator/strategies/add-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD;QACE,KAAK,CACH,cAAc,EACd,gDAAgD,EAChD,cAAc,CACf,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,cAAsB,EAAE,OAAgC;QAC/D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiB,CAAC;YAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAgB,CAAC;YAExC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;YAC1D,CAAC;YAED,4BAA4B;YAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YAE/B,kCAAkC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC5C,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACvD,kBAAkB;oBAClB,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;oBACpB,OAAO,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACzE,WAAW,EAAE,CAAC;oBAChB,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,MAAM,eAAe,GAAG;gBACtB,EAAE;gBACF,wBAAwB;gBACxB,EAAE;gBACF,2CAA2C,OAAO,oBAAoB;gBACtE,aAAa,MAAM,EAAE;gBACrB,EAAE;aACH,CAAC;YAEF,OAAO;YACP,MAAM,QAAQ,GAAG;gBACf,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;gBAC9B,GAAG,eAAe;gBAClB,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;aAC5B,CAAC;YAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAExE,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,mBAAmB,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { BaseStrategy } from '../base-strategy.js';
2
+ import type { PatchResult } from '../../../types/index.js';
3
+ /**
4
+ * Prune Noise 策略
5
+ * 删除被忽略的冗余说明
6
+ */
7
+ export declare class PruneNoiseStrategy extends BaseStrategy {
8
+ constructor();
9
+ generate(currentContent: string, context: Record<string, unknown>): PatchResult;
10
+ }
11
+ //# sourceMappingURL=prune-noise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune-noise.d.ts","sourceRoot":"","sources":["../../../../src/core/patch-generator/strategies/prune-noise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;IASlD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CA+ChF"}