dsh-standards 1.0.0 → 1.0.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.
Files changed (471) hide show
  1. package/40-checker/README.md +2 -2
  2. package/40-checker/scripts/runtime-child.mjs +13 -0
  3. package/40-checker/src/cli.mjs +64 -5
  4. package/40-checker/src/manifest.mjs +20 -1
  5. package/40-checker/src/report.mjs +6 -1
  6. package/40-checker/src/semver.mjs +77 -11
  7. package/CHANGELOG.md +32 -0
  8. package/NOTICE +14 -0
  9. package/README.md +6 -6
  10. package/bin/dsh-standards.mjs +1 -0
  11. package/package.json +14 -5
  12. package/40-checker/.github/workflows/plugin-verify.yml +0 -70
  13. package/40-checker/results/boost/REPORT.md +0 -304
  14. package/40-checker/results/boost/lev12458.json +0 -1747
  15. package/40-checker/results/client/README.md +0 -16
  16. package/40-checker/results/entry/18/DDDMUC__dsh-free-search.json +0 -381
  17. package/40-checker/results/entry/18/DDDMUC__dsh-free-search.runtime.json +0 -34
  18. package/40-checker/results/entry/18/Ebony-Vinyl__dsh-our-free-model.json +0 -361
  19. package/40-checker/results/entry/18/Ebony-Vinyl__dsh-our-free-model.runtime.json +0 -34
  20. package/40-checker/results/entry/18/README.md +0 -24
  21. package/40-checker/results/entry/18/RUNTIME.md +0 -18
  22. package/40-checker/results/entry/18/SeaOf0__dsh-redteam-model.json +0 -391
  23. package/40-checker/results/entry/18/YuJunZhiXue__dsh-purge.json +0 -432
  24. package/40-checker/results/entry/18/ci-diet.json +0 -365
  25. package/40-checker/results/entry/18/ci-diet.runtime-attempt.json +0 -38
  26. package/40-checker/results/entry/18/daily-log.json +0 -357
  27. package/40-checker/results/entry/18/daily-log.runtime.json +0 -519
  28. package/40-checker/results/entry/18/fullbase/ATTRIBUTION.md +0 -29
  29. package/40-checker/results/entry/18/fullbase/DDDMUC__dsh-free-search.json +0 -99
  30. package/40-checker/results/entry/18/fullbase/Ebony-Vinyl__dsh-our-free-model.json +0 -95
  31. package/40-checker/results/entry/18/fullbase/REPORT.md +0 -261
  32. package/40-checker/results/entry/18/fullbase/SeaOf0__dsh-redteam-model.json +0 -144
  33. package/40-checker/results/entry/18/fullbase/YuJunZhiXue__dsh-purge.json +0 -106
  34. package/40-checker/results/entry/18/fullbase/ci-diet.json +0 -99
  35. package/40-checker/results/entry/18/fullbase/daily-log.json +0 -94
  36. package/40-checker/results/entry/18/fullbase/howmp__dsh-pentest.json +0 -104
  37. package/40-checker/results/entry/18/fullbase/kingcharleslzy-ai__dsh-purge.json +0 -143
  38. package/40-checker/results/entry/18/fullbase/liguobao__ds-harness-remote.json +0 -134
  39. package/40-checker/results/entry/18/fullbase/mmparko__dsh-purge.json +0 -138
  40. package/40-checker/results/entry/18/fullbase/project-memory.json +0 -108
  41. package/40-checker/results/entry/18/fullbase/qiushi.json +0 -94
  42. package/40-checker/results/entry/18/fullbase/shaobeichen__dsh-pocket.json +0 -94
  43. package/40-checker/results/entry/18/fullbase/status-rotator.json +0 -94
  44. package/40-checker/results/entry/18/fullbase/summary.json +0 -297
  45. package/40-checker/results/entry/18/fullbase/telemetry.json +0 -94
  46. package/40-checker/results/entry/18/fullbase/ui-auth.json +0 -94
  47. package/40-checker/results/entry/18/fullbase/verification.json +0 -94
  48. package/40-checker/results/entry/18/fullbase/ysr666__dsh-vision-router.json +0 -106
  49. package/40-checker/results/entry/18/howmp__dsh-pentest.json +0 -361
  50. package/40-checker/results/entry/18/kingcharleslzy-ai__dsh-purge.json +0 -411
  51. package/40-checker/results/entry/18/liguobao__ds-harness-remote.json +0 -379
  52. package/40-checker/results/entry/18/mmparko__dsh-purge.json +0 -441
  53. package/40-checker/results/entry/18/project-memory.json +0 -361
  54. package/40-checker/results/entry/18/project-memory.runtime.json +0 -519
  55. package/40-checker/results/entry/18/qiushi.json +0 -353
  56. package/40-checker/results/entry/18/qiushi.runtime.json +0 -519
  57. package/40-checker/results/entry/18/realweb/REPORT.md +0 -73
  58. package/40-checker/results/entry/18/realweb/SeaOf0__dsh-redteam-model.json +0 -104
  59. package/40-checker/results/entry/18/realweb/YuJunZhiXue__dsh-purge.json +0 -64
  60. package/40-checker/results/entry/18/realweb/howmp__dsh-pentest.json +0 -65
  61. package/40-checker/results/entry/18/realweb/kingcharleslzy-ai__dsh-purge.json +0 -75
  62. package/40-checker/results/entry/18/realweb/mmparko__dsh-purge.json +0 -70
  63. package/40-checker/results/entry/18/realweb/shaobeichen__dsh-pocket.json +0 -56
  64. package/40-checker/results/entry/18/realweb/summary.json +0 -196
  65. package/40-checker/results/entry/18/realweb/ui-auth.json +0 -56
  66. package/40-checker/results/entry/18/realweb/ysr666__dsh-vision-router.json +0 -61
  67. package/40-checker/results/entry/18/richbase/REPORT.md +0 -70
  68. package/40-checker/results/entry/18/richbase/SeaOf0__dsh-redteam-model.json +0 -61
  69. package/40-checker/results/entry/18/richbase/SeaOf0__dsh-redteam-model.log +0 -38
  70. package/40-checker/results/entry/18/shaobeichen__dsh-pocket.json +0 -363
  71. package/40-checker/results/entry/18/status-rotator.json +0 -362
  72. package/40-checker/results/entry/18/status-rotator.runtime.json +0 -519
  73. package/40-checker/results/entry/18/summary.json +0 -266
  74. package/40-checker/results/entry/18/targetonly/DDDMUC__dsh-free-search.json +0 -34
  75. package/40-checker/results/entry/18/targetonly/Ebony-Vinyl__dsh-our-free-model.json +0 -34
  76. package/40-checker/results/entry/18/targetonly/SeaOf0__dsh-redteam-model.json +0 -84
  77. package/40-checker/results/entry/18/targetonly/YuJunZhiXue__dsh-purge.json +0 -52
  78. package/40-checker/results/entry/18/targetonly/ci-diet.json +0 -34
  79. package/40-checker/results/entry/18/targetonly/daily-log.json +0 -34
  80. package/40-checker/results/entry/18/targetonly/howmp__dsh-pentest.json +0 -46
  81. package/40-checker/results/entry/18/targetonly/kingcharleslzy-ai__dsh-purge.json +0 -61
  82. package/40-checker/results/entry/18/targetonly/liguobao__ds-harness-remote.json +0 -39
  83. package/40-checker/results/entry/18/targetonly/mmparko__dsh-purge.json +0 -57
  84. package/40-checker/results/entry/18/targetonly/project-memory.json +0 -34
  85. package/40-checker/results/entry/18/targetonly/qiushi.json +0 -34
  86. package/40-checker/results/entry/18/targetonly/shaobeichen__dsh-pocket.json +0 -34
  87. package/40-checker/results/entry/18/targetonly/status-rotator.json +0 -34
  88. package/40-checker/results/entry/18/targetonly/summary.json +0 -133
  89. package/40-checker/results/entry/18/targetonly/telemetry.json +0 -34
  90. package/40-checker/results/entry/18/targetonly/ui-auth.json +0 -34
  91. package/40-checker/results/entry/18/targetonly/verification.json +0 -34
  92. package/40-checker/results/entry/18/targetonly/ysr666__dsh-vision-router.json +0 -43
  93. package/40-checker/results/entry/18/telemetry.json +0 -349
  94. package/40-checker/results/entry/18/ui-auth.json +0 -369
  95. package/40-checker/results/entry/18/verification.json +0 -358
  96. package/40-checker/results/entry/18/ysr666__dsh-vision-router.json +0 -409
  97. package/40-checker/results/fixtures/bad.json +0 -347
  98. package/40-checker/results/fixtures/bundle.json +0 -378
  99. package/40-checker/results/fixtures/good-listing.json +0 -382
  100. package/40-checker/results/fixtures/good-static.json +0 -322
  101. package/40-checker/results/fixtures/good.json +0 -375
  102. package/40-checker/results/fixtures/good.sarif +0 -274
  103. package/40-checker/results/flow/README.md +0 -19
  104. package/40-checker/results/flow/j3-j7-fixture.json +0 -51
  105. package/40-checker/results/flow/j5-j8-client-missing.json +0 -45
  106. package/40-checker/results/flow/j5-j8-good.json +0 -45
  107. package/40-checker/results/flow/journey-fixture-bundle.json +0 -90
  108. package/40-checker/results/flow/journey-fixture-j1-j2-j4-j6.json +0 -107
  109. package/40-checker/results/flow/real/DDDMUC__dsh-free-search.json +0 -297
  110. package/40-checker/results/flow/real/REPORT.md +0 -335
  111. package/40-checker/results/flow/real/YuJunZhiXue__dsh-purge.json +0 -317
  112. package/40-checker/results/flow/real/ci-diet.json +0 -351
  113. package/40-checker/results/flow/real/daily-log.json +0 -286
  114. package/40-checker/results/flow/real/index.json +0 -325
  115. package/40-checker/results/flow/real/project-memory.json +0 -290
  116. package/40-checker/results/flow/real/qiushi.json +0 -277
  117. package/40-checker/results/flow/real/status-rotator.json +0 -275
  118. package/40-checker/results/flow/real/telemetry.json +0 -178
  119. package/40-checker/results/flow/real/ui-auth.json +0 -288
  120. package/40-checker/results/flow/real/verification.json +0 -265
  121. package/40-checker/results/governance/co-maintainer-packet.md +0 -85
  122. package/40-checker/results/l1/ci-diet.json +0 -406
  123. package/40-checker/results/l1/npm-dsh-telemetry-redactor-0.1.0.json +0 -390
  124. package/40-checker/results/l1/npm-dsh-verification-receipt-0.1.0.json +0 -406
  125. package/40-checker/results/l1/npm-qiushi-dsh-evidence-audit-0.1.0.json +0 -394
  126. package/40-checker/results/l1/npm-zzerx-dsh-plugin-daily-log-0.4.3.json +0 -405
  127. package/40-checker/results/l1/project-memory.json +0 -402
  128. package/40-checker/results/l1/source-DDDMUC__dsh-free-search.json +0 -422
  129. package/40-checker/results/l1/source-Ebony-Vinyl__dsh-our-free-model.json +0 -421
  130. package/40-checker/results/l1/source-SeaOf0__dsh-redteam-model.json +0 -432
  131. package/40-checker/results/l1/source-YuJunZhiXue__dsh-purge.json +0 -473
  132. package/40-checker/results/l1/source-howmp__dsh-pentest.json +0 -402
  133. package/40-checker/results/l1/source-kingcharleslzy-ai__dsh-purge.json +0 -452
  134. package/40-checker/results/l1/source-liguobao__ds-harness-remote.json +0 -420
  135. package/40-checker/results/l1/source-mmparko__dsh-purge.json +0 -482
  136. package/40-checker/results/l1/source-shaobeichen__dsh-pocket.json +0 -404
  137. package/40-checker/results/l1/source-ysr666__dsh-vision-router.json +0 -384
  138. package/40-checker/results/l1/status-rotator.json +0 -403
  139. package/40-checker/results/l1/ui-auth.json +0 -429
  140. package/40-checker/results/l1/ysr666__dsh-vision-router.published.json +0 -384
  141. package/40-checker/results/lev3/REPORT.md +0 -342
  142. package/40-checker/results/lev3/lev3.json +0 -4835
  143. package/40-checker/results/lev6/REPORT.md +0 -460
  144. package/40-checker/results/lev6/capture-sample.json +0 -241
  145. package/40-checker/results/lev6/capture.jsonl +0 -4
  146. package/40-checker/results/lev6/lev6.json +0 -245
  147. package/40-checker/results/lev6/replication-r1.json +0 -245
  148. package/40-checker/results/levels/README.md +0 -16
  149. package/40-checker/results/levels/dsh-plugin-doctor.json +0 -141
  150. package/40-checker/results/levels/dsh-plugin-guide.json +0 -136
  151. package/40-checker/results/m1/dsh-ci-diet-0.5.2.json +0 -352
  152. package/40-checker/results/m1/dsh-status-rotator-0.38.0.json +0 -349
  153. package/40-checker/results/m1/dsh-telemetry-redactor-0.1.0.json +0 -336
  154. package/40-checker/results/m1/dsh-ui-auth-0.7.1.json +0 -356
  155. package/40-checker/results/m1/dsh-verification-receipt-0.1.0.json +0 -344
  156. package/40-checker/results/m1/index-level.json +0 -13
  157. package/40-checker/results/m1/levels.json +0 -72100
  158. package/40-checker/results/m1/qiushi-dsh-evidence-audit-0.1.0.json +0 -339
  159. package/40-checker/results/m1/yolk_vat-y-dsh-project-memory-0.6.7.json +0 -348
  160. package/40-checker/results/m1/zzerx-dsh-plugin-daily-log-0.4.3.json +0 -344
  161. package/40-checker/results/m2/dsh-ci-diet.json +0 -421
  162. package/40-checker/results/m2/dsh-ci-diet.unshare-landlock.json +0 -424
  163. package/40-checker/results/m2/dsh-ci-diet.unshare.json +0 -423
  164. package/40-checker/results/m2/fixture-bundle.image.json +0 -404
  165. package/40-checker/results/m2/fixture-bundle.json +0 -392
  166. package/40-checker/results/m2/fixture-bundle.landlock.json +0 -396
  167. package/40-checker/results/m2/fixture-bundle.unshare.json +0 -395
  168. package/40-checker/results/m2/fs-write.json +0 -338
  169. package/40-checker/results/m2/hang.json +0 -31
  170. package/40-checker/results/m2/hang.unshare-landlock.json +0 -34
  171. package/40-checker/results/m2/hang.unshare.json +0 -33
  172. package/40-checker/results/m2/project-memory.json +0 -417
  173. package/40-checker/results/m2/status-rotator.json +0 -418
  174. package/40-checker/results/m2/ui-auth.json +0 -444
  175. package/40-checker/results/negative/bad-entry.json +0 -345
  176. package/40-checker/results/negative/no-entry.json +0 -345
  177. package/40-checker/results/negative/no-patch.json +0 -344
  178. package/40-checker/results/negative/root-missing.json +0 -344
  179. package/40-checker/results/negative/root-missing.runtime.json +0 -30
  180. package/40-checker/results/negative/summary.json +0 -51
  181. package/40-checker/results/negative/workspace.json +0 -344
  182. package/40-checker/results/patched/Ebony-Vinyl__dsh-our-free-model.json +0 -334
  183. package/40-checker/results/patched/Ebony-Vinyl__dsh-our-free-model.overlay.json +0 -335
  184. package/40-checker/results/patched/SeaOf0__dsh-redteam-model.json +0 -315
  185. package/40-checker/results/patched/SeaOf0__dsh-redteam-model.overlay.json +0 -316
  186. package/40-checker/results/patched/mmparko__dsh-purge.json +0 -357
  187. package/40-checker/results/patched/mmparko__dsh-purge.overlay.json +0 -358
  188. package/40-checker/results/patched/shaobeichen__dsh-pocket.json +0 -315
  189. package/40-checker/results/patched/shaobeichen__dsh-pocket.overlay.json +0 -316
  190. package/40-checker/results/real/DDDMUC__dsh-free-search.json +0 -344
  191. package/40-checker/results/real/Ebony-Vinyl__dsh-our-free-model.json +0 -343
  192. package/40-checker/results/real/SeaOf0__dsh-redteam-model.json +0 -354
  193. package/40-checker/results/real/YuJunZhiXue__dsh-purge.json +0 -395
  194. package/40-checker/results/real/howmp__dsh-pentest.json +0 -324
  195. package/40-checker/results/real/kingcharleslzy-ai__dsh-purge.json +0 -374
  196. package/40-checker/results/real/liguobao__ds-harness-remote.json +0 -342
  197. package/40-checker/results/real/mmparko__dsh-purge.json +0 -404
  198. package/40-checker/results/real/shaobeichen__dsh-pocket.json +0 -326
  199. package/40-checker/results/real/ysr666__dsh-vision-router.json +0 -372
  200. package/40-checker/results/real/ysr666__dsh-vision-router.listing.json +0 -378
  201. package/40-checker/results/round-robin/compare.json +0 -52
  202. package/40-checker/results/round-robin/runner-a.json +0 -9
  203. package/40-checker/results/round-robin/runner-b.json +0 -9
  204. package/40-checker/results/sample20/123dbl__dsh-side-session.json +0 -344
  205. package/40-checker/results/sample20/173787247__dsh-wsl-dns.json +0 -360
  206. package/40-checker/results/sample20/863683348__dsh-insight.json +0 -375
  207. package/40-checker/results/sample20/Ansellwan__DSH-Custom-Wallpaper.json +0 -344
  208. package/40-checker/results/sample20/Jamailar__beav-deepseek-harness.json +0 -341
  209. package/40-checker/results/sample20/ManoloRemiddi__DSH-Metafolder-Plugin.json +0 -344
  210. package/40-checker/results/sample20/NEAZ71eve__dsh-tool-github.json +0 -384
  211. package/40-checker/results/sample20/README.md +0 -3
  212. package/40-checker/results/sample20/RINGOLINK__dsh-desktop-shell.json +0 -352
  213. package/40-checker/results/sample20/Zxznb666__dsh-qoder-cn-subagent.json +0 -349
  214. package/40-checker/results/sample20/agent-mobile__dsh-mobile-gateway.json +0 -353
  215. package/40-checker/results/sample20/fangqiing__dsh-knowledge-lite.json +0 -359
  216. package/40-checker/results/sample20/fzy0517__deepseek-harness-session-cleaner.json +0 -344
  217. package/40-checker/results/sample20/gjy1992__dsh-diagram.json +0 -350
  218. package/40-checker/results/sample20/mrme000m__dsh-prime-orchestrator.json +0 -414
  219. package/40-checker/results/sample20/redstonedust__dsh-solidworks-copilot.json +0 -362
  220. package/40-checker/results/sample20/summary.json +0 -234
  221. package/40-checker/results/sample20/w2112515__dsh-remote-host.json +0 -344
  222. package/40-checker/results/sample20/wkfedor__deepseek-harness-voice-input.json +0 -350
  223. package/40-checker/results/sample20/xfgil__dsh-hot-reloader.json +0 -344
  224. package/40-checker/results/sample20/yizhiyizhi0128__dsh-peak-scheduler.json +0 -360
  225. package/40-checker/results/sample20-ci/123dbl__dsh-side-session.json +0 -344
  226. package/40-checker/results/sample20-ci/173787247__dsh-wsl-dns.json +0 -360
  227. package/40-checker/results/sample20-ci/863683348__dsh-insight.json +0 -375
  228. package/40-checker/results/sample20-ci/Ansellwan__DSH-Custom-Wallpaper.json +0 -344
  229. package/40-checker/results/sample20-ci/Jamailar__beav-deepseek-harness.json +0 -367
  230. package/40-checker/results/sample20-ci/ManoloRemiddi__DSH-Metafolder-Plugin.json +0 -344
  231. package/40-checker/results/sample20-ci/NEAZ71eve__dsh-tool-github.json +0 -392
  232. package/40-checker/results/sample20-ci/README.md +0 -5
  233. package/40-checker/results/sample20-ci/RINGOLINK__dsh-desktop-shell.json +0 -361
  234. package/40-checker/results/sample20-ci/Zxznb666__dsh-qoder-cn-subagent.json +0 -349
  235. package/40-checker/results/sample20-ci/agent-mobile__dsh-mobile-gateway.json +0 -384
  236. package/40-checker/results/sample20-ci/fangqiing__dsh-knowledge-lite.json +0 -360
  237. package/40-checker/results/sample20-ci/fzy0517__deepseek-harness-session-cleaner.json +0 -354
  238. package/40-checker/results/sample20-ci/gjy1992__dsh-diagram.json +0 -381
  239. package/40-checker/results/sample20-ci/mrme000m__dsh-prime-orchestrator.json +0 -452
  240. package/40-checker/results/sample20-ci/redstonedust__dsh-solidworks-copilot.json +0 -371
  241. package/40-checker/results/sample20-ci/summary.json +0 -195
  242. package/40-checker/results/sample20-ci/w2112515__dsh-remote-host.json +0 -399
  243. package/40-checker/results/sample20-ci/wkfedor__deepseek-harness-voice-input.json +0 -358
  244. package/40-checker/results/sample20-ci/xfgil__dsh-hot-reloader.json +0 -344
  245. package/40-checker/results/sample20-ci/yizhiyizhi0128__dsh-peak-scheduler.json +0 -370
  246. package/40-checker/results/sample20-ci/zed1902209846-dotcom__DPwhale-plugin.json +0 -231
  247. package/40-checker/results/sample60/123dbl__dsh-side-session.json +0 -344
  248. package/40-checker/results/sample60/173787247__dsh-wsl-dns.json +0 -360
  249. package/40-checker/results/sample60/863683348__dsh-insight.json +0 -375
  250. package/40-checker/results/sample60/Anionex__dsh-turn-rewind.json +0 -349
  251. package/40-checker/results/sample60/Ansellwan__DSH-Custom-Wallpaper.json +0 -344
  252. package/40-checker/results/sample60/Ebony-Vinyl__EAC-Pack.json +0 -352
  253. package/40-checker/results/sample60/EricWang1358__dsh-web-studyhub.json +0 -376
  254. package/40-checker/results/sample60/GanyuanRan__Aegis.json +0 -349
  255. package/40-checker/results/sample60/HiSeax__dsh-codely.json +0 -358
  256. package/40-checker/results/sample60/Jamailar__beav-deepseek-harness.json +0 -341
  257. package/40-checker/results/sample60/ManoloRemiddi__DSH-Metafolder-Plugin.json +0 -344
  258. package/40-checker/results/sample60/MichengAI__dsh-archive-manager.json +0 -357
  259. package/40-checker/results/sample60/MichengAI__dsh-im-connect.json +0 -347
  260. package/40-checker/results/sample60/MindLab-Research__dsh-generative-ui.json +0 -350
  261. package/40-checker/results/sample60/NEAZ71eve__dsh-tool-github.json +0 -384
  262. package/40-checker/results/sample60/README.md +0 -7
  263. package/40-checker/results/sample60/RINGOLINK__dsh-desktop-shell.json +0 -352
  264. package/40-checker/results/sample60/SeanTolstoyevski__dsh-code-review.json +0 -352
  265. package/40-checker/results/sample60/Tasihi89__dsh-talk-map.json +0 -344
  266. package/40-checker/results/sample60/Tyan66666__billion-context-dsh.json +0 -469
  267. package/40-checker/results/sample60/V1ki__dsh-plugin-subscriptions.json +0 -350
  268. package/40-checker/results/sample60/Yu-tao-Li__dsh-computer-use-win.json +0 -341
  269. package/40-checker/results/sample60/ZSeven-W__dsh-ios.json +0 -344
  270. package/40-checker/results/sample60/Zxznb666__dsh-qoder-cn-subagent.json +0 -349
  271. package/40-checker/results/sample60/agent-mobile__dsh-mobile-gateway.json +0 -353
  272. package/40-checker/results/sample60/c3cvld7aag__fujiang-dsh.json +0 -361
  273. package/40-checker/results/sample60/cxzrdxy__dsh-file-explorer.json +0 -389
  274. package/40-checker/results/sample60/dhicoc__dsh-reverse-skill.json +0 -341
  275. package/40-checker/results/sample60/fangqiing__dsh-knowledge-lite.json +0 -359
  276. package/40-checker/results/sample60/fwerkor__local-shell-mcp.json +0 -369
  277. package/40-checker/results/sample60/fzy0517__deepseek-harness-session-cleaner.json +0 -344
  278. package/40-checker/results/sample60/gjy1992__dsh-diagram.json +0 -350
  279. package/40-checker/results/sample60/howmp__dsh-pentest.json +0 -341
  280. package/40-checker/results/sample60/linhay__harmony-next.skills.json +0 -344
  281. package/40-checker/results/sample60/liustack__modsearch.json +0 -371
  282. package/40-checker/results/sample60/mmparko__dsh-purge.json +0 -372
  283. package/40-checker/results/sample60/mrme000m__dsh-prime-orchestrator.json +0 -414
  284. package/40-checker/results/sample60/omdsh-dev__dsh_workflow.json +0 -439
  285. package/40-checker/results/sample60/redstonedust__dsh-solidworks-copilot.json +0 -362
  286. package/40-checker/results/sample60/seriousz158__dsh-memory.json +0 -350
  287. package/40-checker/results/sample60/shanliuling__dsh-image-gen.json +0 -353
  288. package/40-checker/results/sample60/shanliuling__skills-link.json +0 -344
  289. package/40-checker/results/sample60/shengsheng90__DSH-taskboard.json +0 -341
  290. package/40-checker/results/sample60/sjh9714__dsh-win32.json +0 -374
  291. package/40-checker/results/sample60/skymecode__deepseek-harness-for-vscode.json +0 -351
  292. package/40-checker/results/sample60/sopaco__terrain.json +0 -352
  293. package/40-checker/results/sample60/summary.json +0 -658
  294. package/40-checker/results/sample60/tinqiao-oss__engramory.json +0 -352
  295. package/40-checker/results/sample60/tong-io__tongflow.json +0 -359
  296. package/40-checker/results/sample60/vibeinging__dsh-desktop.json +0 -382
  297. package/40-checker/results/sample60/w2112515__dsh-remote-host.json +0 -344
  298. package/40-checker/results/sample60/wkfedor__deepseek-harness-voice-input.json +0 -350
  299. package/40-checker/results/sample60/wz20__dsh-dafeiyu-dot.json +0 -349
  300. package/40-checker/results/sample60/xfgil__dsh-hot-reloader.json +0 -344
  301. package/40-checker/results/sample60/yi-yezhiqiu__dsh-prompt-market.json +0 -360
  302. package/40-checker/results/sample60/yizhiyizhi0128__dsh-peak-scheduler.json +0 -360
  303. package/40-checker/results/sample60/yjh051108__dsh-routing-suite.json +0 -366
  304. package/40-checker/results/sample60-ci/123dbl__dsh-side-session.json +0 -344
  305. package/40-checker/results/sample60-ci/173787247__dsh-wsl-dns.json +0 -360
  306. package/40-checker/results/sample60-ci/863683348__dsh-insight.json +0 -375
  307. package/40-checker/results/sample60-ci/Anionex__dsh-turn-rewind.json +0 -379
  308. package/40-checker/results/sample60-ci/Ansellwan__DSH-Custom-Wallpaper.json +0 -344
  309. package/40-checker/results/sample60-ci/Ebony-Vinyl__EAC-Pack.json +0 -362
  310. package/40-checker/results/sample60-ci/EricWang1358__dsh-web-studyhub.json +0 -378
  311. package/40-checker/results/sample60-ci/GanyuanRan__Aegis.json +0 -349
  312. package/40-checker/results/sample60-ci/HiSeax__dsh-codely.json +0 -368
  313. package/40-checker/results/sample60-ci/Jamailar__beav-deepseek-harness.json +0 -367
  314. package/40-checker/results/sample60-ci/LiarMTTT__TavernWeave.json +0 -231
  315. package/40-checker/results/sample60-ci/ManoloRemiddi__DSH-Metafolder-Plugin.json +0 -344
  316. package/40-checker/results/sample60-ci/MichengAI__dsh-archive-manager.json +0 -395
  317. package/40-checker/results/sample60-ci/MichengAI__dsh-im-connect.json +0 -404
  318. package/40-checker/results/sample60-ci/MindLab-Research__dsh-generative-ui.json +0 -410
  319. package/40-checker/results/sample60-ci/NEAZ71eve__dsh-tool-github.json +0 -392
  320. package/40-checker/results/sample60-ci/README.md +0 -7
  321. package/40-checker/results/sample60-ci/RINGOLINK__dsh-desktop-shell.json +0 -361
  322. package/40-checker/results/sample60-ci/Ruler4396__dsh-launcher.json +0 -231
  323. package/40-checker/results/sample60-ci/SeanTolstoyevski__dsh-code-review.json +0 -363
  324. package/40-checker/results/sample60-ci/Tasihi89__dsh-talk-map.json +0 -372
  325. package/40-checker/results/sample60-ci/Tyan66666__billion-context-dsh.json +0 -469
  326. package/40-checker/results/sample60-ci/V1ki__dsh-plugin-subscriptions.json +0 -368
  327. package/40-checker/results/sample60-ci/Yu-tao-Li__dsh-computer-use-win.json +0 -349
  328. package/40-checker/results/sample60-ci/ZSeven-W__dsh-ios.json +0 -344
  329. package/40-checker/results/sample60-ci/Zxznb666__dsh-qoder-cn-subagent.json +0 -349
  330. package/40-checker/results/sample60-ci/agent-mobile__dsh-mobile-gateway.json +0 -384
  331. package/40-checker/results/sample60-ci/c3cvld7aag__fujiang-dsh.json +0 -361
  332. package/40-checker/results/sample60-ci/cxzrdxy__dsh-file-explorer.json +0 -399
  333. package/40-checker/results/sample60-ci/dhicoc__dsh-reverse-skill.json +0 -352
  334. package/40-checker/results/sample60-ci/fangqiing__dsh-knowledge-lite.json +0 -360
  335. package/40-checker/results/sample60-ci/fwerkor__local-shell-mcp.json +0 -387
  336. package/40-checker/results/sample60-ci/fzy0517__deepseek-harness-session-cleaner.json +0 -354
  337. package/40-checker/results/sample60-ci/gjy1992__dsh-diagram.json +0 -381
  338. package/40-checker/results/sample60-ci/howmp__dsh-pentest.json +0 -361
  339. package/40-checker/results/sample60-ci/linhay__harmony-next.skills.json +0 -344
  340. package/40-checker/results/sample60-ci/liustack__modsearch.json +0 -382
  341. package/40-checker/results/sample60-ci/mmparko__dsh-purge.json +0 -441
  342. package/40-checker/results/sample60-ci/mrme000m__dsh-prime-orchestrator.json +0 -452
  343. package/40-checker/results/sample60-ci/omdsh-dev__dsh_workflow.json +0 -439
  344. package/40-checker/results/sample60-ci/plastic-labs__honcho.json +0 -231
  345. package/40-checker/results/sample60-ci/redstonedust__dsh-solidworks-copilot.json +0 -371
  346. package/40-checker/results/sample60-ci/seriousz158__dsh-memory.json +0 -351
  347. package/40-checker/results/sample60-ci/shanliuling__dsh-image-gen.json +0 -382
  348. package/40-checker/results/sample60-ci/shanliuling__skills-link.json +0 -344
  349. package/40-checker/results/sample60-ci/shengsheng90__DSH-taskboard.json +0 -370
  350. package/40-checker/results/sample60-ci/sjh9714__dsh-win32.json +0 -410
  351. package/40-checker/results/sample60-ci/skymecode__deepseek-harness-for-vscode.json +0 -391
  352. package/40-checker/results/sample60-ci/sopaco__deepwiki-rs.json +0 -231
  353. package/40-checker/results/sample60-ci/sopaco__terrain.json +0 -352
  354. package/40-checker/results/sample60-ci/summary.json +0 -555
  355. package/40-checker/results/sample60-ci/tinqiao-oss__engramory.json +0 -362
  356. package/40-checker/results/sample60-ci/tong-io__tongflow.json +0 -393
  357. package/40-checker/results/sample60-ci/vibeinging__dsh-desktop.json +0 -555
  358. package/40-checker/results/sample60-ci/w2112515__dsh-remote-host.json +0 -399
  359. package/40-checker/results/sample60-ci/wkfedor__deepseek-harness-voice-input.json +0 -358
  360. package/40-checker/results/sample60-ci/wz20__dsh-dafeiyu-dot.json +0 -390
  361. package/40-checker/results/sample60-ci/xfgil__dsh-hot-reloader.json +0 -344
  362. package/40-checker/results/sample60-ci/yi-yezhiqiu__dsh-prompt-market.json +0 -373
  363. package/40-checker/results/sample60-ci/yizhiyizhi0128__dsh-peak-scheduler.json +0 -370
  364. package/40-checker/results/sample60-ci/yjh051108__dsh-routing-suite.json +0 -437
  365. package/40-checker/results/sample60-ci/zed1902209846-dotcom__DPwhale-plugin.json +0 -231
  366. package/40-checker/results/triage/REPORT.md +0 -317
  367. package/40-checker/results/triage/evidence/g2-rejections.txt +0 -63
  368. package/40-checker/results/triage/evidence/purge-baseline-0.2.1-rc.5.json +0 -51
  369. package/40-checker/results/triage/evidence/purge-baseline-0.2.2-alpha.2.json +0 -51
  370. package/40-checker/results/triage/evidence/purge-postinstall.txt +0 -62
  371. package/40-checker/results/triage/evidence/purge-with-profile-0.2.1-rc.5.json +0 -71
  372. package/40-checker/results/triage/evidence/purge-with-profile-0.2.2-alpha.2.json +0 -71
  373. package/40-checker/results/triage/evidence/semver-matrix.json +0 -32
  374. package/40-checker/results/triage/triage.json +0 -295
  375. package/40-checker/results/webapp/README.md +0 -10
  376. package/40-checker/results/webapp/summary.json +0 -46
  377. package/40-checker/results/webapp/web-auth.json +0 -19
  378. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/client-export.json +0 -7
  379. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/installed-package.json +0 -123
  380. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/probe.json +0 -129
  381. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/shot.png +0 -0
  382. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/summary.md +0 -16
  383. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/client-export.json +0 -7
  384. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/installed-package.json +0 -76
  385. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/probe.json +0 -129
  386. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/shot.png +0 -0
  387. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/summary.md +0 -16
  388. package/40-checker/results/webruntime/REPORT.md +0 -253
  389. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/client-export.json +0 -7
  390. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/installed-package.json +0 -97
  391. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/probe.json +0 -129
  392. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/shot.png +0 -0
  393. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/summary.md +0 -16
  394. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/client-export.json +0 -7
  395. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/installed-package.json +0 -98
  396. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/probe.json +0 -136
  397. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/shot.png +0 -0
  398. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/summary.md +0 -16
  399. package/40-checker/results/webruntime/ci-diet/client-export.json +0 -10
  400. package/40-checker/results/webruntime/ci-diet/installed-package.json +0 -100
  401. package/40-checker/results/webruntime/ci-diet/probe.json +0 -129
  402. package/40-checker/results/webruntime/ci-diet/shot.png +0 -0
  403. package/40-checker/results/webruntime/ci-diet/summary.md +0 -16
  404. package/40-checker/results/webruntime/daily-log/client-export.json +0 -10
  405. package/40-checker/results/webruntime/daily-log/installed-package.json +0 -113
  406. package/40-checker/results/webruntime/daily-log/probe.json +0 -129
  407. package/40-checker/results/webruntime/daily-log/shot.png +0 -0
  408. package/40-checker/results/webruntime/daily-log/summary.md +0 -16
  409. package/40-checker/results/webruntime/howmp__dsh-pentest/client-export.json +0 -7
  410. package/40-checker/results/webruntime/howmp__dsh-pentest/installed-package.json +0 -90
  411. package/40-checker/results/webruntime/howmp__dsh-pentest/probe.json +0 -129
  412. package/40-checker/results/webruntime/howmp__dsh-pentest/shot.png +0 -0
  413. package/40-checker/results/webruntime/howmp__dsh-pentest/summary.md +0 -16
  414. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/client-export.json +0 -7
  415. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/installed-package.json +0 -164
  416. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/probe.json +0 -129
  417. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/shot.png +0 -0
  418. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/summary.md +0 -16
  419. package/40-checker/results/webruntime/liguobao__ds-harness-remote/client-export.json +0 -7
  420. package/40-checker/results/webruntime/liguobao__ds-harness-remote/installed-package.json +0 -166
  421. package/40-checker/results/webruntime/liguobao__ds-harness-remote/probe.json +0 -129
  422. package/40-checker/results/webruntime/liguobao__ds-harness-remote/shot.png +0 -0
  423. package/40-checker/results/webruntime/liguobao__ds-harness-remote/summary.md +0 -16
  424. package/40-checker/results/webruntime/local-pre-ci/README.md +0 -67
  425. package/40-checker/results/webruntime/local-pre-ci/client-exports.json +0 -158
  426. package/40-checker/results/webruntime/local-pre-ci/dsh-free-search.probe.json +0 -119
  427. package/40-checker/results/webruntime/local-pre-ci/dsh-pocket.probe.json +0 -119
  428. package/40-checker/results/webruntime/local-pre-ci/dsh-redteam-model.probe.json +0 -119
  429. package/40-checker/results/webruntime/local-pre-ci/qiushi-shell-only.probe.json +0 -104
  430. package/40-checker/results/webruntime/local-pre-ci/ui-auth-no-login.fail.json +0 -52
  431. package/40-checker/results/webruntime/local-pre-ci/ui-auth.probe.json +0 -123
  432. package/40-checker/results/webruntime/mmparko__dsh-purge/client-export.json +0 -7
  433. package/40-checker/results/webruntime/mmparko__dsh-purge/installed-package.json +0 -95
  434. package/40-checker/results/webruntime/mmparko__dsh-purge/probe.json +0 -136
  435. package/40-checker/results/webruntime/mmparko__dsh-purge/shot.png +0 -0
  436. package/40-checker/results/webruntime/mmparko__dsh-purge/summary.md +0 -16
  437. package/40-checker/results/webruntime/project-memory/client-export.json +0 -7
  438. package/40-checker/results/webruntime/project-memory/installed-package.json +0 -118
  439. package/40-checker/results/webruntime/project-memory/probe.json +0 -129
  440. package/40-checker/results/webruntime/project-memory/shot.png +0 -0
  441. package/40-checker/results/webruntime/project-memory/summary.md +0 -16
  442. package/40-checker/results/webruntime/qiushi/client-export.json +0 -7
  443. package/40-checker/results/webruntime/qiushi/installed-package.json +0 -84
  444. package/40-checker/results/webruntime/qiushi/probe.json +0 -114
  445. package/40-checker/results/webruntime/qiushi/shot.png +0 -0
  446. package/40-checker/results/webruntime/qiushi/summary.md +0 -16
  447. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/client-export.json +0 -7
  448. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/installed-package.json +0 -85
  449. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/probe.json +0 -129
  450. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/shot.png +0 -0
  451. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/summary.md +0 -16
  452. package/40-checker/results/webruntime/status-rotator/client-export.json +0 -7
  453. package/40-checker/results/webruntime/status-rotator/installed-package.json +0 -107
  454. package/40-checker/results/webruntime/status-rotator/probe.json +0 -129
  455. package/40-checker/results/webruntime/status-rotator/shot.png +0 -0
  456. package/40-checker/results/webruntime/status-rotator/summary.md +0 -16
  457. package/40-checker/results/webruntime/summary.json +0 -323
  458. package/40-checker/results/webruntime/telemetry/probe.json +0 -20
  459. package/40-checker/results/webruntime/telemetry/summary.md +0 -4
  460. package/40-checker/results/webruntime/ui-auth/client-export.json +0 -7
  461. package/40-checker/results/webruntime/ui-auth/installed-package.json +0 -94
  462. package/40-checker/results/webruntime/ui-auth/probe.json +0 -129
  463. package/40-checker/results/webruntime/ui-auth/shot.png +0 -0
  464. package/40-checker/results/webruntime/ui-auth/summary.md +0 -16
  465. package/40-checker/results/webruntime/verification/probe.json +0 -20
  466. package/40-checker/results/webruntime/verification/summary.md +0 -4
  467. package/40-checker/results/webruntime/ysr666__dsh-vision-router/client-export.json +0 -7
  468. package/40-checker/results/webruntime/ysr666__dsh-vision-router/installed-package.json +0 -142
  469. package/40-checker/results/webruntime/ysr666__dsh-vision-router/probe.json +0 -129
  470. package/40-checker/results/webruntime/ysr666__dsh-vision-router/shot.png +0 -0
  471. package/40-checker/results/webruntime/ysr666__dsh-vision-router/summary.md +0 -16
