@gspothq/cli 0.0.0-stage → 0.1.1

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 (232) hide show
  1. package/README.md +18 -2
  2. package/configurations/database/postgres/manifest.toml +114 -0
  3. package/configurations/database/postgres/rules/POSTGRES.md +78 -0
  4. package/configurations/framework/astro/eslint-presets.json +138 -0
  5. package/configurations/framework/astro/manifest.toml +95 -0
  6. package/configurations/framework/astro/rules/ASTRO.md +39 -0
  7. package/configurations/framework/expo/manifest.toml +43 -0
  8. package/configurations/framework/express/manifest.toml +17 -0
  9. package/configurations/framework/express/rules/EXPRESS.md +73 -0
  10. package/configurations/framework/express/semgrep/express.yml +71 -0
  11. package/configurations/framework/fastapi/manifest.toml +11 -0
  12. package/configurations/framework/fastapi/rules/FASTAPI.md +100 -0
  13. package/configurations/framework/fastapi/semgrep/fastapi.yml +44 -0
  14. package/configurations/framework/nestjs/eslint-presets.json +62 -0
  15. package/configurations/framework/nestjs/manifest.toml +52 -0
  16. package/configurations/framework/nestjs/rules/NESTJS.md +44 -0
  17. package/configurations/framework/nextjs/eslint-presets.json +73 -0
  18. package/configurations/framework/nextjs/manifest.toml +119 -0
  19. package/configurations/framework/nextjs/rules/NEXTJS.md +43 -0
  20. package/configurations/framework/react/eslint-presets.json +77 -0
  21. package/configurations/framework/react/manifest.toml +93 -0
  22. package/configurations/framework/react/rules/REACT.md +108 -0
  23. package/configurations/framework/react-dom/eslint-presets.json +110 -0
  24. package/configurations/framework/react-dom/manifest.toml +24 -0
  25. package/configurations/framework/react-native/manifest.toml +46 -0
  26. package/configurations/framework/react-native/rules/REACT-NATIVE.md +51 -0
  27. package/configurations/framework/site/manifest.toml +170 -0
  28. package/configurations/framework/site/rules/SITE.md +20 -0
  29. package/configurations/framework/svelte/eslint-presets.json +67 -0
  30. package/configurations/framework/svelte/manifest.toml +83 -0
  31. package/configurations/framework/svelte/rules/SVELTE.md +48 -0
  32. package/configurations/framework/vue/eslint-presets.json +180 -0
  33. package/configurations/framework/vue/manifest.toml +83 -0
  34. package/configurations/framework/vue/rules/VUE.md +41 -0
  35. package/configurations/general/commits/manifest.toml +111 -0
  36. package/configurations/general/commits/rules/GIT.md +31 -0
  37. package/configurations/general/coverage/manifest.toml +3 -0
  38. package/configurations/general/dependencies/manifest.toml +159 -0
  39. package/configurations/general/dependencies/rules/DEPENDENCIES.md +30 -0
  40. package/configurations/general/dependencies/syncpack.json +15 -0
  41. package/configurations/general/docs/manifest.toml +79 -0
  42. package/configurations/general/docs/rules/DOCS.md +86 -0
  43. package/configurations/general/duplication/manifest.toml +32 -0
  44. package/configurations/general/engineering/manifest.toml +8 -0
  45. package/configurations/general/engineering/rules/agent/PLANNING.md +42 -0
  46. package/configurations/general/engineering/rules/agent/SUPPRESSIONS.md +16 -0
  47. package/configurations/general/engineering/rules/agent/TALKING.md +3 -0
  48. package/configurations/general/engineering/rules/agent/TASKS.md +19 -0
  49. package/configurations/general/engineering/rules/agent/WORKING.md +83 -0
  50. package/configurations/general/engineering/rules/code/ACCESSIBILITY.md +32 -0
  51. package/configurations/general/engineering/rules/code/CLI.md +37 -0
  52. package/configurations/general/engineering/rules/code/COMMENTS.md +38 -0
  53. package/configurations/general/engineering/rules/code/CONFIGURATION.md +25 -0
  54. package/configurations/general/engineering/rules/code/ERRORS.md +49 -0
  55. package/configurations/general/engineering/rules/code/HTTP.md +46 -0
  56. package/configurations/general/engineering/rules/code/LOGGING.md +55 -0
  57. package/configurations/general/engineering/rules/code/TESTING.md +58 -0
  58. package/configurations/general/files/manifest.toml +141 -0
  59. package/configurations/general/files/rules/YAML.md +19 -0
  60. package/configurations/general/format/manifest.toml +152 -0
  61. package/configurations/general/gspot/manifest.toml +65 -0
  62. package/configurations/general/gspot/rules/GENERATED.md +10 -0
  63. package/configurations/general/licenses/manifest.toml +33 -0
  64. package/configurations/general/naming/defaults.json +423 -0
  65. package/configurations/general/naming/manifest.toml +35 -0
  66. package/configurations/general/naming/rules/NAMING.md +179 -0
  67. package/configurations/general/prose/manifest.toml +86 -0
  68. package/configurations/general/prose/rules/WRITING.md +31 -0
  69. package/configurations/general/prose/vale/styles/LICENSES.md +55 -0
  70. package/configurations/general/prose/vale/styles/gspot/ampm.yml +8 -0
  71. package/configurations/general/prose/vale/styles/gspot/conscious-language.yml +16 -0
  72. package/configurations/general/prose/vale/styles/gspot/contractions.yml +43 -0
  73. package/configurations/general/prose/vale/styles/gspot/currency.yml +8 -0
  74. package/configurations/general/prose/vale/styles/gspot/dashes.yml +8 -0
  75. package/configurations/general/prose/vale/styles/gspot/date-ordinals.yml +41 -0
  76. package/configurations/general/prose/vale/styles/gspot/dates.yml +7 -0
  77. package/configurations/general/prose/vale/styles/gspot/file-paths.yml +7 -0
  78. package/configurations/general/prose/vale/styles/gspot/future.yml +17 -0
  79. package/configurations/general/prose/vale/styles/gspot/hedging.yml +22 -0
  80. package/configurations/general/prose/vale/styles/gspot/history.yml +16 -0
  81. package/configurations/general/prose/vale/styles/gspot/idioms.yml +21 -0
  82. package/configurations/general/prose/vale/styles/gspot/interface-verbs.yml +11 -0
  83. package/configurations/general/prose/vale/styles/gspot/jargon.yml +11 -0
  84. package/configurations/general/prose/vale/styles/gspot/leading-conjunctions.yml +12 -0
  85. package/configurations/general/prose/vale/styles/gspot/link-text.yml +8 -0
  86. package/configurations/general/prose/vale/styles/gspot/locations.yml +14 -0
  87. package/configurations/general/prose/vale/styles/gspot/marketing.yml +26 -0
  88. package/configurations/general/prose/vale/styles/gspot/merge-conflict-markers.yml +13 -0
  89. package/configurations/general/prose/vale/styles/gspot/militaristic-language.yml +22 -0
  90. package/configurations/general/prose/vale/styles/gspot/modals.yml +9 -0
  91. package/configurations/general/prose/vale/styles/gspot/numbered-units.yml +18 -0
  92. package/configurations/general/prose/vale/styles/gspot/obvious-fields.yml +14 -0
  93. package/configurations/general/prose/vale/styles/gspot/ordinal-adverbs.yml +15 -0
  94. package/configurations/general/prose/vale/styles/gspot/percentage-numbers.yml +8 -0
  95. package/configurations/general/prose/vale/styles/gspot/placeholders.yml +7 -0
  96. package/configurations/general/prose/vale/styles/gspot/product-centric-writing.yml +8 -0
  97. package/configurations/general/prose/vale/styles/gspot/punctuated-headings.yml +11 -0
  98. package/configurations/general/prose/vale/styles/gspot/self-reference.yml +15 -0
  99. package/configurations/general/prose/vale/styles/gspot/session-identifiers.yml +11 -0
  100. package/configurations/general/prose/vale/styles/gspot/since.yml +6 -0
  101. package/configurations/general/prose/vale/styles/gspot/straight-quotes.yml +11 -0
  102. package/configurations/general/prose/vale/styles/gspot/suspended-hyphens.yml +8 -0
  103. package/configurations/general/prose/vale/styles/gspot/symbols.yml +8 -0
  104. package/configurations/general/prose/vale/styles/gspot/time-ranges.yml +14 -0
  105. package/configurations/general/prose/vale/styles/gspot/url-prepositions.yml +10 -0
  106. package/configurations/general/prose/vale/styles/gspot/version-range.yml +8 -0
  107. package/configurations/general/repository/manifest.toml +24 -0
  108. package/configurations/general/secrets/gitleaks.toml +2 -0
  109. package/configurations/general/secrets/manifest.toml +125 -0
  110. package/configurations/general/secrets/rules/SECRETS.md +13 -0
  111. package/configurations/general/security/manifest.toml +77 -0
  112. package/configurations/general/security/rules/SECURITY.md +55 -0
  113. package/configurations/general/spelling/manifest.toml +46 -0
  114. package/configurations/general/structure/manifest.toml +70 -0
  115. package/configurations/infrastructure/ansible/manifest.toml +33 -0
  116. package/configurations/infrastructure/docker/manifest.toml +127 -0
  117. package/configurations/infrastructure/docker/rules/DOCKER.md +135 -0
  118. package/configurations/infrastructure/docker/trivyignore +2 -0
  119. package/configurations/infrastructure/github-actions/manifest.toml +76 -0
  120. package/configurations/infrastructure/github-actions/rules/GITHUB-ACTIONS.md +43 -0
  121. package/configurations/infrastructure/github-actions/zizmor.yml +3 -0
  122. package/configurations/infrastructure/nginx/manifest.toml +51 -0
  123. package/configurations/infrastructure/nginx/rules/NGINX.md +38 -0
  124. package/configurations/infrastructure/openapi/manifest.toml +50 -0
  125. package/configurations/infrastructure/openapi/rules/OPENAPI.md +39 -0
  126. package/configurations/infrastructure/xcode/manifest.toml +131 -0
  127. package/configurations/infrastructure/xcode/rules/XCODE.md +34 -0
  128. package/configurations/language/bash/manifest.toml +261 -0
  129. package/configurations/language/bash/rules/BASH.md +106 -0
  130. package/configurations/language/bash/rules/LANGUAGE.md +213 -0
  131. package/configurations/language/bash/rules/NAMING.md +62 -0
  132. package/configurations/language/bash/rules/OPERATIONS.md +77 -0
  133. package/configurations/language/bash/rules/SAFETY.md +222 -0
  134. package/configurations/language/bash/semgrep/bash.yml +30 -0
  135. package/configurations/language/css/manifest.toml +98 -0
  136. package/configurations/language/css/rules/CSS.md +28 -0
  137. package/configurations/language/css/rules/NAMING.md +17 -0
  138. package/configurations/language/css/rules/TAILWIND.md +26 -0
  139. package/configurations/language/css/stylelint-rule-names.json +89 -0
  140. package/configurations/language/html/manifest.toml +59 -0
  141. package/configurations/language/html/rules/HTML.md +27 -0
  142. package/configurations/language/html/rules/NAMING.md +16 -0
  143. package/configurations/language/javascript/eslint-presets.json +997 -0
  144. package/configurations/language/javascript/eslint-rule-names.json +299 -0
  145. package/configurations/language/javascript/eslint-runtime-names.json +61 -0
  146. package/configurations/language/javascript/manifest.toml +393 -0
  147. package/configurations/language/javascript/rules/BUN.md +13 -0
  148. package/configurations/language/javascript/rules/COMPONENTS.md +18 -0
  149. package/configurations/language/javascript/rules/DENO.md +15 -0
  150. package/configurations/language/javascript/rules/JAVASCRIPT.md +60 -0
  151. package/configurations/language/javascript/rules/NAMING.md +31 -0
  152. package/configurations/language/javascript/rules/NODE.md +21 -0
  153. package/configurations/language/javascript/rules/PLAYWRIGHT.md +34 -0
  154. package/configurations/language/javascript/semgrep/javascript.yml +84 -0
  155. package/configurations/language/markdown/manifest.toml +85 -0
  156. package/configurations/language/markdown/markdownlint-cli2.mjs +19 -0
  157. package/configurations/language/python/manifest.toml +621 -0
  158. package/configurations/language/python/rules/DESIGN.md +136 -0
  159. package/configurations/language/python/rules/FLOW.md +124 -0
  160. package/configurations/language/python/rules/NAMING.md +53 -0
  161. package/configurations/language/python/rules/PACKAGING.md +49 -0
  162. package/configurations/language/python/rules/PYTHON.md +136 -0
  163. package/configurations/language/python/rules/TYPING.md +132 -0
  164. package/configurations/language/sql/manifest.toml +68 -0
  165. package/configurations/language/sql/rules/NAMING.md +90 -0
  166. package/configurations/language/sql/rules/SQL.md +9 -0
  167. package/configurations/language/swift/manifest.toml +164 -0
  168. package/configurations/language/swift/rules/NAMING.md +88 -0
  169. package/configurations/language/swift/rules/SWIFT.md +134 -0
  170. package/configurations/language/swift/rules/SWIFTUI.md +61 -0
  171. package/configurations/language/swift/rules/UIKIT.md +99 -0
  172. package/configurations/language/swift/semgrep/swift.yml +126 -0
  173. package/configurations/language/typescript/eslint-presets.json +215 -0
  174. package/configurations/language/typescript/manifest.toml +72 -0
  175. package/configurations/language/typescript/rules/NAMING.md +73 -0
  176. package/configurations/language/typescript/rules/TYPESCRIPT.md +79 -0
  177. package/configurations/library/drizzle/manifest.toml +68 -0
  178. package/configurations/library/drizzle/rules/DRIZZLE.md +44 -0
  179. package/configurations/library/react-hook-form/manifest.toml +15 -0
  180. package/configurations/library/react-hook-form/rules/REACT-HOOK-FORM.md +48 -0
  181. package/configurations/library/swift-snapshot-testing/manifest.toml +32 -0
  182. package/configurations/library/tanstack-query/eslint-presets.json +21 -0
  183. package/configurations/library/tanstack-query/manifest.toml +26 -0
  184. package/configurations/library/tanstack-query/rules/TANSTACK-QUERY.md +41 -0
  185. package/configurations/library/testing-library/eslint-presets.json +191 -0
  186. package/configurations/library/testing-library/manifest.toml +47 -0
  187. package/configurations/library/translations/manifest.toml +40 -0
  188. package/configurations/library/translations/rules/NEXT-INTL.md +33 -0
  189. package/configurations/library/translations/rules/TRANSLATIONS.md +102 -0
  190. package/configurations/library/trpc/manifest.toml +14 -0
  191. package/configurations/library/trpc/rules/TRPC.md +43 -0
  192. package/configurations/library/zod/manifest.toml +25 -0
  193. package/configurations/library/zod/rules/ZOD.md +44 -0
  194. package/configurations/library/zustand/manifest.toml +18 -0
  195. package/configurations/library/zustand/rules/ZUSTAND.md +106 -0
  196. package/configurations/platform/cloudflare/manifest.toml +94 -0
  197. package/configurations/platform/cloudflare/rules/CLOUDFLARE.md +23 -0
  198. package/configurations/platform/cloudflare/semgrep/cloudflare.yml +12 -0
  199. package/configurations/platform/supabase/manifest.toml +112 -0
  200. package/configurations/platform/supabase/rules/SUPABASE.md +129 -0
  201. package/configurations/platform/supabase/semgrep/supabase.yml +60 -0
  202. package/configurations/testing/jest/manifest.toml +54 -0
  203. package/configurations/testing/pytest/manifest.toml +53 -0
  204. package/configurations/testing/swift-tests/manifest.toml +52 -0
  205. package/configurations/testing/swift-tests/rules/SWIFT-TESTS.md +79 -0
  206. package/configurations/testing/vitest/eslint-presets.json +22 -0
  207. package/configurations/testing/vitest/manifest.toml +69 -0
  208. package/configurations/testing/vitest/rules/VITEST.md +18 -0
  209. package/dist/LICENSE.md +201 -0
  210. package/dist/THIRD-PARTY-NOTICES.md +25 -0
  211. package/dist/eslint-rule-levels.json +10 -0
  212. package/dist/gspot.js +30740 -0
  213. package/dist/linkinator-program.js +65 -0
  214. package/dist/purgecss-program.js +51 -0
  215. package/dist/tool-versions.json +3 -0
  216. package/grammars/bash.wasm +0 -0
  217. package/grammars/css.wasm +0 -0
  218. package/grammars/html.wasm +0 -0
  219. package/grammars/javascript.wasm +0 -0
  220. package/grammars/licenses/tree-sitter-bash.txt +21 -0
  221. package/grammars/licenses/tree-sitter-css.txt +21 -0
  222. package/grammars/licenses/tree-sitter-html.txt +21 -0
  223. package/grammars/licenses/tree-sitter-javascript.txt +21 -0
  224. package/grammars/licenses/tree-sitter-python.txt +21 -0
  225. package/grammars/licenses/tree-sitter-swift.txt +21 -0
  226. package/grammars/licenses/tree-sitter-typescript.txt +21 -0
  227. package/grammars/python.wasm +0 -0
  228. package/grammars/swift.wasm +0 -0
  229. package/grammars/tsx.wasm +0 -0
  230. package/grammars/typescript.wasm +0 -0
  231. package/gspot.schema.json +45991 -0
  232. package/package.json +93 -5
