dsh-plugin-guide 0.3.29 → 0.3.31

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.
@@ -1,8 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  // Five-language README sync gate: the English file is the source of truth.
3
- // Every translation must carry the same `## ` section headings in the same
4
- // order and the same configuration-table keys, so a config change cannot
5
- // ship without its translations.
3
+ //
4
+ // The READMEs keep ENGLISH `## ` headings in every language (only the prose is
5
+ // translated), so heading TEXT is not compared — a translation that legitimately
6
+ // localises a heading would fail for no reason, and `check-readme-parity.mjs`
7
+ // already compares block-level structure. What this gate owns is:
8
+ // * the NUMBER and ORDER of `## ` sections (a section added to English must be
9
+ // added everywhere), and
10
+ // * the configuration-table keys, which are API names and must match verbatim.
11
+ // The quick references are the opposite convention (translated headings); they
12
+ // are covered by the parity gate instead.
6
13
  import { readFileSync, existsSync } from 'node:fs'
7
14
  import path from 'node:path'
8
15
  import { fileURLToPath } from 'node:url'
@@ -63,13 +70,11 @@ for (const [file, label] of LANGUAGES.slice(1)) {
63
70
  }
64
71
  const text = readFileSync(filePath, 'utf8')
65
72
  const headings = headingsOf(text)
66
- for (let index = 0; index < refHeadings.length; index++) {
67
- if (headings[index] !== refHeadings[index]) {
68
- failures.push(`${file}: heading ${index + 1} is ${JSON.stringify(headings[index])}, expected ${JSON.stringify(refHeadings[index])}`)
69
- }
70
- }
73
+ // Section count only. The READMEs share English headings by convention, but
74
+ // comparing the text would break the moment a translation localises one, and
75
+ // structural parity is already owned by check-readme-parity.mjs.
71
76
  if (headings.length !== refHeadings.length) {
72
- failures.push(`${file}: ${headings.length} headings, expected ${refHeadings.length}`)
77
+ failures.push(`${file}: ${headings.length} sections, expected ${refHeadings.length}`)
73
78
  }
74
79
  const keys = configKeysOf(text)
