codexmate 0.0.20 → 0.0.22

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 (96) hide show
  1. package/README.md +289 -152
  2. package/README.zh.md +321 -0
  3. package/cli/agents-files.js +224 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +1044 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/openai-bridge.js +950 -0
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/session-usage.concurrent.js +28 -0
  12. package/cli/session-usage.js +112 -0
  13. package/cli/session-usage.models.js +176 -0
  14. package/cli/skills.js +1141 -0
  15. package/cli/zip-commands.js +510 -0
  16. package/cli.js +9408 -9719
  17. package/lib/cli-models-utils.js +109 -1
  18. package/lib/cli-path-utils.js +69 -0
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/download-artifacts.js +77 -0
  21. package/lib/task-orchestrator.js +869 -0
  22. package/package.json +14 -10
  23. package/res/logo.png +0 -0
  24. package/res/vue.global.prod.js +13 -0
  25. package/web-ui/app.js +193 -15
  26. package/web-ui/index.html +5 -1
  27. package/web-ui/logic.agents-diff.mjs +1 -1
  28. package/web-ui/logic.claude.mjs +60 -0
  29. package/web-ui/logic.runtime.mjs +11 -7
  30. package/web-ui/logic.sessions.mjs +372 -21
  31. package/web-ui/modules/api.mjs +22 -1
  32. package/web-ui/modules/app.computed.dashboard.mjs +23 -10
  33. package/web-ui/modules/app.computed.index.mjs +4 -0
  34. package/web-ui/modules/app.computed.main-tabs.mjs +198 -0
  35. package/web-ui/modules/app.computed.session.mjs +521 -9
  36. package/web-ui/modules/app.methods.agents.mjs +62 -11
  37. package/web-ui/modules/app.methods.codex-config.mjs +189 -34
  38. package/web-ui/modules/app.methods.index.mjs +7 -1
  39. package/web-ui/modules/app.methods.install.mjs +24 -20
  40. package/web-ui/modules/app.methods.navigation.mjs +142 -1
  41. package/web-ui/modules/app.methods.openclaw-core.mjs +339 -39
  42. package/web-ui/modules/app.methods.openclaw-editing.mjs +39 -4
  43. package/web-ui/modules/app.methods.openclaw-persist.mjs +122 -4
  44. package/web-ui/modules/app.methods.providers.mjs +192 -53
  45. package/web-ui/modules/app.methods.session-actions.mjs +99 -19
  46. package/web-ui/modules/app.methods.session-browser.mjs +196 -5
  47. package/web-ui/modules/app.methods.session-timeline.mjs +22 -15
  48. package/web-ui/modules/app.methods.session-trash.mjs +3 -0
  49. package/web-ui/modules/app.methods.startup-claude.mjs +70 -71
  50. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  51. package/web-ui/modules/config-mode.computed.mjs +2 -0
  52. package/web-ui/modules/config-template-confirm-pref.mjs +33 -0
  53. package/web-ui/modules/i18n.mjs +1609 -0
  54. package/web-ui/modules/plugins.computed.mjs +220 -0
  55. package/web-ui/modules/plugins.methods.mjs +620 -0
  56. package/web-ui/modules/plugins.storage.mjs +37 -0
  57. package/web-ui/partials/index/layout-footer.html +1 -57
  58. package/web-ui/partials/index/layout-header.html +299 -175
  59. package/web-ui/partials/index/modal-config-template-agents.html +79 -29
  60. package/web-ui/partials/index/modal-confirm-toast.html +1 -1
  61. package/web-ui/partials/index/modal-health-check.html +14 -14
  62. package/web-ui/partials/index/modal-openclaw-config.html +47 -42
  63. package/web-ui/partials/index/modal-skills.html +130 -114
  64. package/web-ui/partials/index/modals-basic.html +71 -102
  65. package/web-ui/partials/index/panel-config-claude.html +50 -12
  66. package/web-ui/partials/index/panel-config-codex.html +34 -37
  67. package/web-ui/partials/index/panel-config-openclaw.html +10 -16
  68. package/web-ui/partials/index/panel-docs.html +147 -0
  69. package/web-ui/partials/index/panel-market.html +38 -38
  70. package/web-ui/partials/index/panel-orchestration.html +397 -0
  71. package/web-ui/partials/index/panel-plugins.html +243 -0
  72. package/web-ui/partials/index/panel-sessions.html +51 -146
  73. package/web-ui/partials/index/panel-settings.html +188 -96
  74. package/web-ui/partials/index/panel-usage.html +353 -0
  75. package/web-ui/session-helpers.mjs +221 -10
  76. package/web-ui/styles/base-theme.css +120 -229
  77. package/web-ui/styles/controls-forms.css +59 -51
  78. package/web-ui/styles/docs-panel.css +247 -0
  79. package/web-ui/styles/layout-shell.css +394 -128
  80. package/web-ui/styles/modals-core.css +18 -3
  81. package/web-ui/styles/navigation-panels.css +184 -183
  82. package/web-ui/styles/plugins-panel.css +518 -0
  83. package/web-ui/styles/responsive.css +102 -62
  84. package/web-ui/styles/sessions-list.css +13 -27
  85. package/web-ui/styles/sessions-preview.css +13 -7
  86. package/web-ui/styles/sessions-toolbar-trash.css +25 -0
  87. package/web-ui/styles/sessions-usage.css +581 -6
  88. package/web-ui/styles/settings-panel.css +166 -0
  89. package/web-ui/styles/skills-list.css +16 -11
  90. package/web-ui/styles/skills-market.css +63 -2
  91. package/web-ui/styles/task-orchestration.css +776 -0
  92. package/web-ui/styles/titles-cards.css +67 -66
  93. package/web-ui/styles.css +4 -0
  94. package/README.en.md +0 -259
  95. package/res/screenshot.png +0 -0
  96. package/res/vue.global.js +0 -18552
