soloforge 1.1.49 → 1.1.50
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/dist/verify/oda/probes/index.d.ts.map +1 -1
- package/dist/verify/oda/probes/index.js +2 -0
- package/dist/verify/oda/probes/index.js.map +1 -1
- package/dist/verify/oda/probes/slice_progress_probe.d.ts +4 -0
- package/dist/verify/oda/probes/slice_progress_probe.d.ts.map +1 -0
- package/dist/verify/oda/probes/slice_progress_probe.js +144 -0
- package/dist/verify/oda/probes/slice_progress_probe.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/verify/oda/probes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/verify/oda/probes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,mCAAmC;AACnC,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC"}
|
|
@@ -7,6 +7,7 @@ import { gateCheckProbeDef, gateCheckProbeFn } from "./gate_check_probe.js";
|
|
|
7
7
|
import { buildProbeDef, buildProbeFn } from "./build_probe.js";
|
|
8
8
|
import { e2eReadinessProbeDef, e2eReadinessProbeFn } from "./e2e_readiness_probe.js";
|
|
9
9
|
import { sliceCompletionProbeDef, sliceCompletionProbeFn } from "./slice_completion_probe.js";
|
|
10
|
+
import { sliceProgressProbeDef, sliceProgressProbeFn } from "./slice_progress_probe.js";
|
|
10
11
|
/** 注册所有内置探针 — 在 SoloForge 启动时调用 */
|
|
11
12
|
export function registerAllProbes() {
|
|
12
13
|
probeRegistry.register(lazyPatternProbeDef, lazyPatternProbeFn);
|
|
@@ -14,5 +15,6 @@ export function registerAllProbes() {
|
|
|
14
15
|
probeRegistry.register(buildProbeDef, buildProbeFn);
|
|
15
16
|
probeRegistry.register(e2eReadinessProbeDef, e2eReadinessProbeFn);
|
|
16
17
|
probeRegistry.register(sliceCompletionProbeDef, sliceCompletionProbeFn);
|
|
18
|
+
probeRegistry.register(sliceProgressProbeDef, sliceProgressProbeFn);
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/verify/oda/probes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/verify/oda/probes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAExF,mCAAmC;AACnC,MAAM,UAAU,iBAAiB;IAC/B,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;IAChE,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC5D,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACpD,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IAClE,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IACxE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice_progress_probe.d.ts","sourceRoot":"","sources":["../../../../src/verify/oda/probes/slice_progress_probe.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAA2C,MAAM,aAAa,CAAC;AAIrG,eAAO,MAAM,qBAAqB,EAAE,eAKnC,CAAC;AAuDF,eAAO,MAAM,oBAAoB,EAAE,OA2DlC,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 切片进度校准探针 — 从 git commit(代码变更客观事实)派生切片状态,治"状态≠实际"黑洞。
|
|
3
|
+
*
|
|
4
|
+
* 第一性原理:切片进度真相 = git commit(客观事实),不是 slice_plan 手写描述(模糊/交叉/过时)。
|
|
5
|
+
* commit message 标 SLC-NN(用户约定,如 "SLC-06 员工端骨架")= 切片↔代码强关联,客观准确。
|
|
6
|
+
*
|
|
7
|
+
* 派生规则:
|
|
8
|
+
* - committed:commit message 含 SLC-NN → 该切片 done(代码已提交,客观事实)
|
|
9
|
+
* - coding:有 git staged 文件(add 未 commit)→ 切片代码写了但没提交 → coding
|
|
10
|
+
* (具体切片=committed 之后 slice_plan 顺序的第一个未完成切片)
|
|
11
|
+
* - todo:无 commit 无 staged → 待办
|
|
12
|
+
*
|
|
13
|
+
* 上一版用 slice_plan "变更文件"关键词匹配——表面(交叉 admission/payment 多切片共享)。
|
|
14
|
+
* 本版弃用关键词,改用 commit message(真相源)+ slice_plan 顺序(定位 coding 切片)。
|
|
15
|
+
*/
|
|
16
|
+
import { execa } from "execa";
|
|
17
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { passResult } from "../types.js";
|
|
20
|
+
import { DESIGN_LIFECYCLE_SLICE_PLAN_PATH } from "../../../domain/contracts/design_lifecycle_contract.js";
|
|
21
|
+
export const sliceProgressProbeDef = {
|
|
22
|
+
id: "slice_progress",
|
|
23
|
+
name: "切片进度校准(git commit 真相源 vs task 声明,治状态黑洞)",
|
|
24
|
+
applicable_langs: ["*"],
|
|
25
|
+
severity: "warning",
|
|
26
|
+
};
|
|
27
|
+
/** 从 git log commit message 提取已 committed 的 SLC-NN 集合 */
|
|
28
|
+
async function getCommittedSlices(projectRoot) {
|
|
29
|
+
const committed = new Set();
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await execa("git", ["log", "--pretty=format:%s"], { cwd: projectRoot, timeout: 10_000 });
|
|
32
|
+
for (const line of stdout.split("\n")) {
|
|
33
|
+
// 提取 SLC-NN(commit message 含 "SLC-06" / "SLC-01~04" / "SLC-07/08")
|
|
34
|
+
const matches = line.matchAll(/SLC-(\d+)/gi);
|
|
35
|
+
for (const m of matches)
|
|
36
|
+
committed.add(`SLC-${m[1]}`);
|
|
37
|
+
// 处理范围 "SLC-01~04" / "SLC-07/08"
|
|
38
|
+
const rangeMatch = line.match(/SLC-(\d+)\s*[~\-\/]\s*(\d+)/);
|
|
39
|
+
if (rangeMatch) {
|
|
40
|
+
const start = parseInt(rangeMatch[1], 10);
|
|
41
|
+
const end = parseInt(rangeMatch[2], 10);
|
|
42
|
+
for (let i = start; i <= end; i++)
|
|
43
|
+
committed.add(`SLC-${String(i).padStart(2, "0")}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// 非 git / git 失败
|
|
49
|
+
}
|
|
50
|
+
return committed;
|
|
51
|
+
}
|
|
52
|
+
/** 是否有 staged 文件(add 未 commit) */
|
|
53
|
+
async function hasStagedFiles(projectRoot) {
|
|
54
|
+
try {
|
|
55
|
+
const { stdout } = await execa("git", ["status", "--short"], { cwd: projectRoot, timeout: 10_000 });
|
|
56
|
+
// git status --short 格式 "XY file":X=staged 列,Y=working tree 列。
|
|
57
|
+
// ` A`(space+A)= working tree 新增(git add -N intent-to-add / 未 staged add)。
|
|
58
|
+
// 任一列 A/M 都表示有代码变更(写了未 commit)—— 原 /^[AM]/ 只看 X 列漏了 ` A`。
|
|
59
|
+
return stdout.split("\n").some((l) => l.length >= 2 && (l[0] === "A" || l[0] === "M" || l[1] === "A" || l[1] === "M"));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** 从 slice_plan 提取所有切片 id(按顺序) */
|
|
66
|
+
function getSliceOrder(projectRoot) {
|
|
67
|
+
const planPath = join(projectRoot, DESIGN_LIFECYCLE_SLICE_PLAN_PATH);
|
|
68
|
+
if (!existsSync(planPath))
|
|
69
|
+
return [];
|
|
70
|
+
try {
|
|
71
|
+
const content = readFileSync(planPath, "utf-8");
|
|
72
|
+
const ids = [];
|
|
73
|
+
for (const line of content.split("\n")) {
|
|
74
|
+
const m = line.match(/^###\s+(SLC-\d+)\s/);
|
|
75
|
+
if (m)
|
|
76
|
+
ids.push(m[1]);
|
|
77
|
+
}
|
|
78
|
+
return ids;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export const sliceProgressProbeFn = async (ctx) => {
|
|
85
|
+
const { projectRoot } = ctx;
|
|
86
|
+
const sliceOrder = getSliceOrder(projectRoot);
|
|
87
|
+
if (sliceOrder.length === 0) {
|
|
88
|
+
return passResult(sliceProgressProbeDef.id, sliceProgressProbeDef.severity, "无 slice_plan(或无切片定义),跳过进度校准");
|
|
89
|
+
}
|
|
90
|
+
const committed = await getCommittedSlices(projectRoot);
|
|
91
|
+
const hasStaged = await hasStagedFiles(projectRoot);
|
|
92
|
+
// 派生每切片状态
|
|
93
|
+
// committed → done;首个未 committed 且 hasStaged → coding;其余 todo
|
|
94
|
+
let codingAssigned = false;
|
|
95
|
+
const statusMap = new Map();
|
|
96
|
+
for (const sid of sliceOrder) {
|
|
97
|
+
if (committed.has(sid)) {
|
|
98
|
+
statusMap.set(sid, "done");
|
|
99
|
+
}
|
|
100
|
+
else if (hasStaged && !codingAssigned) {
|
|
101
|
+
statusMap.set(sid, "coding");
|
|
102
|
+
codingAssigned = true;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
statusMap.set(sid, "todo");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// current_slice 建议:首个 coding,无则首个 todo
|
|
109
|
+
let suggested = null;
|
|
110
|
+
for (const sid of sliceOrder) {
|
|
111
|
+
const s = statusMap.get(sid);
|
|
112
|
+
if (s === "coding" || s === "todo") {
|
|
113
|
+
suggested = sid;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 证据 + finding
|
|
118
|
+
const evidenceParts = [];
|
|
119
|
+
const doneList = [];
|
|
120
|
+
const codingList = [];
|
|
121
|
+
for (const sid of sliceOrder) {
|
|
122
|
+
const s = statusMap.get(sid);
|
|
123
|
+
const icon = s === "done" ? "✅" : s === "coding" ? "🔧" : "⬜";
|
|
124
|
+
evidenceParts.push(`${icon} ${sid}(${s})`);
|
|
125
|
+
if (s === "done")
|
|
126
|
+
doneList.push(sid);
|
|
127
|
+
else if (s === "coding")
|
|
128
|
+
codingList.push(sid);
|
|
129
|
+
}
|
|
130
|
+
const findings = [];
|
|
131
|
+
if (suggested) {
|
|
132
|
+
findings.push({
|
|
133
|
+
message: `代码实际进度(git commit 真相源):应推进 ${suggested}。committed(done)= ${doneList.join(",") || "无"};coding(staged 未 commit)= ${codingList.join(",") || "无"}。请与 task 声明的 current_slice 核对——不一致即状态黑洞`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
probe_id: sliceProgressProbeDef.id,
|
|
138
|
+
passed: true,
|
|
139
|
+
severity: sliceProgressProbeDef.severity,
|
|
140
|
+
findings,
|
|
141
|
+
evidence: `切片进度校准(git commit 真相源): ${evidenceParts.join(" ")}。committed done: ${doneList.join(",") || "无"}。建议 current_slice: ${suggested ?? "全部 done"}`,
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=slice_progress_probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice_progress_probe.js","sourceRoot":"","sources":["../../../../src/verify/oda/probes/slice_progress_probe.ts"],"names":[],"mappings":"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"}
|