openfeel 1.5.3 → 1.5.5

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 (41) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/flow.d.ts.map +1 -1
  3. package/dist/commands/flow.js +43 -0
  4. package/dist/commands/flow.js.map +1 -1
  5. package/dist/commands/plan.d.ts.map +1 -1
  6. package/dist/commands/plan.js +8 -0
  7. package/dist/commands/plan.js.map +1 -1
  8. package/dist/commands/req.d.ts.map +1 -1
  9. package/dist/commands/req.js +15 -0
  10. package/dist/commands/req.js.map +1 -1
  11. package/dist/core/config.js +2 -2
  12. package/dist/core/flow-manager.d.ts +24 -0
  13. package/dist/core/flow-manager.d.ts.map +1 -1
  14. package/dist/core/flow-manager.js +43 -0
  15. package/dist/core/flow-manager.js.map +1 -1
  16. package/dist/core/i18n-data/en.d.ts.map +1 -1
  17. package/dist/core/i18n-data/en.js +1 -0
  18. package/dist/core/i18n-data/en.js.map +1 -1
  19. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  20. package/dist/core/i18n-data/zh-CN.js +1 -0
  21. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  22. package/dist/core/preflight.d.ts +26 -0
  23. package/dist/core/preflight.d.ts.map +1 -0
  24. package/dist/core/preflight.js +102 -0
  25. package/dist/core/preflight.js.map +1 -0
  26. package/dist/core/template-loader.d.ts.map +1 -1
  27. package/dist/core/template-loader.js +22 -6
  28. package/dist/core/template-loader.js.map +1 -1
  29. package/dist/core/update.d.ts.map +1 -1
  30. package/dist/core/update.js +18 -2
  31. package/dist/core/update.js.map +1 -1
  32. package/dsh/ADAPTER.md +4 -2
  33. package/dsh/README.md +3 -1
  34. package/dsh/lib/adapters/cli.js +2 -0
  35. package/dsh/lib/adapters/dashboard.js +29 -0
  36. package/dsh/lib/adapters/preflight.js +30 -0
  37. package/dsh/lib/adapters/recovery.js +13 -0
  38. package/dsh/lib/surface/prompt.js +10 -0
  39. package/dsh/lib/tools/index.js +12 -1
  40. package/dsh/package.json +2 -2
  41. package/package.json +1 -1
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  OpenFeel 是一个 TypeScript CLI 工具,为 AI Agent 开发提供端到端的流程治理。核心理念:**「提示词瘦身,流程入工具」** —— Agent 不靠读长文本理解流程,而是通过 `flow.json` 获取当前状态和下一步指令。
12
12
 
13
- > 📦 **最新版本 v1.5.3**(批次:派发契约 + 恢复包 + 结构化交接 + 同步去重) — ① `feel_next.dispatch` 统一派发信封(子 agent 禁读状态文件、返回 ≤10 行);② `feel_status.recovery` 一次拿到 lastTransition / 交接摘要 / nextAction;③ 交接摘要采用 `done/next/block` 固定键;④ 状态未变时 `dev sync` 不重写 dev_last。发布节奏改为**批次发布**(小功能合并,不再单功能发版)。版本能力概览见 [docs/VERSIONS.md](docs/VERSIONS.md)。
13
+ > 📦 **最新版本 v1.5.5**(批次:preflight 账本 + 适配器补闸 + 禁止 shell 写状态 + 审查独立性) — ① `flow next`/`flow status` 记录 preflight,写命令校验 10 分钟窗口;② DSH 适配器默认 strict,`feel_status`/`feel_next` 返回 `preflight`;③ 提示段禁止 shell 写状态命令、要求独立审查(自审标 `self-review`)。无 JSON 契约变更;批次发布。版本能力概览见 [docs/VERSIONS.md](docs/VERSIONS.md)。
14
14
 
