@activatus/code-standards 0.0.0-stage → 2.0.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.
- package/README.md +200 -2
- package/docs/Guides/_category_.json +4 -0
- package/docs/Guides/component-library-workflow.md +182 -0
- package/docs/Guides/migrating.md +144 -0
- package/docs/Guides/setup.md +130 -0
- package/docs/Standards/_category_.json +4 -0
- package/docs/Standards/agent-skills.md +125 -0
- package/docs/Standards/agent-specs.md +89 -0
- package/docs/Standards/branch-naming.md +66 -0
- package/docs/Standards/conventional-commits.md +189 -0
- package/docs/Standards/direnv.mdx +249 -0
- package/docs/Standards/documentation.md +311 -0
- package/docs/Standards/editorconfig.md +72 -0
- package/docs/Standards/eslint.md +709 -0
- package/docs/Standards/human-readable-names.md +234 -0
- package/docs/Standards/lint-errors.md +139 -0
- package/docs/Standards/prettier.md +97 -0
- package/docs/Standards/readable-code.md +540 -0
- package/docs/Standards/stylelint.md +178 -0
- package/docs/Standards/styling.md +284 -0
- package/docs/Standards/tech-stack.md +156 -0
- package/docs/Structure/_category_.json +4 -0
- package/docs/Structure/api-routes.md +118 -0
- package/docs/Structure/component-organization.md +519 -0
- package/docs/Structure/folder-structure.md +353 -0
- package/docs/Structure/import-organization.md +158 -0
- package/docs/Structure/naming-conventions.md +336 -0
- package/docs/design-system-components.md +117 -0
- package/docs/intro.md +46 -0
- package/docs/ontology.md +132 -0
- package/docs/templates.mdx +419 -0
- package/docs/version-history.md +211 -0
- package/package.json +56 -3
- package/static/templates/.commitlintrc.json +3 -0
- package/static/templates/.editorconfig +28 -0
- package/static/templates/.envrc +25 -0
- package/static/templates/.nvmrc +1 -0
- package/static/templates/AGENTS.md +160 -0
- package/static/templates/decision-doc.md +19 -0
- package/static/templates/docs/ai/agent-harness.md +17 -0
- package/static/templates/docs/ai/agents.md +17 -0
- package/static/templates/docs/ai/architecture.md +17 -0
- package/static/templates/docs/ai/context.md +17 -0
- package/static/templates/docs/ai/model-routing.md +17 -0
- package/static/templates/docs/ai/models.md +17 -0
- package/static/templates/docs/ai/retrieval.md +17 -0
- package/static/templates/docs/ai/tools.md +17 -0
- package/static/templates/docs/architecture/authentication.md +17 -0
- package/static/templates/docs/architecture/backend.md +17 -0
- package/static/templates/docs/architecture/background-jobs.md +17 -0
- package/static/templates/docs/architecture/backups.md +17 -0
- package/static/templates/docs/architecture/caching.md +17 -0
- package/static/templates/docs/architecture/ci-cd.md +17 -0
- package/static/templates/docs/architecture/disaster-recovery.md +17 -0
- package/static/templates/docs/architecture/environments.md +17 -0
- package/static/templates/docs/architecture/frontend.md +17 -0
- package/static/templates/docs/architecture/hosting.md +17 -0
- package/static/templates/docs/architecture/observability.md +17 -0
- package/static/templates/docs/architecture/realtime.md +17 -0
- package/static/templates/docs/architecture/search.md +17 -0
- package/static/templates/docs/architecture/services.md +17 -0
- package/static/templates/docs/architecture/state-management.md +17 -0
- package/static/templates/docs/architecture/storage.md +17 -0
- package/static/templates/docs/architecture/system.md +17 -0
- package/static/templates/docs/business/buying-trigger.md +17 -0
- package/static/templates/docs/business/customer-value.md +17 -0
- package/static/templates/docs/business/customer.md +17 -0
- package/static/templates/docs/business/defensibility.md +17 -0
- package/static/templates/docs/business/growth.md +17 -0
- package/static/templates/docs/business/pricing.md +17 -0
- package/static/templates/docs/business/revenue-model.md +17 -0
- package/static/templates/docs/business/unit-economics.md +17 -0
- package/static/templates/docs/data/analytics.md +17 -0
- package/static/templates/docs/data/audit.md +17 -0
- package/static/templates/docs/data/database.md +17 -0
- package/static/templates/docs/data/indexing.md +17 -0
- package/static/templates/docs/data/migrations.md +17 -0
- package/static/templates/docs/data/model.md +17 -0
- package/static/templates/docs/data/retention.md +17 -0
- package/static/templates/docs/data/schema.md +17 -0
- package/static/templates/docs/deployment/approval.md +17 -0
- package/static/templates/docs/deployment/live-verification.md +17 -0
- package/static/templates/docs/deployment/process.md +17 -0
- package/static/templates/docs/deployment/rollback.md +17 -0
- package/static/templates/docs/design/design-system.md +17 -0
- package/static/templates/docs/design/errors.md +17 -0
- package/static/templates/docs/design/feedback.md +17 -0
- package/static/templates/docs/design/interactions.md +17 -0
- package/static/templates/docs/design/layout.md +17 -0
- package/static/templates/docs/design/navigation.md +17 -0
- package/static/templates/docs/design/principles.md +17 -0
- package/static/templates/docs/design/responsive.md +17 -0
- package/static/templates/docs/development/branching.md +17 -0
- package/static/templates/docs/development/code-quality.md +17 -0
- package/static/templates/docs/development/coding-standards.md +17 -0
- package/static/templates/docs/development/commits.md +17 -0
- package/static/templates/docs/development/merge-strategy.md +17 -0
- package/static/templates/docs/development/process.md +17 -0
- package/static/templates/docs/development/pull-requests.md +17 -0
- package/static/templates/docs/experience/accessibility.md +17 -0
- package/static/templates/docs/experience/aha-moment.md +17 -0
- package/static/templates/docs/experience/anti-experience.md +17 -0
- package/static/templates/docs/experience/friction.md +17 -0
- package/static/templates/docs/experience/outcomes.md +17 -0
- package/static/templates/docs/experience/principles.md +17 -0
- package/static/templates/docs/experience/retention.md +17 -0
- package/static/templates/docs/experience/sharing.md +17 -0
- package/static/templates/docs/overview/how-it-works.md +17 -0
- package/static/templates/docs/overview/what-is-it.md +17 -0
- package/static/templates/docs/overview/writing-docs.md +16 -0
- package/static/templates/docs/pitch/alternatives.md +17 -0
- package/static/templates/docs/pitch/assumptions.md +17 -0
- package/static/templates/docs/pitch/audience.md +17 -0
- package/static/templates/docs/pitch/concept.md +17 -0
- package/static/templates/docs/pitch/differentiators.md +17 -0
- package/static/templates/docs/pitch/outcomes.md +17 -0
- package/static/templates/docs/pitch/problem.md +17 -0
- package/static/templates/docs/pitch/product-market-fit.md +17 -0
- package/static/templates/docs/pitch/success-criteria.md +17 -0
- package/static/templates/docs/pitch/validation.md +17 -0
- package/static/templates/docs/pitch/value-proposition.md +17 -0
- package/static/templates/docs/pitch/vision.md +17 -0
- package/static/templates/docs/scope/core.md +17 -0
- package/static/templates/docs/scope/exclusions.md +17 -0
- package/static/templates/docs/scope/future.md +17 -0
- package/static/templates/docs/scope/launch.md +17 -0
- package/static/templates/docs/scope/post-launch.md +17 -0
- package/static/templates/docs/scope/priorities.md +17 -0
- package/static/templates/docs/scope/quality-bar.md +17 -0
- package/static/templates/docs/security/audit.md +17 -0
- package/static/templates/docs/security/data-access.md +17 -0
- package/static/templates/docs/security/logging.md +17 -0
- package/static/templates/docs/security/privacy.md +17 -0
- package/static/templates/docs/security/secrets.md +17 -0
- package/static/templates/docs/security/threat-model.md +17 -0
- package/static/templates/docs/testing/end-to-end.md +17 -0
- package/static/templates/docs/testing/integration.md +17 -0
- package/static/templates/docs/testing/regression.md +17 -0
- package/static/templates/docs/testing/security.md +17 -0
- package/static/templates/docs/testing/strategy.md +17 -0
- package/static/templates/docs/testing/test-data.md +17 -0
- package/static/templates/docs/testing/unit.md +17 -0
- package/static/templates/docs/uat/checks.md +17 -0
- package/static/templates/docs/uat/strategy.md +17 -0
- package/static/templates/docs/users/permissions.md +17 -0
- package/static/templates/docs/users/roles.md +17 -0
- package/static/templates/docs/users/user-types.md +17 -0
- package/static/templates/docs/workflows/assignment.md +17 -0
- package/static/templates/docs/workflows/bugfix.md +17 -0
- package/static/templates/docs/workflows/dependencies.md +17 -0
- package/static/templates/docs/workflows/deployment.md +17 -0
- package/static/templates/docs/workflows/development.md +17 -0
- package/static/templates/docs/workflows/planning.md +17 -0
- package/static/templates/docs/workflows/review.md +17 -0
- package/static/templates/docs/workflows/uat.md +17 -0
- package/static/templates/docsSite/docusaurus.config.ts +119 -0
- package/static/templates/docsSite/gitignore.txt +3 -0
- package/static/templates/docsSite/package.json.txt +42 -0
- package/static/templates/docsSite/pnpm-workspace.yaml +2 -0
- package/static/templates/docsSite/sidebars.ts +8 -0
- package/static/templates/docsSite/src/css/custom.css +1 -0
- package/static/templates/docsSite/src/pages/index.tsx +9 -0
- package/static/templates/docsSite/static/images/logo.svg +4 -0
- package/static/templates/docsSite/tsconfig.json +7 -0
- package/static/templates/eslint/base/eslint.config.mjs +79 -0
- package/static/templates/eslint/nextjs/eslint.config.mjs +137 -0
- package/static/templates/eslint/react/eslint.config.mjs +138 -0
- package/static/templates/eslint/typescript/eslint.config.mjs +126 -0
- package/static/templates/globals.css +16 -0
- package/static/templates/husky/commit-msg +1 -0
- package/static/templates/husky/pre-commit +1 -0
- package/static/templates/next.config.mjs +18 -0
- package/static/templates/prettier.config.js +17 -0
- package/static/templates/skills/codeReview.md +31 -0
- package/static/templates/skills/format.md +18 -0
- package/static/templates/skills/lint.md +21 -0
- package/static/templates/skills/lintFix.md +24 -0
- package/static/templates/skills/securityAudit.md +28 -0
- package/static/templates/skills/test.md +24 -0
- package/static/templates/skills/typescript.md +28 -0
- package/static/templates/skills/updateLayout.md +20 -0
- package/static/templates/stylelint/css/stylelint.config.mjs +28 -0
- package/static/templates/stylelint/scss/stylelint.config.mjs +10 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import comments from "@eslint-community/eslint-plugin-eslint-comments/configs";
|
|
3
|
+
import prettier from "eslint-config-prettier";
|
|
4
|
+
import { flatConfigs as importX } from "eslint-plugin-import-x";
|
|
5
|
+
import unicorn from "eslint-plugin-unicorn";
|
|
6
|
+
import globals from "globals";
|
|
7
|
+
|
|
8
|
+
export default [
|
|
9
|
+
{ ignores: ["dist/", "build/", "coverage/", "**/vendor/**"] },
|
|
10
|
+
js.configs.recommended,
|
|
11
|
+
comments.recommended,
|
|
12
|
+
importX.recommended,
|
|
13
|
+
unicorn.configs.recommended,
|
|
14
|
+
{
|
|
15
|
+
languageOptions: { globals: { ...globals.node } },
|
|
16
|
+
rules: {
|
|
17
|
+
"@eslint-community/eslint-comments/require-description": "error",
|
|
18
|
+
"func-style": ["error", "expression"],
|
|
19
|
+
"max-depth": ["error", 3],
|
|
20
|
+
"max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
|
|
21
|
+
"no-nested-ternary": "error",
|
|
22
|
+
"no-var": "error",
|
|
23
|
+
"prefer-arrow-callback": "error",
|
|
24
|
+
"prefer-const": "error",
|
|
25
|
+
"no-magic-numbers": [
|
|
26
|
+
"error",
|
|
27
|
+
{
|
|
28
|
+
ignore: [-1, 0, 1],
|
|
29
|
+
ignoreArrayIndexes: true,
|
|
30
|
+
ignoreDefaultValues: true,
|
|
31
|
+
enforceConst: true,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
"no-restricted-syntax": [
|
|
35
|
+
"error",
|
|
36
|
+
{ selector: "ClassDeclaration", message: "Use functions, not classes." },
|
|
37
|
+
{ selector: "ClassExpression", message: "Use functions, not classes." },
|
|
38
|
+
{ selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
|
|
39
|
+
{
|
|
40
|
+
selector: "VariableDeclaration[kind='let']",
|
|
41
|
+
message:
|
|
42
|
+
"Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
selector: "FunctionDeclaration[params.length>1]",
|
|
46
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
selector:
|
|
50
|
+
"VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
|
|
51
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
"import-x/no-cycle": "error",
|
|
55
|
+
"import-x/no-default-export": "error",
|
|
56
|
+
"no-use-before-define": "error",
|
|
57
|
+
"unicorn/default-export-style": "off",
|
|
58
|
+
"unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
|
|
59
|
+
"unicorn/name-replacements": [
|
|
60
|
+
"error",
|
|
61
|
+
{
|
|
62
|
+
// Dictionary words: see "Dictionary" in the Human-Readable Names standard.
|
|
63
|
+
replacements: { docs: false, props: false, utils: false },
|
|
64
|
+
// Third-party names, allowed only exactly as they are.
|
|
65
|
+
allowList: { ref: true, params: true, searchParams: true },
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
files: ["**/*.test.{js,mjs}"],
|
|
72
|
+
rules: { "max-lines": "off", "no-magic-numbers": "off" },
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
files: ["**/*.config.{js,mjs}"],
|
|
76
|
+
rules: { "import-x/no-default-export": "off" },
|
|
77
|
+
},
|
|
78
|
+
prettier,
|
|
79
|
+
];
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import comments from "@eslint-community/eslint-plugin-eslint-comments/configs";
|
|
2
|
+
import prettier from "eslint-config-prettier";
|
|
3
|
+
import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
|
|
4
|
+
import nextVitals from "eslint-config-next/core-web-vitals";
|
|
5
|
+
import nextTypescript from "eslint-config-next/typescript";
|
|
6
|
+
import { flatConfigs as importX } from "eslint-plugin-import-x";
|
|
7
|
+
import unicorn from "eslint-plugin-unicorn";
|
|
8
|
+
import globals from "globals";
|
|
9
|
+
|
|
10
|
+
export default [
|
|
11
|
+
{ ignores: [".next/", "out/", "build/", "coverage/", "next-env.d.ts", "**/vendor/**"] },
|
|
12
|
+
...nextVitals,
|
|
13
|
+
...nextTypescript,
|
|
14
|
+
comments.recommended,
|
|
15
|
+
importX.recommended,
|
|
16
|
+
importX.typescript,
|
|
17
|
+
unicorn.configs.recommended,
|
|
18
|
+
{
|
|
19
|
+
languageOptions: { globals: { ...globals.browser, ...globals.node } },
|
|
20
|
+
settings: {
|
|
21
|
+
react: { version: "19.0" },
|
|
22
|
+
"import-x/resolver-next": [createTypeScriptImportResolver()],
|
|
23
|
+
},
|
|
24
|
+
rules: {
|
|
25
|
+
"@eslint-community/eslint-comments/require-description": "error",
|
|
26
|
+
"func-style": ["error", "expression"],
|
|
27
|
+
"max-depth": ["error", 3],
|
|
28
|
+
"max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
|
|
29
|
+
"no-nested-ternary": "error",
|
|
30
|
+
"no-var": "error",
|
|
31
|
+
"prefer-arrow-callback": "error",
|
|
32
|
+
"prefer-const": "error",
|
|
33
|
+
"no-magic-numbers": [
|
|
34
|
+
"error",
|
|
35
|
+
{
|
|
36
|
+
ignore: [-1, 0, 1],
|
|
37
|
+
ignoreArrayIndexes: true,
|
|
38
|
+
ignoreDefaultValues: true,
|
|
39
|
+
enforceConst: true,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
"no-restricted-syntax": [
|
|
43
|
+
"error",
|
|
44
|
+
{ selector: "ClassDeclaration", message: "Use functions, not classes." },
|
|
45
|
+
{ selector: "ClassExpression", message: "Use functions, not classes." },
|
|
46
|
+
{ selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
|
|
47
|
+
{
|
|
48
|
+
selector: "VariableDeclaration[kind='let']",
|
|
49
|
+
message:
|
|
50
|
+
"Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
selector: "FunctionDeclaration[params.length>1]",
|
|
54
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
selector:
|
|
58
|
+
"VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
|
|
59
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
"import-x/no-cycle": "error",
|
|
63
|
+
"import-x/no-default-export": "error",
|
|
64
|
+
"no-use-before-define": "error",
|
|
65
|
+
"unicorn/default-export-style": "off",
|
|
66
|
+
"unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
|
|
67
|
+
"unicorn/name-replacements": [
|
|
68
|
+
"error",
|
|
69
|
+
{
|
|
70
|
+
// Dictionary words: see "Dictionary" in the Human-Readable Names standard.
|
|
71
|
+
replacements: { docs: false, props: false, utils: false },
|
|
72
|
+
// Third-party names, allowed only exactly as they are.
|
|
73
|
+
allowList: { ref: true, params: true, searchParams: true },
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
"react/function-component-definition": [
|
|
77
|
+
"error",
|
|
78
|
+
{ namedComponents: "arrow-function", unnamedComponents: "arrow-function" },
|
|
79
|
+
],
|
|
80
|
+
"react/jsx-no-bind": "error",
|
|
81
|
+
"react/no-multi-comp": "error",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
files: ["**/*.{ts,tsx}"],
|
|
86
|
+
rules: {
|
|
87
|
+
"no-undef": "off",
|
|
88
|
+
"no-magic-numbers": "off",
|
|
89
|
+
"no-use-before-define": "off",
|
|
90
|
+
"@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "never" }],
|
|
91
|
+
"@typescript-eslint/consistent-type-imports": "error",
|
|
92
|
+
"@typescript-eslint/naming-convention": [
|
|
93
|
+
"error",
|
|
94
|
+
{
|
|
95
|
+
selector: ["typeAlias", "interface"],
|
|
96
|
+
format: ["PascalCase"],
|
|
97
|
+
custom: { regex: "(Props|Type)$", match: true },
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
101
|
+
"@typescript-eslint/no-magic-numbers": [
|
|
102
|
+
"error",
|
|
103
|
+
{
|
|
104
|
+
ignore: [-1, 0, 1],
|
|
105
|
+
ignoreArrayIndexes: true,
|
|
106
|
+
ignoreDefaultValues: true,
|
|
107
|
+
enforceConst: true,
|
|
108
|
+
ignoreEnums: true,
|
|
109
|
+
ignoreNumericLiteralTypes: true,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
"@typescript-eslint/no-non-null-assertion": "error",
|
|
113
|
+
"@typescript-eslint/no-use-before-define": "error",
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
files: ["**/*.test.{ts,tsx}"],
|
|
118
|
+
rules: {
|
|
119
|
+
"max-lines": "off",
|
|
120
|
+
"no-magic-numbers": "off",
|
|
121
|
+
"@typescript-eslint/no-magic-numbers": "off",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
files: [
|
|
126
|
+
"**/*.config.{js,mjs,ts}",
|
|
127
|
+
"**/*.stories.tsx",
|
|
128
|
+
"app/**/{page,layout,template,default,loading,error,global-error,not-found}.tsx",
|
|
129
|
+
],
|
|
130
|
+
rules: { "import-x/no-default-export": "off" },
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
files: ["**/*.config.{js,mjs,ts}"],
|
|
134
|
+
rules: { "unicorn/no-top-level-side-effects": "off" },
|
|
135
|
+
},
|
|
136
|
+
prettier,
|
|
137
|
+
];
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import comments from "@eslint-community/eslint-plugin-eslint-comments/configs";
|
|
3
|
+
import prettier from "eslint-config-prettier";
|
|
4
|
+
import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
|
|
5
|
+
import { flatConfigs as importX } from "eslint-plugin-import-x";
|
|
6
|
+
import react from "eslint-plugin-react";
|
|
7
|
+
import reactHooks from "eslint-plugin-react-hooks";
|
|
8
|
+
import unicorn from "eslint-plugin-unicorn";
|
|
9
|
+
import globals from "globals";
|
|
10
|
+
import { configs as typescript } from "typescript-eslint";
|
|
11
|
+
|
|
12
|
+
export default [
|
|
13
|
+
{ ignores: ["dist/", "build/", "coverage/", "**/vendor/**"] },
|
|
14
|
+
js.configs.recommended,
|
|
15
|
+
comments.recommended,
|
|
16
|
+
importX.recommended,
|
|
17
|
+
importX.typescript,
|
|
18
|
+
unicorn.configs.recommended,
|
|
19
|
+
...typescript.recommended,
|
|
20
|
+
react.configs.flat.recommended,
|
|
21
|
+
react.configs.flat["jsx-runtime"],
|
|
22
|
+
reactHooks.configs.flat.recommended,
|
|
23
|
+
{
|
|
24
|
+
languageOptions: { globals: { ...globals.browser, ...globals.node } },
|
|
25
|
+
settings: {
|
|
26
|
+
react: { version: "19.0" },
|
|
27
|
+
"import-x/resolver-next": [createTypeScriptImportResolver()],
|
|
28
|
+
},
|
|
29
|
+
rules: {
|
|
30
|
+
"@eslint-community/eslint-comments/require-description": "error",
|
|
31
|
+
"func-style": ["error", "expression"],
|
|
32
|
+
"max-depth": ["error", 3],
|
|
33
|
+
"max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
|
|
34
|
+
"no-nested-ternary": "error",
|
|
35
|
+
"no-var": "error",
|
|
36
|
+
"prefer-arrow-callback": "error",
|
|
37
|
+
"prefer-const": "error",
|
|
38
|
+
"no-magic-numbers": [
|
|
39
|
+
"error",
|
|
40
|
+
{
|
|
41
|
+
ignore: [-1, 0, 1],
|
|
42
|
+
ignoreArrayIndexes: true,
|
|
43
|
+
ignoreDefaultValues: true,
|
|
44
|
+
enforceConst: true,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
"no-restricted-syntax": [
|
|
48
|
+
"error",
|
|
49
|
+
{ selector: "ClassDeclaration", message: "Use functions, not classes." },
|
|
50
|
+
{ selector: "ClassExpression", message: "Use functions, not classes." },
|
|
51
|
+
{ selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
|
|
52
|
+
{
|
|
53
|
+
selector: "VariableDeclaration[kind='let']",
|
|
54
|
+
message:
|
|
55
|
+
"Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
selector: "FunctionDeclaration[params.length>1]",
|
|
59
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
selector:
|
|
63
|
+
"VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
|
|
64
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
"import-x/no-cycle": "error",
|
|
68
|
+
"import-x/no-default-export": "error",
|
|
69
|
+
"no-use-before-define": "error",
|
|
70
|
+
"unicorn/default-export-style": "off",
|
|
71
|
+
"unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
|
|
72
|
+
"unicorn/name-replacements": [
|
|
73
|
+
"error",
|
|
74
|
+
{
|
|
75
|
+
// Dictionary words: see "Dictionary" in the Human-Readable Names standard.
|
|
76
|
+
replacements: { docs: false, props: false, utils: false },
|
|
77
|
+
// Third-party names, allowed only exactly as they are.
|
|
78
|
+
allowList: { ref: true, params: true, searchParams: true },
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
"react/function-component-definition": [
|
|
82
|
+
"error",
|
|
83
|
+
{ namedComponents: "arrow-function", unnamedComponents: "arrow-function" },
|
|
84
|
+
],
|
|
85
|
+
"react/jsx-no-bind": "error",
|
|
86
|
+
"react/no-multi-comp": "error",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
files: ["**/*.{ts,tsx}"],
|
|
91
|
+
rules: {
|
|
92
|
+
"no-undef": "off",
|
|
93
|
+
"no-magic-numbers": "off",
|
|
94
|
+
"no-use-before-define": "off",
|
|
95
|
+
"@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "never" }],
|
|
96
|
+
"@typescript-eslint/consistent-type-imports": "error",
|
|
97
|
+
"@typescript-eslint/naming-convention": [
|
|
98
|
+
"error",
|
|
99
|
+
{
|
|
100
|
+
selector: ["typeAlias", "interface"],
|
|
101
|
+
format: ["PascalCase"],
|
|
102
|
+
custom: { regex: "(Props|Type)$", match: true },
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
106
|
+
"@typescript-eslint/no-magic-numbers": [
|
|
107
|
+
"error",
|
|
108
|
+
{
|
|
109
|
+
ignore: [-1, 0, 1],
|
|
110
|
+
ignoreArrayIndexes: true,
|
|
111
|
+
ignoreDefaultValues: true,
|
|
112
|
+
enforceConst: true,
|
|
113
|
+
ignoreEnums: true,
|
|
114
|
+
ignoreNumericLiteralTypes: true,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
"@typescript-eslint/no-non-null-assertion": "error",
|
|
118
|
+
"@typescript-eslint/no-use-before-define": "error",
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
files: ["**/*.test.{ts,tsx}"],
|
|
123
|
+
rules: {
|
|
124
|
+
"max-lines": "off",
|
|
125
|
+
"no-magic-numbers": "off",
|
|
126
|
+
"@typescript-eslint/no-magic-numbers": "off",
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
files: ["**/*.config.{js,mjs,ts}", "**/*.stories.tsx"],
|
|
131
|
+
rules: { "import-x/no-default-export": "off" },
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
files: ["**/*.config.{js,mjs,ts}"],
|
|
135
|
+
rules: { "unicorn/no-top-level-side-effects": "off" },
|
|
136
|
+
},
|
|
137
|
+
prettier,
|
|
138
|
+
];
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import comments from "@eslint-community/eslint-plugin-eslint-comments/configs";
|
|
3
|
+
import prettier from "eslint-config-prettier";
|
|
4
|
+
import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
|
|
5
|
+
import { flatConfigs as importX } from "eslint-plugin-import-x";
|
|
6
|
+
import unicorn from "eslint-plugin-unicorn";
|
|
7
|
+
import globals from "globals";
|
|
8
|
+
import { configs as typescript } from "typescript-eslint";
|
|
9
|
+
|
|
10
|
+
export default [
|
|
11
|
+
{ ignores: ["dist/", "build/", "coverage/", "**/vendor/**"] },
|
|
12
|
+
js.configs.recommended,
|
|
13
|
+
comments.recommended,
|
|
14
|
+
importX.recommended,
|
|
15
|
+
importX.typescript,
|
|
16
|
+
unicorn.configs.recommended,
|
|
17
|
+
...typescript.recommended,
|
|
18
|
+
{
|
|
19
|
+
languageOptions: { globals: { ...globals.node } },
|
|
20
|
+
settings: {
|
|
21
|
+
"import-x/resolver-next": [createTypeScriptImportResolver()],
|
|
22
|
+
},
|
|
23
|
+
rules: {
|
|
24
|
+
"@eslint-community/eslint-comments/require-description": "error",
|
|
25
|
+
"func-style": ["error", "expression"],
|
|
26
|
+
"max-depth": ["error", 3],
|
|
27
|
+
"max-lines": ["error", { max: 300, skipBlankLines: true, skipComments: true }],
|
|
28
|
+
"no-nested-ternary": "error",
|
|
29
|
+
"no-var": "error",
|
|
30
|
+
"prefer-arrow-callback": "error",
|
|
31
|
+
"prefer-const": "error",
|
|
32
|
+
"no-magic-numbers": [
|
|
33
|
+
"error",
|
|
34
|
+
{
|
|
35
|
+
ignore: [-1, 0, 1],
|
|
36
|
+
ignoreArrayIndexes: true,
|
|
37
|
+
ignoreDefaultValues: true,
|
|
38
|
+
enforceConst: true,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
"no-restricted-syntax": [
|
|
42
|
+
"error",
|
|
43
|
+
{ selector: "ClassDeclaration", message: "Use functions, not classes." },
|
|
44
|
+
{ selector: "ClassExpression", message: "Use functions, not classes." },
|
|
45
|
+
{ selector: "VariableDeclarator > FunctionExpression", message: "Use an arrow function." },
|
|
46
|
+
{
|
|
47
|
+
selector: "VariableDeclaration[kind='let']",
|
|
48
|
+
message:
|
|
49
|
+
"Use const. If this value really must be reassigned, disable this rule on this line with a comment saying why.",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
selector: "FunctionDeclaration[params.length>1]",
|
|
53
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
selector:
|
|
57
|
+
"VariableDeclarator > :matches(ArrowFunctionExpression, FunctionExpression)[params.length>1]",
|
|
58
|
+
message: "Use a single object parameter when a function needs more than one value.",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
"import-x/no-cycle": "error",
|
|
62
|
+
"import-x/no-default-export": "error",
|
|
63
|
+
"no-use-before-define": "error",
|
|
64
|
+
"unicorn/default-export-style": "off",
|
|
65
|
+
"unicorn/filename-case": ["error", { cases: { camelCase: true, pascalCase: true } }],
|
|
66
|
+
"unicorn/name-replacements": [
|
|
67
|
+
"error",
|
|
68
|
+
{
|
|
69
|
+
// Dictionary words: see "Dictionary" in the Human-Readable Names standard.
|
|
70
|
+
replacements: { docs: false, props: false, utils: false },
|
|
71
|
+
// Third-party names, allowed only exactly as they are.
|
|
72
|
+
allowList: { ref: true, params: true, searchParams: true },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
files: ["**/*.{ts,tsx}"],
|
|
79
|
+
rules: {
|
|
80
|
+
"no-undef": "off",
|
|
81
|
+
"no-magic-numbers": "off",
|
|
82
|
+
"no-use-before-define": "off",
|
|
83
|
+
"@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "never" }],
|
|
84
|
+
"@typescript-eslint/consistent-type-imports": "error",
|
|
85
|
+
"@typescript-eslint/naming-convention": [
|
|
86
|
+
"error",
|
|
87
|
+
{
|
|
88
|
+
selector: ["typeAlias", "interface"],
|
|
89
|
+
format: ["PascalCase"],
|
|
90
|
+
custom: { regex: "(Props|Type)$", match: true },
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
94
|
+
"@typescript-eslint/no-magic-numbers": [
|
|
95
|
+
"error",
|
|
96
|
+
{
|
|
97
|
+
ignore: [-1, 0, 1],
|
|
98
|
+
ignoreArrayIndexes: true,
|
|
99
|
+
ignoreDefaultValues: true,
|
|
100
|
+
enforceConst: true,
|
|
101
|
+
ignoreEnums: true,
|
|
102
|
+
ignoreNumericLiteralTypes: true,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
"@typescript-eslint/no-non-null-assertion": "error",
|
|
106
|
+
"@typescript-eslint/no-use-before-define": "error",
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
files: ["**/*.test.{ts,tsx}"],
|
|
111
|
+
rules: {
|
|
112
|
+
"max-lines": "off",
|
|
113
|
+
"no-magic-numbers": "off",
|
|
114
|
+
"@typescript-eslint/no-magic-numbers": "off",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
files: ["**/*.config.{js,mjs,ts}", "**/*.stories.tsx"],
|
|
119
|
+
rules: { "import-x/no-default-export": "off" },
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
files: ["**/*.config.{js,mjs,ts}"],
|
|
123
|
+
rules: { "unicorn/no-top-level-side-effects": "off" },
|
|
124
|
+
},
|
|
125
|
+
prettier,
|
|
126
|
+
];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@theme {
|
|
4
|
+
--color-brand-primary: #3b82f6;
|
|
5
|
+
--color-brand-primary-hover: #2563eb;
|
|
6
|
+
--color-brand-secondary: #64748b;
|
|
7
|
+
--color-surface: #fff;
|
|
8
|
+
--color-text: #0f172a;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-theme="dark"] {
|
|
12
|
+
--color-brand-primary: #60a5fa;
|
|
13
|
+
--color-brand-primary-hover: #93c5fd;
|
|
14
|
+
--color-surface: #0f172a;
|
|
15
|
+
--color-text: #f8fafc;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pnpm exec commitlint --edit "$1"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pnpm lint
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const DOCS_URL = process.env.DOCS_URL;
|
|
2
|
+
|
|
3
|
+
/** @type {import("next").NextConfig} */
|
|
4
|
+
const nextConfig = {
|
|
5
|
+
async rewrites() {
|
|
6
|
+
// The docs are only served when DOCS_URL is set. It is never set in production.
|
|
7
|
+
if (!DOCS_URL) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return [
|
|
12
|
+
{ source: "/docs", destination: `${DOCS_URL}/docs/` },
|
|
13
|
+
{ source: "/docs/:path*", destination: `${DOCS_URL}/docs/:path*` },
|
|
14
|
+
];
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default nextConfig;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** @type {import("prettier").Config & import("prettier-plugin-tailwindcss").PluginOptions} */
|
|
2
|
+
const config = {
|
|
3
|
+
printWidth: 100,
|
|
4
|
+
tabWidth: 2,
|
|
5
|
+
useTabs: false,
|
|
6
|
+
singleQuote: false,
|
|
7
|
+
trailingComma: "all",
|
|
8
|
+
bracketSpacing: true,
|
|
9
|
+
bracketSameLine: false,
|
|
10
|
+
arrowParens: "always",
|
|
11
|
+
semi: true,
|
|
12
|
+
endOfLine: "lf",
|
|
13
|
+
plugins: ["prettier-plugin-tailwindcss"],
|
|
14
|
+
tailwindStylesheet: "./app/globals.css",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default config;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codeReview
|
|
3
|
+
description: Review changes for bugs and standards compliance
|
|
4
|
+
argument-hint: "[branch, commit or path]"
|
|
5
|
+
allowed-tools: Read, Glob, Grep, Bash(git diff:*), Bash(git log:*), Bash(git status:*), Bash(git merge-base:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Review the changes and report problems. Do NOT modify any files.
|
|
9
|
+
|
|
10
|
+
1. Work out what to review:
|
|
11
|
+
- If `$ARGUMENTS` is a file or folder path, review those files.
|
|
12
|
+
- If `$ARGUMENTS` is a branch or commit, review `git diff $ARGUMENTS...HEAD`.
|
|
13
|
+
- If `$ARGUMENTS` is empty, review `git diff main...HEAD` plus the uncommitted changes from `git diff`.
|
|
14
|
+
2. Read `AGENTS.md` for the project's code standards.
|
|
15
|
+
3. Read every changed file in full, not only the changed lines.
|
|
16
|
+
4. Check each change for:
|
|
17
|
+
- **Correctness** — logic errors, unhandled cases, broken error handling
|
|
18
|
+
- **Security** — unvalidated input, secrets in code, missing permission checks
|
|
19
|
+
- **Types** — `any`, non-null `!`, and `as` casts without a comment saying why
|
|
20
|
+
- **Tests** — every new or changed function and component has a test file
|
|
21
|
+
- **Readable code** — files over 300 lines, any name that is not human-readable (folders, files, props, form field `name`s and labels, types, union values, database columns, routes, environment variables and test names as well as variables), functions doing more than one thing, more than one parameter, nesting deeper than three levels, magic numbers
|
|
22
|
+
- **Structure** — reusable functions outside a `utils/` folder, server and client code in one file, inline functions in render
|
|
23
|
+
- **Styling** — hard-coded colours, CSS grid that was not asked for
|
|
24
|
+
5. Report the findings in order of severity: **Must fix**, **Should fix**, **Consider**. For each one give the file and line, what is wrong, and how to fix it.
|
|
25
|
+
6. Finish with a one-line verdict: ready to commit, or not.
|
|
26
|
+
|
|
27
|
+
If there are no changes to review, say so and stop.
|
|
28
|
+
|
|
29
|
+
Do NOT review files in `node_modules/` or `vendor/`. Third-party code is exempt from the standards.
|
|
30
|
+
Do NOT fix anything. Report only.
|
|
31
|
+
Do NOT stage, commit or push.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: format
|
|
3
|
+
description: Format files with Prettier and report what changed
|
|
4
|
+
argument-hint: "[path]"
|
|
5
|
+
allowed-tools: Read, Glob, Bash(pnpm format:*), Bash(git status:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Format the project with Prettier and report which files changed.
|
|
9
|
+
|
|
10
|
+
1. Read `package.json` and confirm a `format` script exists.
|
|
11
|
+
2. Run `pnpm format $ARGUMENTS`.
|
|
12
|
+
3. Run `git status --short` to see which files changed.
|
|
13
|
+
4. Report the reformatted files. If nothing changed, say the project was already formatted.
|
|
14
|
+
|
|
15
|
+
If `package.json` has no `format` script, stop and say so.
|
|
16
|
+
|
|
17
|
+
Do NOT change files in `node_modules/` or `vendor/`.
|
|
18
|
+
Do NOT stage, commit or push. Leave every change uncommitted.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lint
|
|
3
|
+
description: Run all linters in check-only mode and report issues
|
|
4
|
+
argument-hint: "[path]"
|
|
5
|
+
allowed-tools: Read, Glob, Grep, Bash(pnpm lint:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Run every configured linter and report the issues. Do NOT modify any files.
|
|
9
|
+
|
|
10
|
+
1. Read `package.json` and find the lint scripts (`lint`, and `lint:css` if it exists).
|
|
11
|
+
2. Run each one in check-only mode:
|
|
12
|
+
- ESLint: `pnpm lint $ARGUMENTS`
|
|
13
|
+
- Stylelint, only if the `lint:css` script exists: `pnpm lint:css`
|
|
14
|
+
3. Report the findings grouped by file. For each issue give the line, the rule name and the message, then explain in one plain-English sentence what is wrong and how to fix it. Write for someone who does not read code.
|
|
15
|
+
4. Finish with a one-line total: the number of errors and warnings, and how many are auto-fixable.
|
|
16
|
+
|
|
17
|
+
If `package.json` has no `lint` script, stop and say so. Do NOT fall back to running `eslint` directly.
|
|
18
|
+
|
|
19
|
+
Do NOT fix anything, even issues that are auto-fixable — `/lintFix` does that.
|
|
20
|
+
Do NOT lint or report on files in `node_modules/` or `vendor/`. Third-party code is exempt from the standards.
|
|
21
|
+
Do NOT stage, commit or push.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lintFix
|
|
3
|
+
description: Auto-fix lint and formatting issues, then report
|
|
4
|
+
argument-hint: "[path]"
|
|
5
|
+
allowed-tools: Read, Glob, Grep, Bash(pnpm lint:*), Bash(pnpm format:*), Bash(git status:*), Bash(git diff:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Run every linter in fix mode, then the formatter, and report what changed.
|
|
9
|
+
|
|
10
|
+
1. Read `package.json` and find the scripts that exist: `lint:fix`, `lint:css:fix` and `format`.
|
|
11
|
+
2. Run them in this order, skipping any that do not exist:
|
|
12
|
+
- ESLint: `pnpm lint:fix $ARGUMENTS`
|
|
13
|
+
- Stylelint: `pnpm lint:css:fix`
|
|
14
|
+
- Prettier: `pnpm format`
|
|
15
|
+
3. Run `git status --short` and `git diff --stat` to see which files changed.
|
|
16
|
+
4. Report:
|
|
17
|
+
- The files that were changed
|
|
18
|
+
- The issues that remain and could not be fixed automatically, grouped by file
|
|
19
|
+
|
|
20
|
+
If none of the three scripts exist, stop and say so.
|
|
21
|
+
|
|
22
|
+
Do NOT fix the remaining issues by hand. Report them and leave them for the person.
|
|
23
|
+
Do NOT change files in `node_modules/` or `vendor/`. Third-party code is exempt from the standards.
|
|
24
|
+
Do NOT stage, commit or push. Leave every change uncommitted.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: securityAudit
|
|
3
|
+
description: Audit the code for common security problems
|
|
4
|
+
argument-hint: "[path]"
|
|
5
|
+
allowed-tools: Read, Glob, Grep, Bash(pnpm audit:*), Bash(git ls-files:*)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Audit the code for security problems and report them. Do NOT modify any files.
|
|
9
|
+
|
|
10
|
+
1. Work out the scope: `$ARGUMENTS` if given, otherwise the whole repository.
|
|
11
|
+
2. Run `pnpm audit` and note every high and critical vulnerability.
|
|
12
|
+
3. Check the code for each of these:
|
|
13
|
+
- **Secrets** — API keys, tokens or passwords written in code or committed in `.env` files. Use `git ls-files` to check which files are tracked.
|
|
14
|
+
- **Access control** — API routes and server actions that do not check who the user is or what they are allowed to do
|
|
15
|
+
- **Input validation** — request data used without being validated
|
|
16
|
+
- **Injection** — database queries or shell commands built by joining strings
|
|
17
|
+
- **Cross-site scripting** — `dangerouslySetInnerHTML` or unescaped user content
|
|
18
|
+
- **Sensitive data** — personal data or secrets written to logs or returned in error messages
|
|
19
|
+
- **Client exposure** — secrets or server-only code reachable from a client component
|
|
20
|
+
4. Report the findings in order of severity: **Critical**, **High**, **Medium**, **Low**. For each one give the file and line, what the risk is, and how to fix it.
|
|
21
|
+
5. Finish by listing what you did NOT check, so a clean report is not mistaken for a full security review.
|
|
22
|
+
|
|
23
|
+
If `pnpm audit` fails, say so and carry on with the code checks.
|
|
24
|
+
|
|
25
|
+
Do NOT audit the source of packages in `node_modules/` or `vendor/` — `pnpm audit` covers dependencies.
|
|
26
|
+
Do NOT print the value of any secret you find. Report the file and line only.
|
|
27
|
+
Do NOT fix anything. Report only.
|
|
28
|
+
Do NOT stage, commit or push.
|