@@ -3,7 +3,7 @@
3
3
  > 版本:0.1.0 | 日期:2026-10-31 | 标准:DS-C v1.0.0 | 许可:Apache-2.0
4
4
  > 零依赖,Node ≥ 20。只读目标包;不修改被检对象。
5
5
  >
6
- > **未发布到 npm。** npm 上的 `dsh-plugin-verify` 是另一个项目;`dsh-levels` 也是第三方包。请从本仓运行 `node bin/...`,不要 `npx dsh-plugin-verify` / `npx dsh-levels`。
6
+ > **发行方式**:本仓直接运行时用 `node 40-checker/bin/...`;npm 上通过 `dsh-standards` 包分发(提供 `dsh-standards` 与 `dsh-levels` 两个命令)。不要用 `npx dsh-plugin-verify`、`npx dsh-levels`——npm 上这两个名字属于其他项目。
7
7
 
8
8
  ## 1. 它做什么
9
9
 
@@ -50,7 +50,7 @@ node bin/dsh-plugin-verify.mjs /path/to/plugin --format sarif --out report.sarif
50
50
  # package:作者本地
51
51
  node bin/dsh-plugin-verify.mjs ./my-plugin
52
52
 
53
- # listing:市场门禁
53
+ # listing:市场条目校验(收录前提醒,不是门禁)
54
54
  node bin/dsh-plugin-verify.mjs ./my-plugin \
