binary-collections 2.0.13 → 2.0.15

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 (303) hide show
  1. package/.opencode/plugins/opencode-request-logger/README.md +44 -0
  2. package/.venv/Lib/site-packages/pyarrow/tests/data/orc/README.md +22 -0
  3. package/binaries/binary-executor.cjs +307 -238
  4. package/binaries/clean-nodemodule.cjs +307 -238
  5. package/binaries/clean-nodemodules.cjs +307 -238
  6. package/binaries/composer.cjs +323 -0
  7. package/binaries/composer.cmd +2 -0
  8. package/binaries/composer.phar +0 -0
  9. package/binaries/dev.cjs +307 -238
  10. package/binaries/empty.cjs +307 -238
  11. package/binaries/git-reduce-size.cjs +307 -238
  12. package/binaries/javakill.cjs +307 -238
  13. package/binaries/kill-process.cjs +307 -238
  14. package/binaries/nodekill.cjs +307 -238
  15. package/binaries/prod.cjs +307 -238
  16. package/binaries/py.cjs +307 -238
  17. package/binaries/rmfind.cjs +307 -238
  18. package/binaries/rmx.cjs +307 -238
  19. package/binaries/submodule-token.cjs +307 -238
  20. package/binaries/test-cjs.cjs +307 -238
  21. package/binaries/test-esm.cjs +307 -238
  22. package/binaries/yarn-clean.cjs +307 -238
  23. package/binaries/yc.cjs +307 -238
  24. package/binaries/ycw.cjs +307 -238
  25. package/docs-src/binary-collections.md +1 -1
  26. package/docs-src/clean-github-actions-caches.md +1 -1
  27. package/docs-src/copy-move-file.md +1 -4
  28. package/docs-src/del-ps.md +1 -1
  29. package/docs-src/find-node-modules.md +1 -1
  30. package/docs-src/generate-test-ci.md +56 -0
  31. package/docs-src/get-latest-workflow-status.md +100 -0
  32. package/docs-src/git-diff.md +1 -1
  33. package/docs-src/git-fix.md +1 -1
  34. package/docs-src/git-purge.md +1 -1
  35. package/docs-src/install-opencode-plugins.md +86 -0
  36. package/docs-src/kill-night-crows.md +1 -1
  37. package/docs-src/node-cache-cleaner.md +2 -2
  38. package/docs-src/node-package-packer.md +1 -1
  39. package/docs-src/opencode-cli.md +155 -0
  40. package/docs-src/package-resolutions-updater.md +1 -1
  41. package/docs-src/rmpath.md +1 -1
  42. package/docs-src/run-by-checksum.md +1 -1
  43. package/docs-src/submodule-remove.md +1 -1
  44. package/docs-src/upload-backend.md +29 -0
  45. package/docs-src/vscode-cli.md +84 -0
  46. package/docs-src/workflow-badge.md +120 -0
  47. package/lib/binary-collections/config-types.cjs +17 -0
  48. package/lib/binary-collections/config-types.d.ts +12 -0
  49. package/lib/binary-collections/config-types.js +2 -0
  50. package/lib/binary-collections/config-types.mjs +7 -0
  51. package/lib/binary-collections/config.cjs +28 -8
  52. package/lib/binary-collections/config.d.cts +26 -8
  53. package/lib/binary-collections/config.mjs +2 -2
  54. package/lib/binary-collections/findScript.cjs +49 -25
  55. package/lib/binary-collections/findScript.mjs +2 -2
  56. package/lib/binary-collections/listScript.cjs +49 -25
  57. package/lib/binary-collections/listScript.mjs +2 -2
  58. package/lib/binary-collections.cjs +49 -25
  59. package/lib/binary-collections.mjs +6 -6
  60. package/lib/changelog.cjs +142 -4
  61. package/lib/changelog.mjs +9 -5
  62. package/lib/chunk-3T6AMFI3.mjs +52 -0
  63. package/lib/{chunk-2MN4VPV2.mjs → chunk-3ZF2QMDK.mjs} +4 -4
  64. package/lib/chunk-56BVU63B.mjs +86 -0
  65. package/lib/chunk-7N52Z4IJ.mjs +39 -0
  66. package/lib/chunk-B77D3SR4.mjs +28 -0
  67. package/lib/chunk-BPED62FN.mjs +115 -0
  68. package/lib/{chunk-RDN6HF5Z.mjs → chunk-DHFRWM2W.mjs} +1 -1
  69. package/lib/chunk-DPEE3FBB.mjs +146 -0
  70. package/lib/{chunk-MGPYPKIE.mjs → chunk-H7AE4IO3.mjs} +5 -1
  71. package/lib/{chunk-H44UWUFY.mjs → chunk-J4M5EL5P.mjs} +3 -0
  72. package/lib/chunk-KCJYREA2.mjs +67 -0
  73. package/lib/chunk-LACQTD5V.mjs +225 -0
  74. package/lib/{chunk-TBWXE7ST.mjs → chunk-NHD4HLSU.mjs} +24 -31
  75. package/lib/{chunk-RDGDLSPD.mjs → chunk-OWNVMKAA.mjs} +6 -5
  76. package/lib/chunk-SKVF4TMD.mjs +59 -0
  77. package/lib/{chunk-BZWVHODJ.mjs → chunk-TDUUOAQD.mjs} +5 -5
  78. package/lib/chunk-TP3O2JGW.mjs +88 -0
  79. package/lib/{chunk-FLYSZFLW.mjs → chunk-UAEKSLAX.mjs} +1 -1
  80. package/lib/chunk-UDZBVKXH.mjs +94 -0
  81. package/lib/chunk-UEOWRYAN.mjs +32 -0
  82. package/lib/chunk-V6PTSDW5.mjs +82 -0
  83. package/lib/{chunk-NQXUYO67.mjs → chunk-WNUEY6VJ.mjs} +49 -25
  84. package/lib/chunk-X7UVQ6ZC.mjs +183 -0
  85. package/lib/chunk-XW5NZAKI.mjs +82 -0
  86. package/lib/{chunk-LVSPEFU2.mjs → chunk-Z53IUBUN.mjs} +6 -5
  87. package/lib/{chunk-CD3HF3LK.mjs → chunk-Z7RM46Q4.mjs} +5 -11
  88. package/lib/chunk-ZB4IQ6VJ.mjs +46 -0
  89. package/lib/del-gradle.cjs +1 -1
  90. package/lib/del-gradle.mjs +22 -16
  91. package/lib/del-node-modules.cjs +1 -1
  92. package/lib/del-node-modules.mjs +148 -142
  93. package/lib/find-node-modules-cli.cjs +1 -1
  94. package/lib/find-node-modules-cli.mjs +10 -4
  95. package/lib/{git-diff-cli.cjs → git/git-diff-cli.cjs} +32 -12
  96. package/lib/{git-diff-cli.mjs → git/git-diff-cli.mjs} +7 -7
  97. package/lib/{git-diff.cjs → git/git-diff.cjs} +30 -10
  98. package/lib/{git-diff.js → git/git-diff.js} +3 -3
  99. package/lib/{git-diff.mjs → git/git-diff.mjs} +6 -6
  100. package/lib/{git-fix.cjs → git/git-fix.cjs} +142 -3
  101. package/lib/{git-fix.mjs → git/git-fix.mjs} +19 -14
  102. package/lib/{git-purge.cjs → git/git-purge.cjs} +1 -1
  103. package/lib/{git-purge.mjs → git/git-purge.mjs} +4 -4
  104. package/lib/git/user-config.cjs +139 -1
  105. package/lib/git/user-config.mjs +3 -1
  106. package/lib/{clean-github-actions-caches-cli.cjs → github-workflows/clean-github-actions-caches-cli.cjs} +46 -10
  107. package/lib/{clean-github-actions-caches-cli.mjs → github-workflows/clean-github-actions-caches-cli.mjs} +7 -6
  108. package/lib/{clean-github-actions-caches.cjs → github-workflows/clean-github-actions-caches.cjs} +46 -10
  109. package/lib/{clean-github-actions-caches.mjs → github-workflows/clean-github-actions-caches.mjs} +5 -4
  110. package/lib/github-workflows/generate-test-ci-step-cli.cjs +240 -0
  111. package/lib/github-workflows/generate-test-ci-step-cli.d.mts +2 -0
  112. package/lib/github-workflows/generate-test-ci-step-cli.mjs +132 -0
  113. package/lib/github-workflows/get-latest-workflow-status-cli.cjs +549 -0
  114. package/lib/github-workflows/get-latest-workflow-status-cli.d.mts +2 -0
  115. package/lib/github-workflows/get-latest-workflow-status-cli.mjs +61 -0
  116. package/lib/github-workflows/get-latest-workflow-status.cjs +56 -0
  117. package/lib/github-workflows/get-latest-workflow-status.d.mts +1 -0
  118. package/lib/github-workflows/get-latest-workflow-status.mjs +8 -0
  119. package/lib/github-workflows/utils.cjs +279 -0
  120. package/lib/github-workflows/utils.d.cts +76 -0
  121. package/lib/github-workflows/utils.mjs +8 -0
  122. package/lib/github-workflows/workflow-badge-cli.cjs +730 -0
  123. package/lib/github-workflows/workflow-badge-cli.d.mts +2 -0
  124. package/lib/github-workflows/workflow-badge-cli.mjs +98 -0
  125. package/lib/github-workflows/workflow-badge-generator.cjs +200 -0
  126. package/lib/github-workflows/workflow-badge-generator.d.mts +14 -0
  127. package/lib/github-workflows/workflow-badge-generator.mjs +8 -0
  128. package/lib/github-workflows/workflow-test-data.cjs +73 -0
  129. package/lib/github-workflows/workflow-test-data.d.cts +63 -0
  130. package/lib/github-workflows/workflow-test-data.mjs +6 -0
  131. package/lib/node-cache-cleaner-cli.mjs +3 -3
  132. package/lib/opencode/cli/auth-rotate.cjs +458 -0
  133. package/lib/opencode/cli/auth-rotate.d.ts +3 -0
  134. package/lib/opencode/cli/auth-rotate.js +65 -0
  135. package/lib/opencode/cli/auth-rotate.mjs +14 -0
  136. package/lib/opencode/cli/auth-rotate.runner.cjs +454 -0
  137. package/lib/opencode/cli/auth-rotate.runner.d.ts +1 -0
  138. package/lib/opencode/cli/auth-rotate.runner.js +8 -0
  139. package/lib/opencode/cli/auth-rotate.runner.mjs +21 -0
  140. package/lib/opencode/cli/list-projects.cjs +184 -0
  141. package/lib/opencode/cli/list-projects.d.ts +1 -0
  142. package/lib/opencode/cli/list-projects.js +32 -0
  143. package/lib/opencode/cli/list-projects.mjs +11 -0
  144. package/lib/opencode/cli/list-sessions.cjs +215 -0
  145. package/lib/opencode/cli/list-sessions.d.ts +1 -0
  146. package/lib/opencode/cli/list-sessions.js +45 -0
  147. package/lib/opencode/cli/list-sessions.mjs +11 -0
  148. package/lib/opencode/database.cjs +349 -0
  149. package/lib/opencode/database.d.ts +91 -0
  150. package/lib/opencode/database.js +252 -0
  151. package/lib/opencode/database.mjs +28 -0
  152. package/lib/opencode/database.runner.cjs +145 -0
  153. package/lib/opencode/database.runner.d.ts +1 -0
  154. package/lib/opencode/database.runner.js +56 -0
  155. package/lib/opencode/database.runner.mjs +37 -0
  156. package/lib/opencode/install-opencode-plugins-cli.cjs +82 -0
  157. package/lib/opencode/install-opencode-plugins-cli.d.ts +1 -0
  158. package/lib/opencode/install-opencode-plugins-cli.js +78 -0
  159. package/lib/opencode/install-opencode-plugins-cli.mjs +65 -0
  160. package/lib/opencode/opencode-zen.runner.cjs +48 -0
  161. package/lib/opencode/opencode-zen.runner.d.mts +1 -0
  162. package/lib/opencode/opencode-zen.runner.mjs +31 -0
  163. package/lib/opencode/sqlite.cjs +114 -0
  164. package/lib/opencode/sqlite.d.ts +18 -0
  165. package/lib/opencode/sqlite.js +82 -0
  166. package/lib/opencode/sqlite.mjs +10 -0
  167. package/lib/opencode/storage.cjs +124 -0
  168. package/lib/opencode/storage.d.ts +27 -0
  169. package/lib/opencode/storage.js +101 -0
  170. package/lib/opencode/storage.mjs +38 -0
  171. package/lib/opencode/storage.runner.cjs +50 -0
  172. package/lib/opencode/storage.runner.d.ts +1 -0
  173. package/lib/opencode/storage.runner.js +13 -0
  174. package/lib/opencode/storage.runner.mjs +29 -0
  175. package/lib/opencode/types.cjs +17 -0
  176. package/lib/opencode/types.d.ts +31 -0
  177. package/lib/opencode/types.js +2 -0
  178. package/lib/opencode/types.mjs +7 -0
  179. package/lib/opencode/utils/check-api.cjs +373 -0
  180. package/lib/opencode/utils/check-api.d.ts +16 -0
  181. package/lib/opencode/utils/check-api.js +132 -0
  182. package/lib/opencode/utils/check-api.mjs +12 -0
  183. package/lib/opencode/utils/check-api.runner.cjs +0 -0
  184. package/lib/opencode/utils/check-api.runner.d.ts +0 -0
  185. package/lib/opencode/utils/check-api.runner.js +1 -0
  186. package/lib/opencode/utils/check-api.runner.mjs +7 -0
  187. package/lib/opencode-cli.cjs +796 -0
  188. package/lib/opencode-cli.d.ts +2 -0
  189. package/lib/opencode-cli.js +116 -0
  190. package/lib/opencode-cli.mjs +116 -0
  191. package/lib/package-resolutions-updater-cli.cjs +189 -154
  192. package/lib/package-resolutions-updater-cli.mjs +3 -2
  193. package/lib/package-resolutions-updater.cjs +189 -154
  194. package/lib/package-resolutions-updater.d.mts +12 -3
  195. package/lib/package-resolutions-updater.mjs +3 -2
  196. package/lib/print-directory-tree.cjs +139 -3
  197. package/lib/print-directory-tree.mjs +6 -3
  198. package/lib/print-tarball-tree-cli.cjs +305 -0
  199. package/lib/print-tarball-tree-cli.d.mts +2 -0
  200. package/lib/print-tarball-tree-cli.mjs +54 -0
  201. package/lib/print-tarball-tree.cjs +43 -216
  202. package/lib/print-tarball-tree.d.mts +4 -1
  203. package/lib/print-tarball-tree.mjs +12 -66
  204. package/lib/rmpath-cli.cjs +139 -5
  205. package/lib/rmpath-cli.mjs +3 -1
  206. package/lib/rmpath.cjs +155 -11
  207. package/lib/rmpath.mjs +3 -1
  208. package/lib/run-by-checksum/hash.cjs +50 -56
  209. package/lib/run-by-checksum/hash.d.cts +24 -0
  210. package/lib/run-by-checksum/hash.mjs +3 -7
  211. package/lib/run-by-checksum/run.cjs +95 -42
  212. package/lib/run-by-checksum/run.js +3 -3
  213. package/lib/run-by-checksum/run.mjs +2 -2
  214. package/lib/run-by-checksum-cli.cjs +96 -58
  215. package/lib/run-by-checksum-cli.mjs +2 -2
  216. package/lib/submodule-install.cjs +138 -4
  217. package/lib/submodule-install.mjs +5 -4
  218. package/lib/submodule-remove-cli.cjs +139 -5
  219. package/lib/submodule-remove-cli.mjs +3 -1
  220. package/lib/submodule-remove.cjs +154 -5
  221. package/lib/submodule-remove.mjs +3 -1
  222. package/lib/utils/findEnvFiles.cjs +3 -0
  223. package/lib/utils/findEnvFiles.d.cts +2 -2
  224. package/lib/utils/findEnvFiles.mjs +1 -1
  225. package/lib/utils/isDebug.cjs +13 -0
  226. package/lib/utils/isDebug.d.cts +9 -0
  227. package/lib/utils/isDebug.mjs +6 -0
  228. package/lib/vscode/project.cjs +0 -0
  229. package/lib/vscode/project.d.ts +0 -0
  230. package/lib/vscode/project.js +1 -0
  231. package/lib/vscode/project.mjs +7 -0
  232. package/lib/vscode/storage.cjs +138 -0
  233. package/lib/vscode/storage.d.ts +51 -0
  234. package/lib/vscode/storage.js +169 -0
  235. package/lib/vscode/storage.mjs +42 -0
  236. package/lib/vscode/storage.runner.cjs +125 -0
  237. package/lib/vscode/storage.runner.d.ts +1 -0
  238. package/lib/vscode/storage.runner.js +47 -0
  239. package/lib/vscode/storage.runner.mjs +60 -0
  240. package/lib/vscode-cli.cjs +155 -0
  241. package/lib/vscode-cli.d.ts +2 -0
  242. package/lib/vscode-cli.js +80 -0
  243. package/lib/vscode-cli.mjs +71 -0
  244. package/package.json +50 -26
  245. package/readme.md +104 -8
  246. package/releases/readme.md +1 -1
  247. package/src/github-workflows/generate-test-ci-step-cli.mjs +126 -0
  248. package/vendor/clue/ndjson-react/README.md +365 -0
  249. package/vendor/composer/pcre/README.md +189 -0
  250. package/vendor/composer/semver/README.md +99 -0
  251. package/vendor/composer/xdebug-handler/README.md +305 -0
  252. package/vendor/ergebnis/agent-detector/README.md +107 -0
  253. package/vendor/evenement/evenement/README.md +64 -0
  254. package/vendor/fidry/cpu-core-counter/README.md +138 -0
  255. package/vendor/friendsofphp/php-cs-fixer/README.md +97 -0
  256. package/vendor/psr/container/README.md +13 -0
  257. package/vendor/psr/event-dispatcher/README.md +6 -0
  258. package/vendor/psr/log/README.md +58 -0
  259. package/vendor/react/cache/README.md +367 -0
  260. package/vendor/react/child-process/README.md +619 -0
  261. package/vendor/react/dns/README.md +453 -0
  262. package/vendor/react/event-loop/README.md +930 -0
  263. package/vendor/react/promise/README.md +722 -0
  264. package/vendor/react/socket/README.md +1564 -0
  265. package/vendor/react/stream/README.md +1249 -0
  266. package/vendor/sebastian/diff/README.md +151 -0
  267. package/vendor/symfony/console/README.md +30 -0
  268. package/vendor/symfony/deprecation-contracts/README.md +26 -0
  269. package/vendor/symfony/event-dispatcher/README.md +25 -0
  270. package/vendor/symfony/event-dispatcher-contracts/README.md +9 -0
  271. package/vendor/symfony/filesystem/README.md +23 -0
  272. package/vendor/symfony/finder/README.md +24 -0
  273. package/vendor/symfony/options-resolver/README.md +25 -0
  274. package/vendor/symfony/polyfill-ctype/README.md +12 -0
  275. package/vendor/symfony/polyfill-intl-grapheme/README.md +32 -0
  276. package/vendor/symfony/polyfill-intl-normalizer/README.md +14 -0
  277. package/vendor/symfony/polyfill-mbstring/README.md +13 -0
  278. package/vendor/symfony/polyfill-php80/README.md +25 -0
  279. package/vendor/symfony/polyfill-php81/README.md +18 -0
  280. package/vendor/symfony/polyfill-php84/README.md +23 -0
  281. package/vendor/symfony/polyfill-php85/README.md +20 -0
  282. package/vendor/symfony/process/README.md +23 -0
  283. package/vendor/symfony/service-contracts/README.md +9 -0
  284. package/vendor/symfony/stopwatch/README.md +52 -0
  285. package/vendor/symfony/string/README.md +24 -0
  286. package/lib/chunk-WSHVPGNM.mjs +0 -44
  287. package/lib/chunk-X2B3X7D4.mjs +0 -35
  288. package/lib/del-gradle.js +0 -16
  289. package/lib/del-node-modules.js +0 -211
  290. package/lib/find-node-modules-cli.js +0 -4
  291. package/lib/run-by-checksum/hash.d.ts +0 -14
  292. package/lib/run-by-checksum/hash.js +0 -85
  293. package/readme.html +0 -784
  294. /package/lib/{clean-github-actions-caches-cli.d.cts → del-gradle.d.cts} +0 -0
  295. /package/lib/{del-gradle.d.ts → del-node-modules.d.cts} +0 -0
  296. /package/lib/{find-node-modules-cli.d.ts → find-node-modules-cli.d.cts} +0 -0
  297. /package/lib/{git-diff-cli.d.ts → git/git-diff-cli.d.ts} +0 -0
  298. /package/lib/{git-diff-cli.js → git/git-diff-cli.js} +0 -0
  299. /package/lib/{git-diff.d.ts → git/git-diff.d.ts} +0 -0
  300. /package/lib/{git-fix.d.cts → git/git-fix.d.cts} +0 -0
  301. /package/lib/{git-purge.d.cts → git/git-purge.d.cts} +0 -0
  302. /package/lib/{del-node-modules.d.ts → github-workflows/clean-github-actions-caches-cli.d.cts} +0 -0
  303. /package/lib/{clean-github-actions-caches.d.cts → github-workflows/clean-github-actions-caches.d.cts} +0 -0
