@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
@@ -0,0 +1,77 @@
1
+ import { BASH_FILETYPE_CONFIS, BASH_RULES } from "./bash/mod.js";
2
+ import {
3
+ JAVASCRIPT_FILETYPE_CONFIGS,
4
+ JAVASCRIPT_RULES,
5
+ TYPESCRIPT_FILETYPE_CONFIGS,
6
+ } from "./javascript/mod.js";
7
+ import { MARKDOWN_FILETYPE_CONFIG, MARKDOWN_RULES } from "./markdown/mod.js";
8
+ import { PYTHON_RULES, PYTHONG_FILETYPE_CONFIGS } from "./python/mod.js";
9
+ import { PROMPT_REGEX_RULES } from "./shared/prompt-injection.js";
10
+ import type { FileRefDiscovery, FileTypeConfig } from "../types.js";
11
+ import { TEXT_FILETYPE_CONFIG, TEXT_RULES } from "./text/mod.js";
12
+ import { TYPESCRIPT_RULES } from "./typescript/mod.js";
13
+ import type { FileType, RuleRiskInput, RuleRiskResult } from "../../shared/mod.js";
14
+ import type { AstGrepRule } from "../astgrep/client.js";
15
+ import type { PromptRegexRule } from "./shared/prompt-injection.js";
16
+
17
+ // Single registry used for both file-level scanning and code-block scanning.
18
+ export const RULES_BY_FILETYPE: Partial<Record<FileType, readonly AstGrepRule[]>> = {
19
+ markdown: MARKDOWN_RULES,
20
+ text: TEXT_RULES,
21
+ bash: BASH_RULES,
22
+ javascript: JAVASCRIPT_RULES,
23
+ typescript: TYPESCRIPT_RULES,
24
+ python: PYTHON_RULES,
25
+ } as const;
26
+
27
+ export const FILETYPE_CONFIGS: Record<FileType, FileTypeConfig> = {
28
+ markdown: MARKDOWN_FILETYPE_CONFIG,
29
+ text: TEXT_FILETYPE_CONFIG,
30
+ bash: BASH_FILETYPE_CONFIS,
31
+ javascript: JAVASCRIPT_FILETYPE_CONFIGS,
32
+ typescript: TYPESCRIPT_FILETYPE_CONFIGS,
33
+ python: PYTHONG_FILETYPE_CONFIGS,
34
+ csv: { defaultLanguage: null },
35
+ json: { defaultLanguage: null },
36
+ yaml: { defaultLanguage: null },
37
+ toml: { defaultLanguage: null },
38
+ config: { defaultLanguage: null },
39
+ sql: { defaultLanguage: null },
40
+ xml: { defaultLanguage: null },
41
+ binary: { defaultLanguage: null },
42
+ unknown: { defaultLanguage: null },
43
+ } as const;
44
+
45
+ export { PROMPT_REGEX_RULES };
46
+ export type { FileRefDiscovery };
47
+
48
+ export type RiskRuleDefinition = AstGrepRule | PromptRegexRule;
49
+
50
+ export const RULES_BY_ID: Map<string, RiskRuleDefinition> = new Map(
51
+ [
52
+ ...Object.values(RULES_BY_FILETYPE).flatMap((rules) => rules ?? []),
53
+ ...PROMPT_REGEX_RULES,
54
+ ].map((rule) => [rule.id, rule] as const),
55
+ );
56
+
57
+ export function evalRuleRiskMappings(
58
+ rule: RiskRuleDefinition,
59
+ input: RuleRiskInput,
60
+ ): RuleRiskResult[] {
61
+ const entries = "permission" in rule
62
+ ? (rule.permission.mappedRisks ?? [])
63
+ : (rule.mappedRisks ?? []);
64
+ const results: RuleRiskResult[] = [];
65
+
66
+ for (const entry of entries) {
67
+ if (typeof entry === "function") {
68
+ const value = entry(input);
69
+ if (!value) continue;
70
+ results.push(...(Array.isArray(value) ? value : [value]));
71
+ continue;
72
+ }
73
+ results.push(entry);
74
+ }
75
+
76
+ return results;
77
+ }
@@ -0,0 +1,9 @@
1
+ /** ast-grep node types for Python. */
2
+ export const PYTHON_NODE = {
3
+ IMPORT_STATEMENT: "import_statement",
4
+ IMPORT_FROM_STATEMENT: "import_from_statement",
5
+ CALL: "call",
6
+ STRING: "string",
7
+ STRING_CONTENT: "string_content",
8
+ DOTTED_NAME: "dotted_name",
9
+ } as const;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * File reference extractor for Python scripts.
3
+ *
4
+ * Detects:
5
+ * - import statements → via: "import"
6
+ * - from...import statements → via: "import"
7
+ * - open() calls with host FS paths → via: "bare-path"
8
+ * - URL string literals (requests.get, urllib, etc.) → via: "url"
9
+ *
10
+ * Uses ast-grep AST traversal.
11
+ */
12
+
13
+ import { isHostFsPath, isUrl } from "../shared/file-refs.js";
14
+ import type { AnalyzerContext, FileRefDiscovery } from "../../types.js";
15
+ import { PYTHON_NODE } from "./astTypes.js";
16
+
17
+ export async function extractPythonFileRefs(
18
+ context: AnalyzerContext,
19
+ content: string,
20
+ ): Promise<FileRefDiscovery[]> {
21
+ const refs: FileRefDiscovery[] = [];
22
+
23
+ const ast = await context.astgrepClient.parse("python", content);
24
+ const root = ast.root();
25
+
26
+ // ── import_statement (e.g. `import os`, `import os.path`) ───────────────
27
+ const importNodes = root.findAll({ rule: { kind: PYTHON_NODE.IMPORT_STATEMENT } });
28
+ for (const node of importNodes) {
29
+ const nameNode = node.find({ rule: { kind: PYTHON_NODE.DOTTED_NAME } });
30
+ const pkg = nameNode?.text() ?? "";
31
+ if (pkg) {
32
+ refs.push({ path: pkg, line: node.range().start.line + 1, via: "import" });
33
+ }
34
+ }
35
+
36
+ // ── import_from_statement (e.g. `from os.path import join`) ─────────────
37
+ const fromImportNodes = root.findAll({ rule: { kind: PYTHON_NODE.IMPORT_FROM_STATEMENT } });
38
+ for (const node of fromImportNodes) {
39
+ const moduleNode = node.field("module_name");
40
+ const pkg = moduleNode?.text() ?? "";
41
+ if (pkg) {
42
+ refs.push({ path: pkg, line: node.range().start.line + 1, via: "import" });
43
+ }
44
+ }
45
+
46
+ // ── open("path") ─────────────────────────────────────────────────────────
47
+ const openCallNodes = root.findAll({
48
+ rule: {
49
+ kind: PYTHON_NODE.CALL,
50
+ has: {
51
+ field: "function",
52
+ regex: "^open$",
53
+ stopBy: "neighbor",
54
+ },
55
+ },
56
+ });
57
+ for (const node of openCallNodes) {
58
+ const argsNode = node.field("arguments");
59
+ if (!argsNode) continue;
60
+ // string → string_content (Python string has no string_fragment)
61
+ const strNode = argsNode.find({ rule: { kind: PYTHON_NODE.STRING } });
62
+ const contentNode = strNode?.find({ rule: { kind: PYTHON_NODE.STRING_CONTENT } });
63
+ const path = contentNode?.text() ?? "";
64
+ if (path && isHostFsPath(path)) {
65
+ refs.push({ path, line: node.range().start.line + 1, via: "bare-path" });
66
+ }
67
+ }
68
+
69
+ // ── requests.*/urllib.* URL calls ────────────────────────────────────────
70
+ const httpCallNodes = root.findAll({
71
+ rule: {
72
+ kind: PYTHON_NODE.CALL,
73
+ has: {
74
+ field: "function",
75
+ regex: "^(?:requests|urllib)",
76
+ stopBy: "neighbor",
77
+ },
78
+ },
79
+ });
80
+ for (const node of httpCallNodes) {
81
+ const argsNode = node.field("arguments");
82
+ if (!argsNode) continue;
83
+ const strNode = argsNode.find({ rule: { kind: PYTHON_NODE.STRING } });
84
+ const contentNode = strNode?.find({ rule: { kind: PYTHON_NODE.STRING_CONTENT } });
85
+ const url = contentNode?.text() ?? "";
86
+ if (url && isUrl(url)) {
87
+ refs.push({ path: url, line: node.range().start.line + 1, via: "url" });
88
+ }
89
+ }
90
+
91
+ return refs;
92
+ }
@@ -0,0 +1,15 @@
1
+ import type { AstGrepRule } from "../../astgrep/client.js";
2
+ import { FileTypeConfig } from "../../types.js";
3
+ import { extractPythonFileRefs } from "./extractFileRefs.js";
4
+ import { PYTHON_NETWORK_RULES } from "./network.js";
5
+ import { PYTHON_SECRET_DETECTION_RULES } from "./secret-detection.js";
6
+
7
+ export const PYTHON_RULES: AstGrepRule[] = [
8
+ ...PYTHON_NETWORK_RULES,
9
+ ...PYTHON_SECRET_DETECTION_RULES,
10
+ ];
11
+
12
+ export const PYTHONG_FILETYPE_CONFIGS: FileTypeConfig = {
13
+ defaultLanguage: "python",
14
+ extractFileRefs: extractPythonFileRefs,
15
+ };
@@ -0,0 +1,26 @@
1
+ import type { AstGrepRule } from "../../astgrep/client.js";
2
+ import { DETECT_NETWORK_FETCH_RISKS } from "../shared/network-evaluators.js";
3
+
4
+ export const PYTHON_NETWORK_RULES: AstGrepRule[] = [
5
+ {
6
+ id: "net-requests",
7
+ description: "Detects Python requests usage",
8
+ grammar: "python",
9
+ patterns: [
10
+ "requests.get($URL)",
11
+ "requests.post($URL, data=$DATA)",
12
+ "requests.put($URL, data=$DATA)",
13
+ "requests.patch($URL, data=$DATA)",
14
+ ],
15
+ permission: {
16
+ tool: "requests",
17
+ scope: "net",
18
+ permission: "fetch",
19
+ metadata: {
20
+ url: "URL",
21
+ data: "DATA",
22
+ },
23
+ mappedRisks: [DETECT_NETWORK_FETCH_RISKS],
24
+ },
25
+ },
26
+ ];
@@ -0,0 +1,30 @@
1
+ import type { AstGrepRule } from "../../astgrep/client.js";
2
+ import { DETECT_SECRET_NAME_RISK } from "../shared/secret-evaluators.js";
3
+
4
+ export const PYTHON_SECRET_DETECTION_RULES: AstGrepRule[] = [
5
+ {
6
+ id: "secret-python-env-read",
7
+ description: "Detects Python env reads",
8
+ grammar: "python",
9
+ patterns: ["os.environ[$KEY]", "os.environ.get($KEY)", "os.getenv($KEY)"],
10
+ permission: {
11
+ tool: "env",
12
+ scope: "env",
13
+ permission: "read",
14
+ metadata: { key: "KEY" },
15
+ mappedRisks: [DETECT_SECRET_NAME_RISK],
16
+ },
17
+ },
18
+ {
19
+ id: "secret-python-env-write",
20
+ description: "Detects Python env writes",
21
+ grammar: "python",
22
+ patterns: ["os.environ[$KEY] = $VALUE"],
23
+ permission: {
24
+ tool: "env",
25
+ scope: "env",
26
+ permission: "write",
27
+ metadata: { key: "KEY" },
28
+ },
29
+ },
30
+ ];
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared types and utilities for file reference discovery across all language extractors.
3
+ */
4
+
5
+ import { getFileType } from "../../../shared/mod.js";
6
+
7
+ /**
8
+ * Patterns that indicate the referenced path targets the host filesystem
9
+ * rather than the skill package itself.
10
+ */
11
+ export const HOST_FS_PATTERNS: RegExp[] = [
12
+ /^~\//, // ~/... (HOME directory expansion)
13
+ /^\$[A-Z_][A-Z0-9_]*\//, // $HOME/..., $VAR/... (env var expansion)
14
+ /^\//, // /absolute/path (absolute path)
15
+ ];
16
+
17
+ /** Returns true if the path targets the host filesystem. */
18
+ export function isHostFsPath(path: string): boolean {
19
+ return HOST_FS_PATTERNS.some((p) => p.test(path));
20
+ }
21
+
22
+ /** Returns true if the string looks like a URL. */
23
+ export function isUrl(value: string): boolean {
24
+ return /^https?:\/\//i.test(value);
25
+ }
26
+
27
+ /**
28
+ * Regex pattern for bare relative paths (e.g. references/guide.md, ./script.py).
29
+ * Used by markdown and text extractors for prose scanning.
30
+ */
31
+ export const BARE_PATH_PATTERN = /(?:\.\.?\/)?[\w./-]+\.[\w-]+/g;
32
+
33
+ /** Returns true if the value looks like a file path (not a command or word). */
34
+ export function looksLikePath(value: string): boolean {
35
+ if (/^\.?\.?\//.test(value)) return true;
36
+ if (value.includes("/")) return true;
37
+ return getFileType(value) != "unknown";
38
+ }
@@ -0,0 +1,107 @@
1
+ import type {
2
+ DynamicRuleRiskMapping,
3
+ Permission,
4
+ RuleRiskResult,
5
+ StaticRuleRiskMapping,
6
+ } from "../../../shared/mod.js";
7
+ import { classifyDestination, parseUrlFromUnknown } from "../../utils/url-parser.js";
8
+
9
+ const WRITE_METHODS = new Set(["POST", "PUT", "PATCH"]);
10
+
11
+ export const DETECT_NETWORK_FETCH_RISKS: DynamicRuleRiskMapping = ({ permission }) => {
12
+ if (!permission) return null;
13
+
14
+ const rawUrl = resolveUrl(permission);
15
+ if (!rawUrl) return null;
16
+
17
+ const parsed = parseUrlFromUnknown(rawUrl);
18
+ if (!parsed) return null;
19
+
20
+ const method = resolveMethod(permission);
21
+ const destination = classifyDestination(parsed.host);
22
+ const hasSecretsInRequest = hasSecretInRequest(permission, rawUrl);
23
+ const results: RuleRiskResult[] = [];
24
+
25
+ if (destination === "external") {
26
+ if (WRITE_METHODS.has(method)) {
27
+ results.push({
28
+ code: "NETWORK:data_exfiltration",
29
+ severity: "critical",
30
+ message: `Writes data to external host ${parsed.host} via ${method}`,
31
+ metadata: {
32
+ host: parsed.host,
33
+ method,
34
+ destination,
35
+ url: parsed.raw,
36
+ },
37
+ });
38
+ } else {
39
+ results.push({
40
+ code: "NETWORK:external_network_access",
41
+ severity: "warning",
42
+ message: `Reads from external host ${parsed.host}`,
43
+ metadata: {
44
+ host: parsed.host,
45
+ method,
46
+ destination,
47
+ url: parsed.raw,
48
+ },
49
+ });
50
+ }
51
+ }
52
+
53
+ if (hasSecretsInRequest) {
54
+ results.push({
55
+ code: destination === "external"
56
+ ? "NETWORK:credential_leak"
57
+ : "NETWORK:localhost_secret_exposure",
58
+ severity: destination === "external" ? "critical" : "warning",
59
+ message: `Potential secret transmission detected for ${parsed.host}`,
60
+ metadata: {
61
+ host: parsed.host,
62
+ method,
63
+ destination,
64
+ url: parsed.raw,
65
+ },
66
+ });
67
+ }
68
+
69
+ if (results.length === 0) return null;
70
+
71
+ return results;
72
+ };
73
+
74
+ export const DETECT_REMOTE_CODE_EXECUTION_RISK: StaticRuleRiskMapping = {
75
+ code: "NETWORK:remote_code_execution",
76
+ severity: "critical",
77
+ message: "Remote output piped to shell",
78
+ };
79
+
80
+ function resolveUrl(permission: Permission): string | undefined {
81
+ const metadata = permission.metadata ?? {};
82
+ if (typeof metadata.url === "string") return metadata.url;
83
+ if (!Array.isArray(permission.args) || permission.args.length === 0) return undefined;
84
+ return permission.args.find((arg) => /\.|localhost|\//.test(arg));
85
+ }
86
+
87
+ function resolveMethod(permission: Permission): string {
88
+ const metadata = permission.metadata ?? {};
89
+ const raw = typeof metadata.method === "string"
90
+ ? metadata.method
91
+ : inferMethodFromArgs(permission.args);
92
+ return String(raw).toUpperCase();
93
+ }
94
+
95
+ function inferMethodFromArgs(args?: string[]): string {
96
+ if (!args || args.length === 0) return "GET";
97
+ const explicit = args.find((arg) => /^(get|post|put|patch|delete)$/i.test(arg));
98
+ return explicit ? explicit.toUpperCase() : "GET";
99
+ }
100
+
101
+ function hasSecretInRequest(permission: Permission, rawUrl: string): boolean {
102
+ const metadata = permission.metadata ?? {};
103
+ const header = String(metadata.header ?? metadata.headers ?? "");
104
+ return /token|authorization|bearer|api[_-]?key|secret/i.test(
105
+ `${header} ${rawUrl} ${JSON.stringify(metadata)}`,
106
+ );
107
+ }
@@ -0,0 +1,48 @@
1
+ import type { RuleRiskMapping } from "../../../shared/mod.js";
2
+
3
+ export type PromptRegexRule = {
4
+ id: string;
5
+ pattern: RegExp;
6
+ mappedRisks?: RuleRiskMapping[];
7
+ };
8
+
9
+ export const PROMPT_REGEX_RULES: PromptRegexRule[] = [
10
+ {
11
+ id: "prompt-ignore-previous",
12
+ pattern: /ignore previous instructions?/i,
13
+ mappedRisks: [{
14
+ code: "PROMPT:prompt_override",
15
+ severity: "critical",
16
+ message: "Prompt override attempt detected",
17
+ }],
18
+ },
19
+ {
20
+ id: "prompt-forget-rules",
21
+ pattern: /forget (all )?(previous|earlier) rules/i,
22
+ mappedRisks: [{
23
+ code: "PROMPT:prompt_override",
24
+ severity: "critical",
25
+ message: "Prompt override attempt detected",
26
+ }],
27
+ },
28
+ {
29
+ id: "prompt-reveal-system-prompt",
30
+ pattern:
31
+ /(reveal|show|print|dump|leak|disclose|output)\b[\s\S]{0,80}\b(system prompt|hidden instructions?)/i,
32
+ mappedRisks: [{
33
+ code: "PROMPT:prompt_override",
34
+ severity: "warning",
35
+ message: "Prompt override attempt detected",
36
+ }],
37
+ },
38
+ {
39
+ id: "prompt-ignore-and-reveal",
40
+ pattern:
41
+ /\b(ignore|forget)\b[\s\S]{0,80}\b(previous|earlier)\b[\s\S]{0,80}\b(instructions?|rules?|system prompt)/i,
42
+ mappedRisks: [{
43
+ code: "PROMPT:prompt_override",
44
+ severity: "critical",
45
+ message: "Prompt override attempt detected",
46
+ }],
47
+ },
48
+ ];
@@ -0,0 +1,13 @@
1
+ import type { DynamicRuleRiskMapping } from "../../../shared/mod.js";
2
+ import { isSecretLikeName, normalizeKeyCandidate } from "../../utils/secret-validator.js";
3
+
4
+ export const DETECT_SECRET_NAME_RISK: DynamicRuleRiskMapping = ({ finding }) => {
5
+ const key = normalizeKeyCandidate(finding.extracted.key ?? finding.extracted.var);
6
+ if (!isSecretLikeName(key)) return null;
7
+
8
+ return {
9
+ code: "SECRETS:secret_access",
10
+ severity: "warning",
11
+ message: `Potential secret or credential access: ${key}`,
12
+ };
13
+ };
@@ -0,0 +1,12 @@
1
+ import type { AstGrepRule } from "../../astgrep/client.js";
2
+ import { FileTypeConfig } from "../../types.js";
3
+ import { extractCodeBlocks } from "../markdown/extractCodeBlocks.js";
4
+ import { extractMarkdownFileRefs } from "../markdown/extractFileRefs.js";
5
+
6
+ export const TEXT_RULES: AstGrepRule[] = [];
7
+
8
+ export const TEXT_FILETYPE_CONFIG: FileTypeConfig = {
9
+ extractCodeBlocks,
10
+ defaultLanguage: "markdown",
11
+ extractFileRefs: extractMarkdownFileRefs,
12
+ };
@@ -0,0 +1,7 @@
1
+ import type { AstGrepRule } from "../../astgrep/client.js";
2
+ import { JAVASCRIPT_RULES } from "../javascript/mod.js";
3
+
4
+ export const TYPESCRIPT_RULES: AstGrepRule[] = [...JAVASCRIPT_RULES].map((rule) => ({
5
+ ...rule,
6
+ language: "typescript",
7
+ }));