soloforge 1.3.1 → 1.3.2
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/README.md +6 -3
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +4 -0
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +10 -10
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +317 -18
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts +26 -0
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +139 -46
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +85 -53
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/asset_manifest.d.ts +7 -1
- package/dist/engine/asset_manifest.d.ts.map +1 -1
- package/dist/engine/asset_manifest.js +28 -18
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +26 -0
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/consumption_trace_store.d.ts +8 -8
- package/dist/engine/consumption_trace_store.d.ts.map +1 -1
- package/dist/engine/consumption_trace_store.js +11 -7
- package/dist/engine/consumption_trace_store.js.map +1 -1
- package/dist/engine/decision_workshop.d.ts +160 -0
- package/dist/engine/decision_workshop.d.ts.map +1 -0
- package/dist/engine/decision_workshop.js +279 -0
- package/dist/engine/decision_workshop.js.map +1 -0
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +176 -2
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/explicit_asset_registry.d.ts +30 -0
- package/dist/engine/explicit_asset_registry.d.ts.map +1 -0
- package/dist/engine/explicit_asset_registry.js +3508 -0
- package/dist/engine/explicit_asset_registry.js.map +1 -0
- package/dist/engine/implementation_roadmap_registry.d.ts +2 -2
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +44 -16
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +46 -2
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/intent_router.d.ts +1 -1
- package/dist/engine/intent_router.d.ts.map +1 -1
- package/dist/engine/intent_router.js +2 -1
- package/dist/engine/intent_router.js.map +1 -1
- package/dist/engine/knowledge_injection_boundary.d.ts +3 -0
- package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -1
- package/dist/engine/knowledge_injection_boundary.js +48 -5
- package/dist/engine/knowledge_injection_boundary.js.map +1 -1
- package/dist/engine/mechanism_contract_registry.d.ts +1 -1
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +74 -2
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/observed_consumption.d.ts +54 -0
- package/dist/engine/observed_consumption.d.ts.map +1 -0
- package/dist/engine/observed_consumption.js +377 -0
- package/dist/engine/observed_consumption.js.map +1 -0
- package/dist/engine/release_issue_scenario_registry.d.ts +64 -0
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -0
- package/dist/engine/release_issue_scenario_registry.js +1349 -0
- package/dist/engine/release_issue_scenario_registry.js.map +1 -0
- package/dist/engine/release_readiness_gate.d.ts +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +574 -46
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/release_tool_harness.d.ts +71 -0
- package/dist/engine/release_tool_harness.d.ts.map +1 -0
- package/dist/engine/release_tool_harness.js +161 -0
- package/dist/engine/release_tool_harness.js.map +1 -0
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +144 -7
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/standard_asset_contract.d.ts +75 -0
- package/dist/engine/standard_asset_contract.d.ts.map +1 -0
- package/dist/engine/standard_asset_contract.js +388 -0
- package/dist/engine/standard_asset_contract.js.map +1 -0
- package/dist/engine/standard_asset_coverage.d.ts +45 -0
- package/dist/engine/standard_asset_coverage.d.ts.map +1 -0
- package/dist/engine/standard_asset_coverage.js +220 -0
- package/dist/engine/standard_asset_coverage.js.map +1 -0
- package/dist/engine/template_asset_contract_registry.d.ts +162 -0
- package/dist/engine/template_asset_contract_registry.d.ts.map +1 -0
- package/dist/engine/template_asset_contract_registry.js +598 -0
- package/dist/engine/template_asset_contract_registry.js.map +1 -0
- package/dist/engine/template_asset_visibility.d.ts +109 -0
- package/dist/engine/template_asset_visibility.d.ts.map +1 -0
- package/dist/engine/template_asset_visibility.js +321 -0
- package/dist/engine/template_asset_visibility.js.map +1 -0
- package/dist/engine/template_init_sync.d.ts +68 -0
- package/dist/engine/template_init_sync.d.ts.map +1 -0
- package/dist/engine/template_init_sync.js +218 -0
- package/dist/engine/template_init_sync.js.map +1 -0
- package/dist/engine/template_manifest_io.d.ts +10 -0
- package/dist/engine/template_manifest_io.d.ts.map +1 -1
- package/dist/engine/template_manifest_io.js +63 -30
- package/dist/engine/template_manifest_io.js.map +1 -1
- package/dist/engine/template_mechanism_auditor.d.ts +3 -1
- package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
- package/dist/engine/template_mechanism_auditor.js +27 -24
- package/dist/engine/template_mechanism_auditor.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +11 -1
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +20 -0
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +234 -3
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/types.d.ts +36 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/knowledge/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md +29 -0
- package/templates/knowledge/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +27 -0
- package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +62 -1
- package/templates/knowledge/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +30 -0
- package/templates/knowledge/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +50 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板资产可见性与注入边界 — 控制标准资产全链路访问。
|
|
3
|
+
*
|
|
4
|
+
* 覆盖同步、索引、注入、脚手架、fallback、adapter prompt、
|
|
5
|
+
* MCP tool、CLI 和 release gate 所有入口的可见性裁决。
|
|
6
|
+
*/
|
|
7
|
+
export type AssetVisibility = "user_project" | "soloforge_internal" | "adapter_runtime_only" | "scaffold_only" | "global_pattern";
|
|
8
|
+
export type RuntimeVisibility = "injectable" | "index_only" | "internal_only" | "scaffold_only";
|
|
9
|
+
export type EvidenceRole = "template_guidance" | "project_source_file" | "classification";
|
|
10
|
+
export type LifecycleStatus = "active" | "deprecated" | "replaced_by" | "internal_only" | "quarantined";
|
|
11
|
+
export interface AssetVisibilityMeta {
|
|
12
|
+
asset_id: string;
|
|
13
|
+
asset_visibility: AssetVisibility;
|
|
14
|
+
sync_to_user_project: boolean;
|
|
15
|
+
sync_target: "project_knowledge" | "global_patterns" | "none";
|
|
16
|
+
runtime_visibility: RuntimeVisibility;
|
|
17
|
+
evidence_role: EvidenceRole;
|
|
18
|
+
user_visible: boolean;
|
|
19
|
+
owner_mechanism_id: string;
|
|
20
|
+
applicable_routes: string[];
|
|
21
|
+
applicable_tech_stack: string[];
|
|
22
|
+
source: "builtin" | "user_project" | "organization" | "generated";
|
|
23
|
+
lifecycle_status: LifecycleStatus;
|
|
24
|
+
}
|
|
25
|
+
export interface VisibilityConflictResult {
|
|
26
|
+
has_conflict: boolean;
|
|
27
|
+
path_inference: AssetVisibility;
|
|
28
|
+
frontmatter_declaration: AssetVisibility | null;
|
|
29
|
+
content_keywords: AssetVisibility | null;
|
|
30
|
+
resolution: "resolved" | "awaiting_user_confirmation" | "hard_fail";
|
|
31
|
+
message: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AssetVisibilityReport {
|
|
34
|
+
total_assets: number;
|
|
35
|
+
user_project_assets: number;
|
|
36
|
+
soloforge_internal_assets: number;
|
|
37
|
+
adapter_runtime_only_assets: number;
|
|
38
|
+
scaffold_only_assets: number;
|
|
39
|
+
global_pattern_assets: number;
|
|
40
|
+
missing_metadata: number;
|
|
41
|
+
visibility_conflicts: number;
|
|
42
|
+
leaked_internal_assets: number;
|
|
43
|
+
internal_term_violations: number;
|
|
44
|
+
scaffold_variable_gaps: number;
|
|
45
|
+
}
|
|
46
|
+
export interface SyncFilterResult {
|
|
47
|
+
copied: string[];
|
|
48
|
+
skipped: string[];
|
|
49
|
+
internal: string[];
|
|
50
|
+
quarantined: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 判断资产是否为内部资产 — 由权威合同注册表驱动。
|
|
54
|
+
* 合同缺失时 fail-closed: 不视为内部也不视为可发布,由调用方决定阻断策略。
|
|
55
|
+
*/
|
|
56
|
+
export declare function isInherentlyInternal(assetPath: string): boolean;
|
|
57
|
+
export declare function inferVisibilityFromPath(assetPath: string): {
|
|
58
|
+
visibility: AssetVisibility;
|
|
59
|
+
runtime: RuntimeVisibility;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 内容关键词推断可见性。
|
|
63
|
+
*/
|
|
64
|
+
export declare function inferVisibilityFromContent(content: string): AssetVisibility | null;
|
|
65
|
+
/**
|
|
66
|
+
* 从 frontmatter 解析显式可见性声明。
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseFrontmatterVisibility(content: string): AssetVisibility | null;
|
|
69
|
+
/**
|
|
70
|
+
* 可见性冲突检测 — 路径推断、frontmatter 和内容关键词三方对账。
|
|
71
|
+
*/
|
|
72
|
+
export declare function detectVisibilityConflict(assetPath: string, content: string): VisibilityConflictResult;
|
|
73
|
+
/**
|
|
74
|
+
* 用户可见资产内部术语污染扫描。
|
|
75
|
+
*/
|
|
76
|
+
export declare function scanInternalTerms(content: string): string[];
|
|
77
|
+
/**
|
|
78
|
+
* 按可见性过滤同步资产。
|
|
79
|
+
*/
|
|
80
|
+
export declare function filterAssetsForUserProject(assets: AssetVisibilityMeta[]): AssetVisibilityMeta[];
|
|
81
|
+
/**
|
|
82
|
+
* 同步过滤 — 决定哪些资产应该复制到用户项目。
|
|
83
|
+
*/
|
|
84
|
+
export declare function filterSyncAssets(assetPaths: string[], templateRoot: string): SyncFilterResult;
|
|
85
|
+
/**
|
|
86
|
+
* 可见性门禁 — 所有入口统一裁决。
|
|
87
|
+
*/
|
|
88
|
+
export declare function checkAssetVisibilityGate(meta: AssetVisibilityMeta, route: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* 按技术栈过滤 — review_rules 必须匹配技术栈。
|
|
91
|
+
*/
|
|
92
|
+
export declare function filterByTechStack(assets: AssetVisibilityMeta[], techStack: string[]): AssetVisibilityMeta[];
|
|
93
|
+
/**
|
|
94
|
+
* 脚手架资产检查 — 只能由脚手架机制消费。
|
|
95
|
+
*/
|
|
96
|
+
export declare function isScaffoldAsset(assetPath: string): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* 包内路径检查 — scaffold 不依赖 process.cwd()/templates。
|
|
99
|
+
*/
|
|
100
|
+
export declare function isPackageInternalPath(absPath: string, packageRoot: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 审计模板可见性。
|
|
103
|
+
*/
|
|
104
|
+
export declare function auditTemplateVisibility(assets: AssetVisibilityMeta[]): AssetVisibilityReport;
|
|
105
|
+
/**
|
|
106
|
+
* 全量可见性审计 — 由权威合同注册表驱动。
|
|
107
|
+
*/
|
|
108
|
+
export declare function auditAllTemplateAssets(templateRoot: string): AssetVisibilityReport;
|
|
109
|
+
//# sourceMappingURL=template_asset_visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template_asset_visibility.d.ts","sourceRoot":"","sources":["../../src/engine/template_asset_visibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板资产可见性与注入边界 — 控制标准资产全链路访问。
|
|
3
|
+
*
|
|
4
|
+
* 覆盖同步、索引、注入、脚手架、fallback、adapter prompt、
|
|
5
|
+
* MCP tool、CLI 和 release gate 所有入口的可见性裁决。
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
// ── 内部资产识别 — 由权威合同注册表驱动 ──
|
|
10
|
+
// 不再使用 denylist 猜测;改用 template_asset_contract_registry 的 asset_visibility 字段
|
|
11
|
+
import { getContractByPath, getContractDecision, listTemplateAssetContracts } from "./template_asset_contract_registry.js";
|
|
12
|
+
// 旧 denylist 已移除 — 全部由权威合同注册表驱动
|
|
13
|
+
// ── 用户可见资产内部术语扫描规则 ──
|
|
14
|
+
const INTERNAL_TERM_PATTERNS = [
|
|
15
|
+
/\bBatch\d*\b/i,
|
|
16
|
+
/\bvalidate-release\b/i,
|
|
17
|
+
/\bvalidate-batch\b/i,
|
|
18
|
+
/\bReleaseFix\b/i,
|
|
19
|
+
/SoloForge Audit:\s*PASS/i,
|
|
20
|
+
/掘地三尺/,
|
|
21
|
+
/三重否定/,
|
|
22
|
+
/变异防造假/,
|
|
23
|
+
/\bMechanism Contract Registry\b/i,
|
|
24
|
+
/\bConsumable Asset Registry\b/i,
|
|
25
|
+
/\bsf_capability_update\b/i,
|
|
26
|
+
];
|
|
27
|
+
// ── 内容关键词 → 可见性推断 ──
|
|
28
|
+
const CONTENT_VISIBILITY_KEYWORDS = [
|
|
29
|
+
{
|
|
30
|
+
patterns: [/\bBatch\d*\b/i, /\bvalidate-release\b/i, /\b新问题回归门\b/, /\b注册表基础设施\b/],
|
|
31
|
+
visibility: "soloforge_internal",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
patterns: [/\bsf_expand\b.*\bsf_verify\b.*\bsf_deliver\b/, /@sf-hard-rule/, /adapter_runtime/],
|
|
35
|
+
visibility: "adapter_runtime_only",
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
// ── 目录默认策略 ──
|
|
39
|
+
// ── 诊断用目录默认值 — 仅用于 inferVisibilityFromPath 的诊断输出,不作为正式门禁依据 ──
|
|
40
|
+
const DIAGNOSTIC_DIRECTORY_DEFAULTS = {
|
|
41
|
+
"templates/knowledge/patterns/core": { visibility: "soloforge_internal", runtime: "internal_only" },
|
|
42
|
+
"templates/scaffolds": { visibility: "scaffold_only", runtime: "scaffold_only" },
|
|
43
|
+
"templates/patterns": { visibility: "global_pattern", runtime: "index_only" },
|
|
44
|
+
};
|
|
45
|
+
// ── 核心函数 ──
|
|
46
|
+
/**
|
|
47
|
+
* 判断资产是否为内部资产 — 由权威合同注册表驱动。
|
|
48
|
+
* 合同缺失时 fail-closed: 不视为内部也不视为可发布,由调用方决定阻断策略。
|
|
49
|
+
*/
|
|
50
|
+
export function isInherentlyInternal(assetPath) {
|
|
51
|
+
const normalized = assetPath.replace(/\\/g, "/");
|
|
52
|
+
const contract = getContractByPath(normalized);
|
|
53
|
+
if (contract) {
|
|
54
|
+
return contract.asset_visibility === "soloforge_internal" ||
|
|
55
|
+
contract.asset_visibility === "scaffold_only";
|
|
56
|
+
}
|
|
57
|
+
// 合同缺失 → fail-closed,不再猜测
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
export function inferVisibilityFromPath(assetPath) {
|
|
61
|
+
const normalized = assetPath.replace(/\\/g, "/");
|
|
62
|
+
// 目录前缀匹配(仅诊断用途)
|
|
63
|
+
for (const [dir, policy] of Object.entries(DIAGNOSTIC_DIRECTORY_DEFAULTS)) {
|
|
64
|
+
if (!dir.includes(".md") && normalized.includes(dir))
|
|
65
|
+
return policy;
|
|
66
|
+
}
|
|
67
|
+
return { visibility: "user_project", runtime: "injectable" };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 内容关键词推断可见性。
|
|
71
|
+
*/
|
|
72
|
+
export function inferVisibilityFromContent(content) {
|
|
73
|
+
for (const rule of CONTENT_VISIBILITY_KEYWORDS) {
|
|
74
|
+
if (rule.patterns.some((p) => p.test(content))) {
|
|
75
|
+
return rule.visibility;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 从 frontmatter 解析显式可见性声明。
|
|
82
|
+
*/
|
|
83
|
+
export function parseFrontmatterVisibility(content) {
|
|
84
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
85
|
+
if (!fmMatch)
|
|
86
|
+
return null;
|
|
87
|
+
const fm = fmMatch[1];
|
|
88
|
+
const visMatch = fm.match(/asset_visibility:\s*["']?(\w+)["']?/);
|
|
89
|
+
if (visMatch) {
|
|
90
|
+
const value = visMatch[1];
|
|
91
|
+
if (["user_project", "soloforge_internal", "adapter_runtime_only", "scaffold_only", "global_pattern"].includes(value)) {
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 可见性冲突检测 — 路径推断、frontmatter 和内容关键词三方对账。
|
|
99
|
+
*/
|
|
100
|
+
export function detectVisibilityConflict(assetPath, content) {
|
|
101
|
+
// 优先使用合同注册表的权威可见性
|
|
102
|
+
const normalized = assetPath.replace(/\\/g, "/");
|
|
103
|
+
const contract = getContractByPath(normalized);
|
|
104
|
+
const contractVisibility = contract?.asset_visibility ?? null;
|
|
105
|
+
const pathInference = contractVisibility ?? inferVisibilityFromPath(assetPath).visibility;
|
|
106
|
+
const frontmatterDeclaration = parseFrontmatterVisibility(content);
|
|
107
|
+
const contentKeywords = inferVisibilityFromContent(content);
|
|
108
|
+
const inferences = [pathInference, frontmatterDeclaration, contentKeywords].filter((v) => v !== null);
|
|
109
|
+
const uniqueInferences = new Set(inferences);
|
|
110
|
+
if (uniqueInferences.size <= 1) {
|
|
111
|
+
return {
|
|
112
|
+
has_conflict: false,
|
|
113
|
+
path_inference: pathInference,
|
|
114
|
+
frontmatter_declaration: frontmatterDeclaration,
|
|
115
|
+
content_keywords: contentKeywords,
|
|
116
|
+
resolution: "resolved",
|
|
117
|
+
message: "可见性推断一致",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// 冲突消解: 内部优先级最高
|
|
121
|
+
const hasInternal = inferences.includes("soloforge_internal");
|
|
122
|
+
const resolvedVisibility = hasInternal ? "soloforge_internal" : pathInference;
|
|
123
|
+
const needsConfirmation = frontmatterDeclaration !== null && frontmatterDeclaration !== resolvedVisibility;
|
|
124
|
+
return {
|
|
125
|
+
has_conflict: true,
|
|
126
|
+
path_inference: pathInference,
|
|
127
|
+
frontmatter_declaration: frontmatterDeclaration,
|
|
128
|
+
content_keywords: contentKeywords,
|
|
129
|
+
resolution: needsConfirmation ? "awaiting_user_confirmation" : "hard_fail",
|
|
130
|
+
message: needsConfirmation
|
|
131
|
+
? `可见性冲突: frontmatter 声明 ${frontmatterDeclaration},但路径/内容推断为 ${resolvedVisibility},需用户确认`
|
|
132
|
+
: `可见性硬冲突: 路径=${pathInference}, frontmatter=${frontmatterDeclaration}, 内容=${contentKeywords}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 用户可见资产内部术语污染扫描。
|
|
137
|
+
*/
|
|
138
|
+
export function scanInternalTerms(content) {
|
|
139
|
+
const violations = [];
|
|
140
|
+
for (const pattern of INTERNAL_TERM_PATTERNS) {
|
|
141
|
+
const match = content.match(pattern);
|
|
142
|
+
if (match) {
|
|
143
|
+
violations.push(match[0]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return violations;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 按可见性过滤同步资产。
|
|
150
|
+
*/
|
|
151
|
+
export function filterAssetsForUserProject(assets) {
|
|
152
|
+
return assets.filter((a) => a.sync_to_user_project && (a.asset_visibility === "user_project" || a.asset_visibility === "global_pattern"));
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 同步过滤 — 决定哪些资产应该复制到用户项目。
|
|
156
|
+
*/
|
|
157
|
+
export function filterSyncAssets(assetPaths, templateRoot) {
|
|
158
|
+
const result = { copied: [], skipped: [], internal: [], quarantined: [] };
|
|
159
|
+
for (const relPath of assetPaths) {
|
|
160
|
+
const absPath = path.join(templateRoot, relPath);
|
|
161
|
+
if (!fs.existsSync(absPath)) {
|
|
162
|
+
result.skipped.push(relPath);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const normalized = relPath.replace(/\\/g, "/");
|
|
166
|
+
// 合同门禁: getContractDecision 统一裁决
|
|
167
|
+
const decision = getContractDecision(normalized);
|
|
168
|
+
if (decision.decision === "unregistered") {
|
|
169
|
+
result.quarantined.push(relPath);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (decision.decision === "denied") {
|
|
173
|
+
result.internal.push(relPath);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
const content = fs.readFileSync(absPath, "utf-8");
|
|
177
|
+
// 冲突检测(诊断保留)
|
|
178
|
+
const conflict = detectVisibilityConflict(normalized, content);
|
|
179
|
+
if (conflict.has_conflict && conflict.resolution === "hard_fail") {
|
|
180
|
+
result.quarantined.push(relPath);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// global_pattern 特殊处理
|
|
184
|
+
if (decision.contract?.asset_visibility === "global_pattern") {
|
|
185
|
+
result.skipped.push(relPath); // global patterns 走独立路径
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// 需要同步且被允许的资产
|
|
189
|
+
if (decision.contract?.sync_to_user_project) {
|
|
190
|
+
result.copied.push(relPath);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
result.skipped.push(relPath);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 可见性门禁 — 所有入口统一裁决。
|
|
200
|
+
*/
|
|
201
|
+
export function checkAssetVisibilityGate(meta, route) {
|
|
202
|
+
// 合同门禁优先: getContractDecision 统一裁决
|
|
203
|
+
const decision = getContractDecision(meta.asset_id.includes("/") ? meta.asset_id : "");
|
|
204
|
+
if (meta.asset_id && decision.decision !== "allowed" && decision.decision !== "unregistered")
|
|
205
|
+
return false;
|
|
206
|
+
if (meta.asset_visibility === "soloforge_internal" || meta.asset_visibility === "scaffold_only")
|
|
207
|
+
return false;
|
|
208
|
+
if (meta.runtime_visibility === "internal_only")
|
|
209
|
+
return false;
|
|
210
|
+
if (meta.applicable_routes.length > 0 && !meta.applicable_routes.includes(route))
|
|
211
|
+
return false;
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 按技术栈过滤 — review_rules 必须匹配技术栈。
|
|
216
|
+
*/
|
|
217
|
+
export function filterByTechStack(assets, techStack) {
|
|
218
|
+
return assets.filter((a) => {
|
|
219
|
+
if (a.applicable_tech_stack.length === 0)
|
|
220
|
+
return true; // 通用规则
|
|
221
|
+
return a.applicable_tech_stack.some((t) => techStack.includes(t));
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* 脚手架资产检查 — 只能由脚手架机制消费。
|
|
226
|
+
*/
|
|
227
|
+
export function isScaffoldAsset(assetPath) {
|
|
228
|
+
return assetPath.replace(/\\/g, "/").includes("templates/scaffolds/");
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 包内路径检查 — scaffold 不依赖 process.cwd()/templates。
|
|
232
|
+
*/
|
|
233
|
+
export function isPackageInternalPath(absPath, packageRoot) {
|
|
234
|
+
return absPath.startsWith(packageRoot);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 审计模板可见性。
|
|
238
|
+
*/
|
|
239
|
+
export function auditTemplateVisibility(assets) {
|
|
240
|
+
const report = {
|
|
241
|
+
total_assets: assets.length,
|
|
242
|
+
user_project_assets: 0,
|
|
243
|
+
soloforge_internal_assets: 0,
|
|
244
|
+
adapter_runtime_only_assets: 0,
|
|
245
|
+
scaffold_only_assets: 0,
|
|
246
|
+
global_pattern_assets: 0,
|
|
247
|
+
missing_metadata: 0,
|
|
248
|
+
visibility_conflicts: 0,
|
|
249
|
+
leaked_internal_assets: 0,
|
|
250
|
+
internal_term_violations: 0,
|
|
251
|
+
scaffold_variable_gaps: 0,
|
|
252
|
+
};
|
|
253
|
+
for (const a of assets) {
|
|
254
|
+
switch (a.asset_visibility) {
|
|
255
|
+
case "user_project":
|
|
256
|
+
report.user_project_assets++;
|
|
257
|
+
break;
|
|
258
|
+
case "soloforge_internal":
|
|
259
|
+
report.soloforge_internal_assets++;
|
|
260
|
+
break;
|
|
261
|
+
case "adapter_runtime_only":
|
|
262
|
+
report.adapter_runtime_only_assets++;
|
|
263
|
+
break;
|
|
264
|
+
case "scaffold_only":
|
|
265
|
+
report.scaffold_only_assets++;
|
|
266
|
+
break;
|
|
267
|
+
case "global_pattern":
|
|
268
|
+
report.global_pattern_assets++;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
if (!a.asset_id || !a.owner_mechanism_id)
|
|
272
|
+
report.missing_metadata++;
|
|
273
|
+
}
|
|
274
|
+
return report;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 全量可见性审计 — 由权威合同注册表驱动。
|
|
278
|
+
*/
|
|
279
|
+
export function auditAllTemplateAssets(templateRoot) {
|
|
280
|
+
const assets = [];
|
|
281
|
+
if (!fs.existsSync(templateRoot)) {
|
|
282
|
+
return auditTemplateVisibility(assets);
|
|
283
|
+
}
|
|
284
|
+
// 使用权威合同注册表作为单一数据源
|
|
285
|
+
const contracts = listTemplateAssetContracts();
|
|
286
|
+
for (const contract of contracts) {
|
|
287
|
+
assets.push({
|
|
288
|
+
asset_id: contract.asset_id,
|
|
289
|
+
asset_visibility: contract.asset_visibility,
|
|
290
|
+
sync_to_user_project: contract.sync_to_user_project,
|
|
291
|
+
sync_target: contract.sync_target,
|
|
292
|
+
runtime_visibility: contract.runtime_visibility,
|
|
293
|
+
evidence_role: contract.evidence_role,
|
|
294
|
+
user_visible: contract.user_visible,
|
|
295
|
+
owner_mechanism_id: contract.owner_mechanism_id,
|
|
296
|
+
applicable_routes: contract.applicable_routes,
|
|
297
|
+
applicable_tech_stack: contract.applicable_tech_stack,
|
|
298
|
+
source: "builtin",
|
|
299
|
+
lifecycle_status: contract.lifecycle_status,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
return auditTemplateVisibility(assets);
|
|
303
|
+
}
|
|
304
|
+
function walkDir(dir) {
|
|
305
|
+
const results = [];
|
|
306
|
+
const stack = [dir];
|
|
307
|
+
while (stack.length > 0) {
|
|
308
|
+
const current = stack.pop();
|
|
309
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
310
|
+
const absPath = path.join(current, entry.name);
|
|
311
|
+
if (entry.isDirectory()) {
|
|
312
|
+
stack.push(absPath);
|
|
313
|
+
}
|
|
314
|
+
else if (/\.(md|yaml|yml|json)$/.test(entry.name)) {
|
|
315
|
+
results.push(absPath);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return results;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=template_asset_visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template_asset_visibility.js","sourceRoot":"","sources":["../../src/engine/template_asset_visibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板初始化同步 — init 命令的知识模板复制与全局模式安装。
|
|
3
|
+
*
|
|
4
|
+
* 将 CLI copyKnowledgeTemplates / copyGlobalPatterns 的核心逻辑抽为生产模块,
|
|
5
|
+
* 由 CLI、release gate、observed_consumption 共同调用。
|
|
6
|
+
* 每次调用均记录 consumption_trace,保证 trace 来源真实一致。
|
|
7
|
+
* 同步完成后写入 sync-manifest.json,记录每个同步文件的来源身份元数据。
|
|
8
|
+
*/
|
|
9
|
+
export interface InitSyncResult {
|
|
10
|
+
/** 复制的文件数 */
|
|
11
|
+
copied: number;
|
|
12
|
+
/** 跳过的内部资产数 */
|
|
13
|
+
skipped_internal: number;
|
|
14
|
+
/** 跳过的无合同资产数 */
|
|
15
|
+
skipped_no_contract: number;
|
|
16
|
+
/** 全局模式复制数 */
|
|
17
|
+
patterns_copied: number;
|
|
18
|
+
/** 全局模式跳过数(已存在) */
|
|
19
|
+
patterns_skipped: number;
|
|
20
|
+
}
|
|
21
|
+
/** 同步清单条目 */
|
|
22
|
+
export interface SyncManifestEntry {
|
|
23
|
+
source_asset_id: string;
|
|
24
|
+
source_contract_path: string;
|
|
25
|
+
source_hash: string;
|
|
26
|
+
synced_at: string;
|
|
27
|
+
}
|
|
28
|
+
/** 同步清单 */
|
|
29
|
+
export interface SyncManifest {
|
|
30
|
+
version: 1;
|
|
31
|
+
entries: Record<string, SyncManifestEntry>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 读取同步清单。
|
|
35
|
+
*/
|
|
36
|
+
export declare function readSyncManifest(projectPath: string): SyncManifest | null;
|
|
37
|
+
/**
|
|
38
|
+
* 从权威来源(当前安装的模板包)计算 source_contract_path 的 body hash。
|
|
39
|
+
* 用于替代 sync-manifest.json 中用户可编辑的 source_hash。
|
|
40
|
+
* 返回 null 表示权威来源文件不存在(用户可能已卸载/升级包)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function computeAuthoritativeHash(sourceContractPath: string): string | null;
|
|
43
|
+
export interface AuthoritativeIdentity {
|
|
44
|
+
source_contract_path: string;
|
|
45
|
+
source_asset_id: string;
|
|
46
|
+
source_hash: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 按目标 knowledge relativePath 反向解析权威来源身份。
|
|
50
|
+
* 不依赖用户可编辑 manifest 中的 source_contract_path/source_asset_id。
|
|
51
|
+
* 返回 null 表示无对应权威映射(非同步资产或模板包缺失)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveAuthoritativeIdentity(knowledgeRelPath: string): AuthoritativeIdentity | null;
|
|
54
|
+
/**
|
|
55
|
+
* 遍历 templates/knowledge 下所有文件,通过 getContractDecision 门禁,
|
|
56
|
+
* 记录 consumption_trace 后复制到用户项目 .soloforge/knowledge/ 目录。
|
|
57
|
+
* 同步完成后写入 sync-manifest.json 记录来源身份。
|
|
58
|
+
*/
|
|
59
|
+
export declare function copyKnowledgeToProject(templatesRootDir: string, projectPath: string): Promise<InitSyncResult>;
|
|
60
|
+
/**
|
|
61
|
+
* 安装全局模式到指定目录。
|
|
62
|
+
* 遍历 templates/patterns 下所有文件,记录 consumption_trace。
|
|
63
|
+
*/
|
|
64
|
+
export declare function copyPatternsToGlobal(templatesRootDir: string, patternsDestDir: string): Promise<{
|
|
65
|
+
copied: number;
|
|
66
|
+
skipped: number;
|
|
67
|
+
}>;
|
|
68
|
+
//# sourceMappingURL=template_init_sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template_init_sync.d.ts","sourceRoot":"","sources":["../../src/engine/template_init_sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,aAAa;AACb,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC5C;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQzE;AA2BD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKlF;AAED,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAYnG;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CA8FzB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC9C"}
|