@guanlin4924/devflow-pi 0.1.17 → 0.1.18
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
|
@@ -34,6 +34,8 @@ devflow-pi
|
|
|
34
34
|
/usage-stats
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
`/devflow project-init` 会在边界确认时提供两种模式:`plan`(默认,只读规划)和 `apply`(写入初始化)。选择 `apply` 并确认后,只会创建 Devflow 的 `.planning/` 与 `.context/` 初始化产物,不会修改业务源码、依赖或项目配置。
|
|
38
|
+
|
|
37
39
|
用量统计默认只读取当前项目的隔离会话:`/usage-stats`。需要明确查看历史 OMP 会话时,使用 `/usage-stats omp`,或加筛选条件:`/usage-stats omp --from 2026-08-01 --to 2026-08-10`。历史统计保留真实会话路径,不再把不同项目的长会话文件合并成 `main`;统计只使用 assistant message 的原始 usage,不虚构工具调用成本分摊。
|
|
38
40
|
|
|
39
41
|
会话继续使用 `devflow-pi --resume`;也可用 `devflow-pi --resume <session-id>` 打开当前项目的指定 Session。OMP 17.2.7 退出时仍会显示上游硬编码的 `omp --resume` 提示,在专项发行版中应替换为这里的 `devflow-pi --resume`,不会去读取官方 OMP 的 Session 目录。
|
package/package.json
CHANGED
|
@@ -16,6 +16,13 @@ export type SessionControlState = {
|
|
|
16
16
|
label: string;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
+
type ProjectInitializationMode = "plan" | "apply";
|
|
20
|
+
|
|
21
|
+
type ProjectInitializationRequest = {
|
|
22
|
+
summary: string;
|
|
23
|
+
mode: ProjectInitializationMode;
|
|
24
|
+
};
|
|
25
|
+
|
|
19
26
|
type ActiveExecutionContract = {
|
|
20
27
|
contractId: string;
|
|
21
28
|
feature: string;
|
|
@@ -91,6 +98,13 @@ export function planningState(intent: "project-init" | "requirement-draft"): Ses
|
|
|
91
98
|
};
|
|
92
99
|
}
|
|
93
100
|
|
|
101
|
+
function parseProjectInitializationMode(value: string): ProjectInitializationMode | null {
|
|
102
|
+
const normalized = value.trim().toLowerCase();
|
|
103
|
+
if (["", "plan", "readonly", "read-only", "只读", "规划"].includes(normalized)) return "plan";
|
|
104
|
+
if (["apply", "write", "写入", "执行"].includes(normalized)) return "apply";
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
94
108
|
export function executingState(label = "当前工作流步骤执行"): SessionControlState {
|
|
95
109
|
return { intent: "workflow-execute", phase: "executing", label };
|
|
96
110
|
}
|
|
@@ -731,7 +745,7 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
731
745
|
confirm(title: string, message: string): Promise<boolean>;
|
|
732
746
|
notify(message: string, type?: "info" | "warning" | "error"): void;
|
|
733
747
|
};
|
|
734
|
-
}): Promise<
|
|
748
|
+
}): Promise<ProjectInitializationRequest | null> {
|
|
735
749
|
const projectName = await ctx.ui.input("Devflow 项目初始化", "项目名称(留空则使用当前目录)");
|
|
736
750
|
const frontendPath = await ctx.ui.input("前端边界", "前端目录;没有请填写 none");
|
|
737
751
|
if (frontendPath === undefined) return null;
|
|
@@ -739,18 +753,30 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
739
753
|
if (backendPath === undefined) return null;
|
|
740
754
|
const buildIndex = await ctx.ui.input("代码索引", "建立索引?输入 yes 或 no");
|
|
741
755
|
if (buildIndex === undefined) return null;
|
|
756
|
+
const initializationMode = await ctx.ui.input("初始化方式", "输入 plan(只读规划,默认)或 apply(写入初始化)");
|
|
757
|
+
if (initializationMode === undefined) return null;
|
|
758
|
+
const mode = parseProjectInitializationMode(initializationMode);
|
|
759
|
+
if (!mode) {
|
|
760
|
+
ctx.ui.notify("初始化方式只能是 plan(只读规划)或 apply(写入初始化);未写入任何文件。", "error");
|
|
761
|
+
return null;
|
|
762
|
+
}
|
|
763
|
+
const modeSummary = mode === "apply" ? "写入初始化" : "只读规划";
|
|
742
764
|
const summary = [
|
|
743
765
|
`项目名:${projectName?.trim() || "当前目录"}`,
|
|
744
766
|
`前端:${frontendPath.trim() || "未提供"}`,
|
|
745
767
|
`后端:${backendPath.trim() || "未提供"}`,
|
|
746
768
|
`建立代码索引:${buildIndex.trim() || "未提供"}`,
|
|
769
|
+
`初始化方式:${modeSummary}`,
|
|
747
770
|
].join("\n");
|
|
748
|
-
const
|
|
771
|
+
const consequence = mode === "apply"
|
|
772
|
+
? "确认后会创建 Devflow 的 .planning/ 与 .context/ 初始化产物;不会修改业务源码、依赖或项目配置。"
|
|
773
|
+
: "确认后只进入只读规划,不会创建工作流或写入项目文件。";
|
|
774
|
+
const confirmed = await ctx.ui.confirm("确认项目初始化范围", `${summary}\n\n${consequence}`);
|
|
749
775
|
if (!confirmed) {
|
|
750
776
|
ctx.ui.notify("项目初始化已取消;未写入任何文件。", "info");
|
|
751
777
|
return null;
|
|
752
778
|
}
|
|
753
|
-
return summary;
|
|
779
|
+
return { summary, mode };
|
|
754
780
|
}
|
|
755
781
|
|
|
756
782
|
async function runRuby(cwd: string, relativeScript: string, args: string[]) {
|
|
@@ -952,7 +978,7 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
952
978
|
}
|
|
953
979
|
|
|
954
980
|
let activeWorkflowTurn = false;
|
|
955
|
-
let pendingProjectInitialization:
|
|
981
|
+
let pendingProjectInitialization: ProjectInitializationRequest | undefined;
|
|
956
982
|
|
|
957
983
|
async function triggerWorkflow(snapshot: Record<string, unknown>, source: "start" | "approval", requirementDraft?: string) {
|
|
958
984
|
activeWorkflowTurn = true;
|
|
@@ -1013,7 +1039,7 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
1013
1039
|
}
|
|
1014
1040
|
setControlState(ctx, executingState("执行已批准的项目初始化"));
|
|
1015
1041
|
activeWorkflowTurn = true;
|
|
1016
|
-
return { text: projectInitializationDirective(pendingProjectInitialization), handled: false };
|
|
1042
|
+
return { text: projectInitializationDirective(pendingProjectInitialization.summary), handled: false };
|
|
1017
1043
|
}
|
|
1018
1044
|
if (controlAction === "reject") {
|
|
1019
1045
|
ctx.ui.notify("已保留初始化规划,未创建任何项目控制文件。请直接说明需要调整的初始化范围。", "info");
|
|
@@ -1070,9 +1096,14 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
1070
1096
|
return { handled: true };
|
|
1071
1097
|
}
|
|
1072
1098
|
if (intent === "project-init") {
|
|
1073
|
-
const
|
|
1074
|
-
if (!
|
|
1075
|
-
pendingProjectInitialization =
|
|
1099
|
+
const initialization = await collectProjectInitialization(ctx);
|
|
1100
|
+
if (!initialization) return { handled: true };
|
|
1101
|
+
pendingProjectInitialization = initialization;
|
|
1102
|
+
if (initialization.mode === "apply") {
|
|
1103
|
+
setControlState(ctx, executingState("执行已确认的项目初始化"));
|
|
1104
|
+
activeWorkflowTurn = true;
|
|
1105
|
+
return { text: projectInitializationDirective(initialization.summary), handled: false };
|
|
1106
|
+
}
|
|
1076
1107
|
const state = planningState("project-init");
|
|
1077
1108
|
setControlState(ctx, state);
|
|
1078
1109
|
return {
|
|
@@ -1081,7 +1112,7 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
1081
1112
|
"用户已确认项目初始化的输入。你现在是 Planner,只允许只读分析和派发 project-scout / requirements-auditor / contract-auditor。",
|
|
1082
1113
|
"不得创建 .planning 文件、不得调用状态迁移、不得执行实现。",
|
|
1083
1114
|
"先输出:已知事实、待验证点、最少侦察任务和必须由用户决定的问题。没有证据时写 unknown。",
|
|
1084
|
-
summary,
|
|
1115
|
+
initialization.summary,
|
|
1085
1116
|
"</devflow-planner-directive>",
|
|
1086
1117
|
].join("\n"),
|
|
1087
1118
|
};
|
|
@@ -2026,9 +2057,15 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
2026
2057
|
return;
|
|
2027
2058
|
}
|
|
2028
2059
|
if (trimmed === "project-init") {
|
|
2029
|
-
const
|
|
2030
|
-
if (!
|
|
2031
|
-
pendingProjectInitialization =
|
|
2060
|
+
const initialization = await collectProjectInitialization(ctx);
|
|
2061
|
+
if (!initialization) return;
|
|
2062
|
+
pendingProjectInitialization = initialization;
|
|
2063
|
+
if (initialization.mode === "apply") {
|
|
2064
|
+
setControlState(ctx, executingState("执行已确认的项目初始化"));
|
|
2065
|
+
activeWorkflowTurn = true;
|
|
2066
|
+
await pi.sendUserMessage(projectInitializationDirective(initialization.summary));
|
|
2067
|
+
return;
|
|
2068
|
+
}
|
|
2032
2069
|
setControlState(ctx, planningState("project-init"));
|
|
2033
2070
|
await pi.sendUserMessage(
|
|
2034
2071
|
[
|
|
@@ -2036,7 +2073,7 @@ export default function devflowCore(pi: ExtensionAPI) {
|
|
|
2036
2073
|
"用户已确认项目初始化的输入。你现在是 Planner,只允许只读分析和派发 project-scout / requirements-auditor / contract-auditor。",
|
|
2037
2074
|
"不得创建 .planning 文件、不得调用状态迁移、不得执行实现。",
|
|
2038
2075
|
"先输出:已知事实、待验证点、最少侦察任务和必须由用户决定的问题。没有证据时写 unknown。",
|
|
2039
|
-
summary,
|
|
2076
|
+
initialization.summary,
|
|
2040
2077
|
"</devflow-planner-directive>",
|
|
2041
2078
|
].join("\n"),
|
|
2042
2079
|
);
|