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.
- package/LICENSE +21 -0
- package/README.en.md +140 -0
- package/README.md +17 -0
- package/README.zh-CN.md +140 -0
- package/bin/openfeel.js +13 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +119 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.d.ts +10 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +74 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/commands/archive.d.ts +7 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +38 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +208 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/flow.d.ts +24 -0
- package/dist/commands/flow.d.ts.map +1 -0
- package/dist/commands/flow.js +1024 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +62 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/instructions.d.ts +7 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +36 -0
- package/dist/commands/instructions.js.map +1 -0
- package/dist/commands/knowledge.d.ts +7 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +174 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/lint.d.ts +12 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +192 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/plan.d.ts +7 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +73 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/project.d.ts +7 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +189 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/roadmap.d.ts +7 -0
- package/dist/commands/roadmap.d.ts.map +1 -0
- package/dist/commands/roadmap.js +26 -0
- package/dist/commands/roadmap.js.map +1 -0
- package/dist/commands/stage.d.ts +17 -0
- package/dist/commands/stage.d.ts.map +1 -0
- package/dist/commands/stage.js +291 -0
- package/dist/commands/stage.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +87 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/view.d.ts +7 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +77 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/core/archive/merge.d.ts +20 -0
- package/dist/core/archive/merge.d.ts.map +1 -0
- package/dist/core/archive/merge.js +118 -0
- package/dist/core/archive/merge.js.map +1 -0
- package/dist/core/artifact-graph/graph.d.ts +62 -0
- package/dist/core/artifact-graph/graph.d.ts.map +1 -0
- package/dist/core/artifact-graph/graph.js +184 -0
- package/dist/core/artifact-graph/graph.js.map +1 -0
- package/dist/core/artifact-graph/index.d.ts +10 -0
- package/dist/core/artifact-graph/index.d.ts.map +1 -0
- package/dist/core/artifact-graph/index.js +8 -0
- package/dist/core/artifact-graph/index.js.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +35 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.js +358 -0
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
- package/dist/core/artifact-graph/resolver.d.ts +10 -0
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
- package/dist/core/artifact-graph/resolver.js +32 -0
- package/dist/core/artifact-graph/resolver.js.map +1 -0
- package/dist/core/artifact-graph/state.d.ts +9 -0
- package/dist/core/artifact-graph/state.d.ts.map +1 -0
- package/dist/core/artifact-graph/state.js +24 -0
- package/dist/core/artifact-graph/state.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +22 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -0
- package/dist/core/artifact-graph/types.js +2 -0
- package/dist/core/artifact-graph/types.js.map +1 -0
- package/dist/core/config.d.ts +256 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +393 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/flow-manager.d.ts +492 -0
- package/dist/core/flow-manager.d.ts.map +1 -0
- package/dist/core/flow-manager.js +2379 -0
- package/dist/core/flow-manager.js.map +1 -0
- package/dist/core/i18n-data/en.d.ts +26 -0
- package/dist/core/i18n-data/en.d.ts.map +1 -0
- package/dist/core/i18n-data/en.js +492 -0
- package/dist/core/i18n-data/en.js.map +1 -0
- package/dist/core/i18n-data/types.d.ts +18 -0
- package/dist/core/i18n-data/types.d.ts.map +1 -0
- package/dist/core/i18n-data/types.js +8 -0
- package/dist/core/i18n-data/types.js.map +1 -0
- package/dist/core/i18n-data/zh-CN.d.ts +28 -0
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -0
- package/dist/core/i18n-data/zh-CN.js +524 -0
- package/dist/core/i18n-data/zh-CN.js.map +1 -0
- package/dist/core/i18n.d.ts +40 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/i18n.js +135 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/init.d.ts +22 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +292 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/metrics.d.ts +60 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +137 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/pipeline-schema.d.ts +78 -0
- package/dist/core/pipeline-schema.d.ts.map +1 -0
- package/dist/core/pipeline-schema.js +57 -0
- package/dist/core/pipeline-schema.js.map +1 -0
- package/dist/core/plan/roadmap.d.ts +17 -0
- package/dist/core/plan/roadmap.d.ts.map +1 -0
- package/dist/core/plan/roadmap.js +71 -0
- package/dist/core/plan/roadmap.js.map +1 -0
- package/dist/core/plan/scheme.d.ts +34 -0
- package/dist/core/plan/scheme.d.ts.map +1 -0
- package/dist/core/plan/scheme.js +262 -0
- package/dist/core/plan/scheme.js.map +1 -0
- package/dist/core/plan/stage.d.ts +20 -0
- package/dist/core/plan/stage.d.ts.map +1 -0
- package/dist/core/plan/stage.js +120 -0
- package/dist/core/plan/stage.js.map +1 -0
- package/dist/core/public-logger.d.ts +84 -0
- package/dist/core/public-logger.d.ts.map +1 -0
- package/dist/core/public-logger.js +344 -0
- package/dist/core/public-logger.js.map +1 -0
- package/dist/core/schema.d.ts +70 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +61 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/template-loader.d.ts +22 -0
- package/dist/core/template-loader.d.ts.map +1 -0
- package/dist/core/template-loader.js +2848 -0
- package/dist/core/template-loader.js.map +1 -0
- package/dist/core/templates.d.ts +18 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +50 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/update.d.ts +40 -0
- package/dist/core/update.d.ts.map +1 -0
- package/dist/core/update.js +1569 -0
- package/dist/core/update.js.map +1 -0
- package/dist/core/view/entry.d.ts +37 -0
- package/dist/core/view/entry.d.ts.map +1 -0
- package/dist/core/view/entry.js +108 -0
- package/dist/core/view/entry.js.map +1 -0
- package/dist/core/workspace/identity.d.ts +60 -0
- package/dist/core/workspace/identity.d.ts.map +1 -0
- package/dist/core/workspace/identity.js +169 -0
- package/dist/core/workspace/identity.js.map +1 -0
- package/dist/core/workspace/knowledge.d.ts +55 -0
- package/dist/core/workspace/knowledge.d.ts.map +1 -0
- package/dist/core/workspace/knowledge.js +230 -0
- package/dist/core/workspace/knowledge.js.map +1 -0
- package/dist/core/workspace/structure.d.ts +9 -0
- package/dist/core/workspace/structure.d.ts.map +1 -0
- package/dist/core/workspace/structure.js +59 -0
- package/dist/core/workspace/structure.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/kb-dedup.d.ts +46 -0
- package/dist/utils/kb-dedup.d.ts.map +1 -0
- package/dist/utils/kb-dedup.js +169 -0
- package/dist/utils/kb-dedup.js.map +1 -0
- package/dist/utils/path.d.ts +22 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +37 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +61 -0
- package/schemas/spec-driven/schema.yaml +50 -0
- package/schemas/spec-driven/templates/design.md +43 -0
- package/schemas/spec-driven/templates/plan.md +46 -0
- package/schemas/spec-driven/templates/proposal.md +35 -0
- package/schemas/spec-driven/templates/tasks.md +39 -0
- package/scripts/patch-inquirer.js +70 -0
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openfeel",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI Agent 开发流程治理 CLI 工具",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"private": false,
|
|
7
|
+
"bin": {
|
|
8
|
+
"openfeel": "./bin/openfeel.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "node build.js",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"dev": "vitest",
|
|
17
|
+
"postinstall": "node scripts/patch-inquirer.js"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@inquirer/prompts": "^8.5.2",
|
|
21
|
+
"commander": "^14.0.0",
|
|
22
|
+
"fast-glob": "^3.3.3",
|
|
23
|
+
"yaml": "^2.9.0",
|
|
24
|
+
"zod": "^4.4.3"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^22.0.0",
|
|
28
|
+
"eslint": "^9.0.0",
|
|
29
|
+
"typescript": "^5.7.0",
|
|
30
|
+
"typescript-eslint": "^8.0.0",
|
|
31
|
+
"vitest": "^3.0.0",
|
|
32
|
+
"@vitest/coverage-v8": "^3.0.0"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20.0.0"
|
|
36
|
+
},
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/Liuary/OpenFeel.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/Liuary/OpenFeel/issues"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"ai-agent",
|
|
47
|
+
"cli",
|
|
48
|
+
"workflow",
|
|
49
|
+
"governance",
|
|
50
|
+
"openfeel"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"bin",
|
|
58
|
+
"schemas",
|
|
59
|
+
"scripts"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: spec-driven
|
|
2
|
+
version: "1.0"
|
|
3
|
+
description: "规范驱动开发工作流 — proposal → specs → design → tasks → implementation → review → archive"
|
|
4
|
+
|
|
5
|
+
artifacts:
|
|
6
|
+
- id: proposal
|
|
7
|
+
description: "项目提案文档"
|
|
8
|
+
generates: "docs/proposal.md"
|
|
9
|
+
template: "proposal.md"
|
|
10
|
+
requires: []
|
|
11
|
+
instruction: "创建项目提案文档,描述项目目标、范围和初步技术方案"
|
|
12
|
+
|
|
13
|
+
- id: specs
|
|
14
|
+
description: "功能规范文档"
|
|
15
|
+
generates: "docs/specs/**/*.md"
|
|
16
|
+
template: "plan.md"
|
|
17
|
+
dependsOn: ["proposal"]
|
|
18
|
+
instruction: "根据提案撰写详细功能规范"
|
|
19
|
+
|
|
20
|
+
- id: design
|
|
21
|
+
description: "技术设计文档"
|
|
22
|
+
generates: "docs/design.md"
|
|
23
|
+
template: "design.md"
|
|
24
|
+
dependsOn: ["specs"]
|
|
25
|
+
instruction: "根据规范制定技术设计方案"
|
|
26
|
+
|
|
27
|
+
- id: tasks
|
|
28
|
+
description: "任务分解"
|
|
29
|
+
generates: "docs/tasks.md"
|
|
30
|
+
template: "tasks.md"
|
|
31
|
+
dependsOn: ["design"]
|
|
32
|
+
instruction: "将设计方案分解为可执行的开发任务"
|
|
33
|
+
|
|
34
|
+
- id: implementation
|
|
35
|
+
description: "代码实现"
|
|
36
|
+
generates: "src/**/*.ts"
|
|
37
|
+
dependsOn: ["tasks"]
|
|
38
|
+
instruction: "按照任务列表进行代码实现"
|
|
39
|
+
|
|
40
|
+
- id: review
|
|
41
|
+
description: "代码审查"
|
|
42
|
+
generates: "docs/review.md"
|
|
43
|
+
dependsOn: ["implementation"]
|
|
44
|
+
instruction: "对实现代码进行审查,输出审查报告"
|
|
45
|
+
|
|
46
|
+
- id: archive
|
|
47
|
+
description: "项目归档"
|
|
48
|
+
generates: "docs/archive.md"
|
|
49
|
+
dependsOn: ["review"]
|
|
50
|
+
instruction: "归档项目文档和最终产出"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 技术设计
|
|
2
|
+
|
|
3
|
+
> 基于规范:{specs_link}
|
|
4
|
+
|
|
5
|
+
## 架构概览
|
|
6
|
+
|
|
7
|
+
<!-- 系统整体架构图(可用 Mermaid 或文字描述) -->
|
|
8
|
+
|
|
9
|
+
## 技术选型
|
|
10
|
+
|
|
11
|
+
| 层级 | 技术 | 理由 |
|
|
12
|
+
|------|------|------|
|
|
13
|
+
| | | |
|
|
14
|
+
|
|
15
|
+
## 模块设计
|
|
16
|
+
|
|
17
|
+
### 模块 A: {名称}
|
|
18
|
+
|
|
19
|
+
<!-- 职责、接口、依赖关系 -->
|
|
20
|
+
|
|
21
|
+
### 模块 B: {名称}
|
|
22
|
+
|
|
23
|
+
<!-- 职责、接口、依赖关系 -->
|
|
24
|
+
|
|
25
|
+
## 数据流
|
|
26
|
+
|
|
27
|
+
<!-- 描述核心业务流程的数据流动 -->
|
|
28
|
+
|
|
29
|
+
## 接口规范
|
|
30
|
+
|
|
31
|
+
<!-- 各模块间的契约和接口定义 -->
|
|
32
|
+
|
|
33
|
+
## 错误处理
|
|
34
|
+
|
|
35
|
+
<!-- 异常情况的处理策略 -->
|
|
36
|
+
|
|
37
|
+
## 安全设计
|
|
38
|
+
|
|
39
|
+
<!-- 安全相关设计(鉴权、数据加密等) -->
|
|
40
|
+
|
|
41
|
+
## 部署与运维
|
|
42
|
+
|
|
43
|
+
<!-- 部署方案、监控、日志策略 -->
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 功能规范
|
|
2
|
+
|
|
3
|
+
> 基于提案:{proposal_link}
|
|
4
|
+
|
|
5
|
+
## 功能概览
|
|
6
|
+
|
|
7
|
+
<!-- 以用户视角描述系统功能 -->
|
|
8
|
+
|
|
9
|
+
## 用户故事
|
|
10
|
+
|
|
11
|
+
<!-- 按用户角色编写的功能需求 -->
|
|
12
|
+
|
|
13
|
+
### 故事 1: {标题}
|
|
14
|
+
|
|
15
|
+
**作为** {角色}
|
|
16
|
+
**我想要** {功能}
|
|
17
|
+
**以便于** {目标}
|
|
18
|
+
|
|
19
|
+
#### 验收标准
|
|
20
|
+
|
|
21
|
+
- [ ]
|
|
22
|
+
|
|
23
|
+
## 功能需求
|
|
24
|
+
|
|
25
|
+
### FR-01: {功能名称}
|
|
26
|
+
|
|
27
|
+
<!-- 详细描述功能需求 -->
|
|
28
|
+
|
|
29
|
+
## 非功能需求
|
|
30
|
+
|
|
31
|
+
- 性能:
|
|
32
|
+
- 安全:
|
|
33
|
+
- 可用性:
|
|
34
|
+
- 可维护性:
|
|
35
|
+
|
|
36
|
+
## 接口定义
|
|
37
|
+
|
|
38
|
+
<!-- 如有 API 或模块接口,在此定义 -->
|
|
39
|
+
|
|
40
|
+
## 数据模型
|
|
41
|
+
|
|
42
|
+
<!-- 核心数据实体和关系描述 -->
|
|
43
|
+
|
|
44
|
+
## 边界与约束
|
|
45
|
+
|
|
46
|
+
<!-- 本阶段的边界条件和限制 -->
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 项目提案
|
|
2
|
+
|
|
3
|
+
> 项目名称:{project_name}
|
|
4
|
+
|
|
5
|
+
## 项目目标
|
|
6
|
+
|
|
7
|
+
<!-- 描述项目要解决的核心问题和期望达成的目标 -->
|
|
8
|
+
|
|
9
|
+
## 项目范围
|
|
10
|
+
|
|
11
|
+
<!-- 明确项目边界,列出包含和不包含的功能 -->
|
|
12
|
+
|
|
13
|
+
### 包含范围
|
|
14
|
+
|
|
15
|
+
-
|
|
16
|
+
|
|
17
|
+
### 不包含范围
|
|
18
|
+
|
|
19
|
+
-
|
|
20
|
+
|
|
21
|
+
## 初步技术方案
|
|
22
|
+
|
|
23
|
+
<!-- 描述技术选型、架构思路、关键决策 -->
|
|
24
|
+
|
|
25
|
+
## 成功标准
|
|
26
|
+
|
|
27
|
+
<!-- 定义项目成功的可衡量标准 -->
|
|
28
|
+
|
|
29
|
+
## 风险与约束
|
|
30
|
+
|
|
31
|
+
<!-- 识别已知风险和约束条件 -->
|
|
32
|
+
|
|
33
|
+
## 时间线
|
|
34
|
+
|
|
35
|
+
<!-- 粗略的时间估算和里程碑 -->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 任务分解
|
|
2
|
+
|
|
3
|
+
> 基于设计:{design_link}
|
|
4
|
+
|
|
5
|
+
## 任务列表
|
|
6
|
+
|
|
7
|
+
### 阶段 1: {阶段名称}
|
|
8
|
+
|
|
9
|
+
- [ ] **TASK-001**: {任务标题}
|
|
10
|
+
- 描述:
|
|
11
|
+
- 涉及文件:
|
|
12
|
+
- 预估工时:
|
|
13
|
+
- 依赖任务:
|
|
14
|
+
|
|
15
|
+
- [ ] **TASK-002**: {任务标题}
|
|
16
|
+
- 描述:
|
|
17
|
+
- 涉及文件:
|
|
18
|
+
- 预估工时:
|
|
19
|
+
- 依赖任务:TASK-001
|
|
20
|
+
|
|
21
|
+
### 阶段 2: {阶段名称}
|
|
22
|
+
|
|
23
|
+
- [ ] **TASK-003**: {任务标题}
|
|
24
|
+
- 描述:
|
|
25
|
+
- 涉及文件:
|
|
26
|
+
- 预估工时:
|
|
27
|
+
- 依赖任务:
|
|
28
|
+
|
|
29
|
+
## 执行顺序
|
|
30
|
+
|
|
31
|
+
<!-- 任务间的依赖关系和推荐执行顺序 -->
|
|
32
|
+
|
|
33
|
+
## 风险任务
|
|
34
|
+
|
|
35
|
+
<!-- 标注高风险的复杂任务 -->
|
|
36
|
+
|
|
37
|
+
## 预估总工时
|
|
38
|
+
|
|
39
|
+
<!-- 汇总所有任务的预估工时 -->
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 补丁:修复 @inquirer/core 在 Node.js 20 下的兼容性问题
|
|
3
|
+
*
|
|
4
|
+
* @inquirer/core@11.1.0+ 使用了 Node.js 22+ 的 `styleText` API(from 'node:util'),
|
|
5
|
+
* 在 Node.js 20 下报错 "styleText is not exported from node:util"。
|
|
6
|
+
*
|
|
7
|
+
* 方案:将 `import { styleText } from 'node:util'` 替换为
|
|
8
|
+
* 局部定义的等效函数,保留所有调用点不变。
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
11
|
+
import { resolve, dirname } from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
|
|
14
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
const rootDir = resolve(__dirname, '..');
|
|
16
|
+
|
|
17
|
+
const files = [
|
|
18
|
+
resolve(rootDir, 'node_modules/@inquirer/core/dist/lib/Separator.js'),
|
|
19
|
+
resolve(rootDir, 'node_modules/@inquirer/core/dist/lib/theme.js'),
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// ANSI 颜色名称到转义码的映射
|
|
23
|
+
const ANSI_CODES = { bold: 1, dim: 2, red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, white: 37 };
|
|
24
|
+
|
|
25
|
+
/** 生成 styleText 的替换函数源码 */
|
|
26
|
+
function generateStyleTextFn() {
|
|
27
|
+
const codeMap = JSON.stringify(ANSI_CODES);
|
|
28
|
+
return `const styleText = (fmt, txt) => { const c = ${codeMap}[fmt]; return c ? \`\\x1b[\${c}m\${txt}\\x1b[0m\` : txt; };`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function patchFile(filePath) {
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
console.error(`[patch-inquirer] 文件不存在,跳过: ${filePath}`);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let content = readFileSync(filePath, 'utf-8');
|
|
38
|
+
const original = content;
|
|
39
|
+
|
|
40
|
+
// 替换: import { styleText } from 'node:util' → 局部函数定义
|
|
41
|
+
const importRegex = /import\s*\{[^}]*\bstyleText\b[^}]*\}\s*from\s*['"]node:util['"];?\s*/;
|
|
42
|
+
if (!importRegex.test(content)) {
|
|
43
|
+
console.log(`[patch-inquirer] 未找到 styleText 导入,跳过: ${filePath}`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 检查是否已经有我们的补丁(幂等保护)
|
|
48
|
+
if (content.includes('// patched by openfeel')) {
|
|
49
|
+
console.log(`[patch-inquirer] 已修补,跳过: ${filePath}`);
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
content = content.replace(importRegex, generateStyleTextFn() + '\n// patched by openfeel\n');
|
|
54
|
+
|
|
55
|
+
if (content === original) {
|
|
56
|
+
console.log(`[patch-inquirer] 无需修改: ${filePath}`);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
61
|
+
console.log(`[patch-inquirer] ✅ 已修补: ${filePath}`);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 执行
|
|
66
|
+
let count = 0;
|
|
67
|
+
for (const f of files) {
|
|
68
|
+
if (patchFile(f)) count++;
|
|
69
|
+
}
|
|
70
|
+
console.log(`[patch-inquirer] 完成: ${count} 个文件已修补`);
|