eslint-plugin-traceability 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +5 -5
  2. package/README.md +28 -29
  3. package/SECURITY.md +135 -0
  4. package/lib/src/index.d.ts +6 -35
  5. package/lib/src/index.js +8 -5
  6. package/lib/src/maintenance/cli.js +12 -16
  7. package/lib/src/maintenance/detect.js +28 -1
  8. package/lib/src/rules/helpers/require-story-io.d.ts +2 -2
  9. package/lib/src/rules/helpers/require-story-io.js +13 -13
  10. package/lib/src/rules/helpers/valid-annotation-format-internal.d.ts +2 -2
  11. package/lib/src/rules/helpers/valid-annotation-format-internal.js +3 -3
  12. package/lib/src/rules/helpers/valid-annotation-utils.d.ts +5 -0
  13. package/lib/src/rules/helpers/valid-annotation-utils.js +43 -5
  14. package/lib/src/rules/helpers/valid-implements-utils.d.ts +11 -11
  15. package/lib/src/rules/helpers/valid-implements-utils.js +11 -11
  16. package/lib/src/rules/helpers/valid-story-reference-helpers.js +19 -0
  17. package/lib/src/rules/prefer-implements-annotation.d.ts +7 -7
  18. package/lib/src/rules/prefer-implements-annotation.js +21 -21
  19. package/lib/src/rules/valid-annotation-format.js +50 -24
  20. package/lib/src/rules/valid-req-reference.js +9 -9
  21. package/lib/src/utils/annotation-checker.js +3 -1
  22. package/lib/src/utils/reqAnnotationDetection.d.ts +2 -2
  23. package/lib/src/utils/reqAnnotationDetection.js +28 -28
  24. package/lib/tests/config/flat-config-presets-integration.test.d.ts +1 -0
  25. package/lib/tests/config/flat-config-presets-integration.test.js +75 -0
  26. package/lib/tests/maintenance/batch.test.js +11 -11
  27. package/lib/tests/maintenance/cli.test.js +34 -27
  28. package/lib/tests/maintenance/report.test.js +7 -7
  29. package/lib/tests/plugin-default-export-and-configs.test.js +0 -2
  30. package/lib/tests/rules/prefer-implements-annotation.test.js +48 -15
  31. package/lib/tests/rules/require-branch-annotation.test.js +15 -36
  32. package/lib/tests/rules/require-req-annotation.test.js +31 -104
  33. package/lib/tests/rules/require-story-annotation.test.js +3 -3
  34. package/lib/tests/rules/require-story-io-behavior.test.js +2 -7
  35. package/lib/tests/rules/require-story-io.edgecases.test.js +2 -7
  36. package/lib/tests/rules/require-story-visitors-edgecases.test.js +8 -8
  37. package/lib/tests/rules/valid-annotation-format.test.js +23 -23
  38. package/lib/tests/rules/valid-req-reference.test.js +9 -9
  39. package/lib/tests/rules/valid-story-reference.test.js +4 -43
  40. package/lib/tests/utils/annotation-checker.test.js +2 -6
  41. package/lib/tests/utils/fsTestHelpers.d.ts +7 -0
  42. package/lib/tests/utils/fsTestHelpers.js +26 -0
  43. package/lib/tests/utils/ioTestHelpers.d.ts +7 -0
  44. package/lib/tests/utils/ioTestHelpers.js +24 -0
  45. package/lib/tests/utils/temp-dir-helpers.d.ts +14 -0
  46. package/lib/tests/utils/temp-dir-helpers.js +61 -0
  47. package/package.json +8 -7
  48. package/user-docs/api-reference.md +37 -20
  49. package/user-docs/eslint-9-setup-guide.md +89 -6
  50. package/user-docs/migration-guide.md +37 -21
  51. package/docs/ci-cd-pipeline.md +0 -224
  52. package/docs/cli-integration.md +0 -22
  53. package/docs/code-quality-refactor-opportunities-2025-12-03.md +0 -78
  54. package/docs/config-presets.md +0 -38
  55. package/docs/conventional-commits-guide.md +0 -185
  56. package/docs/custom-rules-development-guide.md +0 -659
  57. package/docs/decisions/0001-allow-dynamic-require-for-built-plugins.md +0 -26
  58. package/docs/decisions/001-typescript-for-eslint-plugin.accepted.md +0 -111
  59. package/docs/decisions/002-jest-for-eslint-testing.accepted.md +0 -137
  60. package/docs/decisions/003-code-quality-ratcheting-plan.md +0 -48
  61. package/docs/decisions/004-automated-version-bumping-for-ci-cd.md +0 -196
  62. package/docs/decisions/005-github-actions-validation-tooling.accepted.md +0 -144
  63. package/docs/decisions/006-semantic-release-for-automated-publishing.accepted.md +0 -227
  64. package/docs/decisions/007-github-releases-over-changelog.accepted.md +0 -216
  65. package/docs/decisions/008-ci-audit-flags.accepted.md +0 -60
  66. package/docs/decisions/009-security-focused-lint-rules.accepted.md +0 -64
  67. package/docs/decisions/010-implements-annotation-for-multi-story-requirements.proposed.md +0 -184
  68. package/docs/decisions/adr-0001-console-usage-for-cli-guards.md +0 -190
  69. package/docs/decisions/adr-accept-dev-dep-risk-glob.md +0 -40
  70. package/docs/decisions/adr-commit-branch-tests.md +0 -54
  71. package/docs/decisions/adr-maintenance-cli-interface.md +0 -140
  72. package/docs/decisions/adr-pre-push-parity.md +0 -112
  73. package/docs/decisions/code-quality-ratcheting-plan.md +0 -53
  74. package/docs/dependency-health.md +0 -238
  75. package/docs/eslint-9-setup-guide.md +0 -517
  76. package/docs/eslint-plugin-development-guide.md +0 -487
  77. package/docs/functionality-coverage-2025-12-03.md +0 -250
  78. package/docs/jest-testing-guide.md +0 -100
  79. package/docs/rules/prefer-implements-annotation.md +0 -219
  80. package/docs/rules/require-branch-annotation.md +0 -71
  81. package/docs/rules/require-req-annotation.md +0 -203
  82. package/docs/rules/require-story-annotation.md +0 -159
  83. package/docs/rules/valid-annotation-format.md +0 -418
  84. package/docs/rules/valid-req-reference.md +0 -153
  85. package/docs/rules/valid-story-reference.md +0 -120
  86. package/docs/security-incidents/2025-11-17-glob-cli-incident.md +0 -45
  87. package/docs/security-incidents/2025-11-18-brace-expansion-redos.md +0 -45
  88. package/docs/security-incidents/2025-11-18-bundled-dev-deps-accepted-risk.md +0 -93
  89. package/docs/security-incidents/2025-11-18-tar-race-condition.md +0 -43
  90. package/docs/security-incidents/2025-12-03-dependency-health-review.md +0 -58
  91. package/docs/security-incidents/SECURITY-INCIDENT-2025-11-18-semantic-release-bundled-npm.known-error.md +0 -104
  92. package/docs/security-incidents/SECURITY-INCIDENT-TEMPLATE.md +0 -37
  93. package/docs/security-incidents/dependency-override-rationale.md +0 -57
  94. package/docs/security-incidents/dev-deps-high.json +0 -116
  95. package/docs/security-incidents/handling-procedure.md +0 -54
  96. package/docs/stories/001.0-DEV-PLUGIN-SETUP.story.md +0 -92
  97. package/docs/stories/002.0-DEV-ESLINT-CONFIG.story.md +0 -82
  98. package/docs/stories/003.0-DEV-FUNCTION-ANNOTATIONS.story.md +0 -112
  99. package/docs/stories/004.0-DEV-BRANCH-ANNOTATIONS.story.md +0 -153
  100. package/docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md +0 -138
  101. package/docs/stories/006.0-DEV-FILE-VALIDATION.story.md +0 -144
  102. package/docs/stories/007.0-DEV-ERROR-REPORTING.story.md +0 -163
  103. package/docs/stories/008.0-DEV-AUTO-FIX.story.md +0 -150
  104. package/docs/stories/009.0-DEV-MAINTENANCE-TOOLS.story.md +0 -117
  105. package/docs/stories/010.0-DEV-DEEP-VALIDATION.story.md +0 -124
  106. package/docs/stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.md +0 -149
  107. package/docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md +0 -216
  108. package/docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md +0 -236
  109. package/docs/stories/developer-story.map.md +0 -120
  110. package/docs/ts-jest-presets-guide.md +0 -548