15
15
  > 📌 本项目基于 [AI_Prompt](https://github.com/Liuary/AI_Prompt) 开发,参考了 [OpenSpec](https://github.com/Fission-AI/OpenSpec) 等工具的设计思路。
16
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/commands/flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAimF1D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAE9G"}
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/commands/flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2oF1D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAE9G"}
@@ -12,6 +12,7 @@ import { addReviewEntry } from '../core/view/entry.js';
12
12
  import { failCli, failInternal, failRefusal, handleAddStageError, handleConcurrentConflict } from './shared/errors.js';
13
13
  import { withSchemaVersion, isJsonMode, emitJson } from './shared/json-output.js'; // JSON 契约助手(stage-95 op-001/op-002)
14
14
  import { t, getCliLang } from '../core/i18n.js';
15
+ import { preflightGate, recordPreflight } from '../core/preflight.js';
15
16
  import { getDevStatus, isSyncNodePhase, syncDevStatus } from '../core/dev-status.js';
16
17
  import { ARCHIVE_SCHEMA_VERSION } from '../core/flow-archive/archive-file.js';
17
18
  import { listArchivableCandidates, listBlockingOpenRevsForVersion, splitForArchive } from '../core/flow-archive/grouping.js';
@@ -32,6 +33,8 @@ export function registerFlowCommand(program) {
32
33
  .action((options) => {
33
34
  const lang = getCliLang(process.cwd());
34
35
  const mgr = createManager();
36
+ if (mgr.isLoaded())
37
+ recordPreflight(process.cwd());
35
38
  // B1-1:--json 分支须为首行输出且纯 JSON 单文档(不打印标题/颜色/提示行)
36
39
  if (options.json) {
37
40
  console.log(JSON.stringify(buildStatusJson(mgr), null, 2));
@@ -158,6 +161,7 @@ export function registerFlowCommand(program) {
158
161
  return;
159
162
  }
160
163
  const data = mgr.getData();
164
+ recordPreflight(process.cwd());
161
165
  const rawStage = data.pipeline.current.stage || '';
162
166
  // 双键回退(与 core resolveCurrentPhase / advanceStagePhase 同范式):归一化键优先,其次原始键
163
167
  const normalized = rawStage ? (normalizeStageId(rawStage) ?? rawStage) : '';
@@ -471,6 +475,18 @@ export function registerFlowCommand(program) {
471
475
  return;
472
476
  }
473
477
  console.log(store.summary(lang));
478
+ // v1.5.4:观测代理指标(人类输出;--json 键集不变)
479
+ const mgr = new FlowManager(process.cwd());
480
+ if (mgr.isLoaded()) {
481
+ const logStats = mgr.getLogStats();
482
+ const data = mgr.getData();
483
+ const active = data ? Object.values(data.stages).filter((stage) => stage.phase !== 'done').length : 0;
484
+ const en = lang === 'en';
485
+ console.log('');
486
+ console.log(en ? '── Observability ──' : '── 观测指标 ──');
487
+ console.log(` ${en ? 'flow.log' : 'flow.log'}: ${logStats.entries} entries / ${logStats.bytes} bytes`);
488
+ console.log(` ${en ? 'active stages' : '活跃阶段'}: ${active}`);
489
+ }
474
490
  });
475
491
  // flow phases — 自描述:列出全部合法 phase 与运行时转移表
476
492
  flow
@@ -908,6 +924,17 @@ export function registerFlowCommand(program) {
908
924
  failCli({ code: 'NO_INIT', message, detail: null, stderrLines: [message] });
909
925
  return;
910
926
  }
927
+ // v1.5.5:先读状态再写状态(strict 拒绝;warn 仅 TTY 提示)
928
+ const preflight = preflightGate(process.cwd(), t('flow.preflightRequiredTmpl', lang));
929
+ if (!preflight.ok) {
930
+ failCli({
931
+ code: 'INVALID_ARGUMENT',
932
+ message: preflight.message,
933
+ detail: { reason: 'preflight-required', hint: 'openfeel flow next --json' },
934
+ stderrLines: [preflight.message],
935
+ });
936
+ return;
937
+ }
911
938
  // REV-005:命令层归一化(短名 → 全名),与 plan.ts / flow.ts 其它 stage 解析点同范式
912
939
  const stageArg = normalizeStageId(options.stage) ?? options.stage;
913
940
  // P1-4:双开关**显式**组合不一致 → 显式告警(仅「auto + auto_advance=disabled」这一静默无效组合;
@@ -1416,6 +1443,22 @@ export function registerFlowCommand(program) {
1416
1443
  }
1417
1444
  console.log('');
1418
1445
  }
1446
+ // v1.5.4:阶段摘要(从最近 200 条日志派生;人类输出,不改 --json 契约)
1447
+ const activeStage = data.pipeline.current.stage
1448
+ || Object.entries(data.stages).find(([, stage]) => stage.phase !== 'done')?.[0]
1449
+ || '';
1450
+ if (activeStage !== '') {
1451
+ const s = mgr.getStageLogSummary(activeStage);
1452
+ const en = lang === 'en';
1453
+ console.log(en ? `── Stage summary: ${activeStage} ──` : `── 阶段摘要:${activeStage} ──`);
1454
+ if (s.lastTransition !== null) {
1455
+ console.log(` ${en ? 'last transition' : '最近转换'}: ${s.lastTransition.from} → ${s.lastTransition.to} @ ${s.lastTransition.time}`);
1456
+ }
1457
+ if (s.lastError !== null) {
1458
+ console.log(` ${en ? 'last failure' : '最近失败'}: ${s.lastError.phase} @ ${s.lastError.time}`);
1459
+ }
1460
+ console.log(` ${en ? 'resume count' : 'resume 次数'}: ${s.resumeCount}`);
1461
+ }
1419
1462
  });
1420
1463
  // flow review — 审查子命令组
1421
1464
  const reviewCmd = flow