soloforge 1.4.5 → 1.4.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.
package/README.md CHANGED
@@ -158,7 +158,7 @@ soloforge migrate --apply --confirm # 确认后迁移
158
158
 
159
159
  - **架构设计** — 让 AI 设计架构时,会生成结构化方案(含架构边界、技术栈、模块关系),输出目录会先征求你确认,不会自作主张写到你不想放的位置。
160
160
  - **决策研讨** — 高影响或不确定任务会先进入决策研讨,而不是直接生成方案或代码。架构设计会覆盖业务流程、数据架构、安全架构、后端架构、前端架构、基础设施六类架构决策;技术选型、数据迁移、安全策略、部署、产品范围、重构和第三方集成等任务会展开对应决策包。必要决策未确认时,不会把草案冒充正式结论。
161
- - **设计产物包** — 架构设计、数据库设计、API 规格不再各自漂移。标准产物包包含 `docs/architecture/00-架构决策记录.md`、`01-架构设计文档.md`、`02-数据库设计文档.md`、`03-API接口规格文档.md`、`04-开发切片计划.md`、`99-设计一致性验收报告.md`、`docs/traceability/01-需求原型设计实现追踪矩阵.md`、`docs/api/openapi.yaml` 和 `db/migration`/`db/migrations`/`db/schema`/`db/changelog` 下的数据库结构资产。`04-详细设计文档.md` 只是旧项目或复杂模块的可选补充,不是必需详细设计载体;旧的 `04-第一阶段开发切片计划.md` 只能作为迁移提示,不能作为设计产物包通过依据。
161
+ - **设计产物包** — 架构设计、数据库设计、API 规格不再各自漂移。标准产物包包含 `docs/architecture/00-架构决策记录.md`、`01-架构设计文档.md`、`02-数据库设计文档.md`、`03-API接口规格文档.md`、`04-开发切片计划.md`、`99-设计一致性验收报告.md`、`docs/traceability/01-需求原型设计实现追踪矩阵.md`、`docs/api/openapi.yaml` 和 `db/migration`/`db/migrations`/`db/schema`/`db/changelog` 下的数据库结构资产。`04-详细设计文档.md` 只是旧项目或复杂模块的可选补充,不是必需详细设计载体;旧的 `04-第一阶段开发切片计划.md` 会作为兼容别名读取并给出迁移提示,正式权威路径仍应迁移为 `04-开发切片计划.md`。
162
162
  - **全链路追踪矩阵** — 需求、原型、架构、详细设计、阶段、切片、实现、测试和验收使用两位数 ID 绑定,例如 `REQ-01`、`PROTO-01`、`ARCH-01`、`DD-T01`、`DD-A01`、`PHASE-01`、`SLICE-01`、`AC-01`。编码任务必须能绑定 `PHASE-*`、`SLICE-*`、`DD-*` 和 `AC-*`,不能只说“已按设计实现”。
163
163
  - **标准资产契约** — 模板、规则、流程、验收清单、审查规则、脚手架和 adapter workflow 不是“参考文件”。SoloForge 会按资产契约检查正式产物的章节、字段表、权威资产、适用技术栈和修复重验状态;API 文档必须有每个接口的请求/响应字段说明表,数据库/API Markdown 必须绑定 SQL/OpenAPI 权威资产。
164
164
  - **模板可见性** — 内部治理资产可以随 npm 包发布,供 SoloForge runtime、审计和发布门禁使用,但不会同步到用户项目,也不会注入到 AI prompt。用户项目只获得可见且适用的知识资产;脚手架只由脚手架命令消费,不进入知识索引;不匹配技术栈的内置脚手架不会 fallback 生成。
@@ -1076,6 +1076,7 @@ async function cmdValidate() {
1076
1076
  }
1077
1077
  // 使用共享函数验证配置优先级
1078
1078
  let hasHardFail = false;
