openfeel 1.0.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.
Files changed (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +140 -0
  3. package/README.md +17 -0
  4. package/README.zh-CN.md +140 -0
  5. package/bin/openfeel.js +13 -0
  6. package/dist/cli/index.d.ts +11 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +119 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/repl.d.ts +10 -0
  11. package/dist/cli/repl.d.ts.map +1 -0
  12. package/dist/cli/repl.js +74 -0
  13. package/dist/cli/repl.js.map +1 -0
  14. package/dist/commands/archive.d.ts +7 -0
  15. package/dist/commands/archive.d.ts.map +1 -0
  16. package/dist/commands/archive.js +38 -0
  17. package/dist/commands/archive.js.map +1 -0
  18. package/dist/commands/config.d.ts +15 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +208 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/flow.d.ts +24 -0
  23. package/dist/commands/flow.d.ts.map +1 -0
  24. package/dist/commands/flow.js +1024 -0
  25. package/dist/commands/flow.js.map +1 -0
  26. package/dist/commands/init.d.ts +9 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +62 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/instructions.d.ts +7 -0
  31. package/dist/commands/instructions.d.ts.map +1 -0
  32. package/dist/commands/instructions.js +36 -0
  33. package/dist/commands/instructions.js.map +1 -0
  34. package/dist/commands/knowledge.d.ts +7 -0
  35. package/dist/commands/knowledge.d.ts.map +1 -0
  36. package/dist/commands/knowledge.js +174 -0
  37. package/dist/commands/knowledge.js.map +1 -0
  38. package/dist/commands/lint.d.ts +12 -0
  39. package/dist/commands/lint.d.ts.map +1 -0
  40. package/dist/commands/lint.js +192 -0
  41. package/dist/commands/lint.js.map +1 -0
  42. package/dist/commands/plan.d.ts +7 -0
  43. package/dist/commands/plan.d.ts.map +1 -0
  44. package/dist/commands/plan.js +73 -0
  45. package/dist/commands/plan.js.map +1 -0
  46. package/dist/commands/project.d.ts +7 -0
  47. package/dist/commands/project.d.ts.map +1 -0
  48. package/dist/commands/project.js +189 -0
  49. package/dist/commands/project.js.map +1 -0
  50. package/dist/commands/roadmap.d.ts +7 -0
  51. package/dist/commands/roadmap.d.ts.map +1 -0
  52. package/dist/commands/roadmap.js +26 -0
  53. package/dist/commands/roadmap.js.map +1 -0
  54. package/dist/commands/stage.d.ts +17 -0
  55. package/dist/commands/stage.d.ts.map +1 -0
  56. package/dist/commands/stage.js +291 -0
  57. package/dist/commands/stage.js.map +1 -0
  58. package/dist/commands/update.d.ts +8 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +87 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/view.d.ts +7 -0
  63. package/dist/commands/view.d.ts.map +1 -0
  64. package/dist/commands/view.js +77 -0
  65. package/dist/commands/view.js.map +1 -0
  66. package/dist/core/archive/merge.d.ts +20 -0
  67. package/dist/core/archive/merge.d.ts.map +1 -0
  68. package/dist/core/archive/merge.js +118 -0
  69. package/dist/core/archive/merge.js.map +1 -0
  70. package/dist/core/artifact-graph/graph.d.ts +62 -0
  71. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  72. package/dist/core/artifact-graph/graph.js +184 -0
  73. package/dist/core/artifact-graph/graph.js.map +1 -0
  74. package/dist/core/artifact-graph/index.d.ts +10 -0
  75. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  76. package/dist/core/artifact-graph/index.js +8 -0
  77. package/dist/core/artifact-graph/index.js.map +1 -0
  78. package/dist/core/artifact-graph/instruction-loader.d.ts +35 -0
  79. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  80. package/dist/core/artifact-graph/instruction-loader.js +358 -0
  81. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  82. package/dist/core/artifact-graph/resolver.d.ts +10 -0
  83. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  84. package/dist/core/artifact-graph/resolver.js +32 -0
  85. package/dist/core/artifact-graph/resolver.js.map +1 -0
  86. package/dist/core/artifact-graph/state.d.ts +9 -0
  87. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  88. package/dist/core/artifact-graph/state.js +24 -0
  89. package/dist/core/artifact-graph/state.js.map +1 -0
  90. package/dist/core/artifact-graph/types.d.ts +22 -0
  91. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  92. package/dist/core/artifact-graph/types.js +2 -0
  93. package/dist/core/artifact-graph/types.js.map +1 -0
  94. package/dist/core/config.d.ts +256 -0
  95. package/dist/core/config.d.ts.map +1 -0
  96. package/dist/core/config.js +393 -0
  97. package/dist/core/config.js.map +1 -0
  98. package/dist/core/flow-manager.d.ts +492 -0
  99. package/dist/core/flow-manager.d.ts.map +1 -0
  100. package/dist/core/flow-manager.js +2379 -0
  101. package/dist/core/flow-manager.js.map +1 -0
  102. package/dist/core/i18n-data/en.d.ts +26 -0
  103. package/dist/core/i18n-data/en.d.ts.map +1 -0
  104. package/dist/core/i18n-data/en.js +492 -0
  105. package/dist/core/i18n-data/en.js.map +1 -0
  106. package/dist/core/i18n-data/types.d.ts +18 -0
  107. package/dist/core/i18n-data/types.d.ts.map +1 -0
  108. package/dist/core/i18n-data/types.js +8 -0
  109. package/dist/core/i18n-data/types.js.map +1 -0
  110. package/dist/core/i18n-data/zh-CN.d.ts +28 -0
  111. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -0
  112. package/dist/core/i18n-data/zh-CN.js +524 -0
  113. package/dist/core/i18n-data/zh-CN.js.map +1 -0
  114. package/dist/core/i18n.d.ts +40 -0
  115. package/dist/core/i18n.d.ts.map +1 -0
  116. package/dist/core/i18n.js +135 -0
  117. package/dist/core/i18n.js.map +1 -0
  118. package/dist/core/init.d.ts +22 -0
  119. package/dist/core/init.d.ts.map +1 -0
  120. package/dist/core/init.js +292 -0
  121. package/dist/core/init.js.map +1 -0
  122. package/dist/core/metrics.d.ts +60 -0
  123. package/dist/core/metrics.d.ts.map +1 -0
  124. package/dist/core/metrics.js +137 -0
  125. package/dist/core/metrics.js.map +1 -0
  126. package/dist/core/pipeline-schema.d.ts +78 -0
  127. package/dist/core/pipeline-schema.d.ts.map +1 -0
  128. package/dist/core/pipeline-schema.js +57 -0
  129. package/dist/core/pipeline-schema.js.map +1 -0
  130. package/dist/core/plan/roadmap.d.ts +17 -0
  131. package/dist/core/plan/roadmap.d.ts.map +1 -0
  132. package/dist/core/plan/roadmap.js +71 -0
  133. package/dist/core/plan/roadmap.js.map +1 -0
  134. package/dist/core/plan/scheme.d.ts +34 -0
  135. package/dist/core/plan/scheme.d.ts.map +1 -0
  136. package/dist/core/plan/scheme.js +262 -0
  137. package/dist/core/plan/scheme.js.map +1 -0
  138. package/dist/core/plan/stage.d.ts +20 -0
  139. package/dist/core/plan/stage.d.ts.map +1 -0
  140. package/dist/core/plan/stage.js +120 -0
  141. package/dist/core/plan/stage.js.map +1 -0
  142. package/dist/core/public-logger.d.ts +84 -0
  143. package/dist/core/public-logger.d.ts.map +1 -0
  144. package/dist/core/public-logger.js +344 -0
  145. package/dist/core/public-logger.js.map +1 -0
  146. package/dist/core/schema.d.ts +70 -0
  147. package/dist/core/schema.d.ts.map +1 -0
  148. package/dist/core/schema.js +61 -0
  149. package/dist/core/schema.js.map +1 -0
  150. package/dist/core/template-loader.d.ts +22 -0
  151. package/dist/core/template-loader.d.ts.map +1 -0
  152. package/dist/core/template-loader.js +2848 -0
  153. package/dist/core/template-loader.js.map +1 -0
  154. package/dist/core/templates.d.ts +18 -0
  155. package/dist/core/templates.d.ts.map +1 -0
  156. package/dist/core/templates.js +50 -0
  157. package/dist/core/templates.js.map +1 -0
  158. package/dist/core/update.d.ts +40 -0
  159. package/dist/core/update.d.ts.map +1 -0
  160. package/dist/core/update.js +1569 -0
  161. package/dist/core/update.js.map +1 -0
  162. package/dist/core/view/entry.d.ts +37 -0
  163. package/dist/core/view/entry.d.ts.map +1 -0
  164. package/dist/core/view/entry.js +108 -0
  165. package/dist/core/view/entry.js.map +1 -0
  166. package/dist/core/workspace/identity.d.ts +60 -0
  167. package/dist/core/workspace/identity.d.ts.map +1 -0
  168. package/dist/core/workspace/identity.js +169 -0
  169. package/dist/core/workspace/identity.js.map +1 -0
  170. package/dist/core/workspace/knowledge.d.ts +55 -0
  171. package/dist/core/workspace/knowledge.d.ts.map +1 -0
  172. package/dist/core/workspace/knowledge.js +230 -0
  173. package/dist/core/workspace/knowledge.js.map +1 -0
  174. package/dist/core/workspace/structure.d.ts +9 -0
  175. package/dist/core/workspace/structure.d.ts.map +1 -0
  176. package/dist/core/workspace/structure.js +59 -0
  177. package/dist/core/workspace/structure.js.map +1 -0
  178. package/dist/index.d.ts +7 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +7 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/utils/kb-dedup.d.ts +46 -0
  183. package/dist/utils/kb-dedup.d.ts.map +1 -0
  184. package/dist/utils/kb-dedup.js +169 -0
  185. package/dist/utils/kb-dedup.js.map +1 -0
  186. package/dist/utils/path.d.ts +22 -0
  187. package/dist/utils/path.d.ts.map +1 -0
  188. package/dist/utils/path.js +37 -0
  189. package/dist/utils/path.js.map +1 -0
  190. package/package.json +61 -0
  191. package/schemas/spec-driven/schema.yaml +50 -0
  192. package/schemas/spec-driven/templates/design.md +43 -0
  193. package/schemas/spec-driven/templates/plan.md +46 -0
  194. package/schemas/spec-driven/templates/proposal.md +35 -0
  195. package/schemas/spec-driven/templates/tasks.md +39 -0
  196. package/scripts/patch-inquirer.js +70 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Agent 性能指标模块
3
+ * 记录每个 Agent 的执行时间、成功率、重试次数
4
+ * 数据持久化到 .openfeel/metrics.json(与 flow.json 同级)
5
+ */
6
+ /** Agent 性能指标 */
7
+ export interface AgentMetrics {
8
+ agentName: string;
9
+ totalRuns: number;
10
+ successfulRuns: number;
11
+ failedRuns: number;
12
+ totalRetries: number;
13
+ totalDurationMs: number;
14
+ avgDurationMs: number;
15
+ }
16
+ /**
17
+ * MetricsStore 单例
18
+ * 管理所有 Agent 的性能指标,支持持久化读写
19
+ */
20
+ export declare class MetricsStore {
21
+ private static instance;
22
+ private agents;
23
+ private dataDir;
24
+ private constructor();
25
+ /** 获取单例实例(默认 dataDir = CWD/.openfeel) */
26
+ static getInstance(dataDir?: string): MetricsStore;
27
+ /** 重置单例(仅测试用) */
28
+ static resetInstance(): void;
29
+ /**
30
+ * 记录一次 Agent 运行
31
+ * @param agentName Agent 名称
32
+ * @param durationMs 执行耗时(毫秒)
33
+ * @param result 执行结果(成功或失败)
34
+ * @param retries 本次操作的重试次数
35
+ */
36
+ recordRun(agentName: string, durationMs: number, result: 'success' | 'failure', retries?: number): void;
37
+ /**
38
+ * 获取指定 Agent 或全部 Agent 的性能指标
39
+ * @param agentName 可选,指定名称返回单个指标,否则返回全部
40
+ */
41
+ getAgentMetrics(agentName?: string): AgentMetrics | AgentMetrics[] | undefined;
42
+ /**
43
+ * 生成人类可读的性能摘要字符串
44
+ * 包含每个 Agent 的总执行次数、成功率、重试次数、耗时统计
45
+ */
46
+ summary(): string;
47
+ /** metrics.json 文件完整路径 */
48
+ private get metricsPath();
49
+ /**
50
+ * 从 .openfeel/metrics.json 加载已有数据
51
+ * 文件不存在时静默跳过;数据损坏时从空状态开始
52
+ */
53
+ load(): void;
54
+ /**
55
+ * 保存当前所有指标到 .openfeel/metrics.json
56
+ * 确保 .openfeel 目录存在
57
+ */
58
+ save(): void;
59
+ }
60
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAoBD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;IAIP,yCAAyC;IACzC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IASlD,iBAAiB;IACjB,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,GAAE,MAAU,GAClB,IAAI;IAqBP;;;OAGG;IACH,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,EAAE,GAAG,SAAS;IAO9E;;;OAGG;IACH,OAAO,IAAI,MAAM;IA2BjB,0BAA0B;IAC1B,OAAO,KAAK,WAAW,GAEtB;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI;IAoBZ;;;OAGG;IACH,IAAI,IAAI,IAAI;CAcb"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Agent 性能指标模块
3
+ * 记录每个 Agent 的执行时间、成功率、重试次数
4
+ * 数据持久化到 .openfeel/metrics.json(与 flow.json 同级)
5
+ */
6
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
7
+ import { resolve } from 'node:path';
8
+ /** 创建默认的 AgentMetrics 初始值 */
9
+ function createDefaultMetrics(agentName) {
10
+ return {
11
+ agentName,
12
+ totalRuns: 0,
13
+ successfulRuns: 0,
14
+ failedRuns: 0,
15
+ totalRetries: 0,
16
+ totalDurationMs: 0,
17
+ avgDurationMs: 0,
18
+ };
19
+ }
20
+ /**
21
+ * MetricsStore 单例
22
+ * 管理所有 Agent 的性能指标,支持持久化读写
23
+ */
24
+ export class MetricsStore {
25
+ static instance = null;
26
+ agents = new Map();
27
+ dataDir;
28
+ constructor(dataDir) {
29
+ this.dataDir = dataDir;
30
+ }
31
+ /** 获取单例实例(默认 dataDir = CWD/.openfeel) */
32
+ static getInstance(dataDir) {
33
+ if (!MetricsStore.instance) {
34
+ MetricsStore.instance = new MetricsStore(dataDir ?? resolve(process.cwd(), '.openfeel'));
35
+ }
36
+ return MetricsStore.instance;
37
+ }
38
+ /** 重置单例(仅测试用) */
39
+ static resetInstance() {
40
+ MetricsStore.instance = null;
41
+ }
42
+ /**
43
+ * 记录一次 Agent 运行
44
+ * @param agentName Agent 名称
45
+ * @param durationMs 执行耗时(毫秒)
46
+ * @param result 执行结果(成功或失败)
47
+ * @param retries 本次操作的重试次数
48
+ */
49
+ recordRun(agentName, durationMs, result, retries = 0) {
50
+ let metrics = this.agents.get(agentName);
51
+ if (!metrics) {
52
+ metrics = createDefaultMetrics(agentName);
53
+ this.agents.set(agentName, metrics);
54
+ }
55
+ metrics.totalRuns += 1;
56
+ metrics.totalDurationMs += durationMs;
57
+ if (result === 'success') {
58
+ metrics.successfulRuns += 1;
59
+ }
60
+ else {
61
+ metrics.failedRuns += 1;
62
+ }
63
+ metrics.totalRetries += retries;
64
+ // 平均耗时 = 总耗时 / 总执行次数(取整)
65
+ metrics.avgDurationMs = Math.round(metrics.totalDurationMs / metrics.totalRuns);
66
+ }
67
+ /**
68
+ * 获取指定 Agent 或全部 Agent 的性能指标
69
+ * @param agentName 可选,指定名称返回单个指标,否则返回全部
70
+ */
71
+ getAgentMetrics(agentName) {
72
+ if (agentName) {
73
+ return this.agents.get(agentName);
74
+ }
75
+ return Array.from(this.agents.values());
76
+ }
77
+ /**
78
+ * 生成人类可读的性能摘要字符串
79
+ * 包含每个 Agent 的总执行次数、成功率、重试次数、耗时统计
80
+ */
81
+ summary() {
82
+ if (this.agents.size === 0) {
83
+ return '暂无 Agent 性能数据。';
84
+ }
85
+ const lines = ['Agent 性能指标摘要', '═══════════════════'];
86
+ for (const m of this.agents.values()) {
87
+ const successRate = m.totalRuns > 0
88
+ ? `${((m.successfulRuns / m.totalRuns) * 100).toFixed(1)}%`
89
+ : 'N/A';
90
+ lines.push(`\n${m.agentName}`, ` 总执行次数: ${m.totalRuns}`, ` 成功 / 失败: ${m.successfulRuns} / ${m.failedRuns}`, ` 成功率: ${successRate}`, ` 总重试次数: ${m.totalRetries}`, ` 总耗时: ${m.totalDurationMs}ms`, ` 平均耗时: ${m.avgDurationMs}ms`);
91
+ }
92
+ return lines.join('\n');
93
+ }
94
+ /** metrics.json 文件完整路径 */
95
+ get metricsPath() {
96
+ return resolve(this.dataDir, 'metrics.json');
97
+ }
98
+ /**
99
+ * 从 .openfeel/metrics.json 加载已有数据
100
+ * 文件不存在时静默跳过;数据损坏时从空状态开始
101
+ */
102
+ load() {
103
+ const filePath = this.metricsPath;
104
+ if (!existsSync(filePath)) {
105
+ return;
106
+ }
107
+ try {
108
+ const raw = readFileSync(filePath, 'utf-8');
109
+ const data = JSON.parse(raw);
110
+ if (data.agents) {
111
+ for (const [name, metrics] of Object.entries(data.agents)) {
112
+ this.agents.set(name, { ...metrics });
113
+ }
114
+ }
115
+ }
116
+ catch {
117
+ // 文件损坏时静默忽略,从空状态开始
118
+ }
119
+ }
120
+ /**
121
+ * 保存当前所有指标到 .openfeel/metrics.json
122
+ * 确保 .openfeel 目录存在
123
+ */
124
+ save() {
125
+ // 确保目录存在
126
+ if (!existsSync(this.dataDir)) {
127
+ mkdirSync(this.dataDir, { recursive: true });
128
+ }
129
+ const agents = {};
130
+ for (const [name, metrics] of this.agents) {
131
+ agents[name] = { ...metrics };
132
+ }
133
+ const data = { agents };
134
+ writeFileSync(this.metricsPath, JSON.stringify(data, null, 2), 'utf-8');
135
+ }
136
+ }
137
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * 流水线配置 Zod Schema
3
+ * 定义 pipeline.yaml 的数据结构,用于校验和类型推导。
4
+ *
5
+ * 变更摘要 (stage-01: flow.json 鲁棒性加固):
6
+ * - 新增 PIPELINE_PHASES 枚举常量,硬编码 15 个合法流水线阶段
7
+ * - 新增 PipelinePhaseSchema (Zod enum),用于运行时校验 phase 值的合法性
8
+ * - 新增 PipelinePhase 类型,替代此前的动态 string 类型
9
+ * - PipelineConfigSchema 保持 string 泛型以兼容自定义 YAML,phase 值校验由 PipelinePhaseSchema 负责
10
+ */
11
+ import { z } from 'zod';
12
+ /** 合法的流水线阶段枚举常量 */
13
+ export declare const PIPELINE_PHASES: readonly ["plan_pending", "plan_review", "plan_passed", "scheme_pending", "scheme_review", "scheme_passed", "exec_running", "review_pending", "review_failed", "review_passed", "test_pending", "test_failed", "test_passed", "archiving", "done"];
14
+ /** 流水线阶段 Zod 枚举 Schema,用于运行时校验 phase 值 */
15
+ export declare const PipelinePhaseSchema: z.ZodEnum<{
16
+ plan_pending: "plan_pending";
17
+ plan_review: "plan_review";
18
+ plan_passed: "plan_passed";
19
+ scheme_pending: "scheme_pending";
20
+ scheme_review: "scheme_review";
21
+ scheme_passed: "scheme_passed";
22
+ exec_running: "exec_running";
23
+ review_pending: "review_pending";
24
+ review_failed: "review_failed";
25
+ review_passed: "review_passed";
26
+ test_pending: "test_pending";
27
+ test_failed: "test_failed";
28
+ test_passed: "test_passed";
29
+ archiving: "archiving";
30
+ done: "done";
31
+ }>;
32
+ /** 流水线阶段类型(从 Zod enum 推导,替代此前动态 string) */
33
+ export type PipelinePhase = z.infer<typeof PipelinePhaseSchema>;
34
+ /** 流水线全局宏观状态枚举常量 */
35
+ export declare const META_PHASES: readonly ["active", "paused", "done"];
36
+ /** 全局宏观状态 Zod 枚举 Schema,用于运行时校验 */
37
+ export declare const MetaPhaseSchema: z.ZodEnum<{
38
+ done: "done";
39
+ active: "active";
40
+ paused: "paused";
41
+ }>;
42
+ /** 全局宏观状态类型 */
43
+ export type MetaPhase = z.infer<typeof MetaPhaseSchema>;
44
+ /**
45
+ * 组合转换条件分隔符
46
+ * transitions 的 key 可用 '|' 组合多个源 phase,任一源 phase 匹配即可推进到目标(多 Agent 并行场景)。
47
+ * 示例: `'test_passed|review_passed': ['archiving']` → 审查或测试任一通过即可归档。
48
+ */
49
+ export declare const TRANSITION_OR_SEPARATOR = "|";
50
+ /**
51
+ * 将 transitions 的 key 解析为条件 phase 列表
52
+ * 简单 key(如 'review_pending')返回单个条件;组合 key(如 'test_passed|review_passed')按 '|' 分割返回多个条件。
53
+ * @param key 转换 key(transitions 的键)
54
+ * @returns 条件 phase 列表(已去空、去空白)
55
+ */
56
+ export declare function parseTransitionKey(key: string): string[];
57
+ /** 判断某 phase 是否匹配转换 key(组合条件下任一条件匹配即 true,简单 key 为精确相等) */
58
+ export declare function transitionKeyMatches(key: string, phase: string): boolean;
59
+ /** pipeline.yaml 的完整 Schema(transitions key 允许 '|' 组合条件) */
60
+ export declare const PipelineConfigSchema: z.ZodObject<{
61
+ phases: z.ZodArray<z.ZodString>;
62
+ transitions: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
63
+ checkpoint_mapping: z.ZodRecord<z.ZodString, z.ZodString>;
64
+ phase_corrections: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
65
+ }, z.core.$strip>;
66
+ /** pipeline.yaml 解析后的类型 */
67
+ export type PipelineConfig = z.infer<typeof PipelineConfigSchema>;
68
+ /** 阶段耗时统计 */
69
+ export interface StageStats {
70
+ /** 阶段开始时间(ISO 8601) */
71
+ start_time: string;
72
+ /** 阶段结束时间(ISO 8601),未完成时为空字符串 */
73
+ end_time: string;
74
+ /** 阶段耗时(毫秒),未完成时为 0 */
75
+ duration_ms: number;
76
+ }
77
+ /** 阶段级流水线阶段(从 PipelineMeta 移到 StageData 内) */
78
+ //# sourceMappingURL=pipeline-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-schema.d.ts","sourceRoot":"","sources":["../../src/core/pipeline-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mBAAmB;AACnB,eAAO,MAAM,eAAe,oPAMlB,CAAC;AAEX,0CAA0C;AAC1C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;EAA0B,CAAC;AAE3D,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,oBAAoB;AACpB,eAAO,MAAM,WAAW,uCAAwC,CAAC;AAEjE,mCAAmC;AACnC,eAAO,MAAM,eAAe;;;;EAAsB,CAAC;AAEnD,eAAe;AACf,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAExE;AAED,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB;;;;;iBAM/B,CAAC;AAEH,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8CAA8C"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 流水线配置 Zod Schema
3
+ * 定义 pipeline.yaml 的数据结构,用于校验和类型推导。
4
+ *
5
+ * 变更摘要 (stage-01: flow.json 鲁棒性加固):
6
+ * - 新增 PIPELINE_PHASES 枚举常量,硬编码 15 个合法流水线阶段
7
+ * - 新增 PipelinePhaseSchema (Zod enum),用于运行时校验 phase 值的合法性
8
+ * - 新增 PipelinePhase 类型,替代此前的动态 string 类型
9
+ * - PipelineConfigSchema 保持 string 泛型以兼容自定义 YAML,phase 值校验由 PipelinePhaseSchema 负责
10
+ */
11
+ import { z } from 'zod';
12
+ /** 合法的流水线阶段枚举常量 */
13
+ export const PIPELINE_PHASES = [
14
+ 'plan_pending', 'plan_review', 'plan_passed',
15
+ 'scheme_pending', 'scheme_review', 'scheme_passed',
16
+ 'exec_running', 'review_pending', 'review_failed',
17
+ 'review_passed', 'test_pending', 'test_failed',
18
+ 'test_passed', 'archiving', 'done',
19
+ ];
20
+ /** 流水线阶段 Zod 枚举 Schema,用于运行时校验 phase 值 */
21
+ export const PipelinePhaseSchema = z.enum(PIPELINE_PHASES);
22
+ /** 流水线全局宏观状态枚举常量 */
23
+ export const META_PHASES = ['active', 'paused', 'done'];
24
+ /** 全局宏观状态 Zod 枚举 Schema,用于运行时校验 */
25
+ export const MetaPhaseSchema = z.enum(META_PHASES);
26
+ /**
27
+ * 组合转换条件分隔符
28
+ * transitions 的 key 可用 '|' 组合多个源 phase,任一源 phase 匹配即可推进到目标(多 Agent 并行场景)。
29
+ * 示例: `'test_passed|review_passed': ['archiving']` → 审查或测试任一通过即可归档。
30
+ */
31
+ export const TRANSITION_OR_SEPARATOR = '|';
32
+ /**
33
+ * 将 transitions 的 key 解析为条件 phase 列表
34
+ * 简单 key(如 'review_pending')返回单个条件;组合 key(如 'test_passed|review_passed')按 '|' 分割返回多个条件。
35
+ * @param key 转换 key(transitions 的键)
36
+ * @returns 条件 phase 列表(已去空、去空白)
37
+ */
38
+ export function parseTransitionKey(key) {
39
+ return key
40
+ .split(TRANSITION_OR_SEPARATOR)
41
+ .map((c) => c.trim())
42
+ .filter(Boolean);
43
+ }
44
+ /** 判断某 phase 是否匹配转换 key(组合条件下任一条件匹配即 true,简单 key 为精确相等) */
45
+ export function transitionKeyMatches(key, phase) {
46
+ return parseTransitionKey(key).includes(phase);
47
+ }
48
+ /** pipeline.yaml 的完整 Schema(transitions key 允许 '|' 组合条件) */
49
+ export const PipelineConfigSchema = z.object({
50
+ phases: z.array(z.string()),
51
+ // transitions: { fromPhase | "fromA|fromB": [toPhase, ...] },key 可含 '|' 组合多个源 phase
52
+ transitions: z.record(z.string(), z.array(z.string())),
53
+ checkpoint_mapping: z.record(z.string(), z.string()),
54
+ phase_corrections: z.record(z.string(), z.string()).default({}),
55
+ });
56
+ /** 阶段级流水线阶段(从 PipelineMeta 移到 StageData 内) */
57
+ //# sourceMappingURL=pipeline-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-schema.js","sourceRoot":"","sources":["../../src/core/pipeline-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mBAAmB;AACnB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc,EAAE,aAAa,EAAE,aAAa;IAC5C,gBAAgB,EAAE,eAAe,EAAE,eAAe;IAClD,cAAc,EAAE,gBAAgB,EAAE,eAAe;IACjD,eAAe,EAAE,cAAc,EAAE,aAAa;IAC9C,aAAa,EAAE,WAAW,EAAE,MAAM;CAC1B,CAAC;AAEX,0CAA0C;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAK3D,oBAAoB;AACpB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEjE,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAKnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG;SACP,KAAK,CAAC,uBAAuB,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAa;IAC7D,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,oFAAoF;IACpF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChE,CAAC,CAAC;AAeH,8CAA8C"}
@@ -0,0 +1,17 @@
1
+ /** 分期大纲 */
2
+ export interface Roadmap {
3
+ version: string;
4
+ /** 相对路径 .openfeel/roadmap/v{version}.md */
5
+ path: string;
6
+ }
7
+ /**
8
+ * 创建分期大纲
9
+ * 在 .openfeel/roadmap/ 下创建 v{version}.md 骨架文件
10
+ */
11
+ export declare function createRoadmap(projectPath: string, version: string): void;
12
+ /**
13
+ * 显示分期大纲内容
14
+ * @param version 不传则列出所有大纲文件
15
+ */
16
+ export declare function showRoadmap(projectPath: string, version?: string): string;
17
+ //# sourceMappingURL=roadmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../../src/core/plan/roadmap.ts"],"names":[],"mappings":"AAOA,WAAW;AACX,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAOD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoCxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BzE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 分期大纲管理
3
+ * 负责 .openfeel/roadmap/ 下的版本大纲文件创建与读取
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
6
+ import { resolve, join } from 'node:path';
7
+ /** 规范化版本号:去掉用户可能输入的前导 v */
8
+ function normalizeVersion(version) {
9
+ return version.replace(/^v/, '');
10
+ }
11
+ /**
12
+ * 创建分期大纲
13
+ * 在 .openfeel/roadmap/ 下创建 v{version}.md 骨架文件
14
+ */
15
+ export function createRoadmap(projectPath, version) {
16
+ const ver = normalizeVersion(version);
17
+ const roadmapDir = resolve(projectPath, '.openfeel', 'roadmap');
18
+ if (!existsSync(roadmapDir)) {
19
+ mkdirSync(roadmapDir, { recursive: true });
20
+ }
21
+ const filePath = join(roadmapDir, `v${ver}.md`);
22
+ if (existsSync(filePath)) {
23
+ console.log(`大纲已存在: v${ver}.md`);
24
+ return;
25
+ }
26
+ const content = `# 分期大纲 v${ver}
27
+
28
+ ## 目标
29
+
30
+ > 待补充 — 描述本版本的总体目标
31
+
32
+ ## 阶段划分
33
+
34
+ > 待补充 — 列出各阶段(stage-01, stage-02, ...)及简要说明
35
+
36
+ ## 里程碑
37
+
38
+ > 待补充 — 关键里程碑和预期完成时间
39
+
40
+ ## 备注
41
+
42
+ > 待补充
43
+ `;
44
+ writeFileSync(filePath, content, 'utf-8');
45
+ console.log(`已创建分期大纲: v${ver}.md`);
46
+ }
47
+ /**
48
+ * 显示分期大纲内容
49
+ * @param version 不传则列出所有大纲文件
50
+ */
51
+ export function showRoadmap(projectPath, version) {
52
+ const roadmapDir = resolve(projectPath, '.openfeel', 'roadmap');
53
+ if (!existsSync(roadmapDir)) {
54
+ return '暂无分期大纲(.openfeel/roadmap/ 目录不存在)';
55
+ }
56
+ if (version) {
57
+ const ver = normalizeVersion(version);
58
+ const filePath = join(roadmapDir, `v${ver}.md`);
59
+ if (!existsSync(filePath)) {
60
+ console.error(`错误:大纲文件不存在 — v${ver}.md`);
61
+ process.exit(1);
62
+ }
63
+ return readFileSync(filePath, 'utf-8');
64
+ }
65
+ const files = readdirSync(roadmapDir).filter((f) => f.startsWith('v') && f.endsWith('.md'));
66
+ if (files.length === 0) {
67
+ return '暂无分期大纲文件';
68
+ }
69
+ return files.join('\n');
70
+ }
71
+ //# sourceMappingURL=roadmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap.js","sourceRoot":"","sources":["../../../src/core/plan/roadmap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS1C,2BAA2B;AAC3B,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,OAAe;IAChE,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;IAEhD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,GAAG;;;;;;;;;;;;;;;;;CAiB/B,CAAC;IAEA,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,OAAgB;IAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /** 操作方案 */
2
+ export interface Scheme {
3
+ /** 如 op-001 */
4
+ opId: string;
5
+ /** 所属阶段名 */
6
+ stage: string;
7
+ /** 方案标题 */
8
+ title: string;
9
+ /** Markdown 全文 */
10
+ content: string;
11
+ /** 相对路径 .openfeel/stages/{stage}/ops/op-001_{title}.md */
12
+ filePath: string;
13
+ }
14
+ /**
15
+ * 创建操作方案
16
+ * 在 .openfeel/stages/{stage}/ops/ 下创建 op-NNN_{title}.md
17
+ * NNN 自动递增(从该阶段的已有方案中计算)
18
+ * 必须按固定模板生成,包含:目标、实施步骤(checkbox)、产出文件、自测清单、修正记录
19
+ * 创建后自动同步到 flow.json(如果存在)
20
+ * @returns opId(如 op-001)
21
+ */
22
+ export declare function createScheme(projectPath: string, stageName: string, title: string): string;
23
+ /**
24
+ * 读取操作方案
25
+ * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001)
26
+ * @returns Scheme 或 null
27
+ */
28
+ export declare function getScheme(projectPath: string, opId: string): Scheme | null;
29
+ /**
30
+ * 列出操作方案
31
+ * @param stageName 可选,不传则列出所有阶段的方案
32
+ */
33
+ export declare function listSchemes(projectPath: string, stageName?: string): Scheme[];
34
+ //# sourceMappingURL=scheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme.d.ts","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"AASA,WAAW;AACX,MAAM,WAAW,MAAM;IACrB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwB1F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4D1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAyD7E"}