55
55
  --profile listing \
56
56
  --market-index ./market.json \
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ // Runs L1-L3 in a disposable child process so a plugin cannot block or take over
3
+ // the checker. Input: JSON on stdin. Output: JSON { checks } on stdout.
4
+ import { runRuntimeChecks } from '../src/runtime.mjs'
5
+ import { readSources } from '../src/util.mjs'
6
+
7
+ const chunks = []
8
+ for await (const chunk of process.stdin) chunks.push(chunk)
9
+ const input = JSON.parse(Buffer.concat(chunks).toString('utf8'))
10
+ let sources = []
11
+ try { sources = readSources(input.dir) } catch { sources = [] }
12
+ const checks = await runRuntimeChecks({ ...input, sources })
13
+ process.stdout.write(JSON.stringify({ checks }))
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'
4
4
  import { runManifestChecks, DEFAULT_RUNTIME_VERSION } from './manifest.mjs'
5
5
  import { checkCapabilities, checkCredentials, checkImportTimeAdvisory, checkLabels } from './declarations.mjs'
6
6
  import { runRuntimeChecks } from './runtime.mjs'
7
- import { spawnSync } from 'node:child_process'
7
+ import { spawn, spawnSync } from 'node:child_process'
8
8
  import { readSources } from './util.mjs'
