dsh-standards 0.0.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/40-checker/.github/workflows/plugin-verify.yml +70 -0
  2. package/40-checker/README.md +251 -0
  3. package/40-checker/bin/dsh-levels.mjs +15 -0
  4. package/40-checker/bin/dsh-plugin-verify.mjs +8 -0
  5. package/40-checker/fixtures/bad/index.mjs +12 -0
  6. package/40-checker/fixtures/bad/package.json +15 -0
  7. package/40-checker/fixtures/bad-manifest/index.js +1 -0
  8. package/40-checker/fixtures/bad-manifest/package.json +5 -0
  9. package/40-checker/fixtures/bundle/cordis.patch.yml +3 -0
  10. package/40-checker/fixtures/bundle/package.json +15 -0
  11. package/40-checker/fixtures/bundle/server.mjs +7 -0
  12. package/40-checker/fixtures/bundle-v0/cordis.patch.yml +3 -0
  13. package/40-checker/fixtures/bundle-v0/package.json +21 -0
  14. package/40-checker/fixtures/bundle-v0/server.mjs +7 -0
  15. package/40-checker/fixtures/client-missing/client.js +1 -0
  16. package/40-checker/fixtures/client-missing/index.js +1 -0
  17. package/40-checker/fixtures/client-missing/package.json +6 -0
  18. package/40-checker/fixtures/flow-config/index.js +9 -0
  19. package/40-checker/fixtures/flow-config/package.json +10 -0
  20. package/40-checker/fixtures/fs-write/index.mjs +7 -0
  21. package/40-checker/fixtures/fs-write/package.json +10 -0
  22. package/40-checker/fixtures/good/index.mjs +10 -0
  23. package/40-checker/fixtures/good/package.json +19 -0
  24. package/40-checker/fixtures/hang/index.mjs +5 -0
  25. package/40-checker/fixtures/hang/package.json +10 -0
  26. package/40-checker/fixtures/known-answer/expected.json +18 -0
  27. package/40-checker/fixtures/market-index-real.json +18 -0
  28. package/40-checker/fixtures/market-index.json +18 -0
  29. package/40-checker/fixtures/negative/bad-entry/package.json +1 -0
  30. package/40-checker/fixtures/negative/no-entry/package.json +1 -0
  31. package/40-checker/fixtures/negative/no-patch/package.json +1 -0
  32. package/40-checker/fixtures/negative/root-missing/cordis.patch.yml +2 -0
  33. package/40-checker/fixtures/negative/root-missing/package.json +1 -0
  34. package/40-checker/fixtures/negative/workspace/package.json +1 -0
  35. package/40-checker/package.json +22 -0
  36. package/40-checker/results/boost/REPORT.md +304 -0
  37. package/40-checker/results/boost/lev12458.json +1747 -0
  38. package/40-checker/results/client/README.md +16 -0
  39. package/40-checker/results/entry/18/DDDMUC__dsh-free-search.json +381 -0
  40. package/40-checker/results/entry/18/DDDMUC__dsh-free-search.runtime.json +34 -0
  41. package/40-checker/results/entry/18/Ebony-Vinyl__dsh-our-free-model.json +361 -0
  42. package/40-checker/results/entry/18/Ebony-Vinyl__dsh-our-free-model.runtime.json +34 -0
  43. package/40-checker/results/entry/18/README.md +24 -0
  44. package/40-checker/results/entry/18/RUNTIME.md +18 -0
  45. package/40-checker/results/entry/18/SeaOf0__dsh-redteam-model.json +391 -0
  46. package/40-checker/results/entry/18/YuJunZhiXue__dsh-purge.json +432 -0
  47. package/40-checker/results/entry/18/ci-diet.json +365 -0
  48. package/40-checker/results/entry/18/ci-diet.runtime-attempt.json +38 -0
  49. package/40-checker/results/entry/18/daily-log.json +357 -0
  50. package/40-checker/results/entry/18/daily-log.runtime.json +519 -0
  51. package/40-checker/results/entry/18/fullbase/ATTRIBUTION.md +29 -0
  52. package/40-checker/results/entry/18/fullbase/DDDMUC__dsh-free-search.json +99 -0
  53. package/40-checker/results/entry/18/fullbase/Ebony-Vinyl__dsh-our-free-model.json +95 -0
  54. package/40-checker/results/entry/18/fullbase/REPORT.md +261 -0
  55. package/40-checker/results/entry/18/fullbase/SeaOf0__dsh-redteam-model.json +144 -0
  56. package/40-checker/results/entry/18/fullbase/YuJunZhiXue__dsh-purge.json +106 -0
  57. package/40-checker/results/entry/18/fullbase/ci-diet.json +99 -0
  58. package/40-checker/results/entry/18/fullbase/daily-log.json +94 -0
  59. package/40-checker/results/entry/18/fullbase/howmp__dsh-pentest.json +104 -0
  60. package/40-checker/results/entry/18/fullbase/kingcharleslzy-ai__dsh-purge.json +143 -0
  61. package/40-checker/results/entry/18/fullbase/liguobao__ds-harness-remote.json +134 -0
  62. package/40-checker/results/entry/18/fullbase/mmparko__dsh-purge.json +138 -0
  63. package/40-checker/results/entry/18/fullbase/project-memory.json +108 -0
  64. package/40-checker/results/entry/18/fullbase/qiushi.json +94 -0
  65. package/40-checker/results/entry/18/fullbase/shaobeichen__dsh-pocket.json +94 -0
  66. package/40-checker/results/entry/18/fullbase/status-rotator.json +94 -0
  67. package/40-checker/results/entry/18/fullbase/summary.json +297 -0
  68. package/40-checker/results/entry/18/fullbase/telemetry.json +94 -0
  69. package/40-checker/results/entry/18/fullbase/ui-auth.json +94 -0
  70. package/40-checker/results/entry/18/fullbase/verification.json +94 -0
  71. package/40-checker/results/entry/18/fullbase/ysr666__dsh-vision-router.json +106 -0
  72. package/40-checker/results/entry/18/howmp__dsh-pentest.json +361 -0
  73. package/40-checker/results/entry/18/kingcharleslzy-ai__dsh-purge.json +411 -0
  74. package/40-checker/results/entry/18/liguobao__ds-harness-remote.json +379 -0
  75. package/40-checker/results/entry/18/mmparko__dsh-purge.json +441 -0
  76. package/40-checker/results/entry/18/project-memory.json +361 -0
  77. package/40-checker/results/entry/18/project-memory.runtime.json +519 -0
  78. package/40-checker/results/entry/18/qiushi.json +353 -0
  79. package/40-checker/results/entry/18/qiushi.runtime.json +519 -0
  80. package/40-checker/results/entry/18/realweb/REPORT.md +73 -0
  81. package/40-checker/results/entry/18/realweb/SeaOf0__dsh-redteam-model.json +104 -0
  82. package/40-checker/results/entry/18/realweb/YuJunZhiXue__dsh-purge.json +64 -0
  83. package/40-checker/results/entry/18/realweb/howmp__dsh-pentest.json +65 -0
  84. package/40-checker/results/entry/18/realweb/kingcharleslzy-ai__dsh-purge.json +75 -0
  85. package/40-checker/results/entry/18/realweb/mmparko__dsh-purge.json +70 -0
  86. package/40-checker/results/entry/18/realweb/shaobeichen__dsh-pocket.json +56 -0
  87. package/40-checker/results/entry/18/realweb/summary.json +196 -0
  88. package/40-checker/results/entry/18/realweb/ui-auth.json +56 -0
  89. package/40-checker/results/entry/18/realweb/ysr666__dsh-vision-router.json +61 -0
  90. package/40-checker/results/entry/18/richbase/REPORT.md +70 -0
  91. package/40-checker/results/entry/18/richbase/SeaOf0__dsh-redteam-model.json +61 -0
  92. package/40-checker/results/entry/18/richbase/SeaOf0__dsh-redteam-model.log +38 -0
  93. package/40-checker/results/entry/18/shaobeichen__dsh-pocket.json +363 -0
  94. package/40-checker/results/entry/18/status-rotator.json +362 -0
  95. package/40-checker/results/entry/18/status-rotator.runtime.json +519 -0
  96. package/40-checker/results/entry/18/summary.json +266 -0
  97. package/40-checker/results/entry/18/targetonly/DDDMUC__dsh-free-search.json +34 -0
  98. package/40-checker/results/entry/18/targetonly/Ebony-Vinyl__dsh-our-free-model.json +34 -0
  99. package/40-checker/results/entry/18/targetonly/SeaOf0__dsh-redteam-model.json +84 -0
  100. package/40-checker/results/entry/18/targetonly/YuJunZhiXue__dsh-purge.json +52 -0
  101. package/40-checker/results/entry/18/targetonly/ci-diet.json +34 -0
  102. package/40-checker/results/entry/18/targetonly/daily-log.json +34 -0
  103. package/40-checker/results/entry/18/targetonly/howmp__dsh-pentest.json +46 -0
  104. package/40-checker/results/entry/18/targetonly/kingcharleslzy-ai__dsh-purge.json +61 -0
  105. package/40-checker/results/entry/18/targetonly/liguobao__ds-harness-remote.json +39 -0
  106. package/40-checker/results/entry/18/targetonly/mmparko__dsh-purge.json +57 -0
  107. package/40-checker/results/entry/18/targetonly/project-memory.json +34 -0
  108. package/40-checker/results/entry/18/targetonly/qiushi.json +34 -0
  109. package/40-checker/results/entry/18/targetonly/shaobeichen__dsh-pocket.json +34 -0
  110. package/40-checker/results/entry/18/targetonly/status-rotator.json +34 -0
  111. package/40-checker/results/entry/18/targetonly/summary.json +133 -0
  112. package/40-checker/results/entry/18/targetonly/telemetry.json +34 -0
  113. package/40-checker/results/entry/18/targetonly/ui-auth.json +34 -0
  114. package/40-checker/results/entry/18/targetonly/verification.json +34 -0
  115. package/40-checker/results/entry/18/targetonly/ysr666__dsh-vision-router.json +43 -0
  116. package/40-checker/results/entry/18/telemetry.json +349 -0
  117. package/40-checker/results/entry/18/ui-auth.json +369 -0
  118. package/40-checker/results/entry/18/verification.json +358 -0
  119. package/40-checker/results/entry/18/ysr666__dsh-vision-router.json +409 -0
  120. package/40-checker/results/fixtures/bad.json +347 -0
  121. package/40-checker/results/fixtures/bundle.json +378 -0
  122. package/40-checker/results/fixtures/good-listing.json +382 -0
  123. package/40-checker/results/fixtures/good-static.json +322 -0
  124. package/40-checker/results/fixtures/good.json +375 -0
  125. package/40-checker/results/fixtures/good.sarif +274 -0
  126. package/40-checker/results/flow/README.md +19 -0
  127. package/40-checker/results/flow/j3-j7-fixture.json +51 -0
  128. package/40-checker/results/flow/j5-j8-client-missing.json +45 -0
  129. package/40-checker/results/flow/j5-j8-good.json +45 -0
  130. package/40-checker/results/flow/journey-fixture-bundle.json +90 -0
  131. package/40-checker/results/flow/journey-fixture-j1-j2-j4-j6.json +107 -0
  132. package/40-checker/results/flow/real/DDDMUC__dsh-free-search.json +297 -0
  133. package/40-checker/results/flow/real/REPORT.md +335 -0
  134. package/40-checker/results/flow/real/YuJunZhiXue__dsh-purge.json +317 -0
  135. package/40-checker/results/flow/real/ci-diet.json +351 -0
  136. package/40-checker/results/flow/real/daily-log.json +286 -0
  137. package/40-checker/results/flow/real/index.json +325 -0
  138. package/40-checker/results/flow/real/project-memory.json +290 -0
  139. package/40-checker/results/flow/real/qiushi.json +277 -0
  140. package/40-checker/results/flow/real/status-rotator.json +275 -0
  141. package/40-checker/results/flow/real/telemetry.json +178 -0
  142. package/40-checker/results/flow/real/ui-auth.json +288 -0
  143. package/40-checker/results/flow/real/verification.json +265 -0
  144. package/40-checker/results/governance/co-maintainer-packet.md +85 -0
  145. package/40-checker/results/l1/ci-diet.json +406 -0
  146. package/40-checker/results/l1/npm-dsh-telemetry-redactor-0.1.0.json +390 -0
  147. package/40-checker/results/l1/npm-dsh-verification-receipt-0.1.0.json +406 -0
  148. package/40-checker/results/l1/npm-qiushi-dsh-evidence-audit-0.1.0.json +394 -0
  149. package/40-checker/results/l1/npm-zzerx-dsh-plugin-daily-log-0.4.3.json +405 -0
  150. package/40-checker/results/l1/project-memory.json +402 -0
  151. package/40-checker/results/l1/source-DDDMUC__dsh-free-search.json +422 -0
  152. package/40-checker/results/l1/source-Ebony-Vinyl__dsh-our-free-model.json +421 -0
  153. package/40-checker/results/l1/source-SeaOf0__dsh-redteam-model.json +432 -0
  154. package/40-checker/results/l1/source-YuJunZhiXue__dsh-purge.json +473 -0
  155. package/40-checker/results/l1/source-howmp__dsh-pentest.json +402 -0
  156. package/40-checker/results/l1/source-kingcharleslzy-ai__dsh-purge.json +452 -0
  157. package/40-checker/results/l1/source-liguobao__ds-harness-remote.json +420 -0
  158. package/40-checker/results/l1/source-mmparko__dsh-purge.json +482 -0
  159. package/40-checker/results/l1/source-shaobeichen__dsh-pocket.json +404 -0
  160. package/40-checker/results/l1/source-ysr666__dsh-vision-router.json +384 -0
  161. package/40-checker/results/l1/status-rotator.json +403 -0
  162. package/40-checker/results/l1/ui-auth.json +429 -0
  163. package/40-checker/results/l1/ysr666__dsh-vision-router.published.json +384 -0
  164. package/40-checker/results/lev3/REPORT.md +342 -0
  165. package/40-checker/results/lev3/lev3.json +4835 -0
  166. package/40-checker/results/lev6/REPORT.md +460 -0
  167. package/40-checker/results/lev6/capture-sample.json +241 -0
  168. package/40-checker/results/lev6/capture.jsonl +4 -0
  169. package/40-checker/results/lev6/lev6.json +245 -0
  170. package/40-checker/results/lev6/replication-r1.json +245 -0
  171. package/40-checker/results/levels/README.md +16 -0
  172. package/40-checker/results/levels/dsh-plugin-doctor.json +141 -0
  173. package/40-checker/results/levels/dsh-plugin-guide.json +136 -0
  174. package/40-checker/results/m1/dsh-ci-diet-0.5.2.json +352 -0
  175. package/40-checker/results/m1/dsh-status-rotator-0.38.0.json +349 -0
  176. package/40-checker/results/m1/dsh-telemetry-redactor-0.1.0.json +336 -0
  177. package/40-checker/results/m1/dsh-ui-auth-0.7.1.json +356 -0
  178. package/40-checker/results/m1/dsh-verification-receipt-0.1.0.json +344 -0
  179. package/40-checker/results/m1/index-level.json +13 -0
  180. package/40-checker/results/m1/levels.json +72100 -0
  181. package/40-checker/results/m1/qiushi-dsh-evidence-audit-0.1.0.json +339 -0
  182. package/40-checker/results/m1/yolk_vat-y-dsh-project-memory-0.6.7.json +348 -0
  183. package/40-checker/results/m1/zzerx-dsh-plugin-daily-log-0.4.3.json +344 -0
  184. package/40-checker/results/m2/dsh-ci-diet.json +421 -0
  185. package/40-checker/results/m2/dsh-ci-diet.unshare-landlock.json +424 -0
  186. package/40-checker/results/m2/dsh-ci-diet.unshare.json +423 -0
  187. package/40-checker/results/m2/fixture-bundle.image.json +404 -0
  188. package/40-checker/results/m2/fixture-bundle.json +392 -0
  189. package/40-checker/results/m2/fixture-bundle.landlock.json +396 -0
  190. package/40-checker/results/m2/fixture-bundle.unshare.json +395 -0
  191. package/40-checker/results/m2/fs-write.json +338 -0
  192. package/40-checker/results/m2/hang.json +31 -0
  193. package/40-checker/results/m2/hang.unshare-landlock.json +34 -0
  194. package/40-checker/results/m2/hang.unshare.json +33 -0
  195. package/40-checker/results/m2/project-memory.json +417 -0
  196. package/40-checker/results/m2/status-rotator.json +418 -0
  197. package/40-checker/results/m2/ui-auth.json +444 -0
  198. package/40-checker/results/negative/bad-entry.json +345 -0
  199. package/40-checker/results/negative/no-entry.json +345 -0
  200. package/40-checker/results/negative/no-patch.json +344 -0
  201. package/40-checker/results/negative/root-missing.json +344 -0
  202. package/40-checker/results/negative/root-missing.runtime.json +30 -0
  203. package/40-checker/results/negative/summary.json +51 -0
  204. package/40-checker/results/negative/workspace.json +344 -0
  205. package/40-checker/results/patched/Ebony-Vinyl__dsh-our-free-model.json +334 -0
  206. package/40-checker/results/patched/Ebony-Vinyl__dsh-our-free-model.overlay.json +335 -0
  207. package/40-checker/results/patched/SeaOf0__dsh-redteam-model.json +315 -0
  208. package/40-checker/results/patched/SeaOf0__dsh-redteam-model.overlay.json +316 -0
  209. package/40-checker/results/patched/mmparko__dsh-purge.json +357 -0
  210. package/40-checker/results/patched/mmparko__dsh-purge.overlay.json +358 -0
  211. package/40-checker/results/patched/shaobeichen__dsh-pocket.json +315 -0
  212. package/40-checker/results/patched/shaobeichen__dsh-pocket.overlay.json +316 -0
  213. package/40-checker/results/real/DDDMUC__dsh-free-search.json +344 -0
  214. package/40-checker/results/real/Ebony-Vinyl__dsh-our-free-model.json +343 -0
  215. package/40-checker/results/real/SeaOf0__dsh-redteam-model.json +354 -0
  216. package/40-checker/results/real/YuJunZhiXue__dsh-purge.json +395 -0
  217. package/40-checker/results/real/howmp__dsh-pentest.json +324 -0
  218. package/40-checker/results/real/kingcharleslzy-ai__dsh-purge.json +374 -0
  219. package/40-checker/results/real/liguobao__ds-harness-remote.json +342 -0
  220. package/40-checker/results/real/mmparko__dsh-purge.json +404 -0
  221. package/40-checker/results/real/shaobeichen__dsh-pocket.json +326 -0
  222. package/40-checker/results/real/ysr666__dsh-vision-router.json +372 -0
  223. package/40-checker/results/real/ysr666__dsh-vision-router.listing.json +378 -0
  224. package/40-checker/results/round-robin/compare.json +52 -0
  225. package/40-checker/results/round-robin/runner-a.json +9 -0
  226. package/40-checker/results/round-robin/runner-b.json +9 -0
  227. package/40-checker/results/sample20/123dbl__dsh-side-session.json +344 -0
  228. package/40-checker/results/sample20/173787247__dsh-wsl-dns.json +360 -0
  229. package/40-checker/results/sample20/863683348__dsh-insight.json +375 -0
  230. package/40-checker/results/sample20/Ansellwan__DSH-Custom-Wallpaper.json +344 -0
  231. package/40-checker/results/sample20/Jamailar__beav-deepseek-harness.json +341 -0
  232. package/40-checker/results/sample20/ManoloRemiddi__DSH-Metafolder-Plugin.json +344 -0
  233. package/40-checker/results/sample20/NEAZ71eve__dsh-tool-github.json +384 -0
  234. package/40-checker/results/sample20/README.md +3 -0
  235. package/40-checker/results/sample20/RINGOLINK__dsh-desktop-shell.json +352 -0
  236. package/40-checker/results/sample20/Zxznb666__dsh-qoder-cn-subagent.json +349 -0
  237. package/40-checker/results/sample20/agent-mobile__dsh-mobile-gateway.json +353 -0
  238. package/40-checker/results/sample20/fangqiing__dsh-knowledge-lite.json +359 -0
  239. package/40-checker/results/sample20/fzy0517__deepseek-harness-session-cleaner.json +344 -0
  240. package/40-checker/results/sample20/gjy1992__dsh-diagram.json +350 -0
  241. package/40-checker/results/sample20/mrme000m__dsh-prime-orchestrator.json +414 -0
  242. package/40-checker/results/sample20/redstonedust__dsh-solidworks-copilot.json +362 -0
  243. package/40-checker/results/sample20/summary.json +234 -0
  244. package/40-checker/results/sample20/w2112515__dsh-remote-host.json +344 -0
  245. package/40-checker/results/sample20/wkfedor__deepseek-harness-voice-input.json +350 -0
  246. package/40-checker/results/sample20/xfgil__dsh-hot-reloader.json +344 -0
  247. package/40-checker/results/sample20/yizhiyizhi0128__dsh-peak-scheduler.json +360 -0
  248. package/40-checker/results/sample20-ci/123dbl__dsh-side-session.json +344 -0
  249. package/40-checker/results/sample20-ci/173787247__dsh-wsl-dns.json +360 -0
  250. package/40-checker/results/sample20-ci/863683348__dsh-insight.json +375 -0
  251. package/40-checker/results/sample20-ci/Ansellwan__DSH-Custom-Wallpaper.json +344 -0
  252. package/40-checker/results/sample20-ci/Jamailar__beav-deepseek-harness.json +367 -0
  253. package/40-checker/results/sample20-ci/ManoloRemiddi__DSH-Metafolder-Plugin.json +344 -0
  254. package/40-checker/results/sample20-ci/NEAZ71eve__dsh-tool-github.json +392 -0
  255. package/40-checker/results/sample20-ci/README.md +5 -0
  256. package/40-checker/results/sample20-ci/RINGOLINK__dsh-desktop-shell.json +361 -0
  257. package/40-checker/results/sample20-ci/Zxznb666__dsh-qoder-cn-subagent.json +349 -0
  258. package/40-checker/results/sample20-ci/agent-mobile__dsh-mobile-gateway.json +384 -0
  259. package/40-checker/results/sample20-ci/fangqiing__dsh-knowledge-lite.json +360 -0
  260. package/40-checker/results/sample20-ci/fzy0517__deepseek-harness-session-cleaner.json +354 -0
  261. package/40-checker/results/sample20-ci/gjy1992__dsh-diagram.json +381 -0
  262. package/40-checker/results/sample20-ci/mrme000m__dsh-prime-orchestrator.json +452 -0
  263. package/40-checker/results/sample20-ci/redstonedust__dsh-solidworks-copilot.json +371 -0
  264. package/40-checker/results/sample20-ci/summary.json +195 -0
  265. package/40-checker/results/sample20-ci/w2112515__dsh-remote-host.json +399 -0
  266. package/40-checker/results/sample20-ci/wkfedor__deepseek-harness-voice-input.json +358 -0
  267. package/40-checker/results/sample20-ci/xfgil__dsh-hot-reloader.json +344 -0
  268. package/40-checker/results/sample20-ci/yizhiyizhi0128__dsh-peak-scheduler.json +370 -0
  269. package/40-checker/results/sample20-ci/zed1902209846-dotcom__DPwhale-plugin.json +231 -0
  270. package/40-checker/results/sample60/123dbl__dsh-side-session.json +344 -0
  271. package/40-checker/results/sample60/173787247__dsh-wsl-dns.json +360 -0
  272. package/40-checker/results/sample60/863683348__dsh-insight.json +375 -0
  273. package/40-checker/results/sample60/Anionex__dsh-turn-rewind.json +349 -0
  274. package/40-checker/results/sample60/Ansellwan__DSH-Custom-Wallpaper.json +344 -0
  275. package/40-checker/results/sample60/Ebony-Vinyl__EAC-Pack.json +352 -0
  276. package/40-checker/results/sample60/EricWang1358__dsh-web-studyhub.json +376 -0
  277. package/40-checker/results/sample60/GanyuanRan__Aegis.json +349 -0
  278. package/40-checker/results/sample60/HiSeax__dsh-codely.json +358 -0
  279. package/40-checker/results/sample60/Jamailar__beav-deepseek-harness.json +341 -0
  280. package/40-checker/results/sample60/ManoloRemiddi__DSH-Metafolder-Plugin.json +344 -0
  281. package/40-checker/results/sample60/MichengAI__dsh-archive-manager.json +357 -0
  282. package/40-checker/results/sample60/MichengAI__dsh-im-connect.json +347 -0
  283. package/40-checker/results/sample60/MindLab-Research__dsh-generative-ui.json +350 -0
  284. package/40-checker/results/sample60/NEAZ71eve__dsh-tool-github.json +384 -0
  285. package/40-checker/results/sample60/README.md +7 -0
  286. package/40-checker/results/sample60/RINGOLINK__dsh-desktop-shell.json +352 -0
  287. package/40-checker/results/sample60/SeanTolstoyevski__dsh-code-review.json +352 -0
  288. package/40-checker/results/sample60/Tasihi89__dsh-talk-map.json +344 -0
  289. package/40-checker/results/sample60/Tyan66666__billion-context-dsh.json +469 -0
  290. package/40-checker/results/sample60/V1ki__dsh-plugin-subscriptions.json +350 -0
  291. package/40-checker/results/sample60/Yu-tao-Li__dsh-computer-use-win.json +341 -0
  292. package/40-checker/results/sample60/ZSeven-W__dsh-ios.json +344 -0
  293. package/40-checker/results/sample60/Zxznb666__dsh-qoder-cn-subagent.json +349 -0
  294. package/40-checker/results/sample60/agent-mobile__dsh-mobile-gateway.json +353 -0
  295. package/40-checker/results/sample60/c3cvld7aag__fujiang-dsh.json +361 -0
  296. package/40-checker/results/sample60/cxzrdxy__dsh-file-explorer.json +389 -0
  297. package/40-checker/results/sample60/dhicoc__dsh-reverse-skill.json +341 -0
  298. package/40-checker/results/sample60/fangqiing__dsh-knowledge-lite.json +359 -0
  299. package/40-checker/results/sample60/fwerkor__local-shell-mcp.json +369 -0
  300. package/40-checker/results/sample60/fzy0517__deepseek-harness-session-cleaner.json +344 -0
  301. package/40-checker/results/sample60/gjy1992__dsh-diagram.json +350 -0
  302. package/40-checker/results/sample60/howmp__dsh-pentest.json +341 -0
  303. package/40-checker/results/sample60/linhay__harmony-next.skills.json +344 -0
  304. package/40-checker/results/sample60/liustack__modsearch.json +371 -0
  305. package/40-checker/results/sample60/mmparko__dsh-purge.json +372 -0
  306. package/40-checker/results/sample60/mrme000m__dsh-prime-orchestrator.json +414 -0
  307. package/40-checker/results/sample60/omdsh-dev__dsh_workflow.json +439 -0
  308. package/40-checker/results/sample60/redstonedust__dsh-solidworks-copilot.json +362 -0
  309. package/40-checker/results/sample60/seriousz158__dsh-memory.json +350 -0
  310. package/40-checker/results/sample60/shanliuling__dsh-image-gen.json +353 -0
  311. package/40-checker/results/sample60/shanliuling__skills-link.json +344 -0
  312. package/40-checker/results/sample60/shengsheng90__DSH-taskboard.json +341 -0
  313. package/40-checker/results/sample60/sjh9714__dsh-win32.json +374 -0
  314. package/40-checker/results/sample60/skymecode__deepseek-harness-for-vscode.json +351 -0
  315. package/40-checker/results/sample60/sopaco__terrain.json +352 -0
  316. package/40-checker/results/sample60/summary.json +658 -0
  317. package/40-checker/results/sample60/tinqiao-oss__engramory.json +352 -0
  318. package/40-checker/results/sample60/tong-io__tongflow.json +359 -0
  319. package/40-checker/results/sample60/vibeinging__dsh-desktop.json +382 -0
  320. package/40-checker/results/sample60/w2112515__dsh-remote-host.json +344 -0
  321. package/40-checker/results/sample60/wkfedor__deepseek-harness-voice-input.json +350 -0
  322. package/40-checker/results/sample60/wz20__dsh-dafeiyu-dot.json +349 -0
  323. package/40-checker/results/sample60/xfgil__dsh-hot-reloader.json +344 -0
  324. package/40-checker/results/sample60/yi-yezhiqiu__dsh-prompt-market.json +360 -0
  325. package/40-checker/results/sample60/yizhiyizhi0128__dsh-peak-scheduler.json +360 -0
  326. package/40-checker/results/sample60/yjh051108__dsh-routing-suite.json +366 -0
  327. package/40-checker/results/sample60-ci/123dbl__dsh-side-session.json +344 -0
  328. package/40-checker/results/sample60-ci/173787247__dsh-wsl-dns.json +360 -0
  329. package/40-checker/results/sample60-ci/863683348__dsh-insight.json +375 -0
  330. package/40-checker/results/sample60-ci/Anionex__dsh-turn-rewind.json +379 -0
  331. package/40-checker/results/sample60-ci/Ansellwan__DSH-Custom-Wallpaper.json +344 -0
  332. package/40-checker/results/sample60-ci/Ebony-Vinyl__EAC-Pack.json +362 -0
  333. package/40-checker/results/sample60-ci/EricWang1358__dsh-web-studyhub.json +378 -0
  334. package/40-checker/results/sample60-ci/GanyuanRan__Aegis.json +349 -0
  335. package/40-checker/results/sample60-ci/HiSeax__dsh-codely.json +368 -0
  336. package/40-checker/results/sample60-ci/Jamailar__beav-deepseek-harness.json +367 -0
  337. package/40-checker/results/sample60-ci/LiarMTTT__TavernWeave.json +231 -0
  338. package/40-checker/results/sample60-ci/ManoloRemiddi__DSH-Metafolder-Plugin.json +344 -0
  339. package/40-checker/results/sample60-ci/MichengAI__dsh-archive-manager.json +395 -0
  340. package/40-checker/results/sample60-ci/MichengAI__dsh-im-connect.json +404 -0
  341. package/40-checker/results/sample60-ci/MindLab-Research__dsh-generative-ui.json +410 -0
  342. package/40-checker/results/sample60-ci/NEAZ71eve__dsh-tool-github.json +392 -0
  343. package/40-checker/results/sample60-ci/README.md +7 -0
  344. package/40-checker/results/sample60-ci/RINGOLINK__dsh-desktop-shell.json +361 -0
  345. package/40-checker/results/sample60-ci/Ruler4396__dsh-launcher.json +231 -0
  346. package/40-checker/results/sample60-ci/SeanTolstoyevski__dsh-code-review.json +363 -0
  347. package/40-checker/results/sample60-ci/Tasihi89__dsh-talk-map.json +372 -0
  348. package/40-checker/results/sample60-ci/Tyan66666__billion-context-dsh.json +469 -0
  349. package/40-checker/results/sample60-ci/V1ki__dsh-plugin-subscriptions.json +368 -0
  350. package/40-checker/results/sample60-ci/Yu-tao-Li__dsh-computer-use-win.json +349 -0
  351. package/40-checker/results/sample60-ci/ZSeven-W__dsh-ios.json +344 -0
  352. package/40-checker/results/sample60-ci/Zxznb666__dsh-qoder-cn-subagent.json +349 -0
  353. package/40-checker/results/sample60-ci/agent-mobile__dsh-mobile-gateway.json +384 -0
  354. package/40-checker/results/sample60-ci/c3cvld7aag__fujiang-dsh.json +361 -0
  355. package/40-checker/results/sample60-ci/cxzrdxy__dsh-file-explorer.json +399 -0
  356. package/40-checker/results/sample60-ci/dhicoc__dsh-reverse-skill.json +352 -0
  357. package/40-checker/results/sample60-ci/fangqiing__dsh-knowledge-lite.json +360 -0
  358. package/40-checker/results/sample60-ci/fwerkor__local-shell-mcp.json +387 -0
  359. package/40-checker/results/sample60-ci/fzy0517__deepseek-harness-session-cleaner.json +354 -0
  360. package/40-checker/results/sample60-ci/gjy1992__dsh-diagram.json +381 -0
  361. package/40-checker/results/sample60-ci/howmp__dsh-pentest.json +361 -0
  362. package/40-checker/results/sample60-ci/linhay__harmony-next.skills.json +344 -0
  363. package/40-checker/results/sample60-ci/liustack__modsearch.json +382 -0
  364. package/40-checker/results/sample60-ci/mmparko__dsh-purge.json +441 -0
  365. package/40-checker/results/sample60-ci/mrme000m__dsh-prime-orchestrator.json +452 -0
  366. package/40-checker/results/sample60-ci/omdsh-dev__dsh_workflow.json +439 -0
  367. package/40-checker/results/sample60-ci/plastic-labs__honcho.json +231 -0
  368. package/40-checker/results/sample60-ci/redstonedust__dsh-solidworks-copilot.json +371 -0
  369. package/40-checker/results/sample60-ci/seriousz158__dsh-memory.json +351 -0
  370. package/40-checker/results/sample60-ci/shanliuling__dsh-image-gen.json +382 -0
  371. package/40-checker/results/sample60-ci/shanliuling__skills-link.json +344 -0
  372. package/40-checker/results/sample60-ci/shengsheng90__DSH-taskboard.json +370 -0
  373. package/40-checker/results/sample60-ci/sjh9714__dsh-win32.json +410 -0
  374. package/40-checker/results/sample60-ci/skymecode__deepseek-harness-for-vscode.json +391 -0
  375. package/40-checker/results/sample60-ci/sopaco__deepwiki-rs.json +231 -0
  376. package/40-checker/results/sample60-ci/sopaco__terrain.json +352 -0
  377. package/40-checker/results/sample60-ci/summary.json +555 -0
  378. package/40-checker/results/sample60-ci/tinqiao-oss__engramory.json +362 -0
  379. package/40-checker/results/sample60-ci/tong-io__tongflow.json +393 -0
  380. package/40-checker/results/sample60-ci/vibeinging__dsh-desktop.json +555 -0
  381. package/40-checker/results/sample60-ci/w2112515__dsh-remote-host.json +399 -0
  382. package/40-checker/results/sample60-ci/wkfedor__deepseek-harness-voice-input.json +358 -0
  383. package/40-checker/results/sample60-ci/wz20__dsh-dafeiyu-dot.json +390 -0
  384. package/40-checker/results/sample60-ci/xfgil__dsh-hot-reloader.json +344 -0
  385. package/40-checker/results/sample60-ci/yi-yezhiqiu__dsh-prompt-market.json +373 -0
  386. package/40-checker/results/sample60-ci/yizhiyizhi0128__dsh-peak-scheduler.json +370 -0
  387. package/40-checker/results/sample60-ci/yjh051108__dsh-routing-suite.json +437 -0
  388. package/40-checker/results/sample60-ci/zed1902209846-dotcom__DPwhale-plugin.json +231 -0
  389. package/40-checker/results/triage/REPORT.md +317 -0
  390. package/40-checker/results/triage/evidence/g2-rejections.txt +63 -0
  391. package/40-checker/results/triage/evidence/purge-baseline-0.2.1-rc.5.json +51 -0
  392. package/40-checker/results/triage/evidence/purge-baseline-0.2.2-alpha.2.json +51 -0
  393. package/40-checker/results/triage/evidence/purge-postinstall.txt +62 -0
  394. package/40-checker/results/triage/evidence/purge-with-profile-0.2.1-rc.5.json +71 -0
  395. package/40-checker/results/triage/evidence/purge-with-profile-0.2.2-alpha.2.json +71 -0
  396. package/40-checker/results/triage/evidence/semver-matrix.json +32 -0
  397. package/40-checker/results/triage/triage.json +295 -0
  398. package/40-checker/results/webapp/README.md +10 -0
  399. package/40-checker/results/webapp/summary.json +46 -0
  400. package/40-checker/results/webapp/web-auth.json +19 -0
  401. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/client-export.json +7 -0
  402. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/installed-package.json +123 -0
  403. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/probe.json +129 -0
  404. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/shot.png +0 -0
  405. package/40-checker/results/webruntime/DDDMUC__dsh-free-search/summary.md +16 -0
  406. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/client-export.json +7 -0
  407. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/installed-package.json +76 -0
  408. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/probe.json +129 -0
  409. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/shot.png +0 -0
  410. package/40-checker/results/webruntime/Ebony-Vinyl__dsh-our-free-model/summary.md +16 -0
  411. package/40-checker/results/webruntime/REPORT.md +253 -0
  412. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/client-export.json +7 -0
  413. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/installed-package.json +97 -0
  414. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/probe.json +129 -0
  415. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/shot.png +0 -0
  416. package/40-checker/results/webruntime/SeaOf0__dsh-redteam-model/summary.md +16 -0
  417. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/client-export.json +7 -0
  418. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/installed-package.json +98 -0
  419. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/probe.json +136 -0
  420. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/shot.png +0 -0
  421. package/40-checker/results/webruntime/YuJunZhiXue__dsh-purge/summary.md +16 -0
  422. package/40-checker/results/webruntime/ci-diet/client-export.json +10 -0
  423. package/40-checker/results/webruntime/ci-diet/installed-package.json +100 -0
  424. package/40-checker/results/webruntime/ci-diet/probe.json +129 -0
  425. package/40-checker/results/webruntime/ci-diet/shot.png +0 -0
  426. package/40-checker/results/webruntime/ci-diet/summary.md +16 -0
  427. package/40-checker/results/webruntime/daily-log/client-export.json +10 -0
  428. package/40-checker/results/webruntime/daily-log/installed-package.json +113 -0
  429. package/40-checker/results/webruntime/daily-log/probe.json +129 -0
  430. package/40-checker/results/webruntime/daily-log/shot.png +0 -0
  431. package/40-checker/results/webruntime/daily-log/summary.md +16 -0
  432. package/40-checker/results/webruntime/howmp__dsh-pentest/client-export.json +7 -0
  433. package/40-checker/results/webruntime/howmp__dsh-pentest/installed-package.json +90 -0
  434. package/40-checker/results/webruntime/howmp__dsh-pentest/probe.json +129 -0
  435. package/40-checker/results/webruntime/howmp__dsh-pentest/shot.png +0 -0
  436. package/40-checker/results/webruntime/howmp__dsh-pentest/summary.md +16 -0
  437. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/client-export.json +7 -0
  438. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/installed-package.json +164 -0
  439. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/probe.json +129 -0
  440. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/shot.png +0 -0
  441. package/40-checker/results/webruntime/kingcharleslzy-ai__dsh-purge/summary.md +16 -0
  442. package/40-checker/results/webruntime/liguobao__ds-harness-remote/client-export.json +7 -0
  443. package/40-checker/results/webruntime/liguobao__ds-harness-remote/installed-package.json +166 -0
  444. package/40-checker/results/webruntime/liguobao__ds-harness-remote/probe.json +129 -0
  445. package/40-checker/results/webruntime/liguobao__ds-harness-remote/shot.png +0 -0
  446. package/40-checker/results/webruntime/liguobao__ds-harness-remote/summary.md +16 -0
  447. package/40-checker/results/webruntime/local-pre-ci/README.md +67 -0
  448. package/40-checker/results/webruntime/local-pre-ci/client-exports.json +158 -0
  449. package/40-checker/results/webruntime/local-pre-ci/dsh-free-search.probe.json +119 -0
  450. package/40-checker/results/webruntime/local-pre-ci/dsh-pocket.probe.json +119 -0
  451. package/40-checker/results/webruntime/local-pre-ci/dsh-redteam-model.probe.json +119 -0
  452. package/40-checker/results/webruntime/local-pre-ci/qiushi-shell-only.probe.json +104 -0
  453. package/40-checker/results/webruntime/local-pre-ci/ui-auth-no-login.fail.json +52 -0
  454. package/40-checker/results/webruntime/local-pre-ci/ui-auth.probe.json +123 -0
  455. package/40-checker/results/webruntime/mmparko__dsh-purge/client-export.json +7 -0
  456. package/40-checker/results/webruntime/mmparko__dsh-purge/installed-package.json +95 -0
  457. package/40-checker/results/webruntime/mmparko__dsh-purge/probe.json +136 -0
  458. package/40-checker/results/webruntime/mmparko__dsh-purge/shot.png +0 -0
  459. package/40-checker/results/webruntime/mmparko__dsh-purge/summary.md +16 -0
  460. package/40-checker/results/webruntime/project-memory/client-export.json +7 -0
  461. package/40-checker/results/webruntime/project-memory/installed-package.json +118 -0
  462. package/40-checker/results/webruntime/project-memory/probe.json +129 -0
  463. package/40-checker/results/webruntime/project-memory/shot.png +0 -0
  464. package/40-checker/results/webruntime/project-memory/summary.md +16 -0
  465. package/40-checker/results/webruntime/qiushi/client-export.json +7 -0
  466. package/40-checker/results/webruntime/qiushi/installed-package.json +84 -0
  467. package/40-checker/results/webruntime/qiushi/probe.json +114 -0
  468. package/40-checker/results/webruntime/qiushi/shot.png +0 -0
  469. package/40-checker/results/webruntime/qiushi/summary.md +16 -0
  470. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/client-export.json +7 -0
  471. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/installed-package.json +85 -0
  472. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/probe.json +129 -0
  473. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/shot.png +0 -0
  474. package/40-checker/results/webruntime/shaobeichen__dsh-pocket/summary.md +16 -0
  475. package/40-checker/results/webruntime/status-rotator/client-export.json +7 -0
  476. package/40-checker/results/webruntime/status-rotator/installed-package.json +107 -0
  477. package/40-checker/results/webruntime/status-rotator/probe.json +129 -0
  478. package/40-checker/results/webruntime/status-rotator/shot.png +0 -0
  479. package/40-checker/results/webruntime/status-rotator/summary.md +16 -0
  480. package/40-checker/results/webruntime/summary.json +323 -0
  481. package/40-checker/results/webruntime/telemetry/probe.json +20 -0
  482. package/40-checker/results/webruntime/telemetry/summary.md +4 -0
  483. package/40-checker/results/webruntime/ui-auth/client-export.json +7 -0
  484. package/40-checker/results/webruntime/ui-auth/installed-package.json +94 -0
  485. package/40-checker/results/webruntime/ui-auth/probe.json +129 -0
  486. package/40-checker/results/webruntime/ui-auth/shot.png +0 -0
  487. package/40-checker/results/webruntime/ui-auth/summary.md +16 -0
  488. package/40-checker/results/webruntime/verification/probe.json +20 -0
  489. package/40-checker/results/webruntime/verification/summary.md +4 -0
  490. package/40-checker/results/webruntime/ysr666__dsh-vision-router/client-export.json +7 -0
  491. package/40-checker/results/webruntime/ysr666__dsh-vision-router/installed-package.json +142 -0
  492. package/40-checker/results/webruntime/ysr666__dsh-vision-router/probe.json +129 -0
  493. package/40-checker/results/webruntime/ysr666__dsh-vision-router/shot.png +0 -0
  494. package/40-checker/results/webruntime/ysr666__dsh-vision-router/summary.md +16 -0
  495. package/40-checker/samples/README.md +8 -0
  496. package/40-checker/samples/entry18.json +139 -0
  497. package/40-checker/samples/frame.json +485 -0
  498. package/40-checker/scripts/apply-overlay.mjs +59 -0
  499. package/40-checker/scripts/attestation-check.mjs +151 -0
  500. package/40-checker/scripts/bundle-smoke.mjs +126 -0
  501. package/40-checker/scripts/claim-check.mjs +145 -0
  502. package/40-checker/scripts/clause-map.mjs +94 -0
  503. package/40-checker/scripts/collect-fixtures.mjs +44 -0
  504. package/40-checker/scripts/dashboard.mjs +85 -0
  505. package/40-checker/scripts/dco-check.mjs +147 -0
  506. package/40-checker/scripts/dependabot-check.mjs +40 -0
  507. package/40-checker/scripts/doc-commands-check.mjs +92 -0
  508. package/40-checker/scripts/entry-scan.mjs +190 -0
  509. package/40-checker/scripts/entry-validate.mjs +291 -0
  510. package/40-checker/scripts/entry18-attribution.mjs +66 -0
  511. package/40-checker/scripts/entry18-ci.mjs +685 -0
  512. package/40-checker/scripts/entry18-realweb-summary.mjs +71 -0
  513. package/40-checker/scripts/entry18-web.mjs +307 -0
  514. package/40-checker/scripts/evidence-chain.mjs +100 -0
  515. package/40-checker/scripts/flow-index.mjs +82 -0
  516. package/40-checker/scripts/flow-sample-ci.mjs +529 -0
  517. package/40-checker/scripts/governance-check.mjs +210 -0
  518. package/40-checker/scripts/host-farm.mjs +165 -0
  519. package/40-checker/scripts/journey-config-observe.mjs +109 -0
  520. package/40-checker/scripts/journey-disclosure-shape.mjs +83 -0
  521. package/40-checker/scripts/journey-runtime.mjs +178 -0
  522. package/40-checker/scripts/journey.mjs +76 -0
  523. package/40-checker/scripts/label-drift.mjs +74 -0
  524. package/40-checker/scripts/label-sync.mjs +87 -0
  525. package/40-checker/scripts/label-verify.mjs +90 -0
  526. package/40-checker/scripts/landlock-exec.c +101 -0
  527. package/40-checker/scripts/level-audit.mjs +336 -0
  528. package/40-checker/scripts/m1-sidecar.mjs +126 -0
  529. package/40-checker/scripts/m2-runner.mjs +213 -0
  530. package/40-checker/scripts/round-robin.mjs +88 -0
  531. package/40-checker/scripts/sample-frame.mjs +72 -0
  532. package/40-checker/scripts/sample20-ci.mjs +25 -0
  533. package/40-checker/scripts/sample60-ci.mjs +25 -0
  534. package/40-checker/scripts/stale-check.mjs +59 -0
  535. package/40-checker/scripts/surveillance.mjs +88 -0
  536. package/40-checker/scripts/web-probe.mjs +504 -0
  537. package/40-checker/src/cli.mjs +300 -0
  538. package/40-checker/src/client-shape.mjs +37 -0
  539. package/40-checker/src/declarations.mjs +242 -0
  540. package/40-checker/src/index.mjs +8 -0
  541. package/40-checker/src/install-spec.mjs +67 -0
  542. package/40-checker/src/label.mjs +130 -0
  543. package/40-checker/src/manifest.mjs +364 -0
  544. package/40-checker/src/permissions.mjs +60 -0
  545. package/40-checker/src/report.mjs +204 -0
  546. package/40-checker/src/result.mjs +60 -0
  547. package/40-checker/src/runtime.mjs +299 -0
  548. package/40-checker/src/semver.mjs +128 -0
  549. package/40-checker/src/util.mjs +148 -0
  550. package/40-checker/test/attestation.test.mjs +59 -0
  551. package/40-checker/test/checks.test.mjs +172 -0
  552. package/40-checker/test/claim.test.mjs +28 -0
  553. package/40-checker/test/client-shape.test.mjs +35 -0
  554. package/40-checker/test/dco.test.mjs +51 -0
  555. package/40-checker/test/entry-validate.test.mjs +172 -0
  556. package/40-checker/test/governance.test.mjs +76 -0
  557. package/40-checker/test/label.test.mjs +97 -0
  558. package/40-checker/test/level-audit.test.mjs +99 -0
  559. package/40-checker/test/levels.test.mjs +31 -0
  560. package/40-checker/test/ops.test.mjs +117 -0
  561. package/40-checker/test/permissions.test.mjs +40 -0
  562. package/40-checker/test/semver.test.mjs +32 -0
  563. package/40-checker/test/verify.test.mjs +57 -0
  564. package/LICENSE +28 -0
  565. package/LICENSE-APACHE +190 -0
  566. package/LICENSE-CC-BY +23 -0
  567. package/NOTICE.md +11 -0
  568. package/README.md +146 -3
  569. package/bin/dsh-levels.mjs +4 -0
  570. package/bin/dsh-standards.mjs +17 -4
  571. package/docs/BOOST-FIXTURES-2026-11-02.md +38 -0
  572. package/docs/DEVELOPER-JOURNEY.md +40 -0
  573. package/docs/HOST-J3-BUG-REPORT-DRAFT.md +27 -0
  574. package/docs/HOST-J3-CONFIG-REPRO-2026-11-02.md +36 -0
  575. package/docs/NAMING-FALLBACK.md +11 -0
  576. package/docs/fork-policy.md +12 -0
  577. package/docs/full-test-plan-2026-11-02.md +207 -0
  578. package/docs/incident.md +37 -0
  579. package/docs/onboarding.md +27 -0
  580. package/docs/privacy.md +12 -0
  581. package/docs/release.md +16 -0
  582. package/docs/scope-security.md +62 -0
  583. package/docs/status-taxonomy.md +54 -0
  584. package/docs/sunset.md +44 -0
  585. package/docs/translating.md +12 -0
  586. package/package.json +49 -18
  587. package/spec/README.md +27 -0
  588. package/spec/boost/README.md +8 -0
  589. package/spec/clauses.json +253 -0
  590. package/spec/entry/README.md +9 -0
  591. package/spec/flow/README.md +8 -0
  592. package/spec/levels.json +371 -0
  593. package/spec/levels.schema.json +45 -0
  594. package/spec/reference-suite.json +35 -0
  595. package/spec/schemas/attestation.schema.json +284 -0
  596. package/spec/schemas/evidence.schema.json +331 -0
  597. package/spec/schemas/report.schema.json +64 -0
  598. package/index.mjs +0 -3
