soloforge 1.3.10 → 1.4.0
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 +10 -0
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/adapters/claude_code/hooks.js +9 -0
- 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 +44 -3
- 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 +10 -0
- package/dist/adapters/codex/codex_config.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +154 -0
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/control_plane_contract.d.ts +59 -0
- package/dist/engine/control_plane_contract.d.ts.map +1 -0
- package/dist/engine/control_plane_contract.js +246 -0
- package/dist/engine/control_plane_contract.js.map +1 -0
- package/dist/engine/historical_issue_mechanization_matrix.js +7 -7
- package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +45 -1
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +1 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +95 -4
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +17 -17
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,6 +16,7 @@ AI 编程助手的项目工作流配置器。SoloForge 帮你把 Claude Code、C
|
|
|
16
16
|
- **设计产物包审计**: 架构、数据库、API、OpenAPI、SQL/migration 和一致性报告按统一合同审计,避免文档之间漂移。
|
|
17
17
|
- **工程实现契约**: 编码阶段会约束 OOD/SOLID、Controller/Handler/Router 入参出参、参数校验、事务、幂等、权限、日志和错误处理等实现细节。
|
|
18
18
|
- **注释与日志治理**: 后端写操作、前端关键交互、状态变更、支付/权限/安全路径、异常处理和迁移脚本需要可定位日志、埋点/错误上报或必要注释;敏感信息不得进入日志。
|
|
19
|
+
- **MCP 控制面可信**: `soloforge doctor` 会检查 MCP 配置、适配器 hook、任务状态和恢复路径;AI 绕过 MCP 直接篡改 `.soloforge/state` 会被 hook 拦截,非 MCP 来源的代码变更不能冒充完整可信交付。
|
|
19
20
|
- **长期机制化门禁**: SoloForge 自身发布前会检查机制消费链路、知识治理、配置落盘边界、日志治理和诊断码集中注册,防止只靠文档或测试自证。
|
|
20
21
|
|
|
21
22
|
## 最短成功路径
|
|
@@ -90,6 +91,7 @@ soloforge config resolve # 查看配置解析结果和来源
|
|
|
90
91
|
soloforge config explain # 解释某项配置为什么是当前值
|
|
91
92
|
soloforge config repair # 自动修复配置机械类型错误并重签 evidence
|
|
92
93
|
soloforge audit-project-knowledge # 审计项目自定义知识规则是否可被稳定消费
|
|
94
|
+
soloforge doctor # 诊断 MCP 控制面、适配器 hook、状态可信和恢复路径
|
|
93
95
|
soloforge version # 查看版本
|
|
94
96
|
```
|
|
95
97
|
|
|
@@ -261,6 +263,14 @@ soloforge init
|
|
|
261
263
|
- Codex App: `.codex/config.toml`、`.codex/hooks.json`、`AGENTS.md`
|
|
262
264
|
- Trae IDE: `.trae/mcp.json`、`.trae/rules/project_rules.md`
|
|
263
265
|
|
|
266
|
+
也可以先运行:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
soloforge doctor
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
如果 doctor 报告 MCP 配置缺失、hook 漂移、旧任务指针或恢复路径问题,先按输出的恢复命令处理。SoloForge 不建议手动删除 `.soloforge/state`;需要恢复陈旧任务时应使用受控命令或 MCP 工具。
|
|
273
|
+
|
|
264
274
|
### 想重新生成配置
|
|
265
275
|
|
|
266
276
|
```bash
|
|
@@ -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;AAMlD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,
|
|
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,CA+C5C"}
|
|
@@ -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,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
|
+
{"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;gBACD;oBACE,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC;yBACnC;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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"}
|
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import fss from "node:fs";
|
|
5
5
|
import crypto from "node:crypto";
|
|
6
6
|
import { normalizePathCandidate } from "../../engine/input_material_extractor.js";
|
|
7
|
+
import { archiveStaleCurrentPointer, detectStaleCurrentTask } from "../../engine/stale_current_task_detector.js";
|
|
7
8
|
import { verifyArtifact } from "../../engine/artifact_contract_registry.js";
|
|
8
9
|
import { verifyRouteDecisionContract } from "../../engine/route_decision_contract_verifier.js";
|
|
9
10
|
import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, hasWriteSideEffect, } from "../../engine/tool_invocation_contract_registry.js";
|
|
@@ -123,7 +124,9 @@ const LearnSchema = {
|
|
|
123
124
|
};
|
|
124
125
|
const StatusSchema = {
|
|
125
126
|
task_id: z.string().optional().describe("任务 ID(不传则查当前任务)"),
|
|
126
|
-
action: z.enum(["current", "recent", "resume", "cancel"]).optional().describe("操作类型"),
|
|
127
|
+
action: z.enum(["current", "recent", "resume", "cancel", "archive_stale"]).optional().describe("操作类型"),
|
|
128
|
+
confirm: z.boolean().optional().describe("确认执行会写入状态的操作,例如 cancel/archive_stale/job_cancel"),
|
|
129
|
+
authorized: z.boolean().optional().describe("confirm 的兼容别名"),
|
|
127
130
|
job_id: z.string().optional().describe("Job ID(用于 job_status / job_resume / job_cancel)"),
|
|
128
131
|
job_action: z.enum(["job_status", "job_resume", "job_cancel"]).optional().describe("Job 操作: 查询状态、从 checkpoint 恢复、取消 job(advisory)"),
|
|
129
132
|
};
|
|
@@ -834,14 +837,14 @@ export async function registerTools(server, deps) {
|
|
|
834
837
|
// ── 统一网关 : 唯一工具调用边界 ──
|
|
835
838
|
/** 计算 sf_status cancel 的动态 category */
|
|
836
839
|
function computeEffectiveCategory(toolName, args, contract) {
|
|
837
|
-
if (toolName === "sf_status" && (args.action === "cancel" || args.job_action === "job_cancel")) {
|
|
840
|
+
if (toolName === "sf_status" && (args.action === "cancel" || args.action === "archive_stale" || args.job_action === "job_cancel")) {
|
|
838
841
|
return "normal_controlled";
|
|
839
842
|
}
|
|
840
843
|
return contract.category;
|
|
841
844
|
}
|
|
842
845
|
/** 计算 sf_status cancel 的动态 side_effects */
|
|
843
846
|
function computeEffectiveSideEffects(toolName, args, contract) {
|
|
844
|
-
if (toolName === "sf_status" && (args.action === "cancel" || args.job_action === "job_cancel")) {
|
|
847
|
+
if (toolName === "sf_status" && (args.action === "cancel" || args.action === "archive_stale" || args.job_action === "job_cancel")) {
|
|
845
848
|
return ["task_context_write"];
|
|
846
849
|
}
|
|
847
850
|
return contract.side_effects;
|
|
@@ -867,6 +870,10 @@ export async function registerTools(server, deps) {
|
|
|
867
870
|
if (args.confirm === true || args.authorized === true || args.authorization_token) {
|
|
868
871
|
return { required: true, granted: true, reason: "explicit confirmation" };
|
|
869
872
|
}
|
|
873
|
+
// 1b. sf_status 的写入型动作必须显式确认,即便普通查询本身允许自动维护状态。
|
|
874
|
+
if (toolName === "sf_status" && (args.action === "cancel" || args.action === "archive_stale" || args.job_action === "job_cancel")) {
|
|
875
|
+
return { required: true, granted: false, reason: "dynamic write upgrade requires explicit confirmation" };
|
|
876
|
+
}
|
|
870
877
|
// 2. 动态写入升级: cancel/job_cancel 从 read_only 变为 write → 必须确认
|
|
871
878
|
if (effectiveCategory && effectiveCategory !== contract.category && effectiveCategory !== "read_only_bypass") {
|
|
872
879
|
return { required: true, granted: false, reason: "dynamic write upgrade requires explicit confirmation" };
|
|
@@ -878,6 +885,9 @@ export async function registerTools(server, deps) {
|
|
|
878
885
|
}
|
|
879
886
|
// 4. 独立严格工具(无 workflow 要求,无 task context)→ 由 handler 自行检查
|
|
880
887
|
if (contract.category === "strict_controlled" && !ctx && !contract.requires_workflow) {
|
|
888
|
+
if (contract.requires_authorization) {
|
|
889
|
+
return { required: true, granted: false, reason: "standalone strict tool requires explicit confirmation" };
|
|
890
|
+
}
|
|
881
891
|
return { required: false, granted: true, reason: "standalone strict tool" };
|
|
882
892
|
}
|
|
883
893
|
// 5. strict_controlled 的 workflow 合同门控
|
|
@@ -2808,6 +2818,33 @@ export async function registerTools(server, deps) {
|
|
|
2808
2818
|
result: { task_id: args.task_id, cancelled },
|
|
2809
2819
|
};
|
|
2810
2820
|
}
|
|
2821
|
+
case "archive_stale": {
|
|
2822
|
+
const stale = await detectStaleCurrentTask(taskContext.getStateDir());
|
|
2823
|
+
const taskId = args.task_id ?? stale.task_id;
|
|
2824
|
+
if (!taskId) {
|
|
2825
|
+
return {
|
|
2826
|
+
result: { error: "归档陈旧任务指针需要 task_id,且当前未检测到陈旧任务" },
|
|
2827
|
+
};
|
|
2828
|
+
}
|
|
2829
|
+
if (!stale.is_stale || stale.task_id !== taskId) {
|
|
2830
|
+
return {
|
|
2831
|
+
result: {
|
|
2832
|
+
error: "当前任务指针未被判定为陈旧,不执行归档",
|
|
2833
|
+
task_id: taskId,
|
|
2834
|
+
stale_task: stale.is_stale ? stale : null,
|
|
2835
|
+
},
|
|
2836
|
+
};
|
|
2837
|
+
}
|
|
2838
|
+
const archived = await archiveStaleCurrentPointer(taskContext.getStateDir(), taskId);
|
|
2839
|
+
return {
|
|
2840
|
+
result: {
|
|
2841
|
+
task_id: taskId,
|
|
2842
|
+
archived,
|
|
2843
|
+
archived_pointer_only: true,
|
|
2844
|
+
task_file_preserved: true,
|
|
2845
|
+
},
|
|
2846
|
+
};
|
|
2847
|
+
}
|
|
2811
2848
|
default:
|
|
2812
2849
|
return {
|
|
2813
2850
|
result: { error: `未知操作: ${action}` },
|
|
@@ -3578,6 +3615,8 @@ export async function registerTools(server, deps) {
|
|
|
3578
3615
|
decision_rules: z.string().optional().describe("决策规则(每行一条)"),
|
|
3579
3616
|
save_to_drafts: z.boolean().optional().describe("是否保存为草稿(默认 true,需人工 review 后移入正式目录)"),
|
|
3580
3617
|
auto_enrich: z.boolean().optional().describe("是否返回行业最佳实践探索指引(默认 true,宿主 AI 将自动执行探索并填充内容)"),
|
|
3618
|
+
confirm: z.boolean().optional().describe("显式确认写入知识库,必须为 true"),
|
|
3619
|
+
authorized: z.boolean().optional().describe("confirm 的兼容别名"),
|
|
3581
3620
|
};
|
|
3582
3621
|
registerSafeTool("sf_knowledge_add", "新增知识条目。默认保存为草稿到 .soloforge/knowledge/drafts/,人工确认后移入正式目录", KnowledgeAddSchema, async (args) => {
|
|
3583
3622
|
const result = await (await lazyKnowledge()).addKnowledge({
|
|
@@ -3600,6 +3639,8 @@ export async function registerTools(server, deps) {
|
|
|
3600
3639
|
add_decision_rules: z.array(z.string()).optional().describe("追加的决策规则"),
|
|
3601
3640
|
add_acceptance_criteria: z.array(z.string()).optional().describe("追加的验收项"),
|
|
3602
3641
|
status: z.enum(["active", "deprecated"]).optional().describe("更新条目状态"),
|
|
3642
|
+
confirm: z.boolean().optional().describe("显式确认写入知识库,必须为 true"),
|
|
3643
|
+
authorized: z.boolean().optional().describe("confirm 的兼容别名"),
|
|
3603
3644
|
};
|
|
3604
3645
|
registerSafeTool("sf_knowledge_update", "更新已有知识条目:追加规则、更新触发词、标记废弃。自动创建备份", KnowledgeUpdateSchema, async (args) => {
|
|
3605
3646
|
const result = await (await lazyKnowledge()).updateKnowledge({
|