codexmate 0.0.22 → 0.0.24

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 (66) hide show
  1. package/README.md +5 -3
  2. package/README.zh.md +8 -5
  3. package/cli/auth-profiles.js +23 -7
  4. package/cli/doctor-core.js +903 -0
  5. package/cli/import-skills-url.js +334 -0
  6. package/cli.js +304 -208
  7. package/lib/cli-models-utils.js +0 -40
  8. package/lib/cli-network-utils.js +28 -2
  9. package/package.json +5 -2
  10. package/plugins/README.md +20 -0
  11. package/plugins/README.zh-CN.md +20 -0
  12. package/plugins/prompt-templates/comment-polish/index.mjs +25 -0
  13. package/plugins/prompt-templates/computed.mjs +253 -0
  14. package/plugins/prompt-templates/index.mjs +8 -0
  15. package/plugins/prompt-templates/manifest.mjs +15 -0
  16. package/plugins/prompt-templates/methods.mjs +619 -0
  17. package/plugins/prompt-templates/overview.mjs +90 -0
  18. package/plugins/prompt-templates/ownership.mjs +19 -0
  19. package/plugins/prompt-templates/rule-ack/index.mjs +21 -0
  20. package/plugins/prompt-templates/storage.mjs +64 -0
  21. package/plugins/registry.mjs +16 -0
  22. package/res/logo-pack.webp +0 -0
  23. package/web-ui/app.js +68 -34
  24. package/web-ui/index.html +4 -3
  25. package/web-ui/modules/app.computed.dashboard.mjs +22 -22
  26. package/web-ui/modules/app.computed.main-tabs.mjs +9 -2
  27. package/web-ui/modules/app.methods.agents.mjs +91 -3
  28. package/web-ui/modules/app.methods.codex-config.mjs +153 -164
  29. package/web-ui/modules/app.methods.install.mjs +16 -0
  30. package/web-ui/modules/app.methods.navigation.mjs +76 -0
  31. package/web-ui/modules/app.methods.runtime.mjs +24 -2
  32. package/web-ui/modules/app.methods.session-browser.mjs +73 -1
  33. package/web-ui/modules/app.methods.startup-claude.mjs +12 -0
  34. package/web-ui/modules/app.methods.task-orchestration.mjs +96 -11
  35. package/web-ui/modules/config-mode.computed.mjs +1 -3
  36. package/web-ui/modules/i18n.dict.mjs +2039 -0
  37. package/web-ui/modules/i18n.mjs +2 -1555
  38. package/web-ui/modules/plugins.computed.mjs +2 -219
  39. package/web-ui/modules/plugins.methods.mjs +2 -619
  40. package/web-ui/modules/plugins.storage.mjs +11 -37
  41. package/web-ui/modules/sessions-filters-url.mjs +85 -0
  42. package/web-ui/partials/index/layout-header.html +38 -34
  43. package/web-ui/partials/index/modal-config-template-agents.html +3 -4
  44. package/web-ui/partials/index/modal-health-check.html +33 -60
  45. package/web-ui/partials/index/panel-config-claude.html +56 -15
  46. package/web-ui/partials/index/panel-config-codex.html +68 -19
  47. package/web-ui/partials/index/panel-config-openclaw.html +8 -3
  48. package/web-ui/partials/index/panel-dashboard.html +186 -0
  49. package/web-ui/partials/index/panel-docs.html +1 -1
  50. package/web-ui/partials/index/panel-market.html +3 -0
  51. package/web-ui/partials/index/panel-orchestration.html +105 -111
  52. package/web-ui/partials/index/panel-plugins.html +48 -12
  53. package/web-ui/partials/index/panel-sessions.html +12 -3
  54. package/web-ui/partials/index/panel-settings.html +1 -1
  55. package/web-ui/partials/index/panel-usage.html +7 -6
  56. package/web-ui/styles/controls-forms.css +16 -2
  57. package/web-ui/styles/dashboard.css +274 -0
  58. package/web-ui/styles/layout-shell.css +11 -5
  59. package/web-ui/styles/navigation-panels.css +8 -0
  60. package/web-ui/styles/plugins-panel.css +5 -0
  61. package/web-ui/styles/sessions-list.css +3 -3
  62. package/web-ui/styles/sessions-usage.css +37 -0
  63. package/web-ui/styles/skills-market.css +12 -2
  64. package/web-ui/styles/task-orchestration.css +57 -11
  65. package/web-ui/styles.css +1 -0
  66. package/res/logo.png +0 -0
