soloforge 1.3.4 → 1.3.6

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 (96) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +80 -44
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.js +1 -1
  6. package/dist/bin/soloforge.d.ts.map +1 -1
  7. package/dist/bin/soloforge.js +83 -1
  8. package/dist/bin/soloforge.js.map +1 -1
  9. package/dist/engine/backend_implementation_contract.d.ts +1 -1
  10. package/dist/engine/backend_implementation_contract.d.ts.map +1 -1
  11. package/dist/engine/backend_implementation_contract.js +22 -0
  12. package/dist/engine/backend_implementation_contract.js.map +1 -1
  13. package/dist/engine/brainstorm_contract.d.ts +1 -1
  14. package/dist/engine/brainstorm_contract.js +1 -1
  15. package/dist/engine/code_maintainability_observability_contract.d.ts +1 -1
  16. package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -1
  17. package/dist/engine/code_maintainability_observability_contract.js +241 -3
  18. package/dist/engine/code_maintainability_observability_contract.js.map +1 -1
  19. package/dist/engine/contract_registry.js +1 -1
  20. package/dist/engine/diagnostic_registry.d.ts +1 -0
  21. package/dist/engine/diagnostic_registry.d.ts.map +1 -1
  22. package/dist/engine/diagnostic_registry.js +6 -0
  23. package/dist/engine/diagnostic_registry.js.map +1 -1
  24. package/dist/engine/dual_layer_mechanism_registry.js +1 -1
  25. package/dist/engine/extension_scenario_registry.js +4 -4
  26. package/dist/engine/extension_scenario_registry.js.map +1 -1
  27. package/dist/engine/foundation_scenario_runners.d.ts.map +1 -1
  28. package/dist/engine/foundation_scenario_runners.js +4 -2
  29. package/dist/engine/foundation_scenario_runners.js.map +1 -1
  30. package/dist/engine/historical_issue_mechanization_matrix.d.ts +28 -0
  31. package/dist/engine/historical_issue_mechanization_matrix.d.ts.map +1 -0
  32. package/dist/engine/historical_issue_mechanization_matrix.js +134 -0
  33. package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -0
  34. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  35. package/dist/engine/implementation_roadmap_registry.js +70 -13
  36. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  37. package/dist/engine/intent_expander.d.ts.map +1 -1
  38. package/dist/engine/intent_expander.js +151 -1
  39. package/dist/engine/intent_expander.js.map +1 -1
  40. package/dist/engine/next_action_planner.d.ts.map +1 -1
  41. package/dist/engine/next_action_planner.js +72 -4
  42. package/dist/engine/next_action_planner.js.map +1 -1
  43. package/dist/engine/project_knowledge_contract.d.ts +58 -0
  44. package/dist/engine/project_knowledge_contract.d.ts.map +1 -0
  45. package/dist/engine/project_knowledge_contract.js +298 -0
  46. package/dist/engine/project_knowledge_contract.js.map +1 -0
  47. package/dist/engine/project_knowledge_system_regression_matrix.d.ts +27 -0
  48. package/dist/engine/project_knowledge_system_regression_matrix.d.ts.map +1 -0
  49. package/dist/engine/project_knowledge_system_regression_matrix.js +295 -0
  50. package/dist/engine/project_knowledge_system_regression_matrix.js.map +1 -0
  51. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  52. package/dist/engine/release_issue_scenario_registry.js +297 -102
  53. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  54. package/dist/engine/release_readiness_gate.d.ts +1 -0
  55. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  56. package/dist/engine/release_readiness_gate.js +384 -5
  57. package/dist/engine/release_readiness_gate.js.map +1 -1
  58. package/dist/engine/technology_decision.js +5 -5
  59. package/dist/engine/technology_decision.js.map +1 -1
  60. package/dist/engine/template_asset_contract_registry.d.ts.map +1 -1
  61. package/dist/engine/template_asset_contract_registry.js +6 -5
  62. package/dist/engine/template_asset_contract_registry.js.map +1 -1
  63. package/dist/engine/verifier.js +1 -1
  64. package/dist/engine/verifier.js.map +1 -1
  65. package/dist/engine/workflow_navigation_contract.d.ts +10 -0
  66. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -1
  67. package/dist/knowledge/loader.d.ts +3 -1
  68. package/dist/knowledge/loader.d.ts.map +1 -1
  69. package/dist/knowledge/loader.js +2 -2
  70. package/dist/knowledge/loader.js.map +1 -1
  71. package/dist/types.d.ts +19 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +1 -1
  74. package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +1 -1
  75. package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +1 -1
  76. package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +1 -1
  77. package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +1 -1
  78. package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +1 -1
  79. package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +1 -1
  80. package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
  81. package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +3 -3
  82. package/templates/knowledge/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md +32 -3
  83. package/templates/knowledge/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +1 -1
  84. package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +2 -2
  85. package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/351/227/250/346/216/247/350/247/204/345/210/231.md +1 -1
  86. package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +1 -1
  87. package/templates/scaffolds/react/Form.tsx.hbs +11 -3
  88. package/templates/scaffolds/react/List.tsx.hbs +11 -3
  89. package/templates/scaffolds/react/Page.tsx.hbs +1 -1
  90. package/templates/scaffolds/react/types.ts.hbs +4 -1
  91. package/templates/scaffolds/spring-boot/Controller.java.hbs +18 -4
  92. package/templates/scaffolds/spring-boot/DTO.java.hbs +4 -1
  93. package/templates/scaffolds/spring-boot/Entity.java.hbs +8 -3
  94. package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
  95. package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +34 -10
  96. package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +0 -1