@@ -2,17 +2,17 @@
2
2
  主标题
3
3
  ============================================ */
4
4
  .main-title {
5
- font-size: var(--font-size-display);
6
- font-weight: var(--font-weight-display);
7
- line-height: var(--line-height-tight);
8
- letter-spacing: -0.03em;
9
- margin-bottom: 10px;
5
+ font-size: clamp(18px, 1.3vw, 22px);
6
+ font-weight: 700;
7
+ line-height: 1.15;
8
+ letter-spacing: -0.02em;
9
+ margin-bottom: 0;
10
10
  color: var(--color-text-primary);
11
11
  font-family: var(--font-family-display);
12
- background: linear-gradient(135deg, var(--color-text-primary) 0%, rgba(27, 23, 20, 0.78) 100%);
13
- -webkit-background-clip: text;
14
- -webkit-text-fill-color: transparent;
15
- background-clip: text;
12
+ background: none;
13
+ -webkit-background-clip: border-box;
14
+ -webkit-text-fill-color: currentColor;
15
+ background-clip: border-box;
16
16
  }
17
17
 
18
18
  .main-title .accent {
@@ -22,12 +22,12 @@
22
22
  }
23
23
 
24
24
  .subtitle {
25
- font-size: var(--font-size-body);
26
- color: var(--color-text-tertiary);
27
- line-height: var(--line-height-normal);
28
- margin-bottom: 20px;
29
- max-width: 640px;
30
- letter-spacing: 0.01em;
25
+ font-size: 13px;
26
+ color: var(--color-text-secondary);
27
+ line-height: 1.58;
28
+ margin-bottom: 0;
29
+ max-width: 70ch;
30
+ letter-spacing: 0;
31
31
  }
32
32
 
33
33
  /* ============================================
@@ -35,30 +35,30 @@
35
35
  ============================================ */
36
36
  .segmented-control {
37
37
  display: flex;
38
- background: rgba(255, 255, 255, 0.92);
39
- border-radius: var(--radius-xl);
40
- padding: 6px;
41
- margin-bottom: 20px;
38
+ background: var(--color-surface);
39
+ border-radius: 10px;
40
+ padding: 4px;
41
+ margin-bottom: 14px;
42
42
  position: relative;
43
- box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.06);
44
- border: 1px solid rgba(255, 255, 255, 0.7);
45
- backdrop-filter: blur(6px);
43
+ box-shadow: none;
44
+ border: 1px solid var(--color-border);
45
+ backdrop-filter: none;
46
46
  }
