@heyramzi/lint 2.0.0 → 2.1.0

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 (37) hide show
  1. package/bin/heyramzi-comment-length.js +4 -3
  2. package/bin/heyramzi-file-tokens.js +2 -2
  3. package/bin/heyramzi-slop.js +3 -1
  4. package/config/oxlintrc.json +1 -1
  5. package/data/slop/artifacts.js +87 -0
  6. package/data/slop/pattern-parts.js +56 -0
  7. package/data/slop/patterns/appositives-and-sayings.js +81 -0
  8. package/data/slop/patterns/comma-clauses.js +106 -0
  9. package/data/slop/patterns/diagram-and-script-tells.js +71 -0
  10. package/data/slop/patterns/dropped-elements.js +149 -0
  11. package/data/slop/patterns/duration-and-openers.js +102 -0
  12. package/data/slop/patterns/headings-and-laws.js +116 -0
  13. package/data/slop/patterns/numbers-and-runs.js +94 -0
  14. package/data/slop/patterns/openers-and-tails.js +90 -0
  15. package/data/slop/patterns/parallel-shapes.js +100 -0
  16. package/data/slop/patterns/reveals-and-tallies.js +101 -0
  17. package/data/slop/patterns/setups-and-closers.js +83 -0
  18. package/data/slop/patterns/subject-voice.js +67 -0
  19. package/data/slop/patterns/vague-and-flourish.js +102 -0
  20. package/data/slop/patterns/wikipedia-signs.js +103 -0
  21. package/data/slop/patterns.js +62 -0
  22. package/data/slop/phrases-en-closers.js +66 -0
  23. package/data/slop/phrases-en-core.js +185 -0
  24. package/data/slop/phrases-en-wikipedia.js +136 -0
  25. package/data/slop/phrases-fr.js +152 -0
  26. package/data/slop/shapes-density.js +81 -0
  27. package/data/slop/shapes-framing.js +101 -0
  28. package/data/slop/shapes-reveals.js +88 -0
  29. package/data/slop/title-tells.js +8 -0
  30. package/data/slop/words-en.js +178 -0
  31. package/data/slop/words-fr.js +101 -0
  32. package/data/slop-words.js +18 -2576
  33. package/data/vendor/heading-words.js +6 -0
  34. package/inline-path.js +2 -0
  35. package/package.json +1 -1
  36. package/slop.js +4 -2
  37. package/ui-rules.js +4 -2
