openfeel 1.2.3 → 1.2.4
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.
- package/README.en.md +11 -0
- package/README.md +12 -1
- package/README.zh-CN.md +11 -0
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +13 -2
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +38 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +45 -12
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +78 -39
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +86 -8
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +21 -1
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/roadmap.d.ts.map +1 -1
- package/dist/commands/roadmap.js +21 -2
- package/dist/commands/roadmap.js.map +1 -1
- package/dist/core/archive/merge.d.ts +16 -1
- package/dist/core/archive/merge.d.ts.map +1 -1
- package/dist/core/archive/merge.js +27 -4
- package/dist/core/archive/merge.js.map +1 -1
- package/dist/core/config.js +2 -2
- package/dist/core/errors.d.ts +8 -3
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +6 -3
- package/dist/core/errors.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +11 -0
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +11 -0
- package/dist/core/i18n-data/zh-CN.js.map +1 -1
- package/dist/core/plan/roadmap.d.ts +29 -0
- package/dist/core/plan/roadmap.d.ts.map +1 -1
- package/dist/core/plan/roadmap.js +95 -0
- package/dist/core/plan/roadmap.js.map +1 -1
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +26 -16
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +22 -12
- package/dist/core/update.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,14 +8,32 @@ import { existsSync, mkdirSync } from 'node:fs';
|
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { atomicWriteFileSync } from '../fs/atomic-write.js';
|
|
10
10
|
import { initKnowledgeBase, addKnowledgeEntry } from '../workspace/knowledge.js';
|
|
11
|
+
/**
|
|
12
|
+
* 归档文件已存在错误(A1 数据安全保护)。
|
|
13
|
+
* 在解析到阶段后、任何写盘之前抛出,保证拒绝路径零写盘。
|
|
14
|
+
*/
|
|
15
|
+
export class ArchiveExistsError extends Error {
|
|
16
|
+
/** 用户输入的阶段名原值 */
|
|
17
|
+
stage;
|
|
18
|
+
/** 本次命令的目标归档文件绝对路径 */
|
|
19
|
+
archivePath;
|
|
20
|
+
constructor(stage, archivePath) {
|
|
21
|
+
super(`归档文件已存在:${archivePath}`);
|
|
22
|
+
this.name = 'ArchiveExistsError';
|
|
23
|
+
this.stage = stage;
|
|
24
|
+
this.archivePath = archivePath;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
11
27
|
/**
|
|
12
28
|
* 归档指定阶段
|
|
13
29
|
* 汇总阶段产出、生成 Markdown 摘要、提取知识条目并写入归档文件
|
|
14
30
|
* @param projectPath 项目路径
|
|
15
31
|
* @param stageName 阶段名称(如 stage-06)
|
|
32
|
+
* @param options.force 显式覆盖已有归档文件(仅绕过文件覆盖保护)
|
|
16
33
|
* @returns ArchiveResult,若 flow.json 未加载或阶段不存在则返回 null
|
|
34
|
+
* @throws ArchiveExistsError 目标归档文件已存在且未显式 force(零写盘)
|
|
17
35
|
*/
|
|
18
|
-
export function archiveStage(projectPath, stageName) {
|
|
36
|
+
export function archiveStage(projectPath, stageName, options) {
|
|
19
37
|
const mgr = new FlowManager(projectPath);
|
|
20
38
|
// 若 flow.json 未加载,返回 null
|
|
21
39
|
if (!mgr.isLoaded()) {
|
|
@@ -33,6 +51,13 @@ export function archiveStage(projectPath, stageName) {
|
|
|
33
51
|
if (!stage) {
|
|
34
52
|
return null;
|
|
35
53
|
}
|
|
54
|
+
// A1 数据安全:目标文件存在性检查必须位于任何写盘(mkdir / 归档文件 / flow.json / KB)之前。
|
|
55
|
+
// 保护为归档文件级:目标文件名由本次输入原值派生,别名(短名/全名)派生不同文件、互不触发。
|
|
56
|
+
const logDir = join(projectPath, '.openfeel', 'log');
|
|
57
|
+
const archivePath = join(logDir, `archive-${stageName}.md`);
|
|
58
|
+
if (existsSync(archivePath) && options?.force !== true) {
|
|
59
|
+
throw new ArchiveExistsError(stageName, archivePath);
|
|
60
|
+
}
|
|
36
61
|
// 统计该阶段所有 ops
|
|
37
62
|
const ops = Object.values(stage.ops);
|
|
38
63
|
const opsCount = ops.length;
|
|
@@ -82,13 +107,11 @@ ${reviewRows}
|
|
|
82
107
|
const knowledgeExtracts = relatedReviews
|
|
83
108
|
.filter((r) => r.status === 'closed' || r.status === 'resolved')
|
|
84
109
|
.map((r) => `[${r.id}] ${r.title}`);
|
|
85
|
-
// 确保 .openfeel/log/
|
|
86
|
-
const logDir = join(projectPath, '.openfeel', 'log');
|
|
110
|
+
// 确保 .openfeel/log/ 目录存在(仅在通过覆盖保护后才会执行)
|
|
87
111
|
if (!existsSync(logDir)) {
|
|
88
112
|
mkdirSync(logDir, { recursive: true });
|
|
89
113
|
}
|
|
90
114
|
// 写入归档摘要文件(每阶段唯一,不加锁;flow 同步走 mgr.save())
|
|
91
|
-
const archivePath = join(logDir, `archive-${stageName}.md`);
|
|
92
115
|
atomicWriteFileSync(archivePath, summary);
|
|
93
116
|
// 追加归档日志到 flow.json
|
|
94
117
|
mgr.appendLog({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/core/archive/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/core/archive/merge.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
|
@@ -349,7 +349,7 @@ const CONFIG_TEMPLATE_ZH = `# .openfeel/config.yaml
|
|
|
349
349
|
# 本文件为所有阶段提供默认值,status.md 可覆盖
|
|
350
350
|
|
|
351
351
|
meta:
|
|
352
|
-
version: 1.2.
|
|
352
|
+
version: 1.2.4
|
|
353
353
|
project: OpenFeel
|
|
354
354
|
tech_stack: TypeScript
|
|
355
355
|
|
|
@@ -405,7 +405,7 @@ const CONFIG_TEMPLATE_EN = `# .openfeel/config.yaml
|
|
|
405
405
|
# This file provides defaults for all stages; status.md can override
|
|
406
406
|
|
|
407
407
|
meta:
|
|
408
|
-
version: 1.2.
|
|
408
|
+
version: 1.2.4
|
|
409
409
|
project: OpenFeel
|
|
410
410
|
tech_stack: TypeScript
|
|
411
411
|
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CLI 稳定错误码表(v1.2.2-stage-95 op-002)
|
|
3
3
|
*
|
|
4
4
|
* 职责:提供 `code → kind → exitCode` 的**单一权威**映射,供命令层与测试共用。
|
|
5
|
-
* 契约:`docs/json-contract.md` §3(
|
|
5
|
+
* 契约:`docs/json-contract.md` §3(13 行,逐行同源);本文件为唯一实现来源,命令层不得硬编码 kind / exitCode。
|
|
6
6
|
* 边界:仅定义分类,不承担输出控制(envelope / stderr 归 `src/commands/shared/errors.ts`)。
|
|
7
7
|
*/
|
|
8
8
|
/** 错误分类:预期拒绝 / 内部故障(分类权威;退出码为冗余信号) */
|
|
@@ -16,7 +16,7 @@ export interface CliErrorSpec {
|
|
|
16
16
|
exitCode: CliExitCode;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* 13 个稳定错误码(kind 与 exitCode 内嵌,禁止命令层自行推导)。
|
|
20
20
|
* 顺序与 `docs/json-contract.md` §3 逐行一致。
|
|
21
21
|
*/
|
|
22
22
|
export declare const CLI_ERROR_CODES: {
|
|
@@ -80,10 +80,15 @@ export declare const CLI_ERROR_CODES: {
|
|
|
80
80
|
readonly kind: "refusal";
|
|
81
81
|
readonly exitCode: 1;
|
|
82
82
|
};
|
|
83
|
+
readonly ARCHIVE_EXISTS: {
|
|
84
|
+
readonly code: "ARCHIVE_EXISTS";
|
|
85
|
+
readonly kind: "refusal";
|
|
86
|
+
readonly exitCode: 1;
|
|
87
|
+
};
|
|
83
88
|
};
|
|
84
89
|
/** 稳定错误码联合类型(由码表键派生,防字符串漂移) */
|
|
85
90
|
export type CliErrorCode = keyof typeof CLI_ERROR_CODES;
|
|
86
|
-
/** 有序
|
|
91
|
+
/** 有序 13 行映射表(顺序与契约文档 §3 逐行一致,供测试逐行断言) */
|
|
87
92
|
export declare const CLI_ERROR_TABLE: readonly CliErrorSpec[];
|
|
88
93
|
/**
|
|
89
94
|
* 按 code 取错误规格(kind / exitCode 的唯一读取入口)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sCAAsC;AACtC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAElD,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sCAAsC;AACtC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAElD,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBlB,CAAC;AAEX,+BAA+B;AAC/B,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,eAAe,CAAC;AAExD,0CAA0C;AAC1C,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAclD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAE1D"}
|
package/dist/core/errors.js
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* CLI 稳定错误码表(v1.2.2-stage-95 op-002)
|
|
3
3
|
*
|
|
4
4
|
* 职责:提供 `code → kind → exitCode` 的**单一权威**映射,供命令层与测试共用。
|
|
5
|
-
* 契约:`docs/json-contract.md` §3(
|
|
5
|
+
* 契约:`docs/json-contract.md` §3(13 行,逐行同源);本文件为唯一实现来源,命令层不得硬编码 kind / exitCode。
|
|
6
6
|
* 边界:仅定义分类,不承担输出控制(envelope / stderr 归 `src/commands/shared/errors.ts`)。
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* 13 个稳定错误码(kind 与 exitCode 内嵌,禁止命令层自行推导)。
|
|
10
10
|
* 顺序与 `docs/json-contract.md` §3 逐行一致。
|
|
11
11
|
*/
|
|
12
12
|
export const CLI_ERROR_CODES = {
|
|
@@ -23,8 +23,10 @@ export const CLI_ERROR_CODES = {
|
|
|
23
23
|
INTERNAL_ERROR: { code: 'INTERNAL_ERROR', kind: 'internal', exitCode: 3 },
|
|
24
24
|
// stage-97 预留:archive <stage> --json 失败(本阶段不实现,仅登记映射)
|
|
25
25
|
ARCHIVE_FAILED: { code: 'ARCHIVE_FAILED', kind: 'refusal', exitCode: 1 },
|
|
26
|
+
// v1.2.4 A1:目标归档文件已存在且未显式 --force(零写盘拒绝)
|
|
27
|
+
ARCHIVE_EXISTS: { code: 'ARCHIVE_EXISTS', kind: 'refusal', exitCode: 1 },
|
|
26
28
|
};
|
|
27
|
-
/** 有序
|
|
29
|
+
/** 有序 13 行映射表(顺序与契约文档 §3 逐行一致,供测试逐行断言) */
|
|
28
30
|
export const CLI_ERROR_TABLE = [
|
|
29
31
|
CLI_ERROR_CODES.NO_INIT,
|
|
30
32
|
CLI_ERROR_CODES.INVALID_ARGUMENT,
|
|
@@ -38,6 +40,7 @@ export const CLI_ERROR_TABLE = [
|
|
|
38
40
|
CLI_ERROR_CODES.FLOW_CONCURRENT_CONFLICT,
|
|
39
41
|
CLI_ERROR_CODES.INTERNAL_ERROR,
|
|
40
42
|
CLI_ERROR_CODES.ARCHIVE_FAILED,
|
|
43
|
+
CLI_ERROR_CODES.ARCHIVE_EXISTS,
|
|
41
44
|
];
|
|
42
45
|
/**
|
|
43
46
|
* 按 code 取错误规格(kind / exitCode 的唯一读取入口)。
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC1D,gBAAgB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5E,eAAe,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC1E,wBAAwB,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5F,oBAAoB,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IACpF,gBAAgB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5E,qBAAqB,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IACtF,oBAAoB,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;IACrF,iBAAiB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC9E,wBAAwB,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5F,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;IACzE,sDAAsD;IACtD,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;CAChE,CAAC;AAKX,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,eAAe,CAAC,OAAO;IACvB,eAAe,CAAC,gBAAgB;IAChC,eAAe,CAAC,eAAe;IAC/B,eAAe,CAAC,wBAAwB;IACxC,eAAe,CAAC,oBAAoB;IACpC,eAAe,CAAC,gBAAgB;IAChC,eAAe,CAAC,qBAAqB;IACrC,eAAe,CAAC,oBAAoB;IACpC,eAAe,CAAC,iBAAiB;IACjC,eAAe,CAAC,wBAAwB;IACxC,eAAe,CAAC,cAAc;IAC9B,eAAe,CAAC,cAAc;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACnD,CAAC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC1D,gBAAgB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5E,eAAe,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC1E,wBAAwB,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5F,oBAAoB,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IACpF,gBAAgB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5E,qBAAqB,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IACtF,oBAAoB,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;IACrF,iBAAiB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC9E,wBAAwB,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC5F,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;IACzE,sDAAsD;IACtD,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IACxE,yCAAyC;IACzC,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;CAChE,CAAC;AAKX,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,eAAe,CAAC,OAAO;IACvB,eAAe,CAAC,gBAAgB;IAChC,eAAe,CAAC,eAAe;IAC/B,eAAe,CAAC,wBAAwB;IACxC,eAAe,CAAC,oBAAoB;IACpC,eAAe,CAAC,gBAAgB;IAChC,eAAe,CAAC,qBAAqB;IACrC,eAAe,CAAC,oBAAoB;IACpC,eAAe,CAAC,iBAAiB;IACjC,eAAe,CAAC,wBAAwB;IACxC,eAAe,CAAC,cAAc;IAC9B,eAAe,CAAC,cAAc;IAC9B,eAAe,CAAC,cAAc;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UA6BpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAmUlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UAiCpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA8CrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAgCnB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoClB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UA6BpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAmUlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UAiCpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA8CrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAgCnB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoClB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAQrB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAAe,CAAC;AAGtC,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,UAAe,CAAC;AAG3C,eAAO,MAAM,IAAI,EAAE,UAclB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoUlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UA+BpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA4BrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAqBnB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAenB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAUrB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,GAAG,EAAE,UA6EjB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAsBlE,CAAC"}
|
|
@@ -549,6 +549,7 @@ export const knowledge = {
|
|
|
549
549
|
/* ==================== archive ==================== */
|
|
550
550
|
export const archive = {
|
|
551
551
|
'errorArchiveFailedTmpl': { key: 'archive.errorArchiveFailedTmpl', zh: '', en: 'Error: Archive failed, please confirm stage "{stage}" exists and flow.json is initialized.' },
|
|
552
|
+
'errorArchiveExistsTmpl': { key: 'archive.errorArchiveExistsTmpl', zh: '', en: 'Error: the archive file for stage "{stage}" already exists ({path}); pass --force to overwrite explicitly.' },
|
|
552
553
|
'okTmpl': { key: 'archive.okTmpl', zh: '', en: '✓ Stage archived: {stage}' },
|
|
553
554
|
'opsCount': { key: 'archive.opsCount', zh: '', en: 'Ops' },
|
|
554
555
|
'reviewsCount': { key: 'archive.reviewsCount', zh: '', en: 'Review Entries' },
|
|
@@ -581,6 +582,7 @@ export const lint = {
|
|
|
581
582
|
'kb.okTmpl': { key: 'lint.kb.okTmpl', zh: '', en: '✅ No stale references (checked {n} reference(s))' },
|
|
582
583
|
'kb.staleTmpl': { key: 'lint.kb.staleTmpl', zh: '', en: '❌ Found {n} stale reference(s)' },
|
|
583
584
|
'kb.staleItemTmpl': { key: 'lint.kb.staleItemTmpl', zh: '', en: ' {file} L{line}: "{ref}" → file not found' },
|
|
585
|
+
'kb.issueTmpl': { key: 'lint.kb.issueTmpl', zh: '', en: 'L{line}: "{ref}" → file not found' },
|
|
584
586
|
};
|
|
585
587
|
/* ==================== help ==================== */
|
|
586
588
|
export const help = {
|
|
@@ -684,6 +686,7 @@ export const help = {
|
|
|
684
686
|
'flow.review.remove.argrev-id': { key: 'help.flow.review.remove.argrev-id', zh: '', en: 'Review entry ID (e.g. REV-001)' },
|
|
685
687
|
'flow.retry': { key: 'help.flow.retry', zh: '', en: 'Query operation retry status' },
|
|
686
688
|
'flow.retry.op': { key: 'help.flow.retry.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
689
|
+
'flow.retry.json': { key: 'help.flow.retry.json', zh: '', en: 'Output { schemaVersion, op, attempts, maxAttempts, exhausted, state } as JSON' },
|
|
687
690
|
'flow.repair': { key: 'help.flow.repair', zh: '', en: 'Auto-detect and fix common issues in flow.json' },
|
|
688
691
|
'flow.repair.dryRun': { key: 'help.flow.repair.dryRun', zh: '', en: 'Detect only, do not fix' },
|
|
689
692
|
'flow.repair.backup': { key: 'help.flow.repair.backup', zh: '', en: 'Backup as .bak before repair' },
|
|
@@ -715,6 +718,7 @@ export const help = {
|
|
|
715
718
|
'config.get': { key: 'help.config.get', zh: '', en: 'Read a config value (project config; --global reads global profile; keys accept defaults.X, equivalent to X)' },
|
|
716
719
|
'config.get.global': { key: 'help.config.get.global', zh: '', en: 'Operate on global profile (~/.config/openfeel/profile.yaml)' },
|
|
717
720
|
'config.get.json': { key: 'help.config.get.json', zh: '', en: 'Output as JSON (single JSON document with schemaVersion)' },
|
|
721
|
+
'config.get.all': { key: 'help.config.get.all', zh: '', en: 'Read all project defaults at once (four keys; cannot combine with --global or a key)' },
|
|
718
722
|
'config.set': { key: 'help.config.set', zh: '', en: 'Set a config value (project config; --global writes global profile; keys accept defaults.X, equivalent to X)' },
|
|
719
723
|
'config.set.global': { key: 'help.config.set.global', zh: '', en: 'Operate on global profile (~/.config/openfeel/profile.yaml)' },
|
|
720
724
|
'config.effective': { key: 'help.config.effective', zh: '', en: 'Show effective config values and their source (status.md > config.yaml > profile.yaml > builtin)' },
|
|
@@ -729,6 +733,7 @@ export const help = {
|
|
|
729
733
|
'plan.stage.add.argname': { key: 'help.plan.stage.add.argname', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
730
734
|
'plan.stage.add.tasks': { key: 'help.plan.stage.add.tasks', zh: '', en: 'Initial task list (space- or comma-separated, written to status.md)' },
|
|
731
735
|
'plan.stage.list': { key: 'help.plan.stage.list', zh: '', en: 'List all work stages' },
|
|
736
|
+
'plan.stage.list.json': { key: 'help.plan.stage.list.json', zh: '', en: 'Output { schemaVersion, stages: [{ id, phase, status, deps, workflowMode, opsTotal, opsDone }], count } as JSON' },
|
|
732
737
|
'plan.scheme': { key: 'help.plan.scheme', zh: '', en: 'Operation scheme management' },
|
|
733
738
|
'plan.scheme.create': { key: 'help.plan.scheme.create', zh: '', en: 'Create operation scheme' },
|
|
734
739
|
'plan.scheme.create.argstage': { key: 'help.plan.scheme.create.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
@@ -804,11 +809,13 @@ export const help = {
|
|
|
804
809
|
'archive': { key: 'help.archive', zh: '', en: 'Archive stage (summarize output, generate summary, extract knowledge)' },
|
|
805
810
|
'archive.argstage': { key: 'help.archive.argstage', zh: '', en: 'Stage name (e.g. stage-06)' },
|
|
806
811
|
'archive.json': { key: 'help.archive.json', zh: '', en: 'Output { schemaVersion, stage, archivePath, opsCount, reviewsCount, knowledgeExtracts } as JSON' },
|
|
812
|
+
'archive.force': { key: 'help.archive.force', zh: '', en: 'Explicitly overwrite an existing archive file (refused by default with zero writes)' },
|
|
807
813
|
'roadmap': { key: 'help.roadmap', zh: '', en: 'Roadmap management' },
|
|
808
814
|
'roadmap.create': { key: 'help.roadmap.create', zh: '', en: 'Create roadmap (version number like 1.0, 2.0)' },
|
|
809
815
|
'roadmap.create.argversion': { key: 'help.roadmap.create.argversion', zh: '', en: 'Version number' },
|
|
810
816
|
'roadmap.show': { key: 'help.roadmap.show', zh: '', en: 'Show roadmap content (list all if no version)' },
|
|
811
817
|
'roadmap.show.argversion': { key: 'help.roadmap.show.argversion', zh: '', en: 'Version number (optional)' },
|
|
818
|
+
'roadmap.show.json': { key: 'help.roadmap.show.json', zh: '', en: 'Output { schemaVersion, version, milestones: [{ title, theme, stage, deliverable }] } as JSON' },
|
|
812
819
|
'instructions': { key: 'help.instructions', zh: '', en: 'Generate structured instructions (XML or JSON) for an artifact' },
|
|
813
820
|
'instructions.argartifactId': { key: 'help.instructions.argartifactId', zh: '', en: 'Target artifact ID (e.g. proposal, implementation)' },
|
|
814
821
|
'instructions.change': { key: 'help.instructions.change', zh: '', en: 'Change name (e.g. feat-login)' },
|
|
@@ -816,7 +823,9 @@ export const help = {
|
|
|
816
823
|
'instructions.schema': { key: 'help.instructions.schema', zh: '', en: 'Schema name (default spec-driven)' },
|
|
817
824
|
'lint': { key: 'help.lint', zh: '', en: 'Project health checks (i18n key consistency, kb reference validity)' },
|
|
818
825
|
'lint.i18n': { key: 'help.lint.i18n', zh: '', en: 'Validate i18n key consistency (empty values / zh-CN-only / en-only keys)' },
|
|
826
|
+
'lint.i18n.json': { key: 'help.lint.i18n.json', zh: '', en: 'Output { schemaVersion, target, ok, issues: [{ path, message }] } as JSON' },
|
|
819
827
|
'lint.kb': { key: 'help.lint.kb', zh: '', en: 'Detect stale file references in .openfeel/kb/' },
|
|
828
|
+
'lint.kb.json': { key: 'help.lint.kb.json', zh: '', en: 'Output { schemaVersion, target, ok, issues: [{ path, message }] } as JSON' },
|
|
820
829
|
// migrate (legacy layout migration)
|
|
821
830
|
'migrate': { key: 'help.migrate', zh: '', en: 'Legacy layout migration (detect/backup/migrate/rollback existing project legacy layout)' },
|
|
822
831
|
'migrate.dryRun': { key: 'help.migrate.dryRun', zh: '', en: 'Detect and preview only, do not write' },
|
|
@@ -832,8 +841,10 @@ export const help = {
|
|
|
832
841
|
'model.set.force': { key: 'help.model.set.force', zh: '', en: 'Confirm modifying the framework default (required for --scope default in non-TTY)' },
|
|
833
842
|
'model.get': { key: 'help.model.get', zh: '', en: 'Read the model of a given agent' },
|
|
834
843
|
'model.get.scope': { key: 'help.model.get.scope', zh: '', en: 'Scope (omit to show effective value)' },
|
|
844
|
+
'model.get.json': { key: 'help.model.get.json', zh: '', en: 'Output { schemaVersion, scope, agent, provider, model, source } as JSON' },
|
|
835
845
|
'model.list': { key: 'help.model.list', zh: '', en: 'List models of all agents' },
|
|
836
846
|
'model.list.scope': { key: 'help.model.list.scope', zh: '', en: 'Scope (omit to show effective value)' },
|
|
847
|
+
'model.list.json': { key: 'help.model.list.json', zh: '', en: 'Output { schemaVersion, scope, agents: [{ agent, provider, model, source }] } as JSON' },
|
|
837
848
|
// req (requirement flow command group)
|
|
838
849
|
'req': { key: 'help.req', zh: '', en: 'Requirement management (add/list/show/claim/release/set/link/advance/board/next)' },
|
|
839
850
|
'req.add': { key: 'help.req.add', zh: '', en: 'Create a requirement (auto ID; body skeleton under .openfeel/requirements/)' },
|