@@ -0,0 +1,41 @@
1
+ # Vue
2
+
3
+ These rules cover Vue 3 single-file components, reactivity, props and events, templates, and stores.
4
+
5
+ ## Components
6
+
7
+ <!-- level: all -->
8
+
9
+ - Use `computed` for derived template values.
10
+ - Pass a prop or call an exposed method instead of changing state through a template ref.
11
+
12
+ ## Props and events
13
+
14
+ - Require a prop when the component cannot operate without it. An optional prop can remain
15
+ undefined when absence has defined behavior; supply a default only when that matches the contract.
16
+
17
+ ### Event naming
18
+
19
+ <!-- level: all -->
20
+
21
+ Name an event for what happened, in the past tense or as a noun: `saved`, `update:modelValue`.
22
+
23
+ ## Reactivity
24
+
25
+ - Use `ref` for a value and `reactive` for an object that keeps the same identity. Do not destructure a reactive object.
26
+ - Derive with `computed`.
27
+ - Use `watch` for an effect outside Vue: a request, a timer, storage. Do not use it to derive state.
28
+ - Clean up in `onUnmounted`, or in the cleanup callback of the watcher, whatever a component started.
29
+
30
+ ## State and data
31
+
32
+ <!-- level: all -->
33
+
34
+ - Local state stays in the component. Shared state goes in a store, one store for each domain.
35
+ - A store exposes actions that say what happened. Components do not assign to store state.
36
+ - Fetch data in a composable or a store action, never inline in a template event.
37
+ - Name a composable `use` and its subject, such as `useCart`, and returns reactive values when callers need reactivity.
38
+
39
+ ## Tests
40
+
41
+ - Test a composable as a function, with no component around it where it needs none.
@@ -0,0 +1,111 @@
1
+ [configuration]
2
+ title = "Commits"
3
+ always_selected = true
4
+ when = { git = true }
5
+ description = "Checks commit messages for a conventional type, an optional project scope, a first line of 72 characters or fewer, and a wrapped body."
6
+
7
+ [files]
8
+ paths = ["**"]
9
+
10
+ [[tool]]
11
+ name = "commitlint"
12
+ version = "21.2.2"
13
+ npm = "@commitlint/cli"
14
+ mise = "npm:@commitlint/cli"
15
+ [[tool.replace]]
16
+ file = ".commitlintrc"
17
+ shared = false
18
+
19
+ [[tool.replace]]
20
+ file = ".commitlintrc.json"
21
+ shared = false
22
+
23
+ [[tool.replace]]
24
+ file = ".commitlintrc.yml"
25
+ shared = false
26
+
27
+ [[tool.replace]]
28
+ file = ".commitlintrc.yaml"
29
+ shared = false
30
+
31
+ [[tool.replace]]
32
+ file = ".commitlintrc.js"
33
+ shared = false
34
+
35
+ [[tool.replace]]
36
+ file = ".commitlintrc.cjs"
37
+ shared = false
38
+
39
+ [[tool.replace]]
40
+ file = ".commitlintrc.mjs"
41
+ shared = false
42
+
43
+ [[tool.replace]]
44
+ file = ".commitlintrc.ts"
45
+ shared = false
46
+
47
+ [[tool.replace]]
48
+ file = ".commitlintrc.cts"
49
+ shared = false
50
+
51
+ [[tool.replace]]
52
+ file = ".commitlintrc.mts"
53
+ shared = false
54
+
55
+ [[tool.replace]]
56
+ file = "commitlint.config.js"
57
+ shared = false
58
+
59
+ [[tool.replace]]
60
+ file = "commitlint.config.cjs"
61
+ shared = false
62
+
63
+ [[tool.replace]]
64
+ file = "commitlint.config.mjs"
65
+ shared = false
66
+
67
+ [[tool.replace]]
68
+ file = "commitlint.config.ts"
69
+ shared = false
70
+
71
+ [[tool.replace]]
72
+ file = "commitlint.config.cts"
73
+ shared = false
74
+
75
+ [[tool.replace]]
76
+ file = "commitlint.config.mts"
77
+ shared = false
78
+
79
+ [[tool.replace]]
80
+ file = "package.json"
81
+ key = "commitlint"
82
+ redirect = true
83
+ shared = true
84
+
85
+ [[tool_file]]
86
+ target = ".gspot/config/commitlint.config.cjs"
87
+ tool = "commitlint"
88
+ rule_keys = ["rules"]
89
+
90
+ [[check]]
91
+ name = "commitlint"
92
+ example = "The proposed message `changed stuff` lacks the configured conventional-commit structure. A message such as `fix(cli): report missing configuration` supplies a type, scope, and subject. Use a type and scope accepted by the repository policy."
93
+ level = "all"
94
+ stage = "message"
95
+ command = ["commitlint", "--config", "{tool_file:commitlint}", "--edit", "{message_file}"]
96
+ output = { format = "regex", pattern = "^\\s*[✖⚠]\\s+(?<message>.*?)\\s+\\[(?<rule>[a-z-]+)\\]\\s*$" }
97
+ summary = "Checks the commit message being written: a conventional type, an optional known scope, a first line of 72 characters or fewer, and a wrapped body."
98
+ why = "A history of typed, scoped subjects is what release notes, blame and bisect are read from; a free-form message hides the change."
99
+ help = "Write `<type>`: `<subject>` or `<type>`(`<scope>`): `<subject>`, with an accepted type and optional scope. Keep the whole first line at 72 characters or fewer. Change accepted types with gspot set tools.commitlint.types."
100
+
101
+ [[check]]
102
+ name = "commitlint-pushed"
103
+ example = "A new commit with message `changed stuff` causes the checked range to fail its message rules. Reword that commit to an accepted message such as `fix(cli): report missing configuration`. Rewriting commits changes their IDs; coordinate before rewriting shared history."
104
+ level = "all"
105
+ stage = "push"
106
+ runs = "history"
107
+ tool = "commitlint"
108
+ output = { format = "regex", pattern = "^\\s*[✖⚠]\\s+(?<message>.*?)\\s+\\[(?<rule>[a-z-]+)\\]\\s*$" }
109
+ summary = "Checks the message of every commit the push sends. Run by hand, it checks every commit from the upstream merge base to HEAD."
110
+ why = "A message written past the hook (--no-verify, a rebase, a merge) still reaches the shared branch unless the push checks it."
111
+ help = "Reword the commits that fail with git rebase -i, or change the rule with gspot set tools.commitlint.rules."
@@ -0,0 +1,31 @@
1
+ # Git
2
+
3
+ ## Working with uncommitted changes
4
+
5
+ Changes you did not make may belong to another agent or contributor working in parallel. Do not
6
+ revert, stash, clean, or overwrite them. Keep working beside them, and ask the user only when your
7
+ change overwrites or contradicts one.
8
+
9
+ ## Commits
10
+
11
+ - Commit only when the user asks.
12
+ - One change per commit. Put a rename and a behavior change in two commits.
13
+ - The body says what changed and why.
14
+ - Footers reference issues with `Refs: #123` or `Closes: #123`, and breaking changes with `BREAKING CHANGE: ...`.
15
+ - Never bypass hooks with `--no-verify`.
16
+
17
+ ## Branches
18
+
19
+ - Name branches `<type>/<kebab-summary>`, such as `feat/order-export` or `fix/session-expiry`.
20
+ - Never force-push a protected branch. Force-push your own branch only after a rebase you performed.
21
+ - Rebase onto the default branch before opening a pull request; do not merge the default branch into a feature branch.
22
+
23
+ ## Files to keep out of commits
24
+
25
+ - Editor state such as `.vscode/`, `.idea/`, or `xcuserdata/`, except settings the team commits on purpose.
26
+
27
+ ## Pull requests
28
+
29
+ - Use the commit subject as the title when the branch has one commit. Otherwise, write a sentence for the whole change.
30
+ - The description states what changed, why, and which checks verified it. It links the issue.
31
+ - A pull request does one thing. Unrelated fixes found on the way go in a separate branch.
@@ -0,0 +1,3 @@
1
+ [configuration]
2
+ title = "Coverage"
3
+ description = "Coverage floors shared by test runners."
@@ -0,0 +1,159 @@
1
+ prefix_collisions = { prefixes = ["package", "pnpm"] }
2
+
3
+ [configuration]
4
+ title = "Dependencies"
5
+ always_selected = true
6
+ description = "Dependency health: known advisories, one version for each dependency, exact pins, one package manager, and a lockfile that matches its manifest."
7
+
8
+ [files]
9
+ filenames = ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bunfig.toml", ".npmrc", "pnpm-workspace.yaml", "pyproject.toml", "uv.lock", "requirements*.txt", "Package.swift", "Package.resolved", "Cargo.toml", "Cargo.lock", "go.mod", "go.sum", "Gemfile.lock"]
10
+ kinds = ["source", "generated"]
11
+
12
+ [[tool]]
13
+ name = "osv-scanner"
14
+ version = "2.6.0"
15
+ min_version = "2.0.0"
16
+ mise = "osv-scanner"
17
+ brew = "osv-scanner"
18
+ github = { name = "google/osv-scanner", version = "v2.6.0" }
19
+ winget = "Google.OSVScanner"
20
+ scoop = "osv-scanner"
21
+ [[tool.replace]]
22
+ file = "osv-scanner.toml"
23
+ shared = false
24
+
25
+ [[tool]]
26
+ name = "syncpack"
27
+ version = "15.3.3"
28
+ npm = "syncpack"
29
+ mise = "npm:syncpack"
30
+ [[tool.replace]]
31
+ file = ".syncpackrc"
32
+ shared = false
33
+
34
+ [[tool.replace]]
35
+ file = ".syncpackrc.json"
36
+ shared = false
37
+
38
+ [[tool.replace]]
39
+ file = ".syncpackrc.yaml"
40
+ shared = false
41
+
42
+ [[tool.replace]]
43
+ file = ".syncpackrc.yml"
44
+ shared = false
45
+
46
+ [[tool.replace]]
47
+ file = ".syncpackrc.ts"
48
+ shared = false
49
+
50
+ [[tool.replace]]
51
+ file = ".syncpackrc.mjs"
52
+ shared = false
53
+
54
+ [[tool.replace]]
55
+ file = ".syncpackrc.js"
56
+ shared = false
57
+
58
+ [[tool.replace]]
59
+ file = ".syncpackrc.cjs"
60
+ shared = false
61
+
62
+ [[tool.replace]]
63
+ file = "syncpack.config.js"
64
+ shared = false
65
+
66
+ [[tool.replace]]
67
+ file = "syncpack.config.cjs"
68
+ shared = false
69
+
70
+ [[tool.replace]]
71
+ file = "syncpack.config.mjs"
72
+ shared = false
73
+
74
+ [[tool.replace]]
75
+ file = "syncpack.config.ts"
76
+ shared = false
77
+
78
+ [[tool_file]]
79
+ target = ".gspot/config/osv-scanner.toml"
80
+ tool = "osv-scanner"
81
+
82
+ [[tool_file]]
83
+ source = "syncpack.json"
84
+ target = ".gspot/config/syncpack.json"
85
+ tool = "syncpack"
86
+
87
+ [[check]]
88
+ name = "osv"
89
+ example = "A locked dependency version affected by a published OSV advisory reports the package and advisory. Upgrade to a reviewed fixed version and update the lockfile, then rescan."
90
+ level = "recommended"
91
+ stage = "push"
92
+ runs = "once"
93
+ needs = ["network"]
94
+ files = { filenames = ["bun.lock", "package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "yarn.lock", "go.mod", "Cargo.lock", "Gemfile.lock", "gems.locked", "requirements.txt", "Pipfile.lock", "poetry.lock", "pdm.lock", "pylock.toml", "uv.lock", "pom.xml", "gradle.lockfile", "buildscript-gradle.lockfile", "conan.lock", "pubspec.lock", "mix.lock", "cabal.project.freeze", "stack.yaml.lock", "composer.lock", "renv.lock", "packages.config", "packages.lock.json", "*.deps.json"], paths = ["**/gradle/verification-metadata.xml", "gradle/verification-metadata.xml"], kinds = ["source", "generated"] }
95
+ # The tool project lockfiles under .gspot stay out: a repository cannot upgrade a package that a gspot tool pins.
96
+ command = ["osv-scanner", "scan", "source", "--config", "{tool_file:osv-scanner}", "--format", "json", "--allow-no-lockfiles", "--recursive", "--experimental-exclude", ".gspot", "{root}"]
97
+ output = { format = "json", items = "results", children = "packages.vulnerabilities", fields = { file = "source.path", rule = "id", message = "package.name package.version summary" } }
98
+ summary = "Looks up every locked dependency in the Open Source Vulnerabilities (OSV) advisory database."
99
+ why = "An advisory identifies a vulnerability in a dependency version."
100
+ help = "Upgrade the package the finding names. When no fix exists, accept the advisory with `gspot ignore dependencies/osv --rule <advisory-id> --reason \"<why>\" --until <YYYY-MM-DD>`. Recheck it before that date."
101
+
102
+ [[check]]
103
+ name = "syncpack"
104
+ example = "Two workspace manifests declaring different versions of a dependency governed by the same version group report a mismatch. Align both declarations to the reviewed version and update the lockfile."
105
+ level = "all"
106
+ stage = "push"
107
+ runs = "once"
108
+ command = ["syncpack", "lint", "--config", "{tool_file:syncpack}"]
109
+ tool = "syncpack"
110
+ files = { filenames = ["package.json"] }
111
+ output = { format = "lines" }
112
+ summary = "Checks that every workspace package resolves each dependency to one version."
113
+ why = "Two versions of one dependency in a workspace mean two behaviors, and a bug that appears in one package only."
114
+ help = "Run syncpack fix --config .gspot/config/syncpack.json, or align the versions by hand."
115
+
116
+ [[check]]
117
+ name = "package-json"
118
+ example = "A repository with both `bun.lock` and `package-lock.json` reports a second lockfile. Delete the lockfile of the package manager the repository does not use."
119
+ level = "all"
120
+ stage = "commit"
121
+ runs = "once"
122
+ files = { filenames = ["package.json"] }
123
+ summary = "Checks every package.json: the root names a packageManager, every package names the same one, a workspace root is private, and only one kind of lockfile exists."
124
+ why = "Two package managers install two different trees."
125
+ help = "Name one packageManager in the root package.json, use it in every package, mark a workspace root private, and delete the other lockfile."
126
+
127
+ [[check]]
128
+ name = "stale-lockfile"
129
+ example = "Adding a dependency to a package manifest without updating its lockfile reports an outdated lockfile. Run the owning package manager installation, inspect its manifest and lockfile changes, and retain both together."
130
+ level = "recommended"
131
+ stage = "push"
132
+ runs = "once"
133
+ needs = ["network"]
134
+ files = { filenames = ["package.json", "bun.lock", "package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "yarn.lock", "pyproject.toml", "uv.lock"] }
135
+ summary = "Runs each package manager's frozen install in a temporary copy."
136
+ why = "A lockfile that lags its manifest installs versions nobody reviewed the moment someone runs a plain install."
137
+ help = "Run the install of the package manager once and commit the lockfile it writes."
138
+
139
+ [[check]]
140
+ name = "bun-release-age"
141
+ example = "A Bun project without the required `[install] minimumReleaseAge` reports a missing installation safeguard. Set it to the seconds named in the finding and configure the required scanner under `[install.security]`."
142
+ level = "all"
143
+ stage = "commit"
144
+ runs = "scope"
145
+ files = { filenames = ["bunfig.toml", "bun.lock", "bun.lockb"], kinds = ["source", "generated"] }
146
+ summary = "Checks each Bun project's bunfig.toml for the required minimum release age and security scanner."
147
+ why = "Most malicious releases are pulled within days, so a package nobody installs in its first week rarely harms anybody."
148
+ help = "Set [install] minimumReleaseAge in bunfig.toml to the seconds the message names, and the scanner under [install.security]."
149
+
150
+ [[check]]
151
+ name = "lockfile-hosts"
152
+ example = "A locked package URL pointing to a host outside `dependencies.allowed_registries` reports that host. Resolve the package again from the approved registry, or review and explicitly allow the required host."
153
+ level = "recommended"
154
+ stage = "commit"
155
+ runs = "scope"
156
+ files = { filenames = ["package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "yarn.lock", "bun.lock"], kinds = ["source", "generated"] }
157
+ summary = "Checks that npm, pnpm, Yarn, and text Bun lockfile downloads in each project scope use HTTPS and allowed registry hosts."
158
+ why = "A lockfile line that resolves from another host installs code nobody chose, and a review rarely reads lockfiles."
159
+ help = "Install the package from the registry again, or add the host to dependencies.allowed_registries."
@@ -0,0 +1,30 @@
1
+ # Dependencies
2
+
3
+ ## Adding one
4
+
5
+ - Do not add a dependency for a one-line native API, a small local helper, or an array, object, or
6
+ string utility. Use the platform first, then what the repository already depends on.
7
+ - A new dependency needs a reason in the commit: what it does that the platform and existing
8
+ dependencies do not.
9
+ - Prefer a package that does one thing, receives maintenance, publishes types, and has no install scripts.
10
+ - Each project uses one package manager and commits its lockfile. CI and Docker builds install
11
+ from the lockfile without changing it such as `npm ci`, `uv sync --frozen`.
12
+
13
+ ## Versions
14
+
15
+ - Pin exact versions in an application. A published library keeps ranges for its dependencies and peers.
16
+ - Pin the runtime version once for Node, Python, Bun, or the Swift toolchain. Every file that
17
+ states it agrees.
18
+ - If the package manager refuses a release as too new, pick an older one or ask the user.
19
+ - Upgrade one dependency per commit with the reason. Never upgrade broadly to satisfy a scanner
20
+ without reading what changed.
21
+
22
+ ## Policy
23
+
24
+ - Ask the user before you add a dependency whose license falls outside the allowed list.
25
+ - Record a known advisory that has no fix in `[[ignore]]`, with the check, advisory ID, reason,
26
+ and expiry. Never ignore advisories in bulk.
27
+ - Declare vendored code and record its upstream version and license. Change it only by updating
28
+ it from upstream.
29
+ - Remove dependencies when no runtime, build, tooling, or public peer dependency needs them.
30
+ Before you remove a package that a check calls unused, search configuration and scripts for it.
@@ -0,0 +1,15 @@
1
+ {
2
+ "versionGroups": [
3
+ {
4
+ "label": "A workspace package is versioned by its own release, and a private root has no version.",
5
+ "dependencyTypes": ["local"],
6
+ "isIgnored": true
7
+ },
8
+ {
9
+ "label": "Every dependency resolves to one version across the workspace.",
10
+ "packages": ["**"],
11
+ "dependencies": ["**"],
12
+ "policy": "sameRange"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,79 @@
1
+ [configuration]
2
+ title = "Docs"
3
+ always_selected = true
4
+ description = "Documentation integrity: links and anchors, banned headings, stale paths, the README of every scope, and its shape."
5
+
6
+ [files]
7
+ extensions = [".md", ".mdx"]
8
+ filenames = ["CLAUDE.md", "AGENTS.md", "README.md"]
9
+
10
+ [[tool]]
11
+ name = "lychee"
12
+ version = "0.24.2"
13
+ mise = "lychee"
14
+ brew = "lychee"
15
+ cargo = "lychee"
16
+ github = { name = "lycheeverse/lychee", version = "lychee-v0.24.2" }
17
+ [[tool.replace]]
18
+ file = "lychee.toml"
19
+ shared = false
20
+
21
+ [[tool.replace]]
22
+ file = ".lycheeignore"
23
+ shared = false
24
+
25
+ [[tool_file]]
26
+ target = ".gspot/config/lychee.toml"
27
+ tool = "lychee"
28
+ per_scope = true
29
+
30
+ [[check]]
31
+ name = "lychee"
32
+ example = "The Markdown link `[Setup](missing.md)` reports a missing local target when `missing.md` does not exist. Point it at the actual setup guide or add the intended document."
33
+ level = "recommended"
34
+ stage = "commit"
35
+ command = ["lychee", "--config", "{tool_file:lychee}", "--offline", "--include-fragments=full", "--format", "detailed", "--no-progress", "{files}"]
36
+ output = { format = "grouped", file_pattern = "^Errors in (?<file>.+)$", pattern = "^\\[(?<rule>[A-Z0-9]+)\\] (?<message>\\S+(?: \\(at (?<line>\\d+):(?<column>\\d+)\\))? \\| .*)$" }
37
+ summary = "Checks that local documentation links reach existing files and valid anchor or text fragments."
38
+ why = "A dead link inside the repository is a promise the docs broke without anyone noticing."
39
+ help = "Point the link at the file or heading that exists, or delete it."
40
+
41
+ [[check]]
42
+ name = "lychee-external"
43
+ example = "A documentation link returning HTTP 404 reports a broken external destination. Replace it with a verified current URL or remove the obsolete link, then rerun with network access."
44
+ level = "recommended"
45
+ stage = "manual"
46
+ needs = ["network"]
47
+ command = ["lychee", "--config", "{tool_file:lychee}", "--root-dir", "{root}", "--scheme", "http", "--scheme", "https", "--include-fragments=full", "--format", "detailed", "--no-progress", "{files}"]
48
+ output = { format = "grouped", file_pattern = "^Errors in (?<file>.+)$", pattern = "^\\[(?<rule>[A-Z0-9]+)\\] (?<message>\\S+(?: \\(at (?<line>\\d+):(?<column>\\d+)\\))? \\| .*)$" }
49
+ summary = "Checks every external link over the network."
50
+ why = "An external link rots on its own schedule; this run says which ones did."
51
+ help = "Update or remove the link, or exclude the URL pattern with a reason under docs.allowed_urls."
52
+
53
+ [[check]]
54
+ name = "missing-paths"
55
+ example = "A documented repository path that no longer exists reports a stale reference. Update the path and any associated command to the current owner, then verify the procedure from its stated working directory."
56
+ runs = "once"
57
+ level = "recommended"
58
+ stage = "commit"
59
+ summary = "Checks that documented paths name tracked files and mise, npm, pnpm, yarn, and bun run commands name tasks or scripts in their project."
60
+ why = "A path in the docs that nothing tracks sends the reader to a file that is gone."
61
+ help = "Fix the path or the task name. Give an example code block a title= attribute."
62
+
63
+ [[check]]
64
+ name = "required-files"
65
+ example = "A configured scope without `README.md` reports the missing README. Add one that explains its purpose and setup. The repository root also needs a license when license presence is required."
66
+ level = "all"
67
+ stage = "commit"
68
+ summary = "Checks that every scope has a README.md and the root has a LICENSE."
69
+ why = "A scope with no README is a door with no sign."
70
+ help = "Write the README; the docs rule files say what goes in it."
71
+
72
+ [[check]]
73
+ name = "readme-shape"
74
+ example = "A README with more H2 headings than limits.docs.headings_before_contents reports a missing Contents section. Add the section. A scope-root README also needs an opening paragraph and a section named install, setup, start, or requirements."
75
+ level = "all"
76
+ stage = "commit"
77
+ summary = "Checks the shape of every README: an opening paragraph, a Contents list when long, a section on getting started."
78
+ why = "A README with the right shape answers what this is and how to start before the reader scrolls."
79
+ help = "Add the missing section or paragraph. For an accepted exception, run gspot ignore docs/readme-shape --paths `<glob>` --reason \"`<why>`\"."
@@ -0,0 +1,86 @@
1
+ # Documentation
2
+
3
+ ## Before you write
4
+
5
+ Read the implementation and existing pages. Identify the reader, their task, starting state,
6
+ permissions, and risks. Describe supported behavior. State limitations that rule out use before setup.
7
+
8
+ Keep durable product information in its documentation. Link to its reference instead of copying
9
+ procedures or configuration tables. When behavior changes, update the reference and examples.
10
+
11
+ ## Pages
12
+
13
+ Give each page one purpose and a title that names its task or subject. Explain its purpose before
14
+ its sections. Keep the shortest successful path in the README and link to specialist guides.
15
+ Document real subprojects. Describe behavior instead of adding folder trees or file inventories.
16
+ Mention a path only when the reader must use it.
17
+
18
+ Use the renderer's Markdown. Keep routine pages free of custom layout HTML or CSS. A component
19
+ that some viewers cannot show needs a text alternative. Use paragraphs, lists, and tables to match
20
+ what readers need to compare.
21
+
22
+ Use inline code for exact commands, values, fields, and identifiers.
23
+ Bold names an interface control. Blockquotes hold attributed source text.
24
+
25
+ Keep required instructions outside collapsed panels. Delete obsolete content. Comments explain
26
+ maintenance constraints and contain no private discussions or product history. A badge belongs
27
+ only where its accurate state affects a reader's decision.
28
+
29
+ ## Examples and procedures
30
+
31
+ An example teaches one idea and uses the supported API. Include imports, setup, and the context
32
+ readers need. Label an incomplete fragment and say what it omits. Keep volatile output out of
33
+ examples unless the public API defines its exact text.
34
+
35
+ State the starting directory and prerequisites before commands. Explain placeholders. Separate
36
+ output from commands, or comment output where a copied block must run. State the expected result
37
+ when the result does not make success clear. Give each platform alternative a complete procedure.
38
+
39
+ A destructive step names its scope, irreversible effects, backup, and recovery before the action.
40
+ Keep permissions, verification, and recovery beside the steps that need them. Use secure defaults
41
+ and least privilege. Examples do not silently turn off access checks.
42
+ Keep authentication, retries, and advanced variants outside minimal examples unless needed for correctness.
43
+
44
+ Start troubleshooting with the observable symptom and common causes. Diagnose before a reset or
45
+ other destructive recovery. Preserve exact public errors and remove private data from examples.
46
+
47
+ ## Reference pages
48
+
49
+ Use the names and values of the API the page documents. Explain public behavior without requiring
50
+ readers to inspect its code. A command reference covers inputs, outputs, exit codes, working folder,
51
+ permissions, and side effects. An API reference covers identity, inputs, outputs, failures,
52
+ pagination, and limits. A library reference covers initialization, cleanup, concurrency, errors,
53
+ compatibility, and types. A settings reference covers scope, precedence, defaults, secrets, and reloads.
54
+
55
+ Show settings with their parent keys. Distinguish missing, empty, and null values when they act
56
+ differently. Explain required environment variable formats and failures.
57
+ Describe releases by their effect on readers and required actions.
58
+
59
+ A known issue states its trigger,
60
+ risk, and verified workaround. A deprecation names support, replacement, and migration. A retirement
61
+ names the unavailable functions. Security disclosures follow the project's disclosure policy.
62
+
63
+ ## Images and video
64
+
65
+ Match the current interface and reproduce control labels exactly. Name controls by label.
66
+ A screenshot adds to a text procedure. It does not replace instructions.
67
+
68
+ Keep media with its
69
+ editable source and license. Use screenshots for interfaces, diagrams for relationships, and
70
+ charts for data. Add media when text alone does not explain the information. Report stale media.
71
+
72
+ A video needs captions and a transcript for information absent from the page. Keep the full
73
+ procedure in text. Do not embed trackers or commit video outside the project's asset workflow.
74
+ Follow the accessibility rules for alt text and color.
75
+
76
+ Keep diagrams small and give equal concepts
77
+ equal shapes. Prefer editable diagrams and descriptive file names. List keyboard shortcuts and
78
+ platform steps in the same order each time.
79
+
80
+ ## Links
81
+
82
+ Use maintained primary sources for external APIs and relative paths for repository content.
83
+ Link text identifies the destination. A public procedure states any account or permission needed
84
+ to open a required page.
85
+ See [Diátaxis](https://diataxis.fr/), [Google's documentation guidance](https://developers.google.com/style),
86
+ and [W3C image guidance](https://www.w3.org/WAI/tutorials/images/).
@@ -0,0 +1,32 @@
1
+ [configuration]
2
+ title = "Duplication"
3
+ always_selected = true
4
+ description = "Copy-paste detection across every language a selected configuration claims, with a ceiling for the share of duplicated lines."
5
+
6
+ [files]
7
+ languages = true
8
+
9
+ [[tool]]
10
+ name = "jscpd"
11
+ version = "5.2.0"
12
+ npm = "jscpd"
13
+ mise = "npm:jscpd"
14
+ [[tool.replace]]
15
+ file = ".jscpd.json"
16
+ shared = false
17
+
18
+ [[tool_file]]
19
+ target = ".gspot/config/jscpd.json"
20
+ tool = "jscpd"
21
+
22
+ [[check]]
23
+ name = "jscpd"
24
+ example = "Two selected files containing the same substantial code block can exceed the configured duplication threshold. Move the shared behavior into its actual owner and call it from both locations, then rerun."
25
+ level = "all"
26
+ stage = "push"
27
+ runs = "scope"
28
+ files = { languages = true }
29
+ tool = "jscpd"
30
+ summary = "Finds blocks of code copied between files. While the duplicated share stays at or under the ceiling it passes, and over it every copy is a finding that names both places."
31
+ why = "A copied block is fixed in one place and stays broken in the other."
32
+ help = "Move the shared block into one function both callers use, or raise limits.duplication.percent with a reason."
@@ -0,0 +1,8 @@
1
+ allowed_words = ["Bun", "Node", "npm", "pnpm", "mise", "CI", "macOS", "Linux", "Windows", "CSRF", "ASD"]
2
+ [configuration]
3
+ title = "Engineering guidance"
4
+ always_selected = true
5
+ description = "Rules on how to work and how to write code. The `[rules]` setting turns them on or off."
6
+
7
+ [rules]
8
+ "ACCESSIBILITY.md" = { filenames = ["*.html", "*.tsx", "*.jsx", "*.vue", "*.svelte", "*.astro", "*.swift"] }
@@ -0,0 +1,42 @@
1
+ # Planning
2
+
3
+ ## Complete change content
4
+
5
+ A plan holds the complete content of every change it proposes, so another agent can carry it
6
+ out without inventing anything.
7
+
8
+ - Show the exact diff of every code, configuration, documentation, schema, and text change, and
9
+ the full contents of every new file. Do not summarize a change the diff can show.
10
+ - Name every command that creates, moves, renames, regenerates, or deletes a file, and every
11
+ generated file the change rewrites.
12
+ - For an image or another binary file, give the source path, the output path, the operation, and
13
+ the command that reproduces it.
14
+ - Leave no placeholder such as `update accordingly`, `adjust imports`, or `fix any errors`.
15
+
16
+ Bad:
17
+
18
+ ```text
19
+ Update the settings screen copy.
20
+ ```
21
+
22
+ Good:
23
+
24
+ ```diff
25
+ --- a/app/settings/page.tsx
26
+ +++ b/app/settings/page.tsx
27
+ -<h1>Old title</h1>
28
+ +<h1>Account settings</h1>
29
+ ```
30
+
31
+ ## Order and detail
32
+
33
+ One step holds one change. Order the steps so each one builds on finished work. Change
34
+ a shared interface before its callers, and move a module before the imports that point at it.
35
+ Generated output follows the source that produces it, and cleanup follows the last caller.
36
+
37
+ Say why the steps run in that order, and name the constraints and assumptions that affect them.
38
+ Mention an edge case only when it belongs to the requested work.
39
+
40
+ ## Verification steps
41
+
42
+ A plan verifies the requested change.
@@ -0,0 +1,16 @@
1
+ # Suppressions
2
+
3
+ A suppression turns a rule off for one place, and it carries a reason.
4
+
5
+ - Write the reason on the same line or directly above, in the form `reason: <sentence>.`. It says
6
+ why the rule does not apply here, not the content of the rule.
7
+ - Scope a suppression to the narrowest thing that works: one rule, one line, one symbol. A
8
+ file-wide suppression needs a reason that applies to the whole file.
9
+ - Suppress only when the rule misjudges this line. When the code breaks the rule, fix the code.
10
+ - Delete a suppression with no remaining cause. Never add filler statements to pass a check.
11
+
12
+ The forms differ by language. Apply the same rule to all of them: the ESLint
13
+ disable comment, the Ruff `noqa`, the type-checker ignore, the SwiftLint disable, the ShellCheck
14
+ disable. gspot refuses Semgrep and Vale directives.
15
+
16
+ To accept a finding without changing the code, run `gspot ignore <check>` with a reason. Ask the user first.