mcp-cognition-engine 1.0.0-alpha.1

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 (158) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +281 -0
  3. package/dist/cli.d.ts +18 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +66 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cognition-engine/ast-constraint-solver.d.ts +67 -0
  8. package/dist/cognition-engine/ast-constraint-solver.d.ts.map +1 -0
  9. package/dist/cognition-engine/ast-constraint-solver.js +294 -0
  10. package/dist/cognition-engine/ast-constraint-solver.js.map +1 -0
  11. package/dist/cognition-engine/constraint-validator.d.ts +35 -0
  12. package/dist/cognition-engine/constraint-validator.d.ts.map +1 -0
  13. package/dist/cognition-engine/constraint-validator.js +55 -0
  14. package/dist/cognition-engine/constraint-validator.js.map +1 -0
  15. package/dist/cognition-engine/graph-traverser.d.ts +43 -0
  16. package/dist/cognition-engine/graph-traverser.d.ts.map +1 -0
  17. package/dist/cognition-engine/graph-traverser.js +205 -0
  18. package/dist/cognition-engine/graph-traverser.js.map +1 -0
  19. package/dist/cognition-engine/index.d.ts +51 -0
  20. package/dist/cognition-engine/index.d.ts.map +1 -0
  21. package/dist/cognition-engine/index.js +60 -0
  22. package/dist/cognition-engine/index.js.map +1 -0
  23. package/dist/cognition-engine/intent-recognizer.d.ts +25 -0
  24. package/dist/cognition-engine/intent-recognizer.d.ts.map +1 -0
  25. package/dist/cognition-engine/intent-recognizer.js +226 -0
  26. package/dist/cognition-engine/intent-recognizer.js.map +1 -0
  27. package/dist/cognition-engine/types.d.ts +96 -0
  28. package/dist/cognition-engine/types.d.ts.map +1 -0
  29. package/dist/cognition-engine/types.js +17 -0
  30. package/dist/cognition-engine/types.js.map +1 -0
  31. package/dist/conflict/arbitrator.d.ts +24 -0
  32. package/dist/conflict/arbitrator.d.ts.map +1 -0
  33. package/dist/conflict/arbitrator.js +43 -0
  34. package/dist/conflict/arbitrator.js.map +1 -0
  35. package/dist/index.d.ts +17 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +90 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/legacy-engine/ast-diff.d.ts +23 -0
  40. package/dist/legacy-engine/ast-diff.d.ts.map +1 -0
  41. package/dist/legacy-engine/ast-diff.js +146 -0
  42. package/dist/legacy-engine/ast-diff.js.map +1 -0
  43. package/dist/legacy-engine/ast-node.d.ts +24 -0
  44. package/dist/legacy-engine/ast-node.d.ts.map +1 -0
  45. package/dist/legacy-engine/ast-node.js +52 -0
  46. package/dist/legacy-engine/ast-node.js.map +1 -0
  47. package/dist/legacy-engine/parsers.d.ts +34 -0
  48. package/dist/legacy-engine/parsers.d.ts.map +1 -0
  49. package/dist/legacy-engine/parsers.js +134 -0
  50. package/dist/legacy-engine/parsers.js.map +1 -0
  51. package/dist/legacy-engine/regex-fallback.d.ts +23 -0
  52. package/dist/legacy-engine/regex-fallback.d.ts.map +1 -0
  53. package/dist/legacy-engine/regex-fallback.js +40 -0
  54. package/dist/legacy-engine/regex-fallback.js.map +1 -0
  55. package/dist/legacy-engine/rule-generator.d.ts +31 -0
  56. package/dist/legacy-engine/rule-generator.d.ts.map +1 -0
  57. package/dist/legacy-engine/rule-generator.js +54 -0
  58. package/dist/legacy-engine/rule-generator.js.map +1 -0
  59. package/dist/legacy-engine/rule-matcher.d.ts +28 -0
  60. package/dist/legacy-engine/rule-matcher.d.ts.map +1 -0
  61. package/dist/legacy-engine/rule-matcher.js +79 -0
  62. package/dist/legacy-engine/rule-matcher.js.map +1 -0
  63. package/dist/legacy-engine/token-controller.d.ts +31 -0
  64. package/dist/legacy-engine/token-controller.d.ts.map +1 -0
  65. package/dist/legacy-engine/token-controller.js +66 -0
  66. package/dist/legacy-engine/token-controller.js.map +1 -0
  67. package/dist/middleware/response-validation.d.ts +27 -0
  68. package/dist/middleware/response-validation.d.ts.map +1 -0
  69. package/dist/middleware/response-validation.js +50 -0
  70. package/dist/middleware/response-validation.js.map +1 -0
  71. package/dist/modes/confirm.d.ts +29 -0
  72. package/dist/modes/confirm.d.ts.map +1 -0
  73. package/dist/modes/confirm.js +27 -0
  74. package/dist/modes/confirm.js.map +1 -0
  75. package/dist/modes/silent.d.ts +24 -0
  76. package/dist/modes/silent.d.ts.map +1 -0
  77. package/dist/modes/silent.js +24 -0
  78. package/dist/modes/silent.js.map +1 -0
  79. package/dist/resources/cognition-resources.d.ts +28 -0
  80. package/dist/resources/cognition-resources.d.ts.map +1 -0
  81. package/dist/resources/cognition-resources.js +124 -0
  82. package/dist/resources/cognition-resources.js.map +1 -0
  83. package/dist/storage/client.d.ts +26 -0
  84. package/dist/storage/client.d.ts.map +1 -0
  85. package/dist/storage/client.js +45 -0
  86. package/dist/storage/client.js.map +1 -0
  87. package/dist/storage/cognition-repository.d.ts +55 -0
  88. package/dist/storage/cognition-repository.d.ts.map +1 -0
  89. package/dist/storage/cognition-repository.js +287 -0
  90. package/dist/storage/cognition-repository.js.map +1 -0
  91. package/dist/storage/cognition-types.d.ts +96 -0
  92. package/dist/storage/cognition-types.d.ts.map +1 -0
  93. package/dist/storage/cognition-types.js +41 -0
  94. package/dist/storage/cognition-types.js.map +1 -0
  95. package/dist/storage/conflict-repo.d.ts +41 -0
  96. package/dist/storage/conflict-repo.d.ts.map +1 -0
  97. package/dist/storage/conflict-repo.js +67 -0
  98. package/dist/storage/conflict-repo.js.map +1 -0
  99. package/dist/storage/diff-log-repo.d.ts +48 -0
  100. package/dist/storage/diff-log-repo.d.ts.map +1 -0
  101. package/dist/storage/diff-log-repo.js +51 -0
  102. package/dist/storage/diff-log-repo.js.map +1 -0
  103. package/dist/storage/metric-repo.d.ts +20 -0
  104. package/dist/storage/metric-repo.d.ts.map +1 -0
  105. package/dist/storage/metric-repo.js +36 -0
  106. package/dist/storage/metric-repo.js.map +1 -0
  107. package/dist/storage/rule-repo.d.ts +66 -0
  108. package/dist/storage/rule-repo.d.ts.map +1 -0
  109. package/dist/storage/rule-repo.js +188 -0
  110. package/dist/storage/rule-repo.js.map +1 -0
  111. package/dist/tools/analyze-workspace.d.ts +26 -0
  112. package/dist/tools/analyze-workspace.d.ts.map +1 -0
  113. package/dist/tools/analyze-workspace.js +147 -0
  114. package/dist/tools/analyze-workspace.js.map +1 -0
  115. package/dist/tools/capture-diff.d.ts +26 -0
  116. package/dist/tools/capture-diff.d.ts.map +1 -0
  117. package/dist/tools/capture-diff.js +58 -0
  118. package/dist/tools/capture-diff.js.map +1 -0
  119. package/dist/tools/cognition-tools.d.ts +60 -0
  120. package/dist/tools/cognition-tools.d.ts.map +1 -0
  121. package/dist/tools/cognition-tools.js +170 -0
  122. package/dist/tools/cognition-tools.js.map +1 -0
  123. package/dist/tools/config-tools.d.ts +29 -0
  124. package/dist/tools/config-tools.d.ts.map +1 -0
  125. package/dist/tools/config-tools.js +58 -0
  126. package/dist/tools/config-tools.js.map +1 -0
  127. package/dist/tools/confirm-rule.d.ts +32 -0
  128. package/dist/tools/confirm-rule.d.ts.map +1 -0
  129. package/dist/tools/confirm-rule.js +64 -0
  130. package/dist/tools/confirm-rule.js.map +1 -0
  131. package/dist/tools/injection-approval.d.ts +43 -0
  132. package/dist/tools/injection-approval.d.ts.map +1 -0
  133. package/dist/tools/injection-approval.js +102 -0
  134. package/dist/tools/injection-approval.js.map +1 -0
  135. package/dist/tools/list-rules.d.ts +24 -0
  136. package/dist/tools/list-rules.d.ts.map +1 -0
  137. package/dist/tools/list-rules.js +20 -0
  138. package/dist/tools/list-rules.js.map +1 -0
  139. package/dist/tools/query-rules.d.ts +25 -0
  140. package/dist/tools/query-rules.d.ts.map +1 -0
  141. package/dist/tools/query-rules.js +65 -0
  142. package/dist/tools/query-rules.js.map +1 -0
  143. package/dist/tools/resolve-conflict.d.ts +33 -0
  144. package/dist/tools/resolve-conflict.d.ts.map +1 -0
  145. package/dist/tools/resolve-conflict.js +35 -0
  146. package/dist/tools/resolve-conflict.js.map +1 -0
  147. package/dist/types.d.ts +190 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +50 -0
  150. package/dist/types.js.map +1 -0
  151. package/docs/api-reference.md +1229 -0
  152. package/docs/community/feedback-playbook.md +94 -0
  153. package/docs/integration-snippets.md +100 -0
  154. package/docs/mcp-integration-guide.md +151 -0
  155. package/docs/phase4-mcp-feedback.md +155 -0
  156. package/docs/trust-governance-protocol.md +72 -0
  157. package/package.json +74 -0
  158. package/prisma/schema.prisma +145 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { getPrismaClient } from "./client.js";
