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 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/core/archive/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * ArtifactGraph — 基于 Kahn 拓扑排序的构建依赖图
3
+ *
4
+ * 核心职责:
5
+ * 1. 解析 Schema 中的依赖关系(dependsOn + requires),构建邻接表和入度
6
+ * 2. Kahn BFS 拓扑排序,检测循环依赖
7
+ * 3. 给定已完成集合,返回当前可执行的 artifact
8
+ * 4. 返回阻塞状态明细
9
+ *
10
+ * 规则:
11
+ * - dependsOn 字段中的所有 artifact ID 视为 hard 依赖
12
+ * - requires 中 type='hard'(默认)的视为 hard 依赖
13
+ * - requires 中 type='soft' 的不影响拓扑排序和就绪判断
14
+ */
15
+ import type { Schema } from '../schema.js';
16
+ import type { BuildOrder, BlockedArtifacts } from './types.js';
17
+ export declare class ArtifactGraph {
18
+ /** artifact ID → Artifact 对象的映射 */
19
+ private artifacts;
20
+ /** artifact → 被它阻塞的 artifact 列表(出边) */
21
+ private adjacency;
22
+ /** artifact → 入度(还有多少 hard 依赖未满足) */
23
+ private inDegree;
24
+ constructor(schema: Schema);
25
+ /**
26
+ * 收集 artifact 的所有 hard 依赖 ID
27
+ * 来源:dependsOn 字段(全 hard)+ requires 中 type='hard' 的条目
28
+ */
29
+ private collectHardDeps;
30
+ /**
31
+ * Kahn 拓扑排序(BFS)
32
+ * @returns 拓扑排序后的 artifact ID 列表
33
+ * @throws 检测到循环依赖时抛出异常
34
+ */
35
+ getBuildOrder(): BuildOrder;
36
+ /**
37
+ * 获取下一步可执行的 artifact 列表
38
+ * @param completed 已完成的 artifact ID 集合
39
+ * @returns 所有 hard 依赖已满足的待执行 artifact ID 列表(按拓扑顺序)
40
+ */
41
+ getNextArtifacts(completed: Set<string>): string[];
42
+ /**
43
+ * 判断 artifact 的所有 hard 依赖是否已满足
44
+ */
45
+ private areHardDepsSatisfied;
46
+ /**
47
+ * 将 artifact ID 列表按 getBuildOrder 的顺序排列
48
+ */
49
+ private sortByTopoOrder;
50
+ private _buildOrder;
51
+ /**
52
+ * 全部 artifact 是否都已标记为完成
53
+ */
54
+ isComplete(completed: Set<string>): boolean;
55
+ /**
56
+ * 获取当前阻塞状态明细
57
+ * @param completed 已完成的 artifact ID 集合
58
+ * @returns 阻塞状态,包含 ready、blocked、completed 列表
59
+ */
60
+ getBlocked(completed: Set<string>): BlockedArtifacts;
61
+ }
62
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/core/artifact-graph/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAwB,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAe,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,aAAa;IACxB,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAAwB;IAEzC,uCAAuC;IACvC,OAAO,CAAC,SAAS,CAAwB;IAEzC,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,MAAM,EAAE,MAAM;IA8B1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;OAIG;IACH,aAAa,IAAI,UAAU;IA2C3B;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAkBlD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW,CAA2B;IAE9C;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO;IAY3C;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB;CAiCrD"}
@@ -0,0 +1,184 @@
1
+ export class ArtifactGraph {
2
+ /** artifact ID → Artifact 对象的映射 */
3
+ artifacts;
4
+ /** artifact → 被它阻塞的 artifact 列表(出边) */
5
+ adjacency;
6
+ /** artifact → 入度(还有多少 hard 依赖未满足) */
7
+ inDegree;
8
+ constructor(schema) {
9
+ this.artifacts = new Map();
10
+ this.adjacency = new Map();
11
+ this.inDegree = new Map();
12
+ // 1. 注册所有 artifact
13
+ for (const artifact of schema.artifacts) {
14
+ this.artifacts.set(artifact.id, artifact);
15
+ this.adjacency.set(artifact.id, []);
16
+ this.inDegree.set(artifact.id, 0);
17
+ }
18
+ // 2. 构建邻接表和入度
19
+ for (const artifact of schema.artifacts) {
20
+ const hardDeps = this.collectHardDeps(artifact);
21
+ for (const depId of hardDeps) {
22
+ // 验证依赖目标存在
23
+ if (!this.artifacts.has(depId)) {
24
+ throw new Error(`Artifact "${artifact.id}" 依赖了不存在的 artifact "${depId}"`);
25
+ }
26
+ // depId → artifact.id(depId 完成后 artifact.id 才能开始)
27
+ this.adjacency.get(depId).push(artifact.id);
28
+ this.inDegree.set(artifact.id, (this.inDegree.get(artifact.id) ?? 0) + 1);
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * 收集 artifact 的所有 hard 依赖 ID
34
+ * 来源:dependsOn 字段(全 hard)+ requires 中 type='hard' 的条目
35
+ */
36
+ collectHardDeps(artifact) {
37
+ const hardDeps = [];
38
+ // dependsOn 简写:全部视为 hard
39
+ if (artifact.dependsOn) {
40
+ hardDeps.push(...artifact.dependsOn);
41
+ }
42
+ // requires 数组:按 type 过滤
43
+ if (artifact.requires) {
44
+ for (const dep of artifact.requires) {
45
+ // 默认 type 为 'hard',只有显式 'soft' 才跳过
46
+ if (dep.type !== 'soft') {
47
+ hardDeps.push(dep.artifact);
48
+ }
49
+ }
50
+ }
51
+ // 去重:dependsOn 和 requires 可能包含相同的依赖 ID
52
+ return [...new Set(hardDeps)];
53
+ }
54
+ /**
55
+ * Kahn 拓扑排序(BFS)
56
+ * @returns 拓扑排序后的 artifact ID 列表
57
+ * @throws 检测到循环依赖时抛出异常
58
+ */
59
+ getBuildOrder() {
60
+ const order = [];
61
+ // 复制入度表(不修改原始数据)
62
+ const inDeg = new Map(this.inDegree);
63
+ // BFS 队列:入度为 0 的节点
64
+ const queue = [];
65
+ // 初始化队列
66
+ for (const [id, degree] of inDeg) {
67
+ if (degree === 0) {
68
+ queue.push(id);
69
+ }
70
+ }
71
+ while (queue.length > 0) {
72
+ // 按字典序排序,保证输出稳定
73
+ queue.sort();
74
+ const current = queue.shift();
75
+ order.push(current);
76
+ // 减少所有后继节点的入度
77
+ for (const neighbor of this.adjacency.get(current) ?? []) {
78
+ const newDeg = (inDeg.get(neighbor) ?? 1) - 1;
79
+ inDeg.set(neighbor, newDeg);
80
+ if (newDeg === 0) {
81
+ queue.push(neighbor);
82
+ }
83
+ }
84
+ }
85
+ // 节点未全部输出 → 存在循环依赖
86
+ if (order.length !== this.artifacts.size) {
87
+ const remaining = [...this.artifacts.keys()].filter((id) => !order.includes(id));
88
+ throw new Error(`检测到循环依赖,以下 artifact 陷入循环:${remaining.join(', ')}`);
89
+ }
90
+ return order;
91
+ }
92
+ /**
93
+ * 获取下一步可执行的 artifact 列表
94
+ * @param completed 已完成的 artifact ID 集合
95
+ * @returns 所有 hard 依赖已满足的待执行 artifact ID 列表(按拓扑顺序)
96
+ */
97
+ getNextArtifacts(completed) {
98
+ const ready = [];
99
+ for (const [id, artifact] of this.artifacts) {
100
+ // 已完成的跳过
101
+ if (completed.has(id)) {
102
+ continue;
103
+ }
104
+ // 检查所有 hard 依赖是否都在 completed 中
105
+ if (this.areHardDepsSatisfied(artifact, completed)) {
106
+ ready.push(id);
107
+ }
108
+ }
109
+ // 按拓扑排序保证稳定性
110
+ return this.sortByTopoOrder(ready);
111
+ }
112
+ /**
113
+ * 判断 artifact 的所有 hard 依赖是否已满足
114
+ */
115
+ areHardDepsSatisfied(artifact, completed) {
116
+ const hardDeps = this.collectHardDeps(artifact);
117
+ return hardDeps.every((depId) => completed.has(depId));
118
+ }
119
+ /**
120
+ * 将 artifact ID 列表按 getBuildOrder 的顺序排列
121
+ */
122
+ sortByTopoOrder(ids) {
123
+ // 缓存拓扑排序结果
124
+ if (!this._buildOrder) {
125
+ this._buildOrder = this.getBuildOrder();
126
+ }
127
+ const orderMap = new Map();
128
+ for (let i = 0; i < this._buildOrder.length; i++) {
129
+ orderMap.set(this._buildOrder[i], i);
130
+ }
131
+ return ids.sort((a, b) => (orderMap.get(a) ?? 0) - (orderMap.get(b) ?? 0));
132
+ }
133
+ _buildOrder = null;
134
+ /**
135
+ * 全部 artifact 是否都已标记为完成
136
+ */
137
+ isComplete(completed) {
138
+ if (this.artifacts.size === 0) {
139
+ return true; // 空 Schema 视为已完成
140
+ }
141
+ for (const id of this.artifacts.keys()) {
142
+ if (!completed.has(id)) {
143
+ return false;
144
+ }
145
+ }
146
+ return true;
147
+ }
148
+ /**
149
+ * 获取当前阻塞状态明细
150
+ * @param completed 已完成的 artifact ID 集合
151
+ * @returns 阻塞状态,包含 ready、blocked、completed 列表
152
+ */
153
+ getBlocked(completed) {
154
+ const ready = [];
155
+ const blocked = [];
156
+ const completedArr = [];
157
+ for (const [id, artifact] of this.artifacts) {
158
+ if (completed.has(id)) {
159
+ completedArr.push(id);
160
+ continue;
161
+ }
162
+ const hardDeps = this.collectHardDeps(artifact);
163
+ const missingDeps = hardDeps.filter((depId) => !completed.has(depId));
164
+ if (missingDeps.length === 0) {
165
+ ready.push(id);
166
+ }
167
+ else {
168
+ blocked.push({
169
+ artifactId: id,
170
+ missingDeps,
171
+ description: artifact.description,
172
+ });
173
+ }
174
+ }
175
+ return {
176
+ blocked,
177
+ ready: this.sortByTopoOrder(ready),
178
+ completed: completedArr,
179
+ total: this.artifacts.size,
180
+ done: completedArr.length,
181
+ };
182
+ }
183
+ }
184
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/core/artifact-graph/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ArtifactGraph 模块统一导出
3
+ */
4
+ export { loadSchema } from '../schema.js';
5
+ export type { Schema, Artifact, Dependency } from '../schema.js';
6
+ export type { BuildOrder, BlockedInfo, BlockedArtifacts } from './types.js';
7
+ export { ArtifactGraph } from './graph.js';
8
+ export { detectCompletedArtifacts } from './state.js';
9
+ export { resolveSchema } from './resolver.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/artifact-graph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ArtifactGraph 模块统一导出
3
+ */
4
+ export { loadSchema } from '../schema.js';
5
+ export { ArtifactGraph } from './graph.js';
6
+ export { detectCompletedArtifacts } from './state.js';
7
+ export { resolveSchema } from './resolver.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/artifact-graph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 指令加载器 — 为指定 artifact 生成结构化 XML 指令
3
+ *
4
+ * 核心职责:
5
+ * 1. 从 Schema 中提取 artifact 的依赖、产出、模板等信息
6
+ * 2. 注入项目上下文(config.yaml)、默认规则约束、依赖状态
7
+ * 3. 生成 XML 格式的结构化指令(供 AI Agent 消费)
8
+ * 4. 提供 JSON 格式备选输出
9
+ */
10
+ import type { Schema } from '../schema.js';
11
+ /**
12
+ * 为指定 artifact 生成 XML 格式的结构化指令
13
+ *
14
+ * @param schema - 工作流 Schema
15
+ * @param changeName - 变更名称
16
+ * @param artifactId - 目标 artifact ID
17
+ * @param projectPath - 项目根路径
18
+ * @param completed - 可选的已完成 artifact ID 集合(用于测试/缓存),不传则自动扫描文件系统
19
+ * @returns XML 格式的指令文本
20
+ * @throws 找不到 artifact 或 Schema 校验失败时抛出异常
21
+ */
22
+ export declare function generateInstructions(schema: Schema, changeName: string, artifactId: string, projectPath: string, completed?: Set<string>): Promise<string>;
23
+ /**
24
+ * 为指定 artifact 生成 JSON 格式的结构化指令
25
+ * 返回与 XML 标签对应的 JS 对象
26
+ *
27
+ * @param schema - 工作流 Schema
28
+ * @param changeName - 变更名称
29
+ * @param artifactId - 目标 artifact ID
30
+ * @param projectPath - 项目根路径
31
+ * @param completed - 可选的已完成 artifact ID 集合
32
+ * @returns JSON 对象
33
+ */
34
+ export declare function generateInstructionsJson(schema: Schema, changeName: string, artifactId: string, projectPath: string, completed?: Set<string>): Promise<object>;
35
+ //# sourceMappingURL=instruction-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction-loader.d.ts","sourceRoot":"","sources":["../../../src/core/artifact-graph/instruction-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,cAAc,CAAC;AA4OrD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,CAsEjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,CAuFjB"}