codexmate 0.0.57 → 0.1.2

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.
@@ -143,6 +143,7 @@ const en = Object.freeze({
143
143
  'side.config': 'Config',
144
144
  'side.sessions': 'Sessions',
145
145
  'side.prompts': 'Prompts',
146
+ 'side.prompts.meta': 'Prompt files and presets',
146
147
  'side.plugins': 'Plugins',
147
148
  'side.system': 'System',
148
149
  'side.orchestration': 'Tasks',
@@ -167,19 +168,21 @@ const en = Object.freeze({
167
168
  'side.update.currentOnly': 'Current v{current}',
168
169
  'side.update.retry': 'Retry version check',
169
170
  'side.config.codex': 'Codex',
170
- 'side.config.codex.meta': 'Provider / Model',
171
+ 'side.config.codex.meta': 'Provider · Model',
171
172
  'side.config.claude': 'Claude Code',
172
- 'side.config.claude.meta': 'Claude Settings',
173
+ 'side.config.claude.meta': 'Settings',
173
174
  'side.config.openclaw': 'OpenClaw',
174
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
175
+ 'side.config.openclaw.meta': 'JSON5 · AGENTS',
175
176
  'side.config.opencode': 'OpenCode',
176
- 'side.config.opencode.meta': 'Config / Provider',
177
+ 'side.config.opencode.meta': 'Provider',
177
178
  'side.sessions.browser': 'Session Browser',
178
179
  'side.sessions.browser.meta': 'Browse / Export / Cleanup',
179
180
  'side.prompts.agents': 'AGENTS.md',
180
181
  'side.prompts.agents.meta': 'Codex prompt file',
181
182
  'side.prompts.claude': 'CLAUDE.md',
182
183
  'side.prompts.claude.meta': 'Claude prompt file',
184
+ 'side.prompts.presets': 'Preset pool',
185
+ 'side.prompts.presets.meta': 'Save and paste presets',
183
186
  'side.plugins.tools': 'Prompt Tools',
184
187
  'side.plugins.tools.meta': 'Templates / Variables',
185
188
  'side.plugins.templatesCount': '{count} templates',
@@ -223,6 +226,32 @@ const en = Object.freeze({
223
226
  'subtitle.prompts': 'Edit AGENTS.md and CLAUDE.md.',
224
227
  'prompts.subTab.codex': 'AGENTS.md (Codex)',
225
228
  'prompts.subTab.project': 'CLAUDE.md',
229
+ 'prompts.subTab.presets': 'Preset pool',
230
+ 'prompts.presets.title': 'Presets',
231
+ 'prompts.presets.hint': 'Manage presets.',
232
+ 'prompts.presets.namePlaceholder': 'Preset name',
233
+ 'prompts.presets.selectPlaceholder': 'Choose preset…',
234
+ 'prompts.presets.saveCurrent': 'Save preset',
235
+ 'prompts.presets.empty': 'No presets yet',
236
+ 'prompts.presets.updatedAt': 'Updated: {time}',
237
+ 'prompts.presets.renameAria': 'Rename prompt preset',
238
+ 'prompts.presets.open': 'Open preset pool',
239
+ 'prompts.presets.addCurrent': 'Add to preset pool',
240
+ 'prompts.presets.defaultName.project': 'Project CLAUDE.md - {path}',
241
+ 'prompts.presets.error.emptyName': 'Preset name cannot be empty',
242
+ 'prompts.presets.error.emptyContent': 'Preset content cannot be empty',
243
+ 'prompts.presets.error.duplicateName': 'A preset with this name already exists',
244
+ 'prompts.presets.confirm.addCurrentTitle': 'Add to preset pool?',
245
+ 'prompts.presets.confirm.addCurrentMessage': 'Save as “{name}”.',
246
+ 'prompts.presets.confirm.overwriteTitle': 'Overwrite preset?',
247
+ 'prompts.presets.confirm.overwriteMessage': 'A preset named “{name}” already exists. Overwrite it with the current editor content?',
248
+ 'prompts.presets.confirm.overwriteConfirm': 'Overwrite',
249
+ 'prompts.presets.confirm.deleteTitle': 'Delete preset?',
250
+ 'prompts.presets.confirm.deleteMessage': 'Delete preset “{name}”? This cannot be undone.',
251
+ 'prompts.presets.toast.saved': 'Preset saved',
252
+ 'prompts.presets.toast.pasted': 'Pasted, not saved.',
253
+ 'prompts.presets.toast.renamed': 'Preset renamed',
254
+ 'prompts.presets.toast.deleted': 'Preset deleted',
226
255
  'prompts.project.pathLabel': 'Project path (optional)',
227
256
  'prompts.project.selectPlaceholder': '-- Global (~/.claude/CLAUDE.md) --',
228
257
  'prompts.project.manualPlaceholder': 'Or enter a project root path...',
@@ -144,6 +144,7 @@ const ja = Object.freeze({
144
144
  'side.config': '設定',
145
145
  'side.sessions': 'セッション',
146
146
  'side.prompts': 'Prompts',
147
+ 'side.prompts.meta': 'プロンプトファイルとプリセット',
147
148
  'side.plugins': 'プラグイン',
148
149
  'side.system': 'システム',
149
150
  'side.orchestration': 'タスク',
@@ -168,19 +169,21 @@ const ja = Object.freeze({
168
169
  'side.update.currentOnly': '現在 v{current}',
169
170
  'side.update.retry': 'バージョン確認を再試行',
170
171
  'side.config.codex': 'Codex',
171
- 'side.config.codex.meta': 'Provider / Model',
172
+ 'side.config.codex.meta': 'Provider · Model',
172
173
  'side.config.claude': 'Claude Code',
173
- 'side.config.claude.meta': 'Claude Settings',
174
+ 'side.config.claude.meta': 'Settings',
174
175
  'side.config.openclaw': 'OpenClaw',
175
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
176
+ 'side.config.openclaw.meta': 'JSON5 · AGENTS',
176
177
  'side.config.opencode': 'OpenCode',
177
- 'side.config.opencode.meta': 'Config / Provider',
178
+ 'side.config.opencode.meta': 'Provider',
178
179
  'side.sessions.browser': 'セッション閲覧',
179
180
  'side.sessions.browser.meta': '閲覧 / エクスポート / クリーンアップ',
180
181
  'side.prompts.agents': 'AGENTS.md',
181
182
  'side.prompts.agents.meta': 'Codex プロンプトファイル',
182
183
  'side.prompts.claude': 'CLAUDE.md',
183
184
  'side.prompts.claude.meta': 'Claude プロンプトファイル',
185
+ 'side.prompts.presets': 'プリセットプール',
186
+ 'side.prompts.presets.meta': 'プリセットを保存・貼り付け',
184
187
  'side.plugins.tools': 'プロンプトツール',
185
188
  'side.plugins.tools.meta': 'テンプレート / 変数',
186
189
  'side.plugins.templatesCount': '{count} 件のテンプレート',
@@ -224,6 +227,32 @@ const ja = Object.freeze({
224
227
  'subtitle.prompts': 'AGENTS.md と CLAUDE.md を編集。',
225
228
  'prompts.subTab.codex': 'AGENTS.md (Codex)',
226
229
  'prompts.subTab.project': 'CLAUDE.md',
230
+ 'prompts.subTab.presets': 'プリセット',
231
+ 'prompts.presets.title': 'プリセット',
232
+ 'prompts.presets.hint': 'プリセットを管理します。',
233
+ 'prompts.presets.namePlaceholder': 'プリセット名',
234
+ 'prompts.presets.selectPlaceholder': 'プリセットを選択…',
235
+ 'prompts.presets.saveCurrent': 'プリセット保存',
236
+ 'prompts.presets.empty': 'プリセットはありません',
237
+ 'prompts.presets.updatedAt': '更新: {time}',
238
+ 'prompts.presets.renameAria': 'prompt プリセット名を変更',
239
+ 'prompts.presets.open': 'プリセットを開く',
240
+ 'prompts.presets.addCurrent': 'プリセットプールに追加',
241
+ 'prompts.presets.defaultName.project': 'プロジェクト CLAUDE.md - {path}',
242
+ 'prompts.presets.error.emptyName': 'プリセット名は空にできません',
243
+ 'prompts.presets.error.emptyContent': 'プリセット内容は空にできません',
244
+ 'prompts.presets.error.duplicateName': '同じ名前のプリセットが既に存在します',
245
+ 'prompts.presets.confirm.addCurrentTitle': 'プリセットプールに追加しますか?',
246
+ 'prompts.presets.confirm.addCurrentMessage': '「{name}」として保存します。',
247
+ 'prompts.presets.confirm.overwriteTitle': 'プリセットを上書きしますか?',
248
+ 'prompts.presets.confirm.overwriteMessage': '「{name}」というプリセットは既に存在します。現在のエディター内容で上書きしますか?',
249
+ 'prompts.presets.confirm.overwriteConfirm': '上書き',
250
+ 'prompts.presets.confirm.deleteTitle': 'プリセットを削除しますか?',
251
+ 'prompts.presets.confirm.deleteMessage': 'プリセット「{name}」を削除しますか?この操作は元に戻せません。',
252
+ 'prompts.presets.toast.saved': 'プリセットを保存しました',
253
+ 'prompts.presets.toast.pasted': '貼り付けました。未保存です。',
254
+ 'prompts.presets.toast.renamed': 'プリセット名を変更しました',
255
+ 'prompts.presets.toast.deleted': 'プリセットを削除しました',
227
256
  'prompts.project.pathLabel': 'プロジェクトパス(任意)',
228
257
  'prompts.project.selectPlaceholder': '-- グローバル (~/.claude/CLAUDE.md) --',
229
258
  'prompts.project.manualPlaceholder': 'またはプロジェクトルートパスを入力...',
@@ -104,6 +104,7 @@ const vi = Object.freeze({
104
104
  'side.config': 'Cấu hình',
105
105
  'side.sessions': 'Phiên',
106
106
  'side.prompts': 'Prompts',
107
+ 'side.prompts.meta': 'Tệp prompt và preset',
107
108
  'side.plugins': 'Plugin',
108
109
  'side.system': 'Hệ thống',
109
110
  'side.orchestration': 'Tác vụ',
@@ -128,19 +129,21 @@ const vi = Object.freeze({
128
129
  'side.update.currentOnly': 'Hiện tại v{current}',
129
130
  'side.update.retry': 'Thử kiểm tra phiên bản lại',
130
131
  'side.config.codex': 'Codex',
131
- 'side.config.codex.meta': 'Provider / Model',
132
+ 'side.config.codex.meta': 'Provider · Model',
132
133
  'side.config.claude': 'Claude Code',
133
- 'side.config.claude.meta': 'Cài đặt Claude',
134
+ 'side.config.claude.meta': 'Settings',
134
135
  'side.config.openclaw': 'OpenClaw',
135
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
136
+ 'side.config.openclaw.meta': 'JSON5 · AGENTS',
136
137
  'side.config.opencode': 'OpenCode',
137
- 'side.config.opencode.meta': 'Config / Provider',
138
+ 'side.config.opencode.meta': 'Provider',
138
139
  'side.sessions.browser': 'Trình duyệt phiên',
139
140
  'side.sessions.browser.meta': 'Duyệt / Xuất / Dọn dẹp',
140
141
  'side.prompts.agents': 'AGENTS.md',
141
142
  'side.prompts.agents.meta': 'Tệp lệnh Codex',
142
143
  'side.prompts.claude': 'CLAUDE.md',
143
144
  'side.prompts.claude.meta': 'Tệp lệnh Claude',
145
+ 'side.prompts.presets': 'Kho preset',
146
+ 'side.prompts.presets.meta': 'Preset prompt tái sử dụng',
144
147
  'side.plugins.tools': 'Công cụ prompt',
145
148
  'side.plugins.tools.meta': 'Mẫu / Biến',
146
149
  'side.plugins.templatesCount': '{count} mẫu',
@@ -238,6 +241,32 @@ const vi = Object.freeze({
238
241
  'subtitle.prompts': 'Chỉnh sửa AGENTS.md và CLAUDE.md.',
239
242
  'prompts.subTab.codex': 'AGENTS.md (Codex)',
240
243
  'prompts.subTab.project': 'CLAUDE.md',
244
+ 'prompts.subTab.presets': 'Kho preset',
245
+ 'prompts.presets.title': 'Preset',
246
+ 'prompts.presets.hint': 'Quản lý preset.',
247
+ 'prompts.presets.namePlaceholder': 'Tên preset',
248
+ 'prompts.presets.selectPlaceholder': 'Chọn preset…',
249
+ 'prompts.presets.saveCurrent': 'Lưu preset',
250
+ 'prompts.presets.empty': 'Chưa có preset',
251
+ 'prompts.presets.updatedAt': 'Cập nhật: {time}',
252
+ 'prompts.presets.renameAria': 'Đổi tên preset prompt',
253
+ 'prompts.presets.open': 'Mở kho preset',
254
+ 'prompts.presets.addCurrent': 'Thêm vào kho preset',
255
+ 'prompts.presets.defaultName.project': 'CLAUDE.md dự án - {path}',
256
+ 'prompts.presets.error.emptyName': 'Tên preset không được để trống',
257
+ 'prompts.presets.error.emptyContent': 'Nội dung preset không được để trống',
258
+ 'prompts.presets.error.duplicateName': 'Đã có preset trùng tên',
259
+ 'prompts.presets.confirm.addCurrentTitle': 'Thêm vào kho preset?',
260
+ 'prompts.presets.confirm.addCurrentMessage': 'Lưu thành “{name}”.',
261
+ 'prompts.presets.confirm.overwriteTitle': 'Ghi đè preset?',
262
+ 'prompts.presets.confirm.overwriteMessage': 'Preset “{name}” đã tồn tại. Ghi đè bằng nội dung editor hiện tại?',
263
+ 'prompts.presets.confirm.overwriteConfirm': 'Ghi đè',
264
+ 'prompts.presets.confirm.deleteTitle': 'Xóa preset?',
265
+ 'prompts.presets.confirm.deleteMessage': 'Xóa preset “{name}”? Không thể hoàn tác.',
266
+ 'prompts.presets.toast.saved': 'Đã lưu preset',
267
+ 'prompts.presets.toast.pasted': 'Đã dán, chưa lưu.',
268
+ 'prompts.presets.toast.renamed': 'Đã đổi tên preset',
269
+ 'prompts.presets.toast.deleted': 'Đã xóa preset',
241
270
  'prompts.project.pathLabel': 'Đường dẫn dự án (tùy chọn)',
242
271
  'prompts.project.selectPlaceholder': '-- Toàn cục (~/.claude/CLAUDE.md) --',
243
272
  'prompts.project.manualPlaceholder': 'Hoặc nhập đường dẫn gốc dự án...',
@@ -143,6 +143,7 @@ const zhTw = Object.freeze({
143
143
  'side.config': '設定',
144
144
  'side.sessions': '會話',
145
145
  'side.prompts': 'Prompts',
146
+ 'side.prompts.meta': 'Prompt 文件與預設',
146
147
  'side.plugins': '插件',
147
148
  'side.system': '系統',
148
149
  'side.orchestration': '任務',
@@ -167,19 +168,21 @@ const zhTw = Object.freeze({
167
168
  'side.update.currentOnly': '目前 v{current}',
168
169
  'side.update.retry': '重試版本檢查',
169
170
  'side.config.codex': 'Codex',
170
- 'side.config.codex.meta': 'Provider / Model',
171
+ 'side.config.codex.meta': 'Provider · Model',
171
172
  'side.config.claude': 'Claude Code',
172
- 'side.config.claude.meta': 'Claude Settings',
173
+ 'side.config.claude.meta': 'Settings',
173
174
  'side.config.openclaw': 'OpenClaw',
174
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
175
+ 'side.config.openclaw.meta': 'JSON5 · AGENTS',
175
176
  'side.config.opencode': 'OpenCode',
176
- 'side.config.opencode.meta': '設定 / Provider',
177
+ 'side.config.opencode.meta': 'Provider',
177
178
  'side.sessions.browser': '會話瀏覽',
178
179
  'side.sessions.browser.meta': '瀏覽 / 匯出 / 清理',
179
180
  'side.prompts.agents': 'AGENTS.md',
180
181
  'side.prompts.agents.meta': 'Codex 指令文件',
181
182
  'side.prompts.claude': 'CLAUDE.md',
182
183
  'side.prompts.claude.meta': 'Claude 指令文件',
184
+ 'side.prompts.presets': '預設池',
185
+ 'side.prompts.presets.meta': '儲存和貼上預設',
183
186
  'side.plugins.tools': '提示詞工具',
184
187
  'side.plugins.tools.meta': '模板 / 變量',
185
188
  'side.plugins.templatesCount': '{count} 個模板',
@@ -223,6 +226,32 @@ const zhTw = Object.freeze({
223
226
  'subtitle.prompts': '編輯 AGENTS.md 與 CLAUDE.md。',
224
227
  'prompts.subTab.codex': 'AGENTS.md (Codex)',
225
228
  'prompts.subTab.project': 'CLAUDE.md',
229
+ 'prompts.subTab.presets': '預設池',
230
+ 'prompts.presets.title': '預設池',
231
+ 'prompts.presets.hint': '管理預設。',
232
+ 'prompts.presets.namePlaceholder': '預設名稱',
233
+ 'prompts.presets.selectPlaceholder': '選擇預設…',
234
+ 'prompts.presets.saveCurrent': '存為預設',
235
+ 'prompts.presets.empty': '暫無預設',
236
+ 'prompts.presets.updatedAt': '更新時間:{time}',
237
+ 'prompts.presets.renameAria': '重新命名 prompt 預設',
238
+ 'prompts.presets.open': '打開預設池',
239
+ 'prompts.presets.addCurrent': '加入預設池',
240
+ 'prompts.presets.defaultName.project': '專案 CLAUDE.md - {path}',
241
+ 'prompts.presets.error.emptyName': '預設名稱不能為空',
242
+ 'prompts.presets.error.emptyContent': '預設內容不能為空',
243
+ 'prompts.presets.error.duplicateName': '已存在同名預設',
244
+ 'prompts.presets.confirm.addCurrentTitle': '加入預設池?',
245
+ 'prompts.presets.confirm.addCurrentMessage': '存為「{name}」。',
246
+ 'prompts.presets.confirm.overwriteTitle': '覆蓋預設?',
247
+ 'prompts.presets.confirm.overwriteMessage': '名為「{name}」的預設已存在。要用目前編輯器內容覆蓋它嗎?',
248
+ 'prompts.presets.confirm.overwriteConfirm': '覆蓋',
249
+ 'prompts.presets.confirm.deleteTitle': '刪除預設?',
250
+ 'prompts.presets.confirm.deleteMessage': '刪除預設「{name}」?此操作不可復原。',
251
+ 'prompts.presets.toast.saved': '預設已保存',
252
+ 'prompts.presets.toast.pasted': '已貼上,未儲存。',
253
+ 'prompts.presets.toast.renamed': '預設已重新命名',
254
+ 'prompts.presets.toast.deleted': '預設已刪除',
226
255
  'prompts.project.pathLabel': '專案路徑(可選)',
227
256
  'prompts.project.selectPlaceholder': '-- 全域 (~/.claude/CLAUDE.md) --',
228
257
  'prompts.project.manualPlaceholder': '或手動輸入專案根路徑...',
@@ -143,6 +143,7 @@ const zh = Object.freeze({
143
143
  'side.config': '配置',
144
144
  'side.sessions': '会话',
145
145
  'side.prompts': 'Prompts',
146
+ 'side.prompts.meta': 'Prompt 文件与预设',
146
147
  'side.plugins': '插件',
147
148
  'side.system': '系统',
148
149
  'side.orchestration': '任务',
@@ -167,19 +168,21 @@ const zh = Object.freeze({
167
168
  'side.update.currentOnly': '当前 v{current}',
168
169
  'side.update.retry': '重试版本检查',
169
170
  'side.config.codex': 'Codex',
170
- 'side.config.codex.meta': 'Provider / Model',
171
+ 'side.config.codex.meta': 'Provider · Model',
171
172
  'side.config.claude': 'Claude Code',
172
- 'side.config.claude.meta': 'Claude Settings',
173
+ 'side.config.claude.meta': 'Settings',
173
174
  'side.config.openclaw': 'OpenClaw',
174
- 'side.config.openclaw.meta': 'JSON5 / AGENTS',
175
+ 'side.config.openclaw.meta': 'JSON5 · AGENTS',
175
176
  'side.config.opencode': 'OpenCode',
176
- 'side.config.opencode.meta': '配置 / Provider',
177
+ 'side.config.opencode.meta': 'Provider',
177
178
  'side.sessions.browser': '会话浏览',
178
179
  'side.sessions.browser.meta': '浏览 / 导出 / 清理',
179
180
  'side.prompts.agents': 'AGENTS.md',
180
181
  'side.prompts.agents.meta': 'Codex 指令文件',
181
182
  'side.prompts.claude': 'CLAUDE.md',
182
183
  'side.prompts.claude.meta': 'Claude 指令文件',
184
+ 'side.prompts.presets': '预设池',
185
+ 'side.prompts.presets.meta': '保存和粘贴预设',
183
186
  'side.plugins.tools': '提示词工具',
184
187
  'side.plugins.tools.meta': '模板 / 变量',
185
188
  'side.plugins.templatesCount': '{count} 个模板',
@@ -223,6 +226,32 @@ const zh = Object.freeze({
223
226
  'subtitle.prompts': '编辑 AGENTS.md 与 CLAUDE.md。',
224
227
  'prompts.subTab.codex': 'AGENTS.md (Codex)',
225
228
  'prompts.subTab.project': 'CLAUDE.md',
229
+ 'prompts.subTab.presets': '预设池',
230
+ 'prompts.presets.title': '预设池',
231
+ 'prompts.presets.hint': '管理预设。',
232
+ 'prompts.presets.namePlaceholder': '预设名称',
233
+ 'prompts.presets.selectPlaceholder': '选择预设…',
234
+ 'prompts.presets.saveCurrent': '存为预设',
235
+ 'prompts.presets.empty': '暂无预设',
236
+ 'prompts.presets.updatedAt': '更新时间:{time}',
237
+ 'prompts.presets.renameAria': '重命名 prompt 预设',
238
+ 'prompts.presets.open': '打开预设池',
239
+ 'prompts.presets.addCurrent': '添加到预设池',
240
+ 'prompts.presets.defaultName.project': '项目 CLAUDE.md - {path}',
241
+ 'prompts.presets.error.emptyName': '预设名称不能为空',
242
+ 'prompts.presets.error.emptyContent': '预设内容不能为空',
243
+ 'prompts.presets.error.duplicateName': '已存在同名预设',
244
+ 'prompts.presets.confirm.addCurrentTitle': '添加到预设池?',
245
+ 'prompts.presets.confirm.addCurrentMessage': '保存为“{name}”。',
246
+ 'prompts.presets.confirm.overwriteTitle': '覆盖预设?',
247
+ 'prompts.presets.confirm.overwriteMessage': '名为“{name}”的预设已存在。要用当前编辑器内容覆盖它吗?',
248
+ 'prompts.presets.confirm.overwriteConfirm': '覆盖',
249
+ 'prompts.presets.confirm.deleteTitle': '删除预设?',
250
+ 'prompts.presets.confirm.deleteMessage': '删除预设“{name}”?此操作不可撤销。',
251
+ 'prompts.presets.toast.saved': '预设已保存',
252
+ 'prompts.presets.toast.pasted': '已粘贴,未保存。',
253
+ 'prompts.presets.toast.renamed': '预设已重命名',
254
+ 'prompts.presets.toast.deleted': '预设已删除',
226
255
  'prompts.project.pathLabel': '项目路径(可选)',
227
256
  'prompts.project.selectPlaceholder': '-- 全局 (~/.claude/CLAUDE.md) --',
228
257
  'prompts.project.manualPlaceholder': '或手动输入项目根路径...',
@@ -913,9 +942,9 @@ const zh = Object.freeze({
913
942
  'modal.agents.hint.claudeProjectGlobal': '保存后会写入 ~/.claude/CLAUDE.md。',
914
943
  'modal.agents.contentLabel.claudeProject': 'CLAUDE.md 内容',
915
944
  'modal.agents.placeholder.claudeProject': '在这里编辑 CLAUDE.md',
916
- 'modal.agents.hint.openclaw': '保存后会写入 OpenClaw Workspace 下的 AGENTS.md',
945
+ 'modal.agents.hint.openclaw': 'Workspace / AGENTS.md',
917
946
  'modal.agents.title.openclawWorkspaceFile': 'OpenClaw 工作区文件: {fileName}',
918
- 'modal.agents.hint.openclawWorkspaceFile': '保存后会写入 OpenClaw Workspace 下的 {fileName}',
947
+ 'modal.agents.hint.openclawWorkspaceFile': 'Workspace / {fileName}',
919
948
  'config.url.unset': '未设 URL',
920
949
  'config.model.unset': '未设置模型',
921
950
  'config.badge.system': '系统',
@@ -1485,11 +1514,11 @@ const zh = Object.freeze({
1485
1514
  'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json,支持 JSON5。',
1486
1515
  'openclaw.workspace.title': 'OpenClaw 工作区',
1487
1516
  'openclaw.configs.hint': '选择常用配置,或进入编辑器维护完整 JSON5。',
1488
- 'openclaw.agents.hint': '读写 Workspace AGENTS.md,默认路径 ~/.openclaw/workspace/AGENTS.md。',
1517
+ 'openclaw.agents.hint': 'Workspace / AGENTS.md',
1489
1518
  'openclaw.agents.open': '打开 AGENTS.md',
1490
1519
  'openclaw.workspaceFile': '工作区文件',
1491
1520
  'openclaw.workspace.placeholder': '例如: SOUL.md',
1492
- 'openclaw.workspace.hint': '仅限 Workspace 内的 .md 文件。',
1521
+ 'openclaw.workspace.hint': 'Workspace .md',
1493
1522
  'openclaw.workspace.open': '打开工作区文件',
1494
1523
  'openclaw.configured': '已配置',
1495
1524
  'openclaw.notConfigured': '未配置',
@@ -251,40 +251,23 @@
251
251
  <span v-if="opencodeModel">{{ t('common.current', { value: opencodeModel }) }}</span>
252
252
  </div>
253
253
  </button>
254
- </div>
255
-
256
- <div class="side-section" role="navigation" :aria-label="t('side.prompts')">
257
- <div class="side-section-title">{{ t('side.prompts') }}</div>
258
254
  <button
259
- id="side-tab-prompts-agents"
255
+ id="side-tab-prompts"
260
256
  data-main-tab="prompts"
261
- data-prompts-sub-tab="codex"
262
- :aria-current="mainTab === 'prompts' && promptsSubTab === 'codex' ? 'page' : null"
263
- :class="['side-item', { active: isMainTabNavActive('prompts') && promptsSubTab === 'codex' }]"
257
+ :aria-current="mainTab === 'prompts' ? 'page' : null"
258
+ :class="['side-item', { active: isMainTabNavActive('prompts') }]"
264
259
  @pointerdown="onMainTabPointerDown('prompts', $event)"
265
- @click="switchPromptsSubTab('codex'); onMainTabClick('prompts')">
260
+ @click="onMainTabClick('prompts', $event)">
266
261
  <span class="side-item-icon" aria-hidden="true">P</span>
267
- <div class="side-item-title">{{ t('side.prompts.agents') }}</div>
268
- <div class="side-item-meta">
269
- <span>{{ t('side.prompts.agents.meta') }}</span>
270
- </div>
271
- </button>
272
- <button
273
- id="side-tab-prompts-project"
274
- data-main-tab="prompts"
275
- data-prompts-sub-tab="claude-project"
276
- :aria-current="mainTab === 'prompts' && promptsSubTab === 'claude-project' ? 'page' : null"
277
- :class="['side-item', { active: isMainTabNavActive('prompts') && promptsSubTab === 'claude-project' }]"
278
- @pointerdown="onMainTabPointerDown('prompts', $event)"
279
- @click="switchPromptsSubTab('claude-project'); onMainTabClick('prompts')">
280
- <span class="side-item-icon" aria-hidden="true">M</span>
281
- <div class="side-item-title">{{ t('side.prompts.claude') }}</div>
262
+ <div class="side-item-title">{{ t('side.prompts') }}</div>
282
263
  <div class="side-item-meta">
283
- <span>{{ t('side.prompts.claude.meta') }}</span>
264
+ <span>{{ t('side.prompts.meta') }}</span>
284
265
  </div>
285
266
  </button>
267
+
286
268
  </div>
287
269
 
270
+
288
271
  <div class="side-section" role="navigation" :aria-label="t('side.sessions')">
289
272
  <div class="side-section-title">{{ t('side.sessions') }}</div>
290
273
  <button
@@ -117,8 +117,8 @@
117
117
  </div>
118
118
  </div>
119
119
 
120
- <div class="modal-editor-body">
121
- <div class="form-group">
120
+ <div class="modal-editor-body" :class="{ 'modal-editor-body--openclaw-workspace': agentsContext === 'openclaw-workspace' }">
121
+ <div class="form-group agents-target-file-group">
122
122
  <label class="form-label">{{ t('modal.agents.targetFile') }}</label>
123
123
  <div class="form-hint">
124
124
  {{ agentsPath || t('common.notLoaded') }}
@@ -129,8 +129,12 @@
129
129
  </div>
130
130
 
131
131
 
132
- <div class="form-group">
133
- <label class="form-label">{{ t(agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel') }}</label>
132
+ <div class="form-group agents-content-group">
133
+ <label class="form-label">
134
+ {{ agentsContext === 'openclaw-workspace'
135
+ ? `${agentsWorkspaceFileName || '工作区文件'} 内容`
136
+ : t(agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel') }}
137
+ </label>
134
138
  <div
135
139
  v-if="!agentsLoading && (hasAgentsContentChanged() || agentsDiffVisible)"
136
140
  class="agents-diff-save-alert">
@@ -11,6 +11,27 @@
11
11
  <button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
12
12
  </div>
13
13
  <div class="openclaw-layout">
14
+ <section class="settings-card settings-card--wide openclaw-summary-card" aria-label="OpenClaw 当前摘要">
15
+ <div class="settings-card-body">
16
+ <div class="openclaw-summary-header">
17
+ <div>
18
+ <div class="summary-eyebrow">OPENCLAW</div>
19
+ <div class="summary-title">配置与本地诊断</div>
20
+ </div>
21
+ <div class="summary-note">配置摘要</div>
22
+ </div>
23
+ <div class="openclaw-summary-grid">
24
+ <div v-for="item in getOpenclawStatusSummaryItems()" :key="item.key" :class="['openclaw-summary-item', item.tone || '']">
25
+ <div class="summary-item-label">{{ item.label }}</div>
26
+ <div class="summary-item-value">{{ item.value }}</div>
27
+ </div>
28
+ </div>
29
+ <div class="openclaw-diagnostic-note">
30
+ 本页仅管理配置与工作区文件。
31
+ </div>
32
+ </div>
33
+ </section>
34
+
14
35
  <section class="settings-card settings-card--wide openclaw-workspace-card">
15
36
  <div class="settings-card-body">
16
37
  <div class="openclaw-tools-grid">
@@ -18,27 +39,29 @@
18
39
  <div class="tool-icon">📄</div>
19
40
  <div class="tool-content">
20
41
  <div class="tool-title">AGENTS.md</div>
21
- <div class="tool-meta">{{ agentsLoading ? t('config.modelLoading') : t('openclaw.agents.hint') }}</div>
42
+ <div class="tool-meta">{{ agentsLoading ? t('config.modelLoading') : 'Workspace file' }}</div>
22
43
  </div>
23
44
  <svg class="tool-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
24
45
  <path d="M9 18l6-6-6-6"/>
25
46
  </svg>
26
47
  </button>
27
48
 
28
- <div class="openclaw-workspace-card">
29
- <label class="workspace-label" for="openclaw-workspace-file">{{ t('openclaw.workspaceFile') }}</label>
30
- <div class="workspace-input-group">
31
- <input
32
- id="openclaw-workspace-file"
33
- class="form-input"
34
- v-model="openclawWorkspaceFileName"
35
- :placeholder="t('openclaw.workspace.placeholder')">
36
- <button class="btn-tool" @click="openOpenclawWorkspaceEditor" :disabled="loading || !!initError || agentsLoading">
37
- {{ agentsLoading ? t('config.modelLoading') : t('openclaw.workspace.open') }}
38
- </button>
49
+ <button
50
+ v-for="fileName in getOpenclawQuickWorkspaceFiles()"
51
+ :key="fileName"
52
+ type="button"
53
+ class="openclaw-tool-btn"
54
+ @click="openOpenclawQuickWorkspaceFile(fileName)"
55
+ :disabled="loading || !!initError || agentsLoading">
56
+ <div class="tool-icon">📄</div>
57
+ <div class="tool-content">
58
+ <div class="tool-title">{{ fileName }}</div>
59
+ <div class="tool-meta">Workspace file</div>
39
60
  </div>
40
- <div class="workspace-meta">{{ t('openclaw.workspace.hint') }}</div>
41
- </div>
61
+ <svg class="tool-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
62
+ <path d="M9 18l6-6-6-6"/>
63
+ </svg>
64
+ </button>
42
65
  </div>
43
66
  </div>
44
67
  </section>
@@ -60,6 +83,11 @@
60
83
  <div class="card-content">
61
84
  <div class="card-title">{{ name }}</div>
62
85
  <div class="card-subtitle">{{ openclawSubtitle(config) }}</div>
86
+ <div v-if="openclawHasContent(config)" class="openclaw-config-summary-mini">
87
+ <span v-for="item in getOpenclawConfigSummary(config).slice(0, 3)" :key="item.key">
88
+ {{ item.label }}: {{ item.value }}
89
+ </span>
90
+ </div>
63
91
  </div>
64
92
  </div>
65
93
  <div class="card-trailing">
@@ -5,9 +5,9 @@
5
5
  id="panel-prompts"
6
6
  role="tabpanel"
7
7
  aria-labelledby="tab-prompts">
8
- <div class="segmented-control">
9
- <button type="button" :class="['segment', { active: promptsSubTab === 'codex' }]" @click="switchPromptsSubTab('codex')">{{ t('prompts.subTab.codex') }}</button>
10
- <button type="button" :class="['segment', { active: promptsSubTab === 'claude-project' }]" @click="switchPromptsSubTab('claude-project')">{{ t('prompts.subTab.project') }}</button>
8
+ <div class="prompts-md-tabs" role="tablist" :aria-label="t('tab.prompts')">
9
+ <button type="button" :class="['prompts-md-tab', { active: promptsSubTab === 'codex' }]" role="tab" :aria-selected="promptsSubTab === 'codex'" @click="switchPromptsSubTab('codex')">{{ t('prompts.subTab.codex') }}</button>
10
+ <button type="button" :class="['prompts-md-tab', { active: promptsSubTab === 'claude-project' }]" role="tab" :aria-selected="promptsSubTab === 'claude-project'" @click="switchPromptsSubTab('claude-project')">{{ t('prompts.subTab.project') }}</button>
11
11
  </div>
12
12
 
13
13
  <div v-if="promptsSubTab === 'claude-project'" class="project-path-selector">
@@ -32,6 +32,7 @@
32
32
  </div>
33
33
  </div>
34
34
 
35
+
35
36
  <div class="prompts-editor">
36
37
  <div class="prompts-editor-toolbar">
37
38
  <div class="form-hint">
@@ -83,6 +84,68 @@
83
84
  </div>
84
85
  </div>
85
86
  </div>
87
+ <div class="prompt-presets-inline-row">
88
+ <div class="prompt-presets-inline-group">
89
+ <label class="prompt-presets-inline-label">{{ t('prompts.presets.title') }}</label>
90
+ <select
91
+ class="form-input prompt-presets-select"
92
+ :disabled="agentsLoading || agentsSaving || agentsDiffVisible || !promptPresets.length"
93
+ :title="t('prompts.presets.title')"
94
+ @change="applyPromptPresetSelection($event)">
95
+ <option value="">{{ t('prompts.presets.selectPlaceholder') }}</option>
96
+ <option v-for="preset in promptPresets" :key="preset.id" :value="preset.id">{{ preset.name }}</option>
97
+ </select>
98
+ </div>
99
+ <div class="prompt-presets-inline-group prompt-presets-inline-group--save">
100
+ <input
101
+ type="text"
102
+ class="form-input prompt-presets-name-input"
103
+ v-model="promptPresetNameDraft"
104
+ :placeholder="t('prompts.presets.namePlaceholder')"
105
+ :disabled="agentsLoading || agentsSaving || agentsDiffVisible"
106
+ @keydown.enter.prevent="saveCurrentPromptAsPreset">
107
+ <button
108
+ type="button"
109
+ class="btn-mini btn-confirm-mini"
110
+ @click="saveCurrentPromptAsPreset"
111
+ :disabled="promptPresetSaving || agentsLoading || agentsSaving || agentsDiffVisible"
112
+ :title="t('prompts.presets.saveCurrent')">
113
+ {{ t('prompts.presets.saveCurrent') }}
114
+ </button>
115
+ </div>
116
+ </div>
117
+ <details class="prompt-presets-panel">
118
+ <summary class="prompt-presets-summary">
119
+ <span>{{ t('prompts.presets.title') }}</span>
120
+ <small>{{ t('prompts.presets.hint') }}</small>
121
+ </summary>
122
+ <div class="form-group prompt-presets-body">
123
+ <div class="editor-frame prompt-presets-frame">
124
+ <div v-if="!promptPresets.length" class="state-message prompt-presets-empty">{{ t('prompts.presets.empty') }}</div>
125
+ <div v-else class="prompt-presets-list">
126
+ <article v-for="preset in promptPresets" :key="preset.id" class="prompt-preset-row">
127
+ <div class="prompt-preset-main">
128
+ <input
129
+ type="text"
130
+ class="form-input prompt-preset-name"
131
+ :value="getPromptPresetRenameDraft(preset)"
132
+ @input="setPromptPresetRenameDraft(preset.id, $event.target.value)"
133
+ @keydown.enter.prevent="renamePromptPreset(preset)"
134
+ :aria-label="t('prompts.presets.renameAria')">
135
+ <div class="form-hint">{{ t('prompts.presets.updatedAt', { time: formatPromptPresetTime(preset.updatedAt) }) }}</div>
136
+ <pre class="prompt-preset-preview">{{ preset.content }}</pre>
137
+ </div>
138
+ <div class="prompts-editor-actions prompt-preset-actions">
139
+ <button type="button" class="btn-mini" @click="renamePromptPreset(preset)">{{ t('common.save') }}</button>
140
+ <button type="button" class="btn-mini" @click="applyPromptPresetToEditor(preset)">{{ t('common.paste') }}</button>
141
+ <button type="button" class="btn-mini btn-danger-mini" @click="deletePromptPreset(preset)">{{ t('common.delete') }}</button>
142
+ </div>
143
+ </article>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ </details>
148
+
86
149
 
87
150
  <div class="form-group">
88
151
  <div v-if="agentsDiffVisible">