Repository: rrd108/vue-mess-detector
Pull request #125 (2024-08-10 06:03:35)

refactor: update links in all rules output to our docs site


Patch:
diff --git a/src/rules/rrd/cyclomaticComplexity.ts b/src/rules/rrd/cyclomaticComplexity.ts
index 52ca0e0..06d8707 100644
--- a/src/rules/rrd/cyclomaticComplexity.ts
+++ b/src/rules/rrd/cyclomaticComplexity.ts
@@ -40,7 +40,7 @@ const checkCyclomaticComplexity = (script: SFCScriptBlock | null, filePath: stri
   if (cyclomaticComplexity > COMPLEXITY_MODERATE) {
     results.push({ filePath, message: `${cyclomaticComplexity > COMPLEXITY_HIGH ? BG_ERR : BG_WARN}(${
       cyclomaticComplexity
-    })${BG_RESET}`, })
+    })${BG_RESET}` })
   }
 }
 
@@ -57,7 +57,7 @@ const reportCyclomaticComplexity = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ cyclomatic complexity${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/cyclomatic-complexity.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/deepIndentation.ts b/src/rules/rrd/deepIndentation.ts
index 9dead2d..acb24dd 100644
--- a/src/rules/rrd/deepIndentation.ts
+++ b/src/rules/rrd/deepIndentation.ts
@@ -36,7 +36,7 @@ const reportDeepIndentation = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ deep indentation${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations..${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/deep-indentation.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/elseCondition.ts b/src/rules/rrd/elseCondition.ts
index 6c609d2..5b5637a 100644
--- a/src/rules/rrd/elseCondition.ts
+++ b/src/rules/rrd/elseCondition.ts
@@ -13,7 +13,7 @@ const checkElseCondition = (script: SFCScriptBlock | null, filePath: string) =>
   const matches = script.content.match(regex)
 
   if (matches?.length) {
-    results.push({ filePath, message: `else clauses found ${BG_ERR}(${matches.length})${BG_RESET}`, })
+    results.push({ filePath, message: `else clauses found ${BG_ERR}(${matches.length})${BG_RESET}` })
   }
 }
 
@@ -25,7 +25,7 @@ const reportElseCondition = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ else conditions${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Try to rewrite the conditions in a way that the else clause is not necessary.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Try to rewrite the conditions in a way that the else clause is not necessary.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/else-condition.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/functionSize.ts b/src/rules/rrd/functionSize.ts
index f6a4c65..2416fff 100644
--- a/src/rules/rrd/functionSize.ts
+++ b/src/rules/rrd/functionSize.ts
@@ -13,7 +13,7 @@ const addFunctionToFiles = (match: RegExpExecArray, filePath: string) => {
   // Check if the function block has more than `MAX_FUNCTION_LENGTH` lines
   const lineCount = funcBody.split('\n').length
   if (lineCount > MAX_FUNCTION_LENGTH) {
-    results.push({ filePath, message: `function ${BG_ERR}(${funcName})${BG_RESET} is too long`, })
+    results.push({ filePath, message: `function ${BG_ERR}(${funcName})${BG_RESET} is too long` })
   }
 }
 
@@ -49,7 +49,7 @@ const reportFunctionSize = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ function size${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/function-size.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/magicNumbers.ts b/src/rules/rrd/magicNumbers.ts
index 116d1be..6780531 100644
--- a/src/rules/rrd/magicNumbers.ts
+++ b/src/rules/rrd/magicNumbers.ts
@@ -1,5 +1,5 @@
 import type { SFCScriptBlock } from '@vue/compiler-sfc'
-import { anyOf, createRegExp, digit, global, linefeed,  } from 'magic-regexp'
+import { anyOf, createRegExp, digit, global, linefeed } from 'magic-regexp'
 import { BG_RESET, BG_WARN, TEXT_INFO, TEXT_RESET, TEXT_WARN } from '../asceeCodes'
 import type { FileCheckResult, Offense } from '../../types'
 import getLineNumber from '../getLineNumber'
@@ -10,7 +10,7 @@ const checkMagicNumbers = (script: SFCScriptBlock | null, filePath: string) => {
   if (!script) {
     return
   }
-  const regex = createRegExp(digit, anyOf(')', linefeed), [global,])
+  const regex = createRegExp(digit, anyOf(')', linefeed), [global])
   const matches = script.content.match(regex)
 
   matches?.forEach((match) => {
@@ -20,7 +20,6 @@ const checkMagicNumbers = (script: SFCScriptBlock | null, filePath: string) => {
       message: `line #${lineNumber} ${BG_WARN}magic number: ${match.length}${BG_RESET}`,
     })
   })
