Repository: biomejs/biome (language: rust)

Issue:
Analyzer top-level suppressions
TL;DR

```js
/** biome-ignore lint/style/useConst: reason */

let foo = 1;
let bar = 12;
```

The top-level suppression comment will suppress `style/useConst` for the whole file


Discussion / hints:

Fix patch:
diff --git a/.changeset/new_top_level_suppression_for_the_analyzer.md b/.changeset/new_top_level_suppression_for_the_analyzer.md
index e9b5036c2574..bab8a8aa7e24 100644
--- a/.changeset/new_top_level_suppression_for_the_analyzer.md
+++ b/.changeset/new_top_level_suppression_for_the_analyzer.md
@@ -13,8 +13,8 @@ In the example, we suppress the rules `lint/style/useConst` and `lint/suspicious
 ```js
 // main.js
 /**
- * biome-ignore lint/style/useConst: i like let
- * biome-ignore lint/suspicious/noDebugger: needed now
+ * biome-ignore-all lint/style/useConst: i like let
+ * biome-ignore-all lint/suspicious/noDebugger: needed now
  */
 
 let path = "/path";
@@ -26,9 +26,37 @@ In this other example, we suppress `lint/suspicious/noEmptyBlock` for a whole CS
 
 ```css
 /**
-/* biome-ignore lint/suspicious/noEmptyBlock: it's fine to have empty blocks 
+/* biome-ignore-all lint/suspicious/noEmptyBlock: it's fine to have empty blocks 
 */
 
 a {}
 span {}
 ```
+
+A new diagnostic is emitted if `biome-ignore-all` suppression isn't placed at the top of the file:
+
+
+```block
+file.js:3:1 suppressions/incorrect ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+  ! Top level suppressions can only be used at the beginning of the file.
+  
+    2 │ let foo = 2;
+  > 3 │ /**
+      │ ^^^
+  > 4 │ * biome-ignore-all lint/style/useConst: reason
+  > 5 │ */
+      │ ^^
+    6 │ let bar = 33;
+  
+  i Rename this to biome-ignore
+  
+    2 │ let foo = 2;
+    3 │ /**
+  > 4 │ * biome-ignore-all lint/style/useConst: reason
+      │   ^^^^^^^^^^^^^^^^
+    5 │ */
+    6 │ let bar = 33;
+  
+
+```
diff --git a/Cargo.lock b/Cargo.lock
index a183a0063f67..4e7ec6735518 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -125,6 +125,7 @@ dependencies = [
  "biome_diagnostics",
  "biome_parser",
  "biome_rowan",
+ "biome_suppression",
  "enumflags2",
  "rustc-hash 2.0.0",
  "schemars",
diff --git a/crates/biome_analyze/Cargo.toml b/crates/biome_analyze/Cargo.toml
index e031671eb956..51fe11150da2 100644
--- a/crates/biome_analyze/Cargo.toml
+++ b/crates/biome_analyze/Cargo.toml
@@ -19,6 +19,7 @@ biome_deserialize_macros = { workspace = true, optional = true }
 biome_diagnostics        = { workspace = true }
 biome_parser             = { workspace = true }
 biome_rowan              = { workspace = true }
+biome_suppression        = { workspace = true }
 enumflags2               = { workspace = true }
 rustc-hash               = { workspace = true }
 schemars                 = { workspace = true, optional = true }
diff --git a/crates/biome_analyze/src/diagnostics.rs b/crates/biome_analyze/src/diagnostics.rs
index 71929bf4234a..6d88f5bc8263 100644
--- a/crates/biome_analyze/src/diagnostics.rs
+++ b/crates/biome_analyze/src/diagnostics.rs
@@ -171,15 +171,15 @@ impl AnalyzerSuppressionDiagnostic {
         }
     }
 
