@gspothq/cli 0.1.1 → 0.2.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 (205) hide show
  1. package/README.md +58 -11
  2. package/configurations/database/postgres/manifest.toml +51 -57
  3. package/configurations/database/postgres/rules/POSTGRES.md +14 -13
  4. package/configurations/framework/astro/manifest.toml +33 -35
  5. package/configurations/framework/astro/rules/ASTRO.md +2 -2
  6. package/configurations/framework/expo/manifest.toml +19 -19
  7. package/configurations/framework/express/manifest.toml +10 -4
  8. package/configurations/framework/express/rules/EXPRESS.md +9 -7
  9. package/configurations/framework/fastapi/manifest.toml +9 -3
  10. package/configurations/framework/fastapi/rules/FASTAPI.md +19 -18
  11. package/configurations/framework/nestjs/manifest.toml +12 -12
  12. package/configurations/framework/nestjs/rules/NESTJS.md +9 -9
  13. package/configurations/framework/nextjs/manifest.toml +39 -79
  14. package/configurations/framework/nextjs/rules/NEXTJS.md +9 -7
  15. package/configurations/framework/nextjs/tool-files/semgrep/nextjs.yml +35 -0
  16. package/configurations/framework/react/manifest.toml +33 -43
  17. package/configurations/framework/react/rules/REACT.md +14 -20
  18. package/configurations/framework/react-dom/manifest.toml +6 -6
  19. package/configurations/framework/react-native/manifest.toml +11 -11
  20. package/configurations/framework/react-native/rules/REACT-NATIVE.md +3 -5
  21. package/configurations/framework/site/manifest.toml +57 -110
  22. package/configurations/framework/site/rules/SITE.md +1 -1
  23. package/configurations/framework/svelte/manifest.toml +29 -31
  24. package/configurations/framework/svelte/rules/SVELTE.md +6 -6
  25. package/configurations/framework/vue/manifest.toml +37 -37
  26. package/configurations/framework/vue/rules/VUE.md +6 -6
  27. package/configurations/general/commits/manifest.toml +20 -84
  28. package/configurations/general/commits/rules/GIT.md +24 -13
  29. package/configurations/general/coverage/manifest.toml +1 -1
  30. package/configurations/general/dependencies/manifest.toml +47 -107
  31. package/configurations/general/dependencies/rules/DEPENDENCIES.md +13 -7
  32. package/configurations/general/docs/manifest.toml +28 -43
  33. package/configurations/general/docs/rules/DOCS.md +16 -9
  34. package/configurations/general/duplication/manifest.toml +12 -14
  35. package/configurations/general/engineering/manifest.toml +6 -2
  36. package/configurations/general/engineering/rules/agent/PLANNING.md +9 -6
  37. package/configurations/general/engineering/rules/agent/SUPPRESSIONS.md +20 -11
  38. package/configurations/general/engineering/rules/agent/TASKS.md +6 -2
  39. package/configurations/general/engineering/rules/agent/WORKING.md +34 -29
  40. package/configurations/general/engineering/rules/code/ACCESSIBILITY.md +9 -7
  41. package/configurations/general/engineering/rules/code/CLI.md +12 -9
  42. package/configurations/general/engineering/rules/code/COMMENTS.md +11 -1
  43. package/configurations/general/engineering/rules/code/CONFIGURATION.md +2 -0
  44. package/configurations/general/engineering/rules/code/ERRORS.md +5 -3
  45. package/configurations/general/engineering/rules/code/HTTP.md +9 -10
  46. package/configurations/general/engineering/rules/code/LOGGING.md +10 -9
  47. package/configurations/general/engineering/rules/code/TESTING.md +18 -11
  48. package/configurations/general/files/manifest.toml +45 -73
  49. package/configurations/general/files/rules/YAML.md +20 -10
  50. package/configurations/general/format/manifest.toml +53 -106
  51. package/configurations/general/gspot/manifest.toml +19 -39
  52. package/configurations/general/gspot/rules/GENERATED.md +14 -4
  53. package/configurations/general/licenses/manifest.toml +12 -14
  54. package/configurations/general/naming/defaults.json +14 -13
  55. package/configurations/general/naming/manifest.toml +17 -17
  56. package/configurations/general/naming/rules/NAMING.md +87 -67
  57. package/configurations/general/prose/manifest.toml +166 -25
  58. package/configurations/general/prose/rules/WRITING.md +6 -2
  59. package/configurations/general/repository/manifest.toml +12 -12
  60. package/configurations/general/secrets/manifest.toml +52 -73
  61. package/configurations/general/secrets/rules/SECRETS.md +3 -1
  62. package/configurations/general/security/manifest.toml +29 -52
  63. package/configurations/general/security/rules/SECURITY.md +8 -6
  64. package/configurations/general/spelling/manifest.toml +15 -25
  65. package/configurations/general/structure/manifest.toml +31 -31
  66. package/configurations/infrastructure/ansible/manifest.toml +15 -15
  67. package/configurations/infrastructure/docker/manifest.toml +55 -67
  68. package/configurations/infrastructure/docker/rules/DOCKER.md +15 -13
  69. package/configurations/infrastructure/github-actions/manifest.toml +21 -41
  70. package/configurations/infrastructure/github-actions/rules/GITHUB-ACTIONS.md +16 -12
  71. package/configurations/infrastructure/github-actions/tool-files/zizmor.yml +5 -0
  72. package/configurations/infrastructure/nginx/manifest.toml +20 -20
  73. package/configurations/infrastructure/nginx/rules/NGINX.md +5 -4
  74. package/configurations/infrastructure/openapi/manifest.toml +20 -20
  75. package/configurations/infrastructure/openapi/rules/OPENAPI.md +3 -1
  76. package/configurations/infrastructure/xcode/manifest.toml +55 -75
  77. package/configurations/infrastructure/xcode/rules/XCODE.md +5 -3
  78. package/configurations/language/bash/manifest.toml +89 -170
  79. package/configurations/language/bash/rules/BASH.md +79 -17
  80. package/configurations/language/bash/rules/LANGUAGE.md +30 -26
  81. package/configurations/language/bash/rules/OPERATIONS.md +10 -8
  82. package/configurations/language/bash/rules/SAFETY.md +39 -35
  83. package/configurations/language/css/manifest.toml +22 -61
  84. package/configurations/language/css/rules/CSS.md +21 -2
  85. package/configurations/language/css/rules/TAILWIND.md +7 -5
  86. package/configurations/language/html/manifest.toml +16 -35
  87. package/configurations/language/html/rules/HTML.md +23 -5
  88. package/configurations/language/javascript/eslint-runtime-names.json +66 -61
  89. package/configurations/language/javascript/eslint-runtime.mjs +118 -0
  90. package/configurations/language/javascript/manifest.toml +135 -207
  91. package/configurations/language/javascript/rules/BUN.md +2 -2
  92. package/configurations/language/javascript/rules/COMPONENTS.md +4 -4
  93. package/configurations/language/javascript/rules/DENO.md +1 -1
  94. package/configurations/language/javascript/rules/JAVASCRIPT.md +30 -17
  95. package/configurations/language/javascript/rules/NODE.md +2 -2
  96. package/configurations/language/javascript/rules/PLAYWRIGHT.md +10 -9
  97. package/configurations/language/markdown/manifest.toml +20 -51
  98. package/configurations/language/python/manifest.toml +231 -342
  99. package/configurations/language/python/rules/DESIGN.md +40 -33
  100. package/configurations/language/python/rules/FLOW.md +8 -6
  101. package/configurations/language/python/rules/PACKAGING.md +14 -7
  102. package/configurations/language/python/rules/PYTHON.md +83 -33
  103. package/configurations/language/python/rules/TYPING.md +25 -23
  104. package/configurations/language/sql/manifest.toml +19 -37
  105. package/configurations/language/sql/rules/SQL.md +90 -2
  106. package/configurations/language/swift/manifest.toml +67 -78
  107. package/configurations/language/swift/rules/SWIFT.md +138 -40
  108. package/configurations/language/swift/rules/SWIFTUI.md +11 -9
  109. package/configurations/language/swift/rules/UIKIT.md +21 -19
  110. package/configurations/language/typescript/manifest.toml +34 -34
  111. package/configurations/language/typescript/rules/TYPESCRIPT.md +62 -10
  112. package/configurations/library/drizzle/manifest.toml +25 -38
  113. package/configurations/library/drizzle/rules/DRIZZLE.md +4 -2
  114. package/configurations/library/react-hook-form/manifest.toml +4 -4
  115. package/configurations/library/react-hook-form/rules/REACT-HOOK-FORM.md +15 -13
  116. package/configurations/library/tanstack-query/manifest.toml +6 -6
  117. package/configurations/library/tanstack-query/rules/TANSTACK-QUERY.md +5 -3
  118. package/configurations/library/testing-library/manifest.toml +6 -6
  119. package/configurations/library/translations/manifest.toml +22 -22
  120. package/configurations/library/translations/rules/NEXT-INTL.md +6 -8
  121. package/configurations/library/translations/rules/TRANSLATIONS.md +22 -23
  122. package/configurations/library/trpc/manifest.toml +3 -3
  123. package/configurations/library/trpc/rules/TRPC.md +8 -6
  124. package/configurations/library/zod/manifest.toml +6 -6
  125. package/configurations/library/zod/rules/ZOD.md +4 -2
  126. package/configurations/library/zustand/manifest.toml +4 -4
  127. package/configurations/library/zustand/rules/ZUSTAND.md +16 -14
  128. package/configurations/platform/cloudflare/manifest.toml +28 -47
  129. package/configurations/platform/cloudflare/rules/CLOUDFLARE.md +11 -6
  130. package/configurations/platform/supabase/manifest.toml +48 -61
  131. package/configurations/platform/supabase/rules/SUPABASE.md +27 -28
  132. package/configurations/testing/jest/manifest.toml +21 -22
  133. package/configurations/testing/pytest/manifest.toml +28 -28
  134. package/configurations/testing/swift-tests/manifest.toml +18 -29
  135. package/configurations/testing/swift-tests/rules/SWIFT-TESTS.md +7 -5
  136. package/configurations/testing/vitest/manifest.toml +32 -32
  137. package/configurations/testing/vitest/rules/VITEST.md +3 -1
  138. package/dist/gspot.js +22297 -24707
  139. package/dist/{linkinator-program.js → linkinator-process.js} +5 -7
  140. package/dist/{purgecss-program.js → purgecss-process.js} +12 -12
  141. package/package.json +7 -9
  142. package/configurations/infrastructure/github-actions/zizmor.yml +0 -3
  143. package/configurations/language/bash/rules/NAMING.md +0 -62
  144. package/configurations/language/css/rules/NAMING.md +0 -17
  145. package/configurations/language/html/rules/NAMING.md +0 -16
  146. package/configurations/language/javascript/rules/NAMING.md +0 -31
  147. package/configurations/language/markdown/markdownlint-cli2.mjs +0 -19
  148. package/configurations/language/python/rules/NAMING.md +0 -53
  149. package/configurations/language/sql/rules/NAMING.md +0 -90
  150. package/configurations/language/swift/rules/NAMING.md +0 -88
  151. package/configurations/language/typescript/rules/NAMING.md +0 -73
  152. package/configurations/library/swift-snapshot-testing/manifest.toml +0 -32
  153. package/dist/THIRD-PARTY-NOTICES.md +0 -25
  154. package/dist/eslint-rule-levels.json +0 -10
  155. package/dist/tool-versions.json +0 -3
  156. package/gspot.schema.json +0 -45991
  157. /package/{dist/LICENSE.md → LICENSE.md} +0 -0
  158. /package/configurations/framework/express/{semgrep → tool-files/semgrep}/express.yml +0 -0
  159. /package/configurations/framework/fastapi/{semgrep → tool-files/semgrep}/fastapi.yml +0 -0
  160. /package/configurations/general/dependencies/{syncpack.json → tool-files/syncpack.json} +0 -0
  161. /package/configurations/general/prose/{vale → tool-files/vale}/styles/LICENSES.md +0 -0
  162. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/ampm.yml +0 -0
  163. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/conscious-language.yml +0 -0
  164. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/contractions.yml +0 -0
  165. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/currency.yml +0 -0
  166. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/dashes.yml +0 -0
  167. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/date-ordinals.yml +0 -0
  168. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/dates.yml +0 -0
  169. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/file-paths.yml +0 -0
  170. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/future.yml +0 -0
  171. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/hedging.yml +0 -0
  172. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/history.yml +0 -0
  173. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/idioms.yml +0 -0
  174. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/interface-verbs.yml +0 -0
  175. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/jargon.yml +0 -0
  176. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/leading-conjunctions.yml +0 -0
  177. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/link-text.yml +0 -0
  178. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/locations.yml +0 -0
  179. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/marketing.yml +0 -0
  180. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/merge-conflict-markers.yml +0 -0
  181. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/militaristic-language.yml +0 -0
  182. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/modals.yml +0 -0
  183. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/numbered-units.yml +0 -0
  184. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/obvious-fields.yml +0 -0
  185. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/ordinal-adverbs.yml +0 -0
  186. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/percentage-numbers.yml +0 -0
  187. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/placeholders.yml +0 -0
  188. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/product-centric-writing.yml +0 -0
  189. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/punctuated-headings.yml +0 -0
  190. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/self-reference.yml +0 -0
  191. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/session-identifiers.yml +0 -0
  192. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/since.yml +0 -0
  193. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/straight-quotes.yml +0 -0
  194. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/suspended-hyphens.yml +0 -0
  195. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/symbols.yml +0 -0
  196. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/time-ranges.yml +0 -0
  197. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/url-prepositions.yml +0 -0
  198. /package/configurations/general/prose/{vale → tool-files/vale}/styles/gspot/version-range.yml +0 -0
  199. /package/configurations/general/secrets/{gitleaks.toml → tool-files/gitleaks.toml} +0 -0
  200. /package/configurations/infrastructure/docker/{trivyignore → tool-files/trivyignore} +0 -0
  201. /package/configurations/language/bash/{semgrep → tool-files/semgrep}/bash.yml +0 -0
  202. /package/configurations/language/javascript/{semgrep → tool-files/semgrep}/javascript.yml +0 -0
  203. /package/configurations/language/swift/{semgrep → tool-files/semgrep}/swift.yml +0 -0
  204. /package/configurations/platform/cloudflare/{semgrep → tool-files/semgrep}/cloudflare.yml +0 -0
  205. /package/configurations/platform/supabase/{semgrep → tool-files/semgrep}/supabase.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  # Vue