-  
 }
 
 const reportMagicNumbers = () => {
@@ -31,7 +30,7 @@ const reportMagicNumbers = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ magic numbers${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/magic-numbers.html`,
         message: `magic numbers found (${result.message}) 🚨`,
       })
     })
diff --git a/src/rules/rrd/parameterCount.ts b/src/rules/rrd/parameterCount.ts
index 1cc762a..05697ec 100644
--- a/src/rules/rrd/parameterCount.ts
+++ b/src/rules/rrd/parameterCount.ts
@@ -13,7 +13,7 @@ const checkParameters = (funcName: string, params: string, filePath: string) =>
     .map(param => param.trim())
     .filter(param => param.length > 0)
   if (paramsArray.length > MAX_PARAMETER_COUNT) {
-    results.push({ filePath, message: `function ${BG_WARN}${funcName}${BG_RESET} has ${BG_WARN}${paramsArray.length}${BG_RESET} parameters`, })
+    results.push({ filePath, message: `function ${BG_WARN}${funcName}${BG_RESET} has ${BG_WARN}${paramsArray.length}${BG_RESET} parameters` })
   }
 }
 
@@ -46,7 +46,7 @@ const reportParameterCount = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ parameter count${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/parameter-count.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/plainScript.ts b/src/rules/rrd/plainScript.ts
index 175404e..96696c4 100644
--- a/src/rules/rrd/plainScript.ts
+++ b/src/rules/rrd/plainScript.ts
@@ -8,7 +8,7 @@ const checkPlainScript = (script: SFCScriptBlock | null, filePath: string) => {
   if (!script || !script.setup) {
     return
   }
-  results.push({filePath, message: `${BG_WARN}Plain <script> block${BG_RESET} found`})
+  results.push({ filePath, message: `${BG_WARN}Plain <script> block${BG_RESET} found` })
 }
 
 const reportPlainScript = () => {
@@ -19,7 +19,7 @@ const reportPlainScript = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ Plain <script> blocks${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN} Consider using <script setup> to leverage the new SFC <script> syntax.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN} Consider using <script setup> to leverage the new SFC <script> syntax.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/plain-script.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/scriptLength.ts b/src/rules/rrd/scriptLength.ts
index 3cb818c..4543339 100644
--- a/src/rules/rrd/scriptLength.ts
+++ b/src/rules/rrd/scriptLength.ts
@@ -26,7 +26,7 @@ const reportScriptLength = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ Long <script> blocks${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Try to refactor out the logic into composable functions or other files and keep the script block's length under ${MAX_SCRIPT_LENGTH} lines.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Try to refactor out the logic into composable functions or other files and keep the script block's length under ${MAX_SCRIPT_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/script-length.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/shortVariableName.ts b/src/rules/rrd/shortVariableName.ts
index ef63358..4fbf0fc 100644
--- a/src/rules/rrd/shortVariableName.ts
+++ b/src/rules/rrd/shortVariableName.ts
@@ -19,7 +19,7 @@ const checkShortVariableName = (script: SFCScriptBlock | null, filePath: string)
     const variable = match[1]
 
     if (variable.length < MIN_VARIABLE_NAME) {
-      results.push({ filePath, message: `${BG_ERR}(${variable})${BG_RESET}`, })
+      results.push({ filePath, message: `${BG_ERR}(${variable})${BG_RESET}` })
     }
   }
 }
@@ -32,7 +32,7 @@ const reportShortVariableName = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ short variable names${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/short-variable-name.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/rrd/tooManyProps.ts b/src/rules/rrd/tooManyProps.ts
index 2ad58dc..a21a496 100644
--- a/src/rules/rrd/tooManyProps.ts
+++ b/src/rules/rrd/tooManyProps.ts
@@ -29,7 +29,7 @@ const reportTooManyProps = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}rrd ~ too many props${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET}`,
+        description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/too-many-props.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-caution/elementSelectorsWithScoped.ts b/src/rules/vue-caution/elementSelectorsWithScoped.ts
index de0a052..0cba215 100644
--- a/src/rules/vue-caution/elementSelectorsWithScoped.ts
+++ b/src/rules/vue-caution/elementSelectorsWithScoped.ts
@@ -32,7 +32,7 @@ const reportElementSelectorsWithScoped = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-caution ~ element selectors with scoped${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#element-selectors-with-scoped`,
+        description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/element-selectors-with-scoped.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-caution/implicitParentChildCommunication.ts b/src/rules/vue-caution/implicitParentChildCommunication.ts
index 9283d49..741eb6a 100644
--- a/src/rules/vue-caution/implicitParentChildCommunication.ts
+++ b/src/rules/vue-caution/implicitParentChildCommunication.ts
@@ -52,7 +52,7 @@ const reportImplicitParentChildCommunication = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-caution ~ implicit parent-child communication${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication`,
+        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/implicit-parent-child-communication.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-essential/globalStyle.ts b/src/rules/vue-essential/globalStyle.ts
index 05aeff2..6c4dbf1 100644
--- a/src/rules/vue-essential/globalStyle.ts
+++ b/src/rules/vue-essential/globalStyle.ts
@@ -24,7 +24,7 @@ const reportGlobalStyle = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-essential ~ global style${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use <style scoped>.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-component-scoped-styling`,
+        description: `👉 ${TEXT_WARN}Use <style scoped>.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/global-style.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-essential/simpleProp.ts b/src/rules/vue-essential/simpleProp.ts
index 0736835..a4fdeab 100644
--- a/src/rules/vue-essential/simpleProp.ts
+++ b/src/rules/vue-essential/simpleProp.ts
@@ -25,7 +25,7 @@ const reportSimpleProp = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-essential ~ simple prop${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Add at least type definition.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-detailed-prop-definitions`,
+        description: `👉 ${TEXT_WARN}Add at least type definition.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/simple-prop.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-essential/singleNameComponent.ts b/src/rules/vue-essential/singleNameComponent.ts
index 02c0180..f10ab7f 100644
--- a/src/rules/vue-essential/singleNameComponent.ts
+++ b/src/rules/vue-essential/singleNameComponent.ts
@@ -31,7 +31,7 @@ const reportSingleNameComponent = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-essential ~ single name component${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Rename the component to use multi-word name.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-multi-word-component-names`,
+        description: `👉 ${TEXT_WARN}Rename the component to use multi-word name.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/single-name-component.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-essential/vforNoKey.ts b/src/rules/vue-essential/vforNoKey.ts
index 0182f1b..1493537 100644
--- a/src/rules/vue-essential/vforNoKey.ts
+++ b/src/rules/vue-essential/vforNoKey.ts
@@ -31,7 +31,7 @@ const reportVforNoKey = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-essential ~ v-for has no key${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Add a \`:key\` property to all v-for.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-keyed-v-for`,
+        description: `👉 ${TEXT_WARN}Add a \`:key\` property to all v-for.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/vfor-no-key.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-essential/vifWithVfor.ts b/src/rules/vue-essential/vifWithVfor.ts
index 78175ff..ac685b9 100644
--- a/src/rules/vue-essential/vifWithVfor.ts
+++ b/src/rules/vue-essential/vifWithVfor.ts
@@ -48,7 +48,7 @@ const reportVifWithVfor = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-essential ~ v-if used with v-for${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Move out the v-if to a computed property.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#avoid-v-if-with-v-for`,
+        description: `👉 ${TEXT_WARN}Move out the v-if to a computed property.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/vif-with-vfor.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-recommended/elementAttributeOrder.ts b/src/rules/vue-recommended/elementAttributeOrder.ts
index 761b326..9a37463 100644
--- a/src/rules/vue-recommended/elementAttributeOrder.ts
+++ b/src/rules/vue-recommended/elementAttributeOrder.ts
@@ -70,7 +70,7 @@ const reportElementAttributeOrder = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-recommended ~ element attribute order${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#element-attribute-order`,
+        description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/element-attribute-order.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-recommended/topLevelElementOrder.ts b/src/rules/vue-recommended/topLevelElementOrder.ts
index 4a6faa3..19db239 100644
--- a/src/rules/vue-recommended/topLevelElementOrder.ts
+++ b/src/rules/vue-recommended/topLevelElementOrder.ts
@@ -29,7 +29,7 @@ const checkTopLevelElementOrder = (source: string, filePath: string) => {
   if (isCorrectOrder)
     return // If it's correct, do nothing
 
-  results.push({ filePath, message: `Top level elements are ${BG_WARN}not following the correct order.${BG_RESET}`   })
+  results.push({ filePath, message: `Top level elements are ${BG_WARN}not following the correct order.${BG_RESET}` })
 }
 
 const reportTopLevelElementOrder = () => {
@@ -40,7 +40,7 @@ const reportTopLevelElementOrder = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-recommended ~ top level element order${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#single-file-component-top-level-element-order`,
+        description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/top-level-element-order.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/componentFilenameCasing.ts b/src/rules/vue-strong/componentFilenameCasing.ts
index 64b042d..c46b6d7 100644
--- a/src/rules/vue-strong/componentFilenameCasing.ts
+++ b/src/rules/vue-strong/componentFilenameCasing.ts
@@ -30,7 +30,7 @@ const reportComponentFilenameCasing = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ component name is not PascalCase and not kebab-case${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#single-file-component-filename-casing`,
+        description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-filename-casing.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/componentFiles.ts b/src/rules/vue-strong/componentFiles.ts
index 8bbddc4..5c3a6bc 100644
--- a/src/rules/vue-strong/componentFiles.ts
+++ b/src/rules/vue-strong/componentFiles.ts
@@ -29,7 +29,7 @@ const reportComponentFiles = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ component files${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#component-files`,
+        description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-files.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/directiveShorthands.ts b/src/rules/vue-strong/directiveShorthands.ts
index a4a4526..d92410b 100644
--- a/src/rules/vue-strong/directiveShorthands.ts
+++ b/src/rules/vue-strong/directiveShorthands.ts
@@ -35,7 +35,7 @@ const reportDirectiveShorthands = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ directive shorthands not used${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#directive-shorthands`,
+        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/directive-shorthands.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/fullWordComponentName.ts b/src/rules/vue-strong/fullWordComponentName.ts
index 4e52aa3..37c5643 100644
--- a/src/rules/vue-strong/fullWordComponentName.ts
+++ b/src/rules/vue-strong/fullWordComponentName.ts
@@ -40,7 +40,7 @@ const reportFullWordComponentName = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ full-word component names${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#full-word-component-names`,
+        description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/full-word-component-name.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/propNameCasing.ts b/src/rules/vue-strong/propNameCasing.ts
index 2b882e7..e33a8c4 100644
--- a/src/rules/vue-strong/propNameCasing.ts
+++ b/src/rules/vue-strong/propNameCasing.ts
@@ -41,7 +41,7 @@ const reportPropNameCasing = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ prop names are not camelCased${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Rename the props to camelCase.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#prop-name-casing`,
+        description: `👉 ${TEXT_WARN}Rename the props to camelCase.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/prop-name-casing.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/quotedAttributeValues.ts b/src/rules/vue-strong/quotedAttributeValues.ts
index 52a9ea7..86692b4 100644
--- a/src/rules/vue-strong/quotedAttributeValues.ts
+++ b/src/rules/vue-strong/quotedAttributeValues.ts
@@ -51,7 +51,7 @@ const reportQuotedAttributeValues = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ attribute value is not quoted${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use quotes for attribute values.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#quoted-attribute-values`,
+        description: `👉 ${TEXT_WARN}Use quotes for attribute values.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/quoted-attribute-values.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/selfClosingComponents.ts b/src/rules/vue-strong/selfClosingComponents.ts
index d2db29a..9e60c1c 100644
--- a/src/rules/vue-strong/selfClosingComponents.ts
+++ b/src/rules/vue-strong/selfClosingComponents.ts
@@ -42,7 +42,7 @@ const reportSelfClosingComponents = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ component is not self closing${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#self-closing-components`,
+        description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/self-closing-components.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/simpleComputed.ts b/src/rules/vue-strong/simpleComputed.ts
index c5d4b56..54355f9 100644
--- a/src/rules/vue-strong/simpleComputed.ts
+++ b/src/rules/vue-strong/simpleComputed.ts
@@ -41,7 +41,7 @@ const reportSimpleComputed = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ complicated computed property${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Refactor the computed properties to smaller ones.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#simple-computed-properties`,
+        description: `👉 ${TEXT_WARN}Refactor the computed properties to smaller ones.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/simple-computed.html`,
         message: `${result.message} 🚨`,
       })
     })
diff --git a/src/rules/vue-strong/templateSimpleExpression.ts b/src/rules/vue-strong/templateSimpleExpression.ts
index 70b7b33..9751b59 100644
--- a/src/rules/vue-strong/templateSimpleExpression.ts
+++ b/src/rules/vue-strong/templateSimpleExpression.ts
@@ -35,7 +35,7 @@ const reportTemplateSimpleExpression = () => {
       offenses.push({
         file: result.filePath,
         rule: `${TEXT_INFO}vue-strong ~ lengthy template expression${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Refactor the expression into a computed property.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#simple-expressions-in-templates`,
+        description: `👉 ${TEXT_WARN}Refactor the expression into a computed property.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/template-simple-expression.html`,
         message: `${result.message} 🚨`,
       })
     })


Test patch:
diff --git a/src/rules/rrd/cyclomaticComplexity.test.ts b/src/rules/rrd/cyclomaticComplexity.test.ts
index a87aafa..31728cc 100644
--- a/src/rules/rrd/cyclomaticComplexity.test.ts
+++ b/src/rules/rrd/cyclomaticComplexity.test.ts
@@ -30,7 +30,7 @@ describe('checkCyclomaticComplexity', () => {
     expect(reportCyclomaticComplexity()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ cyclomatic complexity${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/cyclomatic-complexity.html`,
       message: `${BG_WARN}(6)${BG_RESET} 🚨`,
     }])
   })
@@ -46,7 +46,7 @@ describe('checkCyclomaticComplexity', () => {
     expect(reportCyclomaticComplexity()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ cyclomatic complexity${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to reduce complexity.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/cyclomatic-complexity.html`,
       message: `${BG_ERR}(11)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/rrd/deepIndentation.test.ts b/src/rules/rrd/deepIndentation.test.ts
index 0cbeffc..e4eeac7 100644
--- a/src/rules/rrd/deepIndentation.test.ts
+++ b/src/rules/rrd/deepIndentation.test.ts
@@ -30,7 +30,7 @@ describe('checkDeepIndentation', () => {
     expect(reportDeepIndentation()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ deep indentation${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations..${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/deep-indentation.html`,
       message: `line #1 ${BG_WARN}indentation: 5${BG_RESET} 🚨`,
     }])
   })
@@ -43,7 +43,7 @@ describe('checkDeepIndentation', () => {
     expect(reportDeepIndentation()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ deep indentation${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations..${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to refactor your component to child components, to avoid deep indentations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/deep-indentation.html`,
       message: `line #1 ${BG_WARN}indentation: 15${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/rrd/elseCondition.test.ts b/src/rules/rrd/elseCondition.test.ts
index 52a2626..57bf749 100644
--- a/src/rules/rrd/elseCondition.test.ts
+++ b/src/rules/rrd/elseCondition.test.ts
@@ -24,7 +24,7 @@ describe('checkElseCondition', () => {
     expect(reportElseCondition()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ else conditions${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to rewrite the conditions in a way that the else clause is not necessary.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to rewrite the conditions in a way that the else clause is not necessary.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/else-condition.html`,
       message: `else clauses found ${BG_ERR}(1)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/rrd/functionSize.test.ts b/src/rules/rrd/functionSize.test.ts
index 385ea12..098bf5b 100644
--- a/src/rules/rrd/functionSize.test.ts
+++ b/src/rules/rrd/functionSize.test.ts
@@ -74,7 +74,7 @@ describe('checkFunctionSize', () => {
     expect(reportFunctionSize()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ function size${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/function-size.html`,
       message: `function ${BG_ERR}(${funcName})${BG_RESET} is too long 🚨`,
     }])
   })
@@ -150,14 +150,14 @@ describe('checkFunctionSize', () => {
     expect(reportFunctionSize()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ function size${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/function-size.html`,
       message: `function ${BG_ERR}(dummyRegularFunction)${BG_RESET} is too long 🚨`,
-    }/* TODO temporary disabled for #116
+    }, /* TODO temporary disabled for #116
     , {
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ function size${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Functions must be shorter than ${MAX_FUNCTION_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/function-size.html`,
       message: `function ${BG_ERR}(dummyArrowFunction)${BG_RESET} 🚨`,
-    }*/])
+    } */])
   })
 })
diff --git a/src/rules/rrd/magicNumbers.test.ts b/src/rules/rrd/magicNumbers.test.ts
index b54c53c..7308f2e 100644
--- a/src/rules/rrd/magicNumbers.test.ts
+++ b/src/rules/rrd/magicNumbers.test.ts
@@ -24,7 +24,7 @@ describe('checkMagicNumbers', () => {
     expect(reportMagicNumbers()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ magic numbers${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/magic-numbers.html`,
       message: `magic numbers found (line #1 ${BG_WARN}magic number: 2${BG_RESET}) 🚨`,
     }])
   })
@@ -39,7 +39,7 @@ describe('checkMagicNumbers', () => {
     expect(reportMagicNumbers()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ magic numbers${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Extract magic numbers to a constant.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/magic-numbers.html`,
       message: `magic numbers found (line #3 ${BG_WARN}magic number: 2${BG_RESET}) 🚨`,
     }])
   })
diff --git a/src/rules/rrd/parameterCount.test.ts b/src/rules/rrd/parameterCount.test.ts
index 3720a1d..b380f33 100644
--- a/src/rules/rrd/parameterCount.test.ts
+++ b/src/rules/rrd/parameterCount.test.ts
@@ -45,7 +45,7 @@ describe('checkParameterCount', () => {
     expect(reportParameterCount()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}rrd ~ parameter count${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/parameter-count.html`,
       message: `function ${BG_WARN}${funcName}${BG_RESET} has ${BG_WARN}${paramsCount}${BG_RESET} parameters 🚨`,
     }])
   })
@@ -74,12 +74,12 @@ describe('checkParameterCount', () => {
     expect(reportParameterCount()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}rrd ~ parameter count${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/parameter-count.html`,
       message: `function ${BG_WARN}dummyFuncOne${BG_RESET} has ${BG_WARN}5${BG_RESET} parameters 🚨`,
     }, {
       file: filename,
       rule: `${TEXT_INFO}rrd ~ parameter count${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Max number of function parameters should be ${MAX_PARAMETER_COUNT}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/parameter-count.html`,
       message: `function ${BG_WARN}dummyFuncTwo${BG_RESET} has ${BG_WARN}4${BG_RESET} parameters 🚨`,
     }])
   })
diff --git a/src/rules/rrd/scriptLength.test.ts b/src/rules/rrd/scriptLength.test.ts
index a3061ff..737cfd7 100644
--- a/src/rules/rrd/scriptLength.test.ts
+++ b/src/rules/rrd/scriptLength.test.ts
@@ -29,7 +29,7 @@ describe('checkScriptLength', () => {
     expect(reportScriptLength()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ Long <script> blocks${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to refactor out the logic into composable functions or other files and keep the script block's length under ${MAX_SCRIPT_LENGTH} lines.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to refactor out the logic into composable functions or other files and keep the script block's length under ${MAX_SCRIPT_LENGTH} lines.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/script-length.html`,
       message: `${BG_WARN}(104 lines)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/rrd/shortVariableName.test.ts b/src/rules/rrd/shortVariableName.test.ts
index bf5950f..1dce5e1 100644
--- a/src/rules/rrd/shortVariableName.test.ts
+++ b/src/rules/rrd/shortVariableName.test.ts
@@ -39,7 +39,7 @@ describe('shortVariableName', () => {
     expect(reportShortVariableName()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}rrd ~ short variable names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/short-variable-name.html`,
       message: `${BG_ERR}(${variable})${BG_RESET} 🚨`,
     }])
   })
@@ -62,17 +62,17 @@ describe('shortVariableName', () => {
     expect(reportShortVariableName()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}rrd ~ short variable names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/short-variable-name.html`,
       message: `${BG_ERR}(age)${BG_RESET} 🚨`,
     }, {
       file: filename,
       rule: `${TEXT_INFO}rrd ~ short variable names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/short-variable-name.html`,
       message: `${BG_ERR}(gps)${BG_RESET} 🚨`,
     }, {
       file: filename,
       rule: `${TEXT_INFO}rrd ~ short variable names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Variable names must have a minimum length of ${MIN_VARIABLE_NAME}.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/short-variable-name.html`,
       message: `${BG_ERR}(lng)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/rrd/tooManyProps.test.ts b/src/rules/rrd/tooManyProps.test.ts
index 0ef4b0e..271f918 100644
--- a/src/rules/rrd/tooManyProps.test.ts
+++ b/src/rules/rrd/tooManyProps.test.ts
@@ -42,7 +42,7 @@ describe('checkTooManyProps', () => {
     expect(reportTooManyProps()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ too many props${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/too-many-props.html`,
       message: `props found ${BG_ERR}(6)${BG_RESET} 🚨`,
     }])
   })
@@ -57,7 +57,7 @@ describe('checkTooManyProps', () => {
     expect(reportTooManyProps()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}rrd ~ too many props${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET}`,
+      description: `👉 ${TEXT_WARN}Try to refactor your code to use less properties.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/rrd/too-many-props.html`,
       message: `props found ${BG_ERR}(6)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-caution/elementSelectorsWithScoped.test.ts b/src/rules/vue-caution/elementSelectorsWithScoped.test.ts
index 450ba82..5b2ebf6 100644
--- a/src/rules/vue-caution/elementSelectorsWithScoped.test.ts
+++ b/src/rules/vue-caution/elementSelectorsWithScoped.test.ts
@@ -24,7 +24,7 @@ describe('checkElementSelectorsWithScoped', () => {
     expect(reportElementSelectorsWithScoped()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-caution ~ element selectors with scoped${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#element-selectors-with-scoped`,
+      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/element-selectors-with-scoped.html`,
       message: `${BG_WARN}(button)${BG_RESET} 🚨`,
     }])
   })
@@ -37,12 +37,12 @@ describe('checkElementSelectorsWithScoped', () => {
     expect(reportElementSelectorsWithScoped()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-caution ~ element selectors with scoped${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#element-selectors-with-scoped`,
+      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/element-selectors-with-scoped.html`,
       message: `${BG_WARN}(button)${BG_RESET} 🚨`,
     }, {
       file: filename,
       rule: `${TEXT_INFO}vue-caution ~ element selectors with scoped${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#element-selectors-with-scoped`,
+      description: `👉 ${TEXT_WARN}Prefer class selectors over element selectors in scoped styles, because large numbers of element selectors are slow.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/element-selectors-with-scoped.html`,
       message: `${BG_WARN}(div)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-caution/implicitParentChildCommunication.test.ts b/src/rules/vue-caution/implicitParentChildCommunication.test.ts
index 084fbc7..18fcaaf 100644
--- a/src/rules/vue-caution/implicitParentChildCommunication.test.ts
+++ b/src/rules/vue-caution/implicitParentChildCommunication.test.ts
@@ -55,7 +55,7 @@ describe('checkImplicitParentChildCommunication', () => {
     const offenses = [{
       file: filename,
       rule: `${TEXT_INFO}vue-caution ~ implicit parent-child communication${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication`,
+      description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/implicit-parent-child-communication.html`,
       message: `line #${lineNumber} ${BG_WARN}(todo)${BG_RESET} 🚨`,
     }]
     checkImplicitParentChildCommunication(script, filename)
@@ -101,7 +101,7 @@ describe('checkImplicitParentChildCommunication', () => {
     const offenses = [{
       file: filename,
       rule: `${TEXT_INFO}vue-caution ~ implicit parent-child communication${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication`,
+      description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/implicit-parent-child-communication.html`,
       message: `line #${lineNumber} ${BG_WARN}(getCurrentInstance)${BG_RESET} 🚨`,
     }]
     checkImplicitParentChildCommunication(script, filename)
@@ -147,13 +147,13 @@ describe('checkImplicitParentChildCommunication', () => {
       {
         file: filename,
         rule: `${TEXT_INFO}vue-caution ~ implicit parent-child communication${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication`,
+        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/implicit-parent-child-communication.html`,
         message: `line #9 ${BG_WARN}(todo)${BG_RESET} 🚨`,
       },
       {
         file: filename,
         rule: `${TEXT_INFO}vue-caution ~ implicit parent-child communication${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-use-with-caution.html#implicit-parent-child-communication`,
+        description: `👉 ${TEXT_WARN}Avoid implicit parent-child communication to maintain clear and predictable component behavior.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-caution/implicit-parent-child-communication.html`,
         message: `line #2 ${BG_WARN}(getCurrentInstance)${BG_RESET} 🚨`,
       },
     ]
diff --git a/src/rules/vue-essential/globalStyle.test.ts b/src/rules/vue-essential/globalStyle.test.ts
index 1a5f3ef..d75e851 100644
--- a/src/rules/vue-essential/globalStyle.test.ts
+++ b/src/rules/vue-essential/globalStyle.test.ts
@@ -24,7 +24,7 @@ describe('checkGlobalStyle', () => {
     expect(reportGlobalStyle()).toStrictEqual([{
       file: filePath,
       rule: `${TEXT_INFO}vue-essential ~ global style${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Use <style scoped>.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-component-scoped-styling`,
+      description: `👉 ${TEXT_WARN}Use <style scoped>.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/global-style.html`,
       message: `${BG_WARN}global style${BG_RESET} used 🚨`,
     }])
   })
diff --git a/src/rules/vue-essential/simpleProp.test.ts b/src/rules/vue-essential/simpleProp.test.ts
index 997f625..b13600d 100644
--- a/src/rules/vue-essential/simpleProp.test.ts
+++ b/src/rules/vue-essential/simpleProp.test.ts
@@ -35,7 +35,7 @@ describe('checkSimpleProp', () => {
     expect(reportSimpleProp()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-essential ~ simple prop${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Add at least type definition.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-detailed-prop-definitions`,
+      description: `👉 ${TEXT_WARN}Add at least type definition.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/simple-prop.html`,
       message: `${BG_WARN}Props type${BG_RESET} not defined 🚨`,
     }])
   })
diff --git a/src/rules/vue-essential/singleNameComponent.test.ts b/src/rules/vue-essential/singleNameComponent.test.ts
index 9cb6989..05c2753 100644
--- a/src/rules/vue-essential/singleNameComponent.test.ts
+++ b/src/rules/vue-essential/singleNameComponent.test.ts
@@ -32,7 +32,7 @@ describe('checkSingleNameComponent', () => {
     expect(reportSingleNameComponent()).toStrictEqual([{
       file: 'components/Header.vue',
       rule: `${TEXT_INFO}vue-essential ~ single name component${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Rename the component to use multi-word name.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-multi-word-component-names`,
+      description: `👉 ${TEXT_WARN}Rename the component to use multi-word name.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/single-name-component.html`,
       message: `Component name is ${BG_WARN}single word${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-essential/vforNoKey.test.ts b/src/rules/vue-essential/vforNoKey.test.ts
index e5108ab..105bf9a 100644
--- a/src/rules/vue-essential/vforNoKey.test.ts
+++ b/src/rules/vue-essential/vforNoKey.test.ts
@@ -43,7 +43,7 @@ describe('checkVforNoKey', () => {
     expect(reportVforNoKey()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-essential ~ v-for has no key${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Add a \`:key\` property to all v-for.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#use-keyed-v-for`,
+      description: `👉 ${TEXT_WARN}Add a \`:key\` property to all v-for.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/vfor-no-key.html`,
       message: `v-for used ${BG_WARN}without a key${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-essential/vifWithVfor.test.ts b/src/rules/vue-essential/vifWithVfor.test.ts
index 30f2201..9b58cd4 100644
--- a/src/rules/vue-essential/vifWithVfor.test.ts
+++ b/src/rules/vue-essential/vifWithVfor.test.ts
@@ -46,7 +46,7 @@ describe('checkVifWithVfor', () => {
     expect(reportVifWithVfor()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-essential ~ v-if used with v-for${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Move out the v-if to a computed property.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-essential.html#avoid-v-if-with-v-for`,
+      description: `👉 ${TEXT_WARN}Move out the v-if to a computed property.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-essential/vif-with-vfor.html`,
       message: `line #7 ${BG_WARN}v-if used with v-for${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-recommended/elementAttributeOrder.test.ts b/src/rules/vue-recommended/elementAttributeOrder.test.ts
index 2afac5f..749225d 100644
--- a/src/rules/vue-recommended/elementAttributeOrder.test.ts
+++ b/src/rules/vue-recommended/elementAttributeOrder.test.ts
@@ -37,7 +37,7 @@ describe('checkElementAttributeOrder', () => {
     expect(reportElementAttributeOrder()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-recommended ~ element attribute order${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#element-attribute-order`,
+      description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/element-attribute-order.html`,
       message: `tag has attributes out of order ${BG_WARN}(input)${BG_RESET} 🚨`,
     }])
   })
@@ -56,7 +56,7 @@ describe('checkElementAttributeOrder', () => {
     expect(reportElementAttributeOrder()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-recommended ~ element attribute order${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#element-attribute-order`,
+      description: `👉 ${TEXT_WARN}The attributes of elements (including components) should be ordered consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/element-attribute-order.html`,
       message: `tag has attributes out of order ${BG_WARN}(div)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-recommended/topLevelElementOrder.test.ts b/src/rules/vue-recommended/topLevelElementOrder.test.ts
index 5b553b0..3b9664e 100644
--- a/src/rules/vue-recommended/topLevelElementOrder.test.ts
+++ b/src/rules/vue-recommended/topLevelElementOrder.test.ts
@@ -55,7 +55,7 @@ describe('checkTopLevelElementOrder', () => {
     expect(reportTopLevelElementOrder()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-recommended ~ top level element order${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#single-file-component-top-level-element-order`,
+      description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/top-level-element-order.html`,
       message: `Top level elements are ${BG_WARN}not following the correct order.${BG_RESET} 🚨`,
     }])
   })
@@ -79,7 +79,7 @@ describe('checkTopLevelElementOrder', () => {
     expect(reportTopLevelElementOrder()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-recommended ~ top level element order${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-recommended.html#single-file-component-top-level-element-order`,
+      description: `👉 ${TEXT_WARN}Single-File Components should always order <script>, <template>, and <style> tags consistently.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-recommended/top-level-element-order.html`,
       message: `Top level elements are ${BG_WARN}not following the correct order.${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/componentFilenameCasing.test.ts b/src/rules/vue-strong/componentFilenameCasing.test.ts
index e4d64b3..62d480b 100644
--- a/src/rules/vue-strong/componentFilenameCasing.test.ts
+++ b/src/rules/vue-strong/componentFilenameCasing.test.ts
@@ -46,7 +46,7 @@ describe('checkComponentFilenameCasing', () => {
     expect(reportComponentFilenameCasing()).toStrictEqual([{
       file: 'components/myheader.vue',
       rule: `${TEXT_INFO}vue-strong ~ component name is not PascalCase and not kebab-case${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#single-file-component-filename-casing`,
+      description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-filename-casing.html`,
       message: `component name is ${BG_WARN}not PascalCase, nor kebab-case.${BG_RESET} 🚨`,
     }])
   })
@@ -57,7 +57,7 @@ describe('checkComponentFilenameCasing', () => {
     expect(reportComponentFilenameCasing()).toStrictEqual([{
       file: 'components/myHeader.vue',
       rule: `${TEXT_INFO}vue-strong ~ component name is not PascalCase and not kebab-case${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#single-file-component-filename-casing`,
+      description: `👉 ${TEXT_WARN}Rename the component to use PascalCase or kebab-case file name.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-filename-casing.html`,
       message: `component name is ${BG_WARN}not PascalCase, nor kebab-case.${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/componentFiles.test.ts b/src/rules/vue-strong/componentFiles.test.ts
index 0f6da0f..1db8f40 100644
--- a/src/rules/vue-strong/componentFiles.test.ts
+++ b/src/rules/vue-strong/componentFiles.test.ts
@@ -42,12 +42,12 @@ describe('checkComponentFiles', () => {
     expect(reportComponentFiles()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-strong ~ component files${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#component-files`,
+      description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-files.html`,
       message: `line #2 ${BG_WARN}(TodoList)${BG_RESET} 🚨`,
     }, {
       file: filename,
       rule: `${TEXT_INFO}vue-strong ~ component files${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#component-files`,
+      description: `👉 ${TEXT_WARN}Whenever a build system is available to concatenate files, each component should be in its own file.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/component-files.html`,
       message: `line #6 ${BG_WARN}(TodoItem)${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/directiveShorthands.test.ts b/src/rules/vue-strong/directiveShorthands.test.ts
index 275dcca..e0075e8 100644
--- a/src/rules/vue-strong/directiveShorthands.test.ts
+++ b/src/rules/vue-strong/directiveShorthands.test.ts
@@ -47,19 +47,19 @@ describe('checkDirectiveShorthands', () => {
       {
         file: fileName,
         rule: `${TEXT_INFO}vue-strong ~ directive shorthands not used${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#directive-shorthands`,
+        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/directive-shorthands.html`,
         message: `line #1 ${BG_WARN}v-slot${BG_RESET} 🚨`,
       },
       {
         file: fileName,
         rule: `${TEXT_INFO}vue-strong ~ directive shorthands not used${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#directive-shorthands`,
+        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/directive-shorthands.html`,
         message: `line #3 ${BG_WARN}v-bind${BG_RESET} 🚨`,
       },
       {
         file: fileName,
         rule: `${TEXT_INFO}vue-strong ~ directive shorthands not used${TEXT_RESET}`,
-        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#directive-shorthands`,
+        description: `👉 ${TEXT_WARN}Use ":" for v-bind:, "@" for v-on: and "#" for v-slot.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/directive-shorthands.html`,
         message: `line #4 ${BG_WARN}v-on${BG_RESET} 🚨`,
       },
     ])
diff --git a/src/rules/vue-strong/fullWordComponentName.test.ts b/src/rules/vue-strong/fullWordComponentName.test.ts
index 0139667..cf04cbf 100644
--- a/src/rules/vue-strong/fullWordComponentName.test.ts
+++ b/src/rules/vue-strong/fullWordComponentName.test.ts
@@ -22,7 +22,7 @@ describe('checkFullWordComponentName', () => {
     expect(reportFullWordComponentName()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-strong ~ full-word component names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#full-word-component-names`,
+      description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/full-word-component-name.html`,
       message: `${componentName} is not a ${BG_WARN}full word.${BG_RESET} 🚨`,
     }])
   })
@@ -35,7 +35,7 @@ describe('checkFullWordComponentName', () => {
     expect(reportFullWordComponentName()).toStrictEqual([{
       file: filename,
       rule: `${TEXT_INFO}vue-strong ~ full-word component names${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#full-word-component-names`,
+      description: `👉 ${TEXT_WARN}Component names should prefer full words over abbreviations.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/full-word-component-name.html`,
       message: `${componentName} is not a ${BG_WARN}full word.${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/propNameCasing.test.ts b/src/rules/vue-strong/propNameCasing.test.ts
index f9d7126..5e4e299 100644
--- a/src/rules/vue-strong/propNameCasing.test.ts
+++ b/src/rules/vue-strong/propNameCasing.test.ts
@@ -35,7 +35,7 @@ describe('checkPropNameCasing', () => {
     expect(reportPropNameCasing()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ prop names are not camelCased${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Rename the props to camelCase.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#prop-name-casing`,
+      description: `👉 ${TEXT_WARN}Rename the props to camelCase.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/prop-name-casing.html`,
       message: `prop names are ${BG_WARN}not camelCased${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/quotedAttributeValues.test.ts b/src/rules/vue-strong/quotedAttributeValues.test.ts
index 052ed4f..b1be1bb 100644
--- a/src/rules/vue-strong/quotedAttributeValues.test.ts
+++ b/src/rules/vue-strong/quotedAttributeValues.test.ts
@@ -40,7 +40,7 @@ describe('checkQuotedAttributeValues', () => {
     expect(reportQuotedAttributeValues()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ attribute value is not quoted${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Use quotes for attribute values.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#quoted-attribute-values`,
+      description: `👉 ${TEXT_WARN}Use quotes for attribute values.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/quoted-attribute-values.html`,
       message: `line #2 ${BG_WARN}:style={${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/selfClosingComponents.test.ts b/src/rules/vue-strong/selfClosingComponents.test.ts
index 852e6a3..13e5997 100644
--- a/src/rules/vue-strong/selfClosingComponents.test.ts
+++ b/src/rules/vue-strong/selfClosingComponents.test.ts
@@ -56,7 +56,7 @@ describe('checkSelfClosingComponents', () => {
     expect(reportSelfClosingComponents()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ component is not self closing${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#self-closing-components`,
+      description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/self-closing-components.html`,
       message: `line #2 ${BG_WARN}<MyComponent></MyComponent>${BG_RESET} 🚨`,
     }])
   })
@@ -79,7 +79,7 @@ describe('checkSelfClosingComponents', () => {
     expect(reportSelfClosingComponents()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ component is not self closing${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#self-closing-components`,
+      description: `👉 ${TEXT_WARN}Components with no content should be self-closing.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/self-closing-components.html`,
       message: `line #4 ${BG_WARN}></MyComponent>${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/simpleComputed.test.ts b/src/rules/vue-strong/simpleComputed.test.ts
index 209373b..7acd3b4 100644
--- a/src/rules/vue-strong/simpleComputed.test.ts
+++ b/src/rules/vue-strong/simpleComputed.test.ts
@@ -55,7 +55,7 @@ describe('checkSimpleComputed', () => {
     expect(reportSimpleComputed()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ complicated computed property${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Refactor the computed properties to smaller ones.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#simple-computed-properties`,
+      description: `👉 ${TEXT_WARN}Refactor the computed properties to smaller ones.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/simple-computed.html`,
       message: `line #2 ${BG_WARN}computed${BG_RESET} 🚨`,
     }])
   })
diff --git a/src/rules/vue-strong/templateSimpleExpression.test.ts b/src/rules/vue-strong/templateSimpleExpression.test.ts
index 7a5648d..091ecdc 100644
--- a/src/rules/vue-strong/templateSimpleExpression.test.ts
+++ b/src/rules/vue-strong/templateSimpleExpression.test.ts
@@ -37,7 +37,7 @@ describe('checkTemplateSimpleExpression', () => {
     expect(reportTemplateSimpleExpression()).toStrictEqual([{
       file: fileName,
       rule: `${TEXT_INFO}vue-strong ~ lengthy template expression${TEXT_RESET}`,
-      description: `👉 ${TEXT_WARN}Refactor the expression into a computed property.${TEXT_RESET} See: https://vuejs.org/style-guide/rules-strongly-recommended.html#simple-expressions-in-templates`,
+      description: `👉 ${TEXT_WARN}Refactor the expression into a computed property.${TEXT_RESET} See: https://vue-mess-detector.webmania.cc/rules/vue-strong/template-simple-expression.html`,
       message: `line #5 ${BG_WARN}fullName.split(' ').map((word) => {${BG_RESET} 🚨`,
     }])
   })