9
9
  import { buildReport, writeReport } from './report.mjs'
10
10
 
@@ -13,7 +13,7 @@ const DEFAULT_COMMIT = 'ce7073d51254c26cd63b22a60835b8f948deb447'
13
13
  const DEFAULT_CORDIS = '4.0.6-alpha.1'
14
14
 
15
15
  function usage() {
16
- return `dsh-plugin-verify ${VERSION} — DS-C conformance checker (MVP)
16
+ return `${process.env.DSH_CHECKER_BRAND || 'dsh-plugin-verify ' + VERSION} — DS-C conformance checker (MVP)
17
17
 
18
18
  Usage:
19
19
  dsh-plugin-verify <package-dir> [options]
@@ -133,6 +133,51 @@ function parseArgs(argv) {
133
133
  return options
134
134
  }
135
135
 
136
+ function runtimeNotRun(reason) {
137
+ const meta = {
138
+ 'DSC-04': ['C-4', 'L1'], 'DSC-05': ['C-5', 'L1'], 'DSC-06': ['C-6', 'L1+L2'],
139
+ 'DSC-07': ['C-7', 'L2'], 'DSC-08': ['C-8', 'L3'], 'DSC-09': ['C-9', 'L1'],
140
+ }
141
+ return Object.entries(meta).map(([id, [clause, layer]]) => ({
142
+ id, clause, layer, result: 'ERROR', coverage: 'not-run', reason,
143
+ details: [], evidence: [], method: 'M', advisory: false,
144
+ }))
145
+ }
146
+
147
+ /**
148
+ * L1-L3 run in a child process so that a plugin cannot block the event loop,
149
+ * read the checker's environment, or kill the process. The child is hard-killed
150
+ * after timeoutMs + 3s; a kill is reported as not-run, never as a pass.
151
+ */
152
+ function isolatedRuntimeChecks(input) {
153
+ return new Promise((resolve) => {
154
+ const script = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'scripts', 'runtime-child.mjs')
155
+ const child = spawn(process.execPath, [script], { stdio: ['pipe', 'pipe', 'pipe'] })
156
+ let out = ''
157
+ let err = ''
158
+ const timer = setTimeout(() => { try { child.kill('SIGKILL') } catch {} }, input.timeoutMs + 3000)
159
+ child.stdout.on('data', (chunk) => { out += chunk })
160
+ child.stderr.on('data', (chunk) => { err += chunk })
161
+ child.on('error', (error) => {
162
+ clearTimeout(timer)
163
+ resolve(runtimeNotRun(`L1 child failed to start: ${error.message}`))
164
+ })
165
+ child.on('exit', (code, signal) => {
166
+ clearTimeout(timer)
167
+ if (signal === 'SIGKILL' || signal === 'SIGTERM') {
168
+ return resolve(runtimeNotRun(`L1 killed after ${input.timeoutMs}ms; plugin blocked the event loop`))
169
+ }
170
+ try {
171
+ const parsed = JSON.parse(out)
172
+ resolve(parsed.checks)
173
+ } catch {
174
+ resolve(runtimeNotRun(`L1 child produced no JSON (exit ${code}): ${String(err).slice(0, 200)}`))
175
+ }
176
+ })
177
+ child.stdin.end(JSON.stringify(input))
178
+ })
179
+ }
180
+
136
181
  async function entryRunCheck(kind, runtimeChecks, options, dir) {
137
182
  const byId = new Map(runtimeChecks.map(item => [item.id, item]))
138
183
  const c4 = byId.get('DSC-04')
@@ -204,6 +249,10 @@ export async function main(argv = process.argv.slice(2)) {
204
249
  process.stderr.write(`dsh-plugin-verify: target must be a package directory (tarball support is not in the MVP): ${dir}\n`)
205
250
  return 3
206
251
  }
252
+ if (!fs.existsSync(path.join(dir, 'package.json'))) {
253
+ process.stderr.write(`dsh-plugin-verify: not a package directory (no package.json): ${dir}\n`)
254
+ return 3
255
+ }
207
256
 
208
257
  const { manifest, kind, kindInferred, entry, patch, g4, checks: manifestChecks } = runManifestChecks(dir, {
209
258
  runtimeVersion: options.runtimeVersion,
@@ -223,6 +272,7 @@ export async function main(argv = process.argv.slice(2)) {
223
272
  { id: 'DSC-12', clause: 'C-12', layer: 'L0', result: 'ERROR', coverage: 'not-run', reason: 'manifest unavailable', details: [], evidence: [], method: 'M', advisory: false },
224
273
  { id: 'DSC-13', clause: 'C-13', layer: 'L0', result: 'ERROR', coverage: 'not-run', reason: 'manifest unavailable', details: [], evidence: [], method: 'M', advisory: false },
225
274
  ]
275
+ const declarationAdjusted = declarationChecks.map(item => (item.result === 'WARN' && ['DSC-11', 'DSC-13'].includes(item.id) ? { ...item, advisory: true } : item))
226
276
  const advisoryChecks = [checkImportTimeAdvisory(sources)]
227
277
 
228
278
  if (options.scope === 'entry' && options.entryRuntime === 'server-entry' && kind !== 'plugin') options.treatAsPlugin = true
@@ -248,9 +298,9 @@ export async function main(argv = process.argv.slice(2)) {
248
298
  result: 'ERROR', coverage: 'not-run', reason, details: [], evidence: [], method: 'M', advisory: false,
249
299
  }))
250
300
  } else {
251
- runtimeChecks = await runRuntimeChecks({
301
+ runtimeChecks = await isolatedRuntimeChecks({
252
302
  dir, manifest, kind: runtimeKind, entry: runtimeEntry,
253
- runtimePath: options.runtime, timeoutMs: options.timeoutMs, sources,
303
+ runtimePath: options.runtime, timeoutMs: options.timeoutMs,
254
304
  })
255
305
  }
256
306
 
@@ -260,9 +310,18 @@ export async function main(argv = process.argv.slice(2)) {
260
310
  ...runtimeChecks,
261
311
  runCheck,
262
312
  advisoryChecks[0],
263
- ...declarationChecks,
313
+ ...declarationAdjusted,
264
314
  ]
265
315
 
316
+ if (g4?.result === 'FAIL') {
317
+ const dsc01 = checks.find(item => item.id === 'DSC-01')
318
+ if (dsc01 && dsc01.result !== 'FAIL') {
319
+ dsc01.result = 'FAIL'
320
+ dsc01.reason = dsc01.reason ? `${dsc01.reason}; ${g4.reason ?? 'G4 failed'}` : (g4.reason ?? 'G4 failed')
321
+ dsc01.details = [...(dsc01.details ?? []), { item: 'G4', result: 'FAIL', reason: g4.reason ?? 'client shape failed' }]
322
+ }
323
+ }
324
+
266
325
  const subject = {
267
326
  mode: options.profile === 'listing' || options.profile === 'both' ? 'listing' : 'package',
268
327
  profile: options.profile,
@@ -31,6 +31,19 @@ function inside(root, target) {
31
31
  export function resolveEntry(dir, manifest) {
32
32
  const candidates = []
33
33
  const exportTarget = rootExportTarget(manifest)
34
+ if (exportTarget) {
35
+ const absolute = path.resolve(dir, exportTarget)
36
+ if (!inside(dir, absolute)) {
37
+ return { exists: false, escape: true, source: 'exports["."]', target: exportTarget, absolute }
38
+ }
39
+ if (!isFile(absolute)) {
40
+ const sourceCandidates = ['src/index.ts', 'src/index.tsx', 'src/index.js', 'src/index.mjs']
41
+ const sourceEntry = sourceCandidates.find(relative => isFile(path.join(dir, relative))) ?? null
42
+ const scripts = isObject(manifest.scripts) ? manifest.scripts : {}
43
+ const buildHint = Boolean(sourceEntry) || ['build', 'prepare', 'compile'].some(name => typeof scripts[name] === 'string')
44
+ return { exists: false, escape: false, source: 'exports["."]', target: exportTarget, absolute, declaredMissing: true, sourceEntry, buildHint }
45
+ }
46
+ }
34
47
  if (exportTarget) candidates.push({ source: 'exports["."]', target: exportTarget })
35
48
  if (typeof manifest.main === 'string' && manifest.main.trim() !== '') candidates.push({ source: 'main', target: manifest.main })
36
49
  for (const fallback of ['index.js', 'index.mjs', 'index.cjs', 'index.ts']) candidates.push({ source: 'fallback', target: fallback })
@@ -183,12 +196,18 @@ export function runManifestChecks(dir, options = {}) {
183
196
  }
184
197
  if (entry.escape) {
185
198
  manifestDetails.push(detail('C-1.2', 'FAIL', `entry escapes the package: ${entry.target}`, ['package.json#exports']))
199
+ } else if (entry.declaredMissing && entry.buildHint) {
200
+ manifestDetails.push(detail('C-1.2', 'WARN', `exports["."] target missing; build hint exists (${entry.sourceEntry ?? 'build script'})`, ['package.json#exports']))
201
+ } else if (entry.declaredMissing) {
202
+ manifestDetails.push(detail('C-1.2', 'FAIL', `exports["."] points to a missing file: ${entry.target}`, ['package.json#exports']))
186
203
  } else if (entry.exists) {
187
204
  manifestDetails.push(detail('C-1.2', 'PASS', `entry resolves via ${entry.source}: ${entry.relative}`, [entry.relative]))
188
205
  } else if (entry.buildHint) {
189
206
  manifestDetails.push(detail('C-1.2', 'WARN', `entry not present in checkout; source/build hint exists (${entry.sourceEntry ?? 'build script'})`, ['package.json#scripts']))
190
207
  } else if (kind === 'bundle' || kind === 'client') {
191
208
  manifestDetails.push(detail('C-1.2', 'WARN', `no runtime entry; ${kind} packages may be patch/client only`, ['package.json#exports']))
209
+ } else if (Array.isArray(manifest.workspaces) || (manifest.workspaces && typeof manifest.workspaces === 'object')) {
210
+ manifestDetails.push(detail('C-1.2', 'NA', 'workspace root; run the checker on a package subdirectory', ['package.json#workspaces']))
192
211
  } else {
193
212
  manifestDetails.push(detail('C-1.2', 'FAIL', 'no resolvable runtime entry', ['package.json#exports', 'package.json#main']))
194
213
  }
@@ -207,7 +226,7 @@ export function runManifestChecks(dir, options = {}) {
207
226
  manifestDetails.push(detail('C-1.5', 'PASS', `license=${manifest.license}`))
208
227
  }
209
228
  if (manifest.private === true) {
210
- manifestDetails.push(detail('C-1.6', 'WARN', 'private:true; not publishable to a registry', ['package.json#private']))
229
+ manifestDetails.push(detail('C-1.6', 'NA', 'private:true; not publishable to a registry', ['package.json#private']))
211
230
  }
212
231
  const manifestResult = worst(manifestDetails.map(item => item.result))
213
232
  const manifestCheck = check({
@@ -45,7 +45,10 @@ export function buildReport({ subject, anchor, checks, g4 = null, scope, profile
45
45
  ? adjustedChecks.map(item => runtimeIds.has(item.id) ? { ...item, result: 'NA', coverage: 'not-run', reason: 'out of scope for M1 static-only' } : item)
46
46
  : adjustedChecks
47
47
  const byId = new Map(effectiveChecks.map(item => [item.id, item]))
48
- const selected = mandatory.map(id => byId.get(id)).filter(Boolean)
48
+ const selectedAll = mandatory.map(id => byId.get(id)).filter(Boolean)
49
+ // Advisory checks are reported but never move the verdict.
50
+ const selected = selectedAll.filter(item => item.advisory !== true)
51
+ const advisoryWarnings = selectedAll.filter(item => item.advisory === true && item.result === 'WARN')
49
52
  const missing = mandatory.filter(id => !byId.has(id))
50
53
  const failed = selected.filter(item => item.result === 'FAIL')
51
54
  const errored = selected.filter(item => item.result === 'ERROR')
@@ -80,6 +83,7 @@ export function buildReport({ subject, anchor, checks, g4 = null, scope, profile
80
83
  if (failed.length > 0) reasonParts.push(`FAIL: ${failed.map(item => item.id).join(', ')}`)
81
84
  if (notRunIds.length > 0) reasonParts.push(`not run: ${notRunIds.join(', ')}`)
82
85
  if (warnings.length > 0) reasonParts.push(`WARN: ${warnings.map(item => item.id).join(', ')}`)
86
+ if (advisoryWarnings.length > 0) reasonParts.push(`advisory: ${advisoryWarnings.map(item => item.id).join(', ')}`)
83
87
 
84
88
  return {
85
89
  schema: 'dsh-conformance/1',
@@ -92,6 +96,7 @@ export function buildReport({ subject, anchor, checks, g4 = null, scope, profile
92
96
  mandatory: mandatory.length,
93
97
  pass: pass.length,
94
98
  warn: warnings.length,
99
+ advisory: advisoryWarnings.length,
95
100
  fail: failed.length,
96
101
  na: selected.filter(item => item.result === 'NA').length,
97
102
  notRun: notRunIds.length,
@@ -63,19 +63,85 @@ function upperForTilde(version) {
63
63
  return { ...version, minor: version.minor + 1, patch: 0, prerelease: [] }
64
64
  }
65
65
 
66
- function tokenizeAlternative(alternative) {
67
- const tokens = []
66
+ function parsePartial(text) {
67
+ const match = /^v?(\d+)(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-([0-9A-Za-z.-]+))?$/.exec(text.trim())
68
+ if (!match) return null
69
+ return {
70
+ major: Number(match[1]),
71
+ minor: match[2] === undefined || /[xX*]/.test(match[2]) ? null : Number(match[2]),
72
+ patch: match[3] === undefined || /[xX*]/.test(match[3]) ? null : Number(match[3]),
73
+ prerelease: match[4] ? match[4].split('.') : [],
74
+ }
75
+ }
76
+
77
+ function fullVersion(partial) {
78
+ return { major: partial.major, minor: partial.minor ?? 0, patch: partial.patch ?? 0, prerelease: partial.prerelease }
79
+ }
80
+ function nextMinor(partial) { return { major: partial.major, minor: (partial.minor ?? 0) + 1, patch: 0, prerelease: [] } }
81
+ function nextMajor(partial) { return { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } }
82
+ function fmt(version) {
83
+ const base = `${version.major}.${version.minor}.${version.patch}`
84
+ return version.prerelease && version.prerelease.length ? `${base}-${version.prerelease.join('.')}` : base
85
+ }
86
+
87
+ function expandToken(raw) {
88
+ if (raw === '*' || raw === 'x' || raw === 'X') return '*'
89
+ const match = /^(>=|<=|>|<|=|\^|~)?\s*v?(\d+)(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-([0-9A-Za-z.-]+))?$/.exec(raw)
90
+ if (!match) return null
91
+ const op = match[1] ?? '='
92
+ const partial = {
93
+ major: Number(match[2]),
94
+ minor: match[3] === undefined || /[xX*]/.test(match[3]) ? null : Number(match[3]),
95
+ patch: match[4] === undefined || /[xX*]/.test(match[4]) ? null : Number(match[4]),
96
+ prerelease: match[5] ? match[5].split('.') : [],
97
+ }
98
+ const low = fullVersion(partial)
99
+ const noMinor = partial.minor === null
100
+ const noPatch = partial.patch === null
101
+ if (!noMinor && !noPatch) return `${op}${fmt(low)}`
102
+ switch (op) {
103
+ case '^':
104
+ case '~':
105
+ case '=':
106
+ return noMinor ? `>=${fmt(low)} <${fmt(nextMajor(partial))}` : `>=${fmt(low)} <${fmt(nextMinor(partial))}`
107
+ case '>=': return `>=${fmt(low)}`
108
+ case '>': return noMinor ? `>=${fmt(nextMajor(partial))}` : `>=${fmt(nextMinor(partial))}`
109
+ case '<': return `<${fmt(low)}`
110
+ case '<=': return noMinor ? `<${fmt(nextMajor(partial))}` : `<${fmt(nextMinor(partial))}`
111
+ default: return null
112
+ }
113
+ }
114
+
115
+ /** Hyphen ranges and x-ranges are normalized before tokenizing. */
116
+ function expandAlternative(alternative) {
68
117
  const text = alternative.trim()
69
- if (text === '' || text === '*' || text === 'x' || text === 'X') return [{ op: '*', version: null }]
70
- // Insert a space between a comparator and its version when written as ">=1.2.3"
71
- // (already no space) and split on whitespace.
118
+ if (text === '' || text === '*' || text === 'x' || text === 'X') return '*'
119
+ const hyphen = /^(.+?)\s+-\s+(.+)$/.exec(text)
120
+ if (hyphen) {
121
+ const left = parsePartial(hyphen[1])
122
+ const right = parsePartial(hyphen[2])
123
+ if (!left || !right) return null
124
+ const low = `>=${fmt(fullVersion(left))}`
125
+ if (right.minor === null) return `${low} <${fmt(nextMajor(right))}`
126
+ if (right.patch === null) return `${low} <${fmt(nextMinor(right))}`
127
+ return `${low} <=${fmt(fullVersion(right))}`
128
+ }
129
+ const parts = []
72
130
  for (const raw of text.split(/\s+/)) {
73
- let token = raw
74
- if (token === '*' || token === 'x' || token === 'X') {
75
- tokens.push({ op: '*', version: null })
76
- continue
77
- }
78
- const match = /^(>=|<=|>|<|=|\^|~)?\s*v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/.exec(token)
131
+ const expanded = expandToken(raw)
132
+ if (expanded === null) return null
133
+ parts.push(expanded)
134
+ }
135
+ return parts.join(' ')
136
+ }
137
+
138
+ function tokenizeAlternative(alternative) {
139
+ const expanded = expandAlternative(alternative)
140
+ if (expanded === null) return null
141
+ if (expanded === '*') return [{ op: '*', version: null }]
142
+ const tokens = []
143
+ for (const raw of expanded.split(/\s+/)) {
144
+ const match = /^(>=|<=|>|<|=|\^|~)?\s*v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/.exec(raw)
79
145
  if (!match) return null
80
146
  const op = match[1] ?? '='
81
147
  const version = parseVersion(match[2])
package/CHANGELOG.md ADDED
@@ -0,0 +1,32 @@
1
+ ## 1.0.2 — 2026-11-03
2
+
3
+ - L1–L3 run in a child process and are hard-killed on timeout; a blocked event loop is reported as `not-run`, never a pass.
4
+ - `dsh.capabilities` / `dsh.labels` warnings are advisory: still reported, no longer flip the verdict.
5
+ - A `g4` client-shape failure now fails DSC-01 instead of being dropped.
6
+ - `private: true` and workspace roots report NA instead of WARN/FAIL.
7
+ - A directory without `package.json` returns exit 3 (usage), matching `dsh-levels`.
8
+
9
+ ## 1.0.1 — 2026-11-03
10
+
11
+ - 打包:`files` 收窄,不再把 `40-checker/results/` 打进 npm 包(此前包含第三方插件结果、截图与本机路径)。
12
+ - 文档:`npx dsh-levels` 会装到第三方包,改为 `npx -p dsh-standards dsh-levels`;修正不存在的 `bin/` 路径;测试数 73→98。
13
+ - CLI:`dsh-standards --help` 首行显示自己的包名与版本。
14
+ - 检查器:`exports["."]` 指向缺失文件时不再回退到 `main`。
15
+
16
+ # Changelog
17
+
18
+ ## 2026-11-03 — Node 24.9 baseline
19
+ - Require Node >=24.9.0 to match DeepSeek Harness 0.2.2-alpha.3.
20
+
21
+ ## 2026-11-02 — P0–P2, Apache-2.0, and attestation migration
22
+
23
+ - Renamed certificate → attestation (`dsh-attestation/1`, `DSH-ATT-*`,
24
+ `publish/attestations/`); historical docs carry a migration banner.
25
+ - Added the gap ledger (43), role governance (44), and three-purpose kits (45).
26
+ - Added `scheme/`, `spec/clauses.json`, `spec/reference-suite.json`,
27
+ `spec/schemas/report.schema.json`, `evidence/` hash chain.
28
+ - Added G4 static check, clause-map, stale-check, surveillance, dashboard.
29
+ - Added developer/official/market kits and `publish/verify.mjs` / `verify.html`.
30
+ - CI: governance checks, 73 tests, attestation verify, shell syntax, cross-platform matrix.
31
+ - License: text CC BY 4.0 with a required Change Notice; code Apache-2.0 (D-013); marks separate.
32
+ - Cross-repo: portal `f882144`, guide `e75cd9f`, kit `9897213`, catalog `a272d06`, certification `2f27666`, cert-mcp `4f0cf72`.
package/NOTICE ADDED
@@ -0,0 +1,14 @@
1
+ DSH standards
2
+ Copyright 2026 PerryLink
3
+
4
+ Text/specifications/documentation: CC BY 4.0 (LICENSE-CC-BY).
5
+ Modifications must carry a prominent Change Notice (MODIFICATION-POLICY.md).
6
+ Code/scripts/schemas: Apache License 2.0 (LICENSE-APACHE).
7
+
8
+ Unless required by applicable law or agreed to in writing, software is
9
+ distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
10
+ See the applicable license for the specific language.
11
+
12
+ The words DSH-ENTRY, DSH-FLOW, DSH-BOOST and the level badges are not licensed
13
+ by either license. Their use is governed by governance/mark-policy.md.
14
+ No trademark registration is claimed.
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  | 层 | 规范/实践 | 当前状态 |
19
19
  |---|---|---|
20
- | 1 | **DSH-ENTRY 入门规范** | 18/18 `recognized`;base-only 10/18 verified(8 clean + 2 gate-reject);real web profile 18/18 verified(16 clean + 2 gate-reject);client 15/15 loaded;18/18 clean 未达成 |
20
+ | 1 | **DSH-ENTRY 入门规范** | 18/18 `recognized`;base-only 10/18 有 runtime 证据(8 clean + 2 reject);real web profile 16/18 无告警、2 个 host-gate reject(自评,无独立复核);client 15/15 loaded;18/18 clean 未达成 |
21
21
  | 2 | **DSH-FLOW 顺畅规范** | draft;fixture 上 J1/J2/J4/J6 **12 PASS**;J3/J7 fixture runtime;J5/J8 static preflight;10 个真实包 **78 PASS / 4 FAIL / 2 blocked / 66 not-run** |
22
22
  | 3 | **DSH-BOOST 加速实践** | draft;LEV-1–8 **8/8 measured**(loader / context / provider-capture / synthetic timer;非生产基线) |
23
23
 
@@ -57,21 +57,21 @@
57
57
  ```bash
58
58
  # Published umbrella (package `dsh-standards`)
59
59
  npx dsh-standards <plugin-dir> --scope entry --entry-claim static
60
- npx dsh-levels audit <dir> --format json
60
+ npx -p dsh-standards dsh-levels <dir> --format json
61
61
 
62
62
  # From a source checkout
63
63
  cd 40-checker
64
64
  node --test test/*.test.mjs
65
65
 
66
66
  # 只做结构识别(不声明运行)
67
- node bin/dsh-plugin-verify.mjs <plugin-dir> --scope entry --entry-claim static
67
+ node 40-checker/bin/dsh-plugin-verify.mjs <plugin-dir> --scope entry --entry-claim static
68
68
 
69
69
  # 声明运行(bundle 需要 host)
70
- node bin/dsh-plugin-verify.mjs <bundle-dir> --scope entry \
70
+ node 40-checker/bin/dsh-plugin-verify.mjs <bundle-dir> --scope entry \
71
71
  --host /path/to/@deepseek-ai/dsh-app-boot/lib/index.js
72
72
 
73
73
  # 三层自检(ENTRY 自动;FLOW/BOOST 证据文件)
74
- node bin/dsh-levels.mjs audit <dir> --format json
74
+ node bin/dsh-levels.mjs <dir> --format json
75
75
 
76
76
  # J1 安装/卸载旅程
77
77
  node scripts/journey-runtime.mjs --package <dir> --json
@@ -95,7 +95,7 @@ node lev7-bench.mjs 64 20
95
95
  - 18 包 base-only runtime:**18/18 有原始 JSON;10/18 G3 verified,8 partial,0 error**;host gate 后 **8 clean + 2 reject + 8 partial**;
96
96
  - client runtime:**15/15 `client-module-loaded`**(真实 Chromium);web-app **4/4 loaded**;
97
97
  - 不可用:**0 plugin code FAIL;2 host-gate reject(telemetry/verification)**;
98
- - 检查器:**73/73 tests**(含治理/DCO/评价记录/声明/验真/链/漂移测试);
98
+ - 检查器:**98/98 tests**(含治理/DCO/评价记录/声明/验真/链/漂移测试);
99
99
  - J1:**6 PASS + 1 WARN**;LEV-3:volatile **0/20** vs control **20/20** remount;LEV-6:稳定 prefix **100%** vs 易变 **0%**;LEV-7:**8.24×**(合成,非生产基线)。
100
100
 
101
101
  ## 给插件开发者:什么时候用哪个工具
@@ -15,4 +15,5 @@ if (argv.includes('--version') || argv.includes('-v')) {
15
15
  process.exit(0)
16
16
  }
17
17
 
18
+ process.env.DSH_CHECKER_BRAND = `dsh-standards ${pkg.version} (checker 0.1.0)`
18
19
  await import('../40-checker/bin/dsh-plugin-verify.mjs')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-standards",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "DSH plugin standards and conformance checks: ENTRY/FLOW checks plus BOOST guidance. Non-official; no certification or ranking.",
5
5
  "type": "module",
6
6
  "main": "40-checker/src/index.mjs",
@@ -13,22 +13,31 @@
13
13
  "dsh-levels": "./bin/dsh-levels.mjs"
14
14
  },
15
15
  "files": [
16
- "40-checker",
16
+ "bin",
17
+ "40-checker/bin",
18
+ "40-checker/src",
19
+ "40-checker/scripts",
20
+ "40-checker/samples",
21
+ "40-checker/fixtures",
22
+ "40-checker/test",
23
+ "40-checker/package.json",
24
+ "40-checker/README.md",
17
25
  "spec",
18
26
  "docs",
19
- "bin",
20
27
  "README.md",
28
+ "CHANGELOG.md",
21
29
  "LICENSE",
22
30
  "LICENSE-APACHE",
23
31
  "LICENSE-CC-BY",
24
- "NOTICE.md"
32
+ "NOTICE.md",
33
+ "NOTICE"
25
34
  ],
26
35
  "scripts": {
27
36
  "test": "node --test 40-checker/test/*.test.mjs",
28
37
  "test:fixtures": "node bin/dsh-standards.mjs 40-checker/fixtures/good --scope entry --entry-claim static --format text"
29
38
  },
30
39
  "engines": {
31
- "node": ">=20"
40
+ "node": ">=24.9.0"
32
41
  },
33
42
  "keywords": [
34
43
  "dsh",
@@ -1,70 +0,0 @@
1
- name: plugin-verify
2
- on:
3
- push:
4
- pull_request:
5
- workflow_dispatch:
6
- jobs:
7
- l0:
8
- runs-on: ubuntu-latest
9
- steps:
10
- - uses: actions/checkout@v4
11
- - uses: actions/setup-node@v4
12
- with:
13
- node-version: 22
14
- - name: unit tests
15
- run: node --test
16
- - name: good fixture (static-only M1; expect 0)
17
- run: |
18
- node bin/dsh-plugin-verify.mjs fixtures/good \
19
- --static-only \
20
- --market-index fixtures/market-index.json \
21
- --plugin-name @dsh-fixtures/good-plugin \
22
- --format json --out /tmp/good.json
23
- - name: bad fixture (expect 1; 0 would be a false green)
24
- run: |
25
- set +e
26
- node bin/dsh-plugin-verify.mjs fixtures/bad --format json --out /tmp/bad.json
27
- code=$?
28
- test "$code" -eq 1
29
- - name: SARIF smoke
30
- run: |
31
- node bin/dsh-plugin-verify.mjs fixtures/good \
32
- --static-only \
33
- --market-index fixtures/market-index.json \
34
- --plugin-name @dsh-fixtures/good-plugin \
35
- --format sarif --out /tmp/good.sarif
36
- - uses: actions/upload-artifact@v4
37
- with:
38
- name: reports
39
- path: |
40
- /tmp/good.json
41
- /tmp/bad.json
42
- /tmp/good.sarif
43
-
44
- l1-manual:
45
- if: github.event_name == 'workflow_dispatch'
46
- runs-on: ubuntu-latest
47
- steps:
48
- - uses: actions/checkout@v4
49
- - uses: actions/setup-node@v4
50
- with:
51
- node-version: 22
52
- - name: build host farm (requires a DSH checkout at DSH_HOST)
53
- env:
54
- DSH_HOST: ${{ vars.DSH_HOST }}
55
- run: |
56
- test -n "$DSH_HOST"
57
- node scripts/host-farm.mjs --plugin fixtures/bundle --farm /tmp/farm --link --quiet
58
- - name: L1 on bundle fixture
59
- env:
60
- DSH_HOST: ${{ vars.DSH_HOST }}
61
- run: |
62
- node bin/dsh-plugin-verify.mjs /tmp/farm/plugins/bundle \
63
- --treat-as-plugin \
64
- --runtime "$DSH_HOST/vendor/cordis/lib/index.js" \
65
- --runtime-version 0.2.2-alpha.2 \
66
- --format json --out /tmp/l1.json
67
- - uses: actions/upload-artifact@v4
68
- with:
69
- name: l1-report
70
- path: /tmp/l1.json