codexmate 0.0.40 → 0.0.41
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.
- package/README.md +168 -156
- package/README.zh.md +168 -156
- package/cli/agents-files.js +230 -230
- package/cli/analytics-export-args.js +68 -68
- package/cli/archive-helpers.js +453 -453
- package/cli/auth-profiles.js +375 -375
- package/cli/builtin-proxy.js +2144 -2144
- package/cli/claude-proxy.js +1022 -1022
- package/cli/config-bootstrap.js +407 -407
- package/cli/config-health.js +454 -454
- package/cli/doctor-core.js +903 -903
- package/cli/import-skills-url.js +356 -356
- package/cli/local-bridge.js +556 -556
- package/cli/openai-bridge.js +1984 -1984
- package/cli/openclaw-config.js +629 -629
- package/cli/session-convert-args.js +69 -69
- package/cli/session-convert-io.js +82 -82
- package/cli/session-convert.js +150 -150
- package/cli/session-usage.concurrent.js +28 -28
- package/cli/session-usage.js +304 -304
- package/cli/session-usage.models.js +176 -176
- package/cli/skills.js +1141 -1141
- package/cli/update.js +171 -171
- package/cli/zip-commands.js +510 -510
- package/cli.js +16458 -16341
- package/lib/automation.js +404 -404
- package/lib/cli-file-utils.js +151 -151
- package/lib/cli-models-utils.js +440 -440
- package/lib/cli-network-utils.js +190 -190
- package/lib/cli-path-utils.js +85 -85
- package/lib/cli-session-utils.js +121 -121
- package/lib/cli-sessions.js +427 -427
- package/lib/cli-utils.js +155 -155
- package/lib/cli-webhook.js +154 -154
- package/lib/download-artifacts.js +92 -92
- package/lib/mcp-stdio.js +453 -453
- package/lib/task-orchestrator.js +869 -869
- package/lib/text-diff.js +303 -303
- package/lib/win-tray.js +119 -119
- package/lib/workflow-engine.js +340 -340
- package/package.json +77 -77
- package/plugins/README.md +20 -20
- package/plugins/README.zh-CN.md +20 -20
- package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
- package/plugins/prompt-templates/computed.mjs +311 -311
- package/plugins/prompt-templates/index.mjs +8 -8
- package/plugins/prompt-templates/manifest.mjs +18 -18
- package/plugins/prompt-templates/methods.mjs +553 -553
- package/plugins/prompt-templates/overview.mjs +91 -91
- package/plugins/prompt-templates/ownership.mjs +19 -19
- package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
- package/plugins/prompt-templates/storage.mjs +64 -64
- package/plugins/registry.mjs +16 -16
- package/web-ui/app.js +695 -695
- package/web-ui/index.html +37 -37
- package/web-ui/logic.agents-diff.mjs +386 -386
- package/web-ui/logic.claude.mjs +172 -172
- package/web-ui/logic.codex.mjs +69 -69
- package/web-ui/logic.mjs +5 -5
- package/web-ui/logic.runtime.mjs +128 -128
- package/web-ui/logic.session-convert.mjs +70 -70
- package/web-ui/logic.sessions.mjs +782 -782
- package/web-ui/modules/api.mjs +90 -90
- package/web-ui/modules/app.computed.dashboard.mjs +252 -252
- package/web-ui/modules/app.computed.index.mjs +17 -17
- package/web-ui/modules/app.computed.main-tabs.mjs +214 -214
- package/web-ui/modules/app.computed.session.mjs +876 -876
- package/web-ui/modules/app.constants.mjs +15 -15
- package/web-ui/modules/app.methods.agents.mjs +651 -651
- package/web-ui/modules/app.methods.claude-config.mjs +412 -412
- package/web-ui/modules/app.methods.codex-config.mjs +869 -869
- package/web-ui/modules/app.methods.index.mjs +96 -96
- package/web-ui/modules/app.methods.install.mjs +205 -205
- package/web-ui/modules/app.methods.navigation.mjs +804 -804
- package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
- package/web-ui/modules/app.methods.openclaw-editing.mjs +420 -420
- package/web-ui/modules/app.methods.openclaw-persist.mjs +375 -375
- package/web-ui/modules/app.methods.providers.mjs +601 -601
- package/web-ui/modules/app.methods.runtime.mjs +420 -420
- package/web-ui/modules/app.methods.session-actions.mjs +591 -591
- package/web-ui/modules/app.methods.session-browser.mjs +1018 -1018
- package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
- package/web-ui/modules/app.methods.session-trash.mjs +468 -468
- package/web-ui/modules/app.methods.startup-claude.mjs +554 -554
- package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
- package/web-ui/modules/app.methods.tool-config-permissions.mjs +87 -87
- package/web-ui/modules/app.methods.webhook.mjs +87 -87
- package/web-ui/modules/config-mode.computed.mjs +124 -124
- package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
- package/web-ui/modules/i18n/locales/en.mjs +1140 -1140
- package/web-ui/modules/i18n/locales/ja.mjs +1130 -1130
- package/web-ui/modules/i18n/locales/vi.mjs +239 -239
- package/web-ui/modules/i18n/locales/zh.mjs +1143 -1143
- package/web-ui/modules/i18n.dict.mjs +14 -14
- package/web-ui/modules/i18n.mjs +111 -111
- package/web-ui/modules/plugins.computed.mjs +3 -3
- package/web-ui/modules/plugins.methods.mjs +3 -3
- package/web-ui/modules/plugins.storage.mjs +11 -11
- package/web-ui/modules/provider-url-display.mjs +17 -17
- package/web-ui/modules/sessions-filters-url.mjs +138 -138
- package/web-ui/modules/skills.computed.mjs +107 -107
- package/web-ui/modules/skills.methods.mjs +513 -513
- package/web-ui/partials/index/layout-footer.html +13 -13
- package/web-ui/partials/index/layout-header.html +478 -478
- package/web-ui/partials/index/modal-config-template-agents.html +185 -185
- package/web-ui/partials/index/modal-confirm-toast.html +32 -32
- package/web-ui/partials/index/modal-health-check.html +45 -45
- package/web-ui/partials/index/modal-openclaw-config.html +344 -344
- package/web-ui/partials/index/modal-skills.html +200 -200
- package/web-ui/partials/index/modal-webhook.html +42 -42
- package/web-ui/partials/index/modals-basic.html +263 -263
- package/web-ui/partials/index/panel-config-claude.html +187 -187
- package/web-ui/partials/index/panel-config-codex.html +205 -205
- package/web-ui/partials/index/panel-config-openclaw.html +89 -89
- package/web-ui/partials/index/panel-dashboard.html +171 -171
- package/web-ui/partials/index/panel-docs.html +114 -114
- package/web-ui/partials/index/panel-market.html +104 -104
- package/web-ui/partials/index/panel-orchestration.html +391 -391
- package/web-ui/partials/index/panel-plugins.html +253 -253
- package/web-ui/partials/index/panel-sessions.html +319 -319
- package/web-ui/partials/index/panel-settings.html +181 -181
- package/web-ui/partials/index/panel-trash.html +82 -82
- package/web-ui/partials/index/panel-usage.html +181 -181
- package/web-ui/res/json5.min.js +1 -1
- package/web-ui/res/vue.global.prod.js +13 -13
- package/web-ui/res/vue.runtime.global.prod.js +7 -7
- package/web-ui/res/web-ui-render.precompiled.js +7666 -7666
- package/web-ui/session-helpers.mjs +602 -602
- package/web-ui/source-bundle.cjs +305 -305
- package/web-ui/styles/base-theme.css +291 -291
- package/web-ui/styles/bridge-pool.css +266 -266
- package/web-ui/styles/controls-forms.css +532 -532
- package/web-ui/styles/dashboard.css +438 -438
- package/web-ui/styles/docs-panel.css +245 -245
- package/web-ui/styles/feedback.css +108 -108
- package/web-ui/styles/health-check-dialog.css +144 -144
- package/web-ui/styles/layout-shell.css +711 -711
- package/web-ui/styles/modals-core.css +499 -499
- package/web-ui/styles/navigation-panels.css +399 -399
- package/web-ui/styles/openclaw-structured.css +616 -616
- package/web-ui/styles/plugins-panel.css +564 -564
- package/web-ui/styles/responsive.css +501 -501
- package/web-ui/styles/sessions-list.css +683 -683
- package/web-ui/styles/sessions-preview.css +407 -407
- package/web-ui/styles/sessions-toolbar-trash.css +518 -518
- package/web-ui/styles/sessions-usage.css +849 -849
- package/web-ui/styles/settings-panel.css +419 -419
- package/web-ui/styles/skills-list.css +305 -305
- package/web-ui/styles/skills-market.css +723 -723
- package/web-ui/styles/task-orchestration.css +822 -822
- package/web-ui/styles/titles-cards.css +486 -486
- package/web-ui/styles/trash-panel.css +90 -90
- package/web-ui/styles/webhook.css +115 -115
- package/web-ui/styles.css +24 -24
- package/web-ui.html +17 -17
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
<div
|
|
2
|
-
v-show="mainTab === 'docs'"
|
|
3
|
-
class="mode-content docs-mode-content"
|
|
4
|
-
id="panel-docs"
|
|
5
|
-
role="tabpanel"
|
|
6
|
-
aria-labelledby="tab-docs">
|
|
7
|
-
<div class="selector-section">
|
|
8
|
-
<div class="selector-header">
|
|
9
|
-
<span class="selector-title">{{ t('docs.title') }}</span>
|
|
10
|
-
<div class="skills-panel-note docs-section-note">{{ t('docs.subtitle') }}</div>
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<div class="docs-toolbar-grid">
|
|
14
|
-
<div class="docs-toolbar-card">
|
|
15
|
-
<label class="form-label" for="docs-install-package-manager">{{ t('common.packageManager') }}</label>
|
|
16
|
-
<select id="docs-install-package-manager" class="form-input" v-model="installPackageManager">
|
|
17
|
-
<option value="npm">npm</option>
|
|
18
|
-
<option value="pnpm">pnpm</option>
|
|
19
|
-
<option value="bun">bun</option>
|
|
20
|
-
</select>
|
|
21
|
-
</div>
|
|
22
|
-
<div class="docs-toolbar-card docs-toolbar-card-wide">
|
|
23
|
-
<label class="form-label">{{ t('common.mirror') }}</label>
|
|
24
|
-
<div class="install-action-tabs">
|
|
25
|
-
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'default' }" @click="setInstallRegistryPreset('default')">{{ t('common.official') }}</button>
|
|
26
|
-
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'npmmirror' }" @click="setInstallRegistryPreset('npmmirror')">npmmirror</button>
|
|
27
|
-
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'tencent' }" @click="setInstallRegistryPreset('tencent')">{{ t('docs.registry.tencent') }}</button>
|
|
28
|
-
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'custom' }" @click="setInstallRegistryPreset('custom')">{{ t('common.custom') }}</button>
|
|
29
|
-
</div>
|
|
30
|
-
<input v-if="installRegistryPreset === 'custom'" v-model="installRegistryCustom" class="form-input install-registry-input" placeholder="https://registry.example.com">
|
|
31
|
-
<div class="form-hint install-registry-hint" v-if="installRegistryPreview">{{ t('docs.registryHintPrefix') }} --registry={{ installRegistryPreview }}</div>
|
|
32
|
-
<div class="form-hint install-registry-hint" v-else-if="installRegistryPreset === 'custom'">{{ t('docs.registryHintCustom') }}</div>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="docs-toolbar-card docs-toolbar-card-wide">
|
|
35
|
-
<label class="form-label">{{ t('common.action') }}</label>
|
|
36
|
-
<div class="install-action-tabs">
|
|
37
|
-
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'install' }" @click="setInstallCommandAction('install')">{{ t('common.install') }}</button>
|
|
38
|
-
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'update' }" @click="setInstallCommandAction('update')">{{ t('common.update') }}</button>
|
|
39
|
-
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'uninstall' }" @click="setInstallCommandAction('uninstall')">{{ t('common.uninstall') }}</button>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<div class="docs-summary-strip">
|
|
45
|
-
<div class="docs-summary-item">
|
|
46
|
-
<span class="docs-summary-label">{{ t('common.targets') }}</span>
|
|
47
|
-
<strong class="docs-summary-value">{{ installTargetCards.length }}</strong>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="docs-summary-item">
|
|
50
|
-
<span class="docs-summary-label">{{ t('common.currentPm') }}</span>
|
|
51
|
-
<strong class="docs-summary-value">{{ String(installPackageManager || 'npm').toUpperCase() }}</strong>
|
|
52
|
-
</div>
|
|
53
|
-
<div class="docs-summary-item docs-summary-item-wide">
|
|
54
|
-
<span class="docs-summary-label">{{ t('common.registry') }}</span>
|
|
55
|
-
<strong class="docs-summary-value">{{ installRegistryPreview || t('common.defaultOfficial') }}</strong>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
<div class="selector-section">
|
|
61
|
-
<div class="selector-header">
|
|
62
|
-
<span class="selector-title">{{ t('docs.section.commands') }}</span>
|
|
63
|
-
<div class="skills-panel-note docs-section-note">{{ t('docs.section.commandsNote') }}</div>
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
<div class="install-list docs-install-list">
|
|
67
|
-
<div class="install-row docs-install-row" v-for="target in installTargetCards" :key="'docs-install-command-' + target.id + '-' + installCommandAction">
|
|
68
|
-
<div class="install-row-main">
|
|
69
|
-
<div class="docs-command-head">
|
|
70
|
-
<div class="install-row-title">{{ target.name }}</div>
|
|
71
|
-
<div class="docs-command-meta">
|
|
72
|
-
<span class="docs-meta-pill">{{ target.packageName }}</span>
|
|
73
|
-
<span class="docs-meta-pill">bin: {{ target.bin }}</span>
|
|
74
|
-
</div>
|
|
75
|
-
</div>
|
|
76
|
-
<div class="docs-command-row">
|
|
77
|
-
<div class="docs-command-box" role="group" :aria-label="t('docs.command.aria', { name: target.name })">
|
|
78
|
-
<code class="install-command">{{ target.command }}</code>
|
|
79
|
-
<button type="button" class="btn-mini docs-copy-btn" :disabled="!target.command" @click="copyInstallCommand(target.command)">{{ t('common.copy') }}</button>
|
|
80
|
-
</div>
|
|
81
|
-
</div>
|
|
82
|
-
<div v-if="target.id === 'codex' && target.termuxCommand && target.termuxCommand !== target.command" class="docs-command-row docs-command-row-secondary">
|
|
83
|
-
<div class="docs-command-box" role="group" :aria-label="t('docs.termuxAria')">
|
|
84
|
-
<code class="install-command"><span class="docs-command-prefix">{{ t('docs.termuxLabel') }}</span>{{ target.termuxCommand }}</code>
|
|
85
|
-
<button type="button" class="btn-mini docs-copy-btn" @click="copyInstallCommand(target.termuxCommand)">{{ t('common.copy') }}</button>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
<div class="selector-section">
|
|
94
|
-
<div class="selector-header">
|
|
95
|
-
<span class="selector-title">{{ t('docs.section.faq') }}</span>
|
|
96
|
-
<div class="skills-panel-note docs-section-note">{{ t('docs.section.faqNote') }}</div>
|
|
97
|
-
</div>
|
|
98
|
-
|
|
99
|
-
<div class="docs-help-grid">
|
|
100
|
-
<div class="docs-note-card">
|
|
101
|
-
<div class="docs-note-title">{{ t('common.troubleshooting') }}</div>
|
|
102
|
-
<ul class="install-help-list docs-help-list">
|
|
103
|
-
<li v-for="tip in installTroubleshootingTips" :key="tip">{{ tip }}</li>
|
|
104
|
-
</ul>
|
|
105
|
-
</div>
|
|
106
|
-
<div class="docs-note-card">
|
|
107
|
-
<div class="docs-note-title">{{ t('common.rules') }}</div>
|
|
108
|
-
<ul class="docs-static-list">
|
|
109
|
-
<li>{{ t('docs.rule.1') }}</li>
|
|
110
|
-
<li>{{ t('docs.rule.2') }}</li>
|
|
111
|
-
</ul>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
</div>
|
|
1
|
+
<div
|
|
2
|
+
v-show="mainTab === 'docs'"
|
|
3
|
+
class="mode-content docs-mode-content"
|
|
4
|
+
id="panel-docs"
|
|
5
|
+
role="tabpanel"
|
|
6
|
+
aria-labelledby="tab-docs">
|
|
7
|
+
<div class="selector-section">
|
|
8
|
+
<div class="selector-header">
|
|
9
|
+
<span class="selector-title">{{ t('docs.title') }}</span>
|
|
10
|
+
<div class="skills-panel-note docs-section-note">{{ t('docs.subtitle') }}</div>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="docs-toolbar-grid">
|
|
14
|
+
<div class="docs-toolbar-card">
|
|
15
|
+
<label class="form-label" for="docs-install-package-manager">{{ t('common.packageManager') }}</label>
|
|
16
|
+
<select id="docs-install-package-manager" class="form-input" v-model="installPackageManager">
|
|
17
|
+
<option value="npm">npm</option>
|
|
18
|
+
<option value="pnpm">pnpm</option>
|
|
19
|
+
<option value="bun">bun</option>
|
|
20
|
+
</select>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="docs-toolbar-card docs-toolbar-card-wide">
|
|
23
|
+
<label class="form-label">{{ t('common.mirror') }}</label>
|
|
24
|
+
<div class="install-action-tabs">
|
|
25
|
+
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'default' }" @click="setInstallRegistryPreset('default')">{{ t('common.official') }}</button>
|
|
26
|
+
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'npmmirror' }" @click="setInstallRegistryPreset('npmmirror')">npmmirror</button>
|
|
27
|
+
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'tencent' }" @click="setInstallRegistryPreset('tencent')">{{ t('docs.registry.tencent') }}</button>
|
|
28
|
+
<button type="button" class="btn-mini" :class="{ active: installRegistryPreset === 'custom' }" @click="setInstallRegistryPreset('custom')">{{ t('common.custom') }}</button>
|
|
29
|
+
</div>
|
|
30
|
+
<input v-if="installRegistryPreset === 'custom'" v-model="installRegistryCustom" class="form-input install-registry-input" placeholder="https://registry.example.com">
|
|
31
|
+
<div class="form-hint install-registry-hint" v-if="installRegistryPreview">{{ t('docs.registryHintPrefix') }} --registry={{ installRegistryPreview }}</div>
|
|
32
|
+
<div class="form-hint install-registry-hint" v-else-if="installRegistryPreset === 'custom'">{{ t('docs.registryHintCustom') }}</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="docs-toolbar-card docs-toolbar-card-wide">
|
|
35
|
+
<label class="form-label">{{ t('common.action') }}</label>
|
|
36
|
+
<div class="install-action-tabs">
|
|
37
|
+
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'install' }" @click="setInstallCommandAction('install')">{{ t('common.install') }}</button>
|
|
38
|
+
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'update' }" @click="setInstallCommandAction('update')">{{ t('common.update') }}</button>
|
|
39
|
+
<button type="button" class="btn-mini" :class="{ active: installCommandAction === 'uninstall' }" @click="setInstallCommandAction('uninstall')">{{ t('common.uninstall') }}</button>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="docs-summary-strip">
|
|
45
|
+
<div class="docs-summary-item">
|
|
46
|
+
<span class="docs-summary-label">{{ t('common.targets') }}</span>
|
|
47
|
+
<strong class="docs-summary-value">{{ installTargetCards.length }}</strong>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="docs-summary-item">
|
|
50
|
+
<span class="docs-summary-label">{{ t('common.currentPm') }}</span>
|
|
51
|
+
<strong class="docs-summary-value">{{ String(installPackageManager || 'npm').toUpperCase() }}</strong>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="docs-summary-item docs-summary-item-wide">
|
|
54
|
+
<span class="docs-summary-label">{{ t('common.registry') }}</span>
|
|
55
|
+
<strong class="docs-summary-value">{{ installRegistryPreview || t('common.defaultOfficial') }}</strong>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="selector-section">
|
|
61
|
+
<div class="selector-header">
|
|
62
|
+
<span class="selector-title">{{ t('docs.section.commands') }}</span>
|
|
63
|
+
<div class="skills-panel-note docs-section-note">{{ t('docs.section.commandsNote') }}</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="install-list docs-install-list">
|
|
67
|
+
<div class="install-row docs-install-row" v-for="target in installTargetCards" :key="'docs-install-command-' + target.id + '-' + installCommandAction">
|
|
68
|
+
<div class="install-row-main">
|
|
69
|
+
<div class="docs-command-head">
|
|
70
|
+
<div class="install-row-title">{{ target.name }}</div>
|
|
71
|
+
<div class="docs-command-meta">
|
|
72
|
+
<span class="docs-meta-pill">{{ target.packageName }}</span>
|
|
73
|
+
<span class="docs-meta-pill">bin: {{ target.bin }}</span>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="docs-command-row">
|
|
77
|
+
<div class="docs-command-box" role="group" :aria-label="t('docs.command.aria', { name: target.name })">
|
|
78
|
+
<code class="install-command">{{ target.command }}</code>
|
|
79
|
+
<button type="button" class="btn-mini docs-copy-btn" :disabled="!target.command" @click="copyInstallCommand(target.command)">{{ t('common.copy') }}</button>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div v-if="target.id === 'codex' && target.termuxCommand && target.termuxCommand !== target.command" class="docs-command-row docs-command-row-secondary">
|
|
83
|
+
<div class="docs-command-box" role="group" :aria-label="t('docs.termuxAria')">
|
|
84
|
+
<code class="install-command"><span class="docs-command-prefix">{{ t('docs.termuxLabel') }}</span>{{ target.termuxCommand }}</code>
|
|
85
|
+
<button type="button" class="btn-mini docs-copy-btn" @click="copyInstallCommand(target.termuxCommand)">{{ t('common.copy') }}</button>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="selector-section">
|
|
94
|
+
<div class="selector-header">
|
|
95
|
+
<span class="selector-title">{{ t('docs.section.faq') }}</span>
|
|
96
|
+
<div class="skills-panel-note docs-section-note">{{ t('docs.section.faqNote') }}</div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="docs-help-grid">
|
|
100
|
+
<div class="docs-note-card">
|
|
101
|
+
<div class="docs-note-title">{{ t('common.troubleshooting') }}</div>
|
|
102
|
+
<ul class="install-help-list docs-help-list">
|
|
103
|
+
<li v-for="tip in installTroubleshootingTips" :key="tip">{{ tip }}</li>
|
|
104
|
+
</ul>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="docs-note-card">
|
|
107
|
+
<div class="docs-note-title">{{ t('common.rules') }}</div>
|
|
108
|
+
<ul class="docs-static-list">
|
|
109
|
+
<li>{{ t('docs.rule.1') }}</li>
|
|
110
|
+
<li>{{ t('docs.rule.2') }}</li>
|
|
111
|
+
</ul>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
115
|
</div>
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
<div
|
|
2
|
-
v-show="mainTab === 'market'"
|
|
3
|
-
class="mode-content"
|
|
4
|
-
id="panel-market"
|
|
5
|
-
role="tabpanel"
|
|
6
|
-
aria-labelledby="tab-market">
|
|
7
|
-
<!-- Minimalist header with target switch -->
|
|
8
|
-
<div class="skills-minimal-header">
|
|
9
|
-
<div class="skills-header-left">
|
|
10
|
-
<span class="skills-header-title">{{ t('market.title') }}</span>
|
|
11
|
-
<div class="skills-target-switch" role="group" :aria-label="t('market.target.aria')">
|
|
12
|
-
<button
|
|
13
|
-
type="button"
|
|
14
|
-
:class="['skills-target-chip', { active: skillsTargetApp === 'codex' }]"
|
|
15
|
-
:aria-pressed="skillsTargetApp === 'codex'"
|
|
16
|
-
:disabled="loading || !!initError || skillsMarketBusy"
|
|
17
|
-
@click="setSkillsTargetApp('codex', { silent: false })">
|
|
18
|
-
Codex
|
|
19
|
-
</button>
|
|
20
|
-
<button
|
|
21
|
-
type="button"
|
|
22
|
-
:class="['skills-target-chip', { active: skillsTargetApp === 'claude' }]"
|
|
23
|
-
:aria-pressed="skillsTargetApp === 'claude'"
|
|
24
|
-
:disabled="loading || !!initError || skillsMarketBusy"
|
|
25
|
-
@click="setSkillsTargetApp('claude', { silent: false })">
|
|
26
|
-
Claude Code
|
|
27
|
-
</button>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
<div class="skills-header-actions">
|
|
31
|
-
<button type="button" class="btn-icon" @click="openSkillsMenu" :aria-label="t('common.menu')" :title="t('common.menu')">
|
|
32
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="20" height="20"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
|
|
33
|
-
</button>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<!-- Installed skills panel -->
|
|
38
|
-
<div class="skills-flow-panel">
|
|
39
|
-
<div class="skills-flow-header">
|
|
40
|
-
<div class="skills-flow-title-wrap">
|
|
41
|
-
<span class="skills-flow-title">{{ t('market.installed.title') }}</span>
|
|
42
|
-
<span class="skills-flow-count">{{ skillsList.length }}</span>
|
|
43
|
-
</div>
|
|
44
|
-
<button type="button" class="btn-mini" @click="refreshSkillsList({ silent: false })" :disabled="loading || !!initError || skillsMarketBusy">
|
|
45
|
-
<svg v-if="!skillsLoading" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14"><path d="M17 1l4 4-4 4"/><path d="M3 11V9a4 4 0 014-4h14"/><path d="M3 19l-4-4 4-4"/><path d="M17 9v2a4 4 0 01-4 4H3"/></svg>
|
|
46
|
-
<svg v-else viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14" class="spin"><path d="M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5"/></svg>
|
|
47
|
-
</button>
|
|
48
|
-
</div>
|
|
49
|
-
<div v-if="skillsLoading && !skillsMarketLocalLoadedOnce" class="skills-flow-loading">{{ t('market.local.loading') }}</div>
|
|
50
|
-
<div v-else-if="skillsList.length === 0" class="skills-flow-empty">{{ t('market.local.empty') }}</div>
|
|
51
|
-
<div v-else class="skills-flow-list">
|
|
52
|
-
<div v-for="skill in skillsList" :key="'skill-' + skill.name" class="skills-flow-item" :class="{ 'has-issue': !skill.hasSkillFile }">
|
|
53
|
-
<div class="skills-flow-main">
|
|
54
|
-
<span class="skills-flow-name">{{ skill.displayName || skill.name }}</span>
|
|
55
|
-
<span class="skills-flow-path">{{ skill.path }}</span>
|
|
56
|
-
</div>
|
|
57
|
-
<span :class="['skills-flow-status', skill.hasSkillFile ? 'success' : 'warning']">
|
|
58
|
-
{{ skill.hasSkillFile ? t('market.pill.verified') : t('market.pill.missingSkill') }}
|
|
59
|
-
</span>
|
|
60
|
-
</div>
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
<!-- Importable skills panel -->
|
|
65
|
-
<div class="skills-flow-panel">
|
|
66
|
-
<div class="skills-flow-header">
|
|
67
|
-
<div class="skills-flow-title-wrap">
|
|
68
|
-
<span class="skills-flow-title">{{ t('market.import.title') }}</span>
|
|
69
|
-
<span class="skills-flow-count">{{ skillsImportList.length }}</span>
|
|
70
|
-
</div>
|
|
71
|
-
<button type="button" class="btn-mini" @click="scanImportableSkills({ silent: false })" :disabled="loading || !!initError || skillsMarketBusy">
|
|
72
|
-
<svg v-if="!skillsScanningImports" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14"><path d="M17 1l4 4-4 4"/><path d="M3 11V9a4 4 0 014-4h14"/><path d="M3 19l-4-4 4-4"/><path d="M17 9v2a4 4 0 01-4 4H3"/></svg>
|
|
73
|
-
<svg v-else viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14" class="spin"><path d="M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5"/></svg>
|
|
74
|
-
</button>
|
|
75
|
-
</div>
|
|
76
|
-
<div v-if="skillsScanningImports && !skillsMarketImportLoadedOnce" class="skills-flow-loading">{{ t('market.import.loading') }}</div>
|
|
77
|
-
<div v-else-if="skillsImportList.length === 0" class="skills-flow-empty">{{ t('market.import.empty') }}</div>
|
|
78
|
-
<div v-else>
|
|
79
|
-
<!-- Quick actions -->
|
|
80
|
-
<div class="skills-flow-actions">
|
|
81
|
-
<button type="button" class="skills-action-btn" @click="openSkillsManager" :disabled="loading || !!initError || skillsMarketBusy">
|
|
82
|
-
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><rect x="3" y="3" width="14" height="14" rx="3"/><path d="M7 7h6M7 10h4"/></svg>
|
|
83
|
-
{{ t('market.action.manage.title') }}
|
|
84
|
-
</button>
|
|
85
|
-
<button type="button" class="skills-action-btn" @click="triggerSkillsZipImport" :disabled="loading || !!initError || skillsMarketBusy">
|
|
86
|
-
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><path d="M4 14l3-3 3 3"/><path d="M7 4v7"/><rect x="12" y="4" width="5" height="12" rx="1"/></svg>
|
|
87
|
-
{{ t('market.action.zipImport.title') }}
|
|
88
|
-
</button>
|
|
89
|
-
</div>
|
|
90
|
-
<!-- Import list -->
|
|
91
|
-
<div class="skills-flow-list">
|
|
92
|
-
<div v-for="skill in skillsImportList" :key="'import-' + buildSkillImportKey(skill)" class="skills-flow-item">
|
|
93
|
-
<div class="skills-flow-main">
|
|
94
|
-
<span class="skills-flow-name">{{ skill.displayName || skill.name }}</span>
|
|
95
|
-
<span class="skills-flow-meta">{{ skill.sourceLabel }}</span>
|
|
96
|
-
</div>
|
|
97
|
-
<button type="button" class="skills-flow-add" @click="importSingleSkill(skill)" :disabled="loading || !!initError || skillsMarketBusy">
|
|
98
|
-
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><path d="M10 4v6m3-3l-3 3-3-3"/></svg>
|
|
99
|
-
</button>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
1
|
+
<div
|
|
2
|
+
v-show="mainTab === 'market'"
|
|
3
|
+
class="mode-content"
|
|
4
|
+
id="panel-market"
|
|
5
|
+
role="tabpanel"
|
|
6
|
+
aria-labelledby="tab-market">
|
|
7
|
+
<!-- Minimalist header with target switch -->
|
|
8
|
+
<div class="skills-minimal-header">
|
|
9
|
+
<div class="skills-header-left">
|
|
10
|
+
<span class="skills-header-title">{{ t('market.title') }}</span>
|
|
11
|
+
<div class="skills-target-switch" role="group" :aria-label="t('market.target.aria')">
|
|
12
|
+
<button
|
|
13
|
+
type="button"
|
|
14
|
+
:class="['skills-target-chip', { active: skillsTargetApp === 'codex' }]"
|
|
15
|
+
:aria-pressed="skillsTargetApp === 'codex'"
|
|
16
|
+
:disabled="loading || !!initError || skillsMarketBusy"
|
|
17
|
+
@click="setSkillsTargetApp('codex', { silent: false })">
|
|
18
|
+
Codex
|
|
19
|
+
</button>
|
|
20
|
+
<button
|
|
21
|
+
type="button"
|
|
22
|
+
:class="['skills-target-chip', { active: skillsTargetApp === 'claude' }]"
|
|
23
|
+
:aria-pressed="skillsTargetApp === 'claude'"
|
|
24
|
+
:disabled="loading || !!initError || skillsMarketBusy"
|
|
25
|
+
@click="setSkillsTargetApp('claude', { silent: false })">
|
|
26
|
+
Claude Code
|
|
27
|
+
</button>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="skills-header-actions">
|
|
31
|
+
<button type="button" class="btn-icon" @click="openSkillsMenu" :aria-label="t('common.menu')" :title="t('common.menu')">
|
|
32
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="20" height="20"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
|
|
33
|
+
</button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<!-- Installed skills panel -->
|
|
38
|
+
<div class="skills-flow-panel">
|
|
39
|
+
<div class="skills-flow-header">
|
|
40
|
+
<div class="skills-flow-title-wrap">
|
|
41
|
+
<span class="skills-flow-title">{{ t('market.installed.title') }}</span>
|
|
42
|
+
<span class="skills-flow-count">{{ skillsList.length }}</span>
|
|
43
|
+
</div>
|
|
44
|
+
<button type="button" class="btn-mini" @click="refreshSkillsList({ silent: false })" :disabled="loading || !!initError || skillsMarketBusy">
|
|
45
|
+
<svg v-if="!skillsLoading" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14"><path d="M17 1l4 4-4 4"/><path d="M3 11V9a4 4 0 014-4h14"/><path d="M3 19l-4-4 4-4"/><path d="M17 9v2a4 4 0 01-4 4H3"/></svg>
|
|
46
|
+
<svg v-else viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14" class="spin"><path d="M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5"/></svg>
|
|
47
|
+
</button>
|
|
48
|
+
</div>
|
|
49
|
+
<div v-if="skillsLoading && !skillsMarketLocalLoadedOnce" class="skills-flow-loading">{{ t('market.local.loading') }}</div>
|
|
50
|
+
<div v-else-if="skillsList.length === 0" class="skills-flow-empty">{{ t('market.local.empty') }}</div>
|
|
51
|
+
<div v-else class="skills-flow-list">
|
|
52
|
+
<div v-for="skill in skillsList" :key="'skill-' + skill.name" class="skills-flow-item" :class="{ 'has-issue': !skill.hasSkillFile }">
|
|
53
|
+
<div class="skills-flow-main">
|
|
54
|
+
<span class="skills-flow-name">{{ skill.displayName || skill.name }}</span>
|
|
55
|
+
<span class="skills-flow-path">{{ skill.path }}</span>
|
|
56
|
+
</div>
|
|
57
|
+
<span :class="['skills-flow-status', skill.hasSkillFile ? 'success' : 'warning']">
|
|
58
|
+
{{ skill.hasSkillFile ? t('market.pill.verified') : t('market.pill.missingSkill') }}
|
|
59
|
+
</span>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!-- Importable skills panel -->
|
|
65
|
+
<div class="skills-flow-panel">
|
|
66
|
+
<div class="skills-flow-header">
|
|
67
|
+
<div class="skills-flow-title-wrap">
|
|
68
|
+
<span class="skills-flow-title">{{ t('market.import.title') }}</span>
|
|
69
|
+
<span class="skills-flow-count">{{ skillsImportList.length }}</span>
|
|
70
|
+
</div>
|
|
71
|
+
<button type="button" class="btn-mini" @click="scanImportableSkills({ silent: false })" :disabled="loading || !!initError || skillsMarketBusy">
|
|
72
|
+
<svg v-if="!skillsScanningImports" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14"><path d="M17 1l4 4-4 4"/><path d="M3 11V9a4 4 0 014-4h14"/><path d="M3 19l-4-4 4-4"/><path d="M17 9v2a4 4 0 01-4 4H3"/></svg>
|
|
73
|
+
<svg v-else viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="14" height="14" class="spin"><path d="M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5"/></svg>
|
|
74
|
+
</button>
|
|
75
|
+
</div>
|
|
76
|
+
<div v-if="skillsScanningImports && !skillsMarketImportLoadedOnce" class="skills-flow-loading">{{ t('market.import.loading') }}</div>
|
|
77
|
+
<div v-else-if="skillsImportList.length === 0" class="skills-flow-empty">{{ t('market.import.empty') }}</div>
|
|
78
|
+
<div v-else>
|
|
79
|
+
<!-- Quick actions -->
|
|
80
|
+
<div class="skills-flow-actions">
|
|
81
|
+
<button type="button" class="skills-action-btn" @click="openSkillsManager" :disabled="loading || !!initError || skillsMarketBusy">
|
|
82
|
+
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><rect x="3" y="3" width="14" height="14" rx="3"/><path d="M7 7h6M7 10h4"/></svg>
|
|
83
|
+
{{ t('market.action.manage.title') }}
|
|
84
|
+
</button>
|
|
85
|
+
<button type="button" class="skills-action-btn" @click="triggerSkillsZipImport" :disabled="loading || !!initError || skillsMarketBusy">
|
|
86
|
+
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><path d="M4 14l3-3 3 3"/><path d="M7 4v7"/><rect x="12" y="4" width="5" height="12" rx="1"/></svg>
|
|
87
|
+
{{ t('market.action.zipImport.title') }}
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
<!-- Import list -->
|
|
91
|
+
<div class="skills-flow-list">
|
|
92
|
+
<div v-for="skill in skillsImportList" :key="'import-' + buildSkillImportKey(skill)" class="skills-flow-item">
|
|
93
|
+
<div class="skills-flow-main">
|
|
94
|
+
<span class="skills-flow-name">{{ skill.displayName || skill.name }}</span>
|
|
95
|
+
<span class="skills-flow-meta">{{ skill.sourceLabel }}</span>
|
|
96
|
+
</div>
|
|
97
|
+
<button type="button" class="skills-flow-add" @click="importSingleSkill(skill)" :disabled="loading || !!initError || skillsMarketBusy">
|
|
98
|
+
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" width="16" height="16"><path d="M10 4v6m3-3l-3 3-3-3"/></svg>
|
|
99
|
+
</button>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|