@xdevops/issue-auto-finish 1.0.2 → 1.0.4
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.
- package/dist/KnowledgeAnalyzer-EZSJT2MJ.js +13 -0
- package/dist/KnowledgeAnalyzer-EZSJT2MJ.js.map +1 -0
- package/dist/KnowledgeStore-4ROC6F56.js +10 -0
- package/dist/KnowledgeStore-4ROC6F56.js.map +1 -0
- package/dist/ai-runner/AIRunner.d.ts +2 -0
- package/dist/ai-runner/AIRunner.d.ts.map +1 -1
- package/dist/ai-runner/BaseAIRunner.d.ts +9 -0
- package/dist/ai-runner/BaseAIRunner.d.ts.map +1 -1
- package/dist/ai-runner-RGAJPOOW.js +16 -0
- package/dist/ai-runner-RGAJPOOW.js.map +1 -0
- package/dist/analyze-ONQDTYCN.js +72 -0
- package/dist/analyze-ONQDTYCN.js.map +1 -0
- package/dist/chunk-3JUHZGX5.js +171 -0
- package/dist/chunk-3JUHZGX5.js.map +1 -0
- package/dist/chunk-5JYCGAU3.js +318 -0
- package/dist/chunk-5JYCGAU3.js.map +1 -0
- package/dist/chunk-5VUB3UUK.js +643 -0
- package/dist/chunk-5VUB3UUK.js.map +1 -0
- package/dist/{chunk-OWVT3Z34.js → chunk-JFYAXNNS.js} +121 -31
- package/dist/chunk-JFYAXNNS.js.map +1 -0
- package/dist/chunk-MH6LHFPB.js +188 -0
- package/dist/chunk-MH6LHFPB.js.map +1 -0
- package/dist/{chunk-TBIEB3JY.js → chunk-N5YK6YVI.js} +592 -767
- package/dist/chunk-N5YK6YVI.js.map +1 -0
- package/dist/{chunk-RIUI4ROA.js → chunk-PECYMYAK.js} +2 -2
- package/dist/{chunk-I3T573SU.js → chunk-PTIL5AY2.js} +65 -2
- package/dist/chunk-PTIL5AY2.js.map +1 -0
- package/dist/chunk-SWG2Y7YX.js +410 -0
- package/dist/chunk-SWG2Y7YX.js.map +1 -0
- package/dist/chunk-TZ6C7HL5.js +59 -0
- package/dist/chunk-TZ6C7HL5.js.map +1 -0
- package/dist/{chunk-IDUKWCC2.js → chunk-VFQYIC6L.js} +1151 -80
- package/dist/chunk-VFQYIC6L.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +8 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli.js +67 -3
- package/dist/cli.js.map +1 -1
- package/dist/clients/GongfengClient.d.ts +5 -0
- package/dist/clients/GongfengClient.d.ts.map +1 -1
- package/dist/config-6GFBDMGD.js +7 -0
- package/dist/config-6GFBDMGD.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/{doctor-B26Q6JWI.js → doctor-ZPGIBA5N.js} +3 -3
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/git/GitOperations.d.ts +12 -0
- package/dist/git/GitOperations.d.ts.map +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/{init-L3VIWCOV.js → init-QDTII4SP.js} +10 -5
- package/dist/init-QDTII4SP.js.map +1 -0
- package/dist/knowledge/KnowledgeAnalyzer.d.ts +31 -0
- package/dist/knowledge/KnowledgeAnalyzer.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeDefaults.d.ts +7 -0
- package/dist/knowledge/KnowledgeDefaults.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeEntry.d.ts +30 -0
- package/dist/knowledge/KnowledgeEntry.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeLoader.d.ts +18 -0
- package/dist/knowledge/KnowledgeLoader.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeStore.d.ts +35 -0
- package/dist/knowledge/KnowledgeStore.d.ts.map +1 -0
- package/dist/knowledge/ProjectKnowledge.d.ts +79 -0
- package/dist/knowledge/ProjectKnowledge.d.ts.map +1 -0
- package/dist/knowledge/analyze-prompt.d.ts +2 -0
- package/dist/knowledge/analyze-prompt.d.ts.map +1 -0
- package/dist/knowledge/importers/GongfengExtractor.d.ts +27 -0
- package/dist/knowledge/importers/GongfengExtractor.d.ts.map +1 -0
- package/dist/knowledge/importers/IwikiImporter.d.ts +21 -0
- package/dist/knowledge/importers/IwikiImporter.d.ts.map +1 -0
- package/dist/knowledge/index.d.ts +12 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/lib.js +19 -10
- package/dist/orchestrator/PipelineOrchestrator.d.ts +5 -1
- package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
- package/dist/phases/BasePhase.d.ts.map +1 -1
- package/dist/poller/IssuePoller.d.ts +5 -0
- package/dist/poller/IssuePoller.d.ts.map +1 -1
- package/dist/prompts/chat-templates.d.ts +4 -0
- package/dist/prompts/chat-templates.d.ts.map +1 -0
- package/dist/prompts/templates.d.ts +11 -0
- package/dist/prompts/templates.d.ts.map +1 -1
- package/dist/rules/RuleResolver.d.ts +4 -0
- package/dist/rules/RuleResolver.d.ts.map +1 -1
- package/dist/run.js +11 -5
- package/dist/run.js.map +1 -1
- package/dist/services/ChatService.d.ts +39 -0
- package/dist/services/ChatService.d.ts.map +1 -0
- package/dist/shutdown/ShutdownSignal.d.ts +3 -0
- package/dist/shutdown/ShutdownSignal.d.ts.map +1 -0
- package/dist/{start-TVN4SS6E.js → start-EDOZC5WL.js} +1 -1
- package/dist/tracker/IssueState.d.ts +1 -0
- package/dist/tracker/IssueState.d.ts.map +1 -1
- package/dist/tracker/IssueTracker.d.ts +2 -0
- package/dist/tracker/IssueTracker.d.ts.map +1 -1
- package/dist/updater/AutoUpdater.d.ts +33 -0
- package/dist/updater/AutoUpdater.d.ts.map +1 -0
- package/dist/updater/UpdateExecutor.d.ts +7 -0
- package/dist/updater/UpdateExecutor.d.ts.map +1 -0
- package/dist/updater/VersionChecker.d.ts +22 -0
- package/dist/updater/VersionChecker.d.ts.map +1 -0
- package/dist/web/WebServer.d.ts +4 -0
- package/dist/web/WebServer.d.ts.map +1 -1
- package/dist/web/routes/api.d.ts +4 -0
- package/dist/web/routes/api.d.ts.map +1 -1
- package/dist/web/routes/chat.d.ts +7 -0
- package/dist/web/routes/chat.d.ts.map +1 -0
- package/dist/web/routes/knowledge.d.ts +13 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/setup.d.ts.map +1 -1
- package/dist/webhook/CommandExecutor.d.ts +4 -0
- package/dist/webhook/CommandExecutor.d.ts.map +1 -1
- package/dist/webhook/CommandParser.d.ts +2 -2
- package/dist/webhook/CommandParser.d.ts.map +1 -1
- package/dist/webhook/WebhookHandler.d.ts +8 -0
- package/dist/webhook/WebhookHandler.d.ts.map +1 -1
- package/dist/webhook/WebhookServer.d.ts +2 -0
- package/dist/webhook/WebhookServer.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/web/frontend/dist/assets/index-AcJ0lPIv.js +67 -0
- package/src/web/frontend/dist/assets/index-BbRt5BAr.css +1 -0
- package/src/web/frontend/dist/index.html +2 -2
- package/dist/chunk-I3T573SU.js.map +0 -1
- package/dist/chunk-IDUKWCC2.js.map +0 -1
- package/dist/chunk-OWVT3Z34.js.map +0 -1
- package/dist/chunk-TBIEB3JY.js.map +0 -1
- package/dist/init-L3VIWCOV.js.map +0 -1
- package/src/web/frontend/dist/assets/index-CQdlU9PE.js +0 -65
- package/src/web/frontend/dist/assets/index-CgMEkyZJ.css +0 -1
- /package/dist/{chunk-RIUI4ROA.js.map → chunk-PECYMYAK.js.map} +0 -0
- /package/dist/{doctor-B26Q6JWI.js.map → doctor-ZPGIBA5N.js.map} +0 -0
- /package/dist/{start-TVN4SS6E.js.map → start-EDOZC5WL.js.map} +0 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logger
|
|
3
|
+
} from "./chunk-TZ6C7HL5.js";
|
|
4
|
+
|
|
5
|
+
// src/knowledge/KnowledgeStore.ts
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { randomUUID } from "crypto";
|
|
9
|
+
var logger2 = logger.child("KnowledgeStore");
|
|
10
|
+
var KnowledgeStore = class {
|
|
11
|
+
dataDir;
|
|
12
|
+
indexPath;
|
|
13
|
+
entriesDir;
|
|
14
|
+
index = null;
|
|
15
|
+
constructor(dataDir) {
|
|
16
|
+
this.dataDir = dataDir;
|
|
17
|
+
this.indexPath = path.join(dataDir, "index.json");
|
|
18
|
+
this.entriesDir = path.join(dataDir, "entries");
|
|
19
|
+
}
|
|
20
|
+
list(type) {
|
|
21
|
+
const idx = this.loadIndex();
|
|
22
|
+
if (!type) return idx.entries;
|
|
23
|
+
return idx.entries.filter((e) => e.type === type);
|
|
24
|
+
}
|
|
25
|
+
get(id) {
|
|
26
|
+
const idx = this.loadIndex();
|
|
27
|
+
const meta = idx.entries.find((e) => e.id === id);
|
|
28
|
+
if (!meta) return null;
|
|
29
|
+
return { ...meta, content: this.readContent(id) };
|
|
30
|
+
}
|
|
31
|
+
create(input) {
|
|
32
|
+
this.ensureDirs();
|
|
33
|
+
const idx = this.loadIndex();
|
|
34
|
+
const entry = {
|
|
35
|
+
id: randomUUID(),
|
|
36
|
+
type: input.type,
|
|
37
|
+
title: input.title,
|
|
38
|
+
content: input.content,
|
|
39
|
+
tags: input.tags ?? [],
|
|
40
|
+
source: input.source,
|
|
41
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
42
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
43
|
+
};
|
|
44
|
+
this.writeContent(entry.id, entry.content);
|
|
45
|
+
idx.entries.push(this.toMeta(entry));
|
|
46
|
+
this.saveIndex(idx);
|
|
47
|
+
logger2.info("Knowledge entry created", { id: entry.id, type: entry.type, title: entry.title });
|
|
48
|
+
return entry;
|
|
49
|
+
}
|
|
50
|
+
update(id, patch) {
|
|
51
|
+
const idx = this.loadIndex();
|
|
52
|
+
const metaIdx = idx.entries.findIndex((e) => e.id === id);
|
|
53
|
+
if (metaIdx < 0) return null;
|
|
54
|
+
const meta = idx.entries[metaIdx];
|
|
55
|
+
if (patch.title !== void 0) meta.title = patch.title;
|
|
56
|
+
if (patch.tags !== void 0) meta.tags = patch.tags;
|
|
57
|
+
if (patch.source !== void 0) meta.source = patch.source;
|
|
58
|
+
meta.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
59
|
+
if (patch.content !== void 0) {
|
|
60
|
+
this.writeContent(id, patch.content);
|
|
61
|
+
}
|
|
62
|
+
idx.entries[metaIdx] = meta;
|
|
63
|
+
this.saveIndex(idx);
|
|
64
|
+
const content = patch.content ?? this.readContent(id);
|
|
65
|
+
logger2.info("Knowledge entry updated", { id, title: meta.title });
|
|
66
|
+
return { ...meta, content };
|
|
67
|
+
}
|
|
68
|
+
delete(id) {
|
|
69
|
+
const idx = this.loadIndex();
|
|
70
|
+
const before = idx.entries.length;
|
|
71
|
+
idx.entries = idx.entries.filter((e) => e.id !== id);
|
|
72
|
+
if (idx.entries.length === before) return false;
|
|
73
|
+
const filePath = path.join(this.entriesDir, id + ".md");
|
|
74
|
+
if (fs.existsSync(filePath)) fs.unlinkSync(filePath);
|
|
75
|
+
this.saveIndex(idx);
|
|
76
|
+
logger2.info("Knowledge entry deleted", { id });
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
search(query) {
|
|
80
|
+
const idx = this.loadIndex();
|
|
81
|
+
const lower = query.toLowerCase();
|
|
82
|
+
return idx.entries.filter(
|
|
83
|
+
(e) => e.title.toLowerCase().includes(lower) || e.tags.some((t) => t.toLowerCase().includes(lower))
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
getProjectMeta() {
|
|
87
|
+
const idx = this.loadIndex();
|
|
88
|
+
const meta = idx.entries.find((e) => e.type === "project-meta");
|
|
89
|
+
if (!meta) return null;
|
|
90
|
+
return { ...meta, content: this.readContent(meta.id) };
|
|
91
|
+
}
|
|
92
|
+
upsertProjectMeta(content, knowledge) {
|
|
93
|
+
const existing = this.getProjectMeta();
|
|
94
|
+
if (existing) {
|
|
95
|
+
return this.update(existing.id, { content, title: "\u9879\u76EE\u5206\u6790" });
|
|
96
|
+
}
|
|
97
|
+
return this.create({
|
|
98
|
+
type: "project-meta",
|
|
99
|
+
title: "\u9879\u76EE\u5206\u6790",
|
|
100
|
+
content,
|
|
101
|
+
tags: knowledge ? [knowledge.structure.primaryLanguage, ...knowledge.structure.frameworks] : []
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
setLastAnalyzedAt(time) {
|
|
105
|
+
const idx = this.loadIndex();
|
|
106
|
+
idx.lastAnalyzedAt = time;
|
|
107
|
+
this.saveIndex(idx);
|
|
108
|
+
}
|
|
109
|
+
getStats() {
|
|
110
|
+
const idx = this.loadIndex();
|
|
111
|
+
const byType = {
|
|
112
|
+
"project-meta": 0,
|
|
113
|
+
custom: 0,
|
|
114
|
+
iwiki: 0,
|
|
115
|
+
gongfeng: 0
|
|
116
|
+
};
|
|
117
|
+
for (const e of idx.entries) {
|
|
118
|
+
byType[e.type] = (byType[e.type] || 0) + 1;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
total: idx.entries.length,
|
|
122
|
+
byType,
|
|
123
|
+
lastAnalyzedAt: idx.lastAnalyzedAt
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
getAllEntries() {
|
|
127
|
+
const idx = this.loadIndex();
|
|
128
|
+
return idx.entries.map((meta) => ({
|
|
129
|
+
...meta,
|
|
130
|
+
content: this.readContent(meta.id)
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
migrateFromLegacy(legacyPath) {
|
|
134
|
+
if (!fs.existsSync(legacyPath)) return;
|
|
135
|
+
const idx = this.loadIndex();
|
|
136
|
+
if (idx.entries.some((e) => e.type === "project-meta")) return;
|
|
137
|
+
try {
|
|
138
|
+
const raw = fs.readFileSync(legacyPath, "utf-8");
|
|
139
|
+
const knowledge = JSON.parse(raw);
|
|
140
|
+
const markdown = projectKnowledgeToMarkdown(knowledge);
|
|
141
|
+
this.upsertProjectMeta(markdown, knowledge);
|
|
142
|
+
this.setLastAnalyzedAt(knowledge.generatedAt || (/* @__PURE__ */ new Date()).toISOString());
|
|
143
|
+
logger2.info("Migrated legacy knowledge.json", { path: legacyPath });
|
|
144
|
+
} catch (err) {
|
|
145
|
+
logger2.warn("Failed to migrate legacy knowledge.json", { error: err.message });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
ensureDirs() {
|
|
149
|
+
if (!fs.existsSync(this.dataDir)) {
|
|
150
|
+
fs.mkdirSync(this.dataDir, { recursive: true });
|
|
151
|
+
}
|
|
152
|
+
if (!fs.existsSync(this.entriesDir)) {
|
|
153
|
+
fs.mkdirSync(this.entriesDir, { recursive: true });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
loadIndex() {
|
|
157
|
+
if (this.index) return this.index;
|
|
158
|
+
this.ensureDirs();
|
|
159
|
+
if (fs.existsSync(this.indexPath)) {
|
|
160
|
+
try {
|
|
161
|
+
const raw = fs.readFileSync(this.indexPath, "utf-8");
|
|
162
|
+
this.index = JSON.parse(raw);
|
|
163
|
+
return this.index;
|
|
164
|
+
} catch {
|
|
165
|
+
logger2.warn("Failed to parse knowledge index, starting fresh");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
this.index = { version: 1, entries: [] };
|
|
169
|
+
return this.index;
|
|
170
|
+
}
|
|
171
|
+
saveIndex(idx) {
|
|
172
|
+
this.ensureDirs();
|
|
173
|
+
fs.writeFileSync(this.indexPath, JSON.stringify(idx, null, 2), "utf-8");
|
|
174
|
+
this.index = idx;
|
|
175
|
+
}
|
|
176
|
+
readContent(id) {
|
|
177
|
+
const filePath = path.join(this.entriesDir, id + ".md");
|
|
178
|
+
if (!fs.existsSync(filePath)) return "";
|
|
179
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
180
|
+
}
|
|
181
|
+
writeContent(id, content) {
|
|
182
|
+
this.ensureDirs();
|
|
183
|
+
fs.writeFileSync(path.join(this.entriesDir, id + ".md"), content, "utf-8");
|
|
184
|
+
}
|
|
185
|
+
toMeta(entry) {
|
|
186
|
+
const { content: _content, ...meta } = entry;
|
|
187
|
+
return meta;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
function projectKnowledgeToMarkdown(k) {
|
|
191
|
+
const lines = ["# \u9879\u76EE\u5206\u6790\u62A5\u544A", ""];
|
|
192
|
+
lines.push("> \u751F\u6210\u65F6\u95F4: " + k.generatedAt);
|
|
193
|
+
if (k.repoPath) lines.push("> \u9879\u76EE\u8DEF\u5F84: " + k.repoPath);
|
|
194
|
+
lines.push("");
|
|
195
|
+
if (k.businessContext?.purpose) {
|
|
196
|
+
lines.push("## \u4E1A\u52A1\u4E0A\u4E0B\u6587");
|
|
197
|
+
lines.push("- \u9879\u76EE\u76EE\u7684: " + k.businessContext.purpose);
|
|
198
|
+
if (k.businessContext.targetUsers) lines.push("- \u76EE\u6807\u7528\u6237: " + k.businessContext.targetUsers);
|
|
199
|
+
if (k.businessContext.domain) lines.push("- \u4E1A\u52A1\u9886\u57DF: " + k.businessContext.domain);
|
|
200
|
+
if (k.businessContext.coreFeatures?.length) {
|
|
201
|
+
lines.push("- \u6838\u5FC3\u529F\u80FD:");
|
|
202
|
+
for (const feat of k.businessContext.coreFeatures) {
|
|
203
|
+
lines.push(" - " + feat);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
lines.push("");
|
|
207
|
+
}
|
|
208
|
+
if (k.architecture?.overview) {
|
|
209
|
+
lines.push("## \u67B6\u6784");
|
|
210
|
+
lines.push("");
|
|
211
|
+
lines.push(k.architecture.overview);
|
|
212
|
+
lines.push("");
|
|
213
|
+
if (k.architecture.keyModules?.length) {
|
|
214
|
+
lines.push("### \u5173\u952E\u6A21\u5757");
|
|
215
|
+
for (const mod of k.architecture.keyModules) {
|
|
216
|
+
lines.push("- **" + mod.name + "** (`" + mod.path + "`): " + mod.responsibility);
|
|
217
|
+
}
|
|
218
|
+
lines.push("");
|
|
219
|
+
}
|
|
220
|
+
if (k.architecture.dataFlow) {
|
|
221
|
+
lines.push("### \u6838\u5FC3\u6570\u636E\u6D41");
|
|
222
|
+
lines.push("");
|
|
223
|
+
lines.push(k.architecture.dataFlow);
|
|
224
|
+
lines.push("");
|
|
225
|
+
}
|
|
226
|
+
if (k.architecture.designPatterns?.length) {
|
|
227
|
+
lines.push("### \u8BBE\u8BA1\u6A21\u5F0F");
|
|
228
|
+
lines.push(k.architecture.designPatterns.join(", "));
|
|
229
|
+
lines.push("");
|
|
230
|
+
}
|
|
231
|
+
if (k.architecture.externalDependencies?.length) {
|
|
232
|
+
lines.push("### \u5916\u90E8\u4F9D\u8D56");
|
|
233
|
+
for (const dep of k.architecture.externalDependencies) {
|
|
234
|
+
lines.push("- " + dep);
|
|
235
|
+
}
|
|
236
|
+
lines.push("");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (k.domainConcepts?.length) {
|
|
240
|
+
lines.push("## \u9886\u57DF\u6982\u5FF5");
|
|
241
|
+
for (const concept of k.domainConcepts) {
|
|
242
|
+
lines.push("- **" + concept.term + "**: " + concept.definition);
|
|
243
|
+
}
|
|
244
|
+
lines.push("");
|
|
245
|
+
}
|
|
246
|
+
lines.push("## \u9879\u76EE\u7ED3\u6784");
|
|
247
|
+
lines.push("- \u4E3B\u8981\u8BED\u8A00: " + k.structure.primaryLanguage);
|
|
248
|
+
if (k.structure.frameworks.length) lines.push("- \u6846\u67B6: " + k.structure.frameworks.join(", "));
|
|
249
|
+
if (k.structure.description) lines.push("- \u63CF\u8FF0: " + k.structure.description);
|
|
250
|
+
lines.push("- Monorepo: " + (k.structure.isMonorepo ? "\u662F" : "\u5426"));
|
|
251
|
+
if (k.structure.frontendDir) lines.push("- \u524D\u7AEF\u76EE\u5F55: " + k.structure.frontendDir);
|
|
252
|
+
if (k.structure.e2eDir) lines.push("- E2E \u76EE\u5F55: " + k.structure.e2eDir);
|
|
253
|
+
if (k.structure.e2eTool) lines.push("- E2E \u5DE5\u5177: " + k.structure.e2eTool);
|
|
254
|
+
lines.push("");
|
|
255
|
+
lines.push("## \u5DE5\u5177\u94FE");
|
|
256
|
+
lines.push("- \u5305\u7BA1\u7406\u5668: " + k.toolchain.packageManager);
|
|
257
|
+
lines.push("- \u5B89\u88C5\u547D\u4EE4: `" + k.toolchain.installCommand + "`");
|
|
258
|
+
if (k.toolchain.lintCommand) lines.push("- Lint: `" + k.toolchain.lintCommand + "`");
|
|
259
|
+
if (k.toolchain.buildCommand) lines.push("- Build: `" + k.toolchain.buildCommand + "`");
|
|
260
|
+
if (k.toolchain.testCommand) lines.push("- Test: `" + k.toolchain.testCommand + "`");
|
|
261
|
+
lines.push("");
|
|
262
|
+
lines.push("## \u4EE3\u7801\u98CE\u683C");
|
|
263
|
+
lines.push("- \u7F29\u8FDB: " + k.codeStyle.indentSize + " " + k.codeStyle.indentStyle);
|
|
264
|
+
lines.push("- \u884C\u5BBD: " + k.codeStyle.lineWidth);
|
|
265
|
+
if (k.codeStyle.additionalRules?.length) {
|
|
266
|
+
for (const rule of k.codeStyle.additionalRules) {
|
|
267
|
+
lines.push("- " + rule);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
lines.push("");
|
|
271
|
+
if (k.agentKnowledge?.summary) {
|
|
272
|
+
lines.push("## Agent \u77E5\u8BC6\u6C89\u6DC0");
|
|
273
|
+
lines.push("");
|
|
274
|
+
lines.push(k.agentKnowledge.summary);
|
|
275
|
+
lines.push("");
|
|
276
|
+
if (k.agentKnowledge.cursorRules?.length) {
|
|
277
|
+
lines.push("### Cursor \u89C4\u5219");
|
|
278
|
+
for (const rule of k.agentKnowledge.cursorRules) {
|
|
279
|
+
lines.push("- **" + rule.filename + "**: " + rule.purpose);
|
|
280
|
+
if (rule.keyPoints?.length) {
|
|
281
|
+
for (const point of rule.keyPoints) {
|
|
282
|
+
lines.push(" - " + point);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
lines.push("");
|
|
287
|
+
}
|
|
288
|
+
if (k.agentKnowledge.claudeMdSummary) {
|
|
289
|
+
lines.push("### CLAUDE.md \u6458\u8981");
|
|
290
|
+
lines.push("");
|
|
291
|
+
lines.push(k.agentKnowledge.claudeMdSummary);
|
|
292
|
+
lines.push("");
|
|
293
|
+
}
|
|
294
|
+
if (k.agentKnowledge.conventions?.length) {
|
|
295
|
+
lines.push("### \u5F00\u53D1\u7EA6\u5B9A");
|
|
296
|
+
for (const conv of k.agentKnowledge.conventions) {
|
|
297
|
+
lines.push("- " + conv);
|
|
298
|
+
}
|
|
299
|
+
lines.push("");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (k.knownIssues?.length) {
|
|
303
|
+
lines.push("## \u5DF2\u77E5\u95EE\u9898");
|
|
304
|
+
for (const issue of k.knownIssues) {
|
|
305
|
+
const pattern = issue.pattern ? " (\u5339\u914D: `" + issue.pattern + "`)" : "";
|
|
306
|
+
lines.push("- **" + issue.description + "**" + pattern);
|
|
307
|
+
lines.push(" \u5EFA\u8BAE: " + issue.advice);
|
|
308
|
+
}
|
|
309
|
+
lines.push("");
|
|
310
|
+
}
|
|
311
|
+
return lines.join("\n");
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export {
|
|
315
|
+
KnowledgeStore,
|
|
316
|
+
projectKnowledgeToMarkdown
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=chunk-5JYCGAU3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/knowledge/KnowledgeStore.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { logger as rootLogger } from '../logger.js';\nimport type {\n KnowledgeEntry,\n KnowledgeEntryMeta,\n KnowledgeEntryType,\n KnowledgeIndex,\n KnowledgeStats,\n} from './KnowledgeEntry.js';\nimport type { ProjectKnowledge } from './ProjectKnowledge.js';\n\nconst logger = rootLogger.child('KnowledgeStore');\n\nexport class KnowledgeStore {\n private dataDir: string;\n private indexPath: string;\n private entriesDir: string;\n private index: KnowledgeIndex | null = null;\n\n constructor(dataDir: string) {\n this.dataDir = dataDir;\n this.indexPath = path.join(dataDir, 'index.json');\n this.entriesDir = path.join(dataDir, 'entries');\n }\n\n list(type?: KnowledgeEntryType): KnowledgeEntryMeta[] {\n const idx = this.loadIndex();\n if (!type) return idx.entries;\n return idx.entries.filter(e => e.type === type);\n }\n\n get(id: string): KnowledgeEntry | null {\n const idx = this.loadIndex();\n const meta = idx.entries.find(e => e.id === id);\n if (!meta) return null;\n return { ...meta, content: this.readContent(id) };\n }\n\n create(input: {\n type: KnowledgeEntryType;\n title: string;\n content: string;\n tags?: string[];\n source?: KnowledgeEntry['source'];\n }): KnowledgeEntry {\n this.ensureDirs();\n const idx = this.loadIndex();\n\n const entry: KnowledgeEntry = {\n id: randomUUID(),\n type: input.type,\n title: input.title,\n content: input.content,\n tags: input.tags ?? [],\n source: input.source,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n this.writeContent(entry.id, entry.content);\n idx.entries.push(this.toMeta(entry));\n this.saveIndex(idx);\n\n logger.info('Knowledge entry created', { id: entry.id, type: entry.type, title: entry.title });\n return entry;\n }\n\n update(\n id: string,\n patch: Partial<Pick<KnowledgeEntry, 'title' | 'content' | 'tags' | 'source'>>,\n ): KnowledgeEntry | null {\n const idx = this.loadIndex();\n const metaIdx = idx.entries.findIndex(e => e.id === id);\n if (metaIdx < 0) return null;\n\n const meta = idx.entries[metaIdx];\n if (patch.title !== undefined) meta.title = patch.title;\n if (patch.tags !== undefined) meta.tags = patch.tags;\n if (patch.source !== undefined) meta.source = patch.source;\n meta.updatedAt = new Date().toISOString();\n\n if (patch.content !== undefined) {\n this.writeContent(id, patch.content);\n }\n\n idx.entries[metaIdx] = meta;\n this.saveIndex(idx);\n\n const content = patch.content ?? this.readContent(id);\n logger.info('Knowledge entry updated', { id, title: meta.title });\n return { ...meta, content };\n }\n\n delete(id: string): boolean {\n const idx = this.loadIndex();\n const before = idx.entries.length;\n idx.entries = idx.entries.filter(e => e.id !== id);\n if (idx.entries.length === before) return false;\n\n const filePath = path.join(this.entriesDir, id + '.md');\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath);\n\n this.saveIndex(idx);\n logger.info('Knowledge entry deleted', { id });\n return true;\n }\n\n search(query: string): KnowledgeEntryMeta[] {\n const idx = this.loadIndex();\n const lower = query.toLowerCase();\n return idx.entries.filter(e =>\n e.title.toLowerCase().includes(lower)\n || e.tags.some(t => t.toLowerCase().includes(lower)),\n );\n }\n\n getProjectMeta(): KnowledgeEntry | null {\n const idx = this.loadIndex();\n const meta = idx.entries.find(e => e.type === 'project-meta');\n if (!meta) return null;\n return { ...meta, content: this.readContent(meta.id) };\n }\n\n upsertProjectMeta(content: string, knowledge?: ProjectKnowledge): KnowledgeEntry {\n const existing = this.getProjectMeta();\n if (existing) {\n return this.update(existing.id, { content, title: '项目分析' })!;\n }\n return this.create({\n type: 'project-meta',\n title: '项目分析',\n content,\n tags: knowledge\n ? [knowledge.structure.primaryLanguage, ...knowledge.structure.frameworks]\n : [],\n });\n }\n\n setLastAnalyzedAt(time: string): void {\n const idx = this.loadIndex();\n idx.lastAnalyzedAt = time;\n this.saveIndex(idx);\n }\n\n getStats(): KnowledgeStats {\n const idx = this.loadIndex();\n const byType: Record<KnowledgeEntryType, number> = {\n 'project-meta': 0,\n custom: 0,\n iwiki: 0,\n gongfeng: 0,\n };\n for (const e of idx.entries) {\n byType[e.type] = (byType[e.type] || 0) + 1;\n }\n return {\n total: idx.entries.length,\n byType,\n lastAnalyzedAt: idx.lastAnalyzedAt,\n };\n }\n\n getAllEntries(): KnowledgeEntry[] {\n const idx = this.loadIndex();\n return idx.entries.map(meta => ({\n ...meta,\n content: this.readContent(meta.id),\n }));\n }\n\n migrateFromLegacy(legacyPath: string): void {\n if (!fs.existsSync(legacyPath)) return;\n const idx = this.loadIndex();\n if (idx.entries.some(e => e.type === 'project-meta')) return;\n\n try {\n const raw = fs.readFileSync(legacyPath, 'utf-8');\n const knowledge = JSON.parse(raw) as ProjectKnowledge;\n const markdown = projectKnowledgeToMarkdown(knowledge);\n this.upsertProjectMeta(markdown, knowledge);\n this.setLastAnalyzedAt(knowledge.generatedAt || new Date().toISOString());\n logger.info('Migrated legacy knowledge.json', { path: legacyPath });\n } catch (err) {\n logger.warn('Failed to migrate legacy knowledge.json', { error: (err as Error).message });\n }\n }\n\n private ensureDirs(): void {\n if (!fs.existsSync(this.dataDir)) {\n fs.mkdirSync(this.dataDir, { recursive: true });\n }\n if (!fs.existsSync(this.entriesDir)) {\n fs.mkdirSync(this.entriesDir, { recursive: true });\n }\n }\n\n private loadIndex(): KnowledgeIndex {\n if (this.index) return this.index;\n\n this.ensureDirs();\n if (fs.existsSync(this.indexPath)) {\n try {\n const raw = fs.readFileSync(this.indexPath, 'utf-8');\n this.index = JSON.parse(raw) as KnowledgeIndex;\n return this.index;\n } catch {\n logger.warn('Failed to parse knowledge index, starting fresh');\n }\n }\n\n this.index = { version: 1, entries: [] };\n return this.index;\n }\n\n private saveIndex(idx: KnowledgeIndex): void {\n this.ensureDirs();\n fs.writeFileSync(this.indexPath, JSON.stringify(idx, null, 2), 'utf-8');\n this.index = idx;\n }\n\n private readContent(id: string): string {\n const filePath = path.join(this.entriesDir, id + '.md');\n if (!fs.existsSync(filePath)) return '';\n return fs.readFileSync(filePath, 'utf-8');\n }\n\n private writeContent(id: string, content: string): void {\n this.ensureDirs();\n fs.writeFileSync(path.join(this.entriesDir, id + '.md'), content, 'utf-8');\n }\n\n private toMeta(entry: KnowledgeEntry): KnowledgeEntryMeta {\n const { content: _content, ...meta } = entry;\n return meta;\n }\n}\n\nexport function projectKnowledgeToMarkdown(k: ProjectKnowledge): string {\n const lines: string[] = ['# 项目分析报告', ''];\n lines.push('> 生成时间: ' + k.generatedAt);\n if (k.repoPath) lines.push('> 项目路径: ' + k.repoPath);\n lines.push('');\n\n // Business context (placed first for readability)\n if (k.businessContext?.purpose) {\n lines.push('## 业务上下文');\n lines.push('- 项目目的: ' + k.businessContext.purpose);\n if (k.businessContext.targetUsers) lines.push('- 目标用户: ' + k.businessContext.targetUsers);\n if (k.businessContext.domain) lines.push('- 业务领域: ' + k.businessContext.domain);\n if (k.businessContext.coreFeatures?.length) {\n lines.push('- 核心功能:');\n for (const feat of k.businessContext.coreFeatures) {\n lines.push(' - ' + feat);\n }\n }\n lines.push('');\n }\n\n // Architecture\n if (k.architecture?.overview) {\n lines.push('## 架构');\n lines.push('');\n lines.push(k.architecture.overview);\n lines.push('');\n\n if (k.architecture.keyModules?.length) {\n lines.push('### 关键模块');\n for (const mod of k.architecture.keyModules) {\n lines.push('- **' + mod.name + '** (`' + mod.path + '`): ' + mod.responsibility);\n }\n lines.push('');\n }\n\n if (k.architecture.dataFlow) {\n lines.push('### 核心数据流');\n lines.push('');\n lines.push(k.architecture.dataFlow);\n lines.push('');\n }\n\n if (k.architecture.designPatterns?.length) {\n lines.push('### 设计模式');\n lines.push(k.architecture.designPatterns.join(', '));\n lines.push('');\n }\n\n if (k.architecture.externalDependencies?.length) {\n lines.push('### 外部依赖');\n for (const dep of k.architecture.externalDependencies) {\n lines.push('- ' + dep);\n }\n lines.push('');\n }\n }\n\n // Domain concepts\n if (k.domainConcepts?.length) {\n lines.push('## 领域概念');\n for (const concept of k.domainConcepts) {\n lines.push('- **' + concept.term + '**: ' + concept.definition);\n }\n lines.push('');\n }\n\n lines.push('## 项目结构');\n lines.push('- 主要语言: ' + k.structure.primaryLanguage);\n if (k.structure.frameworks.length) lines.push('- 框架: ' + k.structure.frameworks.join(', '));\n if (k.structure.description) lines.push('- 描述: ' + k.structure.description);\n lines.push('- Monorepo: ' + (k.structure.isMonorepo ? '是' : '否'));\n if (k.structure.frontendDir) lines.push('- 前端目录: ' + k.structure.frontendDir);\n if (k.structure.e2eDir) lines.push('- E2E 目录: ' + k.structure.e2eDir);\n if (k.structure.e2eTool) lines.push('- E2E 工具: ' + k.structure.e2eTool);\n lines.push('');\n\n lines.push('## 工具链');\n lines.push('- 包管理器: ' + k.toolchain.packageManager);\n lines.push('- 安装命令: `' + k.toolchain.installCommand + '`');\n if (k.toolchain.lintCommand) lines.push('- Lint: `' + k.toolchain.lintCommand + '`');\n if (k.toolchain.buildCommand) lines.push('- Build: `' + k.toolchain.buildCommand + '`');\n if (k.toolchain.testCommand) lines.push('- Test: `' + k.toolchain.testCommand + '`');\n lines.push('');\n\n lines.push('## 代码风格');\n lines.push('- 缩进: ' + k.codeStyle.indentSize + ' ' + k.codeStyle.indentStyle);\n lines.push('- 行宽: ' + k.codeStyle.lineWidth);\n if (k.codeStyle.additionalRules?.length) {\n for (const rule of k.codeStyle.additionalRules) {\n lines.push('- ' + rule);\n }\n }\n lines.push('');\n\n // Agent knowledge\n if (k.agentKnowledge?.summary) {\n lines.push('## Agent 知识沉淀');\n lines.push('');\n lines.push(k.agentKnowledge.summary);\n lines.push('');\n\n if (k.agentKnowledge.cursorRules?.length) {\n lines.push('### Cursor 规则');\n for (const rule of k.agentKnowledge.cursorRules) {\n lines.push('- **' + rule.filename + '**: ' + rule.purpose);\n if (rule.keyPoints?.length) {\n for (const point of rule.keyPoints) {\n lines.push(' - ' + point);\n }\n }\n }\n lines.push('');\n }\n\n if (k.agentKnowledge.claudeMdSummary) {\n lines.push('### CLAUDE.md 摘要');\n lines.push('');\n lines.push(k.agentKnowledge.claudeMdSummary);\n lines.push('');\n }\n\n if (k.agentKnowledge.conventions?.length) {\n lines.push('### 开发约定');\n for (const conv of k.agentKnowledge.conventions) {\n lines.push('- ' + conv);\n }\n lines.push('');\n }\n }\n\n if (k.knownIssues?.length) {\n lines.push('## 已知问题');\n for (const issue of k.knownIssues) {\n const pattern = issue.pattern ? ' (匹配: `' + issue.pattern + '`)' : '';\n lines.push('- **' + issue.description + '**' + pattern);\n lines.push(' 建议: ' + issue.advice);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["logger"]}
|