@feiyoug/skill-lab 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/README.md +73 -0
  2. package/esm/analyzer/astgrep/client.d.ts +20 -8
  3. package/esm/analyzer/astgrep/client.d.ts.map +1 -1
  4. package/esm/analyzer/astgrep/client.js +58 -31
  5. package/esm/analyzer/config/default.d.ts +8 -0
  6. package/esm/analyzer/config/default.d.ts.map +1 -0
  7. package/esm/analyzer/config/default.js +91 -0
  8. package/esm/analyzer/config/helpers.d.ts +8 -0
  9. package/esm/analyzer/config/helpers.d.ts.map +1 -0
  10. package/esm/analyzer/config/helpers.js +72 -0
  11. package/esm/analyzer/config/mod.d.ts +4 -0
  12. package/esm/analyzer/config/mod.d.ts.map +1 -0
  13. package/esm/analyzer/config/mod.js +3 -0
  14. package/esm/analyzer/config/types.d.ts +58 -0
  15. package/esm/analyzer/config/types.d.ts.map +1 -0
  16. package/esm/analyzer/{config.js → config/types.js} +0 -28
  17. package/esm/analyzer/logging.d.ts +3 -0
  18. package/esm/analyzer/logging.d.ts.map +1 -0
  19. package/esm/analyzer/logging.js +6 -0
  20. package/esm/analyzer/mod.d.ts +12 -5
  21. package/esm/analyzer/mod.d.ts.map +1 -1
  22. package/esm/analyzer/mod.js +25 -12
  23. package/esm/analyzer/result.d.ts +35 -0
  24. package/esm/analyzer/result.d.ts.map +1 -0
  25. package/esm/analyzer/result.js +311 -0
  26. package/esm/analyzer/rules/bash/commands/mod.d.ts +1 -0
  27. package/esm/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
  28. package/esm/analyzer/rules/bash/commands/mod.js +3 -0
  29. package/esm/analyzer/rules/bash/commands/pip.d.ts +3 -0
  30. package/esm/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
  31. package/esm/analyzer/rules/bash/commands/pip.js +14 -0
  32. package/esm/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
  33. package/esm/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
  34. package/esm/analyzer/rules/bash/extractFileRefs.js +2 -2
  35. package/esm/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
  36. package/esm/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
  37. package/esm/analyzer/rules/bash/inline-command-classifier.js +4 -4
  38. package/esm/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
  39. package/esm/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
  40. package/esm/analyzer/rules/javascript/extractFileRefs.js +3 -4
  41. package/esm/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
  42. package/esm/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
  43. package/esm/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
  44. package/esm/analyzer/rules/markdown/extractFileRefs.js +2 -0
  45. package/esm/analyzer/rules/python/extractFileRefs.d.ts +1 -1
  46. package/esm/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
  47. package/esm/analyzer/rules/python/extractFileRefs.js +2 -2
  48. package/esm/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
  49. package/esm/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
  50. package/esm/analyzer/steps/001-discovery/discover-files.js +18 -2
  51. package/esm/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
  52. package/esm/analyzer/steps/001-discovery/mod.js +39 -9
  53. package/esm/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
  54. package/esm/analyzer/steps/002-permissions/mod.js +156 -73
  55. package/esm/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
  56. package/esm/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
  57. package/esm/analyzer/steps/002-permissions/scan-file.js +40 -5
  58. package/esm/analyzer/steps/002-permissions/seed-frontmatter.js +2 -2
  59. package/esm/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
  60. package/esm/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
  61. package/esm/analyzer/steps/003-risks/dep-risks.js +74 -0
  62. package/esm/analyzer/steps/003-risks/helpers.d.ts +1 -0
  63. package/esm/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
  64. package/esm/analyzer/steps/003-risks/helpers.js +1 -0
  65. package/esm/analyzer/steps/003-risks/mod.d.ts +3 -2
  66. package/esm/analyzer/steps/003-risks/mod.d.ts.map +1 -1
  67. package/esm/analyzer/steps/003-risks/mod.js +41 -4
  68. package/esm/analyzer/steps/003-risks/policy.d.ts +7 -0
  69. package/esm/analyzer/steps/003-risks/policy.d.ts.map +1 -0
  70. package/esm/analyzer/steps/003-risks/policy.js +23 -0
  71. package/esm/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
  72. package/esm/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
  73. package/esm/analyzer/steps/003-risks/rule-mapped.js +83 -2
  74. package/esm/analyzer/steps/003-risks/scoring.d.ts +9 -1
  75. package/esm/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
  76. package/esm/analyzer/steps/003-risks/scoring.js +55 -42
  77. package/esm/analyzer/treesitter/client.d.ts +31 -0
  78. package/esm/analyzer/treesitter/client.d.ts.map +1 -0
  79. package/esm/analyzer/{treesiter → treesitter}/client.js +43 -39
  80. package/esm/analyzer/treesitter/registry.d.ts +73 -0
  81. package/esm/analyzer/treesitter/registry.d.ts.map +1 -0
  82. package/esm/analyzer/treesitter/registry.js +165 -0
  83. package/esm/analyzer/types.d.ts +14 -28
  84. package/esm/analyzer/types.d.ts.map +1 -1
  85. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
  86. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
  87. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +3 -0
  88. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
  89. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
  90. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +297 -0
  91. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
  92. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
  93. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +268 -0
  94. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
  95. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
  96. package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.js +45 -0
  97. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
  98. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
  99. package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.js +903 -0
  100. package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
  101. package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
  102. package/esm/deps/jsr.io/@std/io/0.225.0/types.js +15 -0
  103. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
  104. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
  105. package/esm/deps/jsr.io/@std/io/0.225.0/write_all.js +61 -0
  106. package/esm/shared/deep_merge.d.ts +12 -0
  107. package/esm/shared/deep_merge.d.ts.map +1 -0
  108. package/esm/shared/deep_merge.js +49 -0
  109. package/esm/shared/mod.d.ts +1 -0
  110. package/esm/shared/mod.d.ts.map +1 -1
  111. package/esm/shared/mod.js +1 -0
  112. package/esm/shared/types/filetypes.d.ts +2 -2
  113. package/esm/shared/types/filetypes.d.ts.map +1 -1
  114. package/esm/shared/types/permissions.d.ts +1 -1
  115. package/esm/shared/types/permissions.d.ts.map +1 -1
  116. package/esm/shared/types/risks.d.ts +4 -1
  117. package/esm/shared/types/risks.d.ts.map +1 -1
  118. package/esm/skillreader/types.d.ts +2 -2
  119. package/esm/skillreader/types.d.ts.map +1 -1
  120. package/esm/skillreader/types.js +2 -2
  121. package/package.json +1 -1
  122. package/script/analyzer/astgrep/client.d.ts +20 -8
  123. package/script/analyzer/astgrep/client.d.ts.map +1 -1
  124. package/script/analyzer/astgrep/client.js +58 -64
  125. package/script/analyzer/config/default.d.ts +8 -0
  126. package/script/analyzer/config/default.d.ts.map +1 -0
  127. package/script/analyzer/config/default.js +94 -0
  128. package/script/analyzer/config/helpers.d.ts +8 -0
  129. package/script/analyzer/config/helpers.d.ts.map +1 -0
  130. package/script/analyzer/config/helpers.js +76 -0
  131. package/script/analyzer/config/mod.d.ts +4 -0
  132. package/script/analyzer/config/mod.d.ts.map +1 -0
  133. package/script/analyzer/config/mod.js +21 -0
  134. package/script/analyzer/config/types.d.ts +58 -0
  135. package/script/analyzer/config/types.d.ts.map +1 -0
  136. package/script/analyzer/{config.js → config/types.js} +1 -29
  137. package/script/analyzer/logging.d.ts +3 -0
  138. package/script/analyzer/logging.d.ts.map +1 -0
  139. package/script/analyzer/logging.js +9 -0
  140. package/script/analyzer/mod.d.ts +12 -5
  141. package/script/analyzer/mod.d.ts.map +1 -1
  142. package/script/analyzer/mod.js +35 -20
  143. package/script/analyzer/result.d.ts +35 -0
  144. package/script/analyzer/result.d.ts.map +1 -0
  145. package/script/analyzer/result.js +315 -0
  146. package/script/analyzer/rules/bash/commands/mod.d.ts +1 -0
  147. package/script/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
  148. package/script/analyzer/rules/bash/commands/mod.js +3 -0
  149. package/script/analyzer/rules/bash/commands/pip.d.ts +3 -0
  150. package/script/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
  151. package/script/analyzer/rules/bash/commands/pip.js +17 -0
  152. package/script/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
  153. package/script/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
  154. package/script/analyzer/rules/bash/extractFileRefs.js +2 -2
  155. package/script/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
  156. package/script/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
  157. package/script/analyzer/rules/bash/inline-command-classifier.js +4 -4
  158. package/script/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
  159. package/script/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
  160. package/script/analyzer/rules/javascript/extractFileRefs.js +3 -4
  161. package/script/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
  162. package/script/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
  163. package/script/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
  164. package/script/analyzer/rules/markdown/extractFileRefs.js +2 -0
  165. package/script/analyzer/rules/python/extractFileRefs.d.ts +1 -1
  166. package/script/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
  167. package/script/analyzer/rules/python/extractFileRefs.js +2 -2
  168. package/script/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
  169. package/script/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
  170. package/script/analyzer/steps/001-discovery/discover-files.js +18 -2
  171. package/script/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
  172. package/script/analyzer/steps/001-discovery/mod.js +77 -11
  173. package/script/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
  174. package/script/analyzer/steps/002-permissions/mod.js +194 -75
  175. package/script/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
  176. package/script/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
  177. package/script/analyzer/steps/002-permissions/scan-file.js +40 -5
  178. package/script/analyzer/steps/002-permissions/seed-frontmatter.js +3 -3
  179. package/script/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
  180. package/script/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
  181. package/script/analyzer/steps/003-risks/dep-risks.js +77 -0
  182. package/script/analyzer/steps/003-risks/helpers.d.ts +1 -0
  183. package/script/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
  184. package/script/analyzer/steps/003-risks/helpers.js +1 -0
  185. package/script/analyzer/steps/003-risks/mod.d.ts +3 -2
  186. package/script/analyzer/steps/003-risks/mod.d.ts.map +1 -1
  187. package/script/analyzer/steps/003-risks/mod.js +77 -4
  188. package/script/analyzer/steps/003-risks/policy.d.ts +7 -0
  189. package/script/analyzer/steps/003-risks/policy.d.ts.map +1 -0
  190. package/script/analyzer/steps/003-risks/policy.js +29 -0
  191. package/script/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
  192. package/script/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
  193. package/script/analyzer/steps/003-risks/rule-mapped.js +83 -2
  194. package/script/analyzer/steps/003-risks/scoring.d.ts +9 -1
  195. package/script/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
  196. package/script/analyzer/steps/003-risks/scoring.js +55 -42
  197. package/script/analyzer/treesitter/client.d.ts +31 -0
  198. package/script/analyzer/treesitter/client.d.ts.map +1 -0
  199. package/script/analyzer/treesitter/client.js +136 -0
  200. package/script/analyzer/treesitter/registry.d.ts +73 -0
  201. package/script/analyzer/treesitter/registry.d.ts.map +1 -0
  202. package/script/analyzer/treesitter/registry.js +206 -0
  203. package/script/analyzer/types.d.ts +14 -28
  204. package/script/analyzer/types.d.ts.map +1 -1
  205. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
  206. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
  207. package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +10 -0
  208. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
  209. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
  210. package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +334 -0
  211. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
  212. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
  213. package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +305 -0
  214. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
  215. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
  216. package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.js +48 -0
  217. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
  218. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
  219. package/script/deps/jsr.io/@std/fmt/1.0.3/colors.js +986 -0
  220. package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
  221. package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
  222. package/script/deps/jsr.io/@std/io/0.225.0/types.js +18 -0
  223. package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
  224. package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
  225. package/script/deps/jsr.io/@std/io/0.225.0/write_all.js +65 -0
  226. package/script/shared/deep_merge.d.ts +12 -0
  227. package/script/shared/deep_merge.d.ts.map +1 -0
  228. package/script/shared/deep_merge.js +53 -0
  229. package/script/shared/mod.d.ts +1 -0
  230. package/script/shared/mod.d.ts.map +1 -1
  231. package/script/shared/mod.js +1 -0
  232. package/script/shared/types/filetypes.d.ts +2 -2
  233. package/script/shared/types/filetypes.d.ts.map +1 -1
  234. package/script/shared/types/permissions.d.ts +1 -1
  235. package/script/shared/types/permissions.d.ts.map +1 -1
  236. package/script/shared/types/risks.d.ts +4 -1
  237. package/script/shared/types/risks.d.ts.map +1 -1
  238. package/script/skillreader/types.d.ts +2 -2
  239. package/script/skillreader/types.d.ts.map +1 -1
  240. package/script/skillreader/types.js +2 -2
  241. package/src/_dnt.polyfills.ts +27 -0
  242. package/src/_dnt.shims.ts +64 -0
  243. package/src/analyzer/astgrep/client.ts +184 -0
  244. package/src/analyzer/astgrep/mod.ts +2 -0
  245. package/src/analyzer/config/default.ts +98 -0
  246. package/src/analyzer/config/helpers.ts +107 -0
  247. package/src/analyzer/config/mod.ts +3 -0
  248. package/src/analyzer/config/types.ts +103 -0
  249. package/src/analyzer/logging.ts +8 -0
  250. package/src/analyzer/mod.ts +118 -0
  251. package/src/analyzer/result.ts +393 -0
  252. package/src/analyzer/rules/bash/astTypes.ts +5 -0
  253. package/src/analyzer/rules/bash/commands/bd.ts +23 -0
  254. package/src/analyzer/rules/bash/commands/cron.ts +21 -0
  255. package/src/analyzer/rules/bash/commands/docker.ts +37 -0
  256. package/src/analyzer/rules/bash/commands/eval.ts +52 -0
  257. package/src/analyzer/rules/bash/commands/generic.ts +16 -0
  258. package/src/analyzer/rules/bash/commands/gh.ts +21 -0
  259. package/src/analyzer/rules/bash/commands/git.ts +28 -0
  260. package/src/analyzer/rules/bash/commands/mod.ts +38 -0
  261. package/src/analyzer/rules/bash/commands/node.ts +64 -0
  262. package/src/analyzer/rules/bash/commands/openspec.ts +16 -0
  263. package/src/analyzer/rules/bash/commands/pip.ts +16 -0
  264. package/src/analyzer/rules/bash/commands/sudo.ts +21 -0
  265. package/src/analyzer/rules/bash/destructive.ts +28 -0
  266. package/src/analyzer/rules/bash/extractFileRefs.ts +101 -0
  267. package/src/analyzer/rules/bash/filesystem.ts +50 -0
  268. package/src/analyzer/rules/bash/injection.ts +21 -0
  269. package/src/analyzer/rules/bash/inline-command-classifier.ts +94 -0
  270. package/src/analyzer/rules/bash/mod.ts +23 -0
  271. package/src/analyzer/rules/bash/network.ts +64 -0
  272. package/src/analyzer/rules/bash/secret-detection.ts +43 -0
  273. package/src/analyzer/rules/javascript/astTypes.ts +8 -0
  274. package/src/analyzer/rules/javascript/extractFileRefs.ts +131 -0
  275. package/src/analyzer/rules/javascript/filesystem.ts +28 -0
  276. package/src/analyzer/rules/javascript/injection.ts +21 -0
  277. package/src/analyzer/rules/javascript/mod.ts +26 -0
  278. package/src/analyzer/rules/javascript/network.ts +27 -0
  279. package/src/analyzer/rules/javascript/secret-detection.ts +68 -0
  280. package/src/analyzer/rules/javascript/subprocess.ts +16 -0
  281. package/src/analyzer/rules/markdown/astTypes.ts +35 -0
  282. package/src/analyzer/rules/markdown/extractCodeBlocks.ts +101 -0
  283. package/src/analyzer/rules/markdown/extractFileRefs.ts +179 -0
  284. package/src/analyzer/rules/markdown/mod.ts +12 -0
  285. package/src/analyzer/rules/mod.ts +77 -0
  286. package/src/analyzer/rules/python/astTypes.ts +9 -0
  287. package/src/analyzer/rules/python/extractFileRefs.ts +92 -0
  288. package/src/analyzer/rules/python/mod.ts +15 -0
  289. package/src/analyzer/rules/python/network.ts +26 -0
  290. package/src/analyzer/rules/python/secret-detection.ts +30 -0
  291. package/src/analyzer/rules/shared/file-refs.ts +38 -0
  292. package/src/analyzer/rules/shared/network-evaluators.ts +107 -0
  293. package/src/analyzer/rules/shared/prompt-injection.ts +48 -0
  294. package/src/analyzer/rules/shared/secret-evaluators.ts +13 -0
  295. package/src/analyzer/rules/text/mod.ts +12 -0
  296. package/src/analyzer/rules/typescript/mod.ts +7 -0
  297. package/src/analyzer/steps/001-discovery/discover-files.ts +211 -0
  298. package/src/analyzer/steps/001-discovery/filter-files.ts +72 -0
  299. package/src/analyzer/steps/001-discovery/mod.ts +103 -0
  300. package/src/analyzer/steps/002-permissions/mod.ts +329 -0
  301. package/src/analyzer/steps/002-permissions/scan-file.ts +258 -0
  302. package/src/analyzer/steps/002-permissions/seed-frontmatter.ts +66 -0
  303. package/src/analyzer/steps/002-permissions/synthesize.ts +42 -0
  304. package/src/analyzer/steps/003-risks/dep-risks.ts +89 -0
  305. package/src/analyzer/steps/003-risks/helpers.ts +41 -0
  306. package/src/analyzer/steps/003-risks/mod.ts +86 -0
  307. package/src/analyzer/steps/003-risks/policy.ts +38 -0
  308. package/src/analyzer/steps/003-risks/rule-mapped.ts +206 -0
  309. package/src/analyzer/steps/003-risks/scoring.ts +117 -0
  310. package/src/analyzer/steps/mod.ts +3 -0
  311. package/src/analyzer/treesitter/client.ts +120 -0
  312. package/src/analyzer/treesitter/registry.ts +198 -0
  313. package/src/analyzer/types.ts +78 -0
  314. package/src/analyzer/utils/code-block-path.ts +33 -0
  315. package/src/analyzer/utils/id-generator.ts +59 -0
  316. package/src/analyzer/utils/secret-validator.ts +29 -0
  317. package/src/analyzer/utils/url-parser.ts +25 -0
  318. package/src/deps/jsr.io/@deno-library/progress/1.5.1/deps.ts +3 -0
  319. package/src/deps/jsr.io/@deno-library/progress/1.5.1/mod.ts +265 -0
  320. package/src/deps/jsr.io/@deno-library/progress/1.5.1/multi.ts +250 -0
  321. package/src/deps/jsr.io/@deno-library/progress/1.5.1/time.ts +69 -0
  322. package/src/deps/jsr.io/@std/fmt/1.0.3/colors.ts +1004 -0
  323. package/src/deps/jsr.io/@std/internal/1.0.12/_os.ts +15 -0
  324. package/src/deps/jsr.io/@std/internal/1.0.12/os.ts +7 -0
  325. package/src/deps/jsr.io/@std/io/0.225.0/types.ts +157 -0
  326. package/src/deps/jsr.io/@std/io/0.225.0/write_all.ts +65 -0
  327. package/src/deps/jsr.io/@std/path/1.1.4/_common/assert_path.ts +10 -0
  328. package/src/deps/jsr.io/@std/path/1.1.4/_common/basename.ts +53 -0
  329. package/src/deps/jsr.io/@std/path/1.1.4/_common/common.ts +26 -0
  330. package/src/deps/jsr.io/@std/path/1.1.4/_common/constants.ts +49 -0
  331. package/src/deps/jsr.io/@std/path/1.1.4/_common/dirname.ts +9 -0
  332. package/src/deps/jsr.io/@std/path/1.1.4/_common/format.ts +25 -0
  333. package/src/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.ts +12 -0
  334. package/src/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.ts +295 -0
  335. package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize.ts +9 -0
  336. package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.ts +74 -0
  337. package/src/deps/jsr.io/@std/path/1.1.4/_common/relative.ts +10 -0
  338. package/src/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.ts +25 -0
  339. package/src/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.ts +17 -0
  340. package/src/deps/jsr.io/@std/path/1.1.4/basename.ts +37 -0
  341. package/src/deps/jsr.io/@std/path/1.1.4/common.ts +35 -0
  342. package/src/deps/jsr.io/@std/path/1.1.4/constants.ts +18 -0
  343. package/src/deps/jsr.io/@std/path/1.1.4/dirname.ts +30 -0
  344. package/src/deps/jsr.io/@std/path/1.1.4/extname.ts +29 -0
  345. package/src/deps/jsr.io/@std/path/1.1.4/format.ts +30 -0
  346. package/src/deps/jsr.io/@std/path/1.1.4/from_file_url.ts +30 -0
  347. package/src/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.ts +94 -0
  348. package/src/deps/jsr.io/@std/path/1.1.4/is_absolute.ts +30 -0
  349. package/src/deps/jsr.io/@std/path/1.1.4/is_glob.ts +49 -0
  350. package/src/deps/jsr.io/@std/path/1.1.4/join.ts +31 -0
  351. package/src/deps/jsr.io/@std/path/1.1.4/join_globs.ts +42 -0
  352. package/src/deps/jsr.io/@std/path/1.1.4/mod.ts +217 -0
  353. package/src/deps/jsr.io/@std/path/1.1.4/normalize.ts +33 -0
  354. package/src/deps/jsr.io/@std/path/1.1.4/normalize_glob.ts +45 -0
  355. package/src/deps/jsr.io/@std/path/1.1.4/parse.ts +44 -0
  356. package/src/deps/jsr.io/@std/path/1.1.4/posix/_util.ts +10 -0
  357. package/src/deps/jsr.io/@std/path/1.1.4/posix/basename.ts +62 -0
  358. package/src/deps/jsr.io/@std/path/1.1.4/posix/constants.ts +15 -0
  359. package/src/deps/jsr.io/@std/path/1.1.4/posix/dirname.ts +72 -0
  360. package/src/deps/jsr.io/@std/path/1.1.4/posix/extname.ts +96 -0
  361. package/src/deps/jsr.io/@std/path/1.1.4/posix/format.ts +31 -0
  362. package/src/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.ts +25 -0
  363. package/src/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.ts +94 -0
  364. package/src/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.ts +25 -0
  365. package/src/deps/jsr.io/@std/path/1.1.4/posix/join.ts +46 -0
  366. package/src/deps/jsr.io/@std/path/1.1.4/posix/join_globs.ts +45 -0
  367. package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize.ts +63 -0
  368. package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.ts +43 -0
  369. package/src/deps/jsr.io/@std/path/1.1.4/posix/parse.ts +121 -0
  370. package/src/deps/jsr.io/@std/path/1.1.4/posix/relative.ts +103 -0
  371. package/src/deps/jsr.io/@std/path/1.1.4/posix/resolve.ts +71 -0
  372. package/src/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.ts +32 -0
  373. package/src/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.ts +21 -0
  374. package/src/deps/jsr.io/@std/path/1.1.4/relative.ts +32 -0
  375. package/src/deps/jsr.io/@std/path/1.1.4/resolve.ts +32 -0
  376. package/src/deps/jsr.io/@std/path/1.1.4/to_file_url.ts +30 -0
  377. package/src/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.ts +31 -0
  378. package/src/deps/jsr.io/@std/path/1.1.4/types.ts +40 -0
  379. package/src/deps/jsr.io/@std/path/1.1.4/windows/_util.ts +28 -0
  380. package/src/deps/jsr.io/@std/path/1.1.4/windows/basename.ts +54 -0
  381. package/src/deps/jsr.io/@std/path/1.1.4/windows/constants.ts +15 -0
  382. package/src/deps/jsr.io/@std/path/1.1.4/windows/dirname.ts +118 -0
  383. package/src/deps/jsr.io/@std/path/1.1.4/windows/extname.ts +90 -0
  384. package/src/deps/jsr.io/@std/path/1.1.4/windows/format.ts +31 -0
  385. package/src/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.ts +34 -0
  386. package/src/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.ts +92 -0
  387. package/src/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.ts +40 -0
  388. package/src/deps/jsr.io/@std/path/1.1.4/windows/join.ts +78 -0
  389. package/src/deps/jsr.io/@std/path/1.1.4/windows/join_globs.ts +46 -0
  390. package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize.ts +136 -0
  391. package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.ts +43 -0
  392. package/src/deps/jsr.io/@std/path/1.1.4/windows/parse.ts +184 -0
  393. package/src/deps/jsr.io/@std/path/1.1.4/windows/relative.ts +128 -0
  394. package/src/deps/jsr.io/@std/path/1.1.4/windows/resolve.ts +178 -0
  395. package/src/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.ts +38 -0
  396. package/src/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.ts +60 -0
  397. package/src/deps/jsr.io/@std/yaml/1.0.11/_chars.ts +55 -0
  398. package/src/deps/jsr.io/@std/yaml/1.0.11/_dumper_state.ts +841 -0
  399. package/src/deps/jsr.io/@std/yaml/1.0.11/_loader_state.ts +1780 -0
  400. package/src/deps/jsr.io/@std/yaml/1.0.11/_schema.ts +183 -0
  401. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/binary.ts +127 -0
  402. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/bool.ts +37 -0
  403. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/float.ts +112 -0
  404. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/int.ts +174 -0
  405. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/map.ts +17 -0
  406. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/merge.ts +13 -0
  407. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/nil.ts +27 -0
  408. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/omap.ts +30 -0
  409. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/pairs.ts +22 -0
  410. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/regexp.ts +33 -0
  411. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/seq.ts +13 -0
  412. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/set.ts +17 -0
  413. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/str.ts +12 -0
  414. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/timestamp.ts +101 -0
  415. package/src/deps/jsr.io/@std/yaml/1.0.11/_type/undefined.ts +23 -0
  416. package/src/deps/jsr.io/@std/yaml/1.0.11/_type.ts +49 -0
  417. package/src/deps/jsr.io/@std/yaml/1.0.11/_utils.ts +16 -0
  418. package/src/deps/jsr.io/@std/yaml/1.0.11/mod.ts +54 -0
  419. package/src/deps/jsr.io/@std/yaml/1.0.11/parse.ts +128 -0
  420. package/src/deps/jsr.io/@std/yaml/1.0.11/stringify.ts +118 -0
  421. package/src/shared/deep_merge.ts +73 -0
  422. package/src/shared/mod.ts +2 -0
  423. package/src/shared/types/filetypes.ts +101 -0
  424. package/src/shared/types/findings.ts +7 -0
  425. package/src/shared/types/mod.ts +6 -0
  426. package/src/shared/types/permissions.ts +17 -0
  427. package/src/shared/types/references.ts +62 -0
  428. package/src/shared/types/risks.ts +72 -0
  429. package/src/shared/types/syntaxNode.ts +7 -0
  430. package/src/skillreader/cloudStorage/mod.ts +170 -0
  431. package/src/skillreader/factory.ts +71 -0
  432. package/src/skillreader/fs/git.ts +153 -0
  433. package/src/skillreader/fs/mod.ts +84 -0
  434. package/src/skillreader/github/base.ts +162 -0
  435. package/src/skillreader/github/githubApi.ts +40 -0
  436. package/src/skillreader/github/githubRaw.ts +24 -0
  437. package/src/skillreader/github/mod.ts +45 -0
  438. package/src/skillreader/github/utils.ts +40 -0
  439. package/src/skillreader/manifest.ts +67 -0
  440. package/src/skillreader/mod.ts +26 -0
  441. package/src/skillreader/types.ts +150 -0
  442. package/src/skillreader/utils/frontmatter-parser.ts +72 -0
  443. package/src/skillreader/utils/http-range.ts +38 -0
  444. package/src/skillreader/utils/mod.ts +12 -0
  445. package/esm/analyzer/astgrep/registry.d.ts +0 -18
  446. package/esm/analyzer/astgrep/registry.d.ts.map +0 -1
  447. package/esm/analyzer/astgrep/registry.js +0 -71
  448. package/esm/analyzer/config.d.ts +0 -27
  449. package/esm/analyzer/config.d.ts.map +0 -1
  450. package/esm/analyzer/steps/003-risks/output.d.ts +0 -3
  451. package/esm/analyzer/steps/003-risks/output.d.ts.map +0 -1
  452. package/esm/analyzer/steps/003-risks/output.js +0 -16
  453. package/esm/analyzer/treesiter/client.d.ts +0 -26
  454. package/esm/analyzer/treesiter/client.d.ts.map +0 -1
  455. package/script/analyzer/astgrep/registry.d.ts +0 -18
  456. package/script/analyzer/astgrep/registry.d.ts.map +0 -1
  457. package/script/analyzer/astgrep/registry.js +0 -109
  458. package/script/analyzer/config.d.ts +0 -27
  459. package/script/analyzer/config.d.ts.map +0 -1
  460. package/script/analyzer/steps/003-risks/output.d.ts +0 -3
  461. package/script/analyzer/steps/003-risks/output.d.ts.map +0 -1
  462. package/script/analyzer/steps/003-risks/output.js +0 -19
  463. package/script/analyzer/treesiter/client.d.ts +0 -26
  464. package/script/analyzer/treesiter/client.d.ts.map +0 -1
  465. package/script/analyzer/treesiter/client.js +0 -165
