dsh-github-flow 0.4.0 → 0.5.0
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.en.md +75 -8
- package/README.md +75 -8
- package/docs/UPGRADE-NOTES.md +9 -12
- package/docs/architecture.md +39 -21
- package/lib/api/routes-actions.js +132 -0
- package/lib/client.d.ts +4 -3
- package/lib/client.js +1436 -80
- package/lib/commands/gh.d.ts +6 -1
- package/lib/commands/gh.js +144 -71
- package/lib/executor/git-parser.d.ts +33 -1
- package/lib/executor/git-parser.js +116 -4
- package/lib/executor.d.ts +27 -2
- package/lib/executor.js +189 -5
- package/lib/main.js +28 -4
- package/lib/renderers/agent-task.d.ts +16 -0
- package/lib/renderers/agent-task.js +107 -0
- package/lib/renderers/codespace.d.ts +16 -0
- package/lib/renderers/codespace.js +103 -0
- package/lib/renderers/discussion.d.ts +16 -0
- package/lib/renderers/discussion.js +101 -0
- package/lib/renderers/markdown.d.ts +4 -0
- package/lib/renderers/markdown.js +4 -0
- package/lib/renderers/project.d.ts +20 -0
- package/lib/renderers/project.js +128 -0
- package/lib/renderers/skill.d.ts +30 -0
- package/lib/renderers/skill.js +180 -0
- package/lib/renderers/status.d.ts +5 -0
- package/lib/renderers/status.js +52 -0
- package/lib/telemetry.d.ts +70 -0
- package/lib/telemetry.js +161 -0
- package/lib/tools/agent-task.d.ts +54 -0
- package/lib/tools/agent-task.js +135 -0
- package/lib/tools/codespace.d.ts +51 -0
- package/lib/tools/codespace.js +154 -0
- package/lib/tools/discussion.d.ts +70 -0
- package/lib/tools/discussion.js +195 -0
- package/lib/tools/help.js +109 -9
- package/lib/tools/project.d.ts +80 -0
- package/lib/tools/project.js +241 -0
- package/lib/tools/repo.js +13 -1
- package/lib/tools/skill.d.ts +24 -1
- package/lib/tools/skill.js +115 -5
- package/lib/tools/status.d.ts +3 -2
- package/lib/tools/status.js +9 -4
- package/lib/types.d.ts +5 -0
- package/lib/ui/commit-modal.js +144 -14
- package/lib/ui/help-modal.d.ts +15 -0
- package/lib/ui/help-modal.js +202 -0
- package/lib/ui/storage.d.ts +9 -0
- package/lib/ui/storage.js +24 -0
- package/lib/ui/styles.d.ts +1 -1
- package/lib/ui/styles.js +259 -0
- package/lib/ui/sync-settings-modal.js +1 -1
- package/lib/ui/upgrade-card.js +39 -14
- package/lib/ui/utils.d.ts +35 -0
- package/lib/ui/utils.js +160 -0
- package/lib/ui/workspace-panel.js +30 -5
- package/lib/upgrade-manager.d.ts +5 -1
- package/lib/upgrade-manager.js +24 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +2 -2
package/lib/ui/utils.js
CHANGED
|
@@ -64,3 +64,163 @@ export function eventLabel(event) {
|
|
|
64
64
|
return "🔀 PR";
|
|
65
65
|
return e || "";
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* 带有阶梯退避重试(Backoff Retry)的通用异步拉取函数
|
|
69
|
+
*
|
|
70
|
+
* 核心设计理由与约束:
|
|
71
|
+
* 1. 应对代理节点不稳定、TLS 握手卡顿、短时网络抖动(半秒至两秒微断流);
|
|
72
|
+
* 2. 阶梯退避时序:第 1 次失败等 1s (1000ms),第 2 次等 2s (2000ms),第 3 次等 4s (4000ms),附加 0~200ms Jitter;
|
|
73
|
+
* 3. 智能区分软硬错误:401/403/404/400 确定性错误坚决不重试,仅在网络超时、不可达、或带有 networkError 时重试;
|
|
74
|
+
* 4. 严格响应外部 AbortSignal,组件卸载或用户手动打断时立即退出等待,绝无内存泄漏。
|
|
75
|
+
*/
|
|
76
|
+
export async function fetchWithRetry(url, options = {}, config = {}) {
|
|
77
|
+
var maxRetries = config.maxRetries !== undefined ? config.maxRetries : 3;
|
|
78
|
+
var baseDelayMs = config.baseDelayMs !== undefined ? config.baseDelayMs : 1000;
|
|
79
|
+
var signal = config.signal || options.signal;
|
|
80
|
+
var attempt = 0;
|
|
81
|
+
while (true) {
|
|
82
|
+
attempt++;
|
|
83
|
+
var currentRes = null;
|
|
84
|
+
var currentJson = null;
|
|
85
|
+
var failureReason = "";
|
|
86
|
+
var shouldRetry = false;
|
|
87
|
+
try {
|
|
88
|
+
if (signal && signal.aborted) {
|
|
89
|
+
throw new Error("Aborted");
|
|
90
|
+
}
|
|
91
|
+
currentRes = await fetch(url, { ...options, signal });
|
|
92
|
+
// 硬错误守卫:客户端确定性错误(如未授权、权限拒绝、不存在、参数错误)坚决不重试
|
|
93
|
+
if (currentRes.status === 401 || currentRes.status === 403 || currentRes.status === 404 || currentRes.status === 400) {
|
|
94
|
+
currentJson = await currentRes.json().catch(() => ({}));
|
|
95
|
+
return { res: currentRes, json: currentJson };
|
|
96
|
+
}
|
|
97
|
+
if (!currentRes.ok) {
|
|
98
|
+
failureReason = "HTTP " + currentRes.status + " " + currentRes.statusText;
|
|
99
|
+
shouldRetry = true;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
currentJson = await currentRes.json().catch(() => null);
|
|
103
|
+
// 业务层软错误检测(后端返回了 200,但标记了 networkError 或 partialFailure)
|
|
104
|
+
var isNetworkError = Boolean(currentJson && (currentJson.partialFailure ||
|
|
105
|
+
currentJson.data?.partialFailure ||
|
|
106
|
+
currentJson.data?.networkError ||
|
|
107
|
+
currentJson.data?.auth?.networkError));
|
|
108
|
+
if (isNetworkError) {
|
|
109
|
+
failureReason = currentJson.error || currentJson.data?.networkErrorReason || "云端接口网络抖动";
|
|
110
|
+
shouldRetry = true;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// 成功获取完整且无网络错误的数据
|
|
114
|
+
return { res: currentRes, json: currentJson };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if ((signal && signal.aborted) || err.name === "AbortError") {
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
failureReason = err.message || "网络连接中断或超时";
|
|
123
|
+
shouldRetry = true;
|
|
124
|
+
}
|
|
125
|
+
// 判断是否已耗尽重试次数
|
|
126
|
+
if (!shouldRetry || attempt > maxRetries) {
|
|
127
|
+
if (currentRes) {
|
|
128
|
+
return { res: currentRes, json: currentJson || {} };
|
|
129
|
+
}
|
|
130
|
+
throw new Error(failureReason || "网络请求失败");
|
|
131
|
+
}
|
|
132
|
+
// 计算阶梯退避等待时间:baseDelayMs * 2^(attempt - 1) + Jitter 自适应微扰
|
|
133
|
+
var exponentialDelay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
134
|
+
var maxJitter = Math.min(200, Math.floor(exponentialDelay * 0.2));
|
|
135
|
+
var jitter = Math.floor(Math.random() * (maxJitter + 1));
|
|
136
|
+
var totalDelay = exponentialDelay + jitter;
|
|
137
|
+
if (config.onRetry) {
|
|
138
|
+
config.onRetry(attempt, totalDelay, failureReason);
|
|
139
|
+
}
|
|
140
|
+
// 可中断的睡眠等待
|
|
141
|
+
await new Promise((resolve, reject) => {
|
|
142
|
+
var timer = setTimeout(resolve, totalDelay);
|
|
143
|
+
if (signal) {
|
|
144
|
+
signal.addEventListener("abort", () => {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
reject(new Error("Aborted"));
|
|
147
|
+
}, { once: true });
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export function parseGitStatText(statText) {
|
|
153
|
+
if (!statText || typeof statText !== "string")
|
|
154
|
+
return null;
|
|
155
|
+
var lines = statText.split("\n");
|
|
156
|
+
var files = [];
|
|
157
|
+
var summary = null;
|
|
158
|
+
for (var i = 0; i < lines.length; i++) {
|
|
159
|
+
var line = lines[i].trim();
|
|
160
|
+
if (!line)
|
|
161
|
+
continue;
|
|
162
|
+
var summaryMatch = line.match(/(\d+)\s+files?\s+changed(?:,\s+(\d+)\s+insertions?\(\+\))?(?:,\s+(\d+)\s+deletions?\(-\))?/i);
|
|
163
|
+
if (summaryMatch) {
|
|
164
|
+
summary = {
|
|
165
|
+
filesChanged: parseInt(summaryMatch[1], 10),
|
|
166
|
+
insertions: parseInt(summaryMatch[2] || "0", 10),
|
|
167
|
+
deletions: parseInt(summaryMatch[3] || "0", 10),
|
|
168
|
+
};
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
var pipeIdx = line.indexOf("|");
|
|
172
|
+
if (pipeIdx > 0) {
|
|
173
|
+
var left = line.slice(0, pipeIdx).trim();
|
|
174
|
+
var right = line.slice(pipeIdx + 1).trim();
|
|
175
|
+
if (left.startsWith('"') && left.endsWith('"') && left.length >= 2) {
|
|
176
|
+
left = left.slice(1, -1);
|
|
177
|
+
}
|
|
178
|
+
if (/^Bin\b/i.test(right)) {
|
|
179
|
+
files.push({ path: left, total: 0, additions: 0, deletions: 0, isBinary: true, rawRight: right });
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
var numMatch = right.match(/^(\d+)(.*)$/);
|
|
183
|
+
if (numMatch) {
|
|
184
|
+
var total = parseInt(numMatch[1], 10);
|
|
185
|
+
var graph = numMatch[2].trim();
|
|
186
|
+
var plusCount = 0;
|
|
187
|
+
var minusCount = 0;
|
|
188
|
+
for (var j = 0; j < graph.length; j++) {
|
|
189
|
+
if (graph[j] === "+")
|
|
190
|
+
plusCount++;
|
|
191
|
+
else if (graph[j] === "-")
|
|
192
|
+
minusCount++;
|
|
193
|
+
}
|
|
194
|
+
var additions = 0;
|
|
195
|
+
var deletions = 0;
|
|
196
|
+
if (plusCount === 0 && minusCount === 0) {
|
|
197
|
+
additions = total;
|
|
198
|
+
}
|
|
199
|
+
else if (minusCount === 0) {
|
|
200
|
+
additions = total;
|
|
201
|
+
deletions = 0;
|
|
202
|
+
}
|
|
203
|
+
else if (plusCount === 0) {
|
|
204
|
+
additions = 0;
|
|
205
|
+
deletions = total;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
if (plusCount + minusCount === total) {
|
|
209
|
+
additions = plusCount;
|
|
210
|
+
deletions = minusCount;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
var addExact = Math.round((total * plusCount) / (plusCount + minusCount));
|
|
214
|
+
additions = addExact;
|
|
215
|
+
deletions = Math.max(0, total - addExact);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
files.push({ path: left, total, additions, deletions, isBinary: false });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (files.length === 0 && !summary)
|
|
224
|
+
return null;
|
|
225
|
+
return { files, summary };
|
|
226
|
+
}
|
|
@@ -11,6 +11,7 @@ export function GithubWorkspacePanel() {
|
|
|
11
11
|
var [lastSyncedAt, setLastSyncedAt] = React.useState(initialSnapshot?.savedAt || 0);
|
|
12
12
|
var [isSettingsModalOpen, setIsSettingsModalOpen] = React.useState(false);
|
|
13
13
|
var [settingsInitialSection, setSettingsInitialSection] = React.useState("sync");
|
|
14
|
+
var [isHelpModalOpen, setIsHelpModalOpen] = React.useState(false);
|
|
14
15
|
var [error, setError] = React.useState(null);
|
|
15
16
|
var [updateInfo, setUpdateInfo] = React.useState(null);
|
|
16
17
|
var [activeTab, setActiveTab] = React.useState("workspaces");
|
|
@@ -104,9 +105,18 @@ export function GithubWorkspacePanel() {
|
|
|
104
105
|
if (forceRefresh) {
|
|
105
106
|
url += "?force=true";
|
|
106
107
|
}
|
|
107
|
-
|
|
108
|
+
// 接入 1s/2s/4s 阶梯退避重试,平滑吸收代理节点与网络的偶发抖动断流
|
|
109
|
+
var { res, json } = await fetchWithRetry(url, {}, {
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
maxRetries: 3,
|
|
112
|
+
baseDelayMs: 1000,
|
|
113
|
+
onRetry: (attempt) => {
|
|
114
|
+
setSyncStatus("syncing");
|
|
115
|
+
setError(`网络抖动,正在自愈重试 (${attempt}/3)...`);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
108
118
|
if (!res.ok) {
|
|
109
|
-
var errText =
|
|
119
|
+
var errText = (typeof json === "string" ? json : JSON.stringify(json)) || res.statusText;
|
|
110
120
|
var failMsg = `获取全局数据失败(HTTP ${res.status})${errText ? ": " + errText : ""}`;
|
|
111
121
|
setSyncStatus("failed");
|
|
112
122
|
setError(failMsg);
|
|
@@ -114,7 +124,6 @@ export function GithubWorkspacePanel() {
|
|
|
114
124
|
showToast("❌ 刷新失败:" + failMsg);
|
|
115
125
|
return;
|
|
116
126
|
}
|
|
117
|
-
var json = await res.json();
|
|
118
127
|
if (json.ok && json.data) {
|
|
119
128
|
var isFail = Boolean(json.partialFailure ||
|
|
120
129
|
json.data.partialFailure ||
|
|
@@ -241,8 +250,16 @@ export function GithubWorkspacePanel() {
|
|
|
241
250
|
.catch(function () { });
|
|
242
251
|
}
|
|
243
252
|
};
|
|
253
|
+
var onOnline = () => {
|
|
254
|
+
// 监听网络由断网恢复连接瞬间,自动静默发起一次全量同步,消除离线警告横幅并拉新
|
|
255
|
+
loadData(false);
|
|
256
|
+
};
|
|
244
257
|
window.addEventListener("focus", onFocus);
|
|
245
|
-
|
|
258
|
+
window.addEventListener("online", onOnline);
|
|
259
|
+
return () => {
|
|
260
|
+
window.removeEventListener("focus", onFocus);
|
|
261
|
+
window.removeEventListener("online", onOnline);
|
|
262
|
+
};
|
|
246
263
|
}, [data, loadData]);
|
|
247
264
|
var h = React.createElement;
|
|
248
265
|
var headerEl = h("div", { className: "dsh-github-header" }, h("div", { className: "dsh-github-title" }, renderOctocatBadge(32), h("h2", null, "GitHub 全景驾驶舱"), renderPluginBadge(h), h(SyncStatusBadge, { syncStatus, lastSyncedAt }), proxyActive && proxyActive.enabled
|
|
@@ -267,6 +284,11 @@ export function GithubWorkspacePanel() {
|
|
|
267
284
|
onClick: () => loadData(true),
|
|
268
285
|
disabled: loading,
|
|
269
286
|
}, loading ? "同步中..." : "🔄 刷新全局数据"), h("button", {
|
|
287
|
+
className: "dsh-github-btn-sm",
|
|
288
|
+
onClick: () => setIsHelpModalOpen(true),
|
|
289
|
+
title: "打开使用帮助与实战手册大窗口(Esc 可退出)",
|
|
290
|
+
style: { padding: "6px 12px" },
|
|
291
|
+
}, "📖 使用指南"), h("button", {
|
|
270
292
|
className: "dsh-github-btn-sm",
|
|
271
293
|
onClick: openSettingsDefault,
|
|
272
294
|
title: "配置数据同步节奏、本地缓存、网络代理与插件信息",
|
|
@@ -460,5 +482,8 @@ export function GithubWorkspacePanel() {
|
|
|
460
482
|
},
|
|
461
483
|
})
|
|
462
484
|
: null;
|
|
463
|
-
return h("div", { className: "dsh-github-panel", ref: panelRef }, toastEl, headerEl, networkAlertBannerEl, upgradeBannerEl, errorEl, statsCardsEl, authGuideEl, tabsEl, contentEl, settingsModalEl
|
|
485
|
+
return h("div", { className: "dsh-github-panel", ref: panelRef }, toastEl, headerEl, networkAlertBannerEl, upgradeBannerEl, errorEl, statsCardsEl, authGuideEl, tabsEl, contentEl, settingsModalEl, h(GithubHelpModal, {
|
|
486
|
+
isOpen: isHelpModalOpen,
|
|
487
|
+
onClose: () => setIsHelpModalOpen(false),
|
|
488
|
+
}));
|
|
464
489
|
}
|
package/lib/upgrade-manager.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type { UpgradeExecutionResult, UpgradeStatusResult } from './types.js';
|
|
1
|
+
import type { UpgradeExecutionResult, UpgradeStatusResult, UpgradeErrorType } from './types.js';
|
|
2
2
|
import type { ProxyManager } from './proxy.js';
|
|
3
|
+
/**
|
|
4
|
+
* 分析升级失败日志中的深层错误特征(重点识别 DSH 内置包管理器 minimumReleaseAge 24 小时防投毒策略)
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectUpgradeErrorType(log?: string): UpgradeErrorType;
|
|
3
7
|
/**
|
|
4
8
|
* 构建跨平台环境自愈增强的 ProcessEnv (重点解决 macOS GUI 应用丢失 PATH 的痛点)
|
|
5
9
|
*
|
package/lib/upgrade-manager.js
CHANGED
|
@@ -4,6 +4,20 @@ import fs from 'node:fs';
|
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { PLUGIN_PACKAGE_NAME } from './version.js';
|
|
7
|
+
/**
|
|
8
|
+
* 分析升级失败日志中的深层错误特征(重点识别 DSH 内置包管理器 minimumReleaseAge 24 小时防投毒策略)
|
|
9
|
+
*/
|
|
10
|
+
export function detectUpgradeErrorType(log) {
|
|
11
|
+
if (!log)
|
|
12
|
+
return 'UNKNOWN';
|
|
13
|
+
if (/ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|minimumReleaseAge/i.test(log)) {
|
|
14
|
+
return 'MINIMUM_RELEASE_AGE_VIOLATION';
|
|
15
|
+
}
|
|
16
|
+
if (/ETIMEDOUT|timeout|执行超时/i.test(log)) {
|
|
17
|
+
return 'TIMEOUT';
|
|
18
|
+
}
|
|
19
|
+
return 'UNKNOWN';
|
|
20
|
+
}
|
|
7
21
|
/**
|
|
8
22
|
* 构建跨平台环境自愈增强的 ProcessEnv (重点解决 macOS GUI 应用丢失 PATH 的痛点)
|
|
9
23
|
*
|
|
@@ -370,10 +384,18 @@ export class UpgradeManager {
|
|
|
370
384
|
this.lastResult = { state: 'success', targetVersion: wantVersion, message: successMsg, completedAt, environment: env.isDesktop ? 'desktop' : 'web' };
|
|
371
385
|
}
|
|
372
386
|
else {
|
|
387
|
+
const fullLog = this.logBuffer.join('\n');
|
|
388
|
+
const errorType = detectUpgradeErrorType(fullLog);
|
|
389
|
+
let failMsg = `升级失败(安装命令返回非零退出码)。${targetVersion ? `目标版本 ${targetVersion} 未安装成功。` : ''}${actionHint},或稍后重试一键升级。`;
|
|
390
|
+
// 智能识别:DSH 内置包管理器 minimumReleaseAge 24 小时防投毒安全锁机制
|
|
391
|
+
if (errorType === 'MINIMUM_RELEASE_AGE_VIOLATION') {
|
|
392
|
+
failMsg = `🛡️ 触发 DSH 新版本 24 小时安全保护期(npm 供应链防投毒策略)。检测到目标版本刚刚发布未满 24 小时,DSH 内置包管理器暂缓了自动静默升级以保障系统安全。\n【推荐解决步骤】:\n1. 立即尝鲜:请先【完全退出关闭 DSH 应用程序】,然后在系统终端执行手动安装命令(点击「📋 复制命令」获取);\n2. 稍后升级:无需操作,发版满 24 小时后直接在此点击「⚡ 一键自动升级」即可平滑完成。`;
|
|
393
|
+
}
|
|
373
394
|
this.lastResult = {
|
|
374
395
|
state: 'failed',
|
|
375
396
|
targetVersion,
|
|
376
|
-
|
|
397
|
+
errorType,
|
|
398
|
+
message: failMsg,
|
|
377
399
|
completedAt,
|
|
378
400
|
environment: env.isDesktop ? 'desktop' : 'web',
|
|
379
401
|
};
|
|
@@ -581,6 +603,7 @@ export class UpgradeManager {
|
|
|
581
603
|
ok: false,
|
|
582
604
|
message: this.lastResult.message || `升级退出码异常 (${code})`,
|
|
583
605
|
needRestart: false,
|
|
606
|
+
errorType: this.lastResult.errorType,
|
|
584
607
|
environment: env.isDesktop ? 'desktop' : 'web',
|
|
585
608
|
log: this.logBuffer.join('\n'),
|
|
586
609
|
};
|
package/lib/version.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 2. 避免在 ESM 运行时动态读取 package.json 引入 fs 权限和路径解析边界问题;
|
|
7
7
|
* 3. 方便在 CI 发布流水线或 build 脚本中自动化校准。
|
|
8
8
|
*/
|
|
9
|
-
export declare const CURRENT_PLUGIN_VERSION = "0.
|
|
9
|
+
export declare const CURRENT_PLUGIN_VERSION = "0.5.0";
|
|
10
10
|
export declare const PLUGIN_PACKAGE_NAME = "dsh-github-flow";
|
|
11
11
|
export declare const NPM_PACKAGE_URL = "https://www.npmjs.com/package/dsh-github-flow";
|
|
12
12
|
export declare const NPM_REGISTRY_MIRROR = "https://registry.npmmirror.com";
|
package/lib/version.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 2. 避免在 ESM 运行时动态读取 package.json 引入 fs 权限和路径解析边界问题;
|
|
7
7
|
* 3. 方便在 CI 发布流水线或 build 脚本中自动化校准。
|
|
8
8
|
*/
|
|
9
|
-
export const CURRENT_PLUGIN_VERSION = '0.
|
|
9
|
+
export const CURRENT_PLUGIN_VERSION = '0.5.0';
|
|
10
10
|
export const PLUGIN_PACKAGE_NAME = 'dsh-github-flow';
|
|
11
11
|
export const NPM_PACKAGE_URL = 'https://www.npmjs.com/package/dsh-github-flow';
|
|
12
12
|
export const NPM_REGISTRY_MIRROR = 'https://registry.npmmirror.com';
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-github-flow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"icon": "icon.svg",
|
|
5
|
-
"description": "GitHub 工作流引擎:为 DeepSeek Harness 提供原生 GitHub CLI (gh) 集成——
|
|
5
|
+
"description": "GitHub 工作流引擎:为 DeepSeek Harness 提供原生 GitHub CLI (gh) 集成——18 大 Agent 领域工具(PR 审查合并、Issue 任务流转、CI 失败诊断、发版交付、密钥管理、Agent Skills、标签与保护规则集、构建缓存治理、代码片段 Gist、跨仓待办大盘、Copilot 智能体调度、社区 Discussions、Projects v2 看板、云端 Codespaces、运行时遥测与自愈健康度)、/gh 人类快捷指令、Web UI 全景驾驶舱与一键跨平台自动升级;零凭证侵入复用宿主机 gh 登录态,内置 Token 防溢出截断、高危操作二次确认与密文安全输入通道。",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./lib/main.js",
|
|
8
8
|
"repository": {
|