17
+ import { TOKEN_LIMITS } from "../types.js";
18
+ export function toRule(r) {
19
+ return {
20
+ id: r.id,
21
+ projectId: r.projectId ?? undefined,
22
+ scope: r.scope,
23
+ priority: r.priority,
24
+ type: r.type,
25
+ pattern: r.pattern,
26
+ suggestion: r.suggestion,
27
+ language: r.language,
28
+ fileExtensions: r.fileExtensions ? r.fileExtensions.split(",") : undefined,
29
+ tags: r.tags ? r.tags.split(",") : undefined,
30
+ confidence: r.confidence,
31
+ source: r.source,
32
+ category: r.category ?? undefined,
33
+ status: r.status,
34
+ matchCount: r.matchCount,
35
+ createdAt: r.createdAt,
36
+ updatedAt: r.updatedAt,
37
+ lastUsedAt: r.lastUsedAt ?? undefined,
38
+ };
39
+ }
40
+ export class RuleRepo {
41
+ async create(spec) {
42
+ const prisma = getPrismaClient();
43
+ const r = await prisma.rule.create({
44
+ data: {
45
+ projectId: spec.projectId ?? null,
46
+ scope: spec.scope ?? "project",
47
+ type: spec.type,
48
+ pattern: spec.pattern,
49
+ suggestion: spec.suggestion,
50
+ language: spec.language,
51
+ fileExtensions: spec.fileExtensions?.join(",") ?? null,
52
+ tags: spec.tags?.join(",") ?? null,
53
+ category: spec.category ?? null,
54
+ confidence: "medium",
55
+ source: "auto",
56
+ },
57
+ });
58
+ return toRule(r);
59
+ }
60
+ /** Batch create rules inside a single transaction to prevent duplicates under WAL mode. */
61
+ async batchCreate(specs) {
62
+ const prisma = getPrismaClient();
63
+ return prisma.$transaction(specs.map(spec => prisma.rule.create({
64
+ data: {
65
+ projectId: spec.projectId ?? null,
66
+ scope: spec.scope ?? "project",
67
+ type: spec.type,
68
+ pattern: spec.pattern,
69
+ suggestion: spec.suggestion,
70
+ language: spec.language,
71
+ fileExtensions: spec.fileExtensions?.join(",") ?? null,
72
+ tags: spec.tags?.join(",") ?? null,
73
+ category: spec.category ?? null,
74
+ confidence: spec.confidence ?? "medium",
75
+ source: spec.source ?? "auto",
76
+ },
77
+ }))).then(rows => rows.map(toRule));
78
+ }
79
+ async findById(id) {
80
+ const prisma = getPrismaClient();
81
+ const r = await prisma.rule.findUnique({ where: { id } });
82
+ return r ? toRule(r) : null;
83
+ }
84
+ async updateStatus(id, status) {
85
+ const prisma = getPrismaClient();
86
+ const r = await prisma.rule.update({
87
+ where: { id },
88
+ data: { status },
89
+ });
90
+ return toRule(r);
91
+ }
92
+ async incrementMatchCount(id) {
93
+ const prisma = getPrismaClient();
94
+ await prisma.rule.update({
95
+ where: { id },
96
+ data: { matchCount: { increment: 1 }, lastUsedAt: new Date() },
97
+ });
98
+ }
99
+ async countByScope(scope) {
100
+ const prisma = getPrismaClient();
101
+ return prisma.rule.count({ where: { scope, status: "active" } });
102
+ }
103
+ async isLimitReached() {
104
+ const info = await this.getLimitInfo();
105
+ return info.reached;
106
+ }
107
+ /** Return detailed limit info including current counts and max thresholds. */
108
+ async getLimitInfo(projectId) {
109
+ const prisma = getPrismaClient();
110
+ const globalCount = await prisma.rule.count({ where: { status: "active" } });
111
+ const projectCount = projectId
112
+ ? await prisma.rule.count({ where: { projectId, status: "active" } })
113
+ : 0;
114
+ return {
115
+ reached: globalCount >= TOKEN_LIMITS.maxRulesGlobal || (projectId ? projectCount >= TOKEN_LIMITS.maxRulesPerProject : false),
116
+ globalCount,
117
+ globalMax: TOKEN_LIMITS.maxRulesGlobal,
118
+ projectCount,
119
+ projectMax: TOKEN_LIMITS.maxRulesPerProject,
120
+ };
121
+ }
122
+ async findConflicting(type, language, pattern) {
123
+ const prisma = getPrismaClient();
124
+ const rows = await prisma.rule.findMany({
125
+ where: { type, language, pattern: { contains: pattern }, status: "active" },
126
+ });
127
+ return rows.map(toRule);
128
+ }
129
+ /** Update a rule's pattern, suggestion, and/or category. Returns the updated rule. */
130
+ async updateContent(id, data) {
131
+ const prisma = getPrismaClient();
132
+ // Snapshot current content before update for audit trail
133
+ const current = await prisma.rule.findUnique({ where: { id }, select: { pattern: true, suggestion: true } });
134
+ if (current) {
135
+ await prisma.ruleVersion.create({
136
+ data: { ruleId: id, pattern: current.pattern, suggestion: current.suggestion, editedBy: data.editedBy ?? null },
137
+ });
138
+ }
139
+ const r = await prisma.rule.update({
140
+ where: { id },
141
+ data: {
142
+ ...(data.pattern !== undefined && { pattern: data.pattern }),
143
+ ...(data.suggestion !== undefined && { suggestion: data.suggestion }),
144
+ ...(data.category !== undefined && { category: data.category }),
145
+ },
146
+ });
147
+ return toRule(r);
148
+ }
149
+ async getRuleVersions(ruleId) {
150
+ const prisma = getPrismaClient();
151
+ return prisma.ruleVersion.findMany({ where: { ruleId }, orderBy: { createdAt: "desc" } });
152
+ }
153
+ async queryByMatch(language, fileExtension, projectId, tags) {
154
+ const prisma = getPrismaClient();
155
+ const conditions = [
156
+ { status: "active" },
157
+ { OR: [{ language: "*" }, { language }] },
158
+ ];
159
+ if (fileExtension) {
160
+ const ext = fileExtension.replace(".", "");
161
+ conditions.push({
162
+ OR: [
163
+ { fileExtensions: null },
164
+ { fileExtensions: { contains: ext } },
165
+ ],
166
+ });
167
+ }
168
+ const rows = await prisma.rule.findMany({ where: { AND: conditions }, orderBy: { priority: "desc" } });
169
+ return rows.map(toRule);
170
+ }
171
+ async list(filters) {
172
+ const prisma = getPrismaClient();
173
+ const where = {};
174
+ if (filters.language)
175
+ where.language = filters.language;
176
+ if (filters.scope)
177
+ where.scope = filters.scope;
178
+ if (filters.status)
179
+ where.status = filters.status;
180
+ if (filters.projectId)
181
+ where.projectId = filters.projectId;
182
+ const rows = await prisma.rule.findMany({
183
+ where, take: filters.limit ?? 50, skip: filters.offset ?? 0, orderBy: { createdAt: "desc" },
184
+ });
185
+ return rows.map(toRule);
186
+ }
187
+ }
188
+ //# sourceMappingURL=rule-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-repo.js","sourceRoot":"","sources":["../../src/storage/rule-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { RuleRepo } from "../storage/rule-repo.js";
17
+ import { DiffLogRepo } from "../storage/diff-log-repo.js";
18
+ import { MetricRepo } from "../storage/metric-repo.js";
19
+ import { AnalyzeWorkspaceInput } from "../types.js";
20
+ export declare function handleAnalyzeWorkspace(input: AnalyzeWorkspaceInput, ruleRepo: RuleRepo, diffLogRepo: DiffLogRepo, metricRepo: MetricRepo): Promise<{
21
+ content: {
22
+ type: string;
23
+ text: string;
24
+ }[];
25
+ }>;
26
+ //# sourceMappingURL=analyze-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-workspace.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,OAAO,EACL,qBAAqB,EAEtB,MAAM,aAAa,CAAC;AA0BrB,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU;;;;;GA+GrE"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { execSync } from "node:child_process";
17
+ import { readFileSync, existsSync } from "node:fs";
18
+ import { computeDiffWithFallback } from "../legacy-engine/parsers.js";
19
+ import { evaluateRuleCandidate } from "../legacy-engine/rule-generator.js";
20
+ import { detectConflict } from "../conflict/arbitrator.js";
21
+ import { RULE_GENERATION_THRESHOLDS, SKIP_PATTERNS, } from "../types.js";
22
+ function normalizePath(p) { return p.replace(/\\/g, "/"); }
23
+ function isSkipped(filePath) {
24
+ return SKIP_PATTERNS.some(pat => pat.test(normalizePath(filePath)));
25
+ }
26
+ const EXT_LANG = {
27
+ ts: "typescript", tsx: "tsx", js: "javascript", jsx: "javascript",
28
+ mjs: "javascript", cjs: "javascript", py: "python", go: "go",
29
+ };
30
+ function detectLang(filePath) {
31
+ const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
32
+ return EXT_LANG[ext] ?? null;
33
+ }
34
+ function git(args) {
35
+ try {
36
+ return execSync(`git ${args}`, { encoding: "utf-8", maxBuffer: 10 * 1024 * 1024 }).trim();
37
+ }
38
+ catch {
39
+ return "";
40
+ }
41
+ }
42
+ const CONCURRENCY = 5;
43
+ export async function handleAnalyzeWorkspace(input, ruleRepo, diffLogRepo, metricRepo) {
44
+ const startTime = performance.now();
45
+ const head = input.headCommit ?? "HEAD";
46
+ const result = { analyzedFiles: 0, skippedFiles: 0, generatedRules: [], conflicts: [], errors: [] };
47
+ const warnings = [];
48
+ // Check rule limits before processing (P1)
49
+ const limitInfo = await ruleRepo.getLimitInfo(input.taskId);
50
+ if (limitInfo.reached) {
51
+ warnings.push(`规则库已达上限:全局 ${limitInfo.globalCount}/${limitInfo.globalMax},项目 ${limitInfo.projectCount}/${limitInfo.projectMax}。建议归档或导出旧规则。`);
52
+ }
53
+ const diffOut = git(`diff --name-only ${input.baseCommit} ${head}`);
54
+ // Non-git mode: process fileContents directly with concurrency
55
+ if (input.fileContents && input.fileContents.length > 0) {
56
+ result.analyzedFiles = input.fileContents.length;
57
+ const cc = input.concurrency ?? CONCURRENCY;
58
+ for (let i = 0; i < input.fileContents.length; i += cc) {
59
+ await Promise.all(input.fileContents.slice(i, i + cc).map(async (fc) => {
60
+ const lang = detectLang(fc.path);
61
+ if (!lang) {
62
+ result.skippedFiles++;
63
+ return;
64
+ }
65
+ try {
66
+ const diffR = await computeDiffWithFallback(fc.originalContent ?? "", fc.modifiedContent, lang);
67
+ if (diffR.operations.length > 0) {
68
+ const evalR = evaluateRuleCandidate(diffR.operations, lang, 1, 1, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
69
+ if (evalR.generate && evalR.ruleCandidate) {
70
+ result.generatedRules.push({ rule: evalR.ruleCandidate, filePath: fc.path });
71
+ }
72
+ }
73
+ }
74
+ catch (err) {
75
+ result.errors.push({ filePath: fc.path, error: String(err) });
76
+ }
77
+ }));
78
+ }
79
+ await metricRepo.track("analyze_workspace", { taskId: input.taskId, analyzedFiles: result.analyzedFiles, rulesGenerated: result.generatedRules.length, source: input.taskId ? "codex" : "manual" });
80
+ return { content: [{ type: "text", text: JSON.stringify({ ...result, warnings: warnings.length > 0 ? warnings : undefined }) }] };
81
+ }
82
+ if (!diffOut) {
83
+ return { content: [{ type: "text", text: JSON.stringify({ error: "No diff output or git unavailable", result, warnings: warnings.length > 0 ? warnings : undefined }) }] };
84
+ }
85
+ const files = diffOut.split("\n").filter(Boolean).filter(f => !isSkipped(f));
86
+ result.skippedFiles = diffOut.split("\n").filter(Boolean).length - files.length;
87
+ async function processFile(fp) {
88
+ try {
89
+ const lang = detectLang(fp);
90
+ if (!lang || !existsSync(fp))
91
+ return;
92
+ const original = git(`show ${input.baseCommit}:${normalizePath(fp)}`);
93
+ if (!original)
94
+ return;
95
+ const modified = readFileSync(fp, "utf-8");
96
+ if (original === modified)
97
+ return;
98
+ const diffR = await computeDiffWithFallback(original, modified, lang);
99
+ if (diffR.operations.length === 0)
100
+ return;
101
+ const origHash = git(`hash-object ${normalizePath(fp)}`).substring(0, 8);
102
+ const distinctFiles = await diffLogRepo.countDistinctFiles(lang, origHash, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
103
+ const repeatCount = await diffLogRepo.countByPattern(lang, origHash, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
104
+ const evalR = evaluateRuleCandidate(diffR.operations, lang, distinctFiles + 1, repeatCount + 1, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
105
+ if (!evalR.generate || !evalR.ruleCandidate)
106
+ return;
107
+ // Skip rule creation if limits are reached (P1)
108
+ if (!limitInfo.reached) {
109
+ // Conflict check
110
+ const existing = await ruleRepo.findConflicting(evalR.ruleCandidate.type, lang, evalR.ruleCandidate.pattern);
111
+ for (const ex of existing) {
112
+ const check = detectConflict({ ...ex, tags: ex.tags ?? [] }, { ...evalR.ruleCandidate, id: "", createdAt: new Date(), updatedAt: new Date(), matchCount: 0, priority: 1.0, status: "pending", source: "auto" });
113
+ if (check.hasConflict) {
114
+ result.conflicts.push({ ruleA: evalR.ruleCandidate, ruleB: ex, reason: check.reason });
115
+ }
116
+ }
117
+ }
118
+ // Log diff
119
+ const modHash = git(`hash-object ${normalizePath(fp)}`).substring(0, 8);
120
+ await diffLogRepo.create({
121
+ filePath: fp, fileExtension: "." + (fp.split(".").pop() ?? ""), language: lang,
122
+ originalHash: origHash, modifiedHash: modHash,
123
+ diffContent: JSON.stringify(diffR.operations), astStatus: diffR.status,
124
+ diffType: diffR.operations[0]?.type ?? "update", operations: JSON.stringify(diffR.operations),
125
+ });
126
+ if (!limitInfo.reached) {
127
+ result.generatedRules.push({ rule: evalR.ruleCandidate, filePath: fp });
128
+ }
129
+ result.analyzedFiles++;
130
+ }
131
+ catch (err) {
132
+ result.errors.push({ filePath: fp, error: String(err) });
133
+ }
134
+ }
135
+ // Process with concurrency limit
136
+ for (let i = 0; i < files.length; i += CONCURRENCY) {
137
+ await Promise.all(files.slice(i, i + CONCURRENCY).map(processFile));
138
+ }
139
+ const durationMs = performance.now() - startTime;
140
+ await metricRepo.track("analyze_workspace", {
141
+ taskId: input.taskId, analyzedFiles: result.analyzedFiles,
142
+ rulesGenerated: result.generatedRules.length, conflictsFound: result.conflicts.length,
143
+ source: "codex", durationMs,
144
+ });
145
+ return { content: [{ type: "text", text: JSON.stringify({ ...result, warnings: warnings.length > 0 ? warnings : undefined }) }] };
146
+ }
147
+ //# sourceMappingURL=analyze-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-workspace.js","sourceRoot":"","sources":["../../src/tools/analyze-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { RuleRepo } from "../storage/rule-repo.js";
17
+ import { DiffLogRepo } from "../storage/diff-log-repo.js";
18
+ import { MetricRepo } from "../storage/metric-repo.js";
19
+ import { CaptureDiffInput } from "../types.js";
20
+ export declare function handleCaptureDiff(input: CaptureDiffInput, ruleRepo: RuleRepo, diffLogRepo: DiffLogRepo, metricRepo: MetricRepo, mode: "silent" | "confirm"): Promise<{
21
+ content: {
22
+ type: string;
23
+ text: string;
24
+ }[];
25
+ }>;
26
+ //# sourceMappingURL=capture-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-diff.d.ts","sourceRoot":"","sources":["../../src/tools/capture-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,OAAO,EAAE,gBAAgB,EAA8B,MAAM,aAAa,CAAC;AAQ3E,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS;;;;;GA4BhK"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { computeDiffWithFallback } from "../legacy-engine/parsers.js";
17
+ import { processSilent } from "../modes/silent.js";
18
+ import { buildConfirmCard } from "../modes/confirm.js";
19
+ import { RULE_GENERATION_THRESHOLDS } from "../types.js";
20
+ function simpleHash(s) {
21
+ let hash = 0;
22
+ for (let i = 0; i < s.length; i++) {
23
+ hash = ((hash << 5) - hash) + s.charCodeAt(i);
24
+ hash |= 0;
25
+ }
26
+ return hash.toString(16);
27
+ }
28
+ export async function handleCaptureDiff(input, ruleRepo, diffLogRepo, metricRepo, mode) {
29
+ const startTime = performance.now();
30
+ const fileExtension = input.filePath.split(".").pop() ?? "";
31
+ const originalHash = simpleHash(input.originalContent);
32
+ const modifiedHash = simpleHash(input.modifiedContent);
33
+ const diffResult = await computeDiffWithFallback(input.originalContent, input.modifiedContent, input.language);
34
+ await diffLogRepo.create({ filePath: input.filePath, fileExtension, language: input.language, projectId: input.projectId, originalHash, modifiedHash, diffContent: JSON.stringify(diffResult.operations), astStatus: diffResult.status, diffType: diffResult.operations[0]?.type ?? "update", operations: JSON.stringify(diffResult.operations) });
35
+ const distinctFiles = await diffLogRepo.countDistinctFiles(input.language, originalHash, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
36
+ const repeatCount = await diffLogRepo.countByPattern(input.language, originalHash, RULE_GENERATION_THRESHOLDS.repeatWindowDays);
37
+ // Check rule limits before generating rules (P1)
38
+ const limitInfo = await ruleRepo.getLimitInfo(input.projectId);
39
+ const warnings = [];
40
+ if (limitInfo.reached) {
41
+ warnings.push(`规则库已达上限:全局 ${limitInfo.globalCount}/${limitInfo.globalMax},项目 ${limitInfo.projectCount}/${limitInfo.projectMax}。建议归档或导出旧规则。`);
42
+ }
43
+ const durationMs = performance.now() - startTime;
44
+ await metricRepo.track("capture_diff", { language: input.language, opCount: diffResult.operations.length, astStatus: diffResult.status, durationMs });
45
+ if (mode === "silent") {
46
+ const result = await processSilent(diffResult.operations, input.language, distinctFiles, repeatCount, RULE_GENERATION_THRESHOLDS.repeatWindowDays, metricRepo);
47
+ if (!limitInfo.reached && result.generatedRule && result.ruleSpec) {
48
+ await ruleRepo.create({ ...result.ruleSpec, projectId: input.projectId });
49
+ await metricRepo.track("rule_auto_generated", { language: input.language, source: "capture_diff" });
50
+ }
51
+ return { content: [{ type: "text", text: JSON.stringify({ status: diffResult.status, opCount: diffResult.operations.length, notification: result.notification ?? null, warnings: warnings.length > 0 ? warnings : undefined }) }] };
52
+ }
53
+ else {
54
+ const card = await buildConfirmCard(diffResult.operations, input.language, distinctFiles, repeatCount, RULE_GENERATION_THRESHOLDS.repeatWindowDays, metricRepo);
55
+ return { content: [{ type: "text", text: JSON.stringify({ status: diffResult.status, opCount: diffResult.operations.length, confirmCard: card.card ?? null, warnings: warnings.length > 0 ? warnings : undefined }) }] };
56
+ }
57
+ }
58
+ //# sourceMappingURL=capture-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-diff.js","sourceRoot":"","sources":["../../src/tools/capture-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright 2026 熊高锐
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ interface CognitionQueryInput {
17
+ contextHash: string;
18
+ intentHint?: "REFACTOR" | "BUGFIX" | "BOILERPLATE";
19
+ maxDepth?: number;
20
+ }
21
+ interface CognitionValidateInput {
22
+ nodeId: string;
23
+ targetFileContent: string;
24
+ }
25
+ interface CognitionFeedbackInput {
26
+ nodeId: string;
27
+ edgeId?: string;
28
+ outcome: "ACCEPTED" | "REJECTED" | "MODIFIED";
29
+ comment?: string;
30
+ }
31
+ /**
32
+ * cognition_query — Traverse the cognition graph starting from a context hash.
33
+ * If intentHint is omitted, first runs intent recognition on the content hash string.
34
+ */
35
+ export declare function handleCognitionQuery(input: CognitionQueryInput): Promise<{
36
+ content: {
37
+ type: string;
38
+ text: string;
39
+ }[];
40
+ }>;
41
+ /**
42
+ * cognition_validate — Validate code content against a cognition node's AST template.
43
+ */
44
+ export declare function handleCognitionValidate(input: CognitionValidateInput): Promise<{
45
+ content: {
46
+ type: string;
47
+ text: string;
48
+ }[];
49
+ }>;
50
+ /**
51
+ * cognition_feedback — Record user feedback and adjust edge weights.
52
+ */
53
+ export declare function handleCognitionFeedback(input: CognitionFeedbackInput): Promise<{
54
+ content: {
55
+ type: string;
56
+ text: string;
57
+ }[];
58
+ }>;
59
+ export {};
60
+ //# sourceMappingURL=cognition-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cognition-tools.d.ts","sourceRoot":"","sources":["../../src/tools/cognition-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH,UAAU,mBAAmB;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA6CxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAgDxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAgDxD"}