package/README.md CHANGED
@@ -31,6 +31,7 @@ Codex Mate is a local-first CLI + Web UI for unified management of:
31
31
  - Local skills market for Codex / Claude Code (target switching, local skills management, cross-app import, ZIP distribution)
32
32
  - Local Codex/Claude sessions (list/filter/export/delete) with Usage analytics overview
33
33
  - Plugins (Prompt templates): reusable templates with variables and one-click copy
34
+ - Task orchestration: plan/queue/run/review local tasks
34
35
 
35
36
  It works on local files directly and does not require cloud hosting. The skills market is also local-first: it operates on local directories and does not depend on a remote marketplace.
36
37
 
@@ -59,9 +60,11 @@ It works on local files directly and does not require cloud hosting. The skills
59
60
  - Unified Codex + Claude session list
60
61
  - Local session pinning with persistent pinned state and pinned-first ordering
61
62
  - Keyword/source/cwd filters
63
+ - Fast search UX: short-lived query result caching to avoid rescanning on each keystroke
62
64
  - Usage subview with 7d / 30d session trends, message trends, source share, and top paths
63
65
  - Markdown export
64
- - Session-level and message-level delete (supports batch)
66
+ - Session-level and message-level delete (supports batch), with a local recycle bin for restore/purge
67
+ - Large-session preview optimization (fast tail preview path)
65
68
 
66
69
  **Skills Market**
67
70
  - Switch the skills install target between Codex and Claude Code
@@ -189,7 +192,7 @@ npm run reset
189
192
  npm run reset 79
190
193
  ```
191
194
 
192
- - `npm run reset`: prompt for a PR number; leave it blank to return to default `origin/main`
195
+ - `npm run reset`: reset to default `origin/main`
193
196
  - `npm run reset 79`: sync directly to the latest head snapshot of PR `#79`
194
197
  - The script also handles local branch switching, workspace cleanup, untracked file cleanup, and final state validation
195
198
 
@@ -205,7 +208,6 @@ npm run reset 79
205
208
  | `codexmate delete <name>` | Delete provider |
206
209
  | `codexmate claude <BaseURL> <API_KEY> [model]` | Write Claude Code config |
207
210
  | `codexmate auth <list\|import\|switch\|delete\|status>` | Auth profile management |
208
- | `codexmate proxy <status\|set\|apply\|enable\|start\|stop>` | Built-in proxy management |
209
211
  | `codexmate workflow <list\|get\|validate\|run\|runs>` | MCP workflow management |
210
212
  | `codexmate codex [args...] [--follow-up <text> repeatable]` | Codex CLI passthrough entrypoint (auto-adds `--yolo`, supports queued follow-up appends) |
211
213
  | `codexmate qwen [args...]` | Qwen CLI passthrough entrypoint |
package/README.zh.md CHANGED
@@ -31,7 +31,7 @@ Codex Mate 提供一套本地优先的 CLI + Web UI,用于统一管理:
31
31
  - Codex / Claude Code Skills 市场(安装目标切换、本地 skills 管理、跨应用导入、ZIP 分发)
32
32
  - Codex / Claude 本地会话浏览、筛选、导出、删除与 Usage 统计概览
33
33
  - 插件(提示词模板):模板复用、变量填写、一键复制
34
- - 任务编排(规划中,未开放)
34
+ - 任务编排:规划 / 排队 / 执行 / 回看
35
35
 
36
36
  项目不依赖云端托管,配置写入你的本地文件,便于审计和回滚。Skills 市场同样坚持本地优先,只操作本地目录,不依赖远程在线市场。
37
37
 
@@ -61,9 +61,11 @@ Codex Mate 提供一套本地优先的 CLI + Web UI,用于统一管理:
61
61
  - 同页查看 Codex 与 Claude 会话
62
62
  - 支持本地会话置顶,置顶状态持久化保存并优先排序显示
63
63
  - 关键词搜索、来源筛选、cwd 路径筛选
64
+ - 搜索体验优化:短周期结果缓存,避免输入时重复扫描
64
65
  - Usage 子页:近 7 天 / 近 30 天会话趋势、消息趋势、来源占比、高频路径
65
66
  - 会话导出 Markdown
66
- - 会话与消息级删除(支持批量)
67
+ - 会话与消息级删除(支持批量),并提供本地回收站用于恢复/彻底删除
68
+ - 大会话预览优化(快速 tail 预览路径)
67
69
 
68
70
  **Skills 市场**