2
2
 
3
- These rules cover Vue 3 single-file components, reactivity, props and events, templates, and stores.
3
+ Read this rule when you change Vue components, composables, or stores.
4
4
 
5
5
  ## Components
6
6
 
@@ -18,23 +18,23 @@ These rules cover Vue 3 single-file components, reactivity, props and events, te
18
18
 
19
19
  <!-- level: all -->
20
20
 
21
- Name an event for what happened, in the past tense or as a noun: `saved`, `update:modelValue`.
21
+ Name an event for what happened, in the past tense or as a noun, such as `saved` or `update:modelValue`.
22
22
 
23
23
  ## Reactivity
24
24
 
25
25
  - Use `ref` for a value and `reactive` for an object that keeps the same identity. Do not destructure a reactive object.
26
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.
27
+ - Use `watch` for an effect outside Vue: a request, a timer, or storage. Do not use it to derive state.
28
+ - Stop whatever a component started in `onUnmounted` or in the cleanup callback of the watcher.
29
29
 
30
30
  ## State and data
31
31
 
32
32
  <!-- level: all -->
33
33
 
34
- - Local state stays in the component. Shared state goes in a store, one store for each domain.
34
+ - Local state stays in the component. Shared state goes in a store, one per domain.
35
35
  - A store exposes actions that say what happened. Components do not assign to store state.