1079
+ const hardFailSources = new Set();
1079
1080
  try {
1080
1081
  const { reports, entries } = await resolveCurrentProjectConfigReports(projectPath);
1081
1082
  const findings = validateConfigPrecedence(reports, entries);
@@ -1083,6 +1084,7 @@ async function cmdValidate() {
1083
1084
  const advisory = findings.filter(f => f.severity === "advisory");
1084
1085
  if (hardFails.length > 0) {
1085
1086
  hasHardFail = true;
1087
+ hardFailSources.add("配置优先级");
1086
1088
  userInfo(`❌ 配置优先级: ${hardFails.length} hard_fail`);
1087
1089
  for (const f of hardFails) {
1088
1090
  userInfo(` - [${f.rule}] ${f.field_path ?? "N/A"}: ${f.message}`);
@@ -1117,6 +1119,7 @@ async function cmdValidate() {
1117
1119
  userInfo(` - [${f.kind}] ${f.message_zh}`);
1118
1120
  }
1119
1121
  hasHardFail = true;
1122
+ hardFailSources.add("知识治理");
1120
1123
  }
1121
1124
  else {
1122
1125
  userInfo(`✅ 知识治理检查: ${kgReport.warning_count} warning, 0 hard_fail`);
@@ -1155,6 +1158,7 @@ async function cmdValidate() {
1155
1158
  }
1156
1159
  }
1157
1160
  hasHardFail = true;
1161
+ hardFailSources.add("项目知识承载");
1158
1162
  }
1159
1163
  else {
1160
1164
  userInfo(`✅ 项目知识承载: ${pkReport.total} 条,${pkReport.injectable} 条可注入,${pkReport.index_only} 条仅索引,0 hard_fail`);
@@ -1169,6 +1173,7 @@ async function cmdValidate() {
1169
1173
  for (const v of extResult.violations)
1170
1174
  userInfo(` - ${v}`);
1171
1175
  hasHardFail = true;
1176
+ hardFailSources.add("扩展清单");
1172
1177
  }
1173
1178
  else {
1174
1179
  userInfo(" ✓ 扩展清单校验通过");
@@ -1194,6 +1199,7 @@ async function cmdValidate() {
1194
1199
  if (platformReport.platform_compatibility_status === "blocked") {
1195
1200
  userInfo(` ✗ 平台兼容性阻断: ${platformReport.issues_found.join(", ")}`);
1196
1201
  hasHardFail = true;
1202
+ hardFailSources.add("平台兼容性");
1197
1203
  }
1198
1204
  else {
1199
1205
  userInfo(` ✓ 平台兼容性检查: ${platformReport.platform_compatibility_status}`);
@@ -1220,6 +1226,7 @@ async function cmdValidate() {
1220
1226
  for (const hf of hardFails)
1221
1227
  userInfo(` - ${hf.message_zh}`);
1222
1228
  hasHardFail = true;
1229
+ hardFailSources.add("README 命令漂移");
1223
1230
  }
1224
1231
  else if (warnings.length > 0) {
1225
1232
  userInfo(" ⚠ README 命令漂移警告:");
@@ -1291,6 +1298,7 @@ async function cmdValidate() {
1291
1298
  if (tsHardFail) {
1292
1299
  userError(`❌ 测试策略覆盖验证失败: ${tsChecked} 个已检查, ${tsPending} 个元数据缺失`);
1293
1300
  hasHardFail = true;
1301
+ hardFailSources.add("测试策略覆盖");
1294
1302
  }
1295
1303
  else {
1296
1304
  userInfo(`✅ 测试策略覆盖: 已检查 ${tsChecked} 个 enforced 契约`);
@@ -1299,6 +1307,7 @@ async function cmdValidate() {
1299
1307
  catch (e) {
1300
1308
  userError(`❌ 测试策略验证异常: ${e.message}`);
1301
1309
  hasHardFail = true;
1310
+ hardFailSources.add("测试策略覆盖");
1302
1311
  }
1303
1312
  } // 双层机制检查结束
1304
1313
  try {
@@ -1314,7 +1323,8 @@ async function cmdValidate() {
1314
1323
  userInfo(` ⚠ 导航摘要异常: ${e instanceof Error ? e.message : String(e)}`);
1315
1324
  }
1316
1325
  if (hasHardFail) {
1317
- userError("❌ validate 失败: 配置优先级存在 hard_fail");
1326
+ const sources = hardFailSources.size > 0 ? Array.from(hardFailSources).join("、") : "校验项";
1327
+ userError(`❌ validate 失败: ${sources} 存在 hard_fail`);
1318
1328
  process.exit(1);
1319
1329
  }
1320
1330
  }