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.
Files changed (118) hide show
  1. package/README.md +6 -3
  2. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/claude_md.js +4 -0
  4. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  5. package/dist/adapters/claude_code/tools.d.ts +10 -10
  6. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  7. package/dist/adapters/claude_code/tools.js +317 -18
  8. package/dist/adapters/claude_code/tools.js.map +1 -1
  9. package/dist/adapters/shared/workflow_template.d.ts +26 -0
  10. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  11. package/dist/adapters/shared/workflow_template.js +139 -46
  12. package/dist/adapters/shared/workflow_template.js.map +1 -1
  13. package/dist/bin/soloforge.d.ts.map +1 -1
  14. package/dist/bin/soloforge.js +85 -53
  15. package/dist/bin/soloforge.js.map +1 -1
  16. package/dist/engine/asset_manifest.d.ts +7 -1
  17. package/dist/engine/asset_manifest.d.ts.map +1 -1
  18. package/dist/engine/asset_manifest.js +28 -18
  19. package/dist/engine/asset_manifest.js.map +1 -1
  20. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  21. package/dist/engine/consumable_asset_registry.js +26 -0
  22. package/dist/engine/consumable_asset_registry.js.map +1 -1
  23. package/dist/engine/consumption_trace_store.d.ts +8 -8
  24. package/dist/engine/consumption_trace_store.d.ts.map +1 -1
  25. package/dist/engine/consumption_trace_store.js +11 -7
  26. package/dist/engine/consumption_trace_store.js.map +1 -1
  27. package/dist/engine/decision_workshop.d.ts +160 -0
  28. package/dist/engine/decision_workshop.d.ts.map +1 -0
  29. package/dist/engine/decision_workshop.js +279 -0
  30. package/dist/engine/decision_workshop.js.map +1 -0
  31. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  32. package/dist/engine/dual_layer_mechanism_registry.js +176 -2
  33. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  34. package/dist/engine/explicit_asset_registry.d.ts +30 -0
  35. package/dist/engine/explicit_asset_registry.d.ts.map +1 -0
  36. package/dist/engine/explicit_asset_registry.js +3508 -0
  37. package/dist/engine/explicit_asset_registry.js.map +1 -0
  38. package/dist/engine/implementation_roadmap_registry.d.ts +2 -2
  39. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  40. package/dist/engine/implementation_roadmap_registry.js +44 -16
  41. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  42. package/dist/engine/intent_expander.d.ts.map +1 -1
  43. package/dist/engine/intent_expander.js +46 -2
  44. package/dist/engine/intent_expander.js.map +1 -1
  45. package/dist/engine/intent_router.d.ts +1 -1
  46. package/dist/engine/intent_router.d.ts.map +1 -1
  47. package/dist/engine/intent_router.js +2 -1
  48. package/dist/engine/intent_router.js.map +1 -1
  49. package/dist/engine/knowledge_injection_boundary.d.ts +3 -0
  50. package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -1
  51. package/dist/engine/knowledge_injection_boundary.js +48 -5
  52. package/dist/engine/knowledge_injection_boundary.js.map +1 -1
  53. package/dist/engine/mechanism_contract_registry.d.ts +1 -1
  54. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  55. package/dist/engine/mechanism_contract_registry.js +74 -2
  56. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  57. package/dist/engine/observed_consumption.d.ts +54 -0
  58. package/dist/engine/observed_consumption.d.ts.map +1 -0
  59. package/dist/engine/observed_consumption.js +377 -0
  60. package/dist/engine/observed_consumption.js.map +1 -0
  61. package/dist/engine/release_issue_scenario_registry.d.ts +64 -0
  62. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -0
  63. package/dist/engine/release_issue_scenario_registry.js +1349 -0
  64. package/dist/engine/release_issue_scenario_registry.js.map +1 -0
  65. package/dist/engine/release_readiness_gate.d.ts +1 -1
  66. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  67. package/dist/engine/release_readiness_gate.js +574 -46
  68. package/dist/engine/release_readiness_gate.js.map +1 -1
  69. package/dist/engine/release_tool_harness.d.ts +71 -0
  70. package/dist/engine/release_tool_harness.d.ts.map +1 -0
  71. package/dist/engine/release_tool_harness.js +161 -0
  72. package/dist/engine/release_tool_harness.js.map +1 -0
  73. package/dist/engine/scaffolder.d.ts.map +1 -1
  74. package/dist/engine/scaffolder.js +144 -7
  75. package/dist/engine/scaffolder.js.map +1 -1
  76. package/dist/engine/standard_asset_contract.d.ts +75 -0
  77. package/dist/engine/standard_asset_contract.d.ts.map +1 -0
  78. package/dist/engine/standard_asset_contract.js +388 -0
  79. package/dist/engine/standard_asset_contract.js.map +1 -0
  80. package/dist/engine/standard_asset_coverage.d.ts +45 -0
  81. package/dist/engine/standard_asset_coverage.d.ts.map +1 -0
  82. package/dist/engine/standard_asset_coverage.js +220 -0
  83. package/dist/engine/standard_asset_coverage.js.map +1 -0
  84. package/dist/engine/template_asset_contract_registry.d.ts +162 -0
  85. package/dist/engine/template_asset_contract_registry.d.ts.map +1 -0
  86. package/dist/engine/template_asset_contract_registry.js +598 -0
  87. package/dist/engine/template_asset_contract_registry.js.map +1 -0
  88. package/dist/engine/template_asset_visibility.d.ts +109 -0
  89. package/dist/engine/template_asset_visibility.d.ts.map +1 -0
  90. package/dist/engine/template_asset_visibility.js +321 -0
  91. package/dist/engine/template_asset_visibility.js.map +1 -0
  92. package/dist/engine/template_init_sync.d.ts +68 -0
  93. package/dist/engine/template_init_sync.d.ts.map +1 -0
  94. package/dist/engine/template_init_sync.js +218 -0
  95. package/dist/engine/template_init_sync.js.map +1 -0
  96. package/dist/engine/template_manifest_io.d.ts +10 -0
  97. package/dist/engine/template_manifest_io.d.ts.map +1 -1
  98. package/dist/engine/template_manifest_io.js +63 -30
  99. package/dist/engine/template_manifest_io.js.map +1 -1
  100. package/dist/engine/template_mechanism_auditor.d.ts +3 -1
  101. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
  102. package/dist/engine/template_mechanism_auditor.js +27 -24
  103. package/dist/engine/template_mechanism_auditor.js.map +1 -1
  104. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  105. package/dist/engine/tool_invocation_contract_registry.js +11 -1
  106. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  107. package/dist/knowledge/index_manager.d.ts +20 -0
  108. package/dist/knowledge/index_manager.d.ts.map +1 -1
  109. package/dist/knowledge/index_manager.js +234 -3
  110. package/dist/knowledge/index_manager.js.map +1 -1
  111. package/dist/types.d.ts +36 -1
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +2 -2
  114. 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
  115. 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
  116. 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
  117. 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
  118. 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
