openmatrix 0.1.13 → 0.1.14

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.
@@ -41,6 +41,7 @@ const task_parser_js_1 = require("../../orchestrator/task-parser.js");
41
41
  const task_planner_js_1 = require("../../orchestrator/task-planner.js");
42
42
  const approval_manager_js_1 = require("../../orchestrator/approval-manager.js");
43
43
  const executor_js_1 = require("../../orchestrator/executor.js");
44
+ const gitignore_js_1 = require("../../utils/gitignore.js");
44
45
  const index_js_1 = require("../../types/index.js");
45
46
  const fs = __importStar(require("fs/promises"));
46
47
  const path = __importStar(require("path"));
@@ -56,6 +57,8 @@ exports.autoCommand = new commander_1.Command('auto')
56
57
  await fs.mkdir(omPath, { recursive: true });
57
58
  await fs.mkdir(path.join(omPath, 'tasks'), { recursive: true });
58
59
  await fs.mkdir(path.join(omPath, 'approvals'), { recursive: true });
60
+ // 确保 .openmatrix 被 git 忽略
61
+ await (0, gitignore_js_1.ensureOpenmatrixGitignore)(basePath);
59
62
  const stateManager = new state_manager_js_1.StateManager(omPath);
60
63
  await stateManager.initialize();
61
64
  const state = await stateManager.getState();
@@ -41,6 +41,7 @@ const task_parser_js_1 = require("../../orchestrator/task-parser.js");
41
41
  const task_planner_js_1 = require("../../orchestrator/task-planner.js");
42
42
  const approval_manager_js_1 = require("../../orchestrator/approval-manager.js");
43
43
  const executor_js_1 = require("../../orchestrator/executor.js");
44
+ const gitignore_js_1 = require("../../utils/gitignore.js");
44
45
  const fs = __importStar(require("fs/promises"));
45
46
  const path = __importStar(require("path"));
46
47
  exports.startCommand = new commander_1.Command('start')
@@ -57,6 +58,8 @@ exports.startCommand = new commander_1.Command('start')
57
58
  await fs.mkdir(omPath, { recursive: true });
58
59
  await fs.mkdir(path.join(omPath, 'tasks'), { recursive: true });
59
60
  await fs.mkdir(path.join(omPath, 'approvals'), { recursive: true });
61
+ // 确保 .openmatrix 被 git 忽略
62
+ await (0, gitignore_js_1.ensureOpenmatrixGitignore)(basePath);
60
63
  const stateManager = new state_manager_js_1.StateManager(omPath);
61
64
  await stateManager.initialize();