@@ -0,0 +1,685 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * entry18-ci.mjs — reproducible base- or web-layer G0–G3 runtime evidence for
4
+ * the 18 ENTRY packages.
5
+ *
6
+ * One invocation serves one CI matrix shard (`--only <id>`), or all shards in
7
+ * sequence on a developer machine (`--all`). The script is zero-dependency:
8
+ * it only shells out to `npm`, `git`, `tar` and `node`, which exist on the
9
+ * GitHub Actions Ubuntu runner.
10
+ *
11
+ * Farm layout (a real directory, deleted after every package):
12
+ *
13
+ * <farm>/node_modules/<entry> symlink -> <dsh>/node_modules/<entry>
14
+ * <farm>/plugins/<id> published tarball or git clone
15
+ * <farm>/node_modules/<pkg-name> symlink -> ../plugins/<id>
16
+ *
17
+ * Keeping `<farm>/node_modules` a real directory matters: symlinking the whole
18
+ * directory makes npm write into the global DSH install.
19
+ *
20
+ * Install policy: the copied package.json is first stripped of devDependencies
21
+ * and scripts (published dev-only `workspace:*` specs and dev peer pins break a
22
+ * standalone install), then `npm install --omit=dev --ignore-scripts
23
+ * --legacy-peer-deps --no-package-lock --no-audit --no-fund` runs. No install
24
+ * script from a third-party package is ever executed.
25
+ *
26
+ * Usage:
27
+ * node 40-checker/scripts/entry18-ci.mjs --only <id>
28
+ * node 40-checker/scripts/entry18-ci.mjs --all
29
+ * node 40-checker/scripts/entry18-ci.mjs --summary
30
+ *
31
+ * Options:
32
+ * --only <id> run one shard (id from samples/entry18.json)
33
+ * --all run every shard sequentially
34
+ * --summary do not boot; aggregate existing rows
35
+ * --out <dir> result directory (default: 40-checker/results/entry/18/fullbase)
36
+ * --farm <dir> farm directory (default: <tmp>/dsh-entry18-farm-<pid>)
37
+ * --dsh-root <dir> installed @deepseek-ai/dsh package root
38
+ * (default: `<npm root -g>/@deepseek-ai/dsh`)
39
+ * --web [patch] also apply the web layer (default: @deepseek-ai/dsh-web-app/cordis.patch.yml)
40
+ * --expected-dsh-version <v> fail before booting when the installed version differs
41
+ * --fixture <mode> auto | published-tarball | git-clone (default: auto)
42
+ * --smoke-timeout <ms> bundle-smoke boot budget (default: 150000)
43
+ * --install-timeout <ms> npm install budget (default: 300000)
44
+ * --fetch-timeout <ms> npm pack / git clone budget (default: 300000)
45
+ * --keep-farm keep the farm after the shard (debug only)
46
+ * --verbose echo captured command output to stdout
47
+ *
48
+ * Exit codes:
49
+ * 0 a JSON row was written (verified / partial / failed)
50
+ * 2 bad usage
51
+ * 3 the row could not be produced (preflight or runner error)
52
+ *
53
+ * The script never upgrades a boot result: `status` is either the G3 state
54
+ * reported by bundle-smoke or "error". Only a real all-rows-ACTIVE boot can
55
+ * produce "verified".
56
+ */
57
+ import fs from 'node:fs'
58
+ import os from 'node:os'
59
+ import path from 'node:path'
60
+ import { spawnSync } from 'node:child_process'
61
+ import { fileURLToPath } from 'node:url'
62
+
63
+ const HERE = path.dirname(fileURLToPath(import.meta.url))
64
+ const STD = path.resolve(HERE, '..', '..')
65
+ const MANIFEST_PATH = path.join(STD, '40-checker', 'samples', 'entry18.json')
66
+ const SMOKE_SCRIPT = path.join(STD, '40-checker', 'scripts', 'bundle-smoke.mjs')
67
+ const DEFAULT_OUT = path.join(STD, '40-checker', 'results', 'entry', '18', 'fullbase')
68
+ const HOST_ENTRY = path.join('@deepseek-ai', 'dsh-app-boot', 'lib', 'index.js')
69
+ const BASE_PATCH = path.join('@deepseek-ai', 'dsh-base', 'cordis.patch.yml')
70
+ const WEB_PATCH = path.join('@deepseek-ai', 'dsh-web-app', 'cordis.patch.yml')
71
+ const FARM_MARKER = '.entry18-farm'
72
+ const MAX_LOG_BYTES = 4 * 1024 * 1024
73
+ const NPM = process.platform === 'win32' ? 'npm.cmd' : 'npm'
74
+
75
+ function usage() {
76
+ console.log(`usage: node 40-checker/scripts/entry18-ci.mjs --only <id> | --all | --summary [options]
77
+
78
+ --only <id> run one shard from 40-checker/samples/entry18.json
79
+ --all run every shard sequentially
80
+ --summary aggregate existing <id>.json rows (no boot)
81
+ --out <dir> result dir (default: 40-checker/results/entry/18/fullbase)
82
+ --farm <dir> farm dir (default: <tmp>/dsh-entry18-farm-<pid>)
83
+ --dsh-root <dir> @deepseek-ai/dsh package root (default: <npm root -g>/@deepseek-ai/dsh)
84
+ --web [patch] also apply the web layer (default: @deepseek-ai/dsh-web-app/cordis.patch.yml)
85
+ --expected-dsh-version <v> refuse to run on a different installed DSH version
86
+ --fixture <mode> auto | published-tarball | git-clone
87
+ --smoke-timeout <ms> bundle-smoke boot budget (default 150000)
88
+ --install-timeout <ms> npm install budget (default 300000)
89
+ --fetch-timeout <ms> npm pack / git clone budget (default 300000)
90
+ --keep-farm keep the farm (debug)
91
+ --verbose echo command output`)
92
+ }
93
+
94
+ function parseArgs(argv) {
95
+ const options = {
96
+ only: null, all: false, summary: false,
97
+ out: DEFAULT_OUT, farm: null, dshRoot: null,
98
+ expectedDshVersion: null, fixture: 'auto', web: null,
99
+ smokeTimeout: 150_000, installTimeout: 300_000, fetchTimeout: 300_000,
100
+ keepFarm: false, verbose: false,
101
+ }
102
+ const numeric = { '--smoke-timeout': 'smokeTimeout', '--install-timeout': 'installTimeout', '--fetch-timeout': 'fetchTimeout' }
103
+ for (let i = 0; i < argv.length; i += 1) {
104
+ const arg = argv[i]
105
+ const next = () => {
106
+ const value = argv[++i]
107
+ if (value === undefined) throw new Error(`${arg} needs a value`)
108
+ return value
109
+ }
110
+ if (arg === '--only') options.only = next()
111
+ else if (arg === '--all') options.all = true
112
+ else if (arg === '--summary') options.summary = true
113
+ else if (arg === '--out') options.out = path.resolve(next())
114
+ else if (arg === '--farm') options.farm = path.resolve(next())
115
+ else if (arg === '--dsh-root') options.dshRoot = path.resolve(next())
116
+ else if (arg === '--web') {
117
+ const value = argv[i + 1]
118
+ if (value !== undefined && !value.startsWith('-')) {
119
+ options.web = path.resolve(value)
120
+ i += 1
121
+ } else {
122
+ options.web = 'auto'
123
+ }
124
+ }
125
+ else if (arg === '--expected-dsh-version') options.expectedDshVersion = next()
126
+ else if (arg === '--fixture') options.fixture = next()
127
+ else if (arg === '--keep-farm') options.keepFarm = true
128
+ else if (arg === '--verbose') options.verbose = true
129
+ else if (arg === '--help' || arg === '-h') { usage(); process.exit(0) }
130
+ else if (numeric[arg]) {
131
+ const value = Number(next())
132
+ if (!Number.isFinite(value) || value < 1000) throw new Error(`${arg} must be >= 1000`)
133
+ options[numeric[arg]] = value
134
+ } else throw new Error(`unknown option: ${arg}`)
135
+ }
136
+ if (['auto', 'published-tarball', 'git-clone'].includes(options.fixture) === false) throw new Error(`--fixture must be auto, published-tarball or git-clone`)
137
+ const selected = [options.only !== null, options.all, options.summary].filter(Boolean).length
138
+ if (selected === 0) { usage(); process.exit(2) }
139
+ if (selected > 1) throw new Error('choose exactly one of --only, --all, --summary')
140
+ return options
141
+ }
142
+
143
+ function tail(text, limit = 600) {
144
+ const clean = String(text ?? '').trim()
145
+ return clean.length <= limit ? clean : `…${clean.slice(-limit)}`
146
+ }
147
+
148
+ function run(command, args, { cwd, timeout, env } = {}) {
149
+ const startedAt = Date.now()
150
+ const result = spawnSync(command, args, {
151
+ cwd,
152
+ timeout,
153
+ encoding: 'utf8',
154
+ maxBuffer: 64 * 1024 * 1024,
155
+ killSignal: 'SIGKILL',
156
+ env: {
157
+ ...process.env,
158
+ NO_COLOR: '1',
159
+ npm_config_update_notifier: 'false',
160
+ // Bound registry waits so one unresponsive metadata request cannot wedge
161
+ // a shard past its job timeout.
162
+ npm_config_fetch_timeout: '60000',
163
+ npm_config_fetch_retries: '2',
164
+ ...env,
165
+ },
166
+ })
167
+ return {
168
+ command,
169
+ args,
170
+ status: result.status,
171
+ signal: result.signal,
172
+ stdout: result.stdout ?? '',
173
+ stderr: result.stderr ?? '',
174
+ timedOut: result.error?.code === 'ETIMEDOUT',
175
+ error: result.error ? result.error.message : null,
176
+ elapsedMs: Math.max(0, Date.now() - startedAt),
177
+ }
178
+ }
179
+
180
+ function describeRun(result) {
181
+ if (result.timedOut) return `timed out after ${result.elapsedMs}ms`
182
+ if (result.error) return result.error
183
+ return `exit ${result.status ?? `signal ${result.signal}`}`
184
+ }
185
+
186
+ function logSection(lines, label, result) {
187
+ lines.push(`[${label}] $ ${result.command} ${result.args.join(' ')}`)
188
+ lines.push(`[${label}] ${describeRun(result)} (${result.elapsedMs}ms)`)
189
+ if (result.stdout.trim()) lines.push(`[${label}:stdout]\n${result.stdout.trimEnd()}`)
190
+ if (result.stderr.trim()) lines.push(`[${label}:stderr]\n${result.stderr.trimEnd()}`)
191
+ }
192
+
193
+ function writeAtomic(file, content) {
194
+ const tmp = `${file}.tmp-${process.pid}`
195
+ fs.writeFileSync(tmp, content)
196
+ fs.renameSync(tmp, file)
197
+ }
198
+
199
+ function writeJson(file, value) {
200
+ writeAtomic(file, `${JSON.stringify(value, null, 2)}\n`)
201
+ }
202
+
203
+ function readJson(file) {
204
+ return JSON.parse(fs.readFileSync(file, 'utf8'))
205
+ }
206
+
207
+ // Global installs may keep the package's dependencies nested under the package
208
+ // (the Windows 0.2.1 layout) or hoist them next to it (a local `npm install`
209
+ // layout, and usually `npm install -g` on Linux). Resolve both, never assume.
210
+ function inspectDshRoot(dir) {
211
+ try {
212
+ const manifest = readJson(path.join(dir, 'package.json'))
213
+ if (typeof manifest.version !== 'string') return null
214
+ const candidates = [
215
+ path.join(dir, 'node_modules'),
216
+ path.dirname(path.dirname(dir)),
217
+ ]
218
+ for (const depsRoot of candidates) {
219
+ const appBoot = path.join(depsRoot, HOST_ENTRY)
220
+ const basePatch = path.join(depsRoot, BASE_PATCH)
221
+ if (fs.existsSync(appBoot) && fs.existsSync(basePatch)) {
222
+ return { dir, version: manifest.version, depsRoot, appBoot, basePatch }
223
+ }
224
+ }
225
+ return null
226
+ } catch {
227
+ return null
228
+ }
229
+ }
230
+
231
+ function resolveDshRoot(explicit) {
232
+ if (explicit) {
233
+ const layout = inspectDshRoot(explicit)
234
+ if (!layout) throw new Error(`--dsh-root ${explicit} is not an installed @deepseek-ai/dsh package root (or its dependencies are not resolvable)`)
235
+ return layout
236
+ }
237
+ const npmRoot = run(NPM, ['root', '-g'], { timeout: 60_000 })
238
+ if (npmRoot.status !== 0) throw new Error(`npm root -g failed: ${tail(npmRoot.stderr)}`)
239
+ const candidate = path.join(npmRoot.stdout.trim(), '@deepseek-ai', 'dsh')
240
+ const layout = inspectDshRoot(candidate)
241
+ if (!layout) {
242
+ throw new Error(`cannot find @deepseek-ai/dsh under ${npmRoot.stdout.trim()}; install it globally or pass --dsh-root`)
243
+ }
244
+ return layout
245
+ }
246
+
247
+ function assertFarmOwned(dir) {
248
+ if (!fs.existsSync(dir)) return
249
+ if (!fs.existsSync(path.join(dir, FARM_MARKER))) {
250
+ throw new Error(`refusing to delete ${dir}: it exists but has no ${FARM_MARKER} marker`)
251
+ }
252
+ }
253
+
254
+ function removeFarm(dir) {
255
+ assertFarmOwned(dir)
256
+ fs.rmSync(dir, { recursive: true, force: true })
257
+ }
258
+
259
+ function prepareFarm(dir, depsRoot) {
260
+ assertFarmOwned(dir)
261
+ fs.rmSync(dir, { recursive: true, force: true })
262
+ fs.mkdirSync(path.join(dir, 'node_modules'), { recursive: true })
263
+ fs.mkdirSync(path.join(dir, 'plugins'), { recursive: true })
264
+ fs.writeFileSync(path.join(dir, FARM_MARKER), `dsh-entry18 farm\ncreatedAt=${new Date().toISOString()}\n`)
265
+ const source = depsRoot
266
+ let linked = 0
267
+ for (const entry of fs.readdirSync(source)) {
268
+ const target = path.join(source, entry)
269
+ const destination = path.join(dir, 'node_modules', entry)
270
+ const isDirectory = fs.statSync(target).isDirectory()
271
+ try {
272
+ if (process.platform === 'win32') fs.symlinkSync(target, destination, isDirectory ? 'junction' : 'file')
273
+ else fs.symlinkSync(target, destination, isDirectory ? 'dir' : 'file')
274
+ } catch (error) {
275
+ throw new Error(`cannot link ${entry} into the farm: ${error.message}`)
276
+ }
277
+ linked += 1
278
+ }
279
+ return linked
280
+ }
281
+
282
+ function ensureScopeDir(farmDir, scope) {
283
+ const destination = path.join(farmDir, 'node_modules', scope)
284
+ let stat
285
+ try { stat = fs.lstatSync(destination) } catch { fs.mkdirSync(destination, { recursive: true }); return }
286
+ if (!stat.isSymbolicLink()) return
287
+ // A host scope was linked as one symlink. Turn it into a real directory so
288
+ // the sample can join that scope without writing through into the host.
289
+ const target = path.resolve(path.dirname(destination), fs.readlinkSync(destination))
290
+ fs.unlinkSync(destination)
291
+ fs.mkdirSync(destination)
292
+ for (const entry of fs.readdirSync(target)) {
293
+ const source = path.join(target, entry)
294
+ const link = path.join(destination, entry)
295
+ if (process.platform === 'win32') fs.symlinkSync(source, link, fs.statSync(source).isDirectory() ? 'junction' : 'file')
296
+ else fs.symlinkSync(source, link)
297
+ }
298
+ }
299
+
300
+ function linkPlugin(farmDir, packageDir, name) {
301
+ const parts = name.split('/')
302
+ if (parts.length === 2) ensureScopeDir(farmDir, parts[0])
303
+ const parent = path.join(farmDir, 'node_modules', ...parts.slice(0, -1))
304
+ fs.mkdirSync(parent, { recursive: true })
305
+ const destination = path.join(parent, parts.at(-1))
306
+ try { fs.unlinkSync(destination) } catch { /* absent */ }
307
+ const target = process.platform === 'win32' ? packageDir : path.relative(parent, packageDir)
308
+ fs.symlinkSync(target, destination, process.platform === 'win32' ? 'junction' : 'dir')
309
+ }
310
+
311
+ function npmView(name, version) {
312
+ const result = run(NPM, ['view', `${name}@${version}`, 'version', 'repository.url', '--json'], { timeout: 120_000 })
313
+ if (result.status !== 0) return null
314
+ try {
315
+ const parsed = JSON.parse(result.stdout)
316
+ const rows = Array.isArray(parsed) ? parsed : [parsed]
317
+ const row = rows.at(-1)
318
+ // `npm view <pkg>@<v> version repository.url --json` returns a bare string
319
+ // when only the version field exists (no repository metadata), not an object.
320
+ if (typeof row === 'string') return row === version ? { version: row, repository: null } : null
321
+ if (!row || typeof row !== 'object') return null
322
+ if (row.version !== version) return null
323
+ return { version: row.version, repository: row['repository.url'] ?? null }
324
+ } catch {
325
+ return null
326
+ }
327
+ }
328
+
329
+ function normalizeRepo(value) {
330
+ if (!value) return null
331
+ let url = String(value).trim()
332
+ url = url.replace(/^git\+/, '').replace(/^git@([^:]+):/, 'https://$1/').replace(/\.git$/, '').replace(/\/+$/, '')
333
+ const match = url.match(/github\.com[/:]([^/]+)\/([^/]+)$/i)
334
+ return match ? `${match[1]}/${match[2]}`.toLowerCase() : null
335
+ }
336
+
337
+ function fixturePlan(row, mode) {
338
+ if (row.source === 'npm') {
339
+ return { kind: 'published-tarball', reason: 'source=npm: the registry tarball is the installable artifact' }
340
+ }
341
+ if (mode === 'published-tarball') return { kind: 'published-tarball', reason: 'forced by --fixture published-tarball' }
342
+ if (mode === 'git-clone') return { kind: 'git-clone', reason: 'forced by --fixture git-clone' }
343
+ const published = npmView(row.name, row.version)
344
+ if (!published) return { kind: 'git-clone', reason: `no published npm tarball at ${row.name}@${row.version}` }
345
+ const repo = normalizeRepo(published.repository)
346
+ if (!repo) return { kind: 'published-tarball', reason: `published tarball exists and has no GitHub repository field to contradict ${row.spec}` }
347
+ if (repo === row.spec.toLowerCase()) {
348
+ return { kind: 'published-tarball', reason: `published tarball repository matches ${row.spec}`, publishedRepository: published.repository }
349
+ }
350
+ return {
351
+ kind: 'git-clone',
352
+ reason: `published tarball repository ${repo} does not match ${row.spec}`,
353
+ publishedRepository: published.repository,
354
+ }
355
+ }
356
+
357
+ function fetchTarball(row, farmDir, tmpDir, options, lines) {
358
+ const destination = path.join(farmDir, 'plugins', row.id)
359
+ fs.mkdirSync(destination, { recursive: true })
360
+ const spec = `${row.name}@${row.version}`
361
+ const pack = run(NPM, ['pack', spec, '--pack-destination', tmpDir, '--json'], { timeout: options.fetchTimeout })
362
+ logSection(lines, 'npm-pack', pack)
363
+ if (pack.status !== 0) throw new Error(`npm pack ${spec} failed: ${tail(pack.stderr || pack.stdout)}`)
364
+ let filename
365
+ try {
366
+ const parsed = JSON.parse(pack.stdout)
367
+ filename = (Array.isArray(parsed) ? parsed.at(-1) : parsed)?.filename
368
+ } catch {
369
+ throw new Error(`npm pack ${spec} returned unparseable JSON`)
370
+ }
371
+ if (!filename) throw new Error(`npm pack ${spec} did not report a tarball filename`)
372
+ const tarball = path.join(tmpDir, filename)
373
+ if (!fs.existsSync(tarball)) throw new Error(`npm pack ${spec} reported ${filename} but the file is missing`)
374
+ const extract = run('tar', ['-xzf', tarball, '-C', destination, '--strip-components=1'], { timeout: options.fetchTimeout })
375
+ logSection(lines, 'tar-extract', extract)
376
+ if (extract.status !== 0) throw new Error(`tar extraction of ${filename} failed: ${tail(extract.stderr)}`)
377
+ return { kind: 'published-tarball', spec, tarball: filename, packageDir: destination }
378
+ }
379
+
380
+ function cloneRepo(row, farmDir, options, lines) {
381
+ const destination = path.join(farmDir, 'plugins', row.id)
382
+ const url = `https://github.com/${row.spec}.git`
383
+ const clone = run('git', ['clone', '--depth', '1', url, destination], { timeout: options.fetchTimeout })
384
+ logSection(lines, 'git-clone', clone)
385
+ if (clone.status !== 0) throw new Error(`git clone ${row.spec} failed: ${tail(clone.stderr)}`)
386
+ return { kind: 'git-clone', spec: row.spec, url, packageDir: destination }
387
+ }
388
+
389
+ function extractSmoke(stdout) {
390
+ const marker = '"schema": "dsh-bundle-smoke/1"'
391
+ const markerIndex = stdout.lastIndexOf(marker)
392
+ if (markerIndex < 0) return null
393
+ const start = stdout.lastIndexOf('{', markerIndex)
394
+ if (start < 0) return null
395
+ try { return JSON.parse(stdout.slice(start).trim()) } catch { return null }
396
+ }
397
+
398
+ function writeLog(outDir, id, lines) {
399
+ let text = `${lines.join('\n')}\n`
400
+ if (Buffer.byteLength(text) > MAX_LOG_BYTES) {
401
+ text = `${text.slice(0, MAX_LOG_BYTES)}\n…[truncated to ${MAX_LOG_BYTES} bytes]…\n`
402
+ }
403
+ fs.writeFileSync(path.join(outDir, `${id}.log`), text)
404
+ }
405
+
406
+ function baseRow(row, context) {
407
+ return {
408
+ schema: context.webPatch ? 'dsh-entry18-web/1' : 'dsh-entry18-fullbase/1',
409
+ id: row.id,
410
+ name: row.name,
411
+ version: row.version,
412
+ source: row.source,
413
+ spec: row.spec,
414
+ profile: context.webPatch ? 'web' : 'base',
415
+ base: { layer: 'dsh-base/cordis.patch.yml', webLayer: Boolean(context.webPatch), webLayerPath: context.webPatch ?? null },
416
+ environment: process.env.GITHUB_ACTIONS === 'true' ? 'github-actions' : 'local',
417
+ dshVersion: context.dshVersion,
418
+ dshVersionExpected: context.options.expectedDshVersion,
419
+ host: {
420
+ packageRoot: context.layout.dir,
421
+ depsRoot: context.layout.depsRoot,
422
+ appBoot: context.layout.appBoot,
423
+ basePatch: context.layout.basePatch,
424
+ webPatch: context.webPatch ?? null,
425
+ },
426
+ startedAt: context.startedAt,
427
+ finishedAt: null,
428
+ elapsedMs: null,
429
+ fixture: 'none',
430
+ artifact: null,
431
+ installScripts: 'skipped',
432
+ installCommand: 'npm install --omit=dev --ignore-scripts --legacy-peer-deps --no-package-lock --no-audit --no-fund',
433
+ manifestRewrite: 'none',
434
+ install: null,
435
+ status: 'error',
436
+ verdict: null,
437
+ g3State: null,
438
+ g3Rows: null,
439
+ g3Active: null,
440
+ compatibility: null,
441
+ exitCode: null,
442
+ smoke: null,
443
+ error: null,
444
+ }
445
+ }
446
+
447
+ function runShard(row, options, context) {
448
+ const startedAt = context.startedAt
449
+ const lines = []
450
+ lines.push(`# entry18 ${context.webPatch ? 'web' : 'fullbase'} shard: ${row.id}`)
451
+ lines.push(`# name=${row.name} version=${row.version} source=${row.source} spec=${row.spec}`)
452
+ lines.push(`# dshVersion=${context.dshVersion} profile=${context.webPatch ? 'web' : 'base'} webLayer=${Boolean(context.webPatch)} environment=${process.env.GITHUB_ACTIONS === 'true' ? 'github-actions' : 'local'}`)
453
+ lines.push(`# startedAt=${startedAt}`)
454
+ const record = baseRow(row, context)
455
+ // A shard that dies before writing must not leave an older row behind for
456
+ // `--summary` or a CI artifact upload to pick up as fresh evidence.
457
+ for (const extension of ['json', 'log']) {
458
+ fs.rmSync(path.join(options.out, `${row.id}.${extension}`), { force: true })
459
+ }
460
+ const farmDir = options.farm ?? path.join(os.tmpdir(), `dsh-entry18-farm-${process.pid}`)
461
+ let artifactTmp = null
462
+ try {
463
+ const linked = prepareFarm(farmDir, context.layout.depsRoot)
464
+ lines.push(`[farm] ${farmDir} (${linked} host entries linked, marker=${FARM_MARKER})`)
465
+ artifactTmp = fs.mkdtempSync(path.join(os.tmpdir(), 'dsh-entry18-artifact-'))
466
+ const plan = fixturePlan(row, options.fixture)
467
+ lines.push(`[fixture] plan=${plan.kind} reason=${plan.reason}`)
468
+ const fetched = plan.kind === 'published-tarball'
469
+ ? fetchTarball(row, farmDir, artifactTmp, options, lines)
470
+ : cloneRepo(row, farmDir, options, lines)
471
+ const packageDir = fetched.packageDir
472
+ const manifest = readJson(path.join(packageDir, 'package.json'))
473
+ const versionMatches = manifest.version === row.version
474
+ const nameMatches = manifest.name === row.name
475
+ record.fixture = fetched.kind
476
+ record.artifact = {
477
+ requested: row.source === 'npm' ? `${row.name}@${row.version}` : row.spec,
478
+ resolved: fetched.kind,
479
+ reason: plan.reason,
480
+ manifestName: manifest.name,
481
+ manifestVersion: manifest.version,
482
+ versionMatches,
483
+ nameMatches,
484
+ publishedRepository: plan.publishedRepository ?? null,
485
+ tarball: fetched.tarball ?? null,
486
+ repository: fetched.url ?? null,
487
+ }
488
+ if (!nameMatches) throw new Error(`artifact package name ${manifest.name} does not match ${row.name}`)
489
+ if (!versionMatches) lines.push(`[fixture] WARNING manifest version ${manifest.version} != requested ${row.version}`)
490
+ if (!manifest.dsh?.bundle?.patch) throw new Error('artifact manifest has no dsh.bundle.patch')
491
+ lines.push(`[fixture] packageDir=${packageDir} manifest=${manifest.name}@${manifest.version} bundle=${JSON.stringify(manifest.dsh.bundle.patch)}`)
492
+
493
+ // Dev-only `workspace:*` specs and dev peer pins make a published package
494
+ // unresolvable when installed standalone (EUNSUPPORTEDPROTOCOL/ERESOLVE).
495
+ // Runtime needs neither, so strip them before installing. The rewrite is
496
+ // recorded in the row; the shipped tarball itself is not modified.
497
+ const rewriteKeys = []
498
+ if (manifest.devDependencies) rewriteKeys.push('devDependencies')
499
+ if (manifest.scripts) rewriteKeys.push('scripts')
500
+ if (rewriteKeys.length > 0) {
501
+ delete manifest.devDependencies
502
+ delete manifest.scripts
503
+ fs.writeFileSync(path.join(packageDir, 'package.json'), `${JSON.stringify(manifest, null, 2)}\n`)
504
+ record.manifestRewrite = `removed ${rewriteKeys.join('+')}`
505
+ }
506
+ lines.push(`[manifest] rewrite=${record.manifestRewrite}`)
507
+
508
+ const installArgs = ['install', '--omit=dev', '--ignore-scripts', '--legacy-peer-deps', '--no-package-lock', '--no-audit', '--no-fund']
509
+ const install = run(NPM, installArgs, { cwd: packageDir, timeout: options.installTimeout })
510
+ record.install = {
511
+ command: `npm ${installArgs.join(' ')}`,
512
+ status: install.status === 0 ? 'ok' : 'failed',
513
+ elapsedMs: install.elapsedMs,
514
+ scripts: 'skipped',
515
+ }
516
+ logSection(lines, 'npm-install', install)
517
+ if (install.status !== 0) throw new Error(`npm install in ${path.basename(packageDir)} failed: ${tail(install.stderr || install.stdout)}`)
518
+
519
+ linkPlugin(farmDir, packageDir, row.name)
520
+ lines.push(`[link] ${path.join('node_modules', row.name)} -> ${packageDir}`)
521
+
522
+ const smokeArgs = [
523
+ SMOKE_SCRIPT,
524
+ '--package', packageDir,
525
+ '--host', context.layout.appBoot,
526
+ '--base', context.layout.basePatch,
527
+ ...(context.webPatch ? ['--web', context.webPatch] : []),
528
+ '--bare', `${farmDir}${path.sep}`,
529
+ '--timeout', String(options.smokeTimeout),
530
+ '--json',
531
+ ]
532
+ const smokeRun = run(process.execPath, smokeArgs, { timeout: options.smokeTimeout + 120_000 })
533
+ logSection(lines, 'bundle-smoke', smokeRun)
534
+ record.exitCode = smokeRun.status
535
+ const smoke = extractSmoke(smokeRun.stdout)
536
+ if (!smoke) {
537
+ const reason = smokeRun.timedOut
538
+ ? `bundle-smoke exceeded its ${options.smokeTimeout + 120_000}ms process budget`
539
+ : tail(smokeRun.stderr || smokeRun.stdout, 400) || describeRun(smokeRun)
540
+ record.error = { stage: smokeRun.timedOut ? 'smoke-timeout' : 'smoke', message: reason }
541
+ record.status = 'error'
542
+ record.verdict = 'error'
543
+ record.finishedAt = new Date().toISOString()
544
+ return record
545
+ }
546
+ record.smoke = smoke
547
+ record.g3State = smoke.g3?.state ?? null
548
+ record.g3Rows = Array.isArray(smoke.g3?.rows) ? smoke.g3.rows.length : null
549
+ record.g3Active = smoke.g3?.active ?? null
550
+ record.compatibility = smoke.g2?.compatibility ?? null
551
+ record.status = ['verified', 'partial', 'failed'].includes(smoke.g3?.state) ? smoke.g3.state : 'error'
552
+ // G2 is reported, not enforced, by bundle-smoke: a package can boot while
553
+ // the host version gate would reject it. Keep that distinction visible.
554
+ record.verdict = record.status === 'verified'
555
+ ? (record.compatibility === 'reject' ? 'verified-gate-reject' : 'verified')
556
+ : record.status
557
+ if (record.status === 'error') record.error = { stage: 'smoke-result', message: `unexpected g3.state ${JSON.stringify(smoke.g3?.state)}` }
558
+ if (record.status === 'failed') record.error = { stage: 'g3-failed', message: 'target rows did not activate' }
559
+ record.finishedAt = new Date().toISOString()
560
+ return record
561
+ } catch (error) {
562
+ record.status = 'error'
563
+ record.verdict = 'error'
564
+ record.error = { stage: record.fixture === 'none' ? 'fixture' : 'setup', message: error.message }
565
+ record.finishedAt = new Date().toISOString()
566
+ lines.push(`[error] ${error.message}`)
567
+ return record
568
+ } finally {
569
+ record.elapsedMs = Date.now() - Date.parse(startedAt)
570
+ if (!record.finishedAt) record.finishedAt = new Date().toISOString()
571
+ if (!options.keepFarm) {
572
+ try { removeFarm(farmDir) } catch (error) { lines.push(`[farm] cleanup failed: ${error.message}`) }
573
+ }
574
+ if (artifactTmp) {
575
+ try { fs.rmSync(artifactTmp, { recursive: true, force: true }) } catch { /* best effort */ }
576
+ }
577
+ try { writeLog(options.out, row.id, lines) } catch { /* log is evidence, not a gate */ }
578
+ }
579
+ }
580
+
581
+ function summarize(manifest, outDir, targetDshVersion, requestedProfile = 'base') {
582
+ const rows = manifest.rows.map((row) => {
583
+ const file = path.join(outDir, `${row.id}.json`)
584
+ if (!fs.existsSync(file)) {
585
+ return { id: row.id, name: row.name, version: row.version, source: row.source, profile: null, status: 'missing', fixture: null, g3State: null, targetRows: null, active: null, elapsedMs: null, error: null }
586
+ }
587
+ const record = readJson(file)
588
+ return {
589
+ id: row.id,
590
+ name: row.name,
591
+ version: row.version,
592
+ source: row.source,
593
+ profile: record.profile ?? null,
594
+ status: record.status,
595
+ verdict: record.verdict ?? record.status,
596
+ fixture: record.fixture,
597
+ g3State: record.g3State,
598
+ targetRows: record.g3Rows,
599
+ active: record.g3Active,
600
+ elapsedMs: record.elapsedMs,
601
+ dshVersion: record.dshVersion,
602
+ error: record.error,
603
+ }
604
+ })
605
+ const counts = { verified: 0, partial: 0, failed: 0, error: 0, missing: 0 }
606
+ const verdicts = {}
607
+ for (const row of rows) {
608
+ counts[row.status] = (counts[row.status] ?? 0) + 1
609
+ verdicts[row.verdict ?? row.status] = (verdicts[row.verdict ?? row.status] ?? 0) + 1
610
+ }
611
+ const dshVersions = [...new Set(rows.map((row) => row.dshVersion).filter(Boolean))]
612
+ const profiles = new Set(rows.map((row) => row.profile).filter(Boolean))
613
+ const profile = profiles.has('web') ? 'web' : profiles.has('base') ? 'base' : requestedProfile
614
+ return {
615
+ schema: profile === 'web' ? 'dsh-entry18-web-summary/1' : 'dsh-entry18-fullbase-summary/1',
616
+ generatedAt: new Date().toISOString(),
617
+ profile,
618
+ note: profile === 'web'
619
+ ? 'Aggregates the <id>.json rows present in this directory with the web layer; a missing row is not a pass.'
620
+ : 'Aggregates the <id>.json rows present in this directory. Run the entry18-runtime workflow to fill all 18 shards.',
621
+ targetDshVersion,
622
+ dshVersions,
623
+ count: rows.length,
624
+ present: rows.length - counts.missing,
625
+ missing: counts.missing,
626
+ status: counts,
627
+ verdicts,
628
+ rows,
629
+ }
630
+ }
631
+
632
+ async function main() {
633
+ const options = parseArgs(process.argv.slice(2))
634
+ const manifest = readJson(MANIFEST_PATH)
635
+ if (manifest.rows.length !== 18) throw new Error(`manifest has ${manifest.rows.length} rows, expected 18`)
636
+ if (options.summary) {
637
+ fs.mkdirSync(options.out, { recursive: true })
638
+ const summary = summarize(manifest, options.out, manifest.targetDshVersion, options.web ? 'web' : 'base')
639
+ writeJson(path.join(options.out, 'summary.json'), summary)
640
+ console.log(`summary: ${summary.present}/${summary.count} rows present, status=${JSON.stringify(summary.status)}, verdicts=${JSON.stringify(summary.verdicts)}`)
641
+ return 0
642
+ }
643
+
644
+ const layout = resolveDshRoot(options.dshRoot)
645
+ const dshVersion = layout.version
646
+ if (options.expectedDshVersion && dshVersion !== options.expectedDshVersion) {
647
+ throw new Error(`installed DSH is ${dshVersion}, expected ${options.expectedDshVersion}`)
648
+ }
649
+ const webPatch = options.web
650
+ ? (options.web === 'auto' ? path.join(layout.depsRoot, WEB_PATCH) : options.web)
651
+ : null
652
+ if (webPatch && !fs.existsSync(webPatch)) throw new Error(`web patch not found: ${webPatch}`)
653
+ const selected = options.all
654
+ ? manifest.rows
655
+ : [manifest.rows.find((row) => row.id === options.only) ?? (() => { throw new Error(`unknown id: ${options.only}`) })()]
656
+ fs.mkdirSync(options.out, { recursive: true })
657
+ console.log(`entry18 ${webPatch ? 'web' : 'fullbase'}: ${selected.length} shard(s), dsh ${dshVersion} at ${layout.dir}`)
658
+ console.log(`deps root: ${layout.depsRoot}`)
659
+ console.log(`base: ${layout.basePatch}`)
660
+ console.log(webPatch ? `web layer: ${webPatch}` : 'web layer: none')
661
+
662
+ let exitCode = 0
663
+ for (const row of selected) {
664
+ const record = runShard(row, options, { layout, dshVersion, options, webPatch, startedAt: new Date().toISOString() })
665
+ writeJson(path.join(options.out, `${row.id}.json`), record)
666
+ const verdict = record.status === 'error'
667
+ ? `error(${record.error?.stage}: ${record.error?.message})`
668
+ : `${record.status} fixture=${record.fixture} rows=${record.g3Active}/${record.g3Rows}`
669
+ console.log(`[${row.id}] ${verdict} ${record.elapsedMs}ms -> ${path.join(options.out, `${row.id}.json`)}`)
670
+ if (record.status === 'error') exitCode = 3
671
+ }
672
+ if (options.all) {
673
+ const summary = summarize(manifest, options.out, manifest.targetDshVersion, webPatch ? 'web' : 'base')
674
+ writeJson(path.join(options.out, 'summary.json'), summary)
675
+ console.log(`summary: ${summary.present}/${summary.count} rows, status=${JSON.stringify(summary.status)}, verdicts=${JSON.stringify(summary.verdicts)}`)
676
+ }
677
+ return exitCode
678
+ }
679
+
680
+ try {
681
+ process.exitCode = await main()
682
+ } catch (error) {
683
+ console.error(`entry18-ci: ${error.message}`)
684
+ process.exitCode = 3
685
+ }