@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.
- package/README.md +73 -0
- package/esm/analyzer/astgrep/client.d.ts +20 -8
- package/esm/analyzer/astgrep/client.d.ts.map +1 -1
- package/esm/analyzer/astgrep/client.js +58 -31
- package/esm/analyzer/config/default.d.ts +8 -0
- package/esm/analyzer/config/default.d.ts.map +1 -0
- package/esm/analyzer/config/default.js +91 -0
- package/esm/analyzer/config/helpers.d.ts +8 -0
- package/esm/analyzer/config/helpers.d.ts.map +1 -0
- package/esm/analyzer/config/helpers.js +72 -0
- package/esm/analyzer/config/mod.d.ts +4 -0
- package/esm/analyzer/config/mod.d.ts.map +1 -0
- package/esm/analyzer/config/mod.js +3 -0
- package/esm/analyzer/config/types.d.ts +58 -0
- package/esm/analyzer/config/types.d.ts.map +1 -0
- package/esm/analyzer/{config.js → config/types.js} +0 -28
- package/esm/analyzer/logging.d.ts +3 -0
- package/esm/analyzer/logging.d.ts.map +1 -0
- package/esm/analyzer/logging.js +6 -0
- package/esm/analyzer/mod.d.ts +12 -5
- package/esm/analyzer/mod.d.ts.map +1 -1
- package/esm/analyzer/mod.js +25 -12
- package/esm/analyzer/result.d.ts +35 -0
- package/esm/analyzer/result.d.ts.map +1 -0
- package/esm/analyzer/result.js +311 -0
- package/esm/analyzer/rules/bash/commands/mod.d.ts +1 -0
- package/esm/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
- package/esm/analyzer/rules/bash/commands/mod.js +3 -0
- package/esm/analyzer/rules/bash/commands/pip.d.ts +3 -0
- package/esm/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
- package/esm/analyzer/rules/bash/commands/pip.js +14 -0
- package/esm/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
- package/esm/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
- package/esm/analyzer/rules/bash/extractFileRefs.js +2 -2
- package/esm/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
- package/esm/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
- package/esm/analyzer/rules/bash/inline-command-classifier.js +4 -4
- package/esm/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
- package/esm/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
- package/esm/analyzer/rules/javascript/extractFileRefs.js +3 -4
- package/esm/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
- package/esm/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
- package/esm/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
- package/esm/analyzer/rules/markdown/extractFileRefs.js +2 -0
- package/esm/analyzer/rules/python/extractFileRefs.d.ts +1 -1
- package/esm/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
- package/esm/analyzer/rules/python/extractFileRefs.js +2 -2
- package/esm/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
- package/esm/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
- package/esm/analyzer/steps/001-discovery/discover-files.js +18 -2
- package/esm/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
- package/esm/analyzer/steps/001-discovery/mod.js +39 -9
- package/esm/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
- package/esm/analyzer/steps/002-permissions/mod.js +156 -73
- package/esm/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
- package/esm/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
- package/esm/analyzer/steps/002-permissions/scan-file.js +40 -5
- package/esm/analyzer/steps/002-permissions/seed-frontmatter.js +2 -2
- package/esm/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
- package/esm/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
- package/esm/analyzer/steps/003-risks/dep-risks.js +74 -0
- package/esm/analyzer/steps/003-risks/helpers.d.ts +1 -0
- package/esm/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
- package/esm/analyzer/steps/003-risks/helpers.js +1 -0
- package/esm/analyzer/steps/003-risks/mod.d.ts +3 -2
- package/esm/analyzer/steps/003-risks/mod.d.ts.map +1 -1
- package/esm/analyzer/steps/003-risks/mod.js +41 -4
- package/esm/analyzer/steps/003-risks/policy.d.ts +7 -0
- package/esm/analyzer/steps/003-risks/policy.d.ts.map +1 -0
- package/esm/analyzer/steps/003-risks/policy.js +23 -0
- package/esm/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
- package/esm/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
- package/esm/analyzer/steps/003-risks/rule-mapped.js +83 -2
- package/esm/analyzer/steps/003-risks/scoring.d.ts +9 -1
- package/esm/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
- package/esm/analyzer/steps/003-risks/scoring.js +55 -42
- package/esm/analyzer/treesitter/client.d.ts +31 -0
- package/esm/analyzer/treesitter/client.d.ts.map +1 -0
- package/esm/analyzer/{treesiter → treesitter}/client.js +43 -39
- package/esm/analyzer/treesitter/registry.d.ts +73 -0
- package/esm/analyzer/treesitter/registry.d.ts.map +1 -0
- package/esm/analyzer/treesitter/registry.js +165 -0
- package/esm/analyzer/types.d.ts +14 -28
- package/esm/analyzer/types.d.ts.map +1 -1
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +3 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +297 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +268 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
- package/esm/deps/jsr.io/@deno-library/progress/1.5.1/time.js +45 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.3/colors.js +903 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/types.js +15 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/io/0.225.0/write_all.js +61 -0
- package/esm/shared/deep_merge.d.ts +12 -0
- package/esm/shared/deep_merge.d.ts.map +1 -0
- package/esm/shared/deep_merge.js +49 -0
- package/esm/shared/mod.d.ts +1 -0
- package/esm/shared/mod.d.ts.map +1 -1
- package/esm/shared/mod.js +1 -0
- package/esm/shared/types/filetypes.d.ts +2 -2
- package/esm/shared/types/filetypes.d.ts.map +1 -1
- package/esm/shared/types/permissions.d.ts +1 -1
- package/esm/shared/types/permissions.d.ts.map +1 -1
- package/esm/shared/types/risks.d.ts +4 -1
- package/esm/shared/types/risks.d.ts.map +1 -1
- package/esm/skillreader/types.d.ts +2 -2
- package/esm/skillreader/types.d.ts.map +1 -1
- package/esm/skillreader/types.js +2 -2
- package/package.json +1 -1
- package/script/analyzer/astgrep/client.d.ts +20 -8
- package/script/analyzer/astgrep/client.d.ts.map +1 -1
- package/script/analyzer/astgrep/client.js +58 -64
- package/script/analyzer/config/default.d.ts +8 -0
- package/script/analyzer/config/default.d.ts.map +1 -0
- package/script/analyzer/config/default.js +94 -0
- package/script/analyzer/config/helpers.d.ts +8 -0
- package/script/analyzer/config/helpers.d.ts.map +1 -0
- package/script/analyzer/config/helpers.js +76 -0
- package/script/analyzer/config/mod.d.ts +4 -0
- package/script/analyzer/config/mod.d.ts.map +1 -0
- package/script/analyzer/config/mod.js +21 -0
- package/script/analyzer/config/types.d.ts +58 -0
- package/script/analyzer/config/types.d.ts.map +1 -0
- package/script/analyzer/{config.js → config/types.js} +1 -29
- package/script/analyzer/logging.d.ts +3 -0
- package/script/analyzer/logging.d.ts.map +1 -0
- package/script/analyzer/logging.js +9 -0
- package/script/analyzer/mod.d.ts +12 -5
- package/script/analyzer/mod.d.ts.map +1 -1
- package/script/analyzer/mod.js +35 -20
- package/script/analyzer/result.d.ts +35 -0
- package/script/analyzer/result.d.ts.map +1 -0
- package/script/analyzer/result.js +315 -0
- package/script/analyzer/rules/bash/commands/mod.d.ts +1 -0
- package/script/analyzer/rules/bash/commands/mod.d.ts.map +1 -1
- package/script/analyzer/rules/bash/commands/mod.js +3 -0
- package/script/analyzer/rules/bash/commands/pip.d.ts +3 -0
- package/script/analyzer/rules/bash/commands/pip.d.ts.map +1 -0
- package/script/analyzer/rules/bash/commands/pip.js +17 -0
- package/script/analyzer/rules/bash/extractFileRefs.d.ts +1 -1
- package/script/analyzer/rules/bash/extractFileRefs.d.ts.map +1 -1
- package/script/analyzer/rules/bash/extractFileRefs.js +2 -2
- package/script/analyzer/rules/bash/inline-command-classifier.d.ts +1 -1
- package/script/analyzer/rules/bash/inline-command-classifier.d.ts.map +1 -1
- package/script/analyzer/rules/bash/inline-command-classifier.js +4 -4
- package/script/analyzer/rules/javascript/extractFileRefs.d.ts +3 -4
- package/script/analyzer/rules/javascript/extractFileRefs.d.ts.map +1 -1
- package/script/analyzer/rules/javascript/extractFileRefs.js +3 -4
- package/script/analyzer/rules/markdown/extractCodeBlocks.d.ts.map +1 -1
- package/script/analyzer/rules/markdown/extractCodeBlocks.js +6 -3
- package/script/analyzer/rules/markdown/extractFileRefs.d.ts.map +1 -1
- package/script/analyzer/rules/markdown/extractFileRefs.js +2 -0
- package/script/analyzer/rules/python/extractFileRefs.d.ts +1 -1
- package/script/analyzer/rules/python/extractFileRefs.d.ts.map +1 -1
- package/script/analyzer/rules/python/extractFileRefs.js +2 -2
- package/script/analyzer/steps/001-discovery/discover-files.d.ts +4 -0
- package/script/analyzer/steps/001-discovery/discover-files.d.ts.map +1 -1
- package/script/analyzer/steps/001-discovery/discover-files.js +18 -2
- package/script/analyzer/steps/001-discovery/mod.d.ts.map +1 -1
- package/script/analyzer/steps/001-discovery/mod.js +77 -11
- package/script/analyzer/steps/002-permissions/mod.d.ts.map +1 -1
- package/script/analyzer/steps/002-permissions/mod.js +194 -75
- package/script/analyzer/steps/002-permissions/scan-file.d.ts +1 -1
- package/script/analyzer/steps/002-permissions/scan-file.d.ts.map +1 -1
- package/script/analyzer/steps/002-permissions/scan-file.js +40 -5
- package/script/analyzer/steps/002-permissions/seed-frontmatter.js +3 -3
- package/script/analyzer/steps/003-risks/dep-risks.d.ts +3 -0
- package/script/analyzer/steps/003-risks/dep-risks.d.ts.map +1 -0
- package/script/analyzer/steps/003-risks/dep-risks.js +77 -0
- package/script/analyzer/steps/003-risks/helpers.d.ts +1 -0
- package/script/analyzer/steps/003-risks/helpers.d.ts.map +1 -1
- package/script/analyzer/steps/003-risks/helpers.js +1 -0
- package/script/analyzer/steps/003-risks/mod.d.ts +3 -2
- package/script/analyzer/steps/003-risks/mod.d.ts.map +1 -1
- package/script/analyzer/steps/003-risks/mod.js +77 -4
- package/script/analyzer/steps/003-risks/policy.d.ts +7 -0
- package/script/analyzer/steps/003-risks/policy.d.ts.map +1 -0
- package/script/analyzer/steps/003-risks/policy.js +29 -0
- package/script/analyzer/steps/003-risks/rule-mapped.d.ts +2 -2
- package/script/analyzer/steps/003-risks/rule-mapped.d.ts.map +1 -1
- package/script/analyzer/steps/003-risks/rule-mapped.js +83 -2
- package/script/analyzer/steps/003-risks/scoring.d.ts +9 -1
- package/script/analyzer/steps/003-risks/scoring.d.ts.map +1 -1
- package/script/analyzer/steps/003-risks/scoring.js +55 -42
- package/script/analyzer/treesitter/client.d.ts +31 -0
- package/script/analyzer/treesitter/client.d.ts.map +1 -0
- package/script/analyzer/treesitter/client.js +136 -0
- package/script/analyzer/treesitter/registry.d.ts +73 -0
- package/script/analyzer/treesitter/registry.d.ts.map +1 -0
- package/script/analyzer/treesitter/registry.js +206 -0
- package/script/analyzer/types.d.ts +14 -28
- package/script/analyzer/types.d.ts.map +1 -1
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts +3 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.d.ts.map +1 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/deps.js +10 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts +93 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.d.ts.map +1 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/mod.js +334 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts +84 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.d.ts.map +1 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/multi.js +305 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts +18 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.d.ts.map +1 -0
- package/script/deps/jsr.io/@deno-library/progress/1.5.1/time.js +48 -0
- package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts +700 -0
- package/script/deps/jsr.io/@std/fmt/1.0.3/colors.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fmt/1.0.3/colors.js +986 -0
- package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts +146 -0
- package/script/deps/jsr.io/@std/io/0.225.0/types.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/io/0.225.0/types.js +18 -0
- package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts +51 -0
- package/script/deps/jsr.io/@std/io/0.225.0/write_all.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/io/0.225.0/write_all.js +65 -0
- package/script/shared/deep_merge.d.ts +12 -0
- package/script/shared/deep_merge.d.ts.map +1 -0
- package/script/shared/deep_merge.js +53 -0
- package/script/shared/mod.d.ts +1 -0
- package/script/shared/mod.d.ts.map +1 -1
- package/script/shared/mod.js +1 -0
- package/script/shared/types/filetypes.d.ts +2 -2
- package/script/shared/types/filetypes.d.ts.map +1 -1
- package/script/shared/types/permissions.d.ts +1 -1
- package/script/shared/types/permissions.d.ts.map +1 -1
- package/script/shared/types/risks.d.ts +4 -1
- package/script/shared/types/risks.d.ts.map +1 -1
- package/script/skillreader/types.d.ts +2 -2
- package/script/skillreader/types.d.ts.map +1 -1
- package/script/skillreader/types.js +2 -2
- package/src/_dnt.polyfills.ts +27 -0
- package/src/_dnt.shims.ts +64 -0
- package/src/analyzer/astgrep/client.ts +184 -0
- package/src/analyzer/astgrep/mod.ts +2 -0
- package/src/analyzer/config/default.ts +98 -0
- package/src/analyzer/config/helpers.ts +107 -0
- package/src/analyzer/config/mod.ts +3 -0
- package/src/analyzer/config/types.ts +103 -0
- package/src/analyzer/logging.ts +8 -0
- package/src/analyzer/mod.ts +118 -0
- package/src/analyzer/result.ts +393 -0
- package/src/analyzer/rules/bash/astTypes.ts +5 -0
- package/src/analyzer/rules/bash/commands/bd.ts +23 -0
- package/src/analyzer/rules/bash/commands/cron.ts +21 -0
- package/src/analyzer/rules/bash/commands/docker.ts +37 -0
- package/src/analyzer/rules/bash/commands/eval.ts +52 -0
- package/src/analyzer/rules/bash/commands/generic.ts +16 -0
- package/src/analyzer/rules/bash/commands/gh.ts +21 -0
- package/src/analyzer/rules/bash/commands/git.ts +28 -0
- package/src/analyzer/rules/bash/commands/mod.ts +38 -0
- package/src/analyzer/rules/bash/commands/node.ts +64 -0
- package/src/analyzer/rules/bash/commands/openspec.ts +16 -0
- package/src/analyzer/rules/bash/commands/pip.ts +16 -0
- package/src/analyzer/rules/bash/commands/sudo.ts +21 -0
- package/src/analyzer/rules/bash/destructive.ts +28 -0
- package/src/analyzer/rules/bash/extractFileRefs.ts +101 -0
- package/src/analyzer/rules/bash/filesystem.ts +50 -0
- package/src/analyzer/rules/bash/injection.ts +21 -0
- package/src/analyzer/rules/bash/inline-command-classifier.ts +94 -0
- package/src/analyzer/rules/bash/mod.ts +23 -0
- package/src/analyzer/rules/bash/network.ts +64 -0
- package/src/analyzer/rules/bash/secret-detection.ts +43 -0
- package/src/analyzer/rules/javascript/astTypes.ts +8 -0
- package/src/analyzer/rules/javascript/extractFileRefs.ts +131 -0
- package/src/analyzer/rules/javascript/filesystem.ts +28 -0
- package/src/analyzer/rules/javascript/injection.ts +21 -0
- package/src/analyzer/rules/javascript/mod.ts +26 -0
- package/src/analyzer/rules/javascript/network.ts +27 -0
- package/src/analyzer/rules/javascript/secret-detection.ts +68 -0
- package/src/analyzer/rules/javascript/subprocess.ts +16 -0
- package/src/analyzer/rules/markdown/astTypes.ts +35 -0
- package/src/analyzer/rules/markdown/extractCodeBlocks.ts +101 -0
- package/src/analyzer/rules/markdown/extractFileRefs.ts +179 -0
- package/src/analyzer/rules/markdown/mod.ts +12 -0
- package/src/analyzer/rules/mod.ts +77 -0
- package/src/analyzer/rules/python/astTypes.ts +9 -0
- package/src/analyzer/rules/python/extractFileRefs.ts +92 -0
- package/src/analyzer/rules/python/mod.ts +15 -0
- package/src/analyzer/rules/python/network.ts +26 -0
- package/src/analyzer/rules/python/secret-detection.ts +30 -0
- package/src/analyzer/rules/shared/file-refs.ts +38 -0
- package/src/analyzer/rules/shared/network-evaluators.ts +107 -0
- package/src/analyzer/rules/shared/prompt-injection.ts +48 -0
- package/src/analyzer/rules/shared/secret-evaluators.ts +13 -0
- package/src/analyzer/rules/text/mod.ts +12 -0
- package/src/analyzer/rules/typescript/mod.ts +7 -0
- package/src/analyzer/steps/001-discovery/discover-files.ts +211 -0
- package/src/analyzer/steps/001-discovery/filter-files.ts +72 -0
- package/src/analyzer/steps/001-discovery/mod.ts +103 -0
- package/src/analyzer/steps/002-permissions/mod.ts +329 -0
- package/src/analyzer/steps/002-permissions/scan-file.ts +258 -0
- package/src/analyzer/steps/002-permissions/seed-frontmatter.ts +66 -0
- package/src/analyzer/steps/002-permissions/synthesize.ts +42 -0
- package/src/analyzer/steps/003-risks/dep-risks.ts +89 -0
- package/src/analyzer/steps/003-risks/helpers.ts +41 -0
- package/src/analyzer/steps/003-risks/mod.ts +86 -0
- package/src/analyzer/steps/003-risks/policy.ts +38 -0
- package/src/analyzer/steps/003-risks/rule-mapped.ts +206 -0
- package/src/analyzer/steps/003-risks/scoring.ts +117 -0
- package/src/analyzer/steps/mod.ts +3 -0
- package/src/analyzer/treesitter/client.ts +120 -0
- package/src/analyzer/treesitter/registry.ts +198 -0
- package/src/analyzer/types.ts +78 -0
- package/src/analyzer/utils/code-block-path.ts +33 -0
- package/src/analyzer/utils/id-generator.ts +59 -0
- package/src/analyzer/utils/secret-validator.ts +29 -0
- package/src/analyzer/utils/url-parser.ts +25 -0
- package/src/deps/jsr.io/@deno-library/progress/1.5.1/deps.ts +3 -0
- package/src/deps/jsr.io/@deno-library/progress/1.5.1/mod.ts +265 -0
- package/src/deps/jsr.io/@deno-library/progress/1.5.1/multi.ts +250 -0
- package/src/deps/jsr.io/@deno-library/progress/1.5.1/time.ts +69 -0
- package/src/deps/jsr.io/@std/fmt/1.0.3/colors.ts +1004 -0
- package/src/deps/jsr.io/@std/internal/1.0.12/_os.ts +15 -0
- package/src/deps/jsr.io/@std/internal/1.0.12/os.ts +7 -0
- package/src/deps/jsr.io/@std/io/0.225.0/types.ts +157 -0
- package/src/deps/jsr.io/@std/io/0.225.0/write_all.ts +65 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/assert_path.ts +10 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/basename.ts +53 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/common.ts +26 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/constants.ts +49 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/dirname.ts +9 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/format.ts +25 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.ts +12 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.ts +295 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize.ts +9 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.ts +74 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/relative.ts +10 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.ts +25 -0
- package/src/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.ts +17 -0
- package/src/deps/jsr.io/@std/path/1.1.4/basename.ts +37 -0
- package/src/deps/jsr.io/@std/path/1.1.4/common.ts +35 -0
- package/src/deps/jsr.io/@std/path/1.1.4/constants.ts +18 -0
- package/src/deps/jsr.io/@std/path/1.1.4/dirname.ts +30 -0
- package/src/deps/jsr.io/@std/path/1.1.4/extname.ts +29 -0
- package/src/deps/jsr.io/@std/path/1.1.4/format.ts +30 -0
- package/src/deps/jsr.io/@std/path/1.1.4/from_file_url.ts +30 -0
- package/src/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.ts +94 -0
- package/src/deps/jsr.io/@std/path/1.1.4/is_absolute.ts +30 -0
- package/src/deps/jsr.io/@std/path/1.1.4/is_glob.ts +49 -0
- package/src/deps/jsr.io/@std/path/1.1.4/join.ts +31 -0
- package/src/deps/jsr.io/@std/path/1.1.4/join_globs.ts +42 -0
- package/src/deps/jsr.io/@std/path/1.1.4/mod.ts +217 -0
- package/src/deps/jsr.io/@std/path/1.1.4/normalize.ts +33 -0
- package/src/deps/jsr.io/@std/path/1.1.4/normalize_glob.ts +45 -0
- package/src/deps/jsr.io/@std/path/1.1.4/parse.ts +44 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/_util.ts +10 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/basename.ts +62 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/constants.ts +15 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/dirname.ts +72 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/extname.ts +96 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/format.ts +31 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.ts +25 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.ts +94 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.ts +25 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/join.ts +46 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/join_globs.ts +45 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize.ts +63 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.ts +43 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/parse.ts +121 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/relative.ts +103 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/resolve.ts +71 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.ts +32 -0
- package/src/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.ts +21 -0
- package/src/deps/jsr.io/@std/path/1.1.4/relative.ts +32 -0
- package/src/deps/jsr.io/@std/path/1.1.4/resolve.ts +32 -0
- package/src/deps/jsr.io/@std/path/1.1.4/to_file_url.ts +30 -0
- package/src/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.ts +31 -0
- package/src/deps/jsr.io/@std/path/1.1.4/types.ts +40 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/_util.ts +28 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/basename.ts +54 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/constants.ts +15 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/dirname.ts +118 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/extname.ts +90 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/format.ts +31 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.ts +34 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.ts +92 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.ts +40 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/join.ts +78 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/join_globs.ts +46 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize.ts +136 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.ts +43 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/parse.ts +184 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/relative.ts +128 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/resolve.ts +178 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.ts +38 -0
- package/src/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.ts +60 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_chars.ts +55 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_dumper_state.ts +841 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_loader_state.ts +1780 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_schema.ts +183 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/binary.ts +127 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/bool.ts +37 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/float.ts +112 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/int.ts +174 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/map.ts +17 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/merge.ts +13 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/nil.ts +27 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/omap.ts +30 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/pairs.ts +22 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/regexp.ts +33 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/seq.ts +13 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/set.ts +17 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/str.ts +12 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/timestamp.ts +101 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type/undefined.ts +23 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_type.ts +49 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/_utils.ts +16 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/mod.ts +54 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/parse.ts +128 -0
- package/src/deps/jsr.io/@std/yaml/1.0.11/stringify.ts +118 -0
- package/src/shared/deep_merge.ts +73 -0
- package/src/shared/mod.ts +2 -0
- package/src/shared/types/filetypes.ts +101 -0
- package/src/shared/types/findings.ts +7 -0
- package/src/shared/types/mod.ts +6 -0
- package/src/shared/types/permissions.ts +17 -0
- package/src/shared/types/references.ts +62 -0
- package/src/shared/types/risks.ts +72 -0
- package/src/shared/types/syntaxNode.ts +7 -0
- package/src/skillreader/cloudStorage/mod.ts +170 -0
- package/src/skillreader/factory.ts +71 -0
- package/src/skillreader/fs/git.ts +153 -0
- package/src/skillreader/fs/mod.ts +84 -0
- package/src/skillreader/github/base.ts +162 -0
- package/src/skillreader/github/githubApi.ts +40 -0
- package/src/skillreader/github/githubRaw.ts +24 -0
- package/src/skillreader/github/mod.ts +45 -0
- package/src/skillreader/github/utils.ts +40 -0
- package/src/skillreader/manifest.ts +67 -0
- package/src/skillreader/mod.ts +26 -0
- package/src/skillreader/types.ts +150 -0
- package/src/skillreader/utils/frontmatter-parser.ts +72 -0
- package/src/skillreader/utils/http-range.ts +38 -0
- package/src/skillreader/utils/mod.ts +12 -0
- package/esm/analyzer/astgrep/registry.d.ts +0 -18
- package/esm/analyzer/astgrep/registry.d.ts.map +0 -1
- package/esm/analyzer/astgrep/registry.js +0 -71
- package/esm/analyzer/config.d.ts +0 -27
- package/esm/analyzer/config.d.ts.map +0 -1
- package/esm/analyzer/steps/003-risks/output.d.ts +0 -3
- package/esm/analyzer/steps/003-risks/output.d.ts.map +0 -1
- package/esm/analyzer/steps/003-risks/output.js +0 -16
- package/esm/analyzer/treesiter/client.d.ts +0 -26
- package/esm/analyzer/treesiter/client.d.ts.map +0 -1
- package/script/analyzer/astgrep/registry.d.ts +0 -18
- package/script/analyzer/astgrep/registry.d.ts.map +0 -1
- package/script/analyzer/astgrep/registry.js +0 -109
- package/script/analyzer/config.d.ts +0 -27
- package/script/analyzer/config.d.ts.map +0 -1
- package/script/analyzer/steps/003-risks/output.d.ts +0 -3
- package/script/analyzer/steps/003-risks/output.d.ts.map +0 -1
- package/script/analyzer/steps/003-risks/output.js +0 -19
- package/script/analyzer/treesiter/client.d.ts +0 -26
- package/script/analyzer/treesiter/client.d.ts.map +0 -1
- package/script/analyzer/treesiter/client.js +0 -165
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export type JsonValue =
|
|
2
|
+
| null
|
|
3
|
+
| boolean
|
|
4
|
+
| number
|
|
5
|
+
| string
|
|
6
|
+
| JsonObject
|
|
7
|
+
| JsonArray;
|
|
8
|
+
|
|
9
|
+
export type JsonObject = { [key: string]: JsonValue };
|
|
10
|
+
export type JsonArray = JsonValue[];
|
|
11
|
+
|
|
12
|
+
export type ArrayMerge = (base: JsonArray, override: JsonArray) => JsonArray;
|
|
13
|
+
|
|
14
|
+
export type DeepMergeOptions = {
|
|
15
|
+
arrayMerge?: ArrayMerge;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const DEFAULT_OPTIONS: DeepMergeOptions = {
|
|
19
|
+
arrayMerge: undefined,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function isPlainObject(value: unknown): value is JsonObject {
|
|
23
|
+
if (!value || typeof value !== "object") return false;
|
|
24
|
+
const proto = Object.getPrototypeOf(value);
|
|
25
|
+
return proto === Object.prototype || proto === null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function mergeInternal(base: JsonValue, override: JsonValue, options: DeepMergeOptions): JsonValue {
|
|
29
|
+
if (override === undefined) return base;
|
|
30
|
+
|
|
31
|
+
if (Array.isArray(base) && Array.isArray(override)) {
|
|
32
|
+
return options.arrayMerge ? options.arrayMerge(base, override) : override;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (isPlainObject(base) && isPlainObject(override)) {
|
|
36
|
+
const result: JsonObject = {};
|
|
37
|
+
const keys = new Set([...Object.keys(base), ...Object.keys(override)]);
|
|
38
|
+
|
|
39
|
+
for (const key of keys) {
|
|
40
|
+
if (key in override) {
|
|
41
|
+
const merged = mergeInternal(base[key], override[key], options);
|
|
42
|
+
if (merged !== undefined) {
|
|
43
|
+
result[key] = merged;
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
result[key] = base[key];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return override;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function deepMergeJson<T>(base: T, override: unknown, options?: DeepMergeOptions): T {
|
|
57
|
+
const resolvedOptions = options ? { ...DEFAULT_OPTIONS, ...options } : DEFAULT_OPTIONS;
|
|
58
|
+
return mergeInternal(base as JsonValue, override as JsonValue, resolvedOptions) as T;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function mergeArrayUnion(base: JsonArray, override: JsonArray): JsonArray {
|
|
62
|
+
const merged = [...base, ...override];
|
|
63
|
+
const seen = new Set<unknown>();
|
|
64
|
+
const result: JsonArray = [];
|
|
65
|
+
|
|
66
|
+
for (const item of merged) {
|
|
67
|
+
if (seen.has(item)) continue;
|
|
68
|
+
seen.add(item);
|
|
69
|
+
result.push(item);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ReferenceType } from "./references.js";
|
|
2
|
+
|
|
3
|
+
export type Frontmatter = {
|
|
4
|
+
startLineNumber?: number;
|
|
5
|
+
endLineNumber?: number;
|
|
6
|
+
name?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type FileType =
|
|
12
|
+
| "markdown"
|
|
13
|
+
| "text"
|
|
14
|
+
| "bash"
|
|
15
|
+
| "javascript"
|
|
16
|
+
| "typescript"
|
|
17
|
+
| "python"
|
|
18
|
+
| "json"
|
|
19
|
+
| "yaml"
|
|
20
|
+
| "toml"
|
|
21
|
+
| "config"
|
|
22
|
+
| "sql"
|
|
23
|
+
| "csv"
|
|
24
|
+
| "xml"
|
|
25
|
+
| "binary"
|
|
26
|
+
| "unknown";
|
|
27
|
+
|
|
28
|
+
export type CodeBlock = {
|
|
29
|
+
language: FileType;
|
|
30
|
+
content: string;
|
|
31
|
+
startLine: number;
|
|
32
|
+
endLine: number;
|
|
33
|
+
type: ReferenceType;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const FILETYPE_BY_LANGUAGE: Record<string, FileType> = {
|
|
37
|
+
bash: "bash",
|
|
38
|
+
sh: "bash",
|
|
39
|
+
shell: "bash",
|
|
40
|
+
zsh: "bash",
|
|
41
|
+
js: "javascript",
|
|
42
|
+
javascript: "javascript",
|
|
43
|
+
mjs: "javascript",
|
|
44
|
+
cjs: "javascript",
|
|
45
|
+
ts: "typescript",
|
|
46
|
+
typescript: "typescript",
|
|
47
|
+
py: "python",
|
|
48
|
+
python: "python",
|
|
49
|
+
md: "markdown",
|
|
50
|
+
markdown: "markdown",
|
|
51
|
+
text: "text",
|
|
52
|
+
|
|
53
|
+
json: "json",
|
|
54
|
+
yaml: "yaml",
|
|
55
|
+
yml: "yaml",
|
|
56
|
+
toml: "toml",
|
|
57
|
+
sql: "sql",
|
|
58
|
+
csv: "csv",
|
|
59
|
+
xml: "xml",
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const FILE_TYPE_BY_EXTENSION: Record<string, FileType> = {
|
|
63
|
+
md: "markdown",
|
|
64
|
+
txt: "text",
|
|
65
|
+
sh: "bash",
|
|
66
|
+
bash: "bash",
|
|
67
|
+
js: "javascript",
|
|
68
|
+
mjs: "javascript",
|
|
69
|
+
cjs: "javascript",
|
|
70
|
+
ts: "typescript",
|
|
71
|
+
tsx: "typescript",
|
|
72
|
+
py: "python",
|
|
73
|
+
json: "json",
|
|
74
|
+
yaml: "yaml",
|
|
75
|
+
yml: "yaml",
|
|
76
|
+
toml: "toml",
|
|
77
|
+
ini: "config",
|
|
78
|
+
sql: "sql",
|
|
79
|
+
csv: "csv",
|
|
80
|
+
xml: "xml",
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const BINARY_EXTENSIONS = new Set(["zip", "tar", "gz", "png", "jpg", "jpeg", "gif", "pdf"]);
|
|
84
|
+
|
|
85
|
+
// Classifies files by extension with a safe unknown fallback.
|
|
86
|
+
export function getFileType(path: string): FileType {
|
|
87
|
+
const lower = path.toLowerCase();
|
|
88
|
+
|
|
89
|
+
const ext = lower.split(".").pop();
|
|
90
|
+
if (!ext) return "unknown";
|
|
91
|
+
|
|
92
|
+
if (FILE_TYPE_BY_EXTENSION[ext]) return FILE_TYPE_BY_EXTENSION[ext];
|
|
93
|
+
if (BINARY_EXTENSIONS.has(ext)) return "binary";
|
|
94
|
+
|
|
95
|
+
return "unknown";
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function isFile(path: string): boolean {
|
|
99
|
+
const ft = getFileType(path);
|
|
100
|
+
return ft !== "unknown" && ft != "binary";
|
|
101
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FileRole, Reference } from "./references.js";
|
|
2
|
+
|
|
3
|
+
export type PermissionScope = "fs" | "sys" | "net" | "env" | "hooks" | "data" | "dep";
|
|
4
|
+
|
|
5
|
+
export type Permission = {
|
|
6
|
+
id: string;
|
|
7
|
+
tool: string;
|
|
8
|
+
scope: PermissionScope;
|
|
9
|
+
permission: string;
|
|
10
|
+
args?: string[];
|
|
11
|
+
fileRole?: FileRole;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
references: Reference[];
|
|
14
|
+
source: "frontmatter" | "detected" | "inferred";
|
|
15
|
+
comment?: string;
|
|
16
|
+
risks: string[];
|
|
17
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { FileType } from "./filetypes.js";
|
|
2
|
+
|
|
3
|
+
export type ReferenceType = "frontmatter" | "content" | "script" | "inline";
|
|
4
|
+
|
|
5
|
+
export type Reference = {
|
|
6
|
+
file: string;
|
|
7
|
+
line: number;
|
|
8
|
+
lineEnd?: number;
|
|
9
|
+
type: ReferenceType;
|
|
10
|
+
referencedBy?: Reference;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type SourceType = "local" | "external";
|
|
14
|
+
|
|
15
|
+
export type FileRole =
|
|
16
|
+
| "entrypoint"
|
|
17
|
+
| "license"
|
|
18
|
+
| "readme"
|
|
19
|
+
| "reference"
|
|
20
|
+
| "config"
|
|
21
|
+
| "script"
|
|
22
|
+
| "library" // unresolved imported dependency (package/module not in skill files)
|
|
23
|
+
| "regular"
|
|
24
|
+
| "host-fs"; // path targeting the host filesystem (not a skill-local file)
|
|
25
|
+
|
|
26
|
+
export type FileRefDiscoveryMethod =
|
|
27
|
+
| "markdown-link" // [text](path) explicit markdown link
|
|
28
|
+
| "inline-code" // `command path` inline code token
|
|
29
|
+
| "bare-path" // bare path-like string in prose
|
|
30
|
+
| "import" // import/require/from package statement
|
|
31
|
+
| "url" // URL referenced by a network command (curl, wget, fetch)
|
|
32
|
+
| "source" // shell source / . file.sh include
|
|
33
|
+
| "code-block"; // virtual code block reference within parent file
|
|
34
|
+
|
|
35
|
+
export type FileReference = {
|
|
36
|
+
/** The relative path of file to the root of the skill */
|
|
37
|
+
path: string;
|
|
38
|
+
sourceType: SourceType;
|
|
39
|
+
fileType: FileType;
|
|
40
|
+
role: FileRole;
|
|
41
|
+
depth: number;
|
|
42
|
+
referencedBy?: Reference;
|
|
43
|
+
/** How this reference was discovered during file extraction. */
|
|
44
|
+
discoveryMethod?: FileRefDiscoveryMethod;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Adds semantic meaning to paths for priority and reporting.
|
|
48
|
+
export function getFileRole(path: string): FileRole {
|
|
49
|
+
const base = path.split("/").pop()?.toLowerCase() ?? "";
|
|
50
|
+
const lower = path.toLowerCase();
|
|
51
|
+
if (base === "skill.md") return "entrypoint";
|
|
52
|
+
if (base === "reference.md" || lower.includes("/references/")) return "reference";
|
|
53
|
+
if (base.startsWith("license")) return "license";
|
|
54
|
+
if (base.startsWith("readme")) return "readme";
|
|
55
|
+
if (lower.includes("/scripts/")) return "script";
|
|
56
|
+
if (/\.(env\.example|sample\.|template|example\.)/i.test(base)) return "config";
|
|
57
|
+
return "regular";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getSourceType(existsInSkill: boolean): SourceType {
|
|
61
|
+
return existsInSkill ? "local" : "external";
|
|
62
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Finding } from "./findings.js";
|
|
2
|
+
import { Permission } from "./permissions.js";
|
|
3
|
+
import { Reference } from "./references.js";
|
|
4
|
+
|
|
5
|
+
export type Severity = "info" | "warning" | "critical";
|
|
6
|
+
|
|
7
|
+
type NETWORK_RISK_CODES =
|
|
8
|
+
| "NETWORK:data_exfiltration"
|
|
9
|
+
| "NETWORK:external_network_access"
|
|
10
|
+
| "NETWORK:remote_code_execution"
|
|
11
|
+
| "NETWORK:credential_leak"
|
|
12
|
+
| "NETWORK:localhost_secret_exposure";
|
|
13
|
+
|
|
14
|
+
type INJECTION_RISK_CODES = "INJECTION:command_injection";
|
|
15
|
+
|
|
16
|
+
type PROMPT_RISK_CODES = "PROMPT:prompt_override";
|
|
17
|
+
|
|
18
|
+
type DESTRUCTIVE_RISK_CODES =
|
|
19
|
+
| "DESTRUCTIVE:destructive_behavior"
|
|
20
|
+
| "DESTRUCTIVE:permission_weakening";
|
|
21
|
+
|
|
22
|
+
type PRIVILEGE_RISK_CODES = "PRIVILEGE:privilege_escalation";
|
|
23
|
+
|
|
24
|
+
type PERSISTENCE_RISK_CODES = "PERSISTENCE:persistence";
|
|
25
|
+
|
|
26
|
+
type SECRETS_RISK_CODES = "SECRETS:secret_access";
|
|
27
|
+
|
|
28
|
+
type DEPENDENCY_RISK_CODES = "DEPENDENCY:external_import";
|
|
29
|
+
|
|
30
|
+
type REFERENCE_RISK_CODES = "REFERENCE:external_file";
|
|
31
|
+
|
|
32
|
+
export type RiskCode =
|
|
33
|
+
| NETWORK_RISK_CODES
|
|
34
|
+
| INJECTION_RISK_CODES
|
|
35
|
+
| PROMPT_RISK_CODES
|
|
36
|
+
| DESTRUCTIVE_RISK_CODES
|
|
37
|
+
| PRIVILEGE_RISK_CODES
|
|
38
|
+
| PERSISTENCE_RISK_CODES
|
|
39
|
+
| SECRETS_RISK_CODES
|
|
40
|
+
| DEPENDENCY_RISK_CODES
|
|
41
|
+
| REFERENCE_RISK_CODES;
|
|
42
|
+
|
|
43
|
+
export type RuleRiskResult = {
|
|
44
|
+
code: RiskCode;
|
|
45
|
+
severity: Severity;
|
|
46
|
+
message: string;
|
|
47
|
+
metadata?: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export type RuleRiskInput = {
|
|
51
|
+
permission?: Permission;
|
|
52
|
+
finding: Finding;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export type Risk = {
|
|
56
|
+
id: string;
|
|
57
|
+
type: RiskCode;
|
|
58
|
+
groupKey?: string;
|
|
59
|
+
severity: Severity;
|
|
60
|
+
message: string;
|
|
61
|
+
reference: Reference;
|
|
62
|
+
permissions: string[];
|
|
63
|
+
metadata?: Record<string, unknown>;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export type StaticRuleRiskMapping = RuleRiskResult;
|
|
67
|
+
|
|
68
|
+
export type DynamicRuleRiskMapping = (
|
|
69
|
+
input: RuleRiskInput,
|
|
70
|
+
) => RuleRiskResult | RuleRiskResult[] | null;
|
|
71
|
+
|
|
72
|
+
export type RuleRiskMapping = StaticRuleRiskMapping | DynamicRuleRiskMapping;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { isProbablyText } from "../utils/mod.js";
|
|
2
|
+
import type { SkillFile, SkillManifest, SkillZipManifest, ZipManifestFile } from "../types.js";
|
|
3
|
+
import { SkillReader } from "../types.js";
|
|
4
|
+
import { isZipManifest, parseSkillManifest } from "../manifest.js";
|
|
5
|
+
import { decompressDeflateStream, fetchRangeStream } from "../utils/http-range.js";
|
|
6
|
+
import { getFileType } from "../../shared/mod.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ZIP local file header signature (magic number: 0x04034b50).
|
|
10
|
+
*/
|
|
11
|
+
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* ZIP local file header fixed section length in bytes.
|
|
15
|
+
*/
|
|
16
|
+
const LOCAL_FILE_HEADER_LENGTH = 30;
|
|
17
|
+
|
|
18
|
+
export type CloudStorageSkillReaderOptions = {
|
|
19
|
+
/**
|
|
20
|
+
* Base URL for skill storage (CloudFront/CDN).
|
|
21
|
+
* Example: https://d1234abcd.cloudfront.net/skills/my-skill/v1.0.0
|
|
22
|
+
*/
|
|
23
|
+
baseUrl: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Reader for skill-lab backend cloud storage (public CDN).
|
|
28
|
+
*/
|
|
29
|
+
export class CloudStorageSkillReader extends SkillReader {
|
|
30
|
+
private baseUrl: string;
|
|
31
|
+
private cachedManifest: SkillManifest | null = null;
|
|
32
|
+
private dataOffsetCache = new Map<string, number>();
|
|
33
|
+
|
|
34
|
+
constructor(options: CloudStorageSkillReaderOptions) {
|
|
35
|
+
super();
|
|
36
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async retrieveFiles(dir?: string): Promise<SkillFile[]> {
|
|
40
|
+
const manifest = await this.readManifest();
|
|
41
|
+
if (!manifest) {
|
|
42
|
+
throw new Error("Manifest not found at storage URL");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const targetPrefix = dir ? normalizePrefix(dir) : "";
|
|
46
|
+
|
|
47
|
+
return manifest.files
|
|
48
|
+
.filter((file) => {
|
|
49
|
+
if (!targetPrefix) return true;
|
|
50
|
+
return file.path.startsWith(`${targetPrefix}/`);
|
|
51
|
+
})
|
|
52
|
+
.map((file) => ({
|
|
53
|
+
path: file.path,
|
|
54
|
+
size: file.size,
|
|
55
|
+
contentType: getFileType(file.path),
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async readTextFile(path: string): Promise<string | null> {
|
|
60
|
+
const contentType = getFileType(path);
|
|
61
|
+
if (contentType === "binary") return null;
|
|
62
|
+
|
|
63
|
+
const stream = await this.readFile(path);
|
|
64
|
+
if (!stream) return null;
|
|
65
|
+
|
|
66
|
+
const buffer = new Uint8Array(await new Response(stream).arrayBuffer());
|
|
67
|
+
if (!isProbablyText(buffer)) return null;
|
|
68
|
+
|
|
69
|
+
return new TextDecoder().decode(buffer);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async readFile(path: string): Promise<ReadableStream<Uint8Array> | null> {
|
|
73
|
+
const manifest = await this.readManifest();
|
|
74
|
+
if (!manifest) return null;
|
|
75
|
+
|
|
76
|
+
if (isZipManifest(manifest)) {
|
|
77
|
+
return await this.readFileFromZip(path, manifest);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const fileUrl = `${this.baseUrl}/${path.replace(/^\/+/, "")}`;
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch(fileUrl);
|
|
83
|
+
if (!response.ok) return null;
|
|
84
|
+
return response.body;
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async readManifest(): Promise<SkillManifest | null> {
|
|
91
|
+
if (this.cachedManifest) return this.cachedManifest;
|
|
92
|
+
|
|
93
|
+
const manifestUrl = `${this.baseUrl}/manifest.json`;
|
|
94
|
+
try {
|
|
95
|
+
const response = await fetch(manifestUrl);
|
|
96
|
+
if (!response.ok) return null;
|
|
97
|
+
|
|
98
|
+
const text = await response.text();
|
|
99
|
+
const manifest = parseSkillManifest(text);
|
|
100
|
+
this.cachedManifest = manifest;
|
|
101
|
+
return manifest;
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private async readFileFromZip(
|
|
108
|
+
path: string,
|
|
109
|
+
manifest: SkillZipManifest,
|
|
110
|
+
): Promise<ReadableStream<Uint8Array> | null> {
|
|
111
|
+
const normalizedPath = path.replace(/^\/+/, "");
|
|
112
|
+
const fileEntry = manifest.files.find((file) => file.path === normalizedPath);
|
|
113
|
+
if (!fileEntry) return null;
|
|
114
|
+
|
|
115
|
+
const zipUrl = `${this.baseUrl}/skill.zip`;
|
|
116
|
+
const dataOffset = await this.getDataOffset(zipUrl, fileEntry);
|
|
117
|
+
const rangeStream = await fetchRangeStream(zipUrl, dataOffset, fileEntry.compressedSize);
|
|
118
|
+
|
|
119
|
+
if (fileEntry.compressionMethod === 0) {
|
|
120
|
+
return rangeStream;
|
|
121
|
+
}
|
|
122
|
+
if (fileEntry.compressionMethod === 8) {
|
|
123
|
+
return decompressDeflateStream(rangeStream);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
throw new Error(`Unsupported compression: ${fileEntry.compressionMethod}`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private async getDataOffset(
|
|
130
|
+
zipUrl: string,
|
|
131
|
+
fileEntry: Pick<ZipManifestFile, "path" | "offset">,
|
|
132
|
+
): Promise<number> {
|
|
133
|
+
const cached = this.dataOffsetCache.get(fileEntry.path);
|
|
134
|
+
if (cached !== undefined) return cached;
|
|
135
|
+
|
|
136
|
+
const headerStream = await fetchRangeStream(
|
|
137
|
+
zipUrl,
|
|
138
|
+
fileEntry.offset,
|
|
139
|
+
LOCAL_FILE_HEADER_LENGTH,
|
|
140
|
+
);
|
|
141
|
+
const headerBuffer = new Uint8Array(await new Response(headerStream).arrayBuffer());
|
|
142
|
+
|
|
143
|
+
if (headerBuffer.byteLength < LOCAL_FILE_HEADER_LENGTH) {
|
|
144
|
+
throw new Error("Failed to read ZIP header");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const view = new DataView(
|
|
148
|
+
headerBuffer.buffer,
|
|
149
|
+
headerBuffer.byteOffset,
|
|
150
|
+
headerBuffer.byteLength,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const signature = view.getUint32(0, true);
|
|
154
|
+
if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {
|
|
155
|
+
throw new Error(`Invalid ZIP signature at offset ${fileEntry.offset}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const fileNameLength = view.getUint16(26, true);
|
|
159
|
+
const extraFieldLength = view.getUint16(28, true);
|
|
160
|
+
const dataOffset = fileEntry.offset + LOCAL_FILE_HEADER_LENGTH +
|
|
161
|
+
fileNameLength + extraFieldLength;
|
|
162
|
+
|
|
163
|
+
this.dataOffsetCache.set(fileEntry.path, dataOffset);
|
|
164
|
+
return dataOffset;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function normalizePrefix(prefix: string): string {
|
|
169
|
+
return prefix.replace(/^\/+|\/+$/g, "");
|
|
170
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as dntShim from "../_dnt.shims.js";
|
|
2
|
+
import { join } from "../deps/jsr.io/@std/path/1.1.4/mod.js";
|
|
3
|
+
import { LocalFsSkillReader } from "./fs/mod.js";
|
|
4
|
+
import { ensureGitRepoRoot, LocalGitSkillReader } from "./fs/git.js";
|
|
5
|
+
import { GitHubSkillReader } from "./github/mod.js";
|
|
6
|
+
import { parseGitHubRepo } from "./github/utils.js";
|
|
7
|
+
import type { SkillReader } from "./types.js";
|
|
8
|
+
|
|
9
|
+
export type SkillReaderFactoryOptions = {
|
|
10
|
+
source: string;
|
|
11
|
+
subDir?: string;
|
|
12
|
+
gitRef?: string;
|
|
13
|
+
githubToken?: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export class SkillReaderFactory {
|
|
17
|
+
static async create(options: SkillReaderFactoryOptions): Promise<SkillReader> {
|
|
18
|
+
const source = options.source.trim();
|
|
19
|
+
if (!source) {
|
|
20
|
+
throw new Error("Source is required");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const githubParsed = parseGitHubRepo(source);
|
|
24
|
+
if (githubParsed) {
|
|
25
|
+
return new GitHubSkillReader({
|
|
26
|
+
repoUrl: source,
|
|
27
|
+
gitRef: options.gitRef,
|
|
28
|
+
dir: options.subDir,
|
|
29
|
+
token: options.githubToken ?? dntShim.Deno.env.get("GITHUB_TOKEN") ?? undefined,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (isHttpUrl(source)) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
"Invalid source: URL must be a GitHub repository URL or a local directory path",
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const rootPath = options.subDir ? join(source, options.subDir) : source;
|
|
40
|
+
if (options.gitRef) {
|
|
41
|
+
await ensureDirectory(source);
|
|
42
|
+
await ensureGitRepoRoot(source);
|
|
43
|
+
const reader = new LocalGitSkillReader({
|
|
44
|
+
repoRoot: source,
|
|
45
|
+
gitRef: options.gitRef,
|
|
46
|
+
subDir: options.subDir,
|
|
47
|
+
});
|
|
48
|
+
await reader.validateRepositoryRef();
|
|
49
|
+
return reader;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
await ensureDirectory(rootPath);
|
|
53
|
+
return new LocalFsSkillReader({ root: rootPath });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isHttpUrl(value: string): boolean {
|
|
58
|
+
return /^https?:\/\//i.test(value);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function ensureDirectory(path: string): Promise<void> {
|
|
62
|
+
try {
|
|
63
|
+
const stat = await dntShim.Deno.stat(path);
|
|
64
|
+
if (!stat.isDirectory) {
|
|
65
|
+
throw new Error("Path must be a directory");
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
+
throw new Error(`Local path not found: ${message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|