62
65
  const state = await stateManager.getState();
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 确保指定目录被 git 忽略
3
+ * @param basePath 项目根目录
4
+ * @param ignorePattern 要忽略的模式 (默认 .openmatrix/)
5
+ */
6
+ export declare function ensureGitignore(basePath: string, ignorePattern?: string): Promise<void>;
7
+ /**
8
+ * 确保 .openmatrix 目录被 git 忽略
9
+ */
10
+ export declare function ensureOpenmatrixGitignore(basePath: string): Promise<void>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ensureGitignore = ensureGitignore;
37
+ exports.ensureOpenmatrixGitignore = ensureOpenmatrixGitignore;
38
+ // src/utils/gitignore.ts
39
+ const fs = __importStar(require("fs/promises"));
40
+ const path = __importStar(require("path"));
41
+ /**
42
+ * 确保指定目录被 git 忽略
43
+ * @param basePath 项目根目录
44
+ * @param ignorePattern 要忽略的模式 (默认 .openmatrix/)
45
+ */
46
+ async function ensureGitignore(basePath, ignorePattern = '.openmatrix/') {
47
+ const gitignorePath = path.join(basePath, '.gitignore');
48
+ try {
49
+ const content = await fs.readFile(gitignorePath, 'utf-8');
50
+ // 检查是否已经包含该模式
51
+ const lines = content.split('\n');
52
+ const patternBase = ignorePattern.replace(/\/$/, '');
53
+ const hasPattern = lines.some(line => {
54
+ const trimmed = line.trim();
55
+ return trimmed === patternBase ||
56
+ trimmed === `${patternBase}/` ||
57
+ trimmed === `/${patternBase}` ||
58
+ trimmed === `/${patternBase}/`;
59
+ });
60
+ if (!hasPattern) {
61
+ // 添加模式到 .gitignore
62
+ const newContent = content.endsWith('\n')
63
+ ? `${content}${ignorePattern}\n`
64
+ : `${content}\n\n# Auto-added by OpenMatrix\n${ignorePattern}\n`;
65
+ await fs.writeFile(gitignorePath, newContent);
66
+ }
67
+ }
68
+ catch {
69
+ // .gitignore 不存在,创建一个新的
70
+ await fs.writeFile(gitignorePath, `# OpenMatrix state\n${ignorePattern}\n`);
71
+ }
72
+ }
73
+ /**
74
+ * 确保 .openmatrix 目录被 git 忽略
75
+ */
76
+ async function ensureOpenmatrixGitignore(basePath) {
77
+ await ensureGitignore(basePath, '.openmatrix/');
78
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmatrix",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "AI Agent task orchestration system with Claude Code Skills integration",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: om:check
3
- description: 自动检测项目可改进点并提供升级建议,支持交互式确认
3
+ description: 自动检测项目可改进点并提供升级建议,支持交互式确认后自动执行
4
4
  ---
5
5
 
6
6
  <NO-OTHER-SKILLS>
@@ -8,7 +8,7 @@ description: 自动检测项目可改进点并提供升级建议,支持交互
8
8
  </NO-OTHER-SKILLS>
9
9
 
10
10
  <objective>
11
- 自动扫描项目代码,检测可改进点,生成升级建议列表供用户确认后执行。支持用户提示聚焦检测方向。
11
+ 自动扫描项目代码,检测可改进点,用户确认后自动调用 /om:start 执行改进。
12
12
  </objective>
13
13
 
14
14
  <trigger-conditions>
@@ -47,8 +47,6 @@ description: 自动检测项目可改进点并提供升级建议,支持交互
47
47
  {
48
48
  "projectType": "openmatrix|ai-project|nodejs|typescript|python|go|rust|java|csharp|cpp|php|dart",
49
49
  "projectName": "项目名称",
50
- "scanPath": "/path/to/project",
51
- "timestamp": "2025-01-01T00:00:00.000Z",
52
50
  "suggestions": [
53
51
  {
54
52
  "id": "UPG-001",
@@ -56,81 +54,80 @@ description: 自动检测项目可改进点并提供升级建议,支持交互
56
54
  "priority": "critical|high|medium|low",
57
55
  "title": "建议标题",
58
56
  "description": "详细描述",
59
- "location": {
60
- "file": "src/example.ts",
61
- "line": 42
62
- },
63
- "suggestion": "改进建议",
64
- "autoFixable": true|false,
65
- "impact": "影响说明",
66
- "effort": "trivial|small|medium|large"
57
+ "location": { "file": "src/example.ts", "line": 42 },
58
+ "suggestion": "改进建议"
67
59
  }
68
60
  ],
69
- "summary": {
70
- "total": 10,
71
- "byCategory": { ... },
72
- "byPriority": { ... },
73
- "autoFixable": 3
74
- }
61
+ "summary": { "total": 10, "byCategory": {...}, "autoFixable": 3 }
75
62
  }
76
63
  ```
77
64
 
78
- 3. **展示检测结果**
79
-
80
- 使用 AskUserQuestion 展示结果并询问用户选择:
65
+ 3. **展示检测结果并询问用户**
81
66
 
67
+ 如果没有发现问题,提示用户并结束:
82
68
  ```
83
- 📋 检测到 X 个改进建议
84
-
85
- 🚨 关键问题 (Y 个)
86
- ─────────────────────
87
- [UPG-001] 🔒 硬编码密钥
88
- 位置: src/config.ts:15
89
- 建议: 使用环境变量存储敏感信息
90
-
91
- ⚠️ 高优先级 (Z 个)
92
- ─────────────────────
93
- ...
94
-
95
- 💡 请选择要执行的改进:
69
+ 未发现问题,项目状态良好!
96
70
  ```
97
71
 
98
- 4. **用户选择** (使用 AskUserQuestion)
99
-
100
- **选择模式:**
72
+ 如果发现问题,使用 AskUserQuestion 展示结果:
101
73
  ```typescript
102
74
  AskUserQuestion({
103
75
  questions: [{
104
- question: "请选择要执行的改进:",
105
- header: "改进选择",
76
+ question: "检测到 X 个改进建议,请选择执行方式:",
77
+ header: "执行方式",
106
78
  options: [
107
- { label: "🔴 全部执行", description: "执行所有检测到的改进" },
108
- { label: "🟡 仅关键+高优先级", description: "执行 critical 和 high 优先级" },
79
+ { label: "🔴 全部执行 (推荐)", description: "自动执行所有检测到的改进" },
80
+ { label: "🟡 仅关键+高优先级", description: "只执行 critical 和 high 优先级" },
109
81
  { label: "🟢 仅可自动修复", description: "只执行 autoFixable=true 的改进" },
110
- { label: "📋 逐项确认", description: "每个改进单独确认" }
82
+ { label: "📋 查看详情后决定", description: "逐项查看后手动选择" }
111
83
  ],
112
84
  multiSelect: false
113
85
  }]
114
86
  })
115
87
  ```
116
88
 
117
- 5. **执行改进**
89
+ 4. **用户选择后自动执行**
90
+
91
+ **重要**: 用户选择后,**立即自动调用 /om:start 执行**,无需再次确认。
118
92
 
119
- 根据用户选择,生成任务并调用 `/om:start` 执行:
93
+ 根据用户选择筛选建议:
94
+ - "全部执行" → 使用所有 suggestions
95
+ - "仅关键+高优先级" → 过滤 priority 为 critical/high
96
+ - "仅可自动修复" → 过滤 autoFixable 为 true
97
+ - "查看详情" → 逐项展示,用户选择后执行
120
98
 
121
- **方式一: 批量执行**
122
- - 将选中的改进转换为任务列表
123
- - 调用 `/om:start` 并传递任务
99
+ 5. **调用 /om:start 执行改进**
124
100
 
125
- **方式二: 逐项确认**
126
- - 使用 AskUserQuestion 逐个询问
127
- - 用户确认后执行
101
+ 将选中的建议转换为任务描述,调用 /om:start:
128
102
 
129
- 6. **BYPASS 模式支持**
103
+ ```typescript
104
+ // 生成任务描述
105
+ const taskDescription = `
106
+ ## 项目改进任务
107
+
108
+ 根据检测结果,需要修复以下问题:
109
+
110
+ ${selectedSuggestions.map((s, i) => `
111
+ ### ${i + 1}. ${s.title}
112
+ - 类别: ${s.category}
113
+ - 优先级: ${s.priority}
114
+ - 位置: ${s.location.file}${s.location.line ? `:${s.location.line}` : ''}
115
+ - 建议: ${s.suggestion}
116
+ `).join('\n')}
117
+
118
+ 请逐一修复这些问题。
119
+ `;
120
+
121
+ // 调用 /om:start
122
+ // 使用 Skill 工具调用 /om:start
123
+ Skill({ skill: "om:start", args: taskDescription });
124
+ ```
125
+
126
+ 6. **BYPASS 模式**
130
127
 
131
128
  如果用户选择了"全部执行",进入 BYPASS 模式:
132
- - 不再请求用户确认
133
129
  - 自动批准所有操作
130
+ - 不再请求用户确认
134
131
  - 快速完成所有改进
135
132
 
136
133
  </process>
@@ -140,98 +137,57 @@ $ARGUMENTS
140
137
  </arguments>
141
138
 
142
139
  <examples>
143
- /om:check # 自动扫描当前项目
144
- /om:check 性能优化 # 聚焦性能相关改进
145
- /om:check 安全问题 # 聚焦安全相关改进
146
- /om:check --auto # 全自动执行 (无需确认)
140
+ /om:check # 自动扫描 → 用户确认 → 自动执行
141
+ /om:check 安全 # 聚焦安全问题 → 用户确认 → 自动修复
142
+ /om:check --auto # 全自动执行 (无确认)
147
143
  </examples>
148
144
 
149
145
  <notes>
150
- ## 检测类别说明
151
-
152
- | 类别 | 说明 | 示例 |
153
- |------|------|------|
154
- | bug | 代码缺陷 | TODO, FIXME, 潜在bug |
155
- | quality | 代码质量 | 过长函数, 复杂度, 重复代码 |
156
- | capability | 缺失能力 | 缺少测试, 文档, 类型定义 |
157
- | ux | 用户体验 | 错误提示, 帮助信息 |
158
- | style | 代码风格 | 命名, 格式, 一致性 |
159
- | security | 安全问题 | 硬编码密钥, SQL注入 |
160
- | common | 常见问题 | 魔法数字, 硬编码路径 |
161
- | prompt | Prompt 问题 | 注入风险, 缺少格式说明 |
162
- | skill | Skill 问题 | 缺少 frontmatter, objective |
163
- | agent | Agent 配置 | CLAUDE.md 缺少构建命令 |
164
-
165
- ## 优先级说明
166
-
167
- | 优先级 | 说明 | 处理建议 |
168
- |--------|------|----------|
169
- | critical | 严重问题 | 立即处理 |
170
- | high | 重要问题 | 优先处理 |
171
- | medium | 一般问题 | 计划处理 |
172
- | low | 轻微问题 | 有空再处理 |
173
-
174
- ## 项目类型识别
175
-
176
- 系统自动识别以下项目类型:
177
- - **openmatrix**: OpenMatrix 项目自身
178
- - **ai-project**: AI 项目 (包含 prompts/skills/agents)
179
- - **nodejs**: Node.js 项目
180
- - **typescript**: TypeScript 项目
181
- - **python**: Python 项目
182
- - **go**: Go 项目
183
- - **rust**: Rust 项目
184
- - **java**: Java 项目
185
- - **csharp**: C# 项目
186
- - **cpp**: C/C++ 项目
187
- - **php**: PHP 项目
188
- - **dart**: Dart 项目
189
-
190
- 根据项目类型,检测器会调整检测策略和建议。
191
-
192
- ## 与 /om:start 的关系
193
-
194
- `/om:check` 检测完成后,可以选择将改进项传递给 `/om:start` 执行:
146
+ ## 执行流程图
195
147
 
196
148
  ```
197
149
  /om:check
198
150
 
199
- ├── 检测项目 ──→ 生成建议列表
151
+ ├── 1. 检测项目 ──→ 生成建议列表
152
+
153
+ ├── 2. 展示结果 ──→ 用户选择执行方式
200
154
 
201
- ├── 用户选择 ──→ 筛选建议
155
+ ├── 3. 用户确认 ──→ 选择"全部执行"
202
156
 
203
- └── 执行改进 ──→ 调用 /om:start
204
-
205
- └── 正常的任务执行流程
157
+ └── 4. 自动执行 ──→ 调用 /om:start
158
+
159
+ ├── 任务规划
160
+ ├── 代码修改
161
+ ├── 质量验证
162
+ └── 完成 ✅
206
163
  ```
207
164
 
208
- ## 使用场景
165
+ ## 检测类别说明
209
166
 
210
- ### 场景 1: 日常维护
211
- ```
212
- 用户: /om:check
213
- 系统: 扫描项目...
214
- 发现 15 个改进建议
215
- 用户选择: 仅关键+高优先级
216
- 系统: 开始执行 5 个改进...
217
- ```
167
+ | 类别 | 说明 | 示例 |
168
+ |------|------|------|
169
+ | 🐛 bug | 代码缺陷 | TODO, FIXME, 潜在bug |
170
+ | 🔧 quality | 代码质量 | 过长函数, 复杂度 |
171
+ | 📦 capability | 缺失能力 | 缺少测试, 文档 |
172
+ | 🔒 security | 安全问题 | 硬编码密钥, SQL注入 |
173
+ | 🤖 prompt | Prompt 问题 | 注入风险, 缺少格式 |
174
+ | ⚡ skill | Skill 问题 | 缺少 frontmatter |
175
+ | 🧠 agent | Agent 配置 | CLAUDE.md 缺少构建命令 |
218
176
 
219
- ### 场景 2: 安全审计
220
- ```
221
- 用户: /om:check 安全
222
- 系统: 扫描安全问题...
223
- 发现 3 个安全隐患
224
- 用户选择: 全部执行
225
- 系统: 自动修复安全问题...
226
- ```
177
+ ## /om:start 的关系
178
+
179
+ `/om:check` 检测完成后,**自动**将改进项传递给 `/om:start` 执行:
227
180
 
228
- ### 场景 3: AI 项目检查
229
181
  ```
230
182
  用户: /om:check
231
- 系统: 检测到 AI 项目
232
- 扫描 prompts/skills/agent 配置...
233
- 发现 5 个 AI 相关建议
234
- 用户选择: 全部执行
235
- 系统: 优化 AI 配置...
183
+ 系统: 检测到 5 个问题...
184
+ [展示问题列表]
185
+ 请选择执行方式: [全部执行]
186
+ 系统: 正在调用 /om:start 执行改进...
187
+ 任务规划中...
188
+ → 执行改进...
189
+ → 完成!
236
190
  ```
191
+
192
+ **用户只需确认一次,后续全自动执行。**
237
193
  </notes>