-    pub(crate) fn note(mut self, message: impl Into<String>, range: impl Into<TextRange>) -> Self {
-        self.advice.messages.push((message.into(), range.into()));
+    pub(crate) fn note(mut self, message: MarkupBuf, range: impl Into<TextRange>) -> Self {
+        self.advice.messages.push((message, range.into()));
         self
     }
 }
 
 #[derive(Debug, Default, Clone)]
 struct SuppressionAdvice {
-    messages: Vec<(String, TextRange)>,
+    messages: Vec<(MarkupBuf, TextRange)>,
 }
 
 impl Advices for SuppressionAdvice {
diff --git a/crates/biome_analyze/src/lib.rs b/crates/biome_analyze/src/lib.rs
index 2016d1d6302e..d03b986b848d 100644
--- a/crates/biome_analyze/src/lib.rs
+++ b/crates/biome_analyze/src/lib.rs
@@ -1,5 +1,6 @@
 #![deny(rustdoc::broken_intra_doc_links)]
 
+use biome_console::markup;
 use biome_parser::AnyParse;
 use rustc_hash::{FxHashMap, FxHashSet};
 use std::cmp::Ordering;
@@ -55,6 +56,7 @@ use biome_rowan::{
     AstNode, BatchMutation, Direction, Language, SyntaxElement, SyntaxToken, TextRange, TextSize,
     TokenAtOffset, TriviaPieceKind, WalkEvent,
 };
+use biome_suppression::Suppression;
 pub use suppression_action::{ApplySuppression, SuppressionAction};
 
 /// The analyzer is the main entry point into the `biome_analyze` infrastructure.
@@ -77,7 +79,7 @@ pub struct Analyzer<'analyzer, L: Language, Matcher, Break, Diag> {
     /// Executor for the query matches emitted by the visitors
     query_matcher: Matcher,
     /// Language-specific suppression comment parsing function
-    parse_suppression_comment: SuppressionParser<L, Diag>,
+    parse_suppression_comment: SuppressionParser<Diag>,
     /// Language-specific suppression comment emitter
     suppression_action: Box<dyn SuppressionAction<Language = L>>,
     /// Handles analyzer signals emitted by individual rules
@@ -102,7 +104,7 @@ where
     pub fn new(
         metadata: &'analyzer MetadataRegistry,
         query_matcher: Matcher,
-        parse_suppression_comment: SuppressionParser<L, Diag>,
+        parse_suppression_comment: SuppressionParser<Diag>,
         suppression_action: Box<dyn SuppressionAction<Language = L>>,
         emit_signal: SignalHandler<'analyzer, L, Break>,
     ) -> Self {
@@ -201,6 +203,29 @@ where
         }
 
         for suppression in line_suppressions {
+            if suppression.misplaced {
+                let signal = DiagnosticSignal::new(|| {
+                    let mut diagnostic = AnalyzerSuppressionDiagnostic::new(
+                        category!("suppressions/incorrect"),
+                        suppression.comment_span,
+                        "Top level suppressions can only be used at the beginning of the file.",
+                    );
+
+                    for ignore_range in &suppression.ignore_ranges {
+                        diagnostic = diagnostic.note(
+                            markup! {"Rename this to "<Emphasis>"biome-ignore"</Emphasis>" or move it to the top of the file"}
+                                .to_owned(),
+                            *ignore_range,
+                        );
+                    }
+
+                    diagnostic
+                });
+                if let ControlFlow::Break(br) = (emit_signal)(&signal) {
+                    return Some(br);
+                }
+                continue;
+            }
             if suppression.did_suppress_signal {
                 continue;
             }
@@ -212,7 +237,7 @@ where
                         suppression.comment_span,
                         "Suppression comment has no effect because another suppression comment suppresses the same rule.",
                     ).note(
-                        "This is the suppression comment that was used.",
+                        markup!{"This is the suppression comment that was used."}.to_owned(),
                         top_level_suppressions.range.unwrap_or_default()
                     )
                 } else {
@@ -246,7 +271,7 @@ struct PhaseRunner<'analyzer, 'phase, L: Language, Matcher, Break, Diag> {
     /// Queue for pending analyzer signals
     signal_queue: BinaryHeap<SignalEntry<'phase, L>>,
     /// Language-specific suppression comment parsing function
-    parse_suppression_comment: SuppressionParser<L, Diag>,
+    parse_suppression_comment: SuppressionParser<Diag>,
     /// Language-specific suppression comment emitter
     suppression_action: &'phase dyn SuppressionAction<Language = L>,
     /// Line index at the current position of the traversal
@@ -317,6 +342,10 @@ struct LineSuppression {
     did_suppress_signal: bool,
     /// Set to `true` when this line suppresses a signal that was already suppressed by another entity e.g. top-level suppression
     already_suppressed: bool,
+    /// Whether this line suppression is misplaced
+    misplaced: bool,
+    /// The range of the "biome-ignore"
+    ignore_ranges: FxHashSet<TextRange>,
 }
 
 impl<'a, 'phase, L, Matcher, Break, Diag> PhaseRunner<'a, 'phase, L, Matcher, Break, Diag>
@@ -531,11 +560,13 @@ where
         let mut suppress_all = false;
         let mut suppressed_rules = FxHashSet::default();
         let mut suppressed_instances = FxHashMap::default();
+        let mut ignore_ranges = FxHashSet::default();
         let mut is_top_level_suppression = false;
         let mut already_suppressed = false;
+        let mut misplaced = false;
 
-        for result in (self.parse_suppression_comment)(text, token) {
-            let kind = match result {
+        for result in (self.parse_suppression_comment)(text, range) {
+            let suppression = match result {
                 Ok(kind) => kind,
                 Err(diag) => {
                     // Emit the suppression parser diagnostic
@@ -550,14 +581,24 @@ where
                 }
             };
 
-            let (rule, instance) = match kind {
-                SuppressionKind::Everything => (None, None),
-                SuppressionKind::Rule(rule) => (Some(rule), None),
-                SuppressionKind::RuleInstance(rule, instance) => (Some(rule), Some(instance)),
-                SuppressionKind::TopLevel(rule) => (Some(rule), None),
+            let (rule, instance) = match suppression.kind {
+                AnalyzerSuppressionKind::Everything => (None, None),
+                AnalyzerSuppressionKind::Rule(rule) => (Some(rule), None),
+                AnalyzerSuppressionKind::RuleInstance(rule, instance) => {
+                    (Some(rule), Some(instance))
+                }
+                AnalyzerSuppressionKind::TopLevel(rule) => (Some(rule), None),
             };
 
-            is_top_level_suppression |= kind.is_top_level();
+            // We use `text_range` because we want to check the extended range with trivia, comments in particular
+            if suppression.is_top_level() && token.text_range().start() > TextSize::from(0) {
+                misplaced = true;
+            }
+            if let Some(ignore_range) = suppression.ignore_range {
+                ignore_ranges.insert(ignore_range);
+            }
+
+            is_top_level_suppression |= suppression.is_top_level();
 
             if let Some(rule) = rule {
                 let group_rule = rule.split_once('/');
@@ -572,7 +613,7 @@ where
                 match (key, instance) {
                     (Some(key), Some(value)) => {
                         suppressed_instances.insert(value.to_owned(), key);
-                        if kind.is_top_level() {
+                        if suppression.is_top_level() {
                             self.top_level_suppressions.insert(key);
                         }
                         if self.top_level_suppressions.has_filter(&key) {
@@ -580,7 +621,7 @@ where
                         }
                     }
                     (Some(key), None) => {
-                        if kind.is_top_level() {
+                        if suppression.is_top_level() {
                             self.top_level_suppressions.insert(key);
                         }
                         if self.top_level_suppressions.has_filter(&key) {
@@ -621,7 +662,7 @@ where
             }
         }
 
-        if is_top_level_suppression {
+        if is_top_level_suppression && !misplaced {
             self.top_level_suppressions.expand_range(range);
             return ControlFlow::Continue(());
         }
@@ -664,6 +705,8 @@ where
             suppressed_instances,
             did_suppress_signal: false,
             already_suppressed,
+            misplaced,
+            ignore_ranges,
         };
 
         self.line_suppressions.push(entry);
@@ -723,13 +766,55 @@ fn range_match(filter: Option<TextRange>, range: TextRange) -> bool {
 /// - `// biome-ignore lint/style/useWhile(foo)` -> `vec![RuleWithValue("style/useWhile", "foo")]`
 /// - `// biome-ignore lint/style/useWhile lint/nursery/noUnreachable` -> `vec![Rule("style/useWhile"), Rule("nursery/noUnreachable")]`
 /// - `/** biome-ignore lint/style/useWhile */` if the comment is top-level -> `vec![TopLevel("style/useWhile")]`
-type SuppressionParser<L, D> =
-    for<'a> fn(&'a str, &'a SyntaxToken<L>) -> Vec<Result<SuppressionKind<'a>, D>>;
+type SuppressionParser<D> =
+    for<'a> fn(&'a str, TextRange) -> Vec<Result<AnalyzerSuppression<'a>, D>>;
 
 #[derive(Debug, Clone)]
 /// This enum is used to categorize what is disabled by a suppression comment and with what syntax
-pub enum SuppressionKind<'a> {
-    // TODO: docs
+pub struct AnalyzerSuppression<'a> {
+    /// The kind of suppression
+    pub(crate) kind: AnalyzerSuppressionKind<'a>,
+
+    /// The range where the `biome-ignore` comment is placed inside the whole text
+    pub(crate) ignore_range: Option<TextRange>,
+}
+
+impl<'a> AnalyzerSuppression<'a> {
+    pub fn everything() -> Self {
+        Self {
+            kind: AnalyzerSuppressionKind::Everything,
+            ignore_range: None,
+        }
+    }
+    pub fn top_level(rule: &'a str) -> Self {
+        Self {
+            kind: AnalyzerSuppressionKind::TopLevel(rule),
+            ignore_range: None,
+        }
+    }
+
+    pub fn rule_instance(rule: &'a str, instance: &'a str) -> Self {
+        Self {
+            kind: AnalyzerSuppressionKind::RuleInstance(rule, instance),
+            ignore_range: None,
+        }
+    }
+    pub fn rule(rule: &'a str) -> Self {
+        Self {
+            kind: AnalyzerSuppressionKind::Rule(rule),
+            ignore_range: None,
+        }
+    }
+
+    #[must_use]
+    pub fn with_ignore_range(mut self, ignore_range: TextRange) -> Self {
+        self.ignore_range = Some(ignore_range);
+        self
+    }
+}
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum AnalyzerSuppressionKind<'a> {
+    // A suppression disabling all lints for the entire document/file
     TopLevel(&'a str),
     /// A suppression disabling all lints eg. `// biome-ignore lint`
     Everything,
@@ -739,9 +824,43 @@ pub enum SuppressionKind<'a> {
     RuleInstance(&'a str, &'a str),
 }
 
-impl<'a> SuppressionKind<'a> {
+/// Takes a [Suppression] and returns a [AnalyzerSuppression]
+pub fn to_analyzer_suppressions(
+    suppression: Suppression,
+    piece_range: TextRange,
+) -> Vec<AnalyzerSuppression> {
+    let mut result = Vec::with_capacity(suppression.categories.len());
+    let ignore_range = TextRange::new(
+        piece_range.add_start(suppression.range().start()).start(),
+        piece_range.add_start(suppression.range().end()).start(),
+    );
+    for (key, value) in suppression.categories {
+        if key == category!("lint") {
+            result.push(AnalyzerSuppression::everything());
+        } else {
+            let category = key.name();
+            if let Some(rule) = category.strip_prefix("lint/") {
+                if suppression.kind == biome_suppression::SuppressionKind::All {
+                    result
+                        .push(AnalyzerSuppression::top_level(rule).with_ignore_range(ignore_range));
+                } else if let Some(instance) = value {
+                    result.push(
+                        AnalyzerSuppression::rule_instance(rule, instance)
+                            .with_ignore_range(ignore_range),
+                    );
+                } else {
+                    result.push(AnalyzerSuppression::rule(rule).with_ignore_range(ignore_range));
+                }
+            }
+        }
+    }
+
+    result
+}
+
+impl<'a> AnalyzerSuppression<'a> {
     pub const fn is_top_level(&self) -> bool {
-        matches!(self, SuppressionKind::TopLevel(_))
+        matches!(self.kind, AnalyzerSuppressionKind::TopLevel(_))
     }
 }
 
diff --git a/crates/biome_analyze/src/matcher.rs b/crates/biome_analyze/src/matcher.rs
index 1c60320eb039..e19b28b064b0 100644
--- a/crates/biome_analyze/src/matcher.rs
+++ b/crates/biome_analyze/src/matcher.rs
@@ -204,7 +204,7 @@ mod tests {
         ControlFlow, MetadataRegistry, Never, Phases, QueryMatcher, RuleKey, ServiceBag,
         SignalEntry, SuppressionAction, SyntaxVisitor,
     };
-    use crate::{AnalyzerOptions, SuppressionKind};
+    use crate::{AnalyzerOptions, AnalyzerSuppression};
     use biome_diagnostics::{category, DiagnosticExt};
     use biome_diagnostics::{Diagnostic, Severity};
     use biome_rowan::{
@@ -349,14 +349,14 @@ mod tests {
             ControlFlow::Continue(())
         };
 
-        fn parse_suppression_comment<'a>(
-            comment: &'a str,
-            _token: &'_ SyntaxToken<RawLanguage>,
-        ) -> Vec<Result<SuppressionKind<'a>, Infallible>> {
+        fn parse_suppression_comment(
+            comment: &str,
+            _piece_range: TextRange,
+        ) -> Vec<Result<AnalyzerSuppression, Infallible>> {
             comment
                 .trim_start_matches("//")
                 .split(' ')
-                .map(SuppressionKind::Rule)
+                .map(AnalyzerSuppression::rule)
                 .map(Ok)
                 .collect()
         }
diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs
index db70eda3ed7c..2c363f14d20c 100644
--- a/crates/biome_analyze/src/rule.rs
+++ b/crates/biome_analyze/src/rule.rs
@@ -903,7 +903,7 @@ pub trait Rule: RuleMeta + Sized {
                 <Self::Group as RuleGroup>::NAME,
                 Self::METADATA.name
             );
-            let suppression_text = format!("biome-ignore {rule_category}");
+            let suppression_text = format!("biome-ignore-all {rule_category}");
             let root = ctx.root();
 
             if let Some(first_token) = root.syntax().first_token() {
diff --git a/crates/biome_analyze/src/suppression_action.rs b/crates/biome_analyze/src/suppression_action.rs
index 758db28934e8..446eac999658 100644
--- a/crates/biome_analyze/src/suppression_action.rs
+++ b/crates/biome_analyze/src/suppression_action.rs
@@ -91,7 +91,7 @@ pub trait SuppressionAction {
 
 /// Convenient type to store useful information
 pub struct ApplySuppression<L: Language> {
-    /// If the token is following by trailing comments
+    /// If the token is followed by trailing comments
     pub token_has_trailing_comments: bool,
     /// The token to attach the suppression
     pub token_to_apply_suppression: SyntaxToken<L>,
diff --git a/crates/biome_css_analyze/src/lib.rs b/crates/biome_css_analyze/src/lib.rs
index e04cd10b85f8..41056f3b63dc 100644
--- a/crates/biome_css_analyze/src/lib.rs
+++ b/crates/biome_css_analyze/src/lib.rs
@@ -9,11 +9,12 @@ mod utils;
 pub use crate::registry::visit_registry;
 use crate::suppression_action::CssSuppressionAction;
 use biome_analyze::{
-    AnalysisFilter, AnalyzerOptions, AnalyzerPlugin, AnalyzerSignal, ControlFlow, LanguageRoot,
-    MatchQueryParams, MetadataRegistry, RuleRegistry, SuppressionKind,
+    to_analyzer_suppressions, AnalysisFilter, AnalyzerOptions, AnalyzerPlugin, AnalyzerSignal,
+    AnalyzerSuppression, ControlFlow, LanguageRoot, MatchQueryParams, MetadataRegistry,
+    RuleRegistry,
 };
-use biome_css_syntax::{CssLanguage, CssSyntaxToken, TextSize};
-use biome_diagnostics::{category, Error};
+use biome_css_syntax::{CssLanguage, TextRange};
+use biome_diagnostics::Error;
 use biome_suppression::{parse_suppression_comment, SuppressionDiagnostic};
 use std::ops::Deref;
 use std::sync::LazyLock;
@@ -60,44 +61,27 @@ where
     F: FnMut(&dyn AnalyzerSignal<CssLanguage>) -> ControlFlow<B> + 'a,
     B: 'a,
 {
-    fn parse_linter_suppression_comment<'a>(
-        text: &'a str,
-        token: &'_ CssSyntaxToken,
-    ) -> Vec<Result<SuppressionKind<'a>, SuppressionDiagnostic>> {
+    fn parse_linter_suppression_comment(
+        text: &str,
+        piece_range: TextRange,
+    ) -> Vec<Result<AnalyzerSuppression, SuppressionDiagnostic>> {
         let mut result = Vec::new();
 
-        for comment in parse_suppression_comment(text) {
-            let categories = match comment {
-                Ok(comment) => comment.categories,
+        for suppression in parse_suppression_comment(text) {
+            let suppression = match suppression {
+                Ok(suppression) => suppression,
                 Err(err) => {
                     result.push(Err(err));
                     continue;
                 }
             };
 
-            for (key, value) in categories {
-                if key == category!("lint") {
-                    result.push(Ok(SuppressionKind::Everything));
-                } else {
-                    let category = key.name();
-                    if let Some(rule) = category.strip_prefix("lint/") {
-                        let is_top_level = {
-                            let mut trivia = token.leading_trivia().pieces().rev();
-                            match (trivia.next(), trivia.next()) {
-                                (Some(a), Some(b)) => a.is_newline() && b.is_newline(),
-                                _ => false,
-                            }
-                        };
-                        if is_top_level && token.text_range().start() == TextSize::from(0) {
-                            result.push(Ok(SuppressionKind::TopLevel(rule)));
-                        } else if let Some(instance) = value {
-                            result.push(Ok(SuppressionKind::RuleInstance(rule, instance)));
-                        } else {
-                            result.push(Ok(SuppressionKind::Rule(rule)));
-                        }
-                    }
-                }
-            }
+            let analyzer_suppressions: Vec<_> = to_analyzer_suppressions(suppression, piece_range)
+                .into_iter()
+                .map(Ok)
+                .collect();
+
+            result.extend(analyzer_suppressions)
         }
 
         result
diff --git a/crates/biome_diagnostics_categories/src/categories.rs b/crates/biome_diagnostics_categories/src/categories.rs
index 9a6bc0ba04f1..90ed8e65f1fc 100644
--- a/crates/biome_diagnostics_categories/src/categories.rs
+++ b/crates/biome_diagnostics_categories/src/categories.rs
@@ -382,7 +382,7 @@ define_categories! {
     "suppressions/unknownGroup",
     "suppressions/unknownRule",
     "suppressions/unused",
-    "suppressions/deprecatedSuppressionComment",
+    "suppressions/incorrect",
 
     // Used in tests and examples
     "args/fileNotFound",
diff --git a/crates/biome_graphql_analyze/src/lib.rs b/crates/biome_graphql_analyze/src/lib.rs
index 5046d22c9fe6..3820ad044b98 100644
--- a/crates/biome_graphql_analyze/src/lib.rs
+++ b/crates/biome_graphql_analyze/src/lib.rs
@@ -6,11 +6,12 @@ mod suppression_action;
 pub use crate::registry::visit_registry;
 use crate::suppression_action::GraphqlSuppressionAction;
 use biome_analyze::{
-    AnalysisFilter, AnalyzerOptions, AnalyzerSignal, ControlFlow, LanguageRoot, MatchQueryParams,
-    MetadataRegistry, RuleAction, RuleRegistry, SuppressionKind,
+    to_analyzer_suppressions, AnalysisFilter, AnalyzerOptions, AnalyzerSignal, AnalyzerSuppression,
+    ControlFlow, LanguageRoot, MatchQueryParams, MetadataRegistry, RuleAction, RuleRegistry,
 };
-use biome_diagnostics::{category, Error};
-use biome_graphql_syntax::{GraphqlLanguage, GraphqlSyntaxToken, TextSize};
+use biome_deserialize::TextRange;
+use biome_diagnostics::Error;
+use biome_graphql_syntax::GraphqlLanguage;
 use biome_suppression::{parse_suppression_comment, SuppressionDiagnostic};
 use std::ops::Deref;
 use std::sync::LazyLock;
@@ -57,44 +58,27 @@ where
     F: FnMut(&dyn AnalyzerSignal<GraphqlLanguage>) -> ControlFlow<B> + 'a,
     B: 'a,
 {
-    fn parse_linter_suppression_comment<'a>(
-        text: &'a str,
-        token: &'_ GraphqlSyntaxToken,
-    ) -> Vec<Result<SuppressionKind<'a>, SuppressionDiagnostic>> {
+    fn parse_linter_suppression_comment(
+        text: &str,
+        piece_range: TextRange,
+    ) -> Vec<Result<AnalyzerSuppression, SuppressionDiagnostic>> {
         let mut result = Vec::new();
 
-        for comment in parse_suppression_comment(text) {
-            let categories = match comment {
-                Ok(comment) => comment.categories,
+        for suppression in parse_suppression_comment(text) {
+            let suppression = match suppression {
+                Ok(suppression) => suppression,
                 Err(err) => {
                     result.push(Err(err));
                     continue;
                 }
             };
 
-            for (key, value) in categories {
-                if key == category!("lint") {
-                    result.push(Ok(SuppressionKind::Everything));
-                } else {
-                    let category = key.name();
-                    if let Some(rule) = category.strip_prefix("lint/") {
-                        let is_top_level = {
-                            let mut trivia = token.leading_trivia().pieces().rev();
-                            match (trivia.next(), trivia.next()) {
-                                (Some(a), Some(b)) => a.is_newline() && b.is_newline(),
-                                _ => false,
-                            }
-                        };
-                        if is_top_level && token.text_range().start() == TextSize::from(0) {
-                            result.push(Ok(SuppressionKind::TopLevel(rule)));
-                        } else if let Some(instance) = value {
-                            result.push(Ok(SuppressionKind::RuleInstance(rule, instance)));
-                        } else {
-                            result.push(Ok(SuppressionKind::Rule(rule)));
-                        }
-                    }
-                }
-            }
+            let analyzer_suppressions: Vec<_> = to_analyzer_suppressions(suppression, piece_range)
+                .into_iter()
+                .map(Ok)
+                .collect();
+
+            result.extend(analyzer_suppressions)
         }
 
         result
diff --git a/crates/biome_js_analyze/src/lib.rs b/crates/biome_js_analyze/src/lib.rs
index 4c97272d3e41..19913892ab7d 100644
--- a/crates/biome_js_analyze/src/lib.rs
+++ b/crates/biome_js_analyze/src/lib.rs
@@ -2,15 +2,15 @@
 
 use crate::suppression_action::JsSuppressionAction;
 use biome_analyze::{
-    AnalysisFilter, Analyzer, AnalyzerContext, AnalyzerOptions, AnalyzerPlugin, AnalyzerSignal,
-    ControlFlow, InspectMatcher, LanguageRoot, MatchQueryParams, MetadataRegistry, RuleAction,
-    RuleRegistry, SuppressionKind,
+    to_analyzer_suppressions, AnalysisFilter, Analyzer, AnalyzerContext, AnalyzerOptions,
+    AnalyzerPlugin, AnalyzerSignal, AnalyzerSuppression, ControlFlow, InspectMatcher, LanguageRoot,
+    MatchQueryParams, MetadataRegistry, RuleAction, RuleRegistry,
 };
 use biome_aria::AriaRoles;
-use biome_diagnostics::{category, Error as DiagnosticError};
-use biome_js_syntax::{JsFileSource, JsLanguage, JsSyntaxToken};
+use biome_diagnostics::Error as DiagnosticError;
+use biome_js_syntax::{JsFileSource, JsLanguage};
 use biome_project::PackageJson;
-use biome_rowan::TextSize;
+use biome_rowan::TextRange;
 use biome_suppression::{parse_suppression_comment, SuppressionDiagnostic};
 use std::ops::Deref;
 use std::sync::{Arc, LazyLock};
@@ -60,45 +60,27 @@ where
     F: FnMut(&dyn AnalyzerSignal<JsLanguage>) -> ControlFlow<B> + 'a,
     B: 'a,
 {
-    fn parse_linter_suppression_comment<'a>(
-        text: &'a str,
-        token: &'_ JsSyntaxToken,
-    ) -> Vec<Result<SuppressionKind<'a>, SuppressionDiagnostic>> {
+    fn parse_linter_suppression_comment(
+        text: &str,
+        piece_range: TextRange,
+    ) -> Vec<Result<AnalyzerSuppression, SuppressionDiagnostic>> {
         let mut result = Vec::new();
 
         for comment in parse_suppression_comment(text) {
-            let categories = match comment {
-                Ok(comment) => comment.categories,
+            let suppression = match comment {
+                Ok(suppression) => suppression,
                 Err(err) => {
                     result.push(Err(err));
                     continue;
                 }
             };
 
-            for (key, value) in categories {
-                if key == category!("lint") {
-                    result.push(Ok(SuppressionKind::Everything));
-                } else {
-                    let category = key.name();
-                    if let Some(rule) = category.strip_prefix("lint/") {
-                        let is_top_level = {
-                            let mut trivia = token.leading_trivia().pieces().rev();
-                            match (trivia.next(), trivia.next()) {
-                                (Some(a), Some(b)) => a.is_newline() && b.is_newline(),
-                                _ => false,
-                            }
-                        };
-
-                        if is_top_level && token.text_range().start() == TextSize::from(0) {
-                            result.push(Ok(SuppressionKind::TopLevel(rule)));
-                        } else if let Some(instance) = value {
-                            result.push(Ok(SuppressionKind::RuleInstance(rule, instance)));
-                        } else {
-                            result.push(Ok(SuppressionKind::Rule(rule)));
-                        }
-                    }
-                }
-            }
+            let analyzer_suppressions: Vec<_> = to_analyzer_suppressions(suppression, piece_range)
+                .into_iter()
+                .map(Ok)
+                .collect();
+
+            result.extend(analyzer_suppressions)
         }
 
         result
@@ -398,7 +380,7 @@ let bar = 33;
     fn top_level_suppression_simple() {
         const SOURCE: &str = "
 /**
-* biome-ignore lint/style/useConst: reason
+* biome-ignore-all lint/style/useConst: reason
 */
 
 
@@ -444,11 +426,11 @@ let bar = 33;
     fn top_level_suppression_multiple() {
         const SOURCE: &str = "
 /**
-* biome-ignore lint/style/useConst: reason
+* biome-ignore-all lint/style/useConst: reason
 */
 
 /**
-* biome-ignore lint/suspicious/noDebugger: reason2
+* biome-ignore-all lint/suspicious/noDebugger: reason2
 */
 
 
@@ -495,8 +477,8 @@ debugger;
     fn top_level_suppression_multiple2() {
         const SOURCE: &str = "
 /**
-* biome-ignore lint/style/useConst: reason
-* biome-ignore lint/suspicious/noDebugger: reason2
+* biome-ignore-all lint/style/useConst: reason
+* biome-ignore-all lint/suspicious/noDebugger: reason2
 */
 
 
@@ -585,4 +567,53 @@ let bar = 33;
             },
         );
     }
+
+    #[test]
+    fn top_level_suppression_with_block_comment() {
+        const SOURCE: &str = "
+/*
+* Top level comment here. It could be a banner or a license comment
+* MIT
+*/
+/**
+* biome-ignore-all lint/style/useConst: reason
+*/
+
+let foo = 2;
+let bar = 33;
+        ";
+
+        let parsed = parse(
+            SOURCE,
+            JsFileSource::js_module(),
+            JsParserOptions::default(),
+        );
+
+        let filter = AnalysisFilter {
+            categories: RuleCategoriesBuilder::default().with_syntax().build(),
+            ..AnalysisFilter::default()
+        };
+
+        let options = AnalyzerOptions::default();
+        analyze(
+            &parsed.tree(),
+            filter,
+            &options,
+            Vec::new(),
+            JsFileSource::js_module(),
+            None,
+            |signal| {
+                if let Some(diag) = signal.diagnostic() {
+                    let error = diag
+                        .with_file_path("dummyFile")
+                        .with_file_source_code(SOURCE);
+                    let text = print_diagnostic_to_string(&error);
+                    eprintln!("{text}");
+                    panic!("Unexpected diagnostic");
+                }
+
+                ControlFlow::<Never>::Continue(())
+            },
+        );
+    }
 }
diff --git a/crates/biome_json_analyze/src/lib.rs b/crates/biome_json_analyze/src/lib.rs
index 93e848ed53af..50b86d7c760d 100644
--- a/crates/biome_json_analyze/src/lib.rs
+++ b/crates/biome_json_analyze/src/lib.rs
@@ -9,11 +9,11 @@ pub mod utils;
 pub use crate::registry::visit_registry;
 use crate::suppression_action::JsonSuppressionAction;
 use biome_analyze::{
-    AnalysisFilter, AnalyzerOptions, AnalyzerSignal, ControlFlow, LanguageRoot, MatchQueryParams,
-    MetadataRegistry, RuleAction, RuleRegistry, SuppressionKind,
+    to_analyzer_suppressions, AnalysisFilter, AnalyzerOptions, AnalyzerSignal, AnalyzerSuppression,
+    ControlFlow, LanguageRoot, MatchQueryParams, MetadataRegistry, RuleAction, RuleRegistry,
 };
-use biome_diagnostics::{category, Error};
-use biome_json_syntax::{JsonFileSource, JsonLanguage, JsonSyntaxToken, TextSize};
+use biome_diagnostics::Error;
+use biome_json_syntax::{JsonFileSource, JsonLanguage, TextRange};
 use biome_suppression::{parse_suppression_comment, SuppressionDiagnostic};
 use std::ops::Deref;
 use std::sync::LazyLock;
@@ -62,44 +62,27 @@ where
     F: FnMut(&dyn AnalyzerSignal<JsonLanguage>) -> ControlFlow<B> + 'a,
     B: 'a,
 {
-    fn parse_linter_suppression_comment<'a>(
-        text: &'a str,
-        token: &'_ JsonSyntaxToken,
-    ) -> Vec<Result<SuppressionKind<'a>, SuppressionDiagnostic>> {
+    fn parse_linter_suppression_comment(
+        text: &str,
+        piece_range: TextRange,
+    ) -> Vec<Result<AnalyzerSuppression, SuppressionDiagnostic>> {
         let mut result = Vec::new();
 
-        for comment in parse_suppression_comment(text) {
-            let categories = match comment {
-                Ok(comment) => comment.categories,
+        for suppression in parse_suppression_comment(text) {
+            let suppression = match suppression {
+                Ok(suppression) => suppression,
                 Err(err) => {
                     result.push(Err(err));
                     continue;
                 }
             };
 
-            for (key, value) in categories {
-                if key == category!("lint") {
-                    result.push(Ok(SuppressionKind::Everything));
-                } else {
-                    let category = key.name();
-                    if let Some(rule) = category.strip_prefix("lint/") {
-                        let is_top_level = {
-                            let mut trivia = token.leading_trivia().pieces().rev();
-                            match (trivia.next(), trivia.next()) {
-                                (Some(a), Some(b)) => a.is_newline() && b.is_newline(),
-                                _ => false,
-                            }
-                        };
-                        if is_top_level && token.text_range().start() == TextSize::from(0) {
-                            result.push(Ok(SuppressionKind::TopLevel(rule)));
-                        } else if let Some(instance) = value {
-                            result.push(Ok(SuppressionKind::RuleInstance(rule, instance)));
-                        } else {
-                            result.push(Ok(SuppressionKind::Rule(rule)));
-                        }
-                    }
-                }
-            }
+            let analyzer_suppressions: Vec<_> = to_analyzer_suppressions(suppression, piece_range)
+                .into_iter()
+                .map(Ok)
+                .collect();
+
+            result.extend(analyzer_suppressions)
         }
 
         result
diff --git a/crates/biome_suppression/src/lib.rs b/crates/biome_suppression/src/lib.rs
index 8ab1d884fbd2..cf012da15a0f 100644
--- a/crates/biome_suppression/src/lib.rs
+++ b/crates/biome_suppression/src/lib.rs
@@ -1,5 +1,6 @@
 use biome_diagnostics::{Category, Diagnostic};
-use biome_rowan::{TextRange, TextSize};
+use biome_rowan::{TextLen, TextRange, TextSize};
+use std::ops::Add;
 
 /// Single instance of a suppression comment, with the following syntax:
 ///
@@ -23,6 +24,36 @@ pub struct Suppression<'a> {
     pub categories: Vec<(&'a Category, Option<&'a str>)>,
     /// Reason for this suppression comment to exist
     pub reason: &'a str,
+
+    /// What suppression is
+    pub kind: SuppressionKind,
+
+    range: TextRange,
+}
+
+impl<'a> Suppression<'a> {
+    pub fn range(&self) -> TextRange {
+        self.range
+    }
+    // pub fn reason_range(&self) -> TextRange {}
+    // pub fn categories(&self)
+}
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum SuppressionKind {
+    /// Suppressions that start with `// biome-ignore`
+    Classic,
+    /// Suppressions that start with `// biome-ignore-all`
+    All,
+}
+
+impl SuppressionKind {
+    fn text_len(&self) -> TextSize {
+        match self {
+            SuppressionKind::Classic => "biome-ignore".text_len(),
+            SuppressionKind::All => "biome-ignore-all".text_len(),
+        }
+    }
 }
 
 pub fn parse_suppression_comment(
@@ -54,6 +85,7 @@ pub fn parse_suppression_comment(
     };
 
     comment.lines().filter_map(move |line| {
+        let mut kind = SuppressionKind::Classic;
         // Eat start of line whitespace
         let mut line = line.trim_start();
 
@@ -90,13 +122,29 @@ pub fn parse_suppression_comment(
             line = line.strip_prefix(pattern)?;
         }
 
-        // Checks for `/rome[-_]ignore/i` without a regex, or skip the line
-        // entirely if it doesn't match
+        if line.starts_with("-all") {
+            kind = SuppressionKind::All;
+            line = line.strip_prefix("-all")?.trim_start();
+        }
 
-        let line = line.trim_start();
+        if line.starts_with("-ALL") {
+            kind = SuppressionKind::All;
+            line = line.strip_prefix("-ALL")?.trim_start();
+        }
 
+        let line = line.trim_start();
+        let range = match kind {
+            SuppressionKind::Classic => base.find("biome-ignore"),
+            SuppressionKind::All => base.find("biome-ignore-all"),
+        }
+        .map(|start| {
+            let start = TextSize::from(start as u32);
+            let end = start.add(kind.text_len());
+            TextRange::new(start, end)
+        })
+        .expect("To find the suppression prefix");
         Some(
-            parse_suppression_line(line).map_err(|err| SuppressionDiagnostic {
+            parse_suppression_line(line, kind, range).map_err(|err| SuppressionDiagnostic {
                 message: err.message,
                 // Adjust the position of the diagnostic in the whole comment
                 span: err.span + offset_from(base, line),
@@ -162,7 +210,11 @@ impl biome_console::fmt::Display for SuppressionDiagnosticKind {
 }
 
 /// Parse the `{ <category> { (<value>) }? }+: <reason>` section of a suppression line
-fn parse_suppression_line(base: &str) -> Result<Suppression, SuppressionDiagnostic> {
+fn parse_suppression_line(
+    base: &str,
+    kind: SuppressionKind,
+    range: TextRange,
+) -> Result<Suppression, SuppressionDiagnostic> {
     let mut line = base;
     let mut categories = Vec::new();
 
@@ -233,7 +285,12 @@ fn parse_suppression_line(base: &str) -> Result<Suppression, SuppressionDiagnost
     }
 
     let reason = line.trim_end();
-    Ok(Suppression { categories, reason })
+    Ok(Suppression {
+        categories,
+        reason,
+        kind,
+        range,
+    })
 }
 
 /// Returns the byte offset of `substr` within `base`
@@ -244,7 +301,7 @@ fn parse_suppression_line(base: &str) -> Result<Suppression, SuppressionDiagnost
 /// in undefined behavior.
 fn offset_from(base: &str, substr: &str) -> TextSize {
     let base_len = base.len();
-    assert!(substr.len() <= base_len);
+    debug_assert!(substr.len() <= base_len);
 
     let base = base.as_ptr();
     let substr = substr.as_ptr();
@@ -254,7 +311,7 @@ fn offset_from(base: &str, substr: &str) -> TextSize {
     // negative, meaning `base` is either a substring of `substr` or the two
     // string slices are unrelated
     let offset = usize::try_from(offset).expect("usize underflow");
-    assert!(offset <= base_len);
+    debug_assert!(offset <= base_len);
 
     // SAFETY: the conversion from `usize` to `TextSize` can fail if `offset`
     // is larger than 2^32
@@ -262,11 +319,11 @@ fn offset_from(base: &str, substr: &str) -> TextSize {
 }
 
 #[cfg(test)]
-mod tests {
+mod tests_biome_ignore_inline {
     use biome_diagnostics::category;
     use biome_rowan::{TextRange, TextSize};
 
-    use crate::{offset_from, SuppressionDiagnostic, SuppressionDiagnosticKind};
+    use crate::{offset_from, SuppressionDiagnostic, SuppressionDiagnosticKind, SuppressionKind};
 
     use super::{parse_suppression_comment, Suppression};
 
@@ -277,6 +334,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation1",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
 
@@ -286,6 +345,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation2",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(4), TextSize::from(16))
             })],
         );
 
@@ -299,6 +360,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation3",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(24), TextSize::from(36))
             })],
         );
 
@@ -313,6 +376,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation4",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(50), TextSize::from(62))
             })],
         );
     }
@@ -323,6 +388,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
 
@@ -331,6 +398,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
 
@@ -339,6 +408,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
     }
@@ -354,6 +425,8 @@ mod tests {
                     (category!("parse"), Some("dog"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
 
@@ -366,6 +439,8 @@ mod tests {
                     (category!("parse"), Some("cat"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(4), TextSize::from(16))
             })],
         );
 
@@ -382,6 +457,8 @@ mod tests {
                     (category!("parse"), Some("frog"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(24), TextSize::from(36))
             })],
         );
 
@@ -399,6 +476,8 @@ mod tests {
                     (category!("parse"), Some("fish"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(50), TextSize::from(62))
             })],
         );
     }
@@ -411,6 +490,8 @@ mod tests {
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None), (category!("lint"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::Classic,
+                range: TextRange::new(TextSize::from(3), TextSize::from(15))
             })],
         );
     }
@@ -474,43 +555,50 @@ mod tests {
 }
 
 #[cfg(test)]
-mod tests_biome_ignore {
+mod tests_biome_ignore_toplevel {
     use biome_diagnostics::category;
     use biome_rowan::{TextRange, TextSize};
 
-    use crate::{offset_from, SuppressionDiagnostic, SuppressionDiagnosticKind};
+    use crate::{offset_from, SuppressionDiagnostic, SuppressionDiagnosticKind, SuppressionKind};
 
     use super::{parse_suppression_comment, Suppression};
 
     #[test]
     fn parse_simple_suppression() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore parse: explanation1").collect::<Vec<_>>(),
+            parse_suppression_comment("// biome-ignore-all parse: explanation1")
+                .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation1",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
 
         assert_eq!(
-            parse_suppression_comment("/** biome-ignore parse: explanation2 */")
+            parse_suppression_comment("/** biome-ignore-all parse: explanation2 */")
                 .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation2",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(4), TextSize::from(20))
             })],
         );
 
         assert_eq!(
             parse_suppression_comment(
                 "/**
-                  * biome-ignore parse: explanation3
+                  * biome-ignore-all parse: explanation3
                   */"
             )
             .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation3",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(24), TextSize::from(40))
             })],
         );
 
@@ -518,39 +606,50 @@ mod tests_biome_ignore {
             parse_suppression_comment(
                 "/**
                   * hello
-                  * biome-ignore parse: explanation4
+                  * biome-ignore-all parse: explanation4
                   */"
             )
             .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("parse"), None)],
                 reason: "explanation4",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(50), TextSize::from(66))
             })],
         );
     }
     #[test]
     fn parse_unclosed_block_comment_suppressions() {
         assert_eq!(
-            parse_suppression_comment("/* biome-ignore format: explanation").collect::<Vec<_>>(),
+            parse_suppression_comment("/* biome-ignore-all format: explanation")
+                .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
 
         assert_eq!(
-            parse_suppression_comment("/* biome-ignore format: explanation *").collect::<Vec<_>>(),
+            parse_suppression_comment("/* biome-ignore-all format: explanation *")
+                .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
 
         assert_eq!(
-            parse_suppression_comment("/* biome-ignore format: explanation /").collect::<Vec<_>>(),
+            parse_suppression_comment("/* biome-ignore-all format: explanation /")
+                .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
     }
@@ -558,7 +657,7 @@ mod tests_biome_ignore {
     #[test]
     fn parse_multiple_suppression() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore parse(foo) parse(dog): explanation")
+            parse_suppression_comment("// biome-ignore-all parse(foo) parse(dog): explanation")
                 .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![
@@ -566,11 +665,13 @@ mod tests_biome_ignore {
                     (category!("parse"), Some("dog"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
 
         assert_eq!(
-            parse_suppression_comment("/** biome-ignore parse(bar) parse(cat): explanation */")
+            parse_suppression_comment("/** biome-ignore-all parse(bar) parse(cat): explanation */")
                 .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![
@@ -578,13 +679,15 @@ mod tests_biome_ignore {
                     (category!("parse"), Some("cat"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(4), TextSize::from(20))
             })],
         );
 
         assert_eq!(
             parse_suppression_comment(
                 "/**
-                  * biome-ignore parse(yes) parse(frog): explanation
+                  * biome-ignore-all parse(yes) parse(frog): explanation
                   */"
             )
             .collect::<Vec<_>>(),
@@ -594,6 +697,8 @@ mod tests_biome_ignore {
                     (category!("parse"), Some("frog"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(24), TextSize::from(40))
             })],
         );
 
@@ -601,7 +706,7 @@ mod tests_biome_ignore {
             parse_suppression_comment(
                 "/**
                   * hello
-                  * biome-ignore parse(wow) parse(fish): explanation
+                  * biome-ignore-all parse(wow) parse(fish): explanation
                   */"
             )
             .collect::<Vec<_>>(),
@@ -611,6 +716,8 @@ mod tests_biome_ignore {
                     (category!("parse"), Some("fish"))
                 ],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(50), TextSize::from(66))
             })],
         );
     }
@@ -618,11 +725,13 @@ mod tests_biome_ignore {
     #[test]
     fn parse_multiple_suppression_categories() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore format lint: explanation")
+            parse_suppression_comment("// biome-ignore-all format lint: explanation")
                 .collect::<Vec<_>>(),
             vec![Ok(Suppression {
                 categories: vec![(category!("format"), None), (category!("lint"), None)],
                 reason: "explanation",
+                kind: SuppressionKind::All,
+                range: TextRange::new(TextSize::from(3), TextSize::from(19))
             })],
         );
     }
@@ -643,10 +752,10 @@ mod tests_biome_ignore {
     #[test]
     fn diagnostic_missing_colon() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore format explanation").collect::<Vec<_>>(),
+            parse_suppression_comment("// biome-ignore-all format explanation").collect::<Vec<_>>(),
             vec![Err(SuppressionDiagnostic {
                 message: SuppressionDiagnosticKind::MissingColon,
-                span: TextRange::new(TextSize::from(23), TextSize::from(34))
+                span: TextRange::new(TextSize::from(27), TextSize::from(38))
             })],
         );
     }
@@ -654,10 +763,10 @@ mod tests_biome_ignore {
     #[test]
     fn diagnostic_missing_paren() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore format(:").collect::<Vec<_>>(),
+            parse_suppression_comment("// biome-ignore-all format(:").collect::<Vec<_>>(),
             vec![Err(SuppressionDiagnostic {
                 message: SuppressionDiagnosticKind::MissingParen,
-                span: TextRange::new(TextSize::from(23), TextSize::from(24))
+                span: TextRange::new(TextSize::from(27), TextSize::from(28))
             })],
         );
     }
@@ -665,10 +774,11 @@ mod tests_biome_ignore {
     #[test]
     fn diagnostic_missing_category() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore (value): explanation").collect::<Vec<_>>(),
+            parse_suppression_comment("// biome-ignore-all (value): explanation")
+                .collect::<Vec<_>>(),
             vec![Err(SuppressionDiagnostic {
                 message: SuppressionDiagnosticKind::MissingCategory,
-                span: TextRange::new(TextSize::from(16), TextSize::from(17))
+                span: TextRange::new(TextSize::from(20), TextSize::from(21))
             })],
         );
     }
@@ -676,10 +786,11 @@ mod tests_biome_ignore {
     #[test]
     fn diagnostic_unknown_category() {
         assert_eq!(
-            parse_suppression_comment("// biome-ignore unknown: explanation").collect::<Vec<_>>(),
+            parse_suppression_comment("// biome-ignore-all unknown: explanation")
+                .collect::<Vec<_>>(),
             vec![Err(SuppressionDiagnostic {
                 message: SuppressionDiagnosticKind::ParseCategory(String::from("unknown")),
-                span: TextRange::new(TextSize::from(16), TextSize::from(23))
+                span: TextRange::new(TextSize::from(20), TextSize::from(27))
             })],
         );
     }
diff --git a/packages/@biomejs/backend-jsonrpc/src/workspace.ts b/packages/@biomejs/backend-jsonrpc/src/workspace.ts
index f42c51e0c90d..1d458d380018 100644
--- a/packages/@biomejs/backend-jsonrpc/src/workspace.ts
+++ b/packages/@biomejs/backend-jsonrpc/src/workspace.ts
@@ -3279,7 +3279,7 @@ export type Category =
 	| "suppressions/unknownGroup"
 	| "suppressions/unknownRule"
 	| "suppressions/unused"
-	| "suppressions/deprecatedSuppressionComment"
+	| "suppressions/incorrect"
 	| "args/fileNotFound"
 	| "flags/invalid"
 	| "semanticTests";


Test patch:
diff --git a/crates/biome_cli/tests/cases/suppressions.rs b/crates/biome_cli/tests/cases/suppressions.rs
index ff91f0b5ef61..791262639e40 100644
--- a/crates/biome_cli/tests/cases/suppressions.rs
+++ b/crates/biome_cli/tests/cases/suppressions.rs
@@ -316,7 +316,7 @@ fn unused_suppression_after_top_level() {
     fs.insert(
         file_path.into(),
         *b"/**
-* biome-ignore lint/style/useConst: reason
+* biome-ignore-all lint/style/useConst: reason
 */
 
 
@@ -343,3 +343,38 @@ let bar = 33;",
         result,
     ));
 }
+
+#[test]
+fn misplaced_top_level_suppression() {
+    let mut fs = MemoryFileSystem::default();
+    let mut console = BufferConsole::default();
+
+    let file_path = Path::new("file.js");
+    fs.insert(
+        file_path.into(),
+        *b"
+let foo = 2;
+/**
+* biome-ignore-all lint/style/useConst: reason
+* biome-ignore-all lint/suspicious/noDebugger: reason
+*/
+debugger
+let bar = 33;",
+    );
+
+    let (fs, result) = run_cli(
+        fs,
+        &mut console,
+        Args::from(["lint", file_path.as_os_str().to_str().unwrap()].as_slice()),
+    );
+
+    assert!(result.is_ok(), "run_cli returned {result:?}");
+
+    assert_cli_snapshot(SnapshotPayload::new(
+        module_path!(),
+        "misplaced_top_level_suppression",
+        fs,
+        console,
+        result,
+    ));
+}
diff --git a/crates/biome_cli/tests/snapshots/main_cases_suppressions/misplaced_top_level_suppression.snap b/crates/biome_cli/tests/snapshots/main_cases_suppressions/misplaced_top_level_suppression.snap
new file mode 100644
index 000000000000..499f2916e315
--- /dev/null
+++ b/crates/biome_cli/tests/snapshots/main_cases_suppressions/misplaced_top_level_suppression.snap
@@ -0,0 +1,51 @@
+---
+source: crates/biome_cli/tests/snap_test.rs
+expression: content
+snapshot_kind: text
+---
+## `file.js`
+
+```js
+
+let foo = 2;
+/**
+* biome-ignore-all lint/style/useConst: reason
+* biome-ignore-all lint/suspicious/noDebugger: reason
+*/
+debugger
+let bar = 33;
+```
+
+# Emitted Messages
+
+```block
+file.js:3:1 suppressions/incorrect ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+  ! Top level suppressions can only be used at the beginning of the file.
+  
+    2 │ let foo = 2;
+  > 3 │ /**
+      │ ^^^
+  > 4 │ * biome-ignore-all lint/style/useConst: reason
+  > 5 │ * biome-ignore-all lint/suspicious/noDebugger: reason
+  > 6 │ */
+      │ ^^
+    7 │ debugger
+    8 │ let bar = 33;
+  
+  i Rename this to biome-ignore or move it to the top of the file
+  
+    2 │ let foo = 2;
+    3 │ /**
+  > 4 │ * biome-ignore-all lint/style/useConst: reason
+      │   ^^^^^^^^^^^^^^^^
+    5 │ * biome-ignore-all lint/suspicious/noDebugger: reason
+    6 │ */
+  
+
+```
+
+```block
+Checked 1 file in <TIME>. No fixes applied.
+Found 1 warning.
+```
diff --git a/crates/biome_cli/tests/snapshots/main_cases_suppressions/unused_suppression_after_top_level.snap b/crates/biome_cli/tests/snapshots/main_cases_suppressions/unused_suppression_after_top_level.snap
index c4e339836c93..bf7136e40483 100644
--- a/crates/biome_cli/tests/snapshots/main_cases_suppressions/unused_suppression_after_top_level.snap
+++ b/crates/biome_cli/tests/snapshots/main_cases_suppressions/unused_suppression_after_top_level.snap
@@ -1,12 +1,13 @@
 ---
 source: crates/biome_cli/tests/snap_test.rs
 expression: content
+snapshot_kind: text
 ---
 ## `file.js`
 
 ```js
 /**
-* biome-ignore lint/style/useConst: reason
+* biome-ignore-all lint/style/useConst: reason
 */
 
 
@@ -36,7 +37,7 @@ file.js:7:1 suppressions/unused ━━━━━━━━━━━━━━━━
   
   > 1 │ /**
       │ ^^^
-  > 2 │ * biome-ignore lint/style/useConst: reason
+  > 2 │ * biome-ignore-all lint/style/useConst: reason
   > 3 │ */
       │ ^^
     4 │ 
diff --git a/crates/biome_css_analyze/tests/suppression/suspicious/noDuplicateFontNames/noDuplicateFontNames.css.snap b/crates/biome_css_analyze/tests/suppression/suspicious/noDuplicateFontNames/noDuplicateFontNames.css.snap
index d512842e20a6..fe30e2c72572 100644
--- a/crates/biome_css_analyze/tests/suppression/suspicious/noDuplicateFontNames/noDuplicateFontNames.css.snap
+++ b/crates/biome_css_analyze/tests/suppression/suspicious/noDuplicateFontNames/noDuplicateFontNames.css.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_css_analyze/tests/spec_tests.rs
 expression: noDuplicateFontNames.css
+snapshot_kind: text
 ---
 # Input
 ```css
@@ -35,7 +36,7 @@ noDuplicateFontNames.css:1:56 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
@@ -67,7 +68,7 @@ noDuplicateFontNames.css:2:44 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
@@ -101,7 +102,7 @@ noDuplicateFontNames.css:3:35 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
@@ -135,7 +136,7 @@ noDuplicateFontNames.css:4:27 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
@@ -167,7 +168,7 @@ noDuplicateFontNames.css:5:39 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
@@ -197,7 +198,7 @@ noDuplicateFontNames.css:6:75 lint/suspicious/noDuplicateFontNames  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/suspicious/noDuplicateFontNames for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDuplicateFontNames:·<explanation>·*/
       2 │ + 
     1 3 │   a { font-family: "Lucida Grande", 'Arial', sans-serif, sans-serif; }
     2 4 │   a { font-family: 'Arial', "Lucida Grande", Arial, sans-serif; }
diff --git a/crates/biome_css_analyze/tests/suppression/suspicious/noEmptyBlock/noEmptyBlock.css.snap b/crates/biome_css_analyze/tests/suppression/suspicious/noEmptyBlock/noEmptyBlock.css.snap
index 15a922d1214b..b66abb6b9b65 100644
--- a/crates/biome_css_analyze/tests/suppression/suspicious/noEmptyBlock/noEmptyBlock.css.snap
+++ b/crates/biome_css_analyze/tests/suppression/suspicious/noEmptyBlock/noEmptyBlock.css.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_css_analyze/tests/spec_tests.rs
 expression: noEmptyBlock.css
+snapshot_kind: text
 ---
 # Input
 ```css
@@ -87,7 +88,7 @@ noEmptyBlock.css:2:3 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -122,7 +123,7 @@ noEmptyBlock.css:3:3 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -160,7 +161,7 @@ noEmptyBlock.css:4:3 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -193,7 +194,7 @@ noEmptyBlock.css:8:4 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -225,7 +226,7 @@ noEmptyBlock.css:9:4 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -261,7 +262,7 @@ noEmptyBlock.css:10:4 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -293,7 +294,7 @@ noEmptyBlock.css:15:14 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -329,7 +330,7 @@ noEmptyBlock.css:16:14 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -361,7 +362,7 @@ noEmptyBlock.css:19:18 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -393,7 +394,7 @@ noEmptyBlock.css:22:30 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -426,7 +427,7 @@ noEmptyBlock.css:23:12 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -458,7 +459,7 @@ noEmptyBlock.css:26:20 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -495,7 +496,7 @@ noEmptyBlock.css:28:10 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -533,7 +534,7 @@ noEmptyBlock.css:38:13 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -565,7 +566,7 @@ noEmptyBlock.css:44:7 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -599,7 +600,7 @@ noEmptyBlock.css:45:14 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -631,7 +632,7 @@ noEmptyBlock.css:50:28 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
@@ -668,7 +669,7 @@ noEmptyBlock.css:52:16 lint/suspicious/noEmptyBlock  FIXABLE  ━━━━━━
   i Safe fix: Suppress rule lint/suspicious/noEmptyBlock for the whole file.
   
      1    │ - /*·CssDeclarationOrRuleBlock·*/
-        1 │ + /**·biome-ignore·lint/suspicious/noEmptyBlock:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noEmptyBlock:·<explanation>·*/
         2 │ + 
      2  3 │   a {}
      3  4 │   a { }
diff --git a/crates/biome_graphql_analyze/tests/suppression/nursery/noDuplicatedFields/noDuplicatedFields.graphql.snap b/crates/biome_graphql_analyze/tests/suppression/nursery/noDuplicatedFields/noDuplicatedFields.graphql.snap
index d8d15eb00a3a..7df51ba1f2eb 100644
--- a/crates/biome_graphql_analyze/tests/suppression/nursery/noDuplicatedFields/noDuplicatedFields.graphql.snap
+++ b/crates/biome_graphql_analyze/tests/suppression/nursery/noDuplicatedFields/noDuplicatedFields.graphql.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_graphql_analyze/tests/spec_tests.rs
 expression: noDuplicatedFields.graphql
+snapshot_kind: text
 ---
 # Input
 ```graphql
@@ -58,7 +59,7 @@ noDuplicatedFields.graphql:1:36 lint/nursery/noDuplicatedFields  FIXABLE  ━━
   
   i Safe fix: Suppress rule lint/nursery/noDuplicatedFields for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/noDuplicatedFields:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/noDuplicatedFields:·<explanation>
         2 │ + 
      1  3 │   query test($v: String, $t: String, $v: String) {
      2  4 │     id
@@ -91,7 +92,7 @@ noDuplicatedFields.graphql:6:48 lint/nursery/noDuplicatedFields  FIXABLE  ━━
   
   i Safe fix: Suppress rule lint/nursery/noDuplicatedFields for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/noDuplicatedFields:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/noDuplicatedFields:·<explanation>
         2 │ + 
      1  3 │   query test($v: String, $t: String, $v: String) {
      2  4 │     id
@@ -125,7 +126,7 @@ noDuplicatedFields.graphql:16:5 lint/nursery/noDuplicatedFields  FIXABLE  ━━
   
   i Safe fix: Suppress rule lint/nursery/noDuplicatedFields for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/noDuplicatedFields:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/noDuplicatedFields:·<explanation>
         2 │ + 
      1  3 │   query test($v: String, $t: String, $v: String) {
      2  4 │     id
diff --git a/crates/biome_graphql_analyze/tests/suppression/nursery/useDeprecatedReason/useDeprecatedReason.graphql.snap b/crates/biome_graphql_analyze/tests/suppression/nursery/useDeprecatedReason/useDeprecatedReason.graphql.snap
index e43004b4e53f..3cd7b9e005a8 100644
--- a/crates/biome_graphql_analyze/tests/suppression/nursery/useDeprecatedReason/useDeprecatedReason.graphql.snap
+++ b/crates/biome_graphql_analyze/tests/suppression/nursery/useDeprecatedReason/useDeprecatedReason.graphql.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_graphql_analyze/tests/spec_tests.rs
 expression: useDeprecatedReason.graphql
+snapshot_kind: text
 ---
 # Input
 ```graphql
@@ -52,7 +53,7 @@ useDeprecatedReason.graphql:2:10 lint/nursery/useDeprecatedReason  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/nursery/useDeprecatedReason for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/useDeprecatedReason:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/useDeprecatedReason:·<explanation>
         2 │ + 
      1  3 │   query {
      2  4 │     member @deprecated {
@@ -85,7 +86,7 @@ useDeprecatedReason.graphql:8:10 lint/nursery/useDeprecatedReason  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/nursery/useDeprecatedReason for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/useDeprecatedReason:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/useDeprecatedReason:·<explanation>
         2 │ + 
      1  3 │   query {
      2  4 │     member @deprecated {
@@ -119,7 +120,7 @@ useDeprecatedReason.graphql:13:3 lint/nursery/useDeprecatedReason  FIXABLE  ━
   
   i Safe fix: Suppress rule lint/nursery/useDeprecatedReason for the whole file.
   
-        1 │ + #·biome-ignore·lint/nursery/useDeprecatedReason:·<explanation>
+        1 │ + #·biome-ignore-all·lint/nursery/useDeprecatedReason:·<explanation>
         2 │ + 
      1  3 │   query {
      2  4 │     member @deprecated {
diff --git a/crates/biome_js_analyze/tests/suppression/a11y/useKeyWithClickEvents/invalid.jsx.snap b/crates/biome_js_analyze/tests/suppression/a11y/useKeyWithClickEvents/invalid.jsx.snap
index 242d1648eaa7..83d4a1f05414 100644
--- a/crates/biome_js_analyze/tests/suppression/a11y/useKeyWithClickEvents/invalid.jsx.snap
+++ b/crates/biome_js_analyze/tests/suppression/a11y/useKeyWithClickEvents/invalid.jsx.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: invalid.jsx
+snapshot_kind: text
 ---
 # Input
 ```jsx
@@ -36,7 +37,7 @@ invalid.jsx:2:5 lint/a11y/useKeyWithClickEvents  FIXABLE  ━━━━━━━
   
   i Safe fix: Suppress rule lint/a11y/useKeyWithClickEvents for the whole file.
   
-      1 │ + /**·biome-ignore·lint/a11y/useKeyWithClickEvents:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/a11y/useKeyWithClickEvents:·<explanation>·*/
       2 │ + 
     1 3 │   <>
     2 4 │       <div onClick={() => {}} />
diff --git a/crates/biome_js_analyze/tests/suppression/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap b/crates/biome_js_analyze/tests/suppression/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap
index 3dac1cd9b1df..8259a00a1b5c 100644
--- a/crates/biome_js_analyze/tests/suppression/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap
+++ b/crates/biome_js_analyze/tests/suppression/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noUndeclaredVariables.ts
+snapshot_kind: text
 ---
 # Input
 ```ts
@@ -36,7 +37,7 @@ noUndeclaredVariables.ts:1:50 lint/correctness/noUndeclaredVariables  FIXABLE  
   
   i Safe fix: Suppress rule lint/correctness/noUndeclaredVariables for the whole file.
   
-      1 │ + /**·biome-ignore·lint/correctness/noUndeclaredVariables:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/correctness/noUndeclaredVariables:·<explanation>·*/
       2 │ + 
     1 3 │   export type Invalid<S extends number> = `Hello ${T}`
     2 4 │   
@@ -69,7 +70,7 @@ noUndeclaredVariables.ts:5:7 lint/correctness/noUndeclaredVariables  FIXABLE  
   
   i Safe fix: Suppress rule lint/correctness/noUndeclaredVariables for the whole file.
   
-      1 │ + /**·biome-ignore·lint/correctness/noUndeclaredVariables:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/correctness/noUndeclaredVariables:·<explanation>·*/
       2 │ + 
     1 3 │   export type Invalid<S extends number> = `Hello ${T}`
     2 4 │   
diff --git a/crates/biome_js_analyze/tests/suppression/correctness/noUnusedVariables/simple.js.snap b/crates/biome_js_analyze/tests/suppression/correctness/noUnusedVariables/simple.js.snap
index 084f96a9bcf6..78d78e08847b 100644
--- a/crates/biome_js_analyze/tests/suppression/correctness/noUnusedVariables/simple.js.snap
+++ b/crates/biome_js_analyze/tests/suppression/correctness/noUnusedVariables/simple.js.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: simple.js
+snapshot_kind: text
 ---
 # Input
 ```jsx
@@ -25,7 +26,7 @@ simple.js:1:5 lint/correctness/noUnusedVariables  FIXABLE  ━━━━━━━
   
   i Safe fix: Suppress rule lint/correctness/noUnusedVariables for the whole file.
   
-      1 │ + /**·biome-ignore·lint/correctness/noUnusedVariables:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/correctness/noUnusedVariables:·<explanation>·*/
       2 │ + 
     1 3 │   let c = !a || !b;
   
diff --git a/crates/biome_js_analyze/tests/suppression/suspicious/noArrayIndexKey/noArrayIndexKey.jsx.snap b/crates/biome_js_analyze/tests/suppression/suspicious/noArrayIndexKey/noArrayIndexKey.jsx.snap
index 935cce7564cb..cf3460673b50 100644
--- a/crates/biome_js_analyze/tests/suppression/suspicious/noArrayIndexKey/noArrayIndexKey.jsx.snap
+++ b/crates/biome_js_analyze/tests/suppression/suspicious/noArrayIndexKey/noArrayIndexKey.jsx.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noArrayIndexKey.jsx
+snapshot_kind: text
 ---
 # Input
 ```jsx
@@ -154,7 +155,7 @@ noArrayIndexKey.jsx:4:18 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -199,7 +200,7 @@ noArrayIndexKey.jsx:7:18 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -244,7 +245,7 @@ noArrayIndexKey.jsx:10:31 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -288,7 +289,7 @@ noArrayIndexKey.jsx:14:18 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -333,7 +334,7 @@ noArrayIndexKey.jsx:17:18 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -378,7 +379,7 @@ noArrayIndexKey.jsx:20:31 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -423,7 +424,7 @@ noArrayIndexKey.jsx:23:62 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -467,7 +468,7 @@ noArrayIndexKey.jsx:28:35 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -511,7 +512,7 @@ noArrayIndexKey.jsx:32:42 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -555,7 +556,7 @@ noArrayIndexKey.jsx:36:29 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -599,7 +600,7 @@ noArrayIndexKey.jsx:40:36 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -643,7 +644,7 @@ noArrayIndexKey.jsx:44:41 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -687,7 +688,7 @@ noArrayIndexKey.jsx:50:37 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -730,7 +731,7 @@ noArrayIndexKey.jsx:54:63 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -774,7 +775,7 @@ noArrayIndexKey.jsx:57:25 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -818,7 +819,7 @@ noArrayIndexKey.jsx:61:25 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -861,7 +862,7 @@ noArrayIndexKey.jsx:65:54 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -904,7 +905,7 @@ noArrayIndexKey.jsx:69:64 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -947,7 +948,7 @@ noArrayIndexKey.jsx:72:67 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -990,7 +991,7 @@ noArrayIndexKey.jsx:74:67 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1033,7 +1034,7 @@ noArrayIndexKey.jsx:77:50 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1076,7 +1077,7 @@ noArrayIndexKey.jsx:81:58 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1121,7 +1122,7 @@ noArrayIndexKey.jsx:83:55 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1166,7 +1167,7 @@ noArrayIndexKey.jsx:90:50 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1211,7 +1212,7 @@ noArrayIndexKey.jsx:98:50 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
@@ -1256,7 +1257,7 @@ noArrayIndexKey.jsx:107:62 lint/suspicious/noArrayIndexKey  FIXABLE  ━━━
   
   i Safe fix: Suppress rule lint/suspicious/noArrayIndexKey for the whole file.
   
-          1 │ + /**·biome-ignore·lint/suspicious/noArrayIndexKey:·<explanation>·*/
+          1 │ + /**·biome-ignore-all·lint/suspicious/noArrayIndexKey:·<explanation>·*/
           2 │ + 
       1   3 │   import { Children, cloneElement } from "react";
       2   4 │   
diff --git a/crates/biome_js_analyze/tests/suppression/suspicious/noAssignInExpressions/noAssignInExpressions.ts.snap b/crates/biome_js_analyze/tests/suppression/suspicious/noAssignInExpressions/noAssignInExpressions.ts.snap
index 34322750c355..dec87ce423ff 100644
--- a/crates/biome_js_analyze/tests/suppression/suspicious/noAssignInExpressions/noAssignInExpressions.ts.snap
+++ b/crates/biome_js_analyze/tests/suppression/suspicious/noAssignInExpressions/noAssignInExpressions.ts.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noAssignInExpressions.ts
+snapshot_kind: text
 ---
 # Input
 ```ts
@@ -41,7 +42,7 @@ noAssignInExpressions.ts:3:10 lint/suspicious/noAssignInExpressions  FIXABLE  
   
   i Safe fix: Suppress rule lint/suspicious/noAssignInExpressions for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noAssignInExpressions:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noAssignInExpressions:·<explanation>·*/
       2 │ + 
     1 3 │   export function foo() {
     2 4 │   	let x: number;
diff --git a/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.js.snap b/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.js.snap
index a3a3b7d1b2e1..49743f71c4eb 100644
--- a/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.js.snap
+++ b/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.js.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noDoubleEquals.js
+snapshot_kind: text
 ---
 # Input
 ```jsx
@@ -63,7 +64,7 @@ noDoubleEquals.js:3:5 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-        1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
         2 │ + 
      1  3 │   const foo = `
      2  4 │   text
@@ -102,7 +103,7 @@ noDoubleEquals.js:7:3 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-        1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
         2 │ + 
      1  3 │   const foo = `
      2  4 │   text
@@ -143,7 +144,7 @@ noDoubleEquals.js:9:7 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-        1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
         2 │ + 
      1  3 │   const foo = `
      2  4 │   text
@@ -184,7 +185,7 @@ noDoubleEquals.js:14:11 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-        1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
         2 │ + 
      1  3 │   const foo = `
      2  4 │   text
@@ -225,7 +226,7 @@ noDoubleEquals.js:19:34 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-        1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+        1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
         2 │ + 
      1  3 │   const foo = `
      2  4 │   text
diff --git a/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.jsx.snap b/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.jsx.snap
index 0fd06b78d51b..a706bcadefbe 100644
--- a/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.jsx.snap
+++ b/crates/biome_js_analyze/tests/suppression/suspicious/noDoubleEquals/noDoubleEquals.jsx.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noDoubleEquals.jsx
+snapshot_kind: text
 ---
 # Input
 ```jsx
@@ -49,7 +50,7 @@ noDoubleEquals.jsx:3:51 lint/suspicious/noDoubleEquals  FIXABLE  ━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noDoubleEquals for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noDoubleEquals:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noDoubleEquals:·<explanation>·*/
       2 │ + 
     1 3 │   let a = <button
     2 4 │       className="SomeManyClasses"
diff --git a/crates/biome_js_analyze/tests/suppression/suspicious/noExplicitAny/noExplicitAny.ts.snap b/crates/biome_js_analyze/tests/suppression/suspicious/noExplicitAny/noExplicitAny.ts.snap
index b16f90919c52..466dc04a624b 100644
--- a/crates/biome_js_analyze/tests/suppression/suspicious/noExplicitAny/noExplicitAny.ts.snap
+++ b/crates/biome_js_analyze/tests/suppression/suspicious/noExplicitAny/noExplicitAny.ts.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_js_analyze/tests/spec_tests.rs
 expression: noExplicitAny.ts
+snapshot_kind: text
 ---
 # Input
 ```ts
@@ -31,7 +32,7 @@ noExplicitAny.ts:1:27 lint/suspicious/noExplicitAny  FIXABLE  ━━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noExplicitAny for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noExplicitAny:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noExplicitAny:·<explanation>·*/
       2 │ + 
     1 3 │   export function test(arg: any) {
     2 4 │     const a: any = arg;
@@ -63,7 +64,7 @@ noExplicitAny.ts:2:12 lint/suspicious/noExplicitAny  FIXABLE  ━━━━━━
   
   i Safe fix: Suppress rule lint/suspicious/noExplicitAny for the whole file.
   
-      1 │ + /**·biome-ignore·lint/suspicious/noExplicitAny:·<explanation>·*/
+      1 │ + /**·biome-ignore-all·lint/suspicious/noExplicitAny:·<explanation>·*/
       2 │ + 
     1 3 │   export function test(arg: any) {
     2 4 │     const a: any = arg;