| 22 | * Globs are evaluated once per scan against the project root. |
| 23 | */ |
| 24 | export interface MatcherGate { |
| 25 | /** |
| 26 | * Any-of: matcher runs if at least one of these tags is present in the |
| 27 | * detected tech list. Tags are lowercase short names (`"laravel"`, |
| 28 | * `"nextjs"`, `"django"`, `"rails"`). |
| 29 | */ |
| 30 | tech?: string[]; |
| 31 | /** Any-of: at least one of these paths must exist (globs allowed). */ |
| 32 | sentinelFiles?: string[]; |
| 33 | /** |
| 34 | * When a sentinel path matches, the file content must also satisfy this |
| 35 | * predicate. Used when a generic sentinel (`composer.json`, |
| 36 | * `package.json`) needs deeper inspection ("does composer.json depend |
| 37 | * on `laravel/framework`?"). Receives the relative path that matched |
| 38 | * and the file content. |
| 39 | */ |
| 40 | sentinelContains?: (path: string, content: string) => boolean; |
| 41 | } |
| 42 | |
| 43 | export interface MatcherPlugin { |
| 44 | slug: string; |
nothing calls this directly
no outgoing calls
no test coverage detected