47
47
 
48
48
  .segment {
49
49
  flex: 1;
50
- padding: 11px 16px;
50
+ padding: 8px 10px;
51
51
  border: none;
52
52
  background: transparent;
53
53
  font-size: var(--font-size-body);
54
54
  font-weight: var(--font-weight-secondary);
55
55
  color: var(--color-text-secondary);
56
56
  cursor: pointer;
57
- border-radius: 10px;
58
- transition: all var(--transition-normal) var(--ease-spring);
57
+ border-radius: 8px;
58
+ transition: color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth);
59
59
  position: relative;
60
60
  z-index: 2;
61
- letter-spacing: 0.01em;
61
+ letter-spacing: 0;
62
62
  }
63
63
 
64
64
  .segment:hover {
@@ -66,9 +66,9 @@
66
66
  }
67
67
 
68
68
  .segment.active {
69
- color: var(--color-text-primary);
70
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.8) 100%);
71
- box-shadow: var(--shadow-subtle), inset 0 1px 0 rgba(255, 255, 255, 0.85);
69
+ color: var(--color-brand-dark);
70
+ background: var(--color-brand-light);
71
+ box-shadow: inset 0 0 0 1px rgba(199, 116, 98, 0.12);
72
72
  }
73
73
 
74
74
  /* ============================================
@@ -77,36 +77,36 @@
77
77
  .card-list {
78
78
  display: flex;
79
79
  flex-direction: column;
80
- gap: 12px;
81
- margin-bottom: 12px;
80
+ gap: 8px;
81
+ margin-bottom: 8px;
82
82
  }
83
83
 
84
84
  /* ============================================
85
85
  卡片
86
86
  ============================================ */
87
87
  .card {
88
- background: linear-gradient(180deg, #fffdf9 0%, #fff8f2 100%);
89
- border-radius: var(--radius-lg);
90
- padding: 10px;
88
+ background: var(--color-surface);
89
+ border-radius: 10px;
90
+ padding: 10px 12px;
91
91
  display: flex;
92
92
  align-items: center;
93
93
  justify-content: space-between;
94
94
  cursor: pointer;
95
95
  transition:
96
- transform var(--transition-normal) var(--ease-spring),
97
- box-shadow var(--transition-normal) var(--ease-spring),
98
- background-color var(--transition-fast) var(--ease-smooth);
99
- box-shadow: 0 10px 24px rgba(27, 23, 20, 0.08);
96
+ border-color var(--transition-fast) var(--ease-smooth),
97
+ background-color var(--transition-fast) var(--ease-smooth),
98
+ box-shadow var(--transition-fast) var(--ease-smooth);
99
+ box-shadow: none;
100
100
  user-select: none;
101
- will-change: transform;
102
- border: 1px solid rgba(216, 201, 184, 0.55);
101
+ will-change: auto;
102
+ border: 1px solid var(--color-border);
103
103
  position: relative;
104
104
  overflow: hidden;
105
105
  }
106
106
 
107
107
  .card:hover {
108
- transform: translateY(-1px);
109
- box-shadow: var(--shadow-card-hover);
108
+ border-color: var(--color-border-strong);
109
+ box-shadow: none;
110
110
  }
111
111
 
112
112
  .card::before,
@@ -118,10 +118,11 @@
118
118
 
119
119
  .card::before {
120
120
  left: 0;
121
- top: 10px;
122
- bottom: 10px;
121
+ top: 50%;
122
+ transform: translateY(-50%);
123
123
  width: 3px;
124
- border-radius: 999px;
124
+ height: 18px;
125
+ border-radius: 0 2px 2px 0;
125
126
  background: transparent;
126
127
  transition: background var(--transition-fast) var(--ease-smooth);
127
128
  }
@@ -129,9 +130,9 @@
129
130
  .card::after {
130
131
  inset: 0;
131
132
  border-radius: inherit;
132
- background: linear-gradient(120deg, rgba(255, 255, 255, 0.7) 0%, transparent 55%);
133
+ background: linear-gradient(120deg, rgba(255, 255, 255, 0.1) 0%, transparent 55%);
133
134
  opacity: 0;
134
- transition: opacity var(--transition-normal) var(--ease-smooth);
135
+ transition: opacity var(--transition-fast) var(--ease-smooth);
135
136
  }
136
137
 
137
138
  .card:active {
@@ -140,13 +141,13 @@
140
141
  }
141
142
 
142
143
  .card.active {
143
- background: linear-gradient(to bottom, rgba(210, 107, 90, 0.14) 0%, rgba(255, 255, 255, 0.98) 100%);
144
- border-color: rgba(201, 94, 75, 0.55);
145
- box-shadow: 0 10px 28px rgba(210, 107, 90, 0.14);
144
+ background: var(--color-brand-light);
145
+ border-color: rgba(199, 116, 98, 0.18);
146
+ box-shadow: none;
146
147
  }
147
148
 
148
149
  .card.active::before {
149
- background: linear-gradient(180deg, rgba(201, 94, 75, 0.95) 0%, rgba(201, 94, 75, 0.35) 100%);
150
+ background: var(--color-brand);
150
151
  }
151
152
 
152
153
  .card:hover::after {
@@ -160,44 +161,44 @@
160
161
  .card-leading {
161
162
  display: flex;
162
163
  align-items: center;
163
- gap: var(--spacing-sm);
164
+ gap: 10px;
164
165
  flex: 1;
165
166
  min-width: 0;
166
167
  }
167
168
 
168
169
  .card-icon {
169
- width: 40px;
170
- height: 40px;
171
- border-radius: var(--radius-sm);
172
- background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(247, 241, 232, 0.65) 100%);
170
+ width: 32px;
171
+ height: 32px;
172
+ border-radius: 8px;
173
+ background: rgba(199, 116, 98, 0.1);
173
174
  display: flex;
174
175
  align-items: center;
175
176
  justify-content: center;
176
177
  font-size: var(--font-size-title);
177
178
  font-weight: var(--font-weight-title);
178
- color: var(--color-text-secondary);
179
+ color: var(--color-brand-dark);
179
180
  flex-shrink: 0;
180
- transition: all var(--transition-normal) var(--ease-spring-soft);
181
- box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.7);
181
+ transition: background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth);
182
+ box-shadow: none;
182
183
  }