@@ -1 +1 @@
1
- {"version":3,"file":"workflow_template.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAqDnE"}
1
+ {"version":3,"file":"workflow_template.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2CpD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAQtD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAiCA;AASD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAsBnE"}
@@ -1,61 +1,154 @@
1
1
  import { debug } from "../../engine/logger.js";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import crypto from "node:crypto";
5
+ import { findLayerMapByMechanismId } from "../../engine/dual_layer_mechanism_registry.js";
6
+ import { WORKFLOW_TEMPLATE_HARD_RULES } from "../../engine/asset_manifest.js";
7
+ const SF_HARD_RULE_RE = /@sf-hard-rule[^>]*mechanism=(\S+)/g;
8
+ /** 从结构化清单生成 @sf-hard-rule 标记 */
9
+ function hardRuleTag(ruleId) {
10
+ const rule = WORKFLOW_TEMPLATE_HARD_RULES.find(r => r.rule_id === ruleId);
11
+ if (!rule)
12
+ return `<!-- @sf-hard-rule id=${ruleId} MISSING_IN_MANIFEST -->`;
13
+ return `<!-- @sf-hard-rule id=${rule.rule_id} mechanism=${rule.mechanism_id} enforcement=${rule.enforcement_status} summary="${rule.rule_summary}" -->`;
14
+ }
15
+ /** 渲染一条规则的 marker + user_instruction */
16
+ function renderRule(ruleId) {
17
+ const rule = WORKFLOW_TEMPLATE_HARD_RULES.find(r => r.rule_id === ruleId);
18
+ const tag = hardRuleTag(ruleId);
19
+ const text = rule?.user_instruction ?? "";
20
+ if (text)
21
+ return `${tag}\n${text}`;
22
+ return tag;
23
+ }
24
+ /** 渲染一组规则(marker + user_instruction) */
25
+ function renderRules(ruleIds) {
26
+ return ruleIds.map(id => renderRule(id)).join("\n");
27
+ }
28
+ /** 工作流步骤定义: 每步包含标题和有序规则 ID */
29
+ const WORKFLOW_STEPS = [
30
+ { title: "", rule_ids: ["wf-privacy-before-expand", "wf-knowledge-injection", "wf-core-principles"] },
31
+ { title: "### 步骤 1: 分类", rule_ids: ["wf-classify-first"] },
32
+ { title: "### 步骤 1.5: 入口裁决", rule_ids: ["wf-routing-gate", "wf-strategy-no-route"] },
33
+ { title: "### 步骤 1.6: 多阶段拆解", rule_ids: ["wf-multi-stage-loop"] },
34
+ { title: "### 步骤 2: 执行", rule_ids: ["wf-dispatch-by-route", "wf-command-contract", "wf-tool-contract", "wf-architecture-workshop-first", "wf-design-artifact-pack", "wf-standard-asset-contract", "wf-template-asset-visibility"] },
35
+ { title: "### 步骤 3: 验证", rule_ids: ["wf-verify-after-change", "wf-evidence-grounding"] },
36
+ { title: "### 步骤 4: 学习", rule_ids: ["wf-learn-after-verify"] },
37
+ { title: "### 步骤 5: 汇报", rule_ids: ["wf-no-auto-capability-change"] },
38
+ ];
39
+ /**
40
+ * 计算所有权威规则资产的第一行非注释内容组合的 SHA256 校验和。
41
+ * 权威规则内容变化时校验和必然变化。
42
+ */
43
+ export function computeAuthoritativeRulesChecksum(rootDir) {
44
+ const mechanismIds = getWorkflowRuleMechanismIds();
45
+ const parts = [];
46
+ for (const mid of mechanismIds) {
47
+ const map = findLayerMapByMechanismId(mid);
48
+ if (!map?.template_assets)
49
+ continue;
50
+ for (const asset of map.template_assets) {
51
+ const fullPath = path.join(rootDir, asset.path);
52
+ if (!fs.existsSync(fullPath))
53
+ continue;
54
+ const content = fs.readFileSync(fullPath, "utf-8");
55
+ // 取前 200 字符(去掉 frontmatter 后的首段)作为校验依据
56
+ const bodyStart = content.indexOf("---", content.indexOf("---") + 3);
57
+ const body = bodyStart >= 0 ? content.substring(bodyStart + 3).trimStart() : content;
58
+ parts.push(`${asset.path}:${body.substring(0, 500)}`);
59
+ }
60
+ }
61
+ return crypto.createHash("sha256").update(parts.join("\n")).digest("hex").substring(0, 16);
62
+ }
63
+ /**
64
+ * 提取 generateWorkflowRules 输出中所有 @sf-hard-rule 引用的机制 ID(去重)。
65
+ */
66
+ export function getWorkflowRuleMechanismIds() {
67
+ const text = generateWorkflowRules({});
68
+ const ids = new Set();
69
+ let m;
70
+ while ((m = SF_HARD_RULE_RE.exec(text)) !== null) {
71
+ ids.add(m[1]);
72
+ }
73
+ return [...ids];
74
+ }
75
+ /**
76
+ * 校验工作流模板中每条 @sf-hard-rule 都能找到权威机制注册条目,
77
+ * 且其 template_layer 资产文件存在,且内容校验和与嵌入值一致。
78
+ */
79
+ export function validateWorkflowRuleSources(rootDir) {
80
+ const mechanismIds = getWorkflowRuleMechanismIds();
81
+ const missing_mechanisms = [];
82
+ const missing_assets = [];
83
+ for (const mid of mechanismIds) {
84
+ const map = findLayerMapByMechanismId(mid);
85
+ if (!map) {
86
+ missing_mechanisms.push(mid);
87
+ continue;
88
+ }
89
+ if (map.template_assets) {
90
+ for (const asset of map.template_assets) {
91
+ if (!fs.existsSync(path.join(rootDir, asset.path))) {
92
+ missing_assets.push(asset.path);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ // 内容校验和验证
98
+ const computedChecksum = computeAuthoritativeRulesChecksum(rootDir);
99
+ const embeddedChecksum = getEmbeddedChecksum();
100
+ const checksumMismatch = computedChecksum !== embeddedChecksum;
101
+ return {
102
+ valid: missing_mechanisms.length === 0 && missing_assets.length === 0 && !checksumMismatch,
103
+ missing_mechanisms,
104
+ missing_assets,
105
+ checksum_mismatch: checksumMismatch,
106
+ embedded_checksum: embeddedChecksum,
107
+ computed_checksum: computedChecksum,
108
+ };
109
+ }
110
+ /** 当前嵌入的权威规则校验和 — 由 `npm run update-workflow-checksum` 更新。 */
111
+ const EMBEDDED_CHECKSUM = "a875189c510913ff";
112
+ function getEmbeddedChecksum() {
113
+ return EMBEDDED_CHECKSUM;
114
+ }
115
+ /**
116
+ * 更新嵌入校验和到源文件。由 CI 或开发者在确认权威规则变化后调用。
117
+ */
118
+ export function updateEmbeddedChecksum(rootDir) {
119
+ const newChecksum = computeAuthoritativeRulesChecksum(rootDir);
120
+ const selfPath = path.join(rootDir, "src", "adapters", "shared", "workflow_template.ts");
121
+ if (fs.existsSync(selfPath)) {
122
+ let content = fs.readFileSync(selfPath, "utf-8");
123
+ content = content.replace(/const EMBEDDED_CHECKSUM = "[^"]*";/, `const EMBEDDED_CHECKSUM = "${newChecksum}";`);
124
+ fs.writeFileSync(selfPath, content, "utf-8");
125
+ }
126
+ return newChecksum;
127
+ }
2
128
  /**
3
129
  * 生成工作流规则模板内容。
130
+ * 从 WORKFLOW_TEMPLATE_HARD_RULES 结构化清单循环渲染每条规则的 marker + user_instruction。
4
131
  * @param config - 项目配置
5
132
  * @returns 工作流规则文本
6
133
  */
7
134
  export function generateWorkflowRules(config) {
8
135
  debug("工作流模板", "生成工作流规则");
9
- return `# SoloForge 集成规则
136
+ const header = `# SoloForge 集成规则
10
137
 
11
138
  ## 强制工作流
12
139
 
13
- 当收到开发指令时(非纯对话/提问),必须按以下顺序执行:
14
-
15
- <!-- @sf-hard-rule id=wf-privacy-before-expand mechanism=mc-privacy-boundary enforcement=enforced -->
16
- <!-- @sf-hard-rule id=wf-knowledge-injection mechanism=mc-knowledge-injection-boundary enforcement=enforced -->
17
- <!-- @sf-hard-rule id=wf-core-principles mechanism=mc-core-engineering-principles enforcement=enforced -->
18
- ### 步骤 1: 分类
19
- <!-- @sf-hard-rule id=wf-classify-first mechanism=mc-workflow-contract enforcement=enforced -->
20
- 调用 \`sf_classify\` 分类。
21
-
22
- <!-- @sf-hard-rule id=wf-routing-gate mechanism=mc-workflow-contract enforcement=enforced -->
23
- ### 步骤 1.5: 入口裁决
24
- 按分类结果 \`route_decision\` 字段分发。详见知识库路由规则。
25
-
26
- <!-- @sf-hard-rule id=wf-strategy-no-route mechanism=mc-workflow-contract enforcement=enforced -->
27
- \`strategy\` 仅兼容展示,不作为入口裁决。
28
-
29
- <!-- @sf-hard-rule id=wf-multi-stage-loop mechanism=mc-workflow-contract enforcement=enforced -->
30
- ### 步骤 1.6: 多阶段拆解
31
- \`execution_shape=multi_stage_plan\` 时: \`sf_plan\` → \`sf_expand\` → 执行 → \`sf_plan_advance\` → 循环。
32
-
33
- <!-- @sf-hard-rule id=wf-dispatch-by-route mechanism=mc-workflow-contract enforcement=enforced -->
34
- <!-- @sf-hard-rule id=wf-command-contract mechanism=mc-command-execution enforcement=enforced -->
35
- <!-- @sf-hard-rule id=wf-tool-contract mechanism=mc-tool-invocation-contract enforcement=enforced -->
36
- <!-- @sf-hard-rule id=wf-architecture-workshop-first mechanism=mc-architecture-decision-workshop enforcement=enforced -->
37
- <!-- @sf-hard-rule id=wf-design-artifact-pack mechanism=mc-design-artifact-pack enforcement=enforced -->
38
- ### 步骤 2: 执行
39
- 按分类结果调用对应工具。详见知识库流程。
40
- 涉及架构设计时,必须先完成业务流程、数据、安全、后端、前端、基础设施六类决策研讨与用户确认,再生成正式设计产物。
41
- 涉及架构、数据库或 API 设计产物时,必须按设计产物包规则生成或升级;未经真实复验的旧文档不得用于编码结论。
42
-
43
- <!-- @sf-hard-rule id=wf-verify-after-change mechanism=mc-verifier enforcement=enforced -->
44
- <!-- @sf-hard-rule id=wf-evidence-grounding mechanism=mc-evidence-grounding enforcement=enforced -->
45
- ### 步骤 3: 验证
46
- 代码修改后调用 \`sf_verify\` 并执行返回的验证命令。
47
- 关键事实和交付结论必须有 evidence_refs,证据不足时必须说明不确定并请求确认。验证计划不得当作验证结果。
48
-
49
- <!-- @sf-hard-rule id=wf-learn-after-verify mechanism=mc-task-context-lifecycle enforcement=enforced -->
50
- ### 步骤 4: 学习
51
- 验证后调用 \`sf_learn\`。若有 \`retry_hint\` 回到步骤 3。
52
-
53
- <!-- @sf-hard-rule id=wf-no-auto-capability-change mechanism=mc-guard-evaluation enforcement=enforced -->
54
- ### 步骤 5: 汇报
55
- 展示验证摘要和验收结果。
140
+ 当收到开发指令时(非纯对话/提问),必须按以下顺序执行:`;
141
+ const sections = WORKFLOW_STEPS.map(step => {
142
+ const rulesText = renderRules(step.rule_ids);
143
+ if (step.title)
144
+ return `${step.title}\n${rulesText}`;
145
+ return rulesText;
146
+ }).join("\n\n");
147
+ const footer = `## 项目信息
56
148
 
57
- ## 项目信息
149
+ 项目事实以 config 配置及 tool 输出为准,不在模板中硬编码。
58
150
 
59
- 项目事实以 config 配置及 tool 输出为准,不在模板中硬编码。`;
151
+ <!-- @sf-checksum: ${EMBEDDED_CHECKSUM} -->`;
152
+ return `${header}\n\n${sections}\n\n${footer}`;
60
153
  }
61
154
  //# sourceMappingURL=workflow_template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow_template.js","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAkD4B,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"workflow_template.js","sourceRoot":"","sources":["../../../src/adapters/shared/workflow_template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"soloforge.d.ts","sourceRoot":"","sources":["../../src/bin/soloforge.ts"],"names":[],"mappings":";AAm0BA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC"}
1
+ {"version":3,"file":"soloforge.d.ts","sourceRoot":"","sources":["../../src/bin/soloforge.ts"],"names":[],"mappings":";AA6yBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC"}
@@ -81,6 +81,9 @@ async function main() {
81
81
  case "validate-release":
82
82
  await cmdValidateReleaseGate();
83
83
  break;
84
+ case "audit-template-visibility":
85
+ await cmdAuditTemplateVisibility();
86
+ break;
84
87
  case "sync-templates":
85
88
  await cmdSyncTemplates();
86
89
  break;
@@ -460,56 +463,32 @@ async function cmdInit() {
460
463
  "请打开 Claude Code 开始使用。"}`);
461
464
  }
462
465
  async function copyGlobalPatterns(projectPath) {
466
+ const { copyPatternsToGlobal } = await import("../engine/template_init_sync.js");
463
467
  const globalDir = getGlobalPatternsDir();
464
- fss.mkdirSync(globalDir, { recursive: true });
465
- const templatesDir = path.resolve(import.meta.dirname, "..", "..", "templates", "patterns");
466
- if (fss.existsSync(templatesDir)) {
467
- const files = fss.readdirSync(templatesDir).filter((f) => f.endsWith(".md"));
468
- let copiedCount = 0;
469
- let skippedCount = 0;
470
- for (const f of files) {
471
- const src = path.join(templatesDir, f);
472
- const dest = path.join(globalDir, f);
473
- if (!fss.existsSync(dest)) {
474
- fss.copyFileSync(src, dest);
475
- copiedCount++;
476
- }
477
- else {
478
- skippedCount++;
479
- }
480
- }
481
- const parts = [];
482
- if (copiedCount > 0)
483
- parts.push(`新增 ${copiedCount} 个`);
484
- if (skippedCount > 0)
485
- parts.push(`跳过 ${skippedCount} 个(已存在)`);
486
- userInfo(`✅ 全局模板 ~/.soloforge/patterns/: ${parts.length > 0 ? parts.join(",") : `${files.length} 个(已全部存在)`}`);
468
+ const templatesRoot = path.resolve(import.meta.dirname, "..", "..");
469
+ const result = await copyPatternsToGlobal(templatesRoot, globalDir);
470
+ const parts = [];
471
+ if (result.copied > 0)
472
+ parts.push(`新增 ${result.copied} 个`);
473
+ if (result.skipped > 0)
474
+ parts.push(`跳过 ${result.skipped} 个(已存在)`);
475
+ if (parts.length > 0) {
476
+ userInfo(`✅ 全局模板 ~/.soloforge/patterns/: ${parts.join(",")}`);
487
477
  }
488
478
  }
489
479
  async function copyKnowledgeTemplates(projectPath) {
490
- const knowledgeTemplatesDir = path.resolve(import.meta.dirname, "..", "..", "templates", "knowledge");
491
- if (fss.existsSync(knowledgeTemplatesDir)) {
492
- const subDirs = ["procedures", "domain", "product_profiles", "acceptance_templates", "review_rules", "patterns/core", "checklists", "templates"];
493
- let copiedCount = 0;
494
- for (const subDir of subDirs) {
495
- const srcDir = path.join(knowledgeTemplatesDir, subDir);
496
- if (!fss.existsSync(srcDir))
497
- continue;
498
- const destDir = path.join(projectPath, ".soloforge", "knowledge", subDir);
499
- fss.mkdirSync(destDir, { recursive: true });
500
- const files = fss.readdirSync(srcDir).filter((f) => f.endsWith(".md") || f.endsWith(".yaml") || f.endsWith(".yml"));
501
- for (const f of files) {
502
- const src = path.join(srcDir, f);
503
- const dest = path.join(destDir, f);
504
- if (!fss.existsSync(dest)) {
505
- fss.copyFileSync(src, dest);
506
- copiedCount++;
507
- }
508
- }
509
- }
510
- if (copiedCount > 0) {
511
- userInfo(`✅ ${copiedCount} 个知识模板已复制到 .soloforge/knowledge/`);
512
- }
480
+ const { copyKnowledgeToProject } = await import("../engine/template_init_sync.js");
481
+ const templatesRoot = path.resolve(import.meta.dirname, "..", "..");
482
+ const result = await copyKnowledgeToProject(templatesRoot, projectPath);
483
+ const parts = [];
484
+ if (result.copied > 0)
485
+ parts.push(`${result.copied} 个已复制`);
486
+ if (result.skipped_internal > 0)
487
+ parts.push(`${result.skipped_internal} 个内部资产已跳过`);
488
+ if (result.skipped_no_contract > 0)
489
+ parts.push(`${result.skipped_no_contract} 个无合同已跳过`);
490
+ if (parts.length > 0) {
491
+ userInfo(`✅ 知识模板: ${parts.join(",")}`);
513
492
  }
514
493
  }
515
494
  async function generateAdapterConfigs(projectPath, adapter) {
@@ -870,8 +849,7 @@ async function cmdValidate() {
870
849
  try {
871
850
  const { config, source } = await resolveProjectConfig(projectPath);
872
851
  if (source === "inferred") {
873
- userInfo("ℹ️ 未找到 .soloforge/config.yaml — 使用自动推断的配置。");
874
- userInfo(" 运行 'soloforge init --auto' 可持久化。");
852
+ userInfo("ℹ️ 配置来源: 自动推断");
875
853
  }
876
854
  else {
877
855
  userInfo("✅ config.yaml 有效");
@@ -1590,14 +1568,14 @@ async function cmdSyncTemplates() {
1590
1568
  else {
1591
1569
  userInfo(apply ? "模板同步: apply 模式" : "模板同步: dry-run 模式(不写入文件)");
1592
1570
  userInfo(` 资产总数: ${assets.length}`);
1593
- userInfo(` 安全检查: ${safeCheck.safe ? "" : ""}`);
1571
+ userInfo(` 应用安全: ${safeCheck.safe ? "安全" : "需确认"}`);
1594
1572
  userInfo(` 结果: ${syncResult.success ? "成功" : "失败"}`);
1595
1573
  userInfo(` 新增: ${syncResult.report.added.length}`);
1596
1574
  userInfo(` 更新: ${syncResult.report.updated.length}`);
1597
1575
  userInfo(` 跳过(用户修改): ${syncResult.report.skipped_user_modified.length}`);
1598
1576
  userInfo(` 废弃: ${syncResult.report.deprecated.length}`);
1599
1577
  if (!apply)
1600
- userInfo(" 使用 --apply --confirm 应用同步");
1578
+ userInfo(" 使用 --apply --confirm 应用同步;需确认表示 dry-run 发现现有用户资产,不会自动覆盖");
1601
1579
  }
1602
1580
  if (!syncResult.success)
1603
1581
  process.exit(1);
@@ -1973,8 +1951,8 @@ async function cmdValidateNewIssue() {
1973
1951
  userInfo(JSON.stringify(output, null, 2));
1974
1952
  }
1975
1953
  else {
1976
- userInfo(`问题演进门控: ${output.gate_status}`);
1977
- userInfo(` 已检查 ${allProblems.length} 个既有问题`);
1954
+ userInfo(`需求演进检查: ${output.gate_status}`);
1955
+ userInfo(` 已检查 ${allProblems.length} 个已有功能记录`);
1978
1956
  if (output.duplicate_detected) {
1979
1957
  userInfo(` ⚠ 重复检测: 发现 ${output.duplicates.join(", ")}`);
1980
1958
  for (const d of matchedDetails) {
@@ -1987,7 +1965,7 @@ async function cmdValidateNewIssue() {
1987
1965
  userInfo(` - ${r}`);
1988
1966
  }
1989
1967
  if (output.can_proceed) {
1990
- userInfo(` ✓ 可继续: 问题新增已通过演进门控 (候选ID: ${candidateId})`);
1968
+ userInfo(` ✓ 可继续: 需求新增已通过演进检查 (ID: ${candidateId})`);
1991
1969
  }
1992
1970
  }
1993
1971
  if (!output.can_proceed) {
@@ -2266,4 +2244,58 @@ function getArgValue(flag) {
2266
2244
  return undefined;
2267
2245
  return result;
2268
2246
  }
2247
+ async function cmdAuditTemplateVisibility() {
2248
+ const projectPath = process.env.SOLOFORGE_PROJECT ?? process.cwd();
2249
+ const { auditStandardAssetCoverage } = await import("../engine/standard_asset_coverage.js");
2250
+ const { listBuiltinConsumableAssets } = await import("../engine/consumable_asset_registry.js");
2251
+ const { listTemplateAssetContracts, auditContractCoverage } = await import("../engine/template_asset_contract_registry.js");
2252
+ const { userInfo, userJson } = await import("../engine/logger.js");
2253
+ // 使用权威合同注册表作为单一数据源
2254
+ const contracts = listTemplateAssetContracts();
2255
+ const registeredAssets = listBuiltinConsumableAssets();
2256
+ const consumablePaths = new Set(registeredAssets.map((a) => a.path));
2257
+ const ownerMap = new Map(contracts.map((c) => [c.path, c.owner_mechanism_id]));
2258
+ const consumerMap = new Map(contracts.map((c) => [c.path, [c.mainline_consumer, c.validation_entrypoint].filter(Boolean)]));
2259
+ const visibilityMap = new Map(contracts.map((c) => [c.path, c.asset_visibility]));
2260
+ // 运行覆盖审计(使用真实合同数据)
2261
+ const report = auditStandardAssetCoverage(projectPath, consumablePaths, ownerMap, consumerMap, visibilityMap);
2262
+ // 合同覆盖统计
2263
+ const coverageReport = auditContractCoverage(projectPath);
2264
+ // 可见性统计(从权威合同直接计算)
2265
+ const internalCount = contracts.filter((c) => c.asset_visibility === "soloforge_internal" || c.asset_visibility === "scaffold_only").length;
2266
+ const userVisibleCount = contracts.filter((c) => c.user_visible).length;
2267
+ // 输出报告
2268
+ const isJson = args.includes("--json");
2269
+ const result = {
2270
+ total_assets: report.total_assets,
2271
+ contract_covered: coverageReport.contract_covered,
2272
+ uncovered_assets: coverageReport.uncovered,
2273
+ user_visible_count: userVisibleCount,
2274
+ internal_count: internalCount,
2275
+ unknown_visibility: coverageReport.visibility_unknown,
2276
+ conflict_count: 0,
2277
+ missing_bearer: report.missing_standard_bearer,
2278
+ missing_revalidation: report.missing_revalidation,
2279
+ missing_consumer: report.missing_consumer,
2280
+ missing_owner: report.missing_owner,
2281
+ unregistered: report.unregistered_assets,
2282
+ };
2283
+ if (isJson) {
2284
+ userJson(JSON.stringify(result, null, 2));
2285
+ }
2286
+ else {
2287
+ userInfo("═══ 模板资产可见性审计报告 ═══");
2288
+ userInfo(`总资产数: ${report.total_assets}`);
2289
+ userInfo(`合同覆盖: ${coverageReport.contract_covered}`);
2290
+ userInfo(`未覆盖: ${coverageReport.uncovered}`);
2291
+ userInfo(`用户可见: ${userVisibleCount}`);
2292
+ userInfo(`内部资产: ${internalCount}`);
2293
+ userInfo(`未知可见性: ${coverageReport.visibility_unknown}`);
2294
+ userInfo(`缺标准承载: ${report.missing_standard_bearer}`);
2295
+ userInfo(`缺复验入口: ${report.missing_revalidation}`);
2296
+ userInfo(`缺消费者: ${report.missing_consumer}`);
2297
+ userInfo(`缺 owner: ${report.missing_owner}`);
2298
+ userInfo(`未注册: ${report.unregistered_assets}`);
2299
+ }
2300
+ }
2269
2301
  //# sourceMappingURL=soloforge.js.map