36
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.
37
+ - Name a composable `use` and its subject, such as `useCart`. Return reactive values when callers need reactivity.
38
38
 
39
39
  ## Tests
40
40
 
@@ -1,111 +1,47 @@
1
1
  [configuration]
2
- title = "Commits"
3
2
  always_selected = true
4
- when = { git = true }
5
3
  description = "Checks commit messages for a conventional type, an optional project scope, a first line of 72 characters or fewer, and a wrapped body."
4
+ title = "Commits"
5
+ when = { git = true }
6
6
 
7
7
  [files]
8
8
  paths = ["**"]
9
9
 
10
10
  [[tool]]
11
+ mise = "npm:@commitlint/cli"
11
12
  name = "commitlint"
12
- version = "21.2.2"
13
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
14
+ replace = [".commitlintrc", ".commitlintrc.json", ".commitlintrc.yml", ".commitlintrc.yaml", ".commitlintrc.js", ".commitlintrc.cjs", ".commitlintrc.mjs", ".commitlintrc.ts", ".commitlintrc.cts", ".commitlintrc.mts", "commitlint.config.js", "commitlint.config.cjs", "commitlint.config.mjs", "commitlint.config.ts", "commitlint.config.cts", "commitlint.config.mts"]
15
+ version = "21.2.2"
78
16
 