183
184
 
184
185
  .card.active .card-icon {
185
- background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
186
- color: white;
187
- box-shadow: 0 2px 8px rgba(210, 107, 90, 0.3);
186
+ background: rgba(199, 116, 98, 0.14);
187
+ color: var(--color-brand-dark);
188
+ box-shadow: none;
188
189
  }
189
190
 
190
191
  .card-content {
191
192
  display: flex;
192
193
  flex-direction: column;
193
- gap: 2px;
194
+ gap: 1px;
194
195
  min-width: 0;
195
196
  }
196
197
 
197
198
  .card-title {
198
199
  display: flex;
199
200
  align-items: center;
200
- gap: 8px;
201
+ gap: 6px;
201
202
  min-width: 0;
202
203
  font-size: var(--font-size-body);
203
204
  font-weight: var(--font-weight-secondary);
@@ -230,12 +231,12 @@
230
231
  }
231
232
 
232
233
  .card-subtitle {
233
- font-size: var(--font-size-secondary);
234
+ font-size: 12px;
234
235
  color: var(--color-text-tertiary);
235
236
  white-space: nowrap;
236
237
  overflow: hidden;
237
238
  text-overflow: ellipsis;
238
- opacity: 0.8;
239
+ opacity: 0.9;
239
240
  }
240
241
 