@@ -1,9 +1,11 @@
1
- import { DEFAULT_CONFIG, DEFAULT_SKILL_VERSION } from "./config.js";
1
+ import { DEFAULT_ANALYZER_CONFIG, DEFAULT_SKILL_VERSION, resolveConfig } from "./config/mod.js";
2
+ import { NO_OP_LOGGER } from "./logging.js";
2
3
  import { run001Discovery, run002Permissions, run003Risks } from "./steps/mod.js";
3
4
  import { SkillReaderFactory } from "../skillreader/factory.js";
4
- import { TreesitterClient } from "./treesiter/client.js";
5
+ import { TreesitterClient } from "./treesitter/client.js";
5
6
  import { AstGrepClient } from "./astgrep/mod.js";
6
- export { DEFAULT_CONFIG, DEFAULT_SKILL_VERSION } from "./config.js";
7
+ export { SkillAnalyzerResult } from "./result.js";
8
+ export { DEFAULT_ANALYZER_CONFIG, DEFAULT_SKILL_VERSION, resolveConfig } from "./config/mod.js";
7
9
  export class Analyzer {
8
10
  analyze(input) {
9
11
  return runAnalysis({
@@ -16,30 +18,44 @@ export class Analyzer {
16
18
  skillId: input.skillId,
17
19
  skillVersionId: input.skillVersionId,
18
20
  config: input.config,
21
+ logger: input.logger,
22
+ showProgressBar: input.showProgressBar,
19
23
  });
20
24
  }
21
25
  }
22
26
  export async function runAnalysis(input) {
27
+ const config = resolveConfig(input.config);
23
28
  let state = createInitialState({
24
29
  skillId: input.skillId,
25
30
  skillVersionId: input.skillVersionId,
26
- config: input.config,
31
+ config,
27
32
  });
28
33
  const skillReader = await SkillReaderFactory.create(input.options);
29
34
  const validation = await skillReader.validate();
30
35
  if (!validation.ok) {
31
36
  throw new Error(validation.reason ?? "Invalid skill repository");
32
37
  }
38
+ const logger = input.logger ?? NO_OP_LOGGER;
39
+ const showProgressBar = input.showProgressBar ?? false;
33
40
  const context = {
34
41
  skillReader,
35
- treesitterClient: new TreesitterClient(),
36
- astgrepClient: new AstGrepClient(),
42
+ treesitterClient: new TreesitterClient(logger, showProgressBar),
43
+ astgrepClient: new AstGrepClient(logger, showProgressBar),
44
+ logger,
45
+ showProgressBar,
46
+ config,
37
47
  };
38
48
  state = await run001Discovery(state, context);
39
49
  state = await run002Permissions(state, context);
40
- return run003Risks(state);
50
+ return await run003Risks(state, context);
41
51
  }
42
52
  export function createInitialState(input) {
53
+ const resolvedConfig = resolveConfig(input?.config);
54
+ const scan = resolvedConfig.scan ?? DEFAULT_ANALYZER_CONFIG.scan ?? {
55
+ maxFileSize: 1_000_000,
56
+ maxFileCount: 100,
57
+ maxScanDepth: 5,
58
+ };
43
59
  return {
44
60
  skillId: input?.skillId ?? "unknown",
45
61
  skillVersionId: input?.skillVersionId ?? DEFAULT_SKILL_VERSION,
@@ -51,13 +67,10 @@ export function createInitialState(input) {
51
67
  risks: [],
52
68
  warnings: [],
53
69
  metadata: {
54
- scannedFiles: [],
70
+ scannedFiles: new Set(),
55
71
  skippedFiles: [],
56
72
  rulesUsed: [],
57
- config: {
58
- ...DEFAULT_CONFIG,
59
- ...(input?.config ?? {}),
60
- },
73
+ config: scan,
61
74
  },
62
75
  };
63
76
  }
@@ -0,0 +1,35 @@
1
+ import type { Permission, Risk } from "../shared/mod.js";
2
+ import type { AnalyzerConfig } from "./config/mod.js";
3
+ import type { AnalyzerState, ScanConfig } from "./types.js";
4
+ export declare class SkillAnalyzerResult {
5
+ private readonly state;
6
+ private readonly config;
7
+ readonly analyzedAt: string;
8
+ private _score;
9
+ private _riskLevel;
10
+ private _summary;
11
+ constructor(state: AnalyzerState, config?: AnalyzerConfig);
12
+ get skillId(): string;
13
+ get skillVersionId(): string;
14
+ get permissions(): Permission[];
15
+ get risks(): Risk[];
16
+ get warnings(): string[];
17
+ get metadata(): {
18
+ scannedFiles: Set<string>;
19
+ skippedFiles: Array<{
20
+ path: string;
21
+ reason: string;
22
+ }>;
23
+ rulesUsed: string[];
24
+ frontmatterRangeEnd?: number;
25
+ config: ScanConfig;
26
+ };
27
+ get score(): number;
28
+ get riskLevel(): "safe" | "caution" | "attention" | "risky" | "avoid";
29
+ get summary(): string;
30
+ private _ensureScored;
31
+ toString(): string;
32
+ toJson(): string;
33
+ toSarif(toolVersion: string): Promise<string>;
34
+ }
35
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/analyzer/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8D5D,qBAAa,mBAAmB;IAQxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAR3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAmE;IACrF,OAAO,CAAC,QAAQ,CAAqB;gBAGhB,KAAK,EAAE,aAAa,EACpB,MAAM,GAAE,cAAwC;IAKrE,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,IAAI,QAAQ,IAAI;QACZ,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,YAAY,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACtD,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,MAAM,EAAE,UAAU,CAAC;KACtB,CAEA;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,CAEpE;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,aAAa;IAkBrB,QAAQ,IAAI,MAAM;IAoGlB,MAAM,IAAI,MAAM;IA0BV,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAyFtD"}
@@ -0,0 +1,311 @@
1
+ import { scoreState } from "./steps/003-risks/scoring.js";
2
+ import { DEFAULT_ANALYZER_CONFIG } from "./config/mod.js";
3
+ const INDENT = " ";
4
+ const SUB_INDENT = " ";
5
+ // ---------------------------------------------------------------------------
6
+ // SkillAnalyzerResult class
7
+ // ---------------------------------------------------------------------------
8
+ export class SkillAnalyzerResult {
9
+ constructor(state, config = DEFAULT_ANALYZER_CONFIG) {
10
+ Object.defineProperty(this, "state", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: state
15
+ });
16
+ Object.defineProperty(this, "config", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: config
21
+ });
22
+ Object.defineProperty(this, "analyzedAt", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ Object.defineProperty(this, "_score", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ Object.defineProperty(this, "_riskLevel", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
40
+ Object.defineProperty(this, "_summary", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: void 0
45
+ });
46
+ this.analyzedAt = new Date().toISOString();
47
+ }
48
+ get skillId() {
49
+ return this.state.skillId;
50
+ }
51
+ get skillVersionId() {
52
+ return this.state.skillVersionId;
53
+ }
54
+ get permissions() {
55
+ return this.state.permissions;
56
+ }
57
+ get risks() {
58
+ return this.state.risks;
59
+ }
60
+ get warnings() {
61
+ return this.state.warnings;
62
+ }
63
+ get metadata() {
64
+ return this.state.metadata;
65
+ }
66
+ get score() {
67
+ return this._ensureScored().score;
68
+ }
69
+ get riskLevel() {
70
+ return this._ensureScored().riskLevel;
71
+ }
72
+ get summary() {
73
+ return this._ensureScored().summary;
74
+ }
75
+ _ensureScored() {
76
+ if (this._score === undefined) {
77
+ const scored = scoreState(this.state, this.config);
78
+ this._score = scored.score;
79
+ this._riskLevel = scored.riskLevel;
80
+ this._summary = scored.summary;
81
+ }
82
+ return {
83
+ score: this._score,
84
+ riskLevel: this._riskLevel,
85
+ summary: this._summary,
86
+ };
87
+ }
88
+ // -----------------------------------------------------------------------
89
+ // toString() — human-readable terminal output
90
+ // -----------------------------------------------------------------------
91
+ toString() {
92
+ const lines = [];
93
+ const hr = "=".repeat(60);
94
+ lines.push(hr);
95
+ lines.push("Analysis Results");
96
+ lines.push(hr);
97
+ lines.push(`${INDENT}Skill: ${this.skillId}@${this.skillVersionId}`);
98
+ // lines.push("");
99
+ // lines.push(`${INDENT}Permissions (${this.permissions.length})`);
100
+ // if (this.permissions.length === 0) {
101
+ // lines.push(`${SUB_INDENT}- none`);
102
+ // } else {
103
+ // for (const p of this.permissions) {
104
+ // lines.push(`${SUB_INDENT}- ${p.tool}.${p.permission} [${p.scope}]`);
105
+ // if (p.args && p.args.length > 0) {
106
+ // lines.push(`${SUB_INDENT}${INDENT}args: ${p.args.join(", ")}`);
107
+ // }
108
+ // lines.push(`${SUB_INDENT}${INDENT}source: ${p.source}`);
109
+ // if (p.references.length > 0) {
110
+ // lines.push(
111
+ // `${SUB_INDENT}${INDENT}ref: ${_formatRef(p.references[0])}`,
112
+ // );
113
+ // }
114
+ // }
115
+ // }
116
+ lines.push("");
117
+ lines.push(`${INDENT}Risks (${this.risks.length})`);
118
+ if (this.risks.length === 0) {
119
+ lines.push(`${SUB_INDENT}- none`);
120
+ }
121
+ else {
122
+ const SEVERITY_ORDER = { critical: 0, warning: 1, info: 2 };
123
+ const groups = new Map();
124
+ for (const r of this.risks) {
125
+ const key = r.groupKey ?? `${r.type}:${r.reference.file}:${r.reference.line}`;
126
+ const bucket = groups.get(key) ?? [];
127
+ bucket.push(r);
128
+ groups.set(key, bucket);
129
+ }
130
+ const sortedGroups = Array.from(groups.entries())
131
+ .map(([groupKey, risks]) => ({
132
+ groupKey,
133
+ risks,
134
+ sortKey: Math.min(...risks.map((r) => SEVERITY_ORDER[r.severity] ?? 99)),
135
+ }))
136
+ .sort((a, b) => a.sortKey - b.sortKey);
137
+ for (const group of sortedGroups) {
138
+ if (group.risks.length === 1) {
139
+ const r = group.risks[0];
140
+ lines.push(`${SUB_INDENT}- ${r.severity} ${r.type}`);
141
+ lines.push(`${SUB_INDENT}${INDENT}message: ${r.message}`);
142
+ lines.push(`${SUB_INDENT}${INDENT}ref: ${_formatRef(r.reference)}`);
143
+ if (r.permissions.length > 0) {
144
+ lines.push(`${SUB_INDENT}${INDENT}permissions: ${r.permissions.join(", ")}`);
145
+ }
146
+ continue;
147
+ }
148
+ const topRisk = group.risks.reduce((best, r) => (SEVERITY_ORDER[r.severity] ?? 99) < (SEVERITY_ORDER[best.severity] ?? 99)
149
+ ? r
150
+ : best);
151
+ lines.push(`${SUB_INDENT}[${group.groupKey}] (${topRisk.severity})`);
152
+ for (const r of group.risks) {
153
+ lines.push(`${SUB_INDENT}${INDENT}- ${r.message}`);
154
+ lines.push(`${SUB_INDENT}${INDENT} ref: ${_formatRef(r.reference)}`);
155
+ }
156
+ }
157
+ }
158
+ lines.push("");
159
+ lines.push(`${INDENT}Warnings (${this.warnings.length})`);
160
+ if (this.warnings.length === 0) {
161
+ lines.push(`${SUB_INDENT}- none`);
162
+ }
163
+ else {
164
+ for (const w of this.warnings) {
165
+ lines.push(`${SUB_INDENT}- ${w}`);
166
+ }
167
+ }
168
+ lines.push("");
169
+ lines.push(`${INDENT}Risk Level: ${this.riskLevel}`);
170
+ lines.push(`${INDENT}Score: ${this.score}`);
171
+ lines.push(`${INDENT}Summary: ${this.summary}`);
172
+ return lines.join("\n");
173
+ }
174
+ // -----------------------------------------------------------------------
175
+ // toJson() — plain JSON matching legacy AnalyzerResult shape
176
+ // -----------------------------------------------------------------------
177
+ toJson() {
178
+ return JSON.stringify({
179
+ analyzedAt: this.analyzedAt,
180
+ skillId: this.skillId,
181
+ skillVersionId: this.skillVersionId,
182
+ permissions: this.permissions,
183
+ risks: this.risks,
184
+ score: this.score,
185
+ riskLevel: this.riskLevel,
186
+ summary: this.summary,
187
+ warnings: this.warnings,
188
+ metadata: {
189
+ ...this.metadata,
190
+ scannedFiles: [...this.metadata.scannedFiles],
191
+ },
192
+ }, null, 2);
193
+ }
194
+ // -----------------------------------------------------------------------
195
+ // toSarif() — SARIF 2.1.0 for GitHub Code Scanning
196
+ // -----------------------------------------------------------------------
197
+ async toSarif(toolVersion) {
198
+ // --- rules ---
199
+ const rules = [];
200
+ const seenRiskTypes = new Set();
201
+ for (const r of this.risks) {
202
+ if (!seenRiskTypes.has(r.type)) {
203
+ seenRiskTypes.add(r.type);
204
+ rules.push({
205
+ id: r.type,
206
+ shortDescription: { text: r.type },
207
+ help: { text: r.message },
208
+ properties: { tags: ["security"] },
209
+ });
210
+ }
211
+ }
212
+ if (this.warnings.length > 0) {
213
+ rules.push({
214
+ id: "slab/warning",
215
+ shortDescription: { text: "Analysis warning" },
216
+ help: { text: "Warnings produced during skill analysis." },
217
+ properties: { tags: ["maintainability"] },
218
+ });
219
+ }
220
+ for (const p of this.permissions) {
221
+ rules.push({
222
+ id: p.id,
223
+ shortDescription: { text: `${p.tool}.${p.permission} [${p.scope}]` },
224
+ help: {
225
+ text: p.comment ??
226
+ `Permission detected: ${p.tool} ${p.permission} (${p.scope})`,
227
+ },
228
+ properties: { tags: ["permissions"] },
229
+ });
230
+ }
231
+ // --- results ---
232
+ const results = [];
233
+ for (const r of this.risks) {
234
+ const fp = await _fingerprint(`${r.type}:${r.reference.file}:${r.reference.line}`);
235
+ results.push({
236
+ ruleId: r.type,
237
+ level: _sarifLevel(r.severity),
238
+ message: { text: r.message },
239
+ locations: [
240
+ _sarifLocation(r.reference.file, r.reference.line, r.reference.lineEnd),
241
+ ],
242
+ fingerprints: { "slab/v1": fp },
243
+ });
244
+ }
245
+ for (const w of this.warnings) {
246
+ results.push({
247
+ ruleId: "slab/warning",
248
+ level: "note",
249
+ message: { text: w },
250
+ locations: [_sarifLocation("SKILL.md", 1)],
251
+ });
252
+ }
253
+ // --- artifacts ---
254
+ const artifacts = [...this.metadata.scannedFiles].map((f) => ({
255
+ location: { uri: f, uriBaseId: "%SRCROOT%" },
256
+ }));
257
+ const log = {
258
+ $schema: "https://json.schemastore.org/sarif-2.1.0.json",
259
+ version: "2.1.0",
260
+ runs: [
261
+ {
262
+ tool: {
263
+ driver: {
264
+ name: "slab",
265
+ version: toolVersion,
266
+ informationUri: "https://github.com/FeiyouG/skill-lab",
267
+ rules,
268
+ },
269
+ },
270
+ results,
271
+ artifacts,
272
+ },
273
+ ],
274
+ };
275
+ return JSON.stringify(log, null, 2);
276
+ }
277
+ }
278
+ // ---------------------------------------------------------------------------
279
+ // Helpers
280
+ // ---------------------------------------------------------------------------
281
+ function _formatRef(ref) {
282
+ if (ref.lineEnd !== undefined && ref.lineEnd !== ref.line) {
283
+ return `${ref.file}:${ref.line}-${ref.lineEnd} (${ref.type})`;
284
+ }
285
+ return `${ref.file}:${ref.line} (${ref.type})`;
286
+ }
287
+ function _sarifLevel(severity) {
288
+ if (severity === "critical")
289
+ return "error";
290
+ if (severity === "warning")
291
+ return "warning";
292
+ return "note";
293
+ }
294
+ function _sarifLocation(file, startLine, endLine) {
295
+ const region = { startLine };
296
+ if (endLine !== undefined && endLine !== startLine) {
297
+ region.endLine = endLine;
298
+ }
299
+ return {
300
+ physicalLocation: {
301
+ artifactLocation: { uri: file, uriBaseId: "%SRCROOT%" },
302
+ region,
303
+ },
304
+ };
305
+ }
306
+ async function _fingerprint(input) {
307
+ const encoded = new TextEncoder().encode(input);
308
+ const hashBuffer = await crypto.subtle.digest("SHA-256", encoded);
309
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
310
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
311
+ }
@@ -8,6 +8,7 @@ export * from "./gh.js";
8
8
  export * from "./git.js";
9
9
  export * from "./node.js";
10
10
  export * from "./openspec.js";
11
+ export * from "./pip.js";
11
12
  export * from "./sudo.js";
12
13
  export declare const BASH_COMMAND_RULES: AstGrepRule[];
13
14
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../../src/analyzer/rules/bash/commands/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAY9D,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAE1B,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAW3C,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../../src/analyzer/rules/bash/commands/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAa9D,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAE1B,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAY3C,CAAC"}
@@ -7,6 +7,7 @@ import { GH_RULES } from "./gh.js";
7
7
  import { GIT_RULES } from "./git.js";
8
8
  import { NODE_ECOSYSTEM_RULES } from "./node.js";
9
9
  import { OPENSPEC_RULES } from "./openspec.js";
10
+ import { PIP_RULES } from "./pip.js";
10
11
  import { SUDO_RULES } from "./sudo.js";
11
12
  export * from "./bd.js";
12
13
  export * from "./cron.js";
@@ -17,11 +18,13 @@ export * from "./gh.js";
17
18
  export * from "./git.js";
18
19
  export * from "./node.js";
19
20
  export * from "./openspec.js";
21
+ export * from "./pip.js";
20
22
  export * from "./sudo.js";
21
23
  export const BASH_COMMAND_RULES = [
22
24
  ...GIT_RULES,
23
25
  ...GH_RULES,
24
26
  ...NODE_ECOSYSTEM_RULES,
27
+ ...PIP_RULES,
25
28
  ...DOCKER_RULES,
26
29
  ...BD_RULES,
27
30
  ...SUDO_RULES,
@@ -0,0 +1,3 @@
1
+ import type { AstGrepRule } from "../../../astgrep/client.js";
2
+ export declare const PIP_RULES: AstGrepRule[];
3
+ //# sourceMappingURL=pip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pip.d.ts","sourceRoot":"","sources":["../../../../../src/analyzer/rules/bash/commands/pip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,SAAS,EAAE,WAAW,EAalC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const PIP_RULES = [
2
+ {
3
+ id: "shell-pip",
4
+ description: "Detects pip commands",
5
+ grammar: "bash",
6
+ patterns: ["pip $SUB $$$ARGS", "pip3 $SUB $$$ARGS"],
7
+ permission: {
8
+ tool: "pip",
9
+ scope: "sys",
10
+ permission: "shell",
11
+ metadata: { subcommand: "SUB" },
12
+ },
13
+ },
14
+ ];
@@ -9,5 +9,5 @@
9
9
  * Uses ast-grep AST traversal on `command` nodes.
10
10
  */
11
11
  import type { AnalyzerContext, FileRefDiscovery } from "../../types.js";
12
- export declare function extractBashFileRefs(context: AnalyzerContext, content: string): FileRefDiscovery[];
12
+ export declare function extractBashFileRefs(context: AnalyzerContext, content: string): Promise<FileRefDiscovery[]>;
13
13
  //# sourceMappingURL=extractFileRefs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/bash/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAkFpB"}
1
+ {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/bash/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,wBAAsB,mBAAmB,CACrC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkF7B"}
@@ -10,9 +10,9 @@
10
10
  */
11
11
  import { isHostFsPath, isUrl, looksLikePath } from "../shared/file-refs.js";
12
12
  import { BASH_NODE } from "./astTypes.js";
13
- export function extractBashFileRefs(context, content) {
13
+ export async function extractBashFileRefs(context, content) {
14
14
  const refs = [];
15
- const ast = context.astgrepClient.parse("bash", content);
15
+ const ast = await context.astgrepClient.parse("bash", content);
16
16
  const root = ast.root();
17
17
  const commandNodes = root.findAll({ rule: { kind: BASH_NODE.COMMAND } });
18
18
  for (const node of commandNodes) {
@@ -2,5 +2,5 @@ import type { AnalyzerContext } from "../../types.js";
2
2
  export declare function isLikelyInlineBashCommand(context: AnalyzerContext, input: {
3
3
  snippet: string;
4
4
  lineContext?: string;
5
- }): boolean;
5
+ }): Promise<boolean>;
6
6
  //# sourceMappingURL=inline-command-classifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline-command-classifier.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/bash/inline-command-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA4CtD,wBAAgB,yBAAyB,CACrC,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAuBT"}
1
+ {"version":3,"file":"inline-command-classifier.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/bash/inline-command-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA4CtD,wBAAsB,yBAAyB,CAC3C,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,OAAO,CAAC,CAuBlB"}
@@ -30,7 +30,7 @@ const SPECIFIC_COMMAND_RULES = BASH_COMMAND_RULES.filter((rule) => rule.id !== G
30
30
  const KNOWN_COMMAND_TOOLS = new Set(SPECIFIC_COMMAND_RULES
31
31
  .map((rule) => String(rule.permission.tool ?? "").toLowerCase())
32
32
  .filter((tool) => tool && tool !== "detected"));
33
- export function isLikelyInlineBashCommand(context, input) {
33
+ export async function isLikelyInlineBashCommand(context, input) {
34
34
  const snippet = normalizeInlineSnippet(input.snippet);
35
35
  if (!snippet)
36
36
  return false;
@@ -39,7 +39,7 @@ export function isLikelyInlineBashCommand(context, input) {
39
39
  const tokens = snippet.split(/\s+/).filter(Boolean);
40
40
  if (tokens.length === 1 && looksLikePath(snippet))
41
41
  return false;
42
- if (matchesSpecificBashCommandRule(context, snippet))
42
+ if (await matchesSpecificBashCommandRule(context, snippet))
43
43
  return true;
44
44
  const firstToken = tokens[0]?.toLowerCase() ?? "";
45
45
  const hasContextVerb = CONTEXT_VERB_PATTERN.test(input.lineContext ?? "");
@@ -53,8 +53,8 @@ export function isLikelyInlineBashCommand(context, input) {
53
53
  }
54
54
  return false;
55
55
  }
56
- function matchesSpecificBashCommandRule(context, snippet) {
57
- const matches = context.astgrepClient.scanWithRules(snippet, "bash", SPECIFIC_COMMAND_RULES);
56
+ async function matchesSpecificBashCommandRule(context, snippet) {
57
+ const matches = await context.astgrepClient.scanWithRules(snippet, "bash", SPECIFIC_COMMAND_RULES);
58
58
  return matches.length > 0;
59
59
  }
60
60
  function normalizeInlineSnippet(raw) {
@@ -7,10 +7,9 @@
7
7
  * - URL string literals used in fetch/axios/XMLHttpRequest → via: "url"
8
8
  * - Host filesystem paths in fs.readFile / fs.writeFile / open calls → via: "bare-path"
9
9
  *
10
- * Uses ast-grep AST traversal; `context` is accepted for interface consistency
11
- * (AST client is synchronous for JS/TS and does not require async setup).
10
+ * Uses ast-grep AST traversal.
12
11
  */
13
12
  import type { AnalyzerContext, FileRefDiscovery } from "../../types.js";
14
- export declare function extractJsFileRefs(context: AnalyzerContext, content: string): FileRefDiscovery[];
15
- export declare function extractTsFileRefs(context: AnalyzerContext, content: string): FileRefDiscovery[];
13
+ export declare function extractJsFileRefs(context: AnalyzerContext, content: string): Promise<FileRefDiscovery[]>;
14
+ export declare function extractTsFileRefs(context: AnalyzerContext, content: string): Promise<FileRefDiscovery[]>;
16
15
  //# sourceMappingURL=extractFileRefs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/javascript/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAyGxE,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAEpB;AAED,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAEpB"}
1
+ {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/javascript/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAyGxE,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAE7B;AAED,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAE7B"}
@@ -7,14 +7,13 @@
7
7
  * - URL string literals used in fetch/axios/XMLHttpRequest → via: "url"
8
8
  * - Host filesystem paths in fs.readFile / fs.writeFile / open calls → via: "bare-path"
9
9
  *
10
- * Uses ast-grep AST traversal; `context` is accepted for interface consistency
11
- * (AST client is synchronous for JS/TS and does not require async setup).
10
+ * Uses ast-grep AST traversal.
12
11
  */
13
12
  import { isHostFsPath, isUrl } from "../shared/file-refs.js";
14
13
  import { JS_NODE } from "./astTypes.js";
15
- function extractJsLikeFileRefs(lang, context, content) {
14
+ async function extractJsLikeFileRefs(lang, context, content) {
16
15
  const refs = [];
17
- const ast = context.astgrepClient.parse(lang, content);
16
+ const ast = await context.astgrepClient.parse(lang, content);
18
17
  const root = ast.root();
19
18
  // ── import_statement ────────────────────────────────────────────────────
20
19
  const importNodes = root.findAll({ rule: { kind: JS_NODE.IMPORT_STATEMENT } });
@@ -1 +1 @@
1
- {"version":3,"file":"extractCodeBlocks.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/markdown/extractCodeBlocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgBjE;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqFtB"}
1
+ {"version":3,"file":"extractCodeBlocks.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/markdown/extractCodeBlocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIjE;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAwFtB"}
@@ -16,10 +16,11 @@ export async function extractCodeBlocks(context, content) {
16
16
  const blockNode = capture.node;
17
17
  const startLine = blockNode.startPosition.row + 1;
18
18
  const endLine = blockNode.endPosition.row + 1;
19
- const languageNode = blockNode.children.find((child) => child.type === MARKDOWN_NODE.CODE_FENCE_LANGUAGE ||
20
- child.type === MARKDOWN_NODE.INFO_STRING);
19
+ const languageNode = blockNode.children.find((child) => child !== null &&
20
+ (child.type === MARKDOWN_NODE.CODE_FENCE_LANGUAGE ||
21
+ child.type === MARKDOWN_NODE.INFO_STRING));
21
22
  const fenceLanguage = FILETYPE_BY_LANGUAGE[(languageNode?.text ?? "").trim().toLowerCase()] ?? null;
22
- const contentNode = blockNode.children.find((child) => child.type === MARKDOWN_NODE.CODE_FENCE_CONTENT);
23
+ const contentNode = blockNode.children.find((child) => child !== null && child.type === MARKDOWN_NODE.CODE_FENCE_CONTENT);
23
24
  const codeContent = (contentNode?.text ?? "")
24
25
  .replace(/\n?[`~]{3,}[^\n]*\s*$/, "")
25
26
  .trimEnd();
@@ -43,6 +44,8 @@ export async function extractCodeBlocks(context, content) {
43
44
  continue;
44
45
  const inlineNode = inlineCapture.node;
45
46
  const inlineTree = inlineParser.parse(inlineNode.text);
47
+ if (!inlineTree)
48
+ continue;
46
49
  for (const codeMatch of codeSpanQuery.matches(inlineTree.rootNode)) {
47
50
  for (const codeCapture of codeMatch.captures) {
48
51
  if (codeCapture.name !== "code")
@@ -1 +1 @@
1
- {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/markdown/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAaxE,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgF7B"}
1
+ {"version":3,"file":"extractFileRefs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/rules/markdown/extractFileRefs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIxE,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiF7B"}
@@ -24,6 +24,8 @@ export async function extractMarkdownFileRefs(context, content) {
24
24
  const inlineNode = inlineCapture.node;
25
25
  const blockLine = inlineNode.startPosition.row;
26
26
  const inlineTree = inlineParser.parse(inlineNode.text);
27
+ if (!inlineTree)
28
+ continue;
27
29
  const inlineRoot = inlineTree.rootNode;
28
30
  for (const match of linkDestQuery.matches(inlineRoot)) {
29
31
  for (const capture of match.captures) {
@@ -10,5 +10,5 @@
10
10
  * Uses ast-grep AST traversal.
11
11
  */
12
12
  import type { AnalyzerContext, FileRefDiscovery } from "../../types.js";
13
- export declare function extractPythonFileRefs(context: AnalyzerContext, content: string): FileRefDiscovery[];
13
+ export declare function extractPythonFileRefs(context: AnalyzerContext, content: string): Promise<FileRefDiscovery[]>;
14
14
  //# sourceMappingURL=extractFileRefs.d.ts.map