79
- [[tool.replace]]
17
+ [[tool.replace_key]]
80
18
  file = "package.json"
81
19
  key = "commitlint"
82
20
  redirect = true
83
- shared = true
84
21
 
85
22
  [[tool_file]]
86
23
  target = ".gspot/config/commitlint.config.cjs"
87
24
  tool = "commitlint"
88
- rule_keys = ["rules"]
89
25
 
90
26
  [[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
27
  command = ["commitlint", "--config", "{tool_file:commitlint}", "--edit", "{message_file}"]
28
+ example = "The message `changed stuff` has no type or scope. Write `fix(cli): report missing configuration` instead."
29
+ help = "Write `<type>`: `<subject>` or `<type>`(`<scope>`): `<subject>` in a first line of 72 characters or fewer. Change the accepted types with `gspot set tools.commitlint.types`."
30
+ level = "all"
31
+ name = "commitlint"
96
32
  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."
33
+ stage = "message"
34
+ summary = "Checks a new commit message for a conventional type, an optional known scope, a first line of 72 characters or fewer, and a wrapped body."
35
+ why = "Release notes, blame, and bisect depend on typed, scoped subjects, and a free-form message hides the change."
100
36
 
101
37
  [[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."
38
+ example = "A commit with the message `changed stuff` in the push fails. Reword it as `fix(cli): report missing configuration`, and coordinate first when others share that history."
39
+ help = "Reword the commits that fail with `git rebase -i`, or change the rule with `gspot set tools.commitlint.rules`."
104
40
  level = "all"
105
- stage = "push"
41
+ name = "commitlint-pushed"
42
+ output = { format = "regex", pattern = "^\\s*[✖⚠]\\s+(?<message>.*?)\\s+\\[(?<rule>[a-z-]+)\\]\\s*$" }
106
43
  runs = "history"
44
+ stage = "push"
45
+ summary = "Checks the message of each commit in a push. A manual run covers every commit from the upstream merge base to HEAD."
107
46
  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."
47
+ why = "A message written past the hook (--no-verify, a rebase, or a merge) still reaches the shared branch unless the push checks it."
@@ -1,31 +1,42 @@
1
1
  # Git
2
2
 
3
+ Read this rule before you commit, push, tag, or open a pull request.
4
+
3
5
  ## Working with uncommitted changes
4
6
 
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.
7
+ Changes you did not make may belong to another agent or contributor working in parallel. Do not revert, stash,
8
+ clean, or overwrite them. Keep working beside them, and ask the user only when your change overwrites or contradicts
9
+ one.
8
10
 
9
11
  ## Commits
10
12
 
11
13
  - Commit only when the user asks.
12
14
  - One change per commit. Put a rename and a behavior change in two commits.
13
15
  - The body says what changed and why.
14
- - Footers reference issues with `Refs: #123` or `Closes: #123`, and breaking changes with `BREAKING CHANGE: ...`.
16
+ - Footers reference issues with `Refs: #123` or `Closes: #123`, and breaking changes with `BREAKING CHANGE:...`.
15
17
  - Never bypass hooks with `--no-verify`.
18
+ - Never add `[skip ci]`, `[ci skip]`, `[no ci]`, or another marker that stops CI.
19
+ - Never force-push the default branch or a protected branch.
20
+
21
+ ## Branches and pull requests
16
22
 
17
- ## Branches
23
+ When the repository uses branches and pull requests, follow these steps. Skip them when changes go straight to
24
+ the default branch.
18
25
 
19
26
  - 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.
27
+ - Force-push your own branch only after a rebase you performed.
28
+ - Rebase onto the default branch before you open a pull request. Do not merge it into a feature branch.
29
+ - Use the commit subject as the title for a single-commit branch. Otherwise, write one sentence for the whole
30
+ change.
31
+ - The description states what changed, why, and which checks verified it. It links the issue.
32
+ - A pull request does one thing. Put unrelated fixes in a separate branch.
22
33
 
23
- ## Files to keep out of commits
34
+ ## Releases
24
35
 
25
- - Editor state such as `.vscode/`, `.idea/`, or `xcuserdata/`, except settings the team commits on purpose.
36
+ - Publish a package only through the release task or workflow, from a commit that CI tested.
37
+ - Tag every published version. The tag names the commit you published.
38
+ - After you publish a version, change its code only under a new version number.
26
39
 
27
- ## Pull requests
40
+ ## Files to keep out of commits
28
41
 
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.
42
+ - Editor state such as `.vscode/`, `.idea/`, or `xcuserdata/`, except settings the team commits on purpose.
@@ -1,3 +1,3 @@
1
1
  [configuration]
2
- title = "Coverage"
3
2
  description = "Coverage floors shared by test runners."
3
+ title = "Coverage"
@@ -1,159 +1,99 @@
1
- prefix_collisions = { prefixes = ["package", "pnpm"] }
2
-
3
1
  [configuration]
4
- title = "Dependencies"
5
2
  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."
3
+ description = "Checks for known advisories, one version per package, exact pins, one package manager, and a lockfile that matches its dependency file."
4
+ title = "Dependencies"
7
5
 
8
6
  [files]
9
7
  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
8
  kinds = ["source", "generated"]
11
9
 
10
+ [shared_prefixes]
11
+ prefixes = ["package", "pnpm"]
12
+
12
13
  [[tool]]
13
- name = "osv-scanner"
14
- version = "2.6.0"
15
- min_version = "2.0.0"
16
- mise = "osv-scanner"
17
14
  brew = "osv-scanner"
18
15
  github = { name = "google/osv-scanner", version = "v2.6.0" }
19
- winget = "Google.OSVScanner"
16
+ min_version = "2.0.0"
17
+ mise = "osv-scanner"
18
+ name = "osv-scanner"
19
+ replace = ["osv-scanner.toml"]
20
20
  scoop = "osv-scanner"
21
- [[tool.replace]]
22
- file = "osv-scanner.toml"
23
- shared = false
21
+ version = "2.6.0"
22
+ winget = "Google.OSVScanner"
24
23
 
25
24
  [[tool]]
25
+ mise = "npm:syncpack"
26
26
  name = "syncpack"
27
- version = "15.3.3"
28
27
  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
28
+ replace = [".syncpackrc", ".syncpackrc.json", ".syncpackrc.yaml", ".syncpackrc.yml", ".syncpackrc.ts", ".syncpackrc.mjs", ".syncpackrc.js", ".syncpackrc.cjs", "syncpack.config.js", "syncpack.config.cjs", "syncpack.config.mjs", "syncpack.config.ts"]
29
+ version = "15.3.3"
77
30
 
78
31
  [[tool_file]]
79
32
  target = ".gspot/config/osv-scanner.toml"
80
33
  tool = "osv-scanner"
81
34
 
82
35
  [[tool_file]]
83
- source = "syncpack.json"
84
36
  target = ".gspot/config/syncpack.json"
85
37
  tool = "syncpack"
86
38
 
87
39
  [[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."
40
+ example = "A locked package version named in an OSV advisory reports a finding. Upgrade to a fixed version, and update the lockfile."
41
+ 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"] }
90
42
  level = "recommended"
91
- stage = "push"
92
- runs = "once"
43
+ name = "osv-scanner"
93
44
  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"] }
45
+ runs = "once"
46
+ stage = "push"
95
47
  # The tool project lockfiles under .gspot stay out: a repository cannot upgrade a package that a gspot tool pins.
96
48
  command = ["osv-scanner", "scan", "source", "--config", "{tool_file:osv-scanner}", "--format", "json", "--allow-no-lockfiles", "--recursive", "--experimental-exclude", ".gspot", "{root}"]
49
+ help = "Upgrade the package the finding names. When no fix exists, accept the advisory until a recheck date with `gspot ignore dependencies/osv-scanner --rule <advisory-id> --reason \"<why>\" --until <YYYY-MM-DD>`."
97
50
  output = { format = "json", items = "results", children = "packages.vulnerabilities", fields = { file = "source.path", rule = "id", message = "package.name package.version summary" } }
98
51
  summary = "Looks up every locked dependency in the Open Source Vulnerabilities (OSV) advisory database."
99
52
  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
53
 
102
54
  [[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
55
  command = ["syncpack", "lint", "--config", "{tool_file:syncpack}"]
109
- tool = "syncpack"
56
+ example = "Two package.json files that pin different versions of one dependency report a mismatch. Set both to the same version, and update the lockfile."
110
57
  files = { filenames = ["package.json"] }
58
+ help = "Run `syncpack fix --config .gspot/config/syncpack.json`, or align the versions by hand."
59
+ level = "all"
60
+ name = "syncpack"
111
61
  output = { format = "lines" }
62
+ runs = "once"
63
+ stage = "push"
112
64
  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."
65
+ tool = "syncpack"
66
+ why = "Two versions of a dependency in one workspace behave differently, so a bug shows in only one package."
115
67
 
116
68
  [[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"
69
+ example = "npm 10.9.2 in packageManager reports a finding, because it ignores min-release-age. Declare npm 11.17.0 or newer."
122
70
  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."
71
+ help = "Upgrade the package manager that the root package.json names to the version the finding gives."
130
72
  level = "recommended"
131
- stage = "push"
73
+ name = "release-age"
132
74
  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."
75
+ stage = "commit"
76
+ summary = "Checks that the package manager in the root package.json holds back releases newer than dependencies.min_release_age_days."
77
+ why = "gspot writes a release hold for each package manager. An older version ignores it and installs a new release the day it appears."
138
78
 
139
79
  [[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]`."
80
+ example = "A root package.json without packageManager reports a finding. Declare the package manager and its exact version."
81
+ files = { filenames = ["package.json"] }
82
+ help = "Name one packageManager in the root package.json."
142
83
  level = "all"
84
+ name = "package-json"
85
+ runs = "once"
143
86
  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]."
87
+ summary = "Checks that the root package.json names a packageManager."
88
+ why = "A declared package manager keeps installs and the lockfile format consistent."
149
89
 
150
90
  [[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."
91
+ example = "A lockfile URL outside `dependencies.allowed_registries` reports its host. Install the package again from an allowed registry, or add that host to the list."
92
+ files = { filenames = ["package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "yarn.lock", "bun.lock", "bun.lockb"], kinds = ["source", "generated"] }
93
+ help = "Install the package from the registry again, or add the host to dependencies.allowed_registries."
153
94
  level = "recommended"
154
- stage = "commit"
95
+ name = "lockfiles"
155
96
  runs = "scope"
156
- files = { filenames = ["package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "yarn.lock", "bun.lock"], kinds = ["source", "generated"] }
97
+ stage = "commit"
157
98
  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."
99
+ why = "A lockfile line from another host installs code nobody chose, and reviewers rarely read those files."
@@ -1,30 +1,36 @@
1
1
  # Dependencies
2
2
 
3
+ Read this rule before you add, upgrade, or remove a dependency.
4
+
3
5
  ## Adding one
4
6
 
5
- - Do not add a dependency for a one-line native API, a small local helper, or an array, object, or
7
+ - Do not add a dependency for a one-line standard API, a small local helper, or an array, object, or
6
8
  string utility. Use the platform first, then what the repository already depends on.
7
9
  - A new dependency needs a reason in the commit: what it does that the platform and existing
8
10
  dependencies do not.
9
11
  - Prefer a package that does one thing, receives maintenance, publishes types, and has no install scripts.
10
12
  - 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`.
13
+ from the lockfile without changing it, such as `npm ci` or `uv sync --frozen`.
12
14
 
13
15
  ## Versions
14
16
 
15
17
  - Pin exact versions in an application. A published library keeps ranges for its dependencies and peers.
16
18
  - Pin the runtime version once for Node, Python, Bun, or the Swift toolchain. Every file that
17
19
  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
+ - If the package manager rejects a release as too new, pick an older one or ask the user.
21
+ - Upgrade one dependency per commit with the reason. Never upgrade broadly to pass a scanner
20
22
  without reading what changed.
23
+ - Write each tool version once. Other files read that pin, or a check compares them with it.
21
24
 
22
25
  ## Policy
23
26
 
27
+ - Delete an override when it matches no package in the lockfile, or when every caller already accepts the fixed
28
+ version.
29
+ - Keep third-party license notices in a tracked file, not in a string in code.
24
30
  - 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.
31
+ - For a known advisory that has no fix, follow the suppression rules: ask the user, then run
32
+ `gspot ignore` with the advisory ID, a reason, and an expiry date. Never ignore advisories in bulk.
27
33
  - Declare vendored code and record its upstream version and license. Change it only by updating
28
34
  it from upstream.
29
- - Remove dependencies when no runtime, build, tooling, or public peer dependency needs them.
35
+ - Remove a package when no runtime, build, tool, or public peer dependency needs it.
30
36
  Before you remove a package that a check calls unused, search configuration and scripts for it.
@@ -1,79 +1,64 @@
1
1
  [configuration]
2
- title = "Docs"
3
2
  always_selected = true
4
- description = "Documentation integrity: links and anchors, banned headings, stale paths, the README of every scope, and its shape."
3
+ description = "Checks documentation for broken links and anchors, banned headings, stale paths, and a well-formed README in every scope."
4
+ title = "Docs"
5
5
 
6
6
  [files]
7
7
  extensions = [".md", ".mdx"]
8
8
  filenames = ["CLAUDE.md", "AGENTS.md", "README.md"]
9
9
 
10
10
  [[tool]]
11
- name = "lychee"
12
- version = "0.24.2"
13
- mise = "lychee"
14
11
  brew = "lychee"
15
12
  cargo = "lychee"
16
13
  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
14
+ mise = "lychee"
15
+ name = "lychee"
16
+ replace = ["lychee.toml", ".lycheeignore"]
17
+ version = "0.24.2"
24
18
 
25
19
  [[tool_file]]
20
+ per_scope = true
26
21
  target = ".gspot/config/lychee.toml"
27
22
  tool = "lychee"
28
- per_scope = true
29
23
 
30
24
  [[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
25
  command = ["lychee", "--config", "{tool_file:lychee}", "--offline", "--include-fragments=full", "--format", "detailed", "--no-progress", "{files}"]
26
+ example = "The link `[Setup](missing.md)` reports a broken target when no `missing.md` exists. Point it at the setup guide, or add that file."
27
+ help = "Point the link at the file or heading that exists, or delete it."
28
+ level = "recommended"
29
+ name = "lychee"
36
30
  output = { format = "grouped", file_pattern = "^Errors in (?<file>.+)$", pattern = "^\\[(?<rule>[A-Z0-9]+)\\] (?<message>\\S+(?: \\(at (?<line>\\d+):(?<column>\\d+)\\))? \\| .*)$" }
31
+ stage = "commit"
37
32
  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."
33
+ why = "A dead link inside the repository breaks silently, and readers hit it first."
40
34
 
41
35
  [[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."
36
+ command = ["lychee", "--config", "{tool_file:lychee}", "--root-dir", "{root}", "--scheme", "http", "--scheme", "https", "--include-fragments=full", "--format", "detailed", "--no-progress", "{files}"]
37
+ example = "A link that returns HTTP 404 reports a broken destination. Replace the URL with a current one, or remove the link."
38
+ help = "Update or remove the link, or exclude the URL pattern with a reason under docs.allowed_urls."
44
39
  level = "recommended"
45
- stage = "manual"
40
+ name = "lychee-external"
46
41
  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
42
  output = { format = "grouped", file_pattern = "^Errors in (?<file>.+)$", pattern = "^\\[(?<rule>[A-Z0-9]+)\\] (?<message>\\S+(?: \\(at (?<line>\\d+):(?<column>\\d+)\\))? \\| .*)$" }
43
+ stage = "manual"
49
44
  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."
45
+ why = "External links break over time; this check reports which ones did."
52
46
 
53
47
  [[check]]
48
+ example = "A path in the docs that points to a deleted file reports a stale reference. Update the path and any command that uses it."
49
+ help = "Fix the path or the task name. Give an example code block a `title=` attribute."
50
+ level = "recommended"
54
51
  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
52
  runs = "once"
57
- level = "recommended"
58
53
  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."
54
+ summary = "Checks that documented paths point to tracked files, and that mise, npm, pnpm, yarn, and bun run commands name a task or script of their project."
55
+ why = "A stale path in the docs sends the reader to a deleted file."
62
56
 
63
57
  [[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."
58
+ example = "A scope without `README.md` reports the missing file. Add one that explains what the scope does and how to start."
70
59
  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
60
  level = "all"
61
+ name = "required-files"
76
62
  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>`\"."
63
+ summary = "Checks that every scope has a README.md and the root has a LICENSE."
64
+ why = "A scope with no README leaves readers to guess what it does."