@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guanlin4924/devflow-pi",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "type": "module",
5
5
  "description": "Devflow 专项研发 Pi,基于固定版本 OMP Runtime 组装研发状态机、代码智能、设计、实现与质量门禁。",
6
6
  "license": "UNLICENSED",
@@ -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<string | null> {
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 confirmed = await ctx.ui.confirm("确认项目初始化范围", `${summary}\n\n确认后只进入只读规划,不会创建工作流或写入项目文件。`);
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: string | undefined;
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 summary = await collectProjectInitialization(ctx);
1074
- if (!summary) return { handled: true };
1075
- pendingProjectInitialization = summary;
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 summary = await collectProjectInitialization(ctx);
2030
- if (!summary) return;
2031
- pendingProjectInitialization = summary;
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
  );