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
@@ -81,31 +81,55 @@ export function addReviewEntry(projectPath, opts) {
81
81
  if (!['high', 'medium', 'low'].includes(priority)) {
82
82
  return { review: null, error: { code: 'invalidPriority', priority } };
83
83
  }
84
- // opId 格式校验(用 lastIndexOf 分割,兼容含点 stageId)
85
- const dotIdx = opts.opId.lastIndexOf('.');
86
- if (dotIdx === -1) {
87
- return { review: null, error: { code: 'invalidOpId', opId: opts.opId } };
84
+ // 自动修复必须绑定具体 op(addAutoFixReview 需要 op 才能推进)
85
+ if (opts.autoFixDetail && !opts.opId) {
86
+ return { review: null, error: { code: 'autoFixRequiresOp', opId: opts.opId } };
88
87
  }
89
- const rawStageId = opts.opId.substring(0, dotIdx);
90
- const opLocalId = opts.opId.substring(dotIdx + 1);
91
- // REV-009:短名前缀归一化 + 双键回退(单点实现,禁第二套校验)
92
- const stageId = normalizeStageId(rawStageId) ?? rawStageId;
93
88
  const data = mgr.getData();
94
- const stage = data ? (data.stages[stageId] ?? data.stages[rawStageId]) : undefined;
95
- if (!data || !stage) {
96
- return { review: null, error: { code: 'stageNotFound', opId: opts.opId, stage: stageId } };
89
+ let opId;
90
+ /** 阶段级 REV 的显式归属(op 级为 undefined,向后兼容) */
91
+ let reviewStage;
92
+ if (opts.opId) {
93
+ // op 级:原路径(用 lastIndexOf 分割,兼容含点 stageId)
94
+ const dotIdx = opts.opId.lastIndexOf('.');
95
+ if (dotIdx === -1) {
96
+ return { review: null, error: { code: 'invalidOpId', opId: opts.opId } };
97
+ }
98
+ const rawStageId = opts.opId.substring(0, dotIdx);
99
+ const opLocalId = opts.opId.substring(dotIdx + 1);
100
+ // REV-009:短名前缀归一化 + 双键回退(单点实现,禁第二套校验)
101
+ const stageId = normalizeStageId(rawStageId) ?? rawStageId;
102
+ const stage = data ? (data.stages[stageId] ?? data.stages[rawStageId]) : undefined;
103
+ if (!data || !stage) {
104
+ return { review: null, error: { code: 'stageNotFound', opId: opts.opId, stage: stageId } };
105
+ }
106
+ if (!stage.ops[opLocalId]) {
107
+ return { review: null, error: { code: 'opNotFound', opId: opts.opId, op: opLocalId, stage: stageId } };
108
+ }
109
+ opId = opts.opId;
97
110
  }
98
- if (!stage.ops[opLocalId]) {
99
- return { review: null, error: { code: 'opNotFound', opId: opts.opId, op: opLocalId, stage: stageId } };
111
+ else if (opts.stageId) {
112
+ // 阶段级:**必须绕过** lastIndexOf('.') 的 op 解析(stage id 自身含点,如 v0.0.1-stage-01)
113
+ const stageId = normalizeStageId(opts.stageId) ?? opts.stageId;
114
+ const stage = data ? (data.stages[stageId] ?? data.stages[opts.stageId]) : undefined;
115
+ if (!data || !stage) {
116
+ return { review: null, error: { code: 'stageNotFound', opId: opts.stageId, stage: stageId } };
117
+ }
118
+ opId = stageId;
119
+ reviewStage = stageId;
120
+ }
121
+ else {
122
+ return { review: null, error: { code: 'invalidTarget', opId: opts.opId, stageId: opts.stageId } };
100
123
  }
101
124
  // REV ID 由单点按「既有最大序号 + 1」分配(T13),两入口不得自行生成
102
125
  const revId = generateReviewId(projectPath);
103
126
  const review = {
104
127
  id: revId,
105
- op: opts.opId,
128
+ op: opId,
129
+ ...(reviewStage === undefined ? {} : { stage: reviewStage }),
106
130
  status: 'open',
107
131
  priority: priority,
108
- title: opts.title || opts.opId,
132
+ title: opts.title || opId,
109
133
  filed_by: opts.filedBy ?? 'cli',
110
134
  filed_at: new Date().toISOString(),
111
135
  canAutoFix: !!opts.autoFixDetail,
@@ -113,7 +137,7 @@ export function addReviewEntry(projectPath, opts) {
113
137
  blocking: opts.blocking ?? true,
114
138
  };
115
139
  if (opts.autoFixDetail) {
116
- mgr.addAutoFixReview(review, opts.opId);
140
+ mgr.addAutoFixReview(review, opId);
117
141
  }
118
142
  else {
119
143
  mgr.addReview(review);
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/core/view/entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/core/view/entry.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,27 @@
3
3
  */
4
4
  export declare function ensureDir(path: string): void;
5
5
  /**
6
- * 创建 .openfeel/ 完整目录结构
6
+ * 核心必需目录(init 时创建;被 flow / plan / kb / dev 模板直接依赖)。
7
+ * v1.3.3 P2-4:由 10 个固定目录瘦身为 4 核心 + 6 惰性,降低冷启动前置开销。
8
+ */
9
+ export declare const CORE_WORKSPACE_DIRS: readonly ["plan", "kb", "dev", "log"];
10
+ /**
11
+ * 惰性目录:首次使用时按需 `mkdir -p`(写路径已有/新增 `ensureLazyDir` 兜底)。
12
+ * 不参与 init 冷启动;缺失不视为工作区损坏。
13
+ */
14
+ export declare const LAZY_WORKSPACE_DIRS: readonly ["code_review", "bugs", "users", "tmp", "manual", "update_conflicts"];
15
+ /**
16
+ * 惰性目录清单(导出供 lint / 文档 / 测试复用)。
17
+ */
18
+ export declare const WORKSPACE_LAZY_DIRS: readonly string[];
19
+ /**
20
+ * 按需确保 `.openfeel/{name}` 惰性目录存在(幂等;仅接受 LAZY_WORKSPACE_DIRS 内的名字)。
21
+ * 供写路径在首次落盘前调用;未知目录名直接忽略(防御,不建任意目录)。
22
+ */
23
+ export declare function ensureLazyDir(projectPath: string, name: string): void;
24
+ /**
25
+ * 创建 .openfeel/ 目录结构(核心必需 + dev 子目录;惰性目录不建)。
26
+ * @returns 本次新建的目录相对路径列表(既有目录不重复计入)
7
27
  */
8
28
  export declare function createWorkspace(projectPath: string): string[];
9
29
  //# sourceMappingURL=structure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/core/workspace/structure.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAuBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D"}
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/core/workspace/structure.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,uCAAwC,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gFAOtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAwB,CAAC;AAS1E;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKrE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * 工作区目录创建
3
- * 负责创建项目下的 .openfeel/ 完整目录结构。
3
+ * 负责创建项目下的 .openfeel/ 目录结构(v1.3.3 P2-4:核心必需 + 其余惰性)。
4
4
  */
5
5
  import { mkdirSync, existsSync } from 'node:fs';
6
6
  import { resolve } from 'node:path';
@@ -12,19 +12,27 @@ export function ensureDir(path) {
12
12
  mkdirSync(path, { recursive: true });
13
13
  }
14
14
  }
15
- /** .openfeel/ 下的子目录清单 */
16
- const WORKSPACE_DIRS = [
17
- 'plan',
18
- 'kb',
19
- 'dev',
20
- 'log',
15
+ /**
16
+ * 核心必需目录(init 时创建;被 flow / plan / kb / dev 模板直接依赖)。
17
+ * v1.3.3 P2-4:由 10 个固定目录瘦身为 4 核心 + 6 惰性,降低冷启动前置开销。
18
+ */
19
+ export const CORE_WORKSPACE_DIRS = ['plan', 'kb', 'dev', 'log'];
20
+ /**
21
+ * 惰性目录:首次使用时按需 `mkdir -p`(写路径已有/新增 `ensureLazyDir` 兜底)。
22
+ * 不参与 init 冷启动;缺失不视为工作区损坏。
23
+ */
24
+ export const LAZY_WORKSPACE_DIRS = [
21
25
  'code_review',
22
26
  'bugs',
23
27
  'users',
24
28
  'tmp',
25
29
  'manual',
26
- 'update_conflicts', // 新增:update 冲突文件目录
30
+ 'update_conflicts',
27
31
  ];
32
+ /**
33
+ * 惰性目录清单(导出供 lint / 文档 / 测试复用)。
34
+ */
35
+ export const WORKSPACE_LAZY_DIRS = LAZY_WORKSPACE_DIRS;
28
36
  /**
29
37
  * dev/ 下的子目录清单
30
38
  * - `note`:团队共享开发笔记
@@ -32,7 +40,18 @@ const WORKSPACE_DIRS = [
32
40
  */
33
41
  const DEV_SUB_DIRS = ['note', 'current_archive'];
34
42
  /**
35
- * 创建 .openfeel/ 完整目录结构
43
+ * 按需确保 `.openfeel/{name}` 惰性目录存在(幂等;仅接受 LAZY_WORKSPACE_DIRS 内的名字)。
44
+ * 供写路径在首次落盘前调用;未知目录名直接忽略(防御,不建任意目录)。
45
+ */
46
+ export function ensureLazyDir(projectPath, name) {
47
+ if (!LAZY_WORKSPACE_DIRS.includes(name)) {
48
+ return;
49
+ }
50
+ ensureDir(resolve(projectPath, '.openfeel', name));
51
+ }
52
+ /**
53
+ * 创建 .openfeel/ 目录结构(核心必需 + dev 子目录;惰性目录不建)。
54
+ * @returns 本次新建的目录相对路径列表(既有目录不重复计入)
36
55
  */
37
56
  export function createWorkspace(projectPath) {
38
57
  const base = resolve(projectPath, '.openfeel');
@@ -42,8 +61,8 @@ export function createWorkspace(projectPath) {
42
61
  mkdirSync(base, { recursive: true });
43
62
  created.push('.openfeel/');
44
63
  }
45
- // 创建子目录
46
- for (const dir of WORKSPACE_DIRS) {
64
+ // 创建核心子目录
65
+ for (const dir of CORE_WORKSPACE_DIRS) {
47
66
  const fullPath = resolve(base, dir);
48
67
  if (!existsSync(fullPath)) {
49
68
  mkdirSync(fullPath, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/core/workspace/structure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,IAAI;IACJ,KAAK;IACL,KAAK;IACL,aAAa;IACb,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,kBAAkB,EAAG,mBAAmB;CACzC,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,UAAU;IACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;IACR,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/core/workspace/structure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa;IACb,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,kBAAkB;CACV,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB,mBAAmB,CAAC;AAE1E;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,IAAY;IAC7D,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,UAAU;IACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU;IACV,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dsh/ADAPTER.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DSH 适配器
2
2
 
3
- > ✅ 已实现(OpenFeel v1.3.0 / DSH 0.2.0-rc.2)。
3
+ > ✅ 已实现(OpenFeel v1.3.2 / DSH 0.2.0-rc.2+;硬门禁依赖 `ctx.tools.guard`,缺失时降级为提示)。
4
4
 
5
5
  - **安装(推荐,单包)**:`npm i -g openfeel@latest` → `openfeel setup --tools dsh`
6
6
  (写入 DSH profile 的 `link:<openfeelRoot>/dsh` 依赖与 `dsh.profile.bundles`,按需 `pnpm install`),
@@ -15,7 +15,7 @@
15
15
  - **契约**:CLI 的 `--json` 出口以 [`docs/json-contract.md`](https://github.com/Liuary/OpenFeel/blob/master/docs/json-contract.md) 为**单一权威**
16
16
  (v1.3.0 起仍 40 个成功出口);本适配器只消费、不重实现。
17
17
  - **升级**:`npm i -g openfeel@latest` → 重启 DSH。适配器版本要求见 `package.json`
18
- 的 `openfeel.requiresCli`(≥1.3.0)。
18
+ 的 `openfeel.requiresCli`(≥1.3.2)。
19
19
 
20
20
  ## 设计边界
21
21
 
@@ -28,11 +28,23 @@ OpenFeel 采用「核心层 + 适配器层」架构(`claude/`、`kilo/`、`.op
28
28
  - **不解析**中文文本:优先消费 `--json`;失败读 `error.kind` / `error.code` / `error.detail`。
29
29
  - **不 shadow** 既有能力:DSH 已有的 `subagent` / `workflow` / `todo_write` 照常使用;
30
30
  `feel_next` 只给「该谁做」,实际派发交给 DSH。
31
+ - **写入门禁**(v1.3.3):用 DSH `ctx.tools.guard()` 同步拒绝 `edit` / `write` / `apply_patch` /
32
+ `str_replace_editor`;`.openfeel/**` 流程产物任意阶段可写(flow.json / `status.md` 除外)。
33
+ v1.3.3 起按**风险分层**:
34
+ - **bootstrap 例外**:工作区无 `.openfeel/` 时,全部目标为「新增文件」(`apply_patch` 还要求全部为
35
+ `*** Add File:`)→ 放行并提示补账本;已存在文件、`.openfeel/**`、Update/Delete/Move 仍拒绝;
36
+ - **doc/note 不绑相位**:`docs/**` 与 `.md/.mdx/.txt/.rst/.adoc` 在无活跃阶段或非 `exec_running`
37
+ 相位也可写;**混合目标从严**(任一源码 → 按源码规则);
38
+ - 源码(`src/**` 等)仍要求 `exec_running`;`pwsh` / `bash` 默认不守,是显式逃生通道;
39
+ - `enforce=always`(默认)对非 OpenFeel 工作区也拦截,可用 `project` / `off` opt-out。
40
+ - **审查归属**(v1.3.3):REV 可挂 op(`stageId.op-xxx`)或挂 stage(`op = stageId`,无 op 的 fast 场景);
41
+ stage 级 REV 参与 blocking 门,但**不参与** `flow attempt` / `flow retry`。
31
42
 
32
43
  ## 目录
33
44
 
34
45
  | 路径 | 内容 |
35
46
  |---|---|
47
+ | `lib/guard.js` | 写入门禁:`enforce`、`.openfeel/**` 产物区、bootstrap 新增放行、doc/note 分层、apply_patch 目标解析 |
36
48
  | [`ACTION-GUIDE.md`](ACTION-GUIDE.md) | **给 OpenFeel 本体的操作指南**:剩余 5 项待办、验收标准、边界约定 |
37
49
  | `lib/index.js` | 插件入口(`name` / `inject` / `apply` / `normalizeConfig`) |
38
50
  | `lib/adapters/cli.js` | CLI 执行器:可执行文件解析、UTF-8/无色/无日志、退出码与 envelope 语义 |
@@ -42,7 +54,7 @@ OpenFeel 采用「核心层 + 适配器层」架构(`claude/`、`kilo/`、`.op
42
54
  | `lib/tools/shared.js` | 输出封装、参数编译、渲染 |
43
55
  | `lib/surface/command.js` | `/feel` 人类命令 |
44
56
  | `lib/surface/prompt.js` | `<feel_mode>` 系统提示段 |
45
- | `test/` | 契约 / 行为 / 真实注册表 三套验证(42 + 77 + 10 = 129 断言) |
57
+ | `test/` | 契约 / 行为 / 门禁 / 真实注册表 四套验证(42 + 83 + 46 + 10 = 181 断言) |
46
58
  | `docs/compat/` | OpenFeel v1.2.1 逆向兼容性契约(6 份;仅供回归参照,权威以 [docs/json-contract.md](https://github.com/Liuary/OpenFeel/blob/master/docs/json-contract.md) 为准) |
47
59
 
48
60
  ## 验证
@@ -50,7 +62,8 @@ OpenFeel 采用「核心层 + 适配器层」架构(`claude/`、`kilo/`、`.op
50
62
  ```bash
51
63
  cd dsh
52
64
  node test/contract.js # 42 — DSH schema 契约(真实 assertSupportedJsonSchema)
53
- node test/verify.js # 77 — 行为(真实 CLI + 真实 .openfeel 副本)
65
+ node test/verify.js # 83 — 行为(真实 CLI + 真实 .openfeel 副本)
66
+ node test/guard.js # 46 — 写入门禁(fake ToolExecution + 临时工作区)
54
67
  node test/integration.js # 10 — 真实 cordis + 真实 ToolRuntime 挂载
55
68
  ```
56
69
 
package/dsh/README.md CHANGED
@@ -73,9 +73,13 @@ Windows 上的 `openfeel.cmd` 垫片。
73
73
  commandPrefix: [] # 从源码跑时:[node, <repo>/bin/openfeel.js]
74
74
  timeoutMs: 120000 # 单次调用超时
75
75
  log: false # 是否写 ~/.openfeel/cli/logs/(默认关闭,只读沙箱更安全)
76
- autoPrompt: true # 是否注入 Feel 纪律系统提示段
76
+ autoPrompt: true # 是否注入系统提示段
77
77
  language: zh-CN # 提示段语言:zh-CN | en
78
78
  cwd: null # 兜底工作目录(默认取会话工作区)
79
+ activation: auto # auto=项目→完整纪律/非项目→bootstrap;always=完整纪律;off=不注入
80
+ enforce: always # always=所有工作区守门禁;project=仅项目;off=完全不注册 guard
81
+ allowGeneral: true # general 需求 in_progress 且无阶段时放行源码写入
82
+ # mutatingTools 默认 [edit, write, apply_patch, str_replace_editor];pwsh 默认不守
79
83
  ```
80
84
 
81
85
  `normalizeConfig` 对非法值做安全回落(如 `timeoutMs: -5` → `120000`)。
@@ -184,24 +188,48 @@ provider 桥接层会把「只有 description、没有 type」的节点转成 `t
184
188
 
185
189
  段落正文每次装配时探测 `.openfeel/` 是否存在,因此提示会随工作区状态变化。
186
190
 
191
+ `activation`:
192
+
193
+ - `auto`(默认):已初始化 → 完整 `<feel_mode>`;未初始化 → 短 bootstrap(只读可进行;写文件按 `enforce` 说明)。
194
+ - `always`:所有工作区都注入完整 `<feel_mode>`(未初始化时 `detected:false`,不会误报已初始化)。
195
+ - `off`:不注入任何提示(写入门禁仍可独立开启)。
196
+
197
+ ---
198
+
199
+ ## 6.5 写入门禁(v1.3.3)
200
+
201
+ 适配器在 `apply()` 中用 DSH 的 `ctx.tools.guard()` 注册同步守卫(`dsh/lib/guard.js`):
202
+
203
+ - **只守** `edit` / `write` / `apply_patch` / `str_replace_editor`。`feel_*`、`pwsh`、`read`、`todo_write` 等不受影响。
204
+ - `.openfeel/**` 是**流程产物区**:plan / scheme / review 产物在任意阶段可写;但 `.openfeel/flow.json` 与 `.openfeel/**/status.md` **始终拒绝**(用 `feel_*`)。受保护路径按**会话工作区 `<cwd>`** 判定;执行阶段仍可编辑其他项目的 `.openfeel/`(不做跨项目全局保护)。
205
+ - **v1.3.3 风险分层**——源码(`src/**` 等)仍要求存在 `exec_running` 阶段;**doc/note**(`docs/**` 与 `.md/.mdx/.txt/.rst/.adoc`)在无活跃阶段或非 `exec_running` 相位也放行;**混合目标从严**(任一源码 → 按源码规则)。
206
+ - **bootstrap 例外(v1.3.3)**:无 `.openfeel/` 时,全部目标为**新增文件**(`apply_patch` 须全部 `*** Add File:`)→ 放行并提示补账本;已存在文件、`.openfeel/**`、Update/Delete/Move 仍拒绝(`enforce=always` 下)。`project`/`off` 放行。
207
+ - `apply_patch` 解析所有 patch 头(`*** Update/Add/Delete File:`、`*** Move to:`、`---/+++`);全部目标在 `.openfeel/**` 才内部放行,混合/无头保守拒绝。
208
+ - `enforce=off` **完全不注册 guard**(连 flow.json/status.md 也不拦)。
209
+ - `ctx.tools.guard` 缺失时记警告并降级;`ctx.effect` 负责 disposer,避免 HMR 累积。
210
+
211
+ **逃生通道**:`pwsh` / `bash` 默认不守,仍可直接写盘;`enforce=always` 对非 OpenFeel 工作区较激进,可用 `project` / `off` opt-out。
212
+
187
213
  ---
188
214
 
189
215
  ## 7. 验证
190
216
 
191
- 三套测试,全部本地可跑:
217
+ 四套测试,全部本地可跑:
192
218
 
193
219
  ```powershell
194
220
  cd plugin
195
221
  node test/contract.js # DSH 契约:schema 子集、无 type:null、参数契约(42 项)
196
- node test/verify.js # 行为:真实 CLI + 真实 .openfeel 副本(77 项)
222
+ node test/verify.js # 行为:真实 CLI + 真实 .openfeel 副本(83 项)
223
+ node test/guard.js # 写入门禁:fake ToolExecution + 临时工作区(36 项)
197
224
  node test/integration.js # 真实注册表:真 cordis + 真 ToolRuntime 挂载(10 项)
198
225
  ```
199
226
 
200
227
  - `contract.js` 用宿主 asar 提取出的**真实** `assertSupportedJsonSchema`。
201
228
  - `verify.js` 对真实 OpenFeel 项目做只读校验,**所有写操作只打在 `os.tmpdir()` 副本上**,并断言原项目 `revision` 未被改动。
229
+ - `guard.js` 覆盖 `off/project/always`、`.openfeel/**` 产物、`exec_running`、general 需求、apply_patch 混合/无头/Move 同块、受保护路径、bootstrap 文案等 36 条。
202
230
  - `integration.js` 构造真实 Cordis 上下文 + 真实 `ToolRuntime`,调用适配器 `apply()`,断言 13 个工具真的完成注册与投影。
203
231
 
204
- 依赖提取:三套测试默认读 `%TEMP%\dsh-asar\dsh\node_modules\@deepseek-ai`(从宿主
232
+ 依赖提取:`contract.js` / `integration.js` 默认读 `%TEMP%\dsh-asar\dsh\node_modules\@deepseek-ai`(从宿主
205
233
  `app.asar` 解出的包)。缺失时 `contract.js` / `integration.js` 会跳过并说明。
206
234
 
207
235
  ---
@@ -215,6 +243,7 @@ dsh/ # OpenFeel 仓库内的一等适配器目录
215
243
  ├── cordis.patch.yml # 一行 insert:id=openfeel-feel, name=openfeel-dsh
216
244
  ├── lib/
217
245
  │ ├── index.js # 插件入口:name / inject / apply / normalizeConfig
246
+ │ ├── guard.js # 写入门禁:enforce / .openfeel 产物区 / exec_running
218
247
  │ ├── adapters/
219
248
  │ │ ├── cli.js # CLI 执行器:可执行文件解析、UTF-8/无色/无日志、退出码语义
220
249
  │ │ ├── workspace.js # 会话工作区 = 项目根(与 CLI 一致,**不回溯**)
@@ -229,6 +258,7 @@ dsh/ # OpenFeel 仓库内的一等适配器目录
229
258
  └── test/
230
259
  ├── contract.js # DSH schema 契约
231
260
  ├── verify.js # 行为验证(真实 CLI)
261
+ ├── guard.js # 写入门禁矩阵(fake ToolExecution)
232
262
  └── integration.js # 真实注册表挂载
233
263
  ```
234
264
 
@@ -245,7 +275,7 @@ dsh/ # OpenFeel 仓库内的一等适配器目录
245
275
  在深层子目录返回空态可证 CLI 从不回溯)。判定项目以 `.openfeel/flow.json` 或
246
276
  `config.yaml` 为标记;`~/.openfeel/`(`openfeel setup` 的**全局家目录**)不含这些标记,
247
277
  因此不会被误判为项目。未命中项目时工具返回 `refusal` 并提示 `openfeel init`,
248
- 提示段则**完全不注入**。
278
+ 提示段注入**短 bootstrap**(`activation=auto`)而非完整 Feel 纪律;`enforce=always` 时写文件也会被门禁拒绝。
249
279
  > 若需要 monorepo(子目录里工作),那应作为 OpenFeel CLI 的能力
250
280
  > (如 `openfeel project resolve --json`)由各适配器共享,而不是每个 harness 各写一套回溯。
251
281
  3. **CLI 契约(v1.3.0)**:`flow next --json` 提供调度决策;`flow status --json` 的
@@ -262,3 +292,9 @@ dsh/ # OpenFeel 仓库内的一等适配器目录
262
292
  6. **超时**:默认单次 120s。超大 `flow.json`(数百 KB)的 `flow status` 可能接近上限。
263
293
  7. **不替代 agent 委派**:`feel_next` 给出负责 Agent 与 `[HANDOFF: agent]` 标记,实际派发
264
294
  由 DSH 的 `subagent` / `workflow` 完成——DSH 没有 OpenFeel 的 `Task` 语义。
295
+ 8. **硬门禁只覆盖文件修改工具**:`edit` / `write` / `apply_patch` / `str_replace_editor`;
296
+ `pwsh` / `bash` 默认不守,仍可直接写盘(显式逃生通道)。若需要 shell 级策略,属于后续
297
+ `guardShell` 的独立设计。
298
+ 9. **默认 `enforce=always` 较激进**:所有工作区(含非 OpenFeel)都会拦截文件写入,直到
299
+ `openfeel init` 或用户把 profile 的 `enforce` 改为 `project` / `off`。适合“OpenFeel 必须启用”
300
+ 的机器;普通试用建议 `project`。
@@ -24,3 +24,17 @@
24
24
  autoPrompt: true
25
25
  # 系统提示段语言:zh-CN | en
26
26
  language: zh-CN
27
+ # 未初始化工作区的提示策略:
28
+ # auto = 已初始化→完整 Feel 纪律;未初始化→短 bootstrap(默认)
29
+ # always = 所有工作区都注入完整 Feel 纪律
30
+ # off = 不注入任何提示
31
+ activation: auto
32
+ # 写入门禁(ctx.tools.guard):
33
+ # always = 所有工作区都拦截(默认;无 .openfeel 时也会拒绝写文件)
34
+ # project = 仅当会话工作区本身是 OpenFeel 项目时拦截
35
+ # off = 完全不注册 guard(含 flow.json/status.md 也不拦)
36
+ enforce: always
37
+ # general 需求在 in_progress 且无阶段时,允许源码写入(需求级例外)。
38
+ allowGeneral: true
39
+ # mutatingTools 默认:[edit, write, apply_patch, str_replace_editor]。
40
+ # 需要时显式覆盖;pwsh/bash 默认不守(显式逃生通道)。
@@ -191,7 +191,7 @@ export async function readSnapshot(cli, options = {}) {
191
191
  /** 相位标签由 `flow next` 下发;无权威值时退化为相位名(不维护本地映射)。 */
192
192
  phaseLabel: typeof next?.phaseLabel === 'string' ? next.phaseLabel : focusPhase,
193
193
  status: focusStage?.status ?? '',
194
- deps: Array.isArray(focusStage?.deps) ? focusStage.deps : [],
194
+ deps: Array.isArray(focusStage?.deps) ? [...focusStage.deps] : [],
195
195
  ops: focusStage?.ops ?? {},
196
196
  checkpoint: CHECKPOINT_OF_PHASE[focusPhase] ?? '',
197
197
  /** 负责该相位的 Agent(CLI 权威字段;无 flow next 时为 unknown)。 */
@@ -229,7 +229,7 @@ export async function readSnapshot(cli, options = {}) {
229
229
  id: stage.id ?? stage.name ?? '',
230
230
  phase: stage.phase ?? '',
231
231
  status: stage.status ?? '',
232
- deps: Array.isArray(stage.deps) ? stage.deps : [],
232
+ deps: Array.isArray(stage.deps) ? [...stage.deps] : [],
233
233
  workflowMode: stage.workflowMode ?? stage.workflow_mode ?? null,
234
234
  requirementId: stage.requirementId ?? null,
235
235
  reviewTier: stage.reviewTier ?? null,