soloforge 1.3.7 → 1.3.9
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 +13 -0
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/adapters/claude_code/hooks.js +4 -3
- package/dist/adapters/claude_code/hooks.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +13 -10
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts.map +1 -1
- package/dist/adapters/codex/codex_config.js +3 -2
- package/dist/adapters/codex/codex_config.js.map +1 -1
- package/dist/adapters/shared/workflow_template.js +1 -1
- package/dist/bin/config_commands.d.ts +4 -0
- package/dist/bin/config_commands.d.ts.map +1 -1
- package/dist/bin/config_commands.js +59 -0
- package/dist/bin/config_commands.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +13 -2
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/config_auto_repair.d.ts +29 -0
- package/dist/engine/config_auto_repair.d.ts.map +1 -0
- package/dist/engine/config_auto_repair.js +254 -0
- package/dist/engine/config_auto_repair.js.map +1 -0
- package/dist/engine/decision_workshop.js +1 -1
- package/dist/engine/decision_workshop.js.map +1 -1
- package/dist/engine/input_material_extractor.d.ts +1 -0
- package/dist/engine/input_material_extractor.d.ts.map +1 -1
- package/dist/engine/input_material_extractor.js +3 -3
- package/dist/engine/input_material_extractor.js.map +1 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +2 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/next_action_planner.d.ts.map +1 -1
- package/dist/engine/next_action_planner.js +34 -5
- package/dist/engine/next_action_planner.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +82 -0
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +8 -0
- package/dist/knowledge/index_manager.js.map +1 -1
- package/package.json +1 -1
- package/templates/knowledge/procedures//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +1 -1
- package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246/350/247/204/345/210/231.md +3 -2
package/README.md
CHANGED
|
@@ -88,6 +88,7 @@ soloforge next # 查看当前阶段、阻断项和下一步可执
|
|
|
88
88
|
soloforge stage # 查看项目阶段与当前任务阶段
|
|
89
89
|
soloforge config resolve # 查看配置解析结果和来源
|
|
90
90
|
soloforge config explain # 解释某项配置为什么是当前值
|
|
91
|
+
soloforge config repair # 自动修复配置机械类型错误并重签 evidence
|
|
91
92
|
soloforge audit-project-knowledge # 审计项目自定义知识规则是否可被稳定消费
|
|
92
93
|
soloforge version # 查看版本
|
|
93
94
|
```
|
|
@@ -268,6 +269,18 @@ soloforge init
|
|
|
268
269
|
|
|
269
270
|
该命令会刷新适配器配置,不会覆盖已有 `.soloforge/config.yaml` 和知识文件。
|
|
270
271
|
|
|
272
|
+
如果 `status` 提示 `version` 数字/字符串、`scope` 字符串/数组或 `config.evidence.json` 过期,这属于机械配置问题,不需要逐字段人工确认:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
soloforge config repair --dry-run
|
|
276
|
+
soloforge config repair
|
|
277
|
+
soloforge validate
|
|
278
|
+
soloforge status
|
|
279
|
+
soloforge next
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
`config repair` 会先备份旧配置,再修复可安全归一化的 YAML 类型并重签 evidence。业务口径变更仍由 `config confirm` 或人工决策处理。
|
|
283
|
+
|
|
271
284
|
### 想清理项目中的 SoloForge 文件
|
|
272
285
|
|
|
273
286
|
全局卸载只会移除命令:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMlD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAsC5C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { generateClaudeMd } from "./claude_md.js";
|
|
2
2
|
import { debug } from "../../engine/logger.js";
|
|
3
|
+
const hookCommand = (subcommand) => `env PATH="$PATH:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin" soloforge ${subcommand}`;
|
|
3
4
|
/**
|
|
4
5
|
* 生成 Claude Code hooks 配置对象。
|
|
5
6
|
* @returns hooks 配置对象,包含 PreToolUse、PostToolUse 和 UserPromptSubmit 钩子
|
|
@@ -14,7 +15,7 @@ export function generateHooksConfig() {
|
|
|
14
15
|
hooks: [
|
|
15
16
|
{
|
|
16
17
|
type: "command",
|
|
17
|
-
command: "
|
|
18
|
+
command: hookCommand("check-write"),
|
|
18
19
|
},
|
|
19
20
|
],
|
|
20
21
|
},
|
|
@@ -25,7 +26,7 @@ export function generateHooksConfig() {
|
|
|
25
26
|
hooks: [
|
|
26
27
|
{
|
|
27
28
|
type: "command",
|
|
28
|
-
command: "
|
|
29
|
+
command: hookCommand("post-bash"),
|
|
29
30
|
},
|
|
30
31
|
],
|
|
31
32
|
},
|
|
@@ -35,7 +36,7 @@ export function generateHooksConfig() {
|
|
|
35
36
|
hooks: [
|
|
36
37
|
{
|
|
37
38
|
type: "command",
|
|
38
|
-
command: "
|
|
39
|
+
command: hookCommand("pre-prompt"),
|
|
39
40
|
},
|
|
40
41
|
],
|
|
41
42
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChC,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,MAAM,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE,CACzC,6EAA6E,UAAU,EAAE,CAAC;AAE5F;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChC,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC;yBACpC;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX;oBACE,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC;yBAClC;qBACF;iBACF;aACF;YACH,kBAAkB,EAAE;gBAClB;oBACE,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC;yBACnC;qBACF;iBACF;aACF;SACA;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { z } from "zod";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fss from "node:fs";
|
|
5
5
|
import crypto from "node:crypto";
|
|
6
|
+
import { normalizePathCandidate } from "../../engine/input_material_extractor.js";
|
|
6
7
|
import { verifyArtifact } from "../../engine/artifact_contract_registry.js";
|
|
7
8
|
import { verifyRouteDecisionContract } from "../../engine/route_decision_contract_verifier.js";
|
|
8
9
|
import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, hasWriteSideEffect, } from "../../engine/tool_invocation_contract_registry.js";
|
|
@@ -83,6 +84,13 @@ const lazyNavigation = createLazy(() => import("../../engine/next_action_planner
|
|
|
83
84
|
const lazyOodSolid = createLazy(() => import("../../engine/ood_solid_contract.js"));
|
|
84
85
|
const lazyBackendImplementation = createLazy(() => import("../../engine/backend_implementation_contract.js"));
|
|
85
86
|
const lazyCodeObservability = createLazy(() => import("../../engine/code_maintainability_observability_contract.js"));
|
|
87
|
+
const ARCHITECTURE_CONTEXT_PATTERN = /架构|architecture|系统设计|技术方案|现有系统|差距分析|gap.?analysis/i;
|
|
88
|
+
function stripPathLikeReferences(text) {
|
|
89
|
+
return text.replace(/(^|[\s"'((])(?:~\/|\.{1,2}\/|\/|[A-Za-z0-9_.-]+\/)[^\s"',。;,;::))]+/g, "$1 ");
|
|
90
|
+
}
|
|
91
|
+
function hasArchitectureIntentSignal(intent) {
|
|
92
|
+
return ARCHITECTURE_CONTEXT_PATTERN.test(stripPathLikeReferences(intent ?? ""));
|
|
93
|
+
}
|
|
86
94
|
// ── Zod Schema 定义 ──
|
|
87
95
|
const ClassifySchema = {
|
|
88
96
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -1472,9 +1480,9 @@ export async function registerTools(server, deps) {
|
|
|
1472
1480
|
const referencedMaterialPaths = new Set((expansion.input_materials ?? [])
|
|
1473
1481
|
.map((material) => material.path_or_ref)
|
|
1474
1482
|
.filter((materialPath) => typeof materialPath === "string" && materialPath.length > 0)
|
|
1475
|
-
.map((materialPath) => path.resolve(projectRoot, materialPath)));
|
|
1483
|
+
.map((materialPath) => path.resolve(projectRoot, normalizePathCandidate(materialPath))));
|
|
1476
1484
|
const confirmedProjectSourcePaths = (args.input_material_confirmations ?? [])
|
|
1477
|
-
.map((materialPath) => path.resolve(projectRoot, materialPath))
|
|
1485
|
+
.map((materialPath) => path.resolve(projectRoot, normalizePathCandidate(materialPath)))
|
|
1478
1486
|
.filter((absolutePath) => absolutePath === projectRoot || absolutePath.startsWith(`${projectRoot}${path.sep}`))
|
|
1479
1487
|
.filter((absolutePath) => referencedMaterialPaths.has(absolutePath))
|
|
1480
1488
|
.filter((absolutePath) => {
|
|
@@ -1510,7 +1518,7 @@ export async function registerTools(server, deps) {
|
|
|
1510
1518
|
const isArchitectureContext = evWorkflowIntent === "architecture_design"
|
|
1511
1519
|
|| evWorkflowIntent === "existing_system_gap_analysis"
|
|
1512
1520
|
|| evRoute === "artifact_generation"
|
|
1513
|
-
||
|
|
1521
|
+
|| hasArchitectureIntentSignal(ctx.intent);
|
|
1514
1522
|
if (isArchitectureContext && (evRisk === "high" || evRisk === "critical")) {
|
|
1515
1523
|
const { createEvidenceGroundingSystem } = await import("../../engine/evidence_grounding_contract.js");
|
|
1516
1524
|
const evg = createEvidenceGroundingSystem();
|
|
@@ -1916,11 +1924,10 @@ export async function registerTools(server, deps) {
|
|
|
1916
1924
|
];
|
|
1917
1925
|
// 只在架构设计/现有系统分析场景生成 architecture claim
|
|
1918
1926
|
const _evWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
|
|
1919
|
-
const _evIntentText = (ctx.intent ?? "").toLowerCase();
|
|
1920
1927
|
const _isArchitectureContext = _evWorkflowIntent === "architecture_design"
|
|
1921
1928
|
|| _evWorkflowIntent === "existing_system_gap_analysis"
|
|
1922
1929
|
|| _evRoute === "artifact_generation"
|
|
1923
|
-
||
|
|
1930
|
+
|| hasArchitectureIntentSignal(ctx.intent);
|
|
1924
1931
|
if (_isArchitectureContext) {
|
|
1925
1932
|
_evClaims.push({
|
|
1926
1933
|
id: "claim-expand-1",
|
|
@@ -3833,11 +3840,7 @@ export async function registerTools(server, deps) {
|
|
|
3833
3840
|
});
|
|
3834
3841
|
// ── sf_navigation: 工作流导航 — 问题六十五 ──
|
|
3835
3842
|
const NavigationSchema = {
|
|
3836
|
-
|
|
3837
|
-
properties: {
|
|
3838
|
-
project_path: { type: "string", description: "项目路径(可选,默认当前目录)" },
|
|
3839
|
-
},
|
|
3840
|
-
required: [],
|
|
3843
|
+
project_path: z.string().optional().describe("项目路径(可选,默认当前目录)"),
|
|
3841
3844
|
};
|
|
3842
3845
|
registerSafeTool("sf_navigation", "查询工作流导航: 当前项目阶段、任务阶段、下一步操作和禁止操作。用于\"下一步\"\"继续\"\"现在能写代码吗\"等模糊推进意图。不得靠模型经验回答,必须调用此工具获取真实导航状态", NavigationSchema, async (args) => {
|
|
3843
3846
|
const projectPath = args.project_path || config._projectPath || process.cwd();
|