@@ -7,7 +7,7 @@
7
7
  * @req REQ-MULTILINE-SUPPORT - Handle annotations split across multiple lines
8
8
  * @req REQ-FLEXIBLE-PARSING - Support reasonable variations in whitespace and formatting
9
9
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
10
- * @req REQ-IMPLEMENTS-PARSE - Parse @implements annotations without affecting @story/@req
10
+ * @req REQ-SUPPORTS-PARSE - Parse @supports annotations without affecting @story/@req
11
11
  * @req REQ-MIXED-SUPPORT - Support mixed @story/@req/@implements usage in comments
12
12
  */
13
13
  /**
@@ -24,7 +24,7 @@ export interface PendingAnnotation {
24
24
  * This function trims whitespace, keeps any annotation tags that appear
25
25
  * later in the line, and supports common JSDoc styles such as leading "*".
26
26
  *
27
- * It detects @story, @req, and @implements tags while preserving the rest
27
+ * It detects @story, @req, and @supports tags while preserving the rest
28
28
  * of the line for downstream logic.
29
29
  */
30
30
  export declare function normalizeCommentLine(rawLine: string): string;
@@ -8,7 +8,7 @@
8
8
  * @req REQ-MULTILINE-SUPPORT - Handle annotations split across multiple lines
9
9
  * @req REQ-FLEXIBLE-PARSING - Support reasonable variations in whitespace and formatting
10
10
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
11
- * @req REQ-IMPLEMENTS-PARSE - Parse @implements annotations without affecting @story/@req
11
+ * @req REQ-SUPPORTS-PARSE - Parse @supports annotations without affecting @story/@req
12
12
  * @req REQ-MIXED-SUPPORT - Support mixed @story/@req/@implements usage in comments
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -19,7 +19,7 @@ exports.normalizeCommentLine = normalizeCommentLine;
19
19
  * This function trims whitespace, keeps any annotation tags that appear
