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.
Files changed (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +140 -0
  3. package/README.md +17 -0
  4. package/README.zh-CN.md +140 -0
  5. package/bin/openfeel.js +13 -0
  6. package/dist/cli/index.d.ts +11 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +119 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/repl.d.ts +10 -0
  11. package/dist/cli/repl.d.ts.map +1 -0
  12. package/dist/cli/repl.js +74 -0
  13. package/dist/cli/repl.js.map +1 -0
  14. package/dist/commands/archive.d.ts +7 -0
  15. package/dist/commands/archive.d.ts.map +1 -0
  16. package/dist/commands/archive.js +38 -0
  17. package/dist/commands/archive.js.map +1 -0
  18. package/dist/commands/config.d.ts +15 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +208 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/flow.d.ts +24 -0
  23. package/dist/commands/flow.d.ts.map +1 -0
  24. package/dist/commands/flow.js +1024 -0
  25. package/dist/commands/flow.js.map +1 -0
  26. package/dist/commands/init.d.ts +9 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +62 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/instructions.d.ts +7 -0
  31. package/dist/commands/instructions.d.ts.map +1 -0
  32. package/dist/commands/instructions.js +36 -0
  33. package/dist/commands/instructions.js.map +1 -0
  34. package/dist/commands/knowledge.d.ts +7 -0
  35. package/dist/commands/knowledge.d.ts.map +1 -0
  36. package/dist/commands/knowledge.js +174 -0
  37. package/dist/commands/knowledge.js.map +1 -0
  38. package/dist/commands/lint.d.ts +12 -0
  39. package/dist/commands/lint.d.ts.map +1 -0
  40. package/dist/commands/lint.js +192 -0
  41. package/dist/commands/lint.js.map +1 -0
  42. package/dist/commands/plan.d.ts +7 -0
  43. package/dist/commands/plan.d.ts.map +1 -0
  44. package/dist/commands/plan.js +73 -0
  45. package/dist/commands/plan.js.map +1 -0
  46. package/dist/commands/project.d.ts +7 -0
  47. package/dist/commands/project.d.ts.map +1 -0
  48. package/dist/commands/project.js +189 -0
  49. package/dist/commands/project.js.map +1 -0
  50. package/dist/commands/roadmap.d.ts +7 -0
  51. package/dist/commands/roadmap.d.ts.map +1 -0
  52. package/dist/commands/roadmap.js +26 -0
  53. package/dist/commands/roadmap.js.map +1 -0
  54. package/dist/commands/stage.d.ts +17 -0
  55. package/dist/commands/stage.d.ts.map +1 -0
  56. package/dist/commands/stage.js +291 -0
  57. package/dist/commands/stage.js.map +1 -0
  58. package/dist/commands/update.d.ts +8 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +87 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/view.d.ts +7 -0
  63. package/dist/commands/view.d.ts.map +1 -0
  64. package/dist/commands/view.js +77 -0
  65. package/dist/commands/view.js.map +1 -0
  66. package/dist/core/archive/merge.d.ts +20 -0
  67. package/dist/core/archive/merge.d.ts.map +1 -0
  68. package/dist/core/archive/merge.js +118 -0
  69. package/dist/core/archive/merge.js.map +1 -0
  70. package/dist/core/artifact-graph/graph.d.ts +62 -0
  71. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  72. package/dist/core/artifact-graph/graph.js +184 -0
  73. package/dist/core/artifact-graph/graph.js.map +1 -0
  74. package/dist/core/artifact-graph/index.d.ts +10 -0
  75. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  76. package/dist/core/artifact-graph/index.js +8 -0
  77. package/dist/core/artifact-graph/index.js.map +1 -0
  78. package/dist/core/artifact-graph/instruction-loader.d.ts +35 -0
  79. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  80. package/dist/core/artifact-graph/instruction-loader.js +358 -0
  81. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  82. package/dist/core/artifact-graph/resolver.d.ts +10 -0
  83. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  84. package/dist/core/artifact-graph/resolver.js +32 -0
  85. package/dist/core/artifact-graph/resolver.js.map +1 -0
  86. package/dist/core/artifact-graph/state.d.ts +9 -0
  87. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  88. package/dist/core/artifact-graph/state.js +24 -0
  89. package/dist/core/artifact-graph/state.js.map +1 -0
  90. package/dist/core/artifact-graph/types.d.ts +22 -0
  91. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  92. package/dist/core/artifact-graph/types.js +2 -0
  93. package/dist/core/artifact-graph/types.js.map +1 -0
  94. package/dist/core/config.d.ts +256 -0
  95. package/dist/core/config.d.ts.map +1 -0
  96. package/dist/core/config.js +393 -0
  97. package/dist/core/config.js.map +1 -0
  98. package/dist/core/flow-manager.d.ts +492 -0
  99. package/dist/core/flow-manager.d.ts.map +1 -0
  100. package/dist/core/flow-manager.js +2379 -0
  101. package/dist/core/flow-manager.js.map +1 -0
  102. package/dist/core/i18n-data/en.d.ts +26 -0
  103. package/dist/core/i18n-data/en.d.ts.map +1 -0
  104. package/dist/core/i18n-data/en.js +492 -0
  105. package/dist/core/i18n-data/en.js.map +1 -0
  106. package/dist/core/i18n-data/types.d.ts +18 -0
  107. package/dist/core/i18n-data/types.d.ts.map +1 -0
  108. package/dist/core/i18n-data/types.js +8 -0
  109. package/dist/core/i18n-data/types.js.map +1 -0
  110. package/dist/core/i18n-data/zh-CN.d.ts +28 -0
  111. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -0
  112. package/dist/core/i18n-data/zh-CN.js +524 -0
  113. package/dist/core/i18n-data/zh-CN.js.map +1 -0
  114. package/dist/core/i18n.d.ts +40 -0
  115. package/dist/core/i18n.d.ts.map +1 -0
  116. package/dist/core/i18n.js +135 -0
  117. package/dist/core/i18n.js.map +1 -0
  118. package/dist/core/init.d.ts +22 -0
  119. package/dist/core/init.d.ts.map +1 -0
  120. package/dist/core/init.js +292 -0
  121. package/dist/core/init.js.map +1 -0
  122. package/dist/core/metrics.d.ts +60 -0
  123. package/dist/core/metrics.d.ts.map +1 -0
  124. package/dist/core/metrics.js +137 -0
  125. package/dist/core/metrics.js.map +1 -0
  126. package/dist/core/pipeline-schema.d.ts +78 -0
  127. package/dist/core/pipeline-schema.d.ts.map +1 -0
  128. package/dist/core/pipeline-schema.js +57 -0
  129. package/dist/core/pipeline-schema.js.map +1 -0
  130. package/dist/core/plan/roadmap.d.ts +17 -0
  131. package/dist/core/plan/roadmap.d.ts.map +1 -0
  132. package/dist/core/plan/roadmap.js +71 -0
  133. package/dist/core/plan/roadmap.js.map +1 -0
  134. package/dist/core/plan/scheme.d.ts +34 -0
  135. package/dist/core/plan/scheme.d.ts.map +1 -0
  136. package/dist/core/plan/scheme.js +262 -0
  137. package/dist/core/plan/scheme.js.map +1 -0
  138. package/dist/core/plan/stage.d.ts +20 -0
  139. package/dist/core/plan/stage.d.ts.map +1 -0
  140. package/dist/core/plan/stage.js +120 -0
  141. package/dist/core/plan/stage.js.map +1 -0
  142. package/dist/core/public-logger.d.ts +84 -0
  143. package/dist/core/public-logger.d.ts.map +1 -0
  144. package/dist/core/public-logger.js +344 -0
  145. package/dist/core/public-logger.js.map +1 -0
  146. package/dist/core/schema.d.ts +70 -0
  147. package/dist/core/schema.d.ts.map +1 -0
  148. package/dist/core/schema.js +61 -0
  149. package/dist/core/schema.js.map +1 -0
  150. package/dist/core/template-loader.d.ts +22 -0
  151. package/dist/core/template-loader.d.ts.map +1 -0
  152. package/dist/core/template-loader.js +2848 -0
  153. package/dist/core/template-loader.js.map +1 -0
  154. package/dist/core/templates.d.ts +18 -0
  155. package/dist/core/templates.d.ts.map +1 -0
  156. package/dist/core/templates.js +50 -0
  157. package/dist/core/templates.js.map +1 -0
  158. package/dist/core/update.d.ts +40 -0
  159. package/dist/core/update.d.ts.map +1 -0
  160. package/dist/core/update.js +1569 -0
  161. package/dist/core/update.js.map +1 -0
  162. package/dist/core/view/entry.d.ts +37 -0
  163. package/dist/core/view/entry.d.ts.map +1 -0
  164. package/dist/core/view/entry.js +108 -0
  165. package/dist/core/view/entry.js.map +1 -0
  166. package/dist/core/workspace/identity.d.ts +60 -0
  167. package/dist/core/workspace/identity.d.ts.map +1 -0
  168. package/dist/core/workspace/identity.js +169 -0
  169. package/dist/core/workspace/identity.js.map +1 -0
  170. package/dist/core/workspace/knowledge.d.ts +55 -0
  171. package/dist/core/workspace/knowledge.d.ts.map +1 -0
  172. package/dist/core/workspace/knowledge.js +230 -0
  173. package/dist/core/workspace/knowledge.js.map +1 -0
  174. package/dist/core/workspace/structure.d.ts +9 -0
  175. package/dist/core/workspace/structure.d.ts.map +1 -0
  176. package/dist/core/workspace/structure.js +59 -0
  177. package/dist/core/workspace/structure.js.map +1 -0
  178. package/dist/index.d.ts +7 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +7 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/utils/kb-dedup.d.ts +46 -0
  183. package/dist/utils/kb-dedup.d.ts.map +1 -0
  184. package/dist/utils/kb-dedup.js +169 -0
  185. package/dist/utils/kb-dedup.js.map +1 -0
  186. package/dist/utils/path.d.ts +22 -0
  187. package/dist/utils/path.d.ts.map +1 -0
  188. package/dist/utils/path.js +37 -0
  189. package/dist/utils/path.js.map +1 -0
  190. package/package.json +61 -0
  191. package/schemas/spec-driven/schema.yaml +50 -0
  192. package/schemas/spec-driven/templates/design.md +43 -0
  193. package/schemas/spec-driven/templates/plan.md +46 -0
  194. package/schemas/spec-driven/templates/proposal.md +35 -0
  195. package/schemas/spec-driven/templates/tasks.md +39 -0
  196. package/scripts/patch-inquirer.js +70 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Liuary
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,140 @@
1
+ # OpenFeel — AI Agent Development Process Governance CLI
2
+
3
+ [中文](README.zh-CN.md) | [Changelog](CHANGELOG.md) | [Getting Started](docs/GETTING_STARTED.md)
4
+
5
+ OpenFeel is a TypeScript CLI tool for end-to-end process governance in AI Agent development. Core philosophy: **"Slim prompts, process in tools"** — agents understand workflows by reading `flow.json` state, not long text documents.
6
+
7
+ ## What Problem Does It Solve
8
+
9
+ Common pain points in AI Agent project development:
10
+ - **Chaotic process**: Agent scheduling relies on ad-hoc coordination without a unified mechanism
11
+ - **Untrackable state**: Unclear who is doing what, progress, or blockers
12
+ - **Scattered outputs**: Plans, code, reviews, and tests spread across places without a single entry point
13
+ - **Lost experience**: Knowledge vanishes after each session, starting from scratch every time
14
+
15
+ OpenFeel provides automated pipeline governance — agents obtain current state and next instructions from `flow.json` rather than reading lengthy documents.
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install -g openfeel
21
+ ```
22
+
23
+ Requires: Node.js ≥ 20
24
+
25
+ ## Quick Start
26
+
27
+ ```bash
28
+ # 1. Initialize project workspace
29
+ openfeel init ./my-project
30
+
31
+ # 2. Create a version roadmap
32
+ openfeel roadmap create v1.0
33
+
34
+ # 3. Add a work stage
35
+ openfeel plan stage add stage-01
36
+
37
+ # 4. Create an operation scheme
38
+ openfeel plan scheme create stage-01 "Implement core features"
39
+
40
+ # 5. View pipeline status
41
+ openfeel flow status
42
+ ```
43
+
44
+ ## Command Reference
45
+
46
+ | Command | Purpose |
47
+ |---------|---------|
48
+ | `openfeel init [path]` | Initialize project workspace |
49
+ | `openfeel flow` | Pipeline state management (status / current / advance / overview) |
50
+ | `openfeel roadmap` | Version roadmap management (create / show) |
51
+ | `openfeel plan` | Stage and scheme management (stage add/list, scheme create/list) |
52
+ | `openfeel lint` | Quality gate checks (i18n key symmetry / kb stale references) |
53
+ | `openfeel config` | Configuration management (get / set / list, supports --global) |
54
+ | `openfeel knowledge` | Knowledge base management (list / search) |
55
+ | `openfeel archive <stage>` | Stage archiving with knowledge extraction |
56
+ | `openfeel update` | Update Agent definitions and Skill files |
57
+
58
+ Details: [docs/commands.md](docs/commands.md)
59
+
60
+ ## Core Concepts
61
+
62
+ ### Feel Agent (Orchestrator)
63
+
64
+ Feel is the command center, receiving user intent and dispatching downstream Agents to execute tasks.
65
+
66
+ ### 9-Agent System
67
+
68
+ | Agent | Role | Description |
69
+ |-------|------|-------------|
70
+ | Feel | Orchestrator | Global scheduling and decisions |
71
+ | Planner | Planner | Roadmap and stage planning |
72
+ | Schemer | Schemer | Fine-grained operation plans |
73
+ | Executor | Executor | Code implementation |
74
+ | Reviewer | Reviewer | Cross-model code review |
75
+ | Feel Tester | Tester | Formal test acceptance |
76
+ | Utility | Utility Agent | Mechanical file operations |
77
+ | Vision | Vision Agent | Multimodal visual analysis |
78
+ | Archiver | Archiver | Operation archiving and knowledge extraction |
79
+
80
+ ### Three-Tier Planning
81
+
82
+ ```
83
+ Roadmap
84
+ └── Stage
85
+ └── Op(operation)— the finest execution unit
86
+ ```
87
+
88
+ ### flow.json — Pipeline State Core
89
+
90
+ `.openfeel/flow.json` is the single source of truth, recording all stages, operations, reviews, and logs. Agents read it for context and write back state after execution.
91
+
92
+ ### /opfx: Skill Mapping
93
+
94
+ | Skill | Purpose |
95
+ |-------|---------|
96
+ | `/opfx:flow` | Pipeline status query & advancement |
97
+ | `/opfx:plan` | Plan formulation |
98
+ | `/opfx:scheme` | Scheme formulation |
99
+ | `/opfx:code` | Code execution |
100
+ | `/opfx:view` | Code review |
101
+ | `/opfx:test` | Test acceptance |
102
+ | `/opfx:archive` | Stage archiving |
103
+ | `/opfx:kb` | Knowledge base operations |
104
+
105
+ ## Architecture
106
+
107
+ ```
108
+ CLI Layer (Commander)
109
+ ├── init / update
110
+ ├── flow ← FlowManager (state machine core)
111
+ ├── roadmap ← Roadmap module
112
+ ├── plan ← Stage / Scheme module
113
+ ├── lint ← Quality gates (i18n + kb)
114
+ ├── config ← Configuration management
115
+ ├── knowledge ← Knowledge base module
116
+ ├── archive ← Archiving module
117
+ └── view ← Review item module
118
+
119
+ Core Layer
120
+ ├── FlowManager — Pipeline state read/write, advance, retry, log
121
+ ├── config — Config file I/O (incl. global profile)
122
+ ├── schema — Zod Schema validation engine
123
+ ├── plan/ — Three-tier planning (roadmap / stage / scheme)
124
+ ├── artifact-graph/ — Dependency graph & instruction generation
125
+ ├── view/ — Review item CRUD
126
+ ├── archive/ — Archive consolidation
127
+ └── workspace/ — Directory structure & knowledge base
128
+ ```
129
+
130
+ ## Development
131
+
132
+ ```bash
133
+ npm install # Install dependencies
134
+ npm run build # Compile TypeScript
135
+ npm test # Run tests (395 cases)
136
+ ```
137
+
138
+ ## License
139
+
140
+ [MIT](LICENSE)
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # OpenFeel — AI Agent 开发流程治理 CLI
2
+
3
+ [English](README.en.md) | [更新日志](CHANGELOG.md)
4
+
5
+ OpenFeel 是一个 TypeScript CLI 工具,为 AI Agent 开发提供端到端的流程治理。核心理念:**「提示词瘦身,流程入工具」** —— Agent 不靠读长文本理解流程,而是通过 `flow.json` 获取当前状态和下一步指令。
6
+
7
+ ---
8
+
9
+ ## 快速开始
10
+
11
+ ```bash
12
+ npm install -g openfeel # 安装(Node ≥ 20)
13
+ openfeel init ./my-project # 初始化项目
14
+ openfeel flow status # 查看流水线
15
+ ```
16
+
17
+ 完整中文文档:[README.zh-CN.md](README.zh-CN.md)
@@ -0,0 +1,140 @@
1
+ # OpenFeel — AI Agent 开发流程治理 CLI
2
+
3
+ [English](README.en.md) | [更新日志](CHANGELOG.md) | [入门指南](docs/GETTING_STARTED.md)
4
+
5
+ OpenFeel 是一个 TypeScript CLI 工具,为 AI Agent 开发提供端到端的流程治理。
6
+
7
+ ## 解决什么问题
8
+
9
+ 在 AI Agent 项目开发中,常见的痛点:
10
+ - **流程混乱**:Agent 之间的调度靠"口口相传",缺乏统一协调机制
11
+ - **状态不可追踪**:不知道当前谁在干什么、进展如何、卡在哪里
12
+ - **产出不可管理**:方案、代码、审查、测试散落各处,没有统一入口
13
+ - **经验无法沉淀**:每次会话结束经验就丢失,下次从头再来
14
+
15
+ OpenFeel 将「提示词瘦身,流程入工具」——Agent 不靠读长文本理解流程,而是通过 `flow.json` 获取当前状态和下一步指令,实现开发流水线的自动化治理。
16
+
17
+ ## 安装
18
+
19
+ ```bash
20
+ npm install -g openfeel
21
+ ```
22
+
23
+ 要求:Node.js ≥ 20
24
+
25
+ ## 快速开始
26
+
27
+ ```bash
28
+ # 1. 初始化项目工作区
29
+ openfeel init ./my-project
30
+
31
+ # 2. 创建分期大纲
32
+ openfeel roadmap create v1.0
33
+
34
+ # 3. 添加工作阶段
35
+ openfeel plan stage add stage-01
36
+
37
+ # 4. 创建操作方案
38
+ openfeel plan scheme create stage-01 "实现核心功能"
39
+
40
+ # 5. 查看流水线状态
41
+ openfeel flow status
42
+ ```
43
+
44
+ ## 命令参考
45
+
46
+ | 命令 | 用途 |
47
+ |------|------|
48
+ | `openfeel init [path]` | 初始化项目工作区,创建 `.openfeel/` 目录结构和配置文件 |
49
+ | `openfeel flow` | 流水线状态管理(status / current / advance / overview) |
50
+ | `openfeel roadmap` | 分期大纲管理(create / show) |
51
+ | `openfeel plan` | 工作阶段与操作方案管理(stage add/list、scheme create/list) |
52
+ | `openfeel lint` | 质量门禁检查(i18n 键对称性 / kb 过期引用) |
53
+ | `openfeel config` | 配置管理(get / set / list,支持 --global) |
54
+ | `openfeel knowledge` | 知识库管理(list / search) |
55
+ | `openfeel archive <stage>` | 阶段归档,汇总产出、生成摘要、提取知识 |
56
+ | `openfeel update` | 更新 Agent 定义和 Skill 文件到目标平台 |
57
+
58
+ 详细参数见:[docs/commands.md](docs/commands.md)
59
+
60
+ ## 核心概念
61
+
62
+ ### Feel Agent(总统领)
63
+
64
+ Feel 是整个流程的调度中心,负责接收用户意图并调度下游 Agent 执行具体任务。
65
+
66
+ ### 9 Agent 体系
67
+
68
+ | Agent | 角色 | 说明 |
69
+ |-------|------|------|
70
+ | Feel | 总统领 | 全局调度与决策 |
71
+ | Planner | 计划官 | 制定分期大纲和工作阶段 |
72
+ | Schemer | 方案官 | 制定细粒度操作方案 |
73
+ | Executor | 执行官 | 按方案编码实现 |
74
+ | Reviewer | 审查官 | 交叉审查代码 |
75
+ | Feel Tester | 测试官 | 正式测试验收 |
76
+ | 事务官 | 事务官 | 文件机械操作 |
77
+ | Vision | 视觉官 | 多模态视觉分析 |
78
+ | Archiver | 归档官 | 归档操作记录与知识提取 |
79
+
80
+ ### 三层计划体系
81
+
82
+ ```
83
+ Roadmap(分期大纲)
84
+ └── Stage(工作阶段)
85
+ └── Op(操作方案)—— 最细粒度执行单元
86
+ ```
87
+
88
+ ### flow.json — 流水线状态核心
89
+
90
+ `.openfeel/flow.json` 是项目流水线的唯一真相源,记录所有阶段、操作、审查条目和日志。Agent 通过读取它获取上下文,执行完毕后写回状态。
91
+
92
+ ### /opfx: 技能映射
93
+
94
+ | Skill | 用途 |
95
+ |-------|------|
96
+ | `/opfx:flow` | 流水线状态查询与推进 |
97
+ | `/opfx:plan` | 制定分期大纲和工作阶段 |
98
+ | `/opfx:scheme` | 制定细粒度操作方案 |
99
+ | `/opfx:code` | 按方案编码实现 |
100
+ | `/opfx:view` | 代码审查 |
101
+ | `/opfx:test` | 测试验收 |
102
+ | `/opfx:archive` | 归档操作记录 |
103
+ | `/opfx:kb` | 知识库操作 |
104
+
105
+ ## 架构
106
+
107
+ ```
108
+ CLI 层(Commander)
109
+ ├── init / update
110
+ ├── flow ← FlowManager(状态机核心)
111
+ ├── roadmap ← Roadmap 模块
112
+ ├── plan ← Stage / Scheme 模块
113
+ ├── lint ← 质量门禁(i18n + kb)
114
+ ├── config ← 配置管理
115
+ ├── knowledge ← 知识库模块
116
+ ├── archive ← 归档模块
117
+ └── view ← 审查条目模块
118
+
119
+ Core 层
120
+ ├── FlowManager — 流水线状态读写、推进、重试、日志
121
+ ├── config — 配置文件读写(含全局 profile)
122
+ ├── schema — Zod Schema 验证引擎
123
+ ├── plan/ — 三层计划(roadmap / stage / scheme)
124
+ ├── artifact-graph/ — 依赖图与指令生成
125
+ ├── view/ — 审查条目 CRUD
126
+ ├── archive/ — 归档合并
127
+ └── workspace/ — 目录结构和知识库
128
+ ```
129
+
130
+ ## 开发
131
+
132
+ ```bash
133
+ npm install # 安装依赖
134
+ npm run build # 编译 TypeScript
135
+ npm test # 运行测试(395 用例)
136
+ ```
137
+
138
+ ## 许可
139
+
140
+ [MIT](LICENSE)
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ // OpenFeel CLI 入口 — 加载并启动 Commander 程序
3
+ // 无参数时进入 REPL 交互模式,有参数时正常 CLI 模式
4
+ import { program, applyHelpI18n, startRepl } from '../dist/cli/index.js';
5
+
6
+ const args = process.argv.slice(2);
7
+ // 在 parse 前注入翻译,此时命令树已就绪
8
+ applyHelpI18n(program);
9
+ if (args.length === 0) {
10
+ startRepl(program);
11
+ } else {
12
+ program.parse();
13
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * OpenFeel CLI 程序定义
3
+ * 基于 Commander 构建命令行入口,静态导入并注册所有命令模块。
4
+ * 新增命令只需在 src/commands/ 下创建模块并在本文件末尾追加 import + register 调用。
5
+ */
6
+ import { Command } from 'commander';
7
+ declare const program: Command;
8
+ export declare function applyHelpI18n(program: Command): void;
9
+ export { program };
10
+ export { startRepl } from './repl.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAwC9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsEpD;AAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * OpenFeel CLI 程序定义
3
+ * 基于 Commander 构建命令行入口,静态导入并注册所有命令模块。
4
+ * 新增命令只需在 src/commands/ 下创建模块并在本文件末尾追加 import + register 调用。
5
+ */
6
+ import { Command } from 'commander';
7
+ import { createRequire } from 'node:module';
8
+ import { t, getCliLang } from '../core/i18n.js';
9
+ // 读取 package.json 获取版本号
10
+ const require = createRequire(import.meta.url);
11
+ const pkg = require('../../package.json');
12
+ // 创建主程序
13
+ const program = new Command();
14
+ program
15
+ .name('openfeel')
16
+ .description('AI Agent 开发流程治理 CLI 工具')
17
+ .version(pkg.version, '-v, --version', '输出版本号');
18
+ // ── 静态导入命令模块(新增命令在此追加) ──
19
+ import { registerInitCommand } from '../commands/init.js';
20
+ import { registerFlowCommand } from '../commands/flow.js';
21
+ import { registerPlanCommand } from '../commands/plan.js';
22
+ import { registerViewCommand } from '../commands/view.js';
23
+ import { registerArchiveCommand } from '../commands/archive.js';
24
+ import { registerRoadmapCommand } from '../commands/roadmap.js';
25
+ import { registerInstructionsCommand } from '../commands/instructions.js';
26
+ import { registerUpdateCommand } from '../commands/update.js';
27
+ import { registerKnowledgeCommand } from '../commands/knowledge.js';
28
+ import { registerStageCommand } from '../commands/stage.js';
29
+ import { registerProjectCommand } from '../commands/project.js';
30
+ import { registerConfigCommand } from '../commands/config.js';
31
+ import { registerLintCommand } from '../commands/lint.js';
32
+ registerInitCommand(program);
33
+ registerFlowCommand(program);
34
+ registerPlanCommand(program);
35
+ registerViewCommand(program);
36
+ registerArchiveCommand(program);
37
+ registerRoadmapCommand(program);
38
+ registerInstructionsCommand(program);
39
+ registerUpdateCommand(program);
40
+ registerKnowledgeCommand(program);
41
+ registerStageCommand(program);
42
+ registerProjectCommand(program);
43
+ registerConfigCommand(program);
44
+ registerLintCommand(program);
45
+ // ── --help 国际化注入 ──
46
+ // 在所有命令注册完成后,遍历 Commander 命令树,
47
+ // 将 .description() 和 .option() 的硬编码文本替换为当前语言对应的翻译。
48
+ export function applyHelpI18n(program) {
49
+ const lang = getCliLang(process.cwd());
50
+ /**
51
+ * 将 kebab-case 或 --prefixed 字符串转为 camelCase。
52
+ * 例: '--auto-fix' → 'autoFix', 'no-backup' → 'noBackup'
53
+ */
54
+ function toCamelCase(flag) {
55
+ return flag
56
+ .replace(/^--?/, '')
57
+ .replace(/-([a-z])/g, (_, c) => c.toUpperCase());
58
+ }
59
+ /**
60
+ * 递归遍历 Commander 命令树,替换描述文本。
61
+ */
62
+ function walkCmd(cmd, path) {
63
+ const keyPrefix = 'help.' + path.join('.');
64
+ // 替换当前命令的 description(仅当已有描述文本时才查找替换)
65
+ if (cmd.description()) {
66
+ const descKey = keyPrefix;
67
+ const descTranslated = t(descKey, lang);
68
+ if (descTranslated !== descKey) {
69
+ cmd.description(descTranslated);
70
+ }
71
+ }
72
+ // 替换当前命令的 option 描述
73
+ for (const opt of cmd.options) {
74
+ // 跳过 Commander 自动生成的 --no- 选项(negate 标记为 true)
75
+ if (opt.negate)
76
+ continue;
77
+ // 跳过无长/短选项的内部 option
78
+ const flag = opt.long || opt.short;
79
+ if (!flag)
80
+ continue;
81
+ const optName = toCamelCase(flag);
82
+ const optKey = `${keyPrefix}.${optName}`;
83
+ const optTranslated = t(optKey, lang);
84
+ if (optTranslated !== optKey) {
85
+ opt.description = optTranslated;
86
+ }
87
+ }
88
+ // 递归处理子命令
89
+ for (const sub of cmd.commands) {
90
+ walkCmd(sub, [...path, sub.name()]);
91
+ }
92
+ }
93
+ // 处理根程序(openfeel)的描述和选项
94
+ const rootKey = 'help.' + program.name();
95
+ const rootTranslated = t(rootKey, lang);
96
+ if (rootTranslated !== rootKey) {
97
+ program.description(rootTranslated);
98
+ }
99
+ for (const opt of program.options) {
100
+ if (opt.negate)
101
+ continue;
102
+ const flag = opt.long || opt.short;
103
+ if (!flag)
104
+ continue;
105
+ const optName = toCamelCase(flag);
106
+ const optKey = `help.${program.name()}.${optName}`;
107
+ const optTranslated = t(optKey, lang);
108
+ if (optTranslated !== optKey) {
109
+ opt.description = optTranslated;
110
+ }
111
+ }
112
+ // 子命令路径从命令名开始(不含 root),与 help 域 key 命名对齐
113
+ for (const sub of program.commands) {
114
+ walkCmd(sub, [sub.name()]);
115
+ }
116
+ }
117
+ export { program };
118
+ export { startRepl } from './repl.js';
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * 启动交互式 REPL 模式
4
+ * 在 REPL 中通过 exitOverride 禁用 Commander 默认的 process.exit 行为,
5
+ * 转而捕获 CommanderError 异常,确保 REPL 会话不被意外终止。
6
+ *
7
+ * @param program - Commander Command 实例(已注册所有子命令)
8
+ */
9
+ export declare function startRepl(program: Command): void;
10
+ //# sourceMappingURL=repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/cli/repl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwEhD"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * OpenFeel REPL 交互模式
3
+ * 使用 Node.js readline 模块实现交互式命令行界面,
4
+ * 将用户输入转发给 Commander 解析执行。
5
+ */
6
+ import * as readline from 'node:readline';
7
+ /**
8
+ * 启动交互式 REPL 模式
9
+ * 在 REPL 中通过 exitOverride 禁用 Commander 默认的 process.exit 行为,
10
+ * 转而捕获 CommanderError 异常,确保 REPL 会话不被意外终止。
11
+ *
12
+ * @param program - Commander Command 实例(已注册所有子命令)
13
+ */
14
+ export function startRepl(program) {
15
+ // 禁用 Commander 默认的 process.exit() 行为
16
+ // 改为抛出 CommanderError,由 REPL 捕获处理
17
+ program.exitOverride();
18
+ const rl = readline.createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ prompt: 'openfeel> ',
22
+ });
23
+ console.log('OpenFeel REPL 交互模式 (输入 exit 退出, help 查看命令)');
24
+ rl.prompt();
25
+ rl.on('line', (line) => {
26
+ const trimmed = line.trim();
27
+ // 空行直接继续
28
+ if (!trimmed) {
29
+ rl.prompt();
30
+ return;
31
+ }
32
+ // 退出命令
33
+ if (trimmed === 'exit' || trimmed === 'quit') {
34
+ console.log('再见!');
35
+ rl.close();
36
+ process.exit(0);
37
+ }
38
+ // 帮助命令
39
+ if (trimmed === 'help') {
40
+ console.log('可用命令:init, flow, plan, scheme, view, archive, roadmap, knowledge, instructions, update, help, exit');
41
+ rl.prompt();
42
+ return;
43
+ }
44
+ // 将输入拆分为 argv 格式传给 Commander parse
45
+ // 注意:不使用 process.argv[0]/[1](Windows 下 node 路径含空格会导致误解析)
46
+ // 用固定占位符替代,Commander 仅用于 help 文本显示
47
+ try {
48
+ const args = trimmed.split(/\s+/);
49
+ program.parse(['node', 'openfeel', ...args]);
50
+ }
51
+ catch (err) {
52
+ // 捕获 CommanderError(包括 exitOverride 抛出的和 --help 触发的)
53
+ // 忽略它们以保持 REPL 运行
54
+ if (err &&
55
+ typeof err === 'object' &&
56
+ 'code' in err &&
57
+ err.code === 'commander.helpDisplayed') {
58
+ // --help 输出已完成,仅忽略
59
+ }
60
+ else if (err &&
61
+ typeof err === 'object' &&
62
+ 'code' in err &&
63
+ err.code === 'commander.help') {
64
+ // help 被触发
65
+ }
66
+ // 其他错误静默忽略,保持 REPL 存活
67
+ }
68
+ rl.prompt();
69
+ });
70
+ rl.on('close', () => {
71
+ process.exit(0);
72
+ });
73
+ }
74
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/cli/repl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,qCAAqC;IACrC,kCAAkC;IAClC,OAAO,CAAC,YAAY,EAAE,CAAC;IAEvB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,SAAS;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO;QACP,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO;QACP,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,oGAAoG,CACrG,CAAC;YACF,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,yDAAyD;QACzD,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,qDAAqD;YACrD,kBAAkB;YAClB,IACE,GAAG;gBACH,OAAO,GAAG,KAAK,QAAQ;gBACvB,MAAM,IAAI,GAAG;gBACZ,GAAwB,CAAC,IAAI,KAAK,yBAAyB,EAC5D,CAAC;gBACD,mBAAmB;YACrB,CAAC;iBAAM,IACL,GAAG;gBACH,OAAO,GAAG,KAAK,QAAQ;gBACvB,MAAM,IAAI,GAAG;gBACZ,GAAwB,CAAC,IAAI,KAAK,gBAAgB,EACnD,CAAC;gBACD,WAAW;YACb,CAAC;YACD,sBAAsB;QACxB,CAAC;QAED,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * archive 命令注册
3
+ * openfeel archive <stage> — 阶段归档(Archiver 操作)
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerArchiveCommand(program: Command): void;
7
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC7D"}
@@ -0,0 +1,38 @@
1
+ import { archiveStage } from '../core/archive/merge.js';
2
+ import { join } from 'node:path';
3
+ import { t, getCliLang } from '../core/i18n.js';
4
+ export function registerArchiveCommand(program) {
5
+ program
6
+ .command('archive')
7
+ .description('归档指定阶段(汇总产出、生成摘要、提取知识)')
8
+ .argument('<stage>', '阶段名称(如 stage-06)')
9
+ .action((stage) => {
10
+ const lang = getCliLang(process.cwd());
11
+ try {
12
+ const result = archiveStage(process.cwd(), stage);
13
+ if (!result) {
14
+ console.error(t('archive.errorArchiveFailedTmpl', lang, { stage }));
15
+ process.exit(1);
16
+ }
17
+ // 输出归档结果
18
+ console.log(t('archive.okTmpl', lang, { stage }));
19
+ console.log(` ${t('archive.opsCount', lang)}: ${result.opsCount}`);
20
+ console.log(` ${t('archive.reviewsCount', lang)}: ${result.reviewsCount}`);
21
+ // 输出知识提取列表(如有)
22
+ if (result.knowledgeExtracts.length > 0) {
23
+ console.log(` ${t('archive.knowledgeExtracts', lang)}:`);
24
+ for (const entry of result.knowledgeExtracts) {
25
+ console.log(` - ${entry}`);
26
+ }
27
+ }
28
+ // 输出归档文件路径
29
+ const archivePath = join(process.cwd(), '.openfeel', 'log', `archive-${stage}.md`);
30
+ console.log(` ${t('archive.archivePath', lang)}: ${archivePath}`);
31
+ }
32
+ catch (err) {
33
+ console.error(t('common.errorTmpl', lang, { msg: err instanceof Error ? err.message : String(err) }));
34
+ process.exit(1);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;SACvC,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAElD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,gCAAgC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,SAAS;YACT,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAE5E,eAAe;YACf,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,2BAA2B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,WAAW;YACX,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * config 命令注册
3
+ * openfeel config get-lang — 显示全局默认语言
4
+ * openfeel config set-lang <v> — 修改全局默认语言
5
+ * openfeel config list-projects — 列出项目路径→语言映射
6
+ * openfeel config get [key] [--global] — 读取项目/全局配置项
7
+ * openfeel config set <key> <value> [--global] — 写入项目/全局配置项
8
+ */
9
+ import { Command } from 'commander';
10
+ /**
11
+ * 注册 config 命令组到主程序
12
+ * @param program Commander 主程序实例
13
+ */
14
+ export declare function registerConfigCommand(program: Command): void;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgK5D"}