@@ -0,0 +1,88 @@
1
+ /** Sentence shapes, first third: reveals, pivots, closers and the cadence tells. */
2
+ export const shapesReveals = [
3
+ {
4
+ id: "negation-pivot",
5
+ name: "Negation pivot",
6
+ rule: 'Defining a thing by first denying a different thing. Banned outright in written copy; at most one per spoken script. State what the thing is and let the contrast be implied. The comma form, "X, not the Y", is decidable and fails the gate as `comma-not-pivot`.',
7
+ example:
8
+ '"It is not a project, it is a wish." / "X does not happen. Y happens." / "The problem is not X, it is Y." / "None of it does X. It just does Y."',
9
+ },
10
+ {
11
+ id: "deadpan-closer",
12
+ name: "Deadpan closer",
13
+ rule: "A short flat declarative parked at the end of a block to land the point. One is a writer's choice. The tell is that every block on the page ends the same way, so the reader can predict the last sentence before reading it, and the page acquires one rhythm. Count them per page rather than per paragraph: #31 catches a run inside one paragraph and this is a run across a page. Fix by ending some blocks mid-thought, some on the long sentence, and some on the fact rather than the verdict.",
14
+ example:
15
+ '"You picked a template one Sunday and got as far as the header. The About page is still empty." / "There is no project to manage." / "Nothing has been charged."',
16
+ },
17
+ {
18
+ id: "promised-outcome-as-fact",
19
+ name: "Promised outcome stated as fact",
20
+ rule: 'A result that has not happened yet, and may never happen, written in the plain present as if it were already true. The reader knows it is not true today, so the sentence reads as a claim nobody could back, and the whole page loses its footing. It comes from copying a feature bullet ("Syncs every hour") onto an outcome the product cannot control: whether customers call, whether Google ranks, whether an assistant names you. Ramzi, 17 Sep 2026, on "Customers reach you on your phone": we are "pretending the truth". Say what is possible, or what we do: "Customers can reach you on your phone", "We build the page Google reads". Keep the plain present only for what is already true of the thing in front of the reader.',
21
+ example:
22
+ '"Customers reach you on your phone" / "People in your town find you on Google" / "ChatGPT names you when somebody asks" / "Clients pay on time"',
23
+ },
24
+ {
25
+ id: "self-acting-abstraction",
26
+ name: "Self-acting abstraction",
27
+ rule: 'An inanimate subject given an agentive verb, so nobody does the work and no mechanism is named. The reflexive form is the loud one ("the week plans itself"), and the quiet one is the same fault without the reflexive: a tool, a document or a schedule as the subject of a verb only a person or a program performs. Ramzi, 7 Sep 2026: "XX that XX themselves", and 17 Sep 2026 on "A calendar takes them": the subject is an abstraction. Unlintable because the identical grammar is correct when the subject really is the actor ("the script reads the file"), so it is judged on whether the named subject can do the named thing. Name the actor and the mechanism: what reads the call, what writes the task.',
28
+ example:
29
+ '"Tasks that write themselves" / "The week plans itself" / "A calendar takes them" / "Calls become task updates on their own" / "a workspace that runs itself"',
30
+ },
31
+ {
32
+ id: "comma-hung-fragment",
33
+ name: "Comma-hung fragment",
34
+ rule: 'A noun, a comma, then a fragment with no verb of its own, usually a past participle or a bare adverb. Ramzi, 7 Sep 2026, on three of them: "xxx, XXXed ai slop" and "XXX, XXX in such sentence is ai slop". His comma joins a list of three or more, an adverbial opener, or two clauses that each have a subject and a verb. Nothing else. Write the sentence: "the report is filed", "you get 4 hours of your week back".',
35
+ example:
36
+ '"Sales tax report, filed" / "The week, planned" / "4 to 5 hours a week, back" / "One line, nothing dramatic"',
37
+ },
38
+ {
39
+ id: "correlative-inflation",
40
+ name: "Correlative inflation",
41
+ rule: "Stacked correlative pairs used to make one idea sound like two.",
42
+ example: '"not only X but also Y" / "both X and Y" where only X is doing work',
43
+ },
44
+ {
45
+ id: "rule-of-three",
46
+ name: "Rule of three",
47
+ rule: "Three-item lists where the third item exists only for rhythm. Cut it or make it load-bearing.",
48
+ example: '"faster, cleaner, and more reliable"',
49
+ },
50
+ {
51
+ id: "superficial-ing-analysis",
52
+ name: "Superficial -ing analysis",
53
+ rule: "A trailing participial clause that restates the sentence as significance instead of adding a fact.",
54
+ example: '"..., highlighting the importance of clear processes."',
55
+ },
56
+ {
57
+ id: "engagement-bait-close",
58
+ name: "Engagement-bait close",
59
+ rule: "A question bolted onto the end with no real offer behind it. End on the idea, or on one specific real ask.",
60
+ example: '"What do you think?" / "How do you handle this? Let me know below."',
61
+ },
62
+ {
63
+ id: "selfish-framing",
64
+ name: "Selfish framing",
65
+ rule: 'Copy about the writer instead of the reader. Count "I", "we", "my", "our", "mine", "ours" against "you", "your"; second person has to win. First person is for evidence the author measured or did, never for positioning. A bare possessive pronoun standing alone as a subject ("Mine is day 21.") is the worst form of it: the sentence exists to announce that the writer has one.',
66
+ example: '"We are excited to share our new approach." / "Mine is day 21."',
67
+ },
68
+ {
69
+ id: "dramatized-pain",
70
+ name: "Dramatized pain",
71
+ rule: "Inflating the reader's problem past what they would call it themselves.",
72
+ example: '"operational nightmare" / "a complete disaster"',
73
+ },
74
+ {
75
+ id: "the-part-nobody",
76
+ name: "The unclaimed-insight preamble",
77
+ rule: "Announcing that what follows is the overlooked part, instead of just saying it. The writer awards themselves the insight before the reader has judged it, and the sentence carries no information. Delete the preamble and keep the point.",
78
+ example:
79
+ '"The part nobody raised: charge for it." / "What everyone misses here is X." / "The thing nobody talks about:" / "Here is what they will not tell you."',
80
+ },
81
+ {
82
+ id: "nobody-universal",
83
+ name: "The invented universal",
84
+ rule: 'A claim that nobody does the thing, stated as fact to make an ordinary point sound like a discovery. It is unprovable and almost never true, and the reader knows it. Ramzi, 23 Sep 2026, on "and nobody writes it down": "Nobody XXX is AI slop." Unlintable because "nobody will read that" is a real verdict on a real card. Name who, where, and what it costs them: "the team keeps the steps in their heads, so a new hire asks the same thing twice".',
85
+ example:
86
+ '"and nobody writes it down" / "Nobody checks the numbers." / "Nobody reads the handbook." / "Everyone does it, and nobody measures it."',
87
+ },
88
+ ];
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Checked on titles and headings only: a comma there is cadence standing in for
3
+ * a subject. A colon that labels the subject is fine. Home of `course-lint`'s rule.
4
+ */
5
+ export const titleTells = [
6
+ { id: "title-comma", test: /,/, rule: "comma in a title (one clause, no second beat)" },
7
+ { id: "title-not-y", test: /,\s+not\s+/i, rule: '"X, not Y" antithesis' },
8
+ ];
@@ -0,0 +1,178 @@
1
+ /** The English bans. Exported apart so an English-only surface can skip the French. */
2
+ export const wordsEn = [
3
+ // --- Existing workspace bans ---
4
+ "foster",
5
+ "fostering",
6
+ "transformative",
7
+ "navigating",
8
+ "navigate",
9
+ "seamless",
10
+ "seamlessly",
11
+ "unleash",
12
+ "enhance",
13
+ "enhancing",
14
+ "embrace",
15
+ "embracing",
16
+ "ensure",
17
+ "ensuring",
18
+ "encourage",
19
+ "encouraging",
20
+ "continuous",
21
+ "utilizing",
22
+ "utilize",
23
+ "comprehensive",
24
+ "leveraging",
25
+ "leverage",
26
+ "enable",
27
+ "enabling",
28
+ "streamline",
29
+ "streamlining",
30
+ "efficiency",
31
+ "versatile",
32
+ "tailor",
33
+ "tailored",
34
+ "conduct",
35
+
36
+ // --- Nominalised effort. The house word for the act is "following up". --- Measured 2026-08-16: zero occurrences across 56,568 words of first-party writing and speech.
37
+
38
+ // "chase" survives once, as a plain verb inside "chase payment". The gerund is a copywriter's word, not his.
39
+ "chasing",
40
+
41
+ // --- 2026 corpus: the register words named repeatedly across 31 videos on AI writing, read 6 Sep 2026.
42
+
43
+ // `quietly` and `amid` were each named by three independent sources as the fastest copy tells; the travel-brochure trio comes from the press-release voice a model defaults into when told to
44
+
45
+ // be neutral. Evidence: humanizer/references/detection.md.
46
+ "quietly",
47
+ "amid",
48
+ "commendable",
49
+ "breathtaking",
50
+ "scenic",
51
+ "sleek",
52
+
53
+ // --- Stop-slop: business jargon ---
54
+ "actionable",
55
+ "beacon",
56
+ "bespoke",
57
+ "bolster",
58
+ "catalyst",
59
+ "cornerstone",
60
+ "curate",
61
+ "curated",
62
+ "delve",
63
+ "delving",
64
+ "disruptive",
65
+ "ecosystem",
66
+ "elevate",
67
+ "elevating",
68
+ "embark",
69
+ "embarking",
70
+ "empower",
71
+ "empowering",
72
+ "facilitate",
73
+ "facilitating",
74
+ "groundbreaking",
75
+ "harness",
76
+ "harnessing",
77
+ "holistic",
78
+ "innovative",
79
+ "intricate",
80
+ "intricacies",
81
+ "landscape",
82
+ "meticulous",
83
+ "meticulously",
84
+ "multifaceted",
85
+ "myriad",
86
+ "nuanced",
87
+ "optimize",
88
+ "optimizing",
89
+ "paramount",
90
+ "paradigm",
91
+ "pivotal",
92
+ "payoff",
93
+ "plethora",
94
+ "poised",
95
+ "realm",
96
+ "redefine",
97
+ "redefining",
98
+ "reimagine",
99
+ "reimagining",
100
+ "reshape",
101
+ "reshaping",
102
+ "revolutionize",
103
+ "revolutionizing",
104
+ "robust",
105
+ "scalable",
106
+ "spearhead",
107
+ "synergy",
108
+ "tapestry",
109
+ "testament",
110
+ "underpin",
111
+ "underscore",
112
+ "unpack",
113
+ "unpacking",
114
+
115
+ // --- Stop-slop: adverbs (AI tells) ---
116
+ "crucially",
117
+ "deeply",
118
+ "fundamentally",
119
+ "furthermore",
120
+ "genuinely",
121
+ "importantly",
122
+ "inevitably",
123
+ "inherently",
124
+ "interestingly",
125
+ "moreover",
126
+ "truly",
127
+ "ultimately",
128
+
129
+ // --- petergyang/no-ai-slop, read 2026-08-31 --- The six surface forms that list carries and this one did not.
130
+
131
+ // The word list already bans "underscore", "paradigm", "testament" and "pivotal", but \b matching lets the plural and the gerund through, which is how "underscores its significance" reads clean.
132
+
133
+ // "highlighting" and "reflecting" are deliberately absent: both are ordinary English, so the trailing -ing analysis clause stays a human read against patterns.md 3.
134
+
135
+ // Zero occurrences of all six across the first-party corpus.
136
+ "showcasing",
137
+ "underscores",
138
+ "underscoring",
139
+ "supercharge",
140
+ "supercharging",
141
+ "ever-evolving",
142
+
143
+ // --- Wikipedia:Signs of AI writing, "AI vocabulary", read 2026-09-05 --- The words-to-watch that list carries and this one did not.
144
+
145
+ // "highlight" and "key" are deliberately absent: both are ordinary English, and the shape they appear in is caught by the `superficial-ing-clause` pattern instead. Sources: WP:AIVOCAB, WP:AIPUFFERY and the Wikipedia section on undue emphasis.
146
+ "additionally",
147
+ "boast",
148
+ "boasts",
149
+ "bolstered",
150
+ "cementing",
151
+ "crucial",
152
+ "cultivating",
153
+ "emphasizing",
154
+ "emphasises",
155
+ "emphasizes",
156
+ "encompassing",
157
+ "enduring",
158
+ "epitomizes",
159
+ "exemplifies",
160
+ "exemplifying",
161
+ "garner",
162
+ "garnered",
163
+ "garnering",
164
+ "interplay",
165
+ "nestled",
166
+ "profound",
167
+ "renowned",
168
+ "resonate",
169
+ "resonates",
170
+ "showcase",
171
+ "showcases",
172
+ "solidifying",
173
+ "symbolizing",
174
+ "underpinning",
175
+ "underpins",
176
+ "valuable",
177
+ "vibrant",
178
+ ];
@@ -0,0 +1,101 @@
1
+ /** The French bans. Same lists, French surface forms. */
2
+ export const wordsFr = [
3
+ // --- French: business jargon ---
4
+ "optimiser",
5
+ "valoriser",
6
+ "accompagner",
7
+ "accompagnement",
8
+ "performant",
9
+ "performante",
10
+ "incontournable",
11
+ "levier",
12
+ "leviers",
13
+ "piloter",
14
+ "pilotage",
15
+ "pérenniser",
16
+ "structurer",
17
+ "structurant",
18
+ "structurante",
19
+ "fédérer",
20
+ "dynamiser",
21
+ "dynamique",
22
+ "transversal",
23
+ "transversale",
24
+ "mutualiser",
25
+ "capitaliser",
26
+ "prioriser",
27
+ "sécuriser",
28
+ "fiabiliser",
29
+ "fluidifier",
30
+ "harmoniser",
31
+ "rationaliser",
32
+ "déployer",
33
+
34
+ // --- French: AI filler adverbs ---
35
+ "véritablement",
36
+ "fondamentalement",
37
+ "indéniablement",
38
+ "assurément",
39
+ "indubitablement",
40
+ "intrinsèquement",
41
+ "indiscutablement",
42
+
43
+ // --- French: AI buzzwords ---
44
+ "holistique",
45
+ "exhaustif",
46
+ "exhaustive",
47
+ "paradigme",
48
+ "écosystème",
49
+ "synergie",
50
+ "innovant",
51
+ "innovante",
52
+ "disruptif",
53
+ // "disruptive" is the French feminine and the English adjective; it is listed
54
+ // once in `words-en.js`, and a second entry only duplicated it.
55
+ "résilient",
56
+ "résiliente",
57
+ "résilience",
58
+ "proactif",
59
+ "proactive",
60
+ "pérenne",
61
+ "sur-mesure",
62
+
63
+ // --- French: the same signs, in French --- fr:Aide:Identifier l'usage d'une IA générative, read 2026-09-05.
64
+
65
+ // It names "ton promotionnel", "langue de bois" and "emphase excessive" without listing words, so these are the French surface forms of the English words in `words-en.js`:
66
+
67
+ // the puffery adjectives, the calques of underscore/showcase, and the participles the superficial-analysis clause hangs on.
68
+ "emblématique",
69
+ "renommé",
70
+ "renommée",
71
+ "prisé",
72
+ "prisée",
73
+ "foisonnant",
74
+ "foisonnante",
75
+ "niché",
76
+ "nichée",
77
+ // "vibrant" and "crucial" carry the same spelling in both languages and are
78
+ // listed once, in the English block. Only the feminine forms need an entry.
79
+ "vibrante",
80
+ "cruciale",
81
+ "primordial",
82
+ "primordiale",
83
+ "jalon",
84
+ "fleuron",
85
+ "florissant",
86
+ "florissante",
87
+ "inestimable",
88
+ "soulignant",
89
+ // "mettant" is deliberately absent: "mettant en place" is ordinary French.
90
+ // Its slop forms are phrases, "mettant en lumière" and "mettant en avant".
91
+ "témoignant",
92
+ "illustrant",
93
+ "reflétant",
94
+ "renforçant",
95
+ "consacrant",
96
+ "conjuguer",
97
+ "insuffler",
98
+ "impulser",
99
+ "plébiscité",
100
+ "plébiscitée",
101
+ ];