69
71
  - 在 Codex 与 Claude Code 之间切换 skills 安装目标
@@ -75,8 +77,9 @@ Codex Mate 提供一套本地优先的 CLI + Web UI,用于统一管理:
75
77
  - 提示词模板:本地保存/编辑/复用(支持变量)
76
78
  - 编写 → 填参 → 一键复制的工作流(模板数据保存在浏览器存储)
77
79
 
78
- **任务编排(规划中,未开放)**
79
- - 当前版本暂未开放
80
+ **任务编排**
81
+ - DAG 节点拆分与波次并发
82
+ - 支持计划预览、执行、队列与运行详情
80
83
 
81
84
  **工程能力**
82
85
  - MCP stdio 能力(tools/resources/prompts)
@@ -192,7 +195,7 @@ npm run reset
192
195
  npm run reset 79
193
196
  ```
194
197
 
195
- - `npm run reset`:交互输入 PR 编号;留空则回到默认 `origin/main`
198
+ - `npm run reset`:直接重置到默认 `origin/main`
196
199
  - `npm run reset 79`:直接同步到 PR `#79` 的最新 head 快照
197
200
  - 脚本会自动完成本地分支切换、工作区清理、未跟踪文件清理与最终状态校验
198
201
 
@@ -28,12 +28,17 @@ function createAuthProfileController(deps = {}) {
28
28
  function normalizeAuthProfileName(value) {
29
29
  const raw = typeof value === 'string' ? value.trim() : '';
30
30
  if (!raw) return '';
31
- const sanitized = raw
31
+ return raw.slice(0, 120);
32
+ }
33
+
34
+ function sanitizeAuthProfileFileStem(value) {
35
+ const raw = typeof value === 'string' ? value.trim() : '';
36
+ if (!raw) return '';
37
+ return raw
32
38
  .replace(/[\\/:*?"<>|]/g, '-')
33
39
  .replace(/\s+/g, '-')
34
40
  .replace(/^-+|-+$/g, '')
35
41
  .slice(0, 120);
36
- return sanitized;
37
42
  }
38
43
 
39
44
  function normalizeAuthRegistry(raw) {
@@ -46,7 +51,7 @@ function createAuthProfileController(deps = {}) {
46
51
  version: 1,
47
52
  current: typeof raw.current === 'string' ? raw.current.trim() : '',
48
53
  items: items.map((item) => ({
49
- name: normalizeAuthProfileName(item.name) || item.name.trim(),
54
+ name: item.name.trim(),
50
55
  fileName: typeof item.fileName === 'string' ? path.basename(item.fileName) : '',
51
56
  type: typeof item.type === 'string' ? item.type : '',
52
57
  email: typeof item.email === 'string' ? item.email : '',
@@ -135,13 +140,24 @@ function createAuthProfileController(deps = {}) {
135
140
  const sourceFile = typeof options.sourceFile === 'string' ? options.sourceFile : '';
136
141
  const preferredName = normalizeAuthProfileName(options.name || '');
137
142
  const profileName = preferredName || getAuthProfileNameFallback(safePayload, sourceFile);
138
- const fileName = `${profileName}.json`;
139
- const profilePath = path.join(AUTH_PROFILES_DIR, fileName);
143
+ let fileStem = sanitizeAuthProfileFileStem(profileName) || sanitizeAuthProfileFileStem(sourceFile) || `auth-${Date.now()}`;
144
+
145
+ const registry = readAuthRegistry();
146
+ const existed = registry.items.find((item) => item && item.name === profileName);
147
+ if (existed && existed.fileName) {
148
+ fileStem = path.basename(existed.fileName, path.extname(existed.fileName));
149
+ }
150
+
151
+ let fileName = `${fileStem}.json`;
152
+ let profilePath = path.join(AUTH_PROFILES_DIR, fileName);
153
+ if (!existed && fs.existsSync(profilePath)) {
154
+ fileStem = `${fileStem}-${Date.now().toString(16).slice(-6)}`;
155
+ fileName = `${fileStem}.json`;
156
+ profilePath = path.join(AUTH_PROFILES_DIR, fileName);
157
+ }
140
158
 
141
159
  ensureDir(AUTH_PROFILES_DIR);
142
160
  writeJsonAtomic(profilePath, safePayload);
143
-
144
- const registry = readAuthRegistry();
145
161
  const meta = buildAuthProfileSummary(profileName, safePayload, fileName);
146
162
  meta.importedAt = toIsoTime(Date.now());
147
163
  meta.sourceFile = sourceFile || '';