@@ -0,0 +1,730 @@
1
+ #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+ var __commonJS = (cb, mod) => function __require() {
12
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+
31
+ // node_modules/tsup/assets/cjs_shims.js
32
+ var init_cjs_shims = __esm({
33
+ "node_modules/tsup/assets/cjs_shims.js"() {
34
+ }
35
+ });
36
+
37
+ // src/utils/index.cjs
38
+ var require_utils = __commonJS({
39
+ "src/utils/index.cjs"(exports2, module2) {
40
+ init_cjs_shims();
41
+ var fs2 = require("fs");
42
+ var path2 = require("upath");
43
+ var minimistLib = require("minimist");
44
+ var argv = minimistLib(process.argv.slice(2));
45
+ var { exec } = require("child_process");
46
+ var { promisify } = require("util");
47
+ var execAsync = promisify(exec);
48
+ async function parseGitRemotes() {
49
+ try {
50
+ const { stdout } = await execAsync("git remote -v");
51
+ const lines = stdout.split("\n");
52
+ const remotes = {};
53
+ lines.forEach((line) => {
54
+ const [name, url] = line.split(" ");
55
+ if (name && url) {
56
+ const [repoUrl] = url.split(" ");
57
+ try {
58
+ const parsedUrl = new URL(repoUrl);
59
+ const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
60
+ if (parsedUrl.hostname === "github.com" && pathParts.length === 2) {
61
+ let repoPath = pathParts.join("/");
62
+ if (repoPath.endsWith(".git")) {
63
+ repoPath = repoPath.slice(0, -4);
64
+ }
65
+ remotes[name] = repoPath;
66
+ }
67
+ } catch (e) {
68
+ console.error("URL Parsing Error:", e.message);
69
+ }
70
+ }
71
+ });
72
+ return remotes;
73
+ } catch (error) {
74
+ console.error("Error:", error.message);
75
+ return {};
76
+ }
77
+ }
78
+ module2.exports.parseGitRemotes = parseGitRemotes;
79
+ function getArgs2(opts) {
80
+ if (opts) {
81
+ return minimistLib(process.argv.slice(2), opts);
82
+ }
83
+ return argv;
84
+ }
85
+ module2.exports.getArgs = getArgs2;
86
+ function del(fullPath) {
87
+ try {
88
+ if (!fs2.existsSync(fullPath)) return;
89
+ const stat = fs2.lstatSync(fullPath);
90
+ if (stat.isSymbolicLink()) {
91
+ try {
92
+ fs2.unlinkSync(fullPath);
93
+ console.log("deleted symlink", fullPath);
94
+ } catch (e) {
95
+ console.log("failed delete symlink", fullPath, e && e.message);
96
+ }
97
+ return;
98
+ }
99
+ if (stat.isDirectory()) {
100
+ const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
101
+ for (let i = 0; i < subdir.length; i++) {
102
+ del(subdir[i]);
103
+ }
104
+ try {
105
+ fs2.rmdirSync(fullPath);
106
+ console.log("deleted", fullPath);
107
+ } catch (_e) {
108
+ try {
109
+ fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
110
+ console.log("deleted", fullPath);
111
+ } catch (ee) {
112
+ console.log("failed delete", fullPath, ee && ee.message);
113
+ }
114
+ }
115
+ return;
116
+ }
117
+ try {
118
+ fs2.unlinkSync(fullPath);
119
+ console.log("deleted", fullPath);
120
+ } catch (_e) {
121
+ try {
122
+ fs2.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
123
+ console.log("deleted", fullPath);
124
+ } catch (ee) {
125
+ console.log("failed delete", fullPath, ee && ee.message);
126
+ }
127
+ }
128
+ } catch (err) {
129
+ console.log("failed delete", fullPath, err && err.message);
130
+ }
131
+ }
132
+ module2.exports.del = del;
133
+ function delStream(globStream) {
134
+ globStream.stream().on("data", (result) => {
135
+ const fullPath = path2.resolve(process.cwd(), result);
136
+ try {
137
+ if (fs2.existsSync(fullPath)) {
138
+ const stat = fs2.lstatSync(fullPath);
139
+ if (stat.isSymbolicLink()) {
140
+ try {
141
+ fs2.unlinkSync(fullPath);
142
+ console.log("deleted symlink", fullPath);
143
+ } catch (e) {
144
+ console.log("failed delete symlink", fullPath, e && e.message);
145
+ }
146
+ return;
147
+ }
148
+ if (stat.isDirectory()) {
149
+ const subdir = fs2.readdirSync(fullPath).map((dirPath) => path2.resolve(fullPath, dirPath));
150
+ for (let i = 0; i < subdir.length; i++) {
151
+ del(subdir[i]);
152
+ }
153
+ }
154
+ }
155
+ del(fullPath);
156
+ } catch (err) {
157
+ console.log("failed processing", fullPath, err && err.message);
158
+ }
159
+ });
160
+ }
161
+ module2.exports.delStream = delStream;
162
+ function getFileTreeString(hashArray) {
163
+ const tree = {};
164
+ const hashMap = {};
165
+ for (const entry of hashArray) {
166
+ const [filePath, hash] = entry.split(" ");
167
+ hashMap[filePath] = hash;
168
+ const parts = filePath.split("/");
169
+ let current = tree;
170
+ for (let i = 0; i < parts.length; i++) {
171
+ const part = parts[i];
172
+ if (i === parts.length - 1) {
173
+ current[part] = null;
174
+ } else {
175
+ current[part] = current[part] || {};
176
+ current = current[part];
177
+ }
178
+ }
179
+ }
180
+ function printNode(node, prefix = "", parentPath = "") {
181
+ const keys = Object.keys(node).sort();
182
+ let lines = [];
183
+ keys.forEach((key, idx) => {
184
+ const isLast = idx === keys.length - 1;
185
+ const branch = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
186
+ const currentPath = parentPath ? parentPath + "/" + key : key;
187
+ if (node[key] === null) {
188
+ lines.push(prefix + branch + key + " [" + (hashMap[currentPath] || "") + "]");
189
+ } else {
190
+ lines.push(prefix + branch + key + "/");
191
+ lines = lines.concat(printNode(node[key], prefix + (isLast ? " " : "\u2502 "), currentPath));
192
+ }
193
+ });
194
+ return lines;
195
+ }
196
+ return printNode(tree, "", "").join("\n");
197
+ }
198
+ module2.exports.getFileTreeString = getFileTreeString;
199
+ var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
200
+ module2.exports.delay = delay;
201
+ }
202
+ });
203
+
204
+ // src/utils/findEnvFiles.cjs
205
+ var require_findEnvFiles = __commonJS({
206
+ "src/utils/findEnvFiles.cjs"(exports2, module2) {
207
+ init_cjs_shims();
208
+ var fs2 = require("fs");
209
+ var path2 = require("path");
210
+ var glob = require("glob");
211
+ var DEFAULT_IGNORES = [
212
+ "**/node_modules/**",
213
+ "**/.git/**",
214
+ "**/.yarn/**",
215
+ "**/.pnpm/**",
216
+ "**/dist/**",
217
+ "**/build/**",
218
+ "**/coverage/**",
219
+ "**/vendor/**",
220
+ "**/tmp/**",
221
+ "**/.cache/**",
222
+ "**/assets/**",
223
+ "**/logs/**",
224
+ "**/output/**",
225
+ "**/public/**",
226
+ "**/static/**",
227
+ "**/temp/**",
228
+ "**/backup/**",
229
+ "**/backups/**",
230
+ "**/examples/**",
231
+ "**/docs/**",
232
+ "**/tests/**",
233
+ "**/__tests__/**",
234
+ "**/spec/**",
235
+ "**/__specs__/**",
236
+ "**/scripts/**",
237
+ "**/bin/**",
238
+ "**/hooks/**",
239
+ "**/config/**",
240
+ "**/configs/**",
241
+ "**/settings/**",
242
+ "**/.vscode/**",
243
+ "**/.idea/**"
244
+ ];
245
+ function findEnvFiles(startDir = process.cwd(), filter) {
246
+ const found = /* @__PURE__ */ new Set();
247
+ function addFile(file) {
248
+ const normalized = path2.normalize(file);
249
+ if (typeof filter === "function" && !filter(normalized)) {
250
+ return;
251
+ }
252
+ found.add(normalized);
253
+ }
254
+ let current = path2.resolve(startDir);
255
+ while (true) {
256
+ const envPath = path2.join(current, ".env");
257
+ if (fs2.existsSync(envPath)) {
258
+ addFile(envPath);
259
+ }
260
+ const parent = path2.dirname(current);
261
+ if (parent === current) {
262
+ break;
263
+ }
264
+ current = parent;
265
+ }
266
+ const files = glob.globSync("**/.env*", {
267
+ cwd: startDir,
268
+ absolute: true,
269
+ nodir: true,
270
+ ignore: DEFAULT_IGNORES
271
+ });
272
+ for (const file of files) {
273
+ addFile(file);
274
+ }
275
+ return [...found];
276
+ }
277
+ function findEnvWithToken(startDir = process.cwd(), tokenName = "GITHUB_TOKEN") {
278
+ const envFiles = findEnvFiles(startDir);
279
+ return envFiles.find((file) => {
280
+ try {
281
+ const content = fs2.readFileSync(file, "utf-8");
282
+ if (tokenName instanceof RegExp) {
283
+ return tokenName.test(content);
284
+ }
285
+ const regex = new RegExp(`^\\s*${tokenName}\\s*=`, "m");
286
+ return regex.test(content);
287
+ } catch (err) {
288
+ console.warn(`Failed to read ${file}: ${err instanceof Error ? err.message : String(err)}`);
289
+ return false;
290
+ }
291
+ });
292
+ }
293
+ module2.exports = {
294
+ DEFAULT_IGNORES,
295
+ findEnvFiles,
296
+ findEnvWithToken,
297
+ default: findEnvFiles
298
+ };
299
+ }
300
+ });
301
+
302
+ // src/binary-collections/config.cjs
303
+ var require_config = __commonJS({
304
+ "src/binary-collections/config.cjs"(exports2, module2) {
305
+ init_cjs_shims();
306
+ var path2 = require("upath");
307
+ var minimistLib = require("minimist");
308
+ var { findEnvWithToken } = require_findEnvFiles();
309
+ var dotenv = require("dotenv");
310
+ var { cosmiconfig } = require("cosmiconfig");
311
+ var loadDotenv = (tokenKey = /ACCESS_TOKEN|GITHUB_TOKEN/) => dotenv.config({ path: findEnvWithToken(void 0, tokenKey), quiet: true, overwrite: true });
312
+ loadDotenv();
313
+ var cliArgv = minimistLib(process.argv.slice(2), {
314
+ string: ["token"]
315
+ });
316
+ var GITHUB_ACCESS_TOKEN = cliArgv.token || process.env.ACCESS_TOKEN || process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
317
+ function getTempPath(...segments) {
318
+ return path2.join(process.env.TEMP_DIR || path2.join(process.cwd(), "tmp"), ...segments);
319
+ }
320
+ async function getConfig(options = {}) {
321
+ const explorer = cosmiconfig("binary-collections", {
322
+ searchStrategy: "project",
323
+ stopDir: options.stopDir
324
+ });
325
+ try {
326
+ const result = await explorer.search(options.searchFrom);
327
+ return result ? result.config : null;
328
+ } catch {
329
+ return null;
330
+ }
331
+ }
332
+ module2.exports = {
333
+ getTempPath,
334
+ GITHUB_ACCESS_TOKEN,
335
+ loadDotenv,
336
+ getConfig
337
+ };
338
+ }
339
+ });
340
+
341
+ // src/github-workflows/utils.cjs
342
+ var require_utils2 = __commonJS({
343
+ "src/github-workflows/utils.cjs"(exports2, module2) {
344
+ init_cjs_shims();
345
+ var axios = require("axios");
346
+ var { spawn } = require("cross-spawn");
347
+ var { GITHUB_ACCESS_TOKEN: TOKEN } = require_config();
348
+ if (!TOKEN) {
349
+ console.error("Missing env var: ACCESS_TOKEN or GITHUB_TOKEN");
350
+ process.exit(1);
351
+ }
352
+ var BASE = "https://api.github.com";
353
+ var HEADERS = {
354
+ Authorization: `Bearer ${TOKEN}`,
355
+ Accept: "application/vnd.github+json",
356
+ "X-GitHub-Api-Version": "2022-11-28"
357
+ };
358
+ async function request(url) {
359
+ try {
360
+ const res = await axios.get(url, { headers: HEADERS });
361
+ return res.data;
362
+ } catch (err) {
363
+ if (err == null ? void 0 : err.response) {
364
+ const statusText = err.response.statusText || "Request failed";
365
+ const responseText = typeof err.response.data === "string" ? err.response.data : JSON.stringify(err.response.data);
366
+ throw new Error(`${err.response.status} ${statusText}
367
+ ${responseText}`);
368
+ }
369
+ throw err;
370
+ }
371
+ }
372
+ function runGit(args) {
373
+ return new Promise((resolve, reject) => {
374
+ var _a, _b;
375
+ const child = spawn("git", args, {
376
+ cwd: process.cwd(),
377
+ stdio: ["ignore", "pipe", "pipe"]
378
+ });
379
+ let stdout = "";
380
+ let stderr = "";
381
+ (_a = child.stdout) == null ? void 0 : _a.on("data", (chunk) => {
382
+ stdout += chunk.toString();
383
+ });
384
+ (_b = child.stderr) == null ? void 0 : _b.on("data", (chunk) => {
385
+ stderr += chunk.toString();
386
+ });
387
+ child.on("error", reject);
388
+ child.on("close", (code) => {
389
+ if (code === 0) return resolve(stdout.trim());
390
+ reject(new Error(stderr.trim() || `git ${args.join(" ")} exited with code ${code}`));
391
+ });
392
+ });
393
+ }
394
+ function parseOwnerFromUrl(remoteUrl) {
395
+ const normalized = remoteUrl.trim().replace(/\.git$/i, "");
396
+ const match = normalized.match(/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/]+)$/i);
397
+ return (match == null ? void 0 : match.groups) || null;
398
+ }
399
+ function getOwnerFromRemoteUrl(remoteUrl) {
400
+ const parsed = parseOwnerFromUrl(remoteUrl);
401
+ return (parsed == null ? void 0 : parsed.owner) || null;
402
+ }
403
+ function getRepoFromRemoteUrl(remoteUrl) {
404
+ const parsed = parseOwnerFromUrl(remoteUrl);
405
+ return (parsed == null ? void 0 : parsed.repo) || null;
406
+ }
407
+ async function getCurrentOwner() {
408
+ const commands = [
409
+ ["config", "--local", "--get", "remote.origin.url"],
410
+ ["remote", "get-url", "origin"]
411
+ ];
412
+ for (const args of commands) {
413
+ try {
414
+ const remoteUrl = await runGit(args);
415
+ const owner = getOwnerFromRemoteUrl(remoteUrl);
416
+ if (owner) return owner;
417
+ } catch {
418
+ }
419
+ }
420
+ throw new Error("Unable to determine repository owner from git remote.origin.url");
421
+ }
422
+ async function getCurrentRepo() {
423
+ const commands = [
424
+ ["config", "--local", "--get", "remote.origin.url"],
425
+ ["remote", "get-url", "origin"]
426
+ ];
427
+ for (const args of commands) {
428
+ try {
429
+ const remoteUrl = await runGit(args);
430
+ const repo = getRepoFromRemoteUrl(remoteUrl);
431
+ if (repo) return repo;
432
+ } catch {
433
+ }
434
+ }
435
+ throw new Error("Unable to determine repository name from git remote.origin.url");
436
+ }
437
+ async function getOwnerRepo2() {
438
+ const owner = await getCurrentOwner();
439
+ const repo = await getCurrentRepo();
440
+ return { owner, repo };
441
+ }
442
+ async function getLatestRun2(owner, repo, workflowId) {
443
+ var _a;
444
+ let url;
445
+ if (workflowId) {
446
+ url = `${BASE}/repos/${owner}/${repo}/actions/workflows/${encodeURIComponent(workflowId)}/runs?per_page=1`;
447
+ } else {
448
+ url = `${BASE}/repos/${owner}/${repo}/actions/runs?per_page=1`;
449
+ }
450
+ const data = await request(url);
451
+ return (_a = data.workflow_runs) == null ? void 0 : _a[0];
452
+ }
453
+ async function getJobs2(owner, repo, runId) {
454
+ const data = await request(`${BASE}/repos/${owner}/${repo}/actions/runs/${runId}/jobs`);
455
+ return data.jobs || [];
456
+ }
457
+ module2.exports = {
458
+ BASE,
459
+ HEADERS,
460
+ request,
461
+ runGit,
462
+ parseOwnerFromUrl,
463
+ getOwnerFromRemoteUrl,
464
+ getRepoFromRemoteUrl,
465
+ getCurrentOwner,
466
+ getCurrentRepo,
467
+ getOwnerRepo: getOwnerRepo2,
468
+ getLatestRun: getLatestRun2,
469
+ getJobs: getJobs2
470
+ };
471
+ }
472
+ });
473
+
474
+ // src/github-workflows/workflow-badge-cli.mjs
475
+ init_cjs_shims();
476
+ var import_fs = __toESM(require("fs"), 1);
477
+ var import_upath = __toESM(require("upath"), 1);
478
+ var import_utils = __toESM(require_utils(), 1);
479
+
480
+ // src/github-workflows/workflow-badge-generator.mjs
481
+ init_cjs_shims();
482
+ var COLORS = {
483
+ success: "#2da44e",
484
+ failure: "#cf222e",
485
+ cancelled: "#656d76",
486
+ skipped: "#656d76",
487
+ inProgress: "#d4920b",
488
+ pending: "#656d76",
489
+ unknown: "#656d76",
490
+ text: "#1f2328",
491
+ textSecondary: "#656d76",
492
+ border: "#d0d7de",
493
+ bg: "#ffffff",
494
+ cardBg: "#f6f8fa"
495
+ };
496
+ function getStatusMeta(run) {
497
+ const { status, conclusion } = run;
498
+ if (conclusion === "success") return { label: "Passing", color: COLORS.success };
499
+ if (conclusion === "failure") return { label: "Failing", color: COLORS.failure };
500
+ if (conclusion === "cancelled") return { label: "Cancelled", color: COLORS.cancelled };
501
+ if (conclusion === "skipped") return { label: "Skipped", color: COLORS.skipped };
502
+ if (status === "in_progress") return { label: "In Progress", color: COLORS.inProgress };
503
+ if (status === "queued" || status === "pending") return { label: "Pending", color: COLORS.pending };
504
+ return { label: status || "Unknown", color: COLORS.unknown };
505
+ }
506
+ function esc(str) {
507
+ return String(str).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
508
+ }
509
+ function countSteps(jobs) {
510
+ let total = 0, passed = 0, failed = 0, skipped = 0, pending = 0;
511
+ for (const job of jobs) {
512
+ for (const step of job.steps || []) {
513
+ total++;
514
+ if (step.conclusion === "success") passed++;
515
+ else if (step.conclusion === "failure") failed++;
516
+ else if (step.conclusion === "skipped") skipped++;
517
+ else pending++;
518
+ }
519
+ }
520
+ return { total, passed, failed, skipped, pending };
521
+ }
522
+ function jobColor(job) {
523
+ if (job.conclusion === "success") return COLORS.success;
524
+ if (job.conclusion === "failure") return COLORS.failure;
525
+ if (job.status === "in_progress") return COLORS.inProgress;
526
+ return COLORS.pending;
527
+ }
528
+ function generateBadge(run, jobs, options = {}) {
529
+ const width = options.width || 520;
530
+ const maxSteps = options.maxSteps;
531
+ const { label: statusLabel, color: accentColor } = getStatusMeta(run);
532
+ const steps = countSteps(jobs);
533
+ const PAD = 20;
534
+ const W = width;
535
+ const RIGHT = width - PAD;
536
+ const INNER_W = RIGHT - PAD;
537
+ const els = [];
538
+ const el = (str) => els.push(str);
539
+ const LABEL_X = PAD;
540
+ const VALUE_X = 110;
541
+ let yCursor = 0;
542
+ const divider = () => {
543
+ yCursor += 4;
544
+ el(`<line x1="${PAD}" y1="${yCursor}" x2="${RIGHT}" y2="${yCursor}" stroke="${COLORS.border}" stroke-width="1"/>`);
545
+ yCursor += 5;
546
+ };
547
+ const sectionHeading = (text) => {
548
+ yCursor += 8;
549
+ el(
550
+ `<text x="${PAD}" y="${yCursor + 13}" font-size="11" font-weight="700" fill="${COLORS.textSecondary}" letter-spacing="0.5">${esc(text)}</text>`
551
+ );
552
+ yCursor += 22;
553
+ };
554
+ el(`<rect x="0" y="0" width="${W}" height="4" fill="${accentColor}"/>`);
555
+ yCursor = 4;
556
+ yCursor += 14;
557
+ const titleBaseline = yCursor + 15;
558
+ el(
559
+ `<text x="${PAD}" y="${titleBaseline}" font-size="15" font-weight="700" fill="${COLORS.text}">Workflow Status</text>`
560
+ );
561
+ const pillText = statusLabel;
562
+ const pillTextW = pillText.length * 7.8 + 32;
563
+ const pillX = RIGHT - pillTextW;
564
+ const pillY = titleBaseline - 12;
565
+ el(`<rect x="${pillX}" y="${pillY}" width="${pillTextW}" height="22" rx="11" fill="${accentColor}" opacity="0.12"/>`);
566
+ el(`<circle cx="${pillX + 14}" cy="${titleBaseline - 2}" r="4.5" fill="${accentColor}"/>`);
567
+ el(
568
+ `<text x="${pillX + 24}" y="${titleBaseline + 1}" font-size="12" font-weight="600" fill="${accentColor}">${esc(pillText)}</text>`
569
+ );
570
+ yCursor = titleBaseline + 4;
571
+ divider();
572
+ const metaRows = [
573
+ { label: "Workflow", value: run.name || "" },
574
+ { label: "Status", value: `${run.status}${run.conclusion ? ` (${run.conclusion})` : ""}` },
575
+ { label: "Branch", value: run.head_branch || "" },
576
+ { label: "Run ID", value: `#${run.id || ""}` }
577
+ ];
578
+ for (const row of metaRows) {
579
+ const rowBaseline = yCursor + 14;
580
+ el(
581
+ `<text x="${LABEL_X}" y="${rowBaseline}" font-size="12" fill="${COLORS.textSecondary}">${esc(row.label)}</text>`
582
+ );
583
+ el(
584
+ `<text x="${VALUE_X}" y="${rowBaseline}" font-size="13" fill="${COLORS.text}" font-weight="500">${esc(row.value)}</text>`
585
+ );
586
+ yCursor += 22;
587
+ }
588
+ divider();
589
+ sectionHeading("JOBS");
590
+ for (const job of jobs) {
591
+ const jColor = jobColor(job);
592
+ const jStatus = job.conclusion || job.status;
593
+ el(`<rect x="${PAD}" y="${yCursor}" width="${INNER_W}" height="28" rx="6" fill="${COLORS.cardBg}"/>`);
594
+ el(
595
+ `<text x="${PAD + 10}" y="${yCursor + 18}" font-size="13" font-weight="600" fill="${COLORS.text}">${esc(job.name)}</text>`
596
+ );
597
+ const jobStatusX = RIGHT - 14;
598
+ el(`<circle cx="${jobStatusX - 16}" cy="${yCursor + 14}" r="3.5" fill="${jColor}"/>`);
599
+ el(
600
+ `<text x="${jobStatusX}" y="${yCursor + 18}" font-size="11" fill="${COLORS.textSecondary}" text-anchor="end">${esc(jStatus)}</text>`
601
+ );
602
+ yCursor += 34;
603
+ if (job.steps && job.steps.length > 0) {
604
+ const stepsToRender = maxSteps ? job.steps.slice(0, maxSteps) : job.steps;
605
+ const hiddenCount = maxSteps ? job.steps.length - maxSteps : 0;
606
+ for (const step of stepsToRender) {
607
+ const sIcon = step.conclusion === "success" ? "\u2713" : step.conclusion === "failure" ? "\u2717" : step.conclusion === "skipped" ? "\u2013" : "\u25CB";
608
+ const sColor = step.conclusion === "success" ? COLORS.success : step.conclusion === "failure" ? COLORS.failure : step.conclusion === "skipped" ? COLORS.textSecondary : COLORS.inProgress;
609
+ el(`<text x="${PAD + 18}" y="${yCursor + 13}" font-size="12" fill="${sColor}">${sIcon}</text>`);
610
+ let stepName = step.name || "";
611
+ const maxChars = 52;
612
+ if (stepName.length > maxChars) {
613
+ stepName = stepName.slice(0, maxChars - 3) + "...";
614
+ }
615
+ el(`<text x="${PAD + 36}" y="${yCursor + 13}" font-size="12" fill="${COLORS.text}">${esc(stepName)}</text>`);
616
+ const stepStatus = step.conclusion || step.status || "";
617
+ el(
618
+ `<text x="${RIGHT}" y="${yCursor + 13}" font-size="11" fill="${COLORS.textSecondary}" text-anchor="end">${esc(stepStatus)}</text>`
619
+ );
620
+ yCursor += 20;
621
+ }
622
+ if (hiddenCount > 0) {
623
+ el(
624
+ `<text x="${PAD + 18}" y="${yCursor + 13}" font-size="12" fill="${COLORS.textSecondary}" font-style="italic">and ${hiddenCount} more step${hiddenCount !== 1 ? "s" : ""}...</text>`
625
+ );
626
+ yCursor += 20;
627
+ }
628
+ yCursor += 4;
629
+ }
630
+ }
631
+ divider();
632
+ const footerParts = [];
633
+ if (steps.passed > 0) footerParts.push(`${steps.passed} \u2713 passed`);
634
+ if (steps.failed > 0) footerParts.push(`${steps.failed} \u2717 failed`);
635
+ if (steps.pending > 0) footerParts.push(`${steps.pending} \u25CB pending`);
636
+ if (steps.skipped > 0) footerParts.push(`${steps.skipped} \u2013 skipped`);
637
+ const footerText = footerParts.length > 0 ? footerParts.join(" \xB7 ") : "No steps recorded";
638
+ el(`<text x="${PAD}" y="${yCursor + 13}" font-size="12" fill="${COLORS.textSecondary}">${esc(footerText)}</text>`);
639
+ yCursor += 22;
640
+ const totalHeight = yCursor + 6;
641
+ const svg = [
642
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${totalHeight}" viewBox="0 0 ${W} ${totalHeight}" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif">`,
643
+ ` <defs>`,
644
+ ` <filter id="badge-shadow" x="-2%" y="-2%" width="104%" height="104%">`,
645
+ ` <feDropShadow dx="0" dy="1" stdDeviation="3" flood-color="#000" flood-opacity="0.12"/>`,
646
+ ` </filter>`,
647
+ ` </defs>`,
648
+ ` <rect x="0.5" y="0.5" width="${W - 1}" height="${totalHeight - 1}" rx="8" fill="${COLORS.bg}" stroke="${COLORS.border}" stroke-width="1" filter="url(#badge-shadow)"/>`,
649
+ ...els,
650
+ `</svg>`
651
+ ].join("\n");
652
+ return svg;
653
+ }
654
+
655
+ // src/github-workflows/workflow-badge-cli.mjs
656
+ var import_utils2 = __toESM(require_utils2(), 1);
657
+ var HELP = `
658
+ Usage: workflow-badge [options]
659
+
660
+ Generate a detailed SVG badge for the latest GitHub Actions workflow status.
661
+
662
+ Options:
663
+ -o, --output <file> Write SVG to file instead of stdout
664
+ --owner <owner> GitHub repository owner (default: auto-detect from git)
665
+ --repo <repo> GitHub repository name (default: auto-detect from git)
666
+ --workflow <name> Filter by workflow filename (e.g. "test.yml") or workflow ID
667
+ --token <token> GitHub access token (overrides env: ACCESS_TOKEN, GITHUB_TOKEN, GH_TOKEN)
668
+ --width <px> SVG width in pixels (default: 520)
669
+ --max-steps <n> Max steps to show per job (default: all)
670
+ -h, --help Show this help message
671
+
672
+ Examples:
673
+ workflow-badge
674
+ workflow-badge --output badge.svg
675
+ workflow-badge --owner dimaslanjaka --repo bin --width 600
676
+ `;
677
+ async function main() {
678
+ const argv = (0, import_utils.getArgs)({
679
+ string: ["output", "owner", "repo", "workflow", "width", "max-steps"],
680
+ boolean: ["help"],
681
+ alias: { o: "output", h: "help", w: "width" }
682
+ });
683
+ if (argv.help) {
684
+ console.log(HELP);
685
+ process.exit(0);
686
+ }
687
+ const owner = argv.owner || process.env.GH_OWNER;
688
+ const repo = argv.repo || process.env.GH_REPO;
689
+ if (owner && repo) {
690
+ console.error(`[workflow-badge] Using owner=${owner} repo=${repo}`);
691
+ } else {
692
+ const parsed = await (0, import_utils2.getOwnerRepo)();
693
+ if (!owner) argv.owner = parsed.owner;
694
+ if (!repo) argv.repo = parsed.repo;
695
+ console.error(`[workflow-badge] Detected ${parsed.owner}/${parsed.repo} from git remote`);
696
+ }
697
+ const finalOwner = argv.owner || owner;
698
+ const finalRepo = argv.repo || repo;
699
+ const workflowId = argv.workflow;
700
+ const target = workflowId ? `${finalOwner}/${finalRepo} (workflow: ${workflowId})` : `${finalOwner}/${finalRepo}`;
701
+ console.error(`[workflow-badge] Fetching latest workflow for ${target} ...`);
702
+ const run = await (0, import_utils2.getLatestRun)(finalOwner, finalRepo, workflowId);
703
+ if (!run) {
704
+ console.error("[workflow-badge] No workflow runs found.");
705
+ process.exit(1);
706
+ }
707
+ const jobs = await (0, import_utils2.getJobs)(finalOwner, finalRepo, run.id);
708
+ console.error(
709
+ `[workflow-badge] Run #${run.id}: ${run.status}${run.conclusion ? ` (${run.conclusion})` : ""} \u2014 ${jobs.length} job(s)`
710
+ );
711
+ const maxSteps = argv["max-steps"] ? parseInt(argv["max-steps"], 10) : void 0;
712
+ const options = { width: parseInt(argv.width, 10) || 520 };
713
+ if (maxSteps !== void 0) options.maxSteps = maxSteps;
714
+ const svg = generateBadge(run, jobs, options);
715
+ if (argv.output) {
716
+ const outPath = import_upath.default.resolve(argv.output);
717
+ const outDir = import_upath.default.dirname(outPath);
718
+ if (!import_fs.default.existsSync(outDir)) {
719
+ import_fs.default.mkdirSync(outDir, { recursive: true });
720
+ }
721
+ import_fs.default.writeFileSync(outPath, svg, "utf-8");
722
+ console.error(`[workflow-badge] Badge written to ${outPath}`);
723
+ } else {
724
+ process.stdout.write(svg);
725
+ }
726
+ }
727
+ main().catch((err) => {
728
+ console.error("[workflow-badge] Error:", err.message);
729
+ process.exit(1);
730
+ });