@@ -0,0 +1,298 @@
1
+ /**
2
+ * 用户项目知识合同。
3
+ *
4
+ * 内置 templates/** 解决 SoloForge 自带资产的同步与可见性;
5
+ * 用户项目 .soloforge/knowledge/** 则需要独立承载: 允许用户沉淀项目特有规则,
6
+ * 同时保证它们能被索引、选中、注入或审计,而不是静态文件。
7
+ */
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import crypto from "node:crypto";
11
+ import matter from "gray-matter";
12
+ import YAML from "yaml";
13
+ import { getProjectKnowledgeDir } from "../knowledge/loader.js";
14
+ import { readSyncManifest, resolveAuthoritativeIdentity, computeAuthoritativeHash, } from "./template_init_sync.js";
15
+ import { getContractDecision } from "./template_asset_contract_registry.js";
16
+ function listKnowledgeFiles(dir) {
17
+ if (!fs.existsSync(dir))
18
+ return [];
19
+ const out = [];
20
+ const stack = [dir];
21
+ while (stack.length > 0) {
22
+ const current = stack.pop();
23
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
24
+ if (["node_modules", ".git", ".DS_Store"].includes(entry.name))
25
+ continue;
26
+ const full = path.join(current, entry.name);
27
+ if (entry.isDirectory())
28
+ stack.push(full);
29
+ else if (/\.(md|ya?ml)$/i.test(entry.name))
30
+ out.push(full);
31
+ }
32
+ }
33
+ return out.sort();
34
+ }
35
+ function parseKnowledgeFile(filePath) {
36
+ try {
37
+ const raw = fs.readFileSync(filePath, "utf-8");
38
+ if (/\.md$/i.test(filePath)) {
39
+ const parsed = matter(raw);
40
+ return { data: parsed.data ?? {}, body: parsed.content ?? "", hasFrontmatter: raw.trimStart().startsWith("---") };
41
+ }
42
+ const data = YAML.parse(raw) ?? {};
43
+ return { data, body: raw, hasFrontmatter: Object.keys(data).length > 0 };
44
+ }
45
+ catch {
46
+ return { data: {}, body: "", hasFrontmatter: false };
47
+ }
48
+ }
49
+ function bodyHash(filePath) {
50
+ try {
51
+ const content = fs.readFileSync(filePath, "utf-8");
52
+ if (filePath.endsWith(".yaml") || filePath.endsWith(".yml")) {
53
+ const stripped = content.split("\n")
54
+ .filter((line) => !/^(status|updated_at)\s*:/.test(line.trim()))
55
+ .join("\n");
56
+ return crypto.createHash("sha256").update(stripped).digest("hex").substring(0, 16);
57
+ }
58
+ const bodyStart = content.indexOf("---", content.indexOf("---") + 3);
59
+ const body = bodyStart >= 0 ? content.substring(bodyStart + 3).trimStart() : content;
60
+ return crypto.createHash("sha256").update(body).digest("hex").substring(0, 16);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ function normalizeList(value) {
67
+ if (Array.isArray(value))
68
+ return value.map(String).filter(Boolean);
69
+ if (typeof value === "string" && value.trim())
70
+ return [value.trim()];
71
+ return [];
72
+ }
73
+ function inferConsumption(relPath, data, hardRule) {
74
+ const kind = String(data.asset_kind ?? data.type ?? "").toLowerCase();
75
+ if (hardRule)
76
+ return "hard_rule";
77
+ if (relPath.includes("review_rules/") || kind === "review_rule")
78
+ return "review_rule";
79
+ if (relPath.includes("acceptance_templates/") || kind === "acceptance_template")
80
+ return "acceptance_template";
81
+ const runtimeVisibility = String(data.runtime_visibility ?? "").toLowerCase();
82
+ if (runtimeVisibility === "injectable")
83
+ return "injectable";
84
+ if (normalizeList(data.routes).length > 0 || normalizeList(data.primary_triggers).length > 0)
85
+ return "injectable";
86
+ return "index_only";
87
+ }
88
+ function hasHardRuleMarker(relPath, data, body) {
89
+ const kind = String(data.asset_kind ?? data.type ?? "").toLowerCase();
90
+ const priority = String(data.priority ?? "").toUpperCase();
91
+ const enforcementLevel = String(data.enforcement?.level ?? data.enforcement_level ?? "").toLowerCase();
92
+ return kind === "hard_rule"
93
+ || priority === "P0"
94
+ || priority === "P1"
95
+ || enforcementLevel === "hard_rule"
96
+ || (relPath.includes("rules/") && /hard[_ -]?fail|必须|不得|禁止/.test(body));
97
+ }
98
+ function classifyIdentity(projectPath, relPath, filePath) {
99
+ const manifest = readSyncManifest(projectPath);
100
+ const syncEntry = manifest?.entries?.[relPath];
101
+ const authoritative = resolveAuthoritativeIdentity(relPath);
102
+ if (syncEntry && authoritative) {
103
+ const authoritativeHash = computeAuthoritativeHash(authoritative.source_contract_path);
104
+ const currentBodyHash = bodyHash(filePath);
105
+ if (syncEntry.source_contract_path !== authoritative.source_contract_path)
106
+ return "conflict";
107
+ if (authoritativeHash && currentBodyHash && currentBodyHash !== authoritativeHash)
108
+ return "user_modified_builtin";
109
+ const decision = getContractDecision(authoritative.source_contract_path);
110
+ if (decision.contract?.lifecycle_status === "deprecated")
111
+ return "deprecated_builtin";
112
+ return "builtin_synced";
113
+ }
114
+ if (authoritative) {
115
+ const decision = getContractDecision(authoritative.source_contract_path);
116
+ if (decision.decision === "denied")
117
+ return "conflict";
118
+ return "user_modified_builtin";
119
+ }
120
+ return "user_authored";
121
+ }
122
+ function analyzeAsset(projectPath, knowledgeDir, filePath) {
123
+ const relPath = path.relative(knowledgeDir, filePath).replace(/\\/g, "/");
124
+ const parsed = parseKnowledgeFile(filePath);
125
+ const data = parsed.data;
126
+ const hardRule = hasHardRuleMarker(relPath, data, parsed.body);
127
+ const routes = normalizeList(data.routes);
128
+ const primaryTriggers = normalizeList(data.primary_triggers);
129
+ const techStack = normalizeList(data.tech_stack);
130
+ const domains = normalizeList(data.domains ?? data.scope);
131
+ const conflictGroup = String(data.conflict_group ?? data.rule_key ?? "").trim() || undefined;
132
+ const ruleValue = String(data.rule_value ?? data.decision_value ?? data.format ?? "").trim() || undefined;
133
+ const conflictsWith = normalizeList(data.conflicts_with);
134
+ const consumption = inferConsumption(relPath, data, hardRule);
135
+ const identity = classifyIdentity(projectPath, relPath, filePath);
136
+ const findings = [];
137
+ if (!parsed.hasFrontmatter) {
138
+ findings.push({
139
+ severity: "warning",
140
+ code: "PROJECT_KNOWLEDGE_FRONTMATTER_MISSING",
141
+ message_zh: "用户项目知识缺少 frontmatter,只能作为低置信度索引知识,不能作为 hard rule 强执行。",
142
+ });
143
+ }
144
+ if (hardRule && routes.length === 0 && normalizeList(data.primary_triggers).length === 0) {
145
+ findings.push({
146
+ severity: "hard_fail",
147
+ code: "PROJECT_KNOWLEDGE_HARD_RULE_UNROUTED",
148
+ message_zh: "hard rule 缺少 routes 或 primary_triggers,无法被 SoloForge 稳定选中和消费。",
149
+ });
150
+ }
151
+ if (identity === "conflict") {
152
+ findings.push({
153
+ severity: "hard_fail",
154
+ code: "PROJECT_KNOWLEDGE_IDENTITY_CONFLICT",
155
+ message_zh: "项目知识与内置同步资产身份冲突,必须人工确认保留、合并或迁移。",
156
+ });
157
+ }
158
+ if (identity === "user_modified_builtin") {
159
+ findings.push({
160
+ severity: "advisory",
161
+ code: "PROJECT_KNOWLEDGE_USER_MODIFIED_BUILTIN",
162
+ message_zh: "用户修改过内置同步资产,sync-templates 不得自动覆盖;升级时应输出合并建议。",
163
+ });
164
+ }
165
+ if (consumption === "index_only" && hardRule) {
166
+ findings.push({
167
+ severity: "hard_fail",
168
+ code: "PROJECT_KNOWLEDGE_HARD_RULE_INDEX_ONLY",
169
+ message_zh: "hard rule 被判定为 index_only,必须补齐触发条件或降级为 advisory。",
170
+ });
171
+ }
172
+ return {
173
+ id: String(data.id ?? data.name ?? relPath),
174
+ name: String(data.name ?? path.basename(filePath, path.extname(filePath))),
175
+ rel_path: relPath,
176
+ abs_path: filePath,
177
+ identity,
178
+ consumption,
179
+ routes,
180
+ primary_triggers: primaryTriggers,
181
+ tech_stack: techStack,
182
+ domains,
183
+ conflict_group: conflictGroup,
184
+ rule_value: ruleValue,
185
+ conflicts_with: conflictsWith,
186
+ has_frontmatter: parsed.hasFrontmatter,
187
+ hard_rule: hardRule,
188
+ injectable: consumption === "injectable" || consumption === "hard_rule",
189
+ findings,
190
+ };
191
+ }
192
+ function detectProjectKnowledgeConflicts(assets) {
193
+ const byIdOrPath = new Map();
194
+ for (const asset of assets) {
195
+ byIdOrPath.set(asset.id, asset);
196
+ byIdOrPath.set(asset.rel_path, asset);
197
+ }
198
+ for (const asset of assets) {
199
+ for (const target of asset.conflicts_with) {
200
+ const other = byIdOrPath.get(target);
201
+ if (!other)
202
+ continue;
203
+ asset.findings.push({
204
+ severity: "hard_fail",
205
+ code: "PROJECT_KNOWLEDGE_RULE_CONFLICT",
206
+ message_zh: `项目规则声明与 ${other.rel_path} 冲突,必须由用户确认取舍或合并。`,
207
+ });
208
+ }
209
+ }
210
+ const grouped = new Map();
211
+ for (const asset of assets) {
212
+ if (!asset.conflict_group || !asset.rule_value)
213
+ continue;
214
+ const list = grouped.get(asset.conflict_group) ?? [];
215
+ list.push(asset);
216
+ grouped.set(asset.conflict_group, list);
217
+ }
218
+ for (const [group, list] of grouped) {
219
+ const values = new Set(list.map((asset) => asset.rule_value));
220
+ if (values.size <= 1)
221
+ continue;
222
+ for (const asset of list) {
223
+ asset.findings.push({
224
+ severity: "hard_fail",
225
+ code: "PROJECT_KNOWLEDGE_RULE_CONFLICT",
226
+ message_zh: `项目规则组 ${group} 存在多个互斥取值(${Array.from(values).join(" / ")}),必须由用户确认统一口径。`,
227
+ });
228
+ }
229
+ }
230
+ }
231
+ export function auditProjectKnowledge(projectPath, config) {
232
+ const knowledgeDir = config && config._projectPath
233
+ ? getProjectKnowledgeDir(config)
234
+ : path.join(projectPath, ".soloforge", "knowledge");
235
+ const assets = listKnowledgeFiles(knowledgeDir).map((file) => analyzeAsset(projectPath, knowledgeDir, file));
236
+ detectProjectKnowledgeConflicts(assets);
237
+ const hardFailCount = assets.reduce((sum, asset) => sum + asset.findings.filter((f) => f.severity === "hard_fail").length, 0);
238
+ const warningCount = assets.reduce((sum, asset) => sum + asset.findings.filter((f) => f.severity === "warning").length, 0);
239
+ const unconsumed = assets.filter((asset) => asset.consumption === "index_only" && asset.identity === "user_authored").length;
240
+ const recommendedNextSteps = [];
241
+ if (hardFailCount > 0)
242
+ recommendedNextSteps.push("先修复 hard rule 缺少触发条件或身份冲突的项目知识。");
243
+ if (unconsumed > 0)
244
+ recommendedNextSteps.push("为需要参与执行的项目规则补充 routes、primary_triggers 或 enforcement.level。");
245
+ if (assets.length === 0)
246
+ recommendedNextSteps.push("当前项目暂无自定义知识;可按需新增 .soloforge/knowledge/rules 或 domain 规则。");
247
+ return {
248
+ project_path: projectPath,
249
+ total: assets.length,
250
+ user_authored: assets.filter((a) => a.identity === "user_authored").length,
251
+ builtin_synced: assets.filter((a) => a.identity === "builtin_synced").length,
252
+ user_modified_builtin: assets.filter((a) => a.identity === "user_modified_builtin").length,
253
+ deprecated_builtin: assets.filter((a) => a.identity === "deprecated_builtin").length,
254
+ conflict: assets.filter((a) => a.identity === "conflict").length,
255
+ hard_rule: assets.filter((a) => a.hard_rule).length,
256
+ injectable: assets.filter((a) => a.injectable).length,
257
+ index_only: assets.filter((a) => a.consumption === "index_only").length,
258
+ unconsumed,
259
+ hard_fail_count: hardFailCount,
260
+ warning_count: warningCount,
261
+ assets,
262
+ recommended_next_steps: recommendedNextSteps,
263
+ };
264
+ }
265
+ export function selectProjectKnowledgeForTask(report, input) {
266
+ const haystack = `${input.intent} ${input.route ?? ""}`.toLowerCase();
267
+ const stack = (input.tech_stack ?? []).map((s) => s.toLowerCase());
268
+ const scored = report.assets
269
+ .filter((asset) => asset.identity !== "conflict")
270
+ .filter((asset) => asset.consumption !== "index_only" || asset.hard_rule)
271
+ .filter((asset) => asset.tech_stack.length === 0 || asset.tech_stack.some((t) => stack.some((s) => s.includes(t.toLowerCase()) || t.toLowerCase().includes(s))))
272
+ .filter((asset) => {
273
+ const routeMatches = asset.routes.length === 0 || (input.route ? asset.routes.includes(input.route) : false);
274
+ const triggerTokens = [...asset.primary_triggers, ...asset.domains];
275
+ const triggerMatches = triggerTokens.length === 0
276
+ || triggerTokens.some((token) => haystack.includes(token.toLowerCase()));
277
+ if (asset.hard_rule)
278
+ return routeMatches && triggerMatches;
279
+ return routeMatches || triggerMatches;
280
+ })
281
+ .map((asset) => {
282
+ let score = 0;
283
+ for (const token of [...asset.routes, ...asset.primary_triggers, ...asset.domains, asset.name, asset.rel_path]) {
284
+ const lower = token.toLowerCase();
285
+ if (lower && haystack.includes(lower))
286
+ score += 2;
287
+ }
288
+ if (asset.hard_rule)
289
+ score += 3;
290
+ if (asset.injectable)
291
+ score += 1;
292
+ return { asset, score };
293
+ })
294
+ .filter((item) => item.score > 0 || item.asset.hard_rule)
295
+ .sort((a, b) => b.score - a.score);
296
+ return scored.slice(0, input.limit ?? 8).map((item) => item.asset);
297
+ }
298
+ //# sourceMappingURL=project_knowledge_contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project_knowledge_contract.js","sourceRoot":"","sources":["../../src/engine/project_knowledge_contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface ProjectKnowledgeSystemMatrixCase {
2
+ id: string;
3
+ issue_id: "问题六十九";
4
+ title: string;
5
+ mechanism_family: string;
6
+ detail_scope: string;
7
+ production_entrypoints: string[];
8
+ must_fail: string;
9
+ must_pass: string;
10
+ release_gate_code: string;
11
+ doc_refs: string[];
12
+ }
13
+ export interface MatrixValidationFinding {
14
+ code: string;
15
+ severity: "hard_fail";
16
+ message: string;
17
+ case_id?: string;
18
+ }
19
+ export interface MatrixValidationReport {
20
+ passed: boolean;
21
+ total_cases: number;
22
+ hard_fail_count: number;
23
+ findings: MatrixValidationFinding[];
24
+ }
25
+ export declare const PROJECT_KNOWLEDGE_SYSTEM_MATRIX: readonly ProjectKnowledgeSystemMatrixCase[];
26
+ export declare function validateProjectKnowledgeSystemMatrix(cases?: readonly ProjectKnowledgeSystemMatrixCase[]): MatrixValidationReport;
27
+ //# sourceMappingURL=project_knowledge_system_regression_matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project_knowledge_system_regression_matrix.d.ts","sourceRoot":"","sources":["../../src/engine/project_knowledge_system_regression_matrix.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gCAAgC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,uBAAuB,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,+BAA+B,EAAE,SAAS,gCAAgC,EAiPtF,CAAC;AAaF,wBAAgB,oCAAoC,CAClD,KAAK,GAAE,SAAS,gCAAgC,EAAoC,GACnF,sBAAsB,CAsCxB"}
@@ -0,0 +1,295 @@
1
+ export const PROJECT_KNOWLEDGE_SYSTEM_MATRIX = [
2
+ {
3
+ id: "PKS-01",
4
+ issue_id: "问题六十九",
5
+ title: "内置模板资产卫生",
6
+ mechanism_family: "template_asset_hygiene",
7
+ detail_scope: "清理 templates/** 的 TODO/FIXME、含糊词、内部施工语义;hard rule/advisory/procedure/template 边界明确;acceptance template 有复验闭环。",
8
+ production_entrypoints: ["validate-release", "audit-template-visibility", "sync-templates"],
9
+ must_fail: "用户可见模板出现 TODO/FIXME、Batch/problem/validate-batch 内部语义,或验收模板没有复验命令时 hard_fail。",
10
+ must_pass: "用户可见模板术语清晰、无内部泄漏、验收模板带复验闭环。",
11
+ release_gate_code: "PKS_TEMPLATE_ASSET_HYGIENE",
12
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
13
+ },
14
+ {
15
+ id: "PKS-02",
16
+ issue_id: "问题六十九",
17
+ title: "脚手架生成物质量",
18
+ mechanism_family: "scaffold_quality_contract",
19
+ detail_scope: "React/Spring Boot scaffold 生成物不得天然带 TODO,不得违反问题六十八,Controller/DTO/校验/错误码/日志/审计/测试有默认结构。",
20
+ production_entrypoints: ["sf_scaffold", "validate-release", "npm pack"],
21
+ must_fail: "脚手架模板或生成物带占位符、缺入参校验、缺统一出参或生成后触发问题六十八时 hard_fail。",
22
+ must_pass: "真实脚手架生成后通过质量契约和可观测性契约。",
23
+ release_gate_code: "PKS_SCAFFOLD_GENERATED_QUALITY",
24
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
25
+ },
26
+ {
27
+ id: "PKS-03",
28
+ issue_id: "问题六十九",
29
+ title: "用户项目知识承载消费",
30
+ mechanism_family: "project_knowledge_contract",
31
+ detail_scope: "识别 user_authored、user_modified_builtin、builtin_synced、deprecated_builtin、conflict;无 frontmatter 可索引但不能作为 hard rule 强执行。",
32
+ production_entrypoints: ["audit-project-knowledge", "sf_expand", "sf_review", "sf_verify", "sf_deliver", "soloforge next"],
33
+ must_fail: "用户 hard rule 缺 routes/primary_triggers、冲突未确认、或无法进入主链路时 hard_fail。",
34
+ must_pass: "用户项目规则可审计、可选择、可注入、可阻断、可解释。",
35
+ release_gate_code: "PKS_PROJECT_KNOWLEDGE_CONSUMPTION",
36
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
37
+ },
38
+ {
39
+ id: "PKS-04",
40
+ issue_id: "问题六十九",
41
+ title: "项目知识选择与注入",
42
+ mechanism_family: "knowledge_injection_boundary",
43
+ detail_scope: "按 intent、route、阶段、技术栈、文件路径、业务域选择,不全量塞 prompt;区分 index_only、injectable、hard_rule、audit_only。",
44
+ production_entrypoints: ["sf_expand", "KnowledgeIndexManager", "intent_expander"],
45
+ must_fail: "index_only/internal_only 进入 prompt、技术栈不匹配知识被注入、或注入无选中理由时 hard_fail。",
46
+ must_pass: "只注入当前任务必需规则,并说明为什么选中。",
47
+ release_gate_code: "PKS_PROJECT_KNOWLEDGE_INJECTION_BOUNDARY",
48
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
49
+ },
50
+ {
51
+ id: "PKS-05",
52
+ issue_id: "问题六十九",
53
+ title: "用户项目规则冲突检测",
54
+ mechanism_family: "project_rule_conflict_governance",
55
+ detail_scope: "覆盖项目规则 vs 内置规则、项目规则之间、API 响应、分页、日志字段、数据库命名、权限模型冲突;冲突必须进入用户确认。",
56
+ production_entrypoints: ["audit-project-knowledge", "sf_expand", "soloforge next"],
57
+ must_fail: "互斥 hard rule 没有冲突 finding 或 AI 直接拍板时 hard_fail。",
58
+ must_pass: "冲突以中文解释并要求用户确认,确认前不进入执行。",
59
+ release_gate_code: "PKS_PROJECT_RULE_CONFLICT_CONFIRMATION",
60
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
61
+ },
62
+ {
63
+ id: "PKS-06",
64
+ issue_id: "问题六十九",
65
+ title: "项目知识审计命令",
66
+ mechanism_family: "project_knowledge_audit_cli",
67
+ detail_scope: "audit-project-knowledge 输出总数、用户自建、修改内置、hard_rule、index_only、injectable、冲突、未消费规则、最近消费 trace 与入口覆盖。",
68
+ production_entrypoints: ["soloforge audit-project-knowledge"],
69
+ must_fail: "JSON 不纯、缺统计字段、或无法列出 hard_fail 与消费入口时 hard_fail。",
70
+ must_pass: "人类输出可读,--json 可解析且字段完整。",
71
+ release_gate_code: "PKS_PROJECT_KNOWLEDGE_AUDIT_COMMAND",
72
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
73
+ },
74
+ {
75
+ id: "PKS-07",
76
+ issue_id: "问题六十九",
77
+ title: "soloforge next 消费项目规则",
78
+ mechanism_family: "workflow_navigation_contract",
79
+ detail_scope: "next 不能只看阶段;API、数据库、权限、迁移等下一步必须展示将应用的项目规则,冲突优先确认。",
80
+ production_entrypoints: ["soloforge next", "next_action_planner"],
81
+ must_fail: "next 没有项目知识上下文,或冲突规则未优先提示确认时 hard_fail。",
82
+ must_pass: "next 明确列出下一步适用规则、阻断规则和确认事项。",
83
+ release_gate_code: "PKS_NEXT_PROJECT_RULE_CONTEXT",
84
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
85
+ },
86
+ {
87
+ id: "PKS-08",
88
+ issue_id: "问题六十九",
89
+ title: "sync-templates 升级策略",
90
+ mechanism_family: "template_sync_migration",
91
+ detail_scope: "不覆盖用户自建规则;保留用户修改内置模板;新版冲突输出 merge 建议;废弃模板标记 deprecated;内置资产仍合同化防泄漏。",
92
+ production_entrypoints: ["soloforge sync-templates", "template_init_sync"],
93
+ must_fail: "用户自建规则被覆盖/误删,或内置无合同资产被同步时 hard_fail。",
94
+ must_pass: "用户修改受保护,冲突有 merge 建议,废弃仅标记不删除。",
95
+ release_gate_code: "PKS_SYNC_TEMPLATES_USER_PROTECTION",
96
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
97
+ },
98
+ {
99
+ id: "PKS-09",
100
+ issue_id: "问题六十九",
101
+ title: "新项目降噪",
102
+ mechanism_family: "knowledge_noise_control",
103
+ detail_scope: "新项目只注入当前阶段必需资产;设计阶段不注入大量编码规范;编码阶段强化 OOD、后端工程、日志注释和测试。",
104
+ production_entrypoints: ["sf_expand", "soloforge init", "soloforge validate"],
105
+ must_fail: "空项目或设计阶段被注入大量不相关编码规则时 hard_fail。",
106
+ must_pass: "低噪声启动,其他规则保持可索引但不注入。",
107
+ release_gate_code: "PKS_NEW_PROJECT_NOISE_CONTROL",
108
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
109
+ },
110
+ {
111
+ id: "PKS-10",
112
+ issue_id: "问题六十九",
113
+ title: "生命周期阶段覆盖",
114
+ mechanism_family: "lifecycle_knowledge_matrix",
115
+ detail_scope: "需求、决策、架构、详细设计、数据库、API、OOD、编码、测试、审查、本地验收、交付、发布后复盘、演进维护均有知识消费口径。",
116
+ production_entrypoints: ["sf_classify", "sf_expand", "sf_review", "sf_verify", "sf_deliver", "soloforge next"],
117
+ must_fail: "任一生命周期阶段没有内置模板、项目规则、hard gate/advisory/确认口径时 hard_fail。",
118
+ must_pass: "每阶段知道读哪些模板、哪些项目规则、哪些必须阻断、哪些只建议。",
119
+ release_gate_code: "PKS_LIFECYCLE_STAGE_COVERAGE",
120
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
121
+ },
122
+ {
123
+ id: "PKS-11",
124
+ issue_id: "问题六十九",
125
+ title: "技术栈过滤",
126
+ mechanism_family: "technology_stack_filtering",
127
+ detail_scope: "React/Vue 互斥,Spring Boot/Node/Python 互斥;后端任务不注入前端模板,前端任务不注入数据库规则,安全/迁移任务强化对应规则。",
128
+ production_entrypoints: ["sf_expand", "KnowledgeIndexManager", "template_asset_contract_registry"],
129
+ must_fail: "不匹配技术栈规则进入 prompt 或被当作 hard rule 执行时 hard_fail。",
130
+ must_pass: "仅适配当前项目、当前阶段、当前任务的规则被注入。",
131
+ release_gate_code: "PKS_TECH_STACK_FILTERING",
132
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
133
+ },
134
+ {
135
+ id: "PKS-12",
136
+ issue_id: "问题六十九",
137
+ title: "设计产物模板消费",
138
+ mechanism_family: "design_artifact_contract",
139
+ detail_scope: "架构、数据库、API、OpenAPI/Markdown 一致性、SQL migration 权威资产、设计一致性报告闭环都由任务消费和审计。",
140
+ production_entrypoints: ["sf_expand", "sf_verify", "audit-design-artifacts"],
141
+ must_fail: "模板存在但架构/DB/API 任务不消费,或 OpenAPI/Markdown/SQL 权威资产不一致时 hard_fail。",
142
+ must_pass: "设计产物包能支撑后续 AI 开发且审计通过。",
143
+ release_gate_code: "PKS_DESIGN_ARTIFACT_TEMPLATE_CONSUMPTION",
144
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
145
+ },
146
+ {
147
+ id: "PKS-13",
148
+ issue_id: "问题六十九",
149
+ title: "近似资产去重与边界",
150
+ mechanism_family: "asset_boundary_governance",
151
+ detail_scope: "架构流程/工作流、紧急修复流程/流水线、接口设计/API 规格、数据库设计/变更方案、工程纪律/执行原则等明确阶段、消费、注入、验收、合并。",
152
+ production_entrypoints: ["audit-template-visibility", "validate-release"],
153
+ must_fail: "近似资产边界不明、互相重复且无消费归属时 hard_fail。",
154
+ must_pass: "每个近似资产都有阶段、消费者、注入/索引口径和验收边界。",
155
+ release_gate_code: "PKS_SIMILAR_ASSET_BOUNDARY",
156
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
157
+ },
158
+ {
159
+ id: "PKS-14",
160
+ issue_id: "问题六十九",
161
+ title: "命名统一迁移",
162
+ mechanism_family: "template_naming_migration",
163
+ detail_scope: "模版/模板统一必须有旧路径 alias、registry 更新、sync-templates 迁移、用户修改保护、release gate 防断链和文档同步。",
164
+ production_entrypoints: ["sync-templates", "template_asset_contract_registry", "validate-release"],
165
+ must_fail: "路径改名导致旧项目断链、用户修改丢失或 registry 别名缺失时 hard_fail。",
166
+ must_pass: "新旧路径兼容,用户项目平滑迁移。",
167
+ release_gate_code: "PKS_TEMPLATE_NAMING_MIGRATION",
168
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
169
+ },
170
+ {
171
+ id: "PKS-15",
172
+ issue_id: "问题六十九",
173
+ title: "可见性与安全边界",
174
+ mechanism_family: "template_asset_visibility",
175
+ detail_scope: "internal-only 不同步到用户项目;用户项目规则不得伪装成内置内部资产;敏感规则、内部机制、发布 gate 规则不泄露;项目知识 secret/token 拦截或脱敏。",
176
+ production_entrypoints: ["sync-templates", "audit-template-visibility", "audit-project-knowledge"],
177
+ must_fail: "内部资产泄漏或项目知识含 secret/token 被当作可注入规则时 hard_fail。",
178
+ must_pass: "内部资产隔离,用户知识敏感内容被阻断或脱敏。",
179
+ release_gate_code: "PKS_VISIBILITY_SECURITY_BOUNDARY",
180
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
181
+ },
182
+ {
183
+ id: "PKS-16",
184
+ issue_id: "问题六十九",
185
+ title: "消费证据追踪",
186
+ mechanism_family: "observed_consumption",
187
+ detail_scope: "每个知识资产回答谁创建、同步、索引、选择、注入、审查、验证、交付阻断,最近在哪个任务消费。",
188
+ production_entrypoints: ["observed_consumption", "audit-template-visibility", "audit-project-knowledge"],
189
+ must_fail: "资产只有文件存在或注册存在,没有消费 trace 时 hard_fail。",
190
+ must_pass: "消费证据能追踪到真实入口和最近任务。",
191
+ release_gate_code: "PKS_CONSUMPTION_TRACEABILITY",
192
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
193
+ },
194
+ {
195
+ id: "PKS-17",
196
+ issue_id: "问题六十九",
197
+ title: "用户可见解释",
198
+ mechanism_family: "user_visible_explanation",
199
+ detail_scope: "用户知道为什么选中规则、为什么阻断、怎么修、修完跑什么命令、哪些建议、哪些必须满足。",
200
+ production_entrypoints: ["sf_expand", "sf_review", "sf_verify", "sf_deliver", "soloforge next"],
201
+ must_fail: "阻断只给内部码或不说明修复命令时 hard_fail。",
202
+ must_pass: "中文解释包含证据、风险、修复步骤和复验命令。",
203
+ release_gate_code: "PKS_USER_VISIBLE_EXPLANATION",
204
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
205
+ },
206
+ {
207
+ id: "PKS-18",
208
+ issue_id: "问题六十九",
209
+ title: "防回归 gate",
210
+ mechanism_family: "release_gate_regression_matrix",
211
+ detail_scope: "覆盖模板无内部词、scaffold 无占位、hard rule 无含糊词、acceptance template 有复验、项目知识被消费、sync 不覆盖、技术栈过滤、next 读取、冲突确认、问题六十八生成物不违约。",
212
+ production_entrypoints: ["validate-release"],
213
+ must_fail: "20 项任意缺失或只停留在文档时 hard_fail。",
214
+ must_pass: "release gate 对 20 项矩阵有结构化校验和行为验证。",
215
+ release_gate_code: "PKS_RELEASE_GATE_REGRESSION_MATRIX",
216
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
217
+ },
218
+ {
219
+ id: "PKS-19",
220
+ issue_id: "问题六十九",
221
+ title: "文档同步",
222
+ mechanism_family: "documentation_contract",
223
+ detail_scope: "README 和设计方案说明 templates/**、.soloforge/knowledge/**、内置模板/项目规则区别、index_only/injectable/hard_rule、sync 保护、添加规则和审计方式。",
224
+ production_entrypoints: ["README.md", "docs/SoloForge-设计方案.md", "docs/正式发布门槛.md"],
225
+ must_fail: "实现存在但用户文档不知道如何使用或审计时 hard_fail。",
226
+ must_pass: "用户能按自然语言和 CLI 完成项目规则新增、审计和复验。",
227
+ release_gate_code: "PKS_DOCUMENTATION_SYNC",
228
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
229
+ },
230
+ {
231
+ id: "PKS-20",
232
+ issue_id: "问题六十九",
233
+ title: "自然语言添加项目规则体验",
234
+ mechanism_family: "natural_language_project_rule_authoring",
235
+ detail_scope: "用户说“我们项目有一条特殊 API 响应规则,请加入 SoloForge,以后所有接口设计和实现都遵守”时,SoloForge 能引导写到哪里、frontmatter、阶段、hard rule、验证和冲突处理。",
236
+ production_entrypoints: ["sf_classify", "sf_expand", "soloforge next", "audit-project-knowledge"],
237
+ must_fail: "自然语言只能生成静态文件,不进入审计/消费/冲突确认时 hard_fail。",
238
+ must_pass: "规则被写入项目知识、带最小契约、可审计、可选择、可阻断。",
239
+ release_gate_code: "PKS_NATURAL_LANGUAGE_RULE_AUTHORING",
240
+ doc_refs: ["docs/SoloForge-Batch8问题集.md#问题六十九"],
241
+ },
242
+ ];
243
+ const REQUIRED_ENTRYPOINTS = [
244
+ "sf_expand",
245
+ "sf_review",
246
+ "sf_verify",
247
+ "sf_deliver",
248
+ "soloforge next",
249
+ "audit-project-knowledge",
250
+ "sync-templates",
251
+ "validate-release",
252
+ ];
253
+ export function validateProjectKnowledgeSystemMatrix(cases = PROJECT_KNOWLEDGE_SYSTEM_MATRIX) {
254
+ const findings = [];
255
+ const add = (code, message, case_id) => findings.push({ code, severity: "hard_fail", message, case_id });
256
+ if (cases.length !== 20) {
257
+ add("PKS_MATRIX_COUNT_MISMATCH", `项目知识体系矩阵必须精确覆盖 20 项讨论细节,当前为 ${cases.length}`);
258
+ }
259
+ const ids = new Set();
260
+ for (const item of cases) {
261
+ if (ids.has(item.id))
262
+ add("PKS_MATRIX_DUPLICATE_ID", `矩阵 ID 重复: ${item.id}`, item.id);
263
+ ids.add(item.id);
264
+ if (item.issue_id !== "问题六十九")
265
+ add("PKS_MATRIX_WRONG_ISSUE", `${item.id} 未归属问题六十九`, item.id);
266
+ if (!item.mechanism_family || !item.detail_scope)
267
+ add("PKS_MATRIX_SCOPE_MISSING", `${item.id} 缺少机制族或细节范围`, item.id);
268
+ if (item.production_entrypoints.length === 0)
269
+ add("PKS_MATRIX_ENTRYPOINT_MISSING", `${item.id} 缺少生产入口`, item.id);
270
+ if (!item.must_fail || !item.must_pass)
271
+ add("PKS_MATRIX_BEHAVIOR_MISSING", `${item.id} 缺少 must-fail/must-pass`, item.id);
272
+ if (!item.release_gate_code)
273
+ add("PKS_MATRIX_GATE_CODE_MISSING", `${item.id} 缺少 release gate code`, item.id);
274
+ if (item.doc_refs.length === 0)
275
+ add("PKS_MATRIX_DOC_REF_MISSING", `${item.id} 缺少文档引用`, item.id);
276
+ }
277
+ for (let i = 1; i <= 20; i++) {
278
+ const id = `PKS-${String(i).padStart(2, "0")}`;
279
+ if (!ids.has(id))
280
+ add("PKS_MATRIX_REQUIRED_ID_MISSING", `缺少讨论细节矩阵项 ${id}`);
281
+ }
282
+ const joinedEntrypoints = cases.flatMap((item) => item.production_entrypoints).join("\n");
283
+ for (const entrypoint of REQUIRED_ENTRYPOINTS) {
284
+ if (!joinedEntrypoints.includes(entrypoint)) {
285
+ add("PKS_MATRIX_REQUIRED_ENTRYPOINT_MISSING", `矩阵缺少生产入口覆盖: ${entrypoint}`);
286
+ }
287
+ }
288
+ return {
289
+ passed: findings.length === 0,
290
+ total_cases: cases.length,
291
+ hard_fail_count: findings.length,
292
+ findings,
293
+ };
294
+ }
295
+ //# sourceMappingURL=project_knowledge_system_regression_matrix.js.map