241
242
  .card-trailing {
package/web-ui/styles.css CHANGED
@@ -3,14 +3,18 @@
3
3
  @import url('./styles/navigation-panels.css');
4
4
  @import url('./styles/titles-cards.css');
5
5
  @import url('./styles/controls-forms.css');
6
+ @import url('./styles/settings-panel.css');
6
7
  @import url('./styles/sessions-toolbar-trash.css');
7
8
  @import url('./styles/sessions-list.css');
8
9
  @import url('./styles/sessions-preview.css');
9
10
  @import url('./styles/sessions-usage.css');
11
+ @import url('./styles/task-orchestration.css');
10
12
  @import url('./styles/modals-core.css');
11
13
  @import url('./styles/health-check-dialog.css');
12
14
  @import url('./styles/openclaw-structured.css');
13
15
  @import url('./styles/skills-market.css');
14
16
  @import url('./styles/skills-list.css');
17
+ @import url('./styles/plugins-panel.css');
18
+ @import url('./styles/docs-panel.css');
15
19
  @import url('./styles/feedback.css');
16
20
  @import url('./styles/responsive.css');
package/README.en.md DELETED
@@ -1,259 +0,0 @@
1
- <div align="center">
2
-
3
- # Codex Mate
4
-
5
- **Local configuration and session manager for Codex / Claude Code / OpenClaw**
6
-
7
- [![Build](https://img.shields.io/github/actions/workflow/status/SakuraByteCore/codexmate/release.yml?label=build)](https://github.com/SakuraByteCore/codexmate/actions/workflows/release.yml)
8
- [![Version](https://img.shields.io/npm/v/codexmate?label=version&registry_uri=https%3A%2F%2Fregistry.npmjs.org)](https://www.npmjs.com/package/codexmate)
9
- [![Downloads](https://img.shields.io/npm/dt/codexmate?label=downloads)](https://www.npmjs.com/package/codexmate)
10
- [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
11
- [![Node](https://img.shields.io/badge/node-%3E%3D14.0.0-green.svg)](https://nodejs.org)
12
-
13
- [Quick Start](#quick-start) · [Commands](#command-reference) · [Web UI](#web-ui) · [MCP](#mcp) · [中文](README.md)
14
-
15
- </div>
16
-
17
- ---
18
-
19
- ## What Is This?
20
-
21
- Codex Mate is a local-first CLI + Web UI for unified management of:
22
-
23
- - Codex provider/model switching and config writes
24
- - Claude Code profiles (writes to `~/.claude/settings.json`)
25
- - OpenClaw JSON5 profiles and workspace `AGENTS.md`
26
- - Local skills market for Codex / Claude Code (target switching, local skills management, cross-app import, ZIP distribution)
27
- - Local Codex/Claude sessions (list/filter/export/delete) with Usage analytics overview
28
-
29
- 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.
30
-
31
- ## Comparison
32
-
33
- | Dimension | Codex Mate | Manual File Editing |
34
- | --- | --- | --- |
35
- | Multi-tool management | Codex + Claude Code + OpenClaw in one entry | Different files and folders per tool |
36
- | Operation mode | CLI + local Web UI | Manual TOML/JSON/JSON5 edits |
37
- | Session handling | Browse/filter/Usage analytics/export/batch cleanup | Manual file location and processing |
38
- | Skills reuse | Local skills market + cross-app import + ZIP distribution | Manual folder copy and reconciliation |
39
- | Operational visibility | Unified view of config, sessions, and Usage summaries | Depends on manual file inspection and scattered commands |
40
- | Rollback readiness | Backup before first takeover | Easy to overwrite by mistake |
41
- | Automation integration | MCP stdio (read-only by default) | Requires custom scripting |
42
-
43
- ## Core Features
44
-
45
- **Configuration**
46
- - Provider/model switching (`switch`, `use`)
47
- - Codex `config.toml` template confirmation before write
48
- - Claude Code profile management and apply
49
- - OpenClaw JSON5 profile management
50
-
51
- **Session Management**
52
- - Unified Codex + Claude session list
53
- - Local session pinning with persistent pinned state and pinned-first ordering
54
- - Keyword/source/cwd filters
55
- - Usage subview with 7d / 30d session trends, message trends, source share, and top paths
56
- - Markdown export
57
- - Session-level and message-level delete (supports batch)
58
-
59
- **Skills Market**
60
- - Switch the skills install target between Codex and Claude Code
61
- - Inspect local installed skills, root paths, and status
62
- - Scan importable sources from `Codex` / `Claude Code` / `Agents`
63
- - Support cross-app import, ZIP import/export, and batch delete
64
-
65
- **Engineering Utilities**
66
- - MCP stdio domains (`tools`, `resources`, `prompts`)
67
- - Built-in proxy controls (`proxy`)
68
- - Auth profile management (`auth`)
69
- - Zip/unzip utilities
70
-
71
- ## Architecture
72
-
73
- ```mermaid
74
- flowchart TB
75
- subgraph Interfaces["Entry Surfaces"]
76
- CLI["CLI"]
77
- WEB["Web UI"]
78
- MCP["MCP Client"]
79
- OAI["Codex / OpenAI Client"]
80
- end
81
-
82
- subgraph Runtime["Codex Mate Runtime"]
83
- ENTRY["cli.js Entry"]
84
- API["Local HTTP API"]
85
- MCPS["MCP stdio Server"]
86
- PROXY["Built-in Proxy"]
87
- SERVICES["Config / Sessions & Usage / Skills Market / Workflow"]
88
- CORE["File IO / Network / Diff / Session Utils"]
89
- end
90
-
91
- subgraph Data["Local Files"]
92
- CODEX["~/.codex/config + auth + models"]
93
- CLAUDE["~/.claude/settings.json"]
94
- OPENCLAW["~/.openclaw/*.json5 + ~/.openclaw/openclaw.json + workspace/AGENTS.md"]
95
- SKILLS["~/.codex/skills / ~/.claude/skills / ~/.agents/skills"]
96
- STATE["sessions / usage aggregates / trash / workflow runs / skill exports"]
97
- end
98
-
99
- CLI --> ENTRY
100
- WEB -->|GET / + POST /api| API
101
- MCP -->|stdio JSON-RPC| MCPS
102
- OAI -->|HTTP /v1| PROXY
103
-
104
- ENTRY --> SERVICES
105
- API --> SERVICES
106
- MCPS --> SERVICES
107
- PROXY --> CORE
108
-
109
- SERVICES --> CORE
110
-
111
- CORE --> CODEX
112
- CORE --> CLAUDE
113
- CORE --> OPENCLAW
114
- CORE --> SKILLS
115
- CORE --> STATE
116
- ```
117
-
118
- ## Quick Start
119
-
120
- ### Install from npm
121
-
122
- ```bash
123
- npm install -g codexmate
124
- codexmate setup
125
- codexmate status
126
- codexmate run
127
- ```
128
-
129
- Default listen address is `0.0.0.0:3737` for LAN access, and browser auto-open is enabled by default.
130
-
131
- > Safety note: the unauthenticated management UI is exposed to your current LAN by default. Use trusted networks only; for local-only access, set `CODEXMATE_HOST=127.0.0.1` or pass `--host 127.0.0.1`.
132
-
133
- ### Run from source
134
-
135
- ```bash
136
- git clone https://github.com/SakuraByteCore/codexmate.git
137
- cd codexmate
138
- npm install
139
- npm start run
140
- ```
141
-
142
- ### Tests / CI (service only)
143
-
144
- ```bash
145
- npm start run --no-browser
146
- ```
147
-
148
- > Convention: automated tests validate service and API behavior only, without opening browser pages.
149
-
150
- ## Command Reference
151
-
152
- | Command | Description |
153
- | --- | --- |
154
- | `codexmate status` | Show current config status |
155
- | `codexmate setup` | Interactive setup |
156
- | `codexmate list` / `codexmate models` | List providers / models |
157
- | `codexmate switch <provider>` / `codexmate use <model>` | Switch provider / model |
158
- | `codexmate add <name> <URL> [API_KEY]` | Add provider |
159
- | `codexmate delete <name>` | Delete provider |
160
- | `codexmate claude <BaseURL> <API_KEY> [model]` | Write Claude Code config |
161
- | `codexmate auth <list\|import\|switch\|delete\|status>` | Auth profile management |
162
- | `codexmate proxy <status\|set\|apply\|enable\|start\|stop>` | Built-in proxy management |
163
- | `codexmate workflow <list\|get\|validate\|run\|runs>` | MCP workflow management |
164
- | `codexmate codex [args...] [--follow-up <text> repeatable]` | Codex CLI passthrough entrypoint (auto-adds `--yolo`, supports queued follow-up appends) |
165
- | `codexmate qwen [args...]` | Qwen CLI passthrough entrypoint |
166
- | `codexmate run [--host <HOST>] [--no-browser]` | Start Web UI |
167
- | `codexmate mcp serve [--read-only\|--allow-write]` | Start MCP stdio server |
168
- | `codexmate export-session --source <codex\|claude> ...` | Export session to Markdown |
169
- | `codexmate zip <path> [--max:0-9]` / `codexmate unzip <zip> [out]` | Zip / unzip |
170
- | `codexmate unzip-ext <zip-dir> [out] [--ext:suffix[,suffix...]] [--no-recursive]` | Extract files with target suffixes from ZIP files in a directory (default `.json`, recursive by default) |
171
-
172
- ### Codex Follow-up Append (Optional)
173
-
174
- ```bash
175
- codexmate codex --follow-up "scan repository first" --follow-up "then fix failing tests"
176
- codexmate codex --model gpt-5.3-codex --follow-up "step1" --follow-up "step2"
177
- ```
178
-
179
- > Note: both `--follow-up` and `--queued-follow-up` are accepted and repeatable.
180
-
181
- ## Web UI
182
-
183
- ### Codex Mode
184
- - Provider/model switching
185
- - Model list management
186
- - `~/.codex/AGENTS.md` editing
187
-
188
- ### Claude Code Mode
189
- - Multi-profile management
190
- - Default write to `~/.claude/settings.json`
191
- - Shareable import command copy
192
-
193
- ### OpenClaw Mode
194
- - JSON5 multi-profile management
195
- - Apply to `~/.openclaw/openclaw.json`
196
- - Manage `~/.openclaw/workspace/AGENTS.md`
197
-
198
- ### Sessions Mode
199
- - Unified Codex + Claude sessions
200
- - Browser / Usage subview switching
201
- - Local pin/unpin with persistent storage and pinned-first ordering
202
- - Search, filter, export, delete, batch cleanup
203
- - Usage view includes 7d / 30d session trends, message trends, source share, and top paths
204
-
205
- ### Skills Market Tab
206
- - Switch the skills install target between `Codex` and `Claude Code`
207
- - Show the current local skills root, installed items, and importable items
208
- - Scan importable sources under `Codex` / `Claude Code` / `Agents`
209
- - Support cross-app import, ZIP import/export, and batch delete
210
-
211
- ## MCP
212
-
213
- > Transport: `stdio`
214
-
215
- - Default: read-only tools
216
- - Enable writes: `--allow-write` or `CODEXMATE_MCP_ALLOW_WRITE=1`
217
- - Domains: `tools`, `resources`, `prompts`
218
-
219
- Examples:
220
-
221
- ```bash
222
- codexmate mcp serve --read-only
223
- codexmate mcp serve --allow-write
224
- ```
225
-
226
- ## Config Files
227
-
228
- - `~/.codex/config.toml`
229
- - `~/.codex/auth.json`
230
- - `~/.codex/models.json`
231
- - `~/.codex/provider-current-models.json`
232
- - `~/.claude/settings.json`
233
- - `~/.openclaw/openclaw.json`
234
- - `~/.openclaw/workspace/AGENTS.md`
235
-
236
- ## Environment Variables
237
-
238
- | Variable | Default | Description |
239
- | --- | --- | --- |
240
- | `CODEXMATE_PORT` | `3737` | Web server port |
241
- | `CODEXMATE_HOST` | `0.0.0.0` | Web listen host (set `127.0.0.1` for local-only access) |
242
- | `CODEXMATE_NO_BROWSER` | unset | Set `1` to disable browser auto-open |
243
- | `CODEXMATE_MCP_ALLOW_WRITE` | unset | Set `1` to allow MCP write tools by default |
244
- | `CODEXMATE_FORCE_RESET_EXISTING_CONFIG` | `0` | Set `1` to force bootstrap reset of existing config |
245
-
246
- ## Tech Stack
247
-
248
- - Node.js
249
- - Vue.js 3 (Web UI)
250
- - Native HTTP server
251
- - `@iarna/toml`, `json5`
252
-
253
- ## Contributing
254
-
255
- Issues and pull requests are accepted.
256
-
257
- ## License
258
-
259
- Apache-2.0
Binary file