20
20
  * later in the line, and supports common JSDoc styles such as leading "*".
21
21
  *
22
- * It detects @story, @req, and @implements tags while preserving the rest
22
+ * It detects @story, @req, and @supports tags while preserving the rest
23
23
  * of the line for downstream logic.
24
24
  */
25
25
  function normalizeCommentLine(rawLine) {
@@ -27,7 +27,7 @@ function normalizeCommentLine(rawLine) {
27
27
  if (!trimmed) {
28
28
  return "";
29
29
  }
30
- const annotationMatch = trimmed.match(/@story\b|@req\b|@implements\b/);
30
+ const annotationMatch = trimmed.match(/@story\b|@req\b|@supports\b/);
31
31
  if (!annotationMatch || annotationMatch.index === undefined) {
32
32
  const withoutLeadingStar = trimmed.replace(/^\*\s?/, "");
33
33
  return withoutLeadingStar;
@@ -42,7 +42,10 @@ export declare function collapseAnnotationValue(value: string): string;
42
42
  *
43
43
  * Returns the fixed path when safe, or null if no fix should be applied.
44
44
  *
45
+ * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
45
46
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
47
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
48
+ * @story docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md
46
49
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
47
50
  * @req REQ-AUTOFIX-SAFE - Auto-fix must be conservative and never broaden the referenced path
48
51
  * @req REQ-AUTOFIX-PRESERVE - Preserve surrounding formatting when normalizing story path suffixes
@@ -53,6 +56,7 @@ export declare function getFixedStoryPath(original: string): string | null;
53
56
  *
54
57
  * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
55
58
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
59
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
56
60
  * @req REQ-ERROR-SPECIFICITY - Provide specific error messages for different format violations
57
61
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
58
62
  */
@@ -62,6 +66,7 @@ export declare function buildStoryErrorMessage(kind: "missing" | "invalid", valu
62
66
  *
63
67
  * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
64
68
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
69
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
65
70
  * @req REQ-ERROR-SPECIFICITY - Provide specific error messages for different format violations
66
71
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
67
72
  */
@@ -39,6 +39,7 @@ exports.STORY_EXAMPLE_PATH = "docs/stories/005.0-DEV-EXAMPLE.story.md";
39
39
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
40
40
  */
41
41
  function collapseAnnotationValue(value) {
42
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-MULTILINE-SUPPORT
42
43
  return value.replace(/\s+/g, "");
43
44
  }
44
45
  /**
@@ -51,29 +52,52 @@ function collapseAnnotationValue(value) {
51
52
  *
52
53
  * Returns the fixed path when safe, or null if no fix should be applied.
53
54
  *
55
+ * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
54
56
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
57
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
58
+ * @story docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md
55
59
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
56
60
  * @req REQ-AUTOFIX-SAFE - Auto-fix must be conservative and never broaden the referenced path
57
61
  * @req REQ-AUTOFIX-PRESERVE - Preserve surrounding formatting when normalizing story path suffixes
58
62
  */
59
63
  function getFixedStoryPath(original) {
60
- // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-SAFE - Skip auto-fix entirely for paths containing directory traversal segments ("..").
64
+ // @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md | REQ-AUTOFIX-SAFE - Reject auto-fix when the path contains ".." traversal segments to avoid broadening the reference.
65
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces correctness of the story identifier by rejecting paths that use unsafe traversal segments.
61
66
  if (original.includes("..")) {
67
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT
68
+ // @implements docs/stories/008.0-DEV-AUTO-FIX.story.md REQ-AUTOFIX-SAFE
69
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-AUTOFIX-SAFE
62
70
  return null;
63
71
  }
64
- // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-FORMAT - Do not modify paths that already end with ".story.md" since they are already in the correct format.
72
+ // @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md | REQ-AUTOFIX-FORMAT - Leave correctly formatted ".story.md" paths unchanged so diagnostics are not hidden by redundant fixes.
73
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces correctness of the story identifier by recognizing already valid ".story.md" paths without altering them.
65
74
  if (/\.story\.md$/.test(original)) {
75
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT
76
+ // @implements docs/stories/008.0-DEV-AUTO-FIX.story.md REQ-AUTOFIX-FORMAT
77
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-AUTOFIX-FORMAT
66
78
  return null;
67
79
  }
68
- // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE - Append the missing ".md" extension when the path already ends with ".story", preserving the existing base path.
80
+ // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE - When ".story" is present but ".md" is missing, append only the extension without altering the base path.
81
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces correctness of the story identifier by completing a partially correct ".story" suffix to the canonical ".story.md".
69
82
  if (/\.story$/.test(original)) {
83
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT
84
+ // @implements docs/stories/008.0-DEV-AUTO-FIX.story.md REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE
85
+ // @implements docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md REQ-AUTOFIX-FORMAT
70
86
  return `${original}.md`;
71
87
  }
72
- // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE - Upgrade plain ".md" paths to ".story.md" while preserving the rest of the path unchanged.
88
+ // @story docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE - Normalize plain ".md" doc paths to ".story.md" while keeping the rest of the path intact.
89
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces correctness of the story identifier by transforming generic ".md" references into canonical ".story.md" story paths.
73
90
  if (/\.md$/.test(original)) {
91
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT
92
+ // @implements docs/stories/008.0-DEV-AUTO-FIX.story.md REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE
93
+ // @implements docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md REQ-AUTOFIX-FORMAT
74
94
  return original.replace(/\.md$/, ".story.md");
75
95
  }
76
- // @story docs/stories/008.0-DEV-AUTO-FIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE REQ-AUTOFIX-SAFE - For paths with no extension, conservatively append ".story.md" to create a canonical story file path.
96
+ // @story docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md | REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE REQ-AUTOFIX-SAFE - For bare paths with no extension, append ".story.md" as a canonical story reference without touching the directory.
97
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces presence and correctness of the story identifier by supplying the standard ".story.md" suffix when no extension is provided.
98
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT
99
+ // @implements docs/stories/008.0-DEV-AUTO-FIX.story.md REQ-AUTOFIX-FORMAT REQ-AUTOFIX-PRESERVE REQ-AUTOFIX-SAFE
100
+ // @implements docs/stories/010.2-REQ-STORY-PATH-AUTOFIX.story.md REQ-AUTOFIX-FORMAT
77
101
  return `${original}.story.md`;
78
102
  }
79
103
  /**
@@ -81,14 +105,21 @@ function getFixedStoryPath(original) {
81
105
  *
82
106
  * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
83
107
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
108
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
84
109
  * @req REQ-ERROR-SPECIFICITY - Provide specific error messages for different format violations
85
110
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
86
111
  */
87
112
  function buildStoryErrorMessage(kind, value, options) {
88
113
  const example = options.storyExample || exports.STORY_EXAMPLE_PATH;
114
+ // @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md | REQ-ERROR-SPECIFICITY - Use a dedicated message variant when the @story value is completely missing.
115
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces presence of the story identifier by emitting a targeted message when the @story value is absent.
89
116
  if (kind === "missing") {
117
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-ERROR-SPECIFICITY
118
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-ERROR-SPECIFICITY
90
119
  return `Missing story path for @story annotation. Expected a path like "${example}".`;
91
120
  }
121
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-ERROR-SPECIFICITY
122
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-ERROR-SPECIFICITY
92
123
  return `Invalid story path "${value ?? ""}" for @story annotation. Expected a path like "${example}".`;
93
124
  }
94
125
  /**
@@ -96,13 +127,20 @@ function buildStoryErrorMessage(kind, value, options) {
96
127
  *
97
128
  * @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
98
129
  * @story docs/stories/008.0-DEV-AUTO-FIX.story.md
130
+ * @story docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md
99
131
  * @req REQ-ERROR-SPECIFICITY - Provide specific error messages for different format violations
100
132
  * @req REQ-AUTOFIX-FORMAT - Provide safe, minimal automatic fixes for common format issues
101
133
  */
102
134
  function buildReqErrorMessage(kind, value, options) {
103
135
  const example = options.reqExample || (0, valid_annotation_options_1.getDefaultReqExample)();
136
+ // @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md | REQ-ERROR-SPECIFICITY - Distinguish a completely missing @req from one that is present but malformed.
137
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-REQ-FORMAT REQ-ERROR-SPECIFICITY - Enforces presence of the requirement identifier by emitting a specific message when the @req value is missing.
104
138
  if (kind === "missing") {
139
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-ERROR-SPECIFICITY
140
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-ERROR-SPECIFICITY
105
141
  return `Missing requirement ID for @req annotation. Expected an identifier like "${example}".`;
106
142
  }
143
+ // @implements docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-ERROR-SPECIFICITY
144
+ // @implements docs/stories/010.1-REQ-STORY-PATH-STRICTNESS.story.md REQ-ERROR-SPECIFICITY
107
145
  return `Invalid requirement ID "${value ?? ""}" for @req annotation. Expected an identifier like "${example}" (uppercase letters, numbers, and dashes only).`;
108
146
  }
@@ -1,23 +1,23 @@
1
1
  /**
2
- * Helpers for @implements annotation validation used by valid-annotation-format.
2
+ * Helpers for @supports annotation validation used by valid-annotation-format.
3
3
  *
4
4
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
5
- * @req REQ-IMPLEMENTS-PARSE - Parse @implements annotations without affecting @story/@req
6
- * @req REQ-FORMAT-VALIDATION - Validate @implements story path and requirement IDs
7
- * @req REQ-MIXED-SUPPORT - Support mixed @story/@req/@implements usage in comments
5
+ * @req REQ-SUPPORTS-PARSE - Parse @supports annotations without affecting @story/@req
6
+ * @req REQ-FORMAT-VALIDATION - Validate @supports story path and requirement IDs
7
+ * @req REQ-MIXED-SUPPORT - Support mixed @story/@req/@supports usage in comments
8
8
  */
9
9
  import type { ResolvedAnnotationOptions } from "./valid-annotation-options";
10
10
  /**
11
- * Minimum number of tokens required for a valid @implements value:
11
+ * Minimum number of tokens required for a valid @supports value:
12
12
  * - one story path
13
13
  * - at least one requirement ID
14
14
  *
15
15
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
16
- * @req REQ-IMPLEMENTS-PARSE
16
+ * @req REQ-SUPPORTS-PARSE
17
17
  */
18
18
  export declare const MIN_IMPLEMENTS_TOKENS = 2;
19
19
  /**
20
- * Report a completely missing @implements value (no story path or req IDs).
20
+ * Report a completely missing @supports value (no story path or req IDs).
21
21
  *
22
22
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
23
23
  * @req REQ-FORMAT-VALIDATION
@@ -31,14 +31,14 @@ export declare function reportMissingImplementsValue(context: any, comment: any,
31
31
  */
32
32
  export declare function reportMissingImplementsReqIds(context: any, comment: any, options: ResolvedAnnotationOptions): void;
33
33
  /**
34
- * Report an invalid story path inside @implements.
34
+ * Report an invalid story path inside @supports.
35
35
  *
36
36
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
37
37
  * @req REQ-FORMAT-VALIDATION
38
38
  */
39
39
  export declare function reportInvalidImplementsStoryPath(context: any, comment: any, storyPath: string, options: ResolvedAnnotationOptions): void;
40
40
  /**
41
- * Report an invalid requirement ID token inside @implements.
41
+ * Report an invalid requirement ID token inside @supports.
42
42
  *
43
43
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
44
44
  * @req REQ-FORMAT-VALIDATION
@@ -53,7 +53,7 @@ type ImplementsDeps = {
53
53
  reportInvalidImplementsReqId: typeof reportInvalidImplementsReqId;
54
54
  };
55
55
  /**
56
- * Validate an @implements annotation value.
56
+ * Validate an @supports annotation value.
57
57
  *
58
58
  * This helper encapsulates the logic previously in valid-annotation-format.ts:
59
59
  * - trims the raw value
@@ -64,7 +64,7 @@ type ImplementsDeps = {
64
64
  * - delegates reporting to the provided helpers
65
65
  *
66
66
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
67
- * @req REQ-IMPLEMENTS-PARSE
67
+ * @req REQ-SUPPORTS-PARSE
68
68
  * @req REQ-FORMAT-VALIDATION
69
69
  * @req REQ-MIXED-SUPPORT
70
70
  */
@@ -8,16 +8,16 @@ exports.reportInvalidImplementsReqId = reportInvalidImplementsReqId;
8
8
  exports.validateImplementsAnnotationHelper = validateImplementsAnnotationHelper;
9
9
  const valid_annotation_utils_1 = require("./valid-annotation-utils");
10
10
  /**
11
- * Minimum number of tokens required for a valid @implements value:
11
+ * Minimum number of tokens required for a valid @supports value:
12
12
  * - one story path
13
13
  * - at least one requirement ID
14
14
  *
15
15
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
16
- * @req REQ-IMPLEMENTS-PARSE
16
+ * @req REQ-SUPPORTS-PARSE
17
17
  */
18
18
  exports.MIN_IMPLEMENTS_TOKENS = 2;
19
19
  /**
20
- * Report a completely missing @implements value (no story path or req IDs).
20
+ * Report a completely missing @supports value (no story path or req IDs).
21
21
  *
22
22
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
23
23
  * @req REQ-FORMAT-VALIDATION
@@ -28,7 +28,7 @@ function reportMissingImplementsValue(context, comment, options) {
28
28
  node: comment,
29
29
  messageId: "invalidImplementsFormat",
30
30
  data: {
31
- details: `Missing story path and requirement IDs for @implements annotation. Expected a value like "${storyExample} ${reqExample}".`,
31
+ details: `Missing story path and requirement IDs for @supports annotation. Expected a value like "${storyExample} ${reqExample}".`,
32
32
  },
33
33
  });
34
34
  }
@@ -44,12 +44,12 @@ function reportMissingImplementsReqIds(context, comment, options) {
44
44
  node: comment,
45
45
  messageId: "invalidImplementsFormat",
46
46
  data: {
47
- details: `Missing requirement IDs for @implements annotation. Expected a value like "${storyExample} ${reqExample}".`,
47
+ details: `Missing requirement IDs for @supports annotation. Expected a value like "${storyExample} ${reqExample}".`,
48
48
  },
49
49
  });
50
50
  }
51
51
  /**
52
- * Report an invalid story path inside @implements.
52
+ * Report an invalid story path inside @supports.
53
53
  *
54
54
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
55
55
  * @req REQ-FORMAT-VALIDATION
@@ -60,12 +60,12 @@ function reportInvalidImplementsStoryPath(context, comment, storyPath, options)
60
60
  node: comment,
61
61
  messageId: "invalidImplementsFormat",
62
62
  data: {
63
- details: `Invalid story path "${storyPath}" for @implements annotation. Expected a path like "${storyExample}".`,
63
+ details: `Invalid story path "${storyPath}" for @supports annotation. Expected a path like "${storyExample}".`,
64
64
  },
65
65
  });
66
66
  }
67
67
  /**
68
- * Report an invalid requirement ID token inside @implements.
68
+ * Report an invalid requirement ID token inside @supports.
69
69
  *
70
70
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
71
71
  * @req REQ-FORMAT-VALIDATION
@@ -81,7 +81,7 @@ function reportInvalidImplementsReqId(context, comment, reqId, options) {
81
81
  });
82
82
  }
83
83
  /**
84
- * Prepare and validate the token array for an @implements value.
84
+ * Prepare and validate the token array for an @supports value.
85
85
  *
86
86
  * Returns { storyPath, reqIds } when tokens are present and structurally valid,
87
87
  * or null when a missing-value condition has been reported.
@@ -121,7 +121,7 @@ function validateImplementsTokens(deps, context, comment, rest) {
121
121
  }
122
122
  }
123
123
  /**
124
- * Validate an @implements annotation value.
124
+ * Validate an @supports annotation value.
125
125
  *
126
126
  * This helper encapsulates the logic previously in valid-annotation-format.ts:
127
127
  * - trims the raw value
@@ -132,7 +132,7 @@ function validateImplementsTokens(deps, context, comment, rest) {
132
132
  * - delegates reporting to the provided helpers
133
133
  *
134
134
  * @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
135
- * @req REQ-IMPLEMENTS-PARSE
135
+ * @req REQ-SUPPORTS-PARSE
136
136
  * @req REQ-FORMAT-VALIDATION
137
137
  * @req REQ-MIXED-SUPPORT
138
138
  */
@@ -20,11 +20,14 @@ function analyzeCandidateBoundaries(candidates, cwd) {
20
20
  let hasInProjectCandidate = false;
21
21
  let hasOutOfProjectCandidate = false;
22
22
  for (const candidate of candidates) {
23
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
23
24
  const boundary = (0, storyReferenceUtils_1.enforceProjectBoundary)(candidate, cwd);
24
25
  if (boundary.isWithinProject) {
26
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY
25
27
  hasInProjectCandidate = true;
26
28
  }
27
29
  else {
30
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY
28
31
  hasOutOfProjectCandidate = true;
29
32
  }
30
33
  }
@@ -44,8 +47,12 @@ function analyzeCandidateBoundaries(candidates, cwd) {
44
47
  */
45
48
  function handleProjectBoundaryForExistence({ storyPath, commentNode, context, cwd, candidates, existenceResult, reportInvalidPath, }) {
46
49
  if (candidates.length > 0) {
50
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
51
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
47
52
  const { hasInProjectCandidate, hasOutOfProjectCandidate } = analyzeCandidateBoundaries(candidates, cwd);
48
53
  if (hasOutOfProjectCandidate && !hasInProjectCandidate) {
54
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
55
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY
49
56
  reportInvalidPath({ storyPath, commentNode, context });
50
57
  return true;
51
58
  }
@@ -53,8 +60,12 @@ function handleProjectBoundaryForExistence({ storyPath, commentNode, context, cw
53
60
  if (existenceResult &&
54
61
  existenceResult.status === "exists" &&
55
62
  existenceResult.matchedPath) {
63
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
64
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY
56
65
  const boundary = (0, storyReferenceUtils_1.enforceProjectBoundary)(existenceResult.matchedPath, cwd);
57
66
  if (!boundary.isWithinProject) {
67
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
68
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY
58
69
  reportInvalidPath({ storyPath, commentNode, context });
59
70
  return true;
60
71
  }
@@ -72,7 +83,11 @@ function handleProjectBoundaryForExistence({ storyPath, commentNode, context, cw
72
83
  function performSecurityValidations({ storyPath, commentNode, context, cwd, allowAbsolute, reportInvalidPath, }) {
73
84
  // Absolute path check
74
85
  if (path_1.default.isAbsolute(storyPath)) {
86
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
87
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-SECURITY-VALIDATION
75
88
  if (!allowAbsolute) {
89
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
90
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-SECURITY-VALIDATION
76
91
  reportInvalidPath({ storyPath, commentNode, context });
77
92
  return false;
78
93
  }
@@ -82,8 +97,12 @@ function performSecurityValidations({ storyPath, commentNode, context, cwd, allo
82
97
  // Path traversal check
83
98
  const containsTraversal = storyPath.includes("..") || /\\|\//.test(storyPath);
84
99
  if (containsTraversal) {
100
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
101
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-SECURITY-VALIDATION
85
102
  const full = path_1.default.resolve(cwd, path_1.default.normalize(storyPath));
86
103
  if (!full.startsWith(cwd + path_1.default.sep)) {
104
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-PROJECT-BOUNDARY REQ-SECURITY-VALIDATION
105
+ // @implements docs/stories/006.0-DEV-FILE-VALIDATION.story.md REQ-SECURITY-VALIDATION
87
106
  reportInvalidPath({ storyPath, commentNode, context });
88
107
  return false;
89
108
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ESLint rule implementation for preferring the consolidated `@implements`
2
+ * ESLint rule implementation for preferring the consolidated `@supports`
3
3
  * annotation over legacy combinations of `@story` and `@req` within JSDoc
4
4
  * block comments. This module provides:
5
5
  *
@@ -7,14 +7,14 @@
7
7
  * - Identification of multi-story comment blocks that are not safely
8
8
  * auto-fixable.
9
9
  * - A conservative auto-fix that rewrites simple, single-story patterns into
10
- * a single `@implements` annotation while preserving formatting.
10
+ * a single `@supports` annotation while preserving formatting.
11
11
  *
12
12
  * The rule is intended as an **optional migration aid** to help projects
13
- * gradually move to the newer `@implements` format without breaking existing
13
+ * gradually move to the newer `@supports` format without breaking existing
14
14
  * traceability links.
15
15
  *
16
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
17
- * @req REQ-OPTIONAL-WARNING - Emit configurable recommendation diagnostics for legacy @story/@req usage
16
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
17
+ * @req REQ-OPTIONAL-WARNING - Emit configurable recommendation diagnostics for legacy @story/@req usage in favor of @supports
18
18
  * @req REQ-MULTI-STORY-DETECT - Detect multi-story patterns that cannot be auto-fixed
19
19
  * @req REQ-SINGLE-STORY-FIX - Restrict auto-fix to single-story, single-path cases
20
20
  * @req REQ-PRESERVE-FORMAT - Preserve original JSDoc indentation and prefix formatting
@@ -27,10 +27,10 @@ import type { Rule } from "eslint";
27
27
  * ESLint rule: prefer-implements-annotation
28
28
  *
29
29
  * Recommend migrating from legacy `@story` + `@req` annotations to the
30
- * newer `@implements` format. This rule is **disabled by default** and
30
+ * newer `@supports` format. This rule is **disabled by default** and
31
31
  * is intended as an optional, opt-in migration aid.
32
32
  *
33
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
33
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
34
34
  * @req REQ-OPTIONAL-WARNING - Emit configurable recommendation diagnostics for legacy @story/@req usage
35
35
  * @req REQ-MULTI-STORY-DETECT - Detect multi-story patterns that cannot be auto-fixed
36
36
  * @req REQ-BACKWARD-COMP-VALIDATION - Keep legacy @story/@req annotations valid when the rule is disabled
@@ -5,7 +5,7 @@ const valid_annotation_format_internal_1 = require("./helpers/valid-annotation-f
5
5
  // @req REQ-MULTI-STORY-DETECT - Centralized threshold constant for detecting multi-story patterns
6
6
  const MULTI_STORY_THRESHOLD = 1;
7
7
  // Minimum number of tokens required for a valid @story annotation line.
8
- // @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
8
+ // @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
9
9
  // @req REQ-MULTI-STORY-DETECT
10
10
  const MIN_STORY_TOKENS = 2;
11
11
  // Minimum number of tokens required for a valid @req annotation line, aligned with story tokens.
@@ -23,8 +23,8 @@ function collectStoryAndReqMetadata(comment) {
23
23
  const normalized = (0, valid_annotation_format_internal_1.normalizeCommentLine)(rawLine);
24
24
  if (!normalized)
25
25
  return;
26
- if (/^@implements\b/.test(normalized)) {
27
- // Mixed @implements usage should have been filtered out earlier
26
+ if (/^@supports\b/.test(normalized)) {
27
+ // Mixed @supports usage should have been filtered out earlier
28
28
  return;
29
29
  }
30
30
  if (/^@story\b/.test(normalized)) {
@@ -56,7 +56,7 @@ function applyImplementsReplacement(context, comment, details) {
56
56
  const { storyIdx, allIndicesToRemove, storyPath, reqIds } = details;
57
57
  const rawValue = comment.value || "";
58
58
  const rawLines = rawValue.split(/\r?\n/);
59
- const implAnnotation = `@implements ${storyPath} ${reqIds.join(" ")}`;
59
+ const implAnnotation = `@supports ${storyPath} ${reqIds.join(" ")}`;
60
60
  // Determine the leading prefix (indentation and `*`) from the original @story line
61
61
  const storyRawLine = rawLines[storyIdx];
62
62
  const prefixMatch = storyRawLine.match(/^(\s*\*?\s*)/);
@@ -81,7 +81,7 @@ function applyImplementsReplacement(context, comment, details) {
81
81
  }
82
82
  /**
83
83
  * Build an ESLint auto-fix for simple single-story `@story` + `@req` JSDoc
84
- * blocks, converting them to a single `@implements` annotation while
84
+ * blocks, converting them to a single `@supports` annotation while
85
85
  * preserving the original comment formatting.
86
86
  *
87
87
  * The fixer is intentionally conservative and only activates when:
@@ -92,13 +92,13 @@ function applyImplementsReplacement(context, comment, details) {
92
92
  *
93
93
  * When applicable, the fix:
94
94
  * - Removes the original `@story` and `@req` lines.
95
- * - Inserts a single `@implements` line in their place, preserving the
95
+ * - Inserts a single `@supports` line in their place, preserving the
96
96
  * original leading comment prefix (indentation and `*` markers).
97
97
  *
98
98
  * More complex patterns remain diagnostics-only with no fix to avoid
99
99
  * producing invalid or ambiguous output.
100
100
  *
101
- * @implements docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
101
+ * @implements docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
102
102
  * @req REQ-AUTO-FIX - Provide safe, opt-in auto-fix for simple legacy patterns
103
103
  * @req REQ-SINGLE-STORY-FIX - Restrict auto-fix to single-story, single-path cases
104
104
  * @req REQ-PRESERVE-FORMAT - Preserve original JSDoc indentation and prefix formatting
@@ -136,7 +136,7 @@ function analyzeComment(comment) {
136
136
  const normalized = (0, valid_annotation_format_internal_1.normalizeCommentLine)(rawLine);
137
137
  if (!normalized)
138
138
  return;
139
- if (/^@implements\b/.test(normalized)) {
139
+ if (/^@supports\b/.test(normalized)) {
140
140
  hasImplements = true;
141
141
  return;
142
142
  }
@@ -168,7 +168,7 @@ function processComment(comment, context) {
168
168
  node: comment,
169
169
  messageId: "cannotAutoFix",
170
170
  data: {
171
- reason: "comment mixes @story/@req with existing @implements annotations",
171
+ reason: "comment mixes @story/@req with existing @supports annotations",
172
172
  },
173
173
  });
174
174
  return;
@@ -191,10 +191,10 @@ function processComment(comment, context) {
191
191
  * ESLint rule: prefer-implements-annotation
192
192
  *
193
193
  * Recommend migrating from legacy `@story` + `@req` annotations to the
194
- * newer `@implements` format. This rule is **disabled by default** and
194
+ * newer `@supports` format. This rule is **disabled by default** and
195
195
  * is intended as an optional, opt-in migration aid.
196
196
  *
197
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
197
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
198
198
  * @req REQ-OPTIONAL-WARNING - Emit configurable recommendation diagnostics for legacy @story/@req usage
199
199
  * @req REQ-MULTI-STORY-DETECT - Detect multi-story patterns that cannot be auto-fixed
200
200
  * @req REQ-BACKWARD-COMP-VALIDATION - Keep legacy @story/@req annotations valid when the rule is disabled
@@ -203,7 +203,7 @@ const preferImplementsAnnotationRule = {
203
203
  meta: {
204
204
  type: "suggestion",
205
205
  docs: {
206
- description: "Recommend using @implements instead of legacy @story + @req annotations (optional migration rule)",
206
+ description: "Recommend using @supports instead of legacy @story + @req annotations (optional migration rule)",
207
207
  recommended: false,
208
208
  },
209
209
  // Auto-fix support will be wired in a later iteration; the rule starts as
@@ -212,31 +212,31 @@ const preferImplementsAnnotationRule = {
212
212
  messages: {
213
213
  /**
214
214
  * Recommend migrating simple, single-story @story + @req blocks to a
215
- * single @implements line. Auto-fix is provided where safe in a
215
+ * single @supports line. Auto-fix is provided where safe in a
216
216
  * follow-up iteration.
217
217
  *
218
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
218
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
219
219
  * @req REQ-OPTIONAL-WARNING
220
220
  */
221
- preferImplements: "Consider using @implements instead of @story + @req for clearer traceability. Run ESLint with --fix to auto-convert.",
221
+ preferImplements: "Consider using @supports instead of @story + @req for clearer traceability. Run ESLint with --fix to auto-convert.",
222
222
  /**
223
223
  * Report situations where the rule detects a legacy annotation pattern
224
224
  * but cannot safely provide an automatic fix. The `reason` field gives
225
225
  * a short, human-readable explanation to guide manual migration.
226
226
  *
227
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
227
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
228
228
  * @req REQ-MULTI-STORY-DETECT
229
229
  */
230
- cannotAutoFix: "Cannot auto-fix: {{reason}}. Manual migration to @implements required.",
230
+ cannotAutoFix: "Cannot auto-fix: {{reason}}. Manual migration to @supports required.",
231
231
  /**
232
232
  * Specialized message for the most common non-fixable case where more
233
233
  * than one @story annotation appears in the same block, indicating a
234
234
  * likely multi-story integration that must be converted manually.
235
235
  *
236
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
236
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
237
237
  * @req REQ-MULTI-STORY-DETECT
238
238
  */
239
- multiStoryDetected: "Multiple @story annotations detected in the same comment block. Manually convert to separate @implements lines.",
239
+ multiStoryDetected: "Multiple @story annotations detected in the same comment block. Manually convert to separate @supports lines.",
240
240
  },
241
241
  schema: [],
242
242
  },
@@ -247,7 +247,7 @@ const preferImplementsAnnotationRule = {
247
247
  * it surfaces recommendations when legacy `@story` + `@req` combinations are
248
248
  * present but does not yet perform automatic code modifications.
249
249
  *
250
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
250
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
251
251
  * @req REQ-OPTIONAL-WARNING
252
252
  * @req REQ-MULTI-STORY-DETECT
253
253
  */
@@ -258,7 +258,7 @@ const preferImplementsAnnotationRule = {
258
258
  * Program-level visitor that scans all comments for legacy
259
259
  * `@story` + `@req` usage and emits recommendation diagnostics.
260
260
  *
261
- * @story docs/stories/010.3-DEV-MIGRATE-TO-IMPLEMENTS.story.md
261
+ * @story docs/stories/010.3-DEV-MIGRATE-TO-SUPPORTS.story.md
262
262
  * @req REQ-OPTIONAL-WARNING - Emit recommendations when legacy annotations are detected
263
263
  * @req REQ-MULTI-STORY-DETECT - Detect multi-story and mixed annotation patterns
264
264
  */