75
80
  if (keys.length !== refKeys.length) {
@@ -1,188 +1,188 @@
1
- # dsh-plugin-guide 社区文章归档脚本(幂等:已存在且非空则跳过)
2
- # 输出: downloads/web/community-articles/{zh,en,hn}/<slug>.html + _download.log + README.md
3
- # 来源: downloads/_research/{chinese,english}-community-scan.md 中标 200 的 URL + 08-15 增量扫描线索。
4
- # 已知反爬站(知乎/InfoQ/venturebeat/thenextweb/twitter/youtube/reddit/腾讯新闻 501 等)不在清单内,记录见两份扫描报告。
5
- # 注意: PS 5.1 下 curl 的 -A/-o 参数若经变量数组传入会被拆词;本脚本用 Invoke-Expression
6
- # 拼完整命令行字符串,引号在字符串内显式给出,规避该坑。
7
- # 参数: -Force 强制全部重下; -Lang zh|en|hn 只处理某语言段。
8
- param([switch]$Force, [string]$Lang = '')
9
- $ErrorActionPreference = 'Continue'
10
- $ProgressPreference = 'SilentlyContinue'
11
-
12
- $kb = Split-Path $PSScriptRoot -Parent
13
- $out = Join-Path $kb 'downloads\web\community-articles'
14
- $ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36'
15
- $curl = Get-Command curl.exe -ErrorAction SilentlyContinue
16
- if (-not $curl) { $curl = "$env:SystemRoot\System32\curl.exe" } else { $curl = $curl.Source }
17
-
18
- # slug => url(语言段前缀 zh:/en:/hn: 决定落盘目录)
19
- $list = @(
20
- # ---------- zh ----------
21
- 'zh:cnblogs-pc2005-npm-publish = https://www.cnblogs.com/pc2005/p/22477987',
22
- 'zh:cnblogs-qq8864-session-export = https://www.cnblogs.com/qq8864/articles/22476471',
23
- 'zh:cnblogs-qq8864-plugin-vs-tool = https://www.cnblogs.com/qq8864/articles/22478648',
24
- 'zh:csdn-yuqingteck-hello-tool = https://yuqingteck.blog.csdn.net/article/details/163735126',
25
- 'zh:cnblogs-sing1ee-agent-loop = https://www.cnblogs.com/sing1ee/p/22479295',
26
- 'zh:cnblogs-sing1ee-guide = https://www.cnblogs.com/sing1ee/p/22455466',
27
- 'zh:cnblogs-knqiufan-context = https://www.cnblogs.com/knqiufan/p/22472410',
28
- 'zh:cnblogs-foxcharon-install = https://www.cnblogs.com/foxcharon/p/22467976',
29
- 'zh:cnblogs-pc2005-getting-started = https://www.cnblogs.com/pc2005/p/22477984',
30
- 'zh:cnblogs-adgine-ai-engineering = https://www.cnblogs.com/adgine-ai/articles/22473232',
31
- 'zh:cnblogs-itech-architecture = https://www.cnblogs.com/itech/p/22460843',
32
- 'zh:cnblogs-isLinXu-analysis = https://www.cnblogs.com/isLinXu/p/22457058',
33
- 'zh:csdn-damodev-monorepo = https://damodev.csdn.net/6a7dd787662f9a54cb9c6da0.html',
34
- 'zh:51cto-v4pro-runtime = https://www.51cto.com/article/852965.html',
35
- 'zh:51cto-blog-observability = https://blog.51cto.com/u_16175471/14797309',
36
- 'zh:aliyun-first-tutorial = https://developer.aliyun.com/article/1755786',
37
- 'zh:aliyun-everything-plugin = https://developer.aliyun.com/article/1755877',
38
- 'zh:bibigpt-skill-video = https://bibigpt.co/zh/blog/posts/deepseek-harness-skill-ai-video-summary',
39
- 'zh:aixq-visual-tutorial = https://www.aixq.cc/62178.html',
40
- 'zh:qbitai-review = https://www.qbitai.com/2026/08/472208.html',
41
- 'zh:zhidx-review = https://www.zhidx.com/p/584897.html',
42
- 'zh:pingwest-review = https://www.pingwest.com/a/316436',
43
- 'zh:dtinsight-review = https://www.dtinsight.com.cn/sys-nd/4072.html',
44
- 'zh:v2ex-1234341-quickref = https://global.v2ex.co/t/1234341',
45
- 'zh:v2ex-1234203 = https://global.v2ex.co/t/1234203',
46
- 'zh:v2ex-1234320-tools-limit = https://global.v2ex.co/t/1234320',
47
- 'zh:v2ex-1234424-shell = https://global.v2ex.co/t/1234424',
48
- 'zh:v2ex-1234521-v4flash = https://global.v2ex.co/t/1234521',
49
- 'zh:v2ex-1231389-pre-release = https://global.v2ex.co/t/1231389',
50
- 'zh:v2ex-1214141-hiring = https://global.v2ex.co/t/1214141',
51
- 'zh:36kr-black-whale = https://www.36kr.com/p/3938566998834308',
52
- 'zh:jiemian-lego = https://www.jiemian.com/article/14922169.html',
53
- 'zh:80aj-doc-reader = https://www.80aj.com/2026/08/14/agent-doc-reader-plugin/',
54
- 'zh:80aj-vscode-search = https://www.80aj.com/2026/08/14/deepseek-vscode-plugin-search/',
55
- 'zh:locdd-80299 = https://locdd.com/t/topic/80299/7',
56
- 'zh:locdd-80207 = https://locdd.com/t/topic/80207',
57
- 'zh:53ai-first-test = https://www.53ai.com/news/LargeLanguageModel/2026081423497.html',
58
- 'zh:53ai-plugin-tutorial-0815 = https://www.53ai.com/news/OpenSourceLLM/2026081561375.html',
59
- 'zh:csdn-zhuosj-black-whale = https://zhuosj.blog.csdn.net/article/details/163757323',
60
- 'zh:csdn-aiutools-install = https://aiutools.blog.csdn.net/article/details/163758630',
61
- 'zh:csdn-qq8864-plugin-tool = https://blog.csdn.net/qq8864/article/details/163760812',
62
- 'zh:163-architecture = https://www.163.com/dy/article/L4AHS9B70518R7MO.html',
63
- 'zh:163-install-tutorial = https://www.163.com/dy/article/L4AUJ7A305568W0A.html',
64
- 'zh:qq-news-hot = https://news.qq.com/rain/a/20260814A048HD00',
65
- 'zh:csdnnews-28k-star = https://csdnnews.blog.csdn.net/article/details/163747298',
66
- 'zh:geekpark-50k = https://w.geekpark.net/news/368809',
67
- 'zh:pedaily-investment = https://news.pedaily.cn/202608/567694.shtml',
68
- 'zh:weibo-beta-share = https://weibo.com/2/detail/5331613565062839',
69
- 'zh:csdn-aicoding-roles = https://aicoding.csdn.net/6a23863d662f9a54cb7a4fed.html',
70
- 'zh:aitop100-v01 = https://www.aitop100.cn/infomation/details/34468.html',
71
- 'zh:bilibili-BV1WmgF6qEMn = https://www.bilibili.com/video/BV1WmgF6qEMn/',
72
- 'zh:bilibili-BV1iAgc6xEj7 = https://www.bilibili.com/video/BV1iAgc6xEj7/',
73
- 'zh:bilibili-BV1KFgF6zEtk = https://www.bilibili.com/video/BV1KFgF6zEtk/',
74
- 'zh:bilibili-BV1NKgw6VErB = https://www.bilibili.com/video/BV1NKgw6VErB/',
75
- 'zh:bilibili-BV1o4gP6iEeo = https://www.bilibili.com/video/BV1o4gP6iEeo/',
76
- 'zh:bilibili-BV1vugA6FERZ = https://www.bilibili.com/video/BV1vugA6FERZ/',
77
- 'zh:bilibili-BV1VkgK6NEZS = https://www.bilibili.com/video/BV1VkgK6NEZS/',
78
- 'zh:bilibili-BV1eDgW6QEFx = https://www.bilibili.com/video/BV1eDgW6QEFx/',
79
- 'zh:bilibili-BV17ygc6tEE1 = https://www.bilibili.com/video/BV17ygc6tEE1/',
80
- 'zh:21jingji-jiazi = https://www.21jingji.com/article/20260521/herald/d706e7b6130739114b8761d933f7e546.html',
81
- 'zh:21jingji-wechat = https://m.21jingji.com/article/20260813/b78d3f9cd177ec3974c227ca1e9f7672.html',
82
- 'zh:ithome-beta-plugins = https://www.ithome.com/0/989/446.htm',
83
- 'zh:ai-indeed-timeline = https://www.ai-indeed.com/encyclopedia/29653.html',
84
- 'zh:yijunzhao-guide = https://yijunzhao.cn/archives/deepseek-harness-getting-started-guide-first-agent-framework',
85
- 'zh:gm7-install = https://www.gm7.org/archives/141339',
86
- 'zh:zol-v01 = https://ai.zol.com.cn/1231/12318730.html',
87
- 'zh:thepaper-three = https://www.thepaper.cn/newsDetail_forward_33785032',
88
- 'zh:donews = https://www.donews.com/news/detail/1/6670751.html',
89
- 'zh:chinaz-plugin = https://www.chinaz.com/ainews/30334.shtml',
90
- 'zh:wsisp-80k = https://www.wsisp.com/helps/94702.html',
91
- 'zh:eastmoney-black-whale = https://finance.eastmoney.com/a/202608123839370860.html',
92
- 'zh:sina-whale = https://www.sina.cn/news/detail/5331578031178880.html',
93
- 'zh:sina-wechat-account = https://www.sina.cn/news/detail/5331415036067930.html',
94
- 'zh:tmtpost-beta = https://www.tmtpost.com/8083615.html',
95
- 'zh:aihot-community = https://aihot.virxact.com/items/cmst6pn4b06aqro06xbl1wusy',
96
- 'zh:aihot-openrouter-ori = https://aihot.virxact.com/items/cmstacm1202dzro0xv735yk7c',
97
- 'zh:chaincatcher-beta = https://www.chaincatcher.com/article/2278625',
98
- 'zh:baijing-harness = https://jishuzhan.baijing.cn/article/3251',
99
- 'zh:sohu-28k = https://www.sohu.com/a/1062527577_115128',
100
- 'zh:locdd-80821-qqbot = https://locdd.com/t/topic/80821',
101
- # ---------- en ----------
102
- 'en:rits-cordis = http://rits.shanghai.nyu.edu/ai/deepseek-harness-cordis-everything-is-a-plugin/',
103
- 'en:devto-onsen-guide = https://dev.to/onsen/deepseek-harness-developer-preview-full-guide-ocm',
104
- 'en:devto-reidmarlow-price = https://dev.to/reidmarlow/deepseeks-harness-is-the-price-signal-17bl',
105
- 'en:agentpedia-v01 = https://agentpedia.codes/blog/deepseek-harness-v0-1-plugin-agent-guide',
106
- 'en:explainx = https://explainx.ai/blog/deepseek-harness-v0-1-plugin-first-agent-stack-august-2026',
107
- 'en:agentbreaking = https://agentbreaking.com/blog/deepseek-harness-open-source-agent-framework/',
108
- 'en:xcmd-install = https://www.x-cmd.com/install/deepseek-harness/',
109
- 'en:dsh-index = https://dsh-index.xlings.org',
110
- 'en:xlings-dsh = https://openxlings.github.io/xim-pkgindex/en/packages/dsh/',
111
- 'en:36kr-en-minecraft = https://eu.36kr.com/en/p/3938774780263814',
112
- 'en:36kr-en-blackwhale = https://eu.36kr.com/en/p/3938566998834308',
113
- 'en:36kr-en-selfevolution = https://eu.36kr.com/en/p/3938795963137411',
114
- 'en:ollama-integration = https://docs.ollama.com/integrations/deepseek-harness',
115
- 'en:aiengineerguide = https://aiengineerguide.com/til/deepseek-harness/',
116
- 'en:julian-goldie = https://aisuccesslabjuliangoldie.com/blog/deepseek-harness/',
117
- 'en:gigazine-en = https://gigazine.net/gsc_news/en/20260814-deepseek-harness-v0-1',
118
- 'en:aibase-en = https://www.aibase.com/news/30334',
119
- 'en:pandaily-preview = https://pandaily.com/deepseek-harness-developer-preview-everything-is-a-plugin-black-whale-aug2026',
120
- 'en:edgen-300plugins = https://www.edgen.tech/en/news/post/deepseek-harness-enters-agent-market-with-300-plugins-challenging-codex',
121
- 'en:tmtpost-en = https://en.tmtpost.com/news/7995741',
122
- 'en:pandaily-funding = https://pandaily.com/deepseek-funding-expansion-hiring-harness',
123
- 'en:essamamdani = https://essamamdani.com/blog/deepseek-harness-plugin-first-agent-stack-2026',
124
- 'en:openrouter-ori = https://openrouter.ai/docs/guides/ori/harness',
125
- 'en:digg-webui-x = https://digg.com/tech/7fx4ofvh',
126
- 'en:digg-devs-beta = https://digg.com/tech/silt5bft',
127
- 'en:news-eink = https://news.e-ink.me/en/archive/2026-08-13/article/deepseek-harness-developer-preview',
128
- 'en:tipranks-openrouter = https://fastly.tipranks.com/news/private-companies/openrouter-expands-ai-model-orchestration-with-ori-deepseek-harness-integration',
129
- 'en:webgate-mit = https://web.gate.it/zh/news/detail/deepseek-open-sources-harness-v01-under-the-mit-license-rivaling-claude-23440280',
130
- 'en:blockbeats-v4pro = https://en.theblockbeats.news/flash/361500',
131
- 'en:runtimewire-harness = https://runtimewire.com/article/deepseek-open-sources-agent-harness-v4-pro-api-price-hike',
132
- 'en:digitalapplied-harness = https://www.digitalapplied.com/blog/deepseek-harness-open-source-agent-framework-2026',
133
- 'en:digitalapplied-v4pro-ga = https://www.digitalapplied.com/blog/deepseek-v4-pro-ga-official-release-2026',
134
- 'en:afbytes-venturebeat-mirror = https://afbytes.com/news/article/rss:f2c63a396b39d3537b5fd16ac4f5ca04f9574ad53febab5a97db5852c6/deepseek-harness-launches-as-open-source-rival-to-claude-code-alongside-v4-pro-on-api-with-higher-prices',
135
- # ---------- hn ----------
136
- 'hn:49286003-cordis = https://hn.edgecompute.app/item/49286003',
137
- 'hn:49287821-xcmd = https://hn.edgecompute.app/item/49287821',
138
- 'hn:49294357-dshindex = https://hn.edgecompute.app/item/49294357',
139
- 'hn:49291049-xlings = https://hn.edgecompute.app/item/49291049',
140
- 'hn:49291893-jellyball = https://hn.edgecompute.app/item/49291893',
141
- 'hn:49285244-main = https://hn.edgecompute.app/item/49285244',
142
- 'hn:49285620-twitter-post = https://hn.edgecompute.app/item/49285620'
143
- )
144
-
145
- $log = New-Object System.Collections.Generic.List[string]
146
- $counts = @{}
147
- foreach ($entry in $list) {
148
- $lang, $rest = $entry -split ':', 2
149
- $slug, $url = $rest -split '=', 2
150
- $slug = $slug.Trim(); $url = $url.Trim()
151
- if ($Lang -and $lang -ne $Lang) { continue }
152
- $dir = Join-Path $out $lang
153
- New-Item -ItemType Directory -Force -Path $dir | Out-Null
154
- $file = Join-Path $dir ($slug + '.html')
155
- if (-not $Force -and (Test-Path $file) -and (Get-Item $file).Length -gt 500) {
156
- $log.Add("SKIP`t$lang/$slug"); continue
157
- }
158
- $cmd = "& '$curl' -sSL --connect-timeout 10 --max-time 30 -A `"$ua`" -o `"$file`" `"$url`""
159
- try { Invoke-Expression $cmd | Out-Null } catch { $log.Add("FAIL`t$lang/$slug`tinvoke-error"); continue }
160
- if (Test-Path $file) {
161
- $len = (Get-Item $file).Length
162
- if ($len -gt 500) { $log.Add("OK`t$lang/$slug`t$len bytes") }
163
- else { Remove-Item $file -Force; $log.Add("FAIL`t$lang/$slug`ttoo-small($len)") }
164
- } else { $log.Add("FAIL`t$lang/$slug`tno-file") }
165
- }
166
- foreach ($l in @('zh','en','hn')) {
167
- $d = Join-Path $out $l
168
- if (Test-Path $d) { $counts[$l] = (Get-ChildItem $d -Filter *.html -File).Count }
169
- }
170
- $log | Set-Content (Join-Path $out '_download.log') -Encoding UTF8
171
-
172
- $utc = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mmZ')
173
- $L = @()
174
- $L += '# 社区文章归档(HTML 快照)'
175
- $L += ''
176
- $L += "> 抓取: $utc (UTC) via scripts/download-community-articles.ps1(幂等,-Force 全量重下)。"
177
- $L += '> 反爬/需浏览器站点(知乎/InfoQ/venturebeat/TNW/Twitter/YouTube/Reddit 等)不在清单,线索见 downloads/_research/*-community-scan.md。'
178
- $L += ''
179
- $L += '| 语言段 | 篇数 |'
180
- $L += '|---|---|'
181
- foreach ($l in @('zh','en','hn')) { $L += "| $l/ | $($counts[$l]) |" }
182
- $L += ''
183
- $L += '## 归档明细'
184
- $L += ''
185
- $L += '见 _download.log(OK/SKIP/FAIL + 字节数)。'
186
- Set-Content -Path (Join-Path $out 'README.md') -Value ($L -join "`r`n") -Encoding UTF8
187
- Write-Output ("DONE: zh={0} en={1} hn={2} -> {3}" -f $counts['zh'], $counts['en'], $counts['hn'], $out)
188
- $log | Write-Output
1
+ # dsh-plugin-guide 社区文章归档脚本(幂等:已存在且非空则跳过)
2
+ # 输出: downloads/web/community-articles/{zh,en,hn}/<slug>.html + _download.log + README.md
3
+ # 来源: downloads/_research/{chinese,english}-community-scan.md 中标 200 的 URL + 08-15 增量扫描线索。
4
+ # 已知反爬站(知乎/InfoQ/venturebeat/thenextweb/twitter/youtube/reddit/腾讯新闻 501 等)不在清单内,记录见两份扫描报告。
5
+ # 注意: PS 5.1 下 curl 的 -A/-o 参数若经变量数组传入会被拆词;本脚本用 Invoke-Expression
6
+ # 拼完整命令行字符串,引号在字符串内显式给出,规避该坑。
7
+ # 参数: -Force 强制全部重下; -Lang zh|en|hn 只处理某语言段。
8
+ param([switch]$Force, [string]$Lang = '')
9
+ $ErrorActionPreference = 'Continue'
10
+ $ProgressPreference = 'SilentlyContinue'
11
+
12
+ $kb = Split-Path $PSScriptRoot -Parent
13
+ $out = Join-Path $kb 'downloads\web\community-articles'
14
+ $ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36'
15
+ $curl = Get-Command curl.exe -ErrorAction SilentlyContinue
16
+ if (-not $curl) { $curl = "$env:SystemRoot\System32\curl.exe" } else { $curl = $curl.Source }
17
+
18
+ # slug => url(语言段前缀 zh:/en:/hn: 决定落盘目录)
19
+ $list = @(
20
+ # ---------- zh ----------
21
+ 'zh:cnblogs-pc2005-npm-publish = https://www.cnblogs.com/pc2005/p/22477987',
22
+ 'zh:cnblogs-qq8864-session-export = https://www.cnblogs.com/qq8864/articles/22476471',
23
+ 'zh:cnblogs-qq8864-plugin-vs-tool = https://www.cnblogs.com/qq8864/articles/22478648',
24
+ 'zh:csdn-yuqingteck-hello-tool = https://yuqingteck.blog.csdn.net/article/details/163735126',
25
+ 'zh:cnblogs-sing1ee-agent-loop = https://www.cnblogs.com/sing1ee/p/22479295',
26
+ 'zh:cnblogs-sing1ee-guide = https://www.cnblogs.com/sing1ee/p/22455466',
27
+ 'zh:cnblogs-knqiufan-context = https://www.cnblogs.com/knqiufan/p/22472410',
28
+ 'zh:cnblogs-foxcharon-install = https://www.cnblogs.com/foxcharon/p/22467976',
29
+ 'zh:cnblogs-pc2005-getting-started = https://www.cnblogs.com/pc2005/p/22477984',
30
+ 'zh:cnblogs-adgine-ai-engineering = https://www.cnblogs.com/adgine-ai/articles/22473232',
31
+ 'zh:cnblogs-itech-architecture = https://www.cnblogs.com/itech/p/22460843',
32
+ 'zh:cnblogs-isLinXu-analysis = https://www.cnblogs.com/isLinXu/p/22457058',
33
+ 'zh:csdn-damodev-monorepo = https://damodev.csdn.net/6a7dd787662f9a54cb9c6da0.html',
34
+ 'zh:51cto-v4pro-runtime = https://www.51cto.com/article/852965.html',
35
+ 'zh:51cto-blog-observability = https://blog.51cto.com/u_16175471/14797309',
36
+ 'zh:aliyun-first-tutorial = https://developer.aliyun.com/article/1755786',
37
+ 'zh:aliyun-everything-plugin = https://developer.aliyun.com/article/1755877',
38
+ 'zh:bibigpt-skill-video = https://bibigpt.co/zh/blog/posts/deepseek-harness-skill-ai-video-summary',
39
+ 'zh:aixq-visual-tutorial = https://www.aixq.cc/62178.html',
40
+ 'zh:qbitai-review = https://www.qbitai.com/2026/08/472208.html',
41
+ 'zh:zhidx-review = https://www.zhidx.com/p/584897.html',
42
+ 'zh:pingwest-review = https://www.pingwest.com/a/316436',
43
+ 'zh:dtinsight-review = https://www.dtinsight.com.cn/sys-nd/4072.html',
44
+ 'zh:v2ex-1234341-quickref = https://global.v2ex.co/t/1234341',
45
+ 'zh:v2ex-1234203 = https://global.v2ex.co/t/1234203',
46
+ 'zh:v2ex-1234320-tools-limit = https://global.v2ex.co/t/1234320',
47
+ 'zh:v2ex-1234424-shell = https://global.v2ex.co/t/1234424',
48
+ 'zh:v2ex-1234521-v4flash = https://global.v2ex.co/t/1234521',
49
+ 'zh:v2ex-1231389-pre-release = https://global.v2ex.co/t/1231389',
50
+ 'zh:v2ex-1214141-hiring = https://global.v2ex.co/t/1214141',
51
+ 'zh:36kr-black-whale = https://www.36kr.com/p/3938566998834308',
52
+ 'zh:jiemian-lego = https://www.jiemian.com/article/14922169.html',
53
+ 'zh:80aj-doc-reader = https://www.80aj.com/2026/08/14/agent-doc-reader-plugin/',
54
+ 'zh:80aj-vscode-search = https://www.80aj.com/2026/08/14/deepseek-vscode-plugin-search/',
55
+ 'zh:locdd-80299 = https://locdd.com/t/topic/80299/7',
56
+ 'zh:locdd-80207 = https://locdd.com/t/topic/80207',
57
+ 'zh:53ai-first-test = https://www.53ai.com/news/LargeLanguageModel/2026081423497.html',
58
+ 'zh:53ai-plugin-tutorial-0815 = https://www.53ai.com/news/OpenSourceLLM/2026081561375.html',
59
+ 'zh:csdn-zhuosj-black-whale = https://zhuosj.blog.csdn.net/article/details/163757323',
60
+ 'zh:csdn-aiutools-install = https://aiutools.blog.csdn.net/article/details/163758630',
61
+ 'zh:csdn-qq8864-plugin-tool = https://blog.csdn.net/qq8864/article/details/163760812',
62
+ 'zh:163-architecture = https://www.163.com/dy/article/L4AHS9B70518R7MO.html',
63
+ 'zh:163-install-tutorial = https://www.163.com/dy/article/L4AUJ7A305568W0A.html',
64
+ 'zh:qq-news-hot = https://news.qq.com/rain/a/20260814A048HD00',
65
+ 'zh:csdnnews-28k-star = https://csdnnews.blog.csdn.net/article/details/163747298',
66
+ 'zh:geekpark-50k = https://w.geekpark.net/news/368809',
67
+ 'zh:pedaily-investment = https://news.pedaily.cn/202608/567694.shtml',
68
+ 'zh:weibo-beta-share = https://weibo.com/2/detail/5331613565062839',
69
+ 'zh:csdn-aicoding-roles = https://aicoding.csdn.net/6a23863d662f9a54cb7a4fed.html',
70
+ 'zh:aitop100-v01 = https://www.aitop100.cn/infomation/details/34468.html',
71
+ 'zh:bilibili-BV1WmgF6qEMn = https://www.bilibili.com/video/BV1WmgF6qEMn/',
72
+ 'zh:bilibili-BV1iAgc6xEj7 = https://www.bilibili.com/video/BV1iAgc6xEj7/',
73
+ 'zh:bilibili-BV1KFgF6zEtk = https://www.bilibili.com/video/BV1KFgF6zEtk/',
74
+ 'zh:bilibili-BV1NKgw6VErB = https://www.bilibili.com/video/BV1NKgw6VErB/',
75
+ 'zh:bilibili-BV1o4gP6iEeo = https://www.bilibili.com/video/BV1o4gP6iEeo/',
76
+ 'zh:bilibili-BV1vugA6FERZ = https://www.bilibili.com/video/BV1vugA6FERZ/',
77
+ 'zh:bilibili-BV1VkgK6NEZS = https://www.bilibili.com/video/BV1VkgK6NEZS/',
78
+ 'zh:bilibili-BV1eDgW6QEFx = https://www.bilibili.com/video/BV1eDgW6QEFx/',
79
+ 'zh:bilibili-BV17ygc6tEE1 = https://www.bilibili.com/video/BV17ygc6tEE1/',
80
+ 'zh:21jingji-jiazi = https://www.21jingji.com/article/20260521/herald/d706e7b6130739114b8761d933f7e546.html',
81
+ 'zh:21jingji-wechat = https://m.21jingji.com/article/20260813/b78d3f9cd177ec3974c227ca1e9f7672.html',
82
+ 'zh:ithome-beta-plugins = https://www.ithome.com/0/989/446.htm',
83
+ 'zh:ai-indeed-timeline = https://www.ai-indeed.com/encyclopedia/29653.html',
84
+ 'zh:yijunzhao-guide = https://yijunzhao.cn/archives/deepseek-harness-getting-started-guide-first-agent-framework',
85
+ 'zh:gm7-install = https://www.gm7.org/archives/141339',
86
+ 'zh:zol-v01 = https://ai.zol.com.cn/1231/12318730.html',
87
+ 'zh:thepaper-three = https://www.thepaper.cn/newsDetail_forward_33785032',
88
+ 'zh:donews = https://www.donews.com/news/detail/1/6670751.html',
89
+ 'zh:chinaz-plugin = https://www.chinaz.com/ainews/30334.shtml',
90
+ 'zh:wsisp-80k = https://www.wsisp.com/helps/94702.html',
91
+ 'zh:eastmoney-black-whale = https://finance.eastmoney.com/a/202608123839370860.html',
92
+ 'zh:sina-whale = https://www.sina.cn/news/detail/5331578031178880.html',
93
+ 'zh:sina-wechat-account = https://www.sina.cn/news/detail/5331415036067930.html',
94
+ 'zh:tmtpost-beta = https://www.tmtpost.com/8083615.html',
95
+ 'zh:aihot-community = https://aihot.virxact.com/items/cmst6pn4b06aqro06xbl1wusy',
96
+ 'zh:aihot-openrouter-ori = https://aihot.virxact.com/items/cmstacm1202dzro0xv735yk7c',
97
+ 'zh:chaincatcher-beta = https://www.chaincatcher.com/article/2278625',
98
+ 'zh:baijing-harness = https://jishuzhan.baijing.cn/article/3251',
99
+ 'zh:sohu-28k = https://www.sohu.com/a/1062527577_115128',
100
+ 'zh:locdd-80821-qqbot = https://locdd.com/t/topic/80821',
101
+ # ---------- en ----------
102
+ 'en:rits-cordis = http://rits.shanghai.nyu.edu/ai/deepseek-harness-cordis-everything-is-a-plugin/',
103
+ 'en:devto-onsen-guide = https://dev.to/onsen/deepseek-harness-developer-preview-full-guide-ocm',
104
+ 'en:devto-reidmarlow-price = https://dev.to/reidmarlow/deepseeks-harness-is-the-price-signal-17bl',
105
+ 'en:agentpedia-v01 = https://agentpedia.codes/blog/deepseek-harness-v0-1-plugin-agent-guide',
106
+ 'en:explainx = https://explainx.ai/blog/deepseek-harness-v0-1-plugin-first-agent-stack-august-2026',
107
+ 'en:agentbreaking = https://agentbreaking.com/blog/deepseek-harness-open-source-agent-framework/',
108
+ 'en:xcmd-install = https://www.x-cmd.com/install/deepseek-harness/',
109
+ 'en:dsh-index = https://dsh-index.xlings.org',
110
+ 'en:xlings-dsh = https://openxlings.github.io/xim-pkgindex/en/packages/dsh/',
111
+ 'en:36kr-en-minecraft = https://eu.36kr.com/en/p/3938774780263814',
112
+ 'en:36kr-en-blackwhale = https://eu.36kr.com/en/p/3938566998834308',
113
+ 'en:36kr-en-selfevolution = https://eu.36kr.com/en/p/3938795963137411',
114
+ 'en:ollama-integration = https://docs.ollama.com/integrations/deepseek-harness',
115
+ 'en:aiengineerguide = https://aiengineerguide.com/til/deepseek-harness/',
116
+ 'en:julian-goldie = https://aisuccesslabjuliangoldie.com/blog/deepseek-harness/',
117
+ 'en:gigazine-en = https://gigazine.net/gsc_news/en/20260814-deepseek-harness-v0-1',
118
+ 'en:aibase-en = https://www.aibase.com/news/30334',
119
+ 'en:pandaily-preview = https://pandaily.com/deepseek-harness-developer-preview-everything-is-a-plugin-black-whale-aug2026',
120
+ 'en:edgen-300plugins = https://www.edgen.tech/en/news/post/deepseek-harness-enters-agent-market-with-300-plugins-challenging-codex',
121
+ 'en:tmtpost-en = https://en.tmtpost.com/news/7995741',
122
+ 'en:pandaily-funding = https://pandaily.com/deepseek-funding-expansion-hiring-harness',
123
+ 'en:essamamdani = https://essamamdani.com/blog/deepseek-harness-plugin-first-agent-stack-2026',
124
+ 'en:openrouter-ori = https://openrouter.ai/docs/guides/ori/harness',
125
+ 'en:digg-webui-x = https://digg.com/tech/7fx4ofvh',
126
+ 'en:digg-devs-beta = https://digg.com/tech/silt5bft',
127
+ 'en:news-eink = https://news.e-ink.me/en/archive/2026-08-13/article/deepseek-harness-developer-preview',
128
+ 'en:tipranks-openrouter = https://fastly.tipranks.com/news/private-companies/openrouter-expands-ai-model-orchestration-with-ori-deepseek-harness-integration',
129
+ 'en:webgate-mit = https://web.gate.it/zh/news/detail/deepseek-open-sources-harness-v01-under-the-mit-license-rivaling-claude-23440280',
130
+ 'en:blockbeats-v4pro = https://en.theblockbeats.news/flash/361500',
131
+ 'en:runtimewire-harness = https://runtimewire.com/article/deepseek-open-sources-agent-harness-v4-pro-api-price-hike',
132
+ 'en:digitalapplied-harness = https://www.digitalapplied.com/blog/deepseek-harness-open-source-agent-framework-2026',
133
+ 'en:digitalapplied-v4pro-ga = https://www.digitalapplied.com/blog/deepseek-v4-pro-ga-official-release-2026',
134
+ 'en:afbytes-venturebeat-mirror = https://afbytes.com/news/article/rss:f2c63a396b39d3537b5fd16ac4f5ca04f9574ad53febab5a97db5852c6/deepseek-harness-launches-as-open-source-rival-to-claude-code-alongside-v4-pro-on-api-with-higher-prices',
135
+ # ---------- hn ----------
136
+ 'hn:49286003-cordis = https://hn.edgecompute.app/item/49286003',
137
+ 'hn:49287821-xcmd = https://hn.edgecompute.app/item/49287821',
138
+ 'hn:49294357-dshindex = https://hn.edgecompute.app/item/49294357',
139
+ 'hn:49291049-xlings = https://hn.edgecompute.app/item/49291049',
140
+ 'hn:49291893-jellyball = https://hn.edgecompute.app/item/49291893',
141
+ 'hn:49285244-main = https://hn.edgecompute.app/item/49285244',
142
+ 'hn:49285620-twitter-post = https://hn.edgecompute.app/item/49285620'
143
+ )
144
+
145
+ $log = New-Object System.Collections.Generic.List[string]
146
+ $counts = @{}
147
+ foreach ($entry in $list) {
148
+ $lang, $rest = $entry -split ':', 2
149
+ $slug, $url = $rest -split '=', 2
150
+ $slug = $slug.Trim(); $url = $url.Trim()
151
+ if ($Lang -and $lang -ne $Lang) { continue }
152
+ $dir = Join-Path $out $lang
153
+ New-Item -ItemType Directory -Force -Path $dir | Out-Null
154
+ $file = Join-Path $dir ($slug + '.html')
155
+ if (-not $Force -and (Test-Path $file) -and (Get-Item $file).Length -gt 500) {
156
+ $log.Add("SKIP`t$lang/$slug"); continue
157
+ }
158
+ $cmd = "& '$curl' -sSL --connect-timeout 10 --max-time 30 -A `"$ua`" -o `"$file`" `"$url`""
159
+ try { Invoke-Expression $cmd | Out-Null } catch { $log.Add("FAIL`t$lang/$slug`tinvoke-error"); continue }
160
+ if (Test-Path $file) {
161
+ $len = (Get-Item $file).Length
162
+ if ($len -gt 500) { $log.Add("OK`t$lang/$slug`t$len bytes") }
163
+ else { Remove-Item $file -Force; $log.Add("FAIL`t$lang/$slug`ttoo-small($len)") }
164
+ } else { $log.Add("FAIL`t$lang/$slug`tno-file") }
165
+ }
166
+ foreach ($l in @('zh','en','hn')) {
167
+ $d = Join-Path $out $l
168
+ if (Test-Path $d) { $counts[$l] = (Get-ChildItem $d -Filter *.html -File).Count }
169
+ }
170
+ $log | Set-Content (Join-Path $out '_download.log') -Encoding UTF8
171
+
172
+ $utc = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mmZ')
173
+ $L = @()
174
+ $L += '# 社区文章归档(HTML 快照)'
175
+ $L += ''
176
+ $L += "> 抓取: $utc (UTC) via scripts/download-community-articles.ps1(幂等,-Force 全量重下)。"
177
+ $L += '> 反爬/需浏览器站点(知乎/InfoQ/venturebeat/TNW/Twitter/YouTube/Reddit 等)不在清单,线索见 downloads/_research/*-community-scan.md。'
178
+ $L += ''
179
+ $L += '| 语言段 | 篇数 |'
180
+ $L += '|---|---|'
181
+ foreach ($l in @('zh','en','hn')) { $L += "| $l/ | $($counts[$l]) |" }
182
+ $L += ''
183
+ $L += '## 归档明细'
184
+ $L += ''
185
+ $L += '见 _download.log(OK/SKIP/FAIL + 字节数)。'
186
+ Set-Content -Path (Join-Path $out 'README.md') -Value ($L -join "`r`n") -Encoding UTF8
187
+ Write-Output ("DONE: zh={0} en={1} hn={2} -> {3}" -f $counts['zh'], $counts['en'], $counts['hn'], $out)
188
+ $log | Write-Output