openfeel 1.3.1 → 1.3.3

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 (57) hide show
  1. package/README.en.md +1 -0
  2. package/README.md +2 -1
  3. package/README.zh-CN.md +1 -0
  4. package/dist/commands/flow.d.ts.map +1 -1
  5. package/dist/commands/flow.js +98 -14
  6. package/dist/commands/flow.js.map +1 -1
  7. package/dist/commands/instructions.js +1 -1
  8. package/dist/commands/instructions.js.map +1 -1
  9. package/dist/commands/plan.d.ts.map +1 -1
  10. package/dist/commands/plan.js +9 -1
  11. package/dist/commands/plan.js.map +1 -1
  12. package/dist/core/archive/merge.js +8 -8
  13. package/dist/core/archive/merge.js.map +1 -1
  14. package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
  15. package/dist/core/artifact-graph/resolver.js +8 -0
  16. package/dist/core/artifact-graph/resolver.js.map +1 -1
  17. package/dist/core/config.d.ts +12 -0
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +25 -3
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/flow-manager.d.ts +26 -1
  22. package/dist/core/flow-manager.d.ts.map +1 -1
  23. package/dist/core/flow-manager.js +112 -9
  24. package/dist/core/flow-manager.js.map +1 -1
  25. package/dist/core/i18n-data/en.d.ts.map +1 -1
  26. package/dist/core/i18n-data/en.js +12 -0
  27. package/dist/core/i18n-data/en.js.map +1 -1
  28. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  29. package/dist/core/i18n-data/zh-CN.js +12 -0
  30. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  31. package/dist/core/plan/stage.d.ts.map +1 -1
  32. package/dist/core/plan/stage.js +3 -1
  33. package/dist/core/plan/stage.js.map +1 -1
  34. package/dist/core/template-loader.d.ts.map +1 -1
  35. package/dist/core/template-loader.js +38 -18
  36. package/dist/core/template-loader.js.map +1 -1
  37. package/dist/core/update.d.ts.map +1 -1
  38. package/dist/core/update.js +25 -5
  39. package/dist/core/update.js.map +1 -1
  40. package/dist/core/view/entry.d.ts +13 -4
  41. package/dist/core/view/entry.d.ts.map +1 -1
  42. package/dist/core/view/entry.js +40 -16
  43. package/dist/core/view/entry.js.map +1 -1
  44. package/dist/core/workspace/structure.d.ts +21 -1
  45. package/dist/core/workspace/structure.d.ts.map +1 -1
  46. package/dist/core/workspace/structure.js +30 -11
  47. package/dist/core/workspace/structure.js.map +1 -1
  48. package/dsh/ADAPTER.md +17 -4
  49. package/dsh/README.md +41 -5
  50. package/dsh/cordis.patch.yml +14 -0
  51. package/dsh/lib/adapters/dashboard.js +2 -2
  52. package/dsh/lib/guard.js +424 -0
  53. package/dsh/lib/index.js +53 -7
  54. package/dsh/lib/surface/prompt.js +78 -2
  55. package/dsh/lib/tools/shared.js +28 -14
  56. package/dsh/package.json +2 -2
  57. package/package.json +1 -1
@@ -188,26 +188,40 @@ export function toWireEnvelope(action, payload) {
188
188
  }
189
189
 
190
190
  /**
191
- * 安全序列化:处理循环引用与不可序列化值,永不抛错。
191
+ * 安全序列化:只对**真环**(祖先路径上出现过的对象)写 `[循环引用]`;
192
+ * 同一对象的**重复引用**(DAG,如 focus.deps 与 stages[i].deps 指向同一数组)正常复制(P1-2)。
193
+ * 兼处理 BigInt / 不可序列化值,永不抛错。
192
194
  * @param {unknown} value
193
195
  * @returns {string}
194
196
  */
195
197
  export function stringifySafe(value) {
196
198
  try {
197
- /** @type {WeakSet<object>} */
198
- const seen = new WeakSet();
199
- return JSON.stringify(
200
- value,
201
- (_key, item) => {
202
- if (typeof item === 'object' && item !== null) {
203
- if (seen.has(item)) return '[循环引用]';
204
- seen.add(item);
199
+ /**
200
+ * @param {unknown} item
201
+ * @param {WeakSet<object>} ancestors
202
+ * @returns {unknown}
203
+ */
204
+ const clone = (item, ancestors) => {
205
+ if (typeof item === 'bigint') return item.toString();
206
+ if (typeof item === 'function' || typeof item === 'symbol') return undefined;
207
+ if (typeof item !== 'object' || item === null) return item;
208
+ // 保留 Date / URL 等自带 toJSON 的语义(与 JSON.stringify 一致)
209
+ if (typeof item.toJSON === 'function') return item.toJSON();
210
+ if (ancestors.has(item)) return '[循环引用]';
211
+ ancestors.add(item);
212
+ let out;
213
+ if (Array.isArray(item)) {
214
+ out = item.map((entry) => clone(entry, ancestors));
215
+ } else {
216
+ out = {};
217
+ for (const [key, entry] of Object.entries(item)) {
218
+ out[key] = clone(entry, ancestors);
205
219
  }
206
- if (typeof item === 'bigint') return item.toString();
207
- return item;
208
- },
209
- 2,
210
- );
220
+ }
221
+ ancestors.delete(item);
222
+ return out;
223
+ };
224
+ return JSON.stringify(clone(value, new WeakSet()), null, 2);
211
225
  } catch {
212
226
  return String(value);
213
227
  }
package/dsh/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfeel-dsh",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "OpenFeel × DSH — Feel 模式适配器:把 OpenFeel 的流水线、需求分发、版本归档与知识库接入 DeepSeek Harness",
5
5
  "type": "module",
6
6
  "private": true,
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "openfeel": {
34
34
  "adapter": "dsh",
35
- "requiresCli": ">=1.3.1"
35
+ "requiresCli": ">=1.3.3"
36
36
  },
37
37
  "keywords": [
38
38
  "openfeel",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfeel",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "AI Agent 开发流程治理 CLI 工具",
5
5
  "type": "module",
6
6
  "private": false,