@sha3/code 1.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/AGENTS.md +75 -0
- package/README.md +554 -0
- package/ai/adapters/codex.md +7 -0
- package/ai/adapters/copilot.md +7 -0
- package/ai/adapters/cursor.md +7 -0
- package/ai/adapters/windsurf.md +8 -0
- package/ai/constitution.md +12 -0
- package/bin/code-standards.mjs +47 -0
- package/biome.json +37 -0
- package/index.mjs +11 -0
- package/lib/cli/parse-args.mjs +416 -0
- package/lib/cli/post-run-guidance.mjs +43 -0
- package/lib/cli/run-init.mjs +123 -0
- package/lib/cli/run-profile.mjs +46 -0
- package/lib/cli/run-refactor.mjs +152 -0
- package/lib/cli/run-verify.mjs +67 -0
- package/lib/constants.mjs +167 -0
- package/lib/contract/load-rule-catalog.mjs +12 -0
- package/lib/contract/render-agents.mjs +79 -0
- package/lib/contract/render-contract-json.mjs +7 -0
- package/lib/contract/resolve-contract.mjs +52 -0
- package/lib/paths.mjs +50 -0
- package/lib/profile.mjs +108 -0
- package/lib/project/ai-instructions.mjs +28 -0
- package/lib/project/biome-ignore.mjs +14 -0
- package/lib/project/managed-files.mjs +105 -0
- package/lib/project/package-metadata.mjs +132 -0
- package/lib/project/prompt-files.mjs +111 -0
- package/lib/project/template-resolution.mjs +70 -0
- package/lib/refactor/materialize-refactor-context.mjs +106 -0
- package/lib/refactor/preservation-questions.mjs +33 -0
- package/lib/refactor/public-contract-extractor.mjs +22 -0
- package/lib/refactor/render-analysis-summary.mjs +50 -0
- package/lib/refactor/source-analysis.mjs +74 -0
- package/lib/utils/fs.mjs +220 -0
- package/lib/utils/prompts.mjs +63 -0
- package/lib/utils/text.mjs +43 -0
- package/lib/verify/change-audit-verifier.mjs +140 -0
- package/lib/verify/change-context.mjs +36 -0
- package/lib/verify/error-handling-verifier.mjs +164 -0
- package/lib/verify/explain-rule.mjs +54 -0
- package/lib/verify/issue-helpers.mjs +132 -0
- package/lib/verify/project-layout-verifier.mjs +259 -0
- package/lib/verify/project-verifier.mjs +267 -0
- package/lib/verify/readme-public-api.mjs +237 -0
- package/lib/verify/readme-verifier.mjs +216 -0
- package/lib/verify/render-json-report.mjs +3 -0
- package/lib/verify/render-text-report.mjs +34 -0
- package/lib/verify/source-analysis.mjs +126 -0
- package/lib/verify/source-rule-verifier.mjs +453 -0
- package/lib/verify/testing-verifier.mjs +113 -0
- package/lib/verify/tooling-verifier.mjs +82 -0
- package/lib/verify/typescript-style-verifier.mjs +407 -0
- package/package.json +55 -0
- package/profiles/default.profile.json +40 -0
- package/profiles/schema.json +96 -0
- package/prompts/init-contract.md +25 -0
- package/prompts/init-phase-2-implement.md +25 -0
- package/prompts/init-phase-3-verify.md +23 -0
- package/prompts/init.prompt.md +24 -0
- package/prompts/refactor-contract.md +26 -0
- package/prompts/refactor-phase-2-rebuild.md +25 -0
- package/prompts/refactor-phase-3-verify.md +24 -0
- package/prompts/refactor.prompt.md +26 -0
- package/resources/ai/AGENTS.md +18 -0
- package/resources/ai/adapters/codex.md +5 -0
- package/resources/ai/adapters/copilot.md +5 -0
- package/resources/ai/adapters/cursor.md +5 -0
- package/resources/ai/adapters/windsurf.md +5 -0
- package/resources/ai/contract.schema.json +68 -0
- package/resources/ai/rule-catalog.json +878 -0
- package/resources/ai/rule-catalog.schema.json +66 -0
- package/resources/ai/templates/adapters/codex.template.md +7 -0
- package/resources/ai/templates/adapters/copilot.template.md +7 -0
- package/resources/ai/templates/adapters/cursor.template.md +7 -0
- package/resources/ai/templates/adapters/windsurf.template.md +7 -0
- package/resources/ai/templates/agents.project.template.md +141 -0
- package/resources/ai/templates/examples/demo/src/billing/billing.service.ts +73 -0
- package/resources/ai/templates/examples/demo/src/config.ts +3 -0
- package/resources/ai/templates/examples/demo/src/invoice/invoice.errors.ts +51 -0
- package/resources/ai/templates/examples/demo/src/invoice/invoice.service.ts +96 -0
- package/resources/ai/templates/examples/demo/src/invoice/invoice.types.ts +9 -0
- package/resources/ai/templates/examples/rules/async-bad.ts +52 -0
- package/resources/ai/templates/examples/rules/async-good.ts +56 -0
- package/resources/ai/templates/examples/rules/class-first-bad.ts +36 -0
- package/resources/ai/templates/examples/rules/class-first-good.ts +74 -0
- package/resources/ai/templates/examples/rules/constructor-bad.ts +68 -0
- package/resources/ai/templates/examples/rules/constructor-good.ts +71 -0
- package/resources/ai/templates/examples/rules/control-flow-bad.ts +31 -0
- package/resources/ai/templates/examples/rules/control-flow-good.ts +54 -0
- package/resources/ai/templates/examples/rules/errors-bad.ts +42 -0
- package/resources/ai/templates/examples/rules/errors-good.ts +23 -0
- package/resources/ai/templates/examples/rules/functions-bad.ts +48 -0
- package/resources/ai/templates/examples/rules/functions-good.ts +58 -0
- package/resources/ai/templates/examples/rules/returns-bad.ts +38 -0
- package/resources/ai/templates/examples/rules/returns-good.ts +44 -0
- package/resources/ai/templates/examples/rules/testing-bad.ts +34 -0
- package/resources/ai/templates/examples/rules/testing-good.ts +54 -0
- package/resources/ai/templates/rules/architecture.md +41 -0
- package/resources/ai/templates/rules/async.md +13 -0
- package/resources/ai/templates/rules/class-first.md +45 -0
- package/resources/ai/templates/rules/control-flow.md +13 -0
- package/resources/ai/templates/rules/errors.md +18 -0
- package/resources/ai/templates/rules/functions.md +29 -0
- package/resources/ai/templates/rules/naming.md +13 -0
- package/resources/ai/templates/rules/readme.md +36 -0
- package/resources/ai/templates/rules/returns.md +13 -0
- package/resources/ai/templates/rules/testing.md +18 -0
- package/resources/ai/templates/rules.project.template.md +66 -0
- package/resources/ai/templates/skills/change-synchronization/SKILL.md +42 -0
- package/resources/ai/templates/skills/feature-shaping/SKILL.md +45 -0
- package/resources/ai/templates/skills/http-api-conventions/SKILL.md +171 -0
- package/resources/ai/templates/skills/init-workflow/SKILL.md +52 -0
- package/resources/ai/templates/skills/readme-authoring/SKILL.md +51 -0
- package/resources/ai/templates/skills/refactor-workflow/SKILL.md +50 -0
- package/resources/ai/templates/skills/simplicity-audit/SKILL.md +41 -0
- package/resources/ai/templates/skills/test-scope-selection/SKILL.md +50 -0
- package/resources/ai/templates/skills.index.template.md +25 -0
- package/standards/architecture.md +72 -0
- package/standards/changelog-policy.md +12 -0
- package/standards/manifest.json +36 -0
- package/standards/readme.md +56 -0
- package/standards/schema.json +124 -0
- package/standards/style.md +106 -0
- package/standards/testing.md +20 -0
- package/standards/tooling.md +38 -0
- package/templates/node-lib/.biomeignore +10 -0
- package/templates/node-lib/.vscode/extensions.json +1 -0
- package/templates/node-lib/.vscode/settings.json +9 -0
- package/templates/node-lib/README.md +172 -0
- package/templates/node-lib/biome.json +37 -0
- package/templates/node-lib/gitignore +6 -0
- package/templates/node-lib/package.json +32 -0
- package/templates/node-lib/scripts/release-publish.mjs +106 -0
- package/templates/node-lib/scripts/run-tests.mjs +65 -0
- package/templates/node-lib/src/config.ts +3 -0
- package/templates/node-lib/src/index.ts +2 -0
- package/templates/node-lib/src/logger.ts +7 -0
- package/templates/node-lib/src/package-info/package-info.service.ts +47 -0
- package/templates/node-lib/test/package-info.test.ts +10 -0
- package/templates/node-lib/tsconfig.build.json +1 -0
- package/templates/node-lib/tsconfig.json +5 -0
- package/templates/node-service/.biomeignore +10 -0
- package/templates/node-service/.vscode/extensions.json +1 -0
- package/templates/node-service/.vscode/settings.json +9 -0
- package/templates/node-service/README.md +244 -0
- package/templates/node-service/biome.json +37 -0
- package/templates/node-service/ecosystem.config.cjs +3 -0
- package/templates/node-service/gitignore +6 -0
- package/templates/node-service/package.json +42 -0
- package/templates/node-service/scripts/release-publish.mjs +106 -0
- package/templates/node-service/scripts/run-tests.mjs +65 -0
- package/templates/node-service/src/app/service-runtime.service.ts +57 -0
- package/templates/node-service/src/app-info/app-info.service.ts +47 -0
- package/templates/node-service/src/config.ts +11 -0
- package/templates/node-service/src/http/http-server.service.ts +66 -0
- package/templates/node-service/src/index.ts +2 -0
- package/templates/node-service/src/logger.ts +7 -0
- package/templates/node-service/src/main.ts +5 -0
- package/templates/node-service/test/service-runtime.test.ts +13 -0
- package/templates/node-service/tsconfig.build.json +1 -0
- package/templates/node-service/tsconfig.json +5 -0
- package/tsconfig/base.json +16 -0
- package/tsconfig/node-lib.json +5 -0
- package/tsconfig/node-service.json +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
### Class-First Design (MUST)
|
|
2
|
+
|
|
3
|
+
- New business/domain logic MUST be modeled with classes by default.
|
|
4
|
+
- Inside feature folders, only `*.types.ts` files may expose non-class exports.
|
|
5
|
+
- Feature files in `src/<feature>/` MUST expose exactly one public class.
|
|
6
|
+
- Exceptions for exported functions are limited to minimal entrypoint/bootstrap wrappers.
|
|
7
|
+
- Each class MUST use constructor injection for dependencies.
|
|
8
|
+
- A source file MUST expose one public class.
|
|
9
|
+
- Mutable shared state MUST be avoided; prefer `readonly` fields and deterministic methods.
|
|
10
|
+
- Class-oriented files MUST use this exact 3-line format for every section they declare:
|
|
11
|
+
- `/**`
|
|
12
|
+
- ` * @section <block-name>`
|
|
13
|
+
- ` */`
|
|
14
|
+
- Required section block names (in order, and this order is mandatory when those blocks are present):
|
|
15
|
+
- `imports:externals`
|
|
16
|
+
- `imports:internals`
|
|
17
|
+
- `consts`
|
|
18
|
+
- `types`
|
|
19
|
+
- `class`
|
|
20
|
+
- `private:attributes`
|
|
21
|
+
- `protected:attributes`
|
|
22
|
+
- `public:properties`
|
|
23
|
+
- `constructor`
|
|
24
|
+
- `static:properties`
|
|
25
|
+
- `factory`
|
|
26
|
+
- `private:methods`
|
|
27
|
+
- `protected:methods`
|
|
28
|
+
- `public:methods`
|
|
29
|
+
- `static:methods`
|
|
30
|
+
- Section blocks without class members MUST be omitted.
|
|
31
|
+
- `class` MUST appear immediately before the exported class declaration and marks the start of that class.
|
|
32
|
+
- `factory` MUST only contain methods that create and return instances of the same class.
|
|
33
|
+
- `@section class` MUST have no intervening comments of any kind before `export class`.
|
|
34
|
+
- When class-level documentation is needed, place it above the `@section class` block or document the constructor/public methods instead of inserting comments between the marker and the class declaration.
|
|
35
|
+
|
|
36
|
+
Good example:
|
|
37
|
+
|
|
38
|
+
- `ai/examples/rules/class-first-good.ts`
|
|
39
|
+
- `ai/examples/rules/constructor-good.ts`
|
|
40
|
+
- `ai/examples/demo/src/invoice/invoice.service.ts`
|
|
41
|
+
|
|
42
|
+
Bad example:
|
|
43
|
+
|
|
44
|
+
- `ai/examples/rules/class-first-bad.ts`
|
|
45
|
+
- `ai/examples/rules/constructor-bad.ts`
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
### Control Flow Braces (MUST)
|
|
2
|
+
|
|
3
|
+
- `if`, `else if`, `else`, `for`, `while`, and `do` blocks MUST always use braces.
|
|
4
|
+
- Single-line `if` statements without braces are forbidden.
|
|
5
|
+
- This rule applies even when the body has one statement.
|
|
6
|
+
|
|
7
|
+
Good example:
|
|
8
|
+
|
|
9
|
+
- `ai/examples/rules/control-flow-good.ts`
|
|
10
|
+
|
|
11
|
+
Bad example:
|
|
12
|
+
|
|
13
|
+
- `ai/examples/rules/control-flow-bad.ts`
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
### Error Handling (MUST)
|
|
2
|
+
|
|
3
|
+
- Throw plain `Error` by default.
|
|
4
|
+
- Introduce custom error types only when other code must distinguish failure kinds.
|
|
5
|
+
- Do not add error classes or hierarchies without a real consumer.
|
|
6
|
+
- Errors MUST be thrown and handled at clear application boundaries.
|
|
7
|
+
- Silent catch blocks are forbidden.
|
|
8
|
+
- `no-silent-catch` treats `throw`, `console.warn(...)`, `console.error(...)`, and promise-style `.catch(...)` handling as reporting/handling signals.
|
|
9
|
+
- `console.debug(...)` does not satisfy `no-silent-catch`.
|
|
10
|
+
- Error messages MUST include actionable context.
|
|
11
|
+
|
|
12
|
+
Good example:
|
|
13
|
+
|
|
14
|
+
- `ai/examples/rules/errors-good.ts`
|
|
15
|
+
|
|
16
|
+
Bad example:
|
|
17
|
+
|
|
18
|
+
- `ai/examples/rules/errors-bad.ts`
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
### Function Structure (MUST)
|
|
2
|
+
|
|
3
|
+
- Functions and methods SHOULD stay under 30 lines.
|
|
4
|
+
- Functions MUST implement one responsibility.
|
|
5
|
+
- Long functions MUST be split into private helper methods.
|
|
6
|
+
- In class-oriented feature files, helper logic MUST live inside the class as private or static methods rather than module-scope functions.
|
|
7
|
+
- If a class grows too large, split it into smaller cohesive units with explicit roles instead of keeping one oversized class file.
|
|
8
|
+
- Implementations MUST prefer the least complex control flow and the fewest necessary steps.
|
|
9
|
+
- Avoid ceremony and indirection when a direct implementation remains clear and correct.
|
|
10
|
+
- Prefer concise arrow callbacks (for example in `map`, `filter`, `reduce`, `some`, `every`, `find`, `forEach`) when writing new code.
|
|
11
|
+
- Do not rewrite block-bodied callbacks that Biome already preserves solely for stylistic compactness.
|
|
12
|
+
- Types MUST be preferred over interfaces for local modeling unless a public contract requires an interface.
|
|
13
|
+
- New implementation and test files MUST be `.ts`.
|
|
14
|
+
- JavaScript source files (`.js`, `.mjs`, `.cjs`) are not allowed in `src/` or `test/`.
|
|
15
|
+
- Feature filenames MUST be domain-specific and role-specific (for example: `invoice.service.ts`, `invoice.repository.ts`, `invoice.helpers.ts`).
|
|
16
|
+
- Module-level constants MUST use `SCREAMING_SNAKE_CASE`.
|
|
17
|
+
- Local constants (for example inside functions/methods) MUST use `camelCase`.
|
|
18
|
+
- `src/config.ts` default export `config` and `src/logger.ts` default export `logger` are canonical naming exceptions.
|
|
19
|
+
- Exported schema-like values MUST use `camelCase` or `PascalCase` names.
|
|
20
|
+
- Let Biome decide the final line wrapping. Prefer compact code, but do not force single-line layouts that the formatter preserves as multiline.
|
|
21
|
+
- If a function/method needs many inputs, define a named `<FunctionName>Options` type and pass one `options` parameter.
|
|
22
|
+
|
|
23
|
+
Good example:
|
|
24
|
+
|
|
25
|
+
- `ai/examples/rules/functions-good.ts`
|
|
26
|
+
|
|
27
|
+
Bad example:
|
|
28
|
+
|
|
29
|
+
- `ai/examples/rules/functions-bad.ts`
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
### Identifier Naming Policy (MUST)
|
|
2
|
+
|
|
3
|
+
- Identifiers MUST use English technical/domain terms.
|
|
4
|
+
- Classes MUST use `PascalCase` nouns.
|
|
5
|
+
- Types and interfaces MUST use `PascalCase`.
|
|
6
|
+
- Functions and methods MUST use `camelCase` verbs.
|
|
7
|
+
- Variables and properties MUST use `camelCase`.
|
|
8
|
+
- Boolean identifiers MUST use `is*`, `has*`, `can*`, or `should*`.
|
|
9
|
+
- Module-level constants MUST use `SCREAMING_SNAKE_CASE`.
|
|
10
|
+
- Local constants (for example inside functions/methods) MUST use `camelCase`.
|
|
11
|
+
- `src/config.ts` default export `config` and `src/logger.ts` default export `logger` are canonical naming exceptions.
|
|
12
|
+
- Exported schema-like values MUST use `camelCase` or `PascalCase`.
|
|
13
|
+
- Generic names are forbidden for new code (`data`, `obj`, `tmp`, `val`, `thing`, `helper`, `utils`, `common`).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
### README Quality Standard (MUST)
|
|
2
|
+
|
|
3
|
+
When creating or updating `README.md`, output MUST be top-tier and production-quality.
|
|
4
|
+
|
|
5
|
+
Mandatory requirements:
|
|
6
|
+
|
|
7
|
+
- README MUST clearly explain: what the project does, why it exists, and how to use it in under 60 seconds.
|
|
8
|
+
- README MUST include practical copy/paste examples that are runnable.
|
|
9
|
+
- README MUST include a fast path (`TL;DR` or `Quick Start`) and an in-depth reference section.
|
|
10
|
+
- README MUST include a `Why` or `Benefits` section with concrete value, not vague marketing language.
|
|
11
|
+
- For libraries, README MUST be complete integration documentation for external teams and LLM agents.
|
|
12
|
+
- README MUST include a public API reference section with exported members and behavior expectations.
|
|
13
|
+
- README MUST document every public export from `src/index.ts`.
|
|
14
|
+
- If a public export is a class, README MUST document each public method with purpose, return value, and behavior notes.
|
|
15
|
+
- README MUST include a configuration reference section (`src/config.ts`) with meaning of each constant.
|
|
16
|
+
- README MUST include compatibility constraints (runtime, ESM/CJS expectations, TypeScript assumptions).
|
|
17
|
+
- README MUST include a section for AI usage (how to instruct assistants to follow local standards).
|
|
18
|
+
- README MUST avoid vague marketing language and focus on actionable guidance.
|
|
19
|
+
- README MUST be visually structured with clean headings, concise lists, and code blocks.
|
|
20
|
+
- README MUST look like serious package documentation, not like a scaffold placeholder.
|
|
21
|
+
- README SHOULD follow a structure inspired by high-quality package READMEs such as `ky`: short value proposition, practical examples first, exhaustive API reference after.
|
|
22
|
+
- README MUST be updated whenever behavior, commands, or setup steps change.
|
|
23
|
+
|
|
24
|
+
Good example characteristics:
|
|
25
|
+
|
|
26
|
+
- Starts with immediate value and one-command quick start.
|
|
27
|
+
- Shows exact commands and expected flow.
|
|
28
|
+
- Includes public API and method-level behavior without forcing reader to inspect source files.
|
|
29
|
+
- Includes troubleshooting or FAQ for common confusion points.
|
|
30
|
+
|
|
31
|
+
Bad example characteristics:
|
|
32
|
+
|
|
33
|
+
- Only describes high-level ideas.
|
|
34
|
+
- Missing runnable commands.
|
|
35
|
+
- Forces reader to guess execution order.
|
|
36
|
+
- Mentions a class exists without documenting its public methods.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
### Return Policy (MUST)
|
|
2
|
+
|
|
3
|
+
- Every function or method MUST have a single `return` statement.
|
|
4
|
+
- Early returns are not allowed.
|
|
5
|
+
- Conditional paths MUST assign to a local result variable and return once.
|
|
6
|
+
|
|
7
|
+
Good example:
|
|
8
|
+
|
|
9
|
+
- `ai/examples/rules/returns-good.ts`
|
|
10
|
+
|
|
11
|
+
Bad example:
|
|
12
|
+
|
|
13
|
+
- `ai/examples/rules/returns-bad.ts`
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
### Testing and Comments (MUST)
|
|
2
|
+
|
|
3
|
+
- Add or update tests when a change introduces meaningful logic, regression risk, or critical behavior that warrants automated coverage.
|
|
4
|
+
- Do not create ad hoc tests for trivial, mechanical, or low-risk changes with no meaningful behavior to protect.
|
|
5
|
+
- Tests MUST validate behavior, not implementation details.
|
|
6
|
+
- Test files MUST be TypeScript (`*.test.ts`).
|
|
7
|
+
- TypeScript validation MUST pass with zero type errors.
|
|
8
|
+
- Any TypeScript error found by `npm run check` MUST be fixed in code; disabling strictness or adding ignore directives to bypass type errors is forbidden.
|
|
9
|
+
- Comments MUST be explicit and extensive when logic is non-trivial.
|
|
10
|
+
- Async workflows MUST use `async/await` style only.
|
|
11
|
+
|
|
12
|
+
Good example:
|
|
13
|
+
|
|
14
|
+
- `ai/examples/rules/testing-good.ts`
|
|
15
|
+
|
|
16
|
+
Bad example:
|
|
17
|
+
|
|
18
|
+
- `ai/examples/rules/testing-bad.ts`
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Project Rules
|
|
2
|
+
|
|
3
|
+
Read this file together with `AGENTS.md` and `ai/contract.json` before making implementation changes.
|
|
4
|
+
|
|
5
|
+
## Core Rules
|
|
6
|
+
|
|
7
|
+
- Treat `ai/contract.json` as the machine-readable source of truth.
|
|
8
|
+
- Treat `AGENTS.md` as blocking local policy.
|
|
9
|
+
- Treat `SKILLS.md` and `skills/*` as specialized workflow guidance that applies when the task matches that workflow.
|
|
10
|
+
- Keep managed files read-only unless the user explicitly requests a standards update.
|
|
11
|
+
- Managed files are ignored by Biome by default; do not remove those ignores just to lint contract or prompt artifacts during feature work.
|
|
12
|
+
- Run `npm run check` yourself before finishing and fix any failures before you stop.
|
|
13
|
+
- Fix every `error`, review every `warning`, and report every `audit` item.
|
|
14
|
+
|
|
15
|
+
## Simplicity
|
|
16
|
+
|
|
17
|
+
- Choose the simplest correct design for the current requirement.
|
|
18
|
+
- Do not add speculative abstractions, helper layers, wrappers, or extension points without immediate need.
|
|
19
|
+
- Do not use simplicity as a reason to remove valid responsibility boundaries.
|
|
20
|
+
|
|
21
|
+
## Compactness
|
|
22
|
+
|
|
23
|
+
- Let Biome decide the final line wrapping.
|
|
24
|
+
- Prefer compact code when writing or refactoring, but do not force single-line objects, callbacks, or other constructs that Biome keeps multiline.
|
|
25
|
+
- Do not split code into multiple lines just because it is “safer”, and do not manually collapse formatter-preserved multiline layouts.
|
|
26
|
+
- `verify` must not be treated as authority over code layout when Biome can rewrite that layout.
|
|
27
|
+
|
|
28
|
+
## Simple Callbacks
|
|
29
|
+
|
|
30
|
+
- Prefer concise arrow callbacks in `map`, `filter`, `reduce`, `some`, `every`, `find`, and `forEach` when writing new code.
|
|
31
|
+
- Do not rewrite Biome-stable block-bodied callbacks solely to satisfy a style preference.
|
|
32
|
+
|
|
33
|
+
## Errors
|
|
34
|
+
|
|
35
|
+
- Throw plain `Error` by default.
|
|
36
|
+
- Use custom error types only when other code must distinguish failure kinds.
|
|
37
|
+
- Do not add error hierarchies without a real consumer.
|
|
38
|
+
|
|
39
|
+
## Transport Pragmatism
|
|
40
|
+
|
|
41
|
+
- `single-return` stays strict across `src/` except for `src/http/**`.
|
|
42
|
+
- In `src/http/**`, prefer the clearest handler flow for validation, auth, and response branching, including early returns when they reduce nesting.
|
|
43
|
+
|
|
44
|
+
## Type Files
|
|
45
|
+
|
|
46
|
+
- Keep small or local types close to the code that uses them.
|
|
47
|
+
- Create `*.types.ts` only when shared feature types are substantial enough to justify a dedicated file.
|
|
48
|
+
|
|
49
|
+
## Feature Classes
|
|
50
|
+
|
|
51
|
+
- Inside `src/<feature>/`, files MUST expose exactly one public class unless the file is `*.types.ts`.
|
|
52
|
+
- Do not implement feature modules as exported function collections.
|
|
53
|
+
- If a file exposes a public class, helper logic MUST stay inside that class as private or static methods instead of module-scope functions.
|
|
54
|
+
- Large classes MUST be decomposed into smaller cohesive units before they become monolithic files.
|
|
55
|
+
|
|
56
|
+
## Active Deterministic Rules
|
|
57
|
+
|
|
58
|
+
{{deterministicRules}}
|
|
59
|
+
|
|
60
|
+
## Active Heuristic Rules
|
|
61
|
+
|
|
62
|
+
{{heuristicRules}}
|
|
63
|
+
|
|
64
|
+
## Active Audit Rules
|
|
65
|
+
|
|
66
|
+
{{auditRules}}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: change-synchronization
|
|
3
|
+
description: Use this skill when behavior, exports, config, runtime commands, or HTTP contracts change. It defines the affected-surfaces review required to keep code, tests, README, exports, and config in sync.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Change Synchronization
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill whenever behavior changes in a way that may affect exports, tests, configuration, commands, or documentation.
|
|
11
|
+
|
|
12
|
+
## Affected Surfaces
|
|
13
|
+
|
|
14
|
+
Review each of these before finalizing:
|
|
15
|
+
|
|
16
|
+
- `src/index.ts`
|
|
17
|
+
- `src/config.ts`
|
|
18
|
+
- `README.md`
|
|
19
|
+
- `test/`
|
|
20
|
+
- `package.json` scripts when runtime behavior changed
|
|
21
|
+
- `src/http/` and `## HTTP API` when transport behavior changed
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
1. Identify the behavior change.
|
|
26
|
+
2. List the public and operational surfaces affected by that change.
|
|
27
|
+
3. Update tests, exports, docs, and config in the same pass as the implementation.
|
|
28
|
+
4. Re-check that examples, payloads, method names, and commands match the final code.
|
|
29
|
+
|
|
30
|
+
## Final Checklist
|
|
31
|
+
|
|
32
|
+
- exported surface matches real public behavior
|
|
33
|
+
- tests cover the changed behavior where warranted
|
|
34
|
+
- README examples match the current package surface
|
|
35
|
+
- configuration documentation matches real runtime keys
|
|
36
|
+
- HTTP documentation matches current routes and payloads
|
|
37
|
+
|
|
38
|
+
## Prohibited Actions
|
|
39
|
+
|
|
40
|
+
- Do not change behavior and defer docs or tests “for later”.
|
|
41
|
+
- Do not leave README examples or API sections on stale scaffold behavior.
|
|
42
|
+
- Do not add config keys without documenting their user-facing impact.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-shaping
|
|
3
|
+
description: Use this skill when mapping a requested behavior into the scaffold. It defines how to choose the canonical feature boundary, file set, and public surface while rejecting unnecessary layers and files.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Feature Shaping
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill when adding a feature, creating a new module or service, or deciding whether work belongs in an existing feature folder or a new one.
|
|
11
|
+
|
|
12
|
+
## Read First
|
|
13
|
+
|
|
14
|
+
- `AGENTS.md`
|
|
15
|
+
- `SKILLS.md`
|
|
16
|
+
- `ai/contract.json`
|
|
17
|
+
- `ai/rules.md`
|
|
18
|
+
- `src/index.ts`
|
|
19
|
+
- `src/config.ts`
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. Identify the behavior being added and the public impact it creates.
|
|
24
|
+
2. Decide whether the behavior belongs in an existing feature or a new feature folder.
|
|
25
|
+
3. Choose the smallest file set that can hold the change cleanly.
|
|
26
|
+
4. Place logic in the canonical boundary:
|
|
27
|
+
- `src/<feature>/` for feature code
|
|
28
|
+
- `src/app/` only for justified composition
|
|
29
|
+
- `src/http/` only for transport concerns
|
|
30
|
+
- `src/shared/` only for real cross-feature reuse
|
|
31
|
+
5. Confirm that the planned structure is no more complex than the template baseline for the same requirement.
|
|
32
|
+
|
|
33
|
+
## Core Rules
|
|
34
|
+
|
|
35
|
+
- Prefer extending an existing cohesive feature over creating a new boundary.
|
|
36
|
+
- Add new files only when the current requirement justifies them.
|
|
37
|
+
- Keep business logic out of transport adapters.
|
|
38
|
+
- Define the intended public API impact before implementation, even if that impact is “none”.
|
|
39
|
+
|
|
40
|
+
## Prohibited Actions
|
|
41
|
+
|
|
42
|
+
- Do not create helper, wrapper, factory, repository, mapper, schema, or shared files by default.
|
|
43
|
+
- Do not create `src/app/` or `src/shared/` for hypothetical future reuse.
|
|
44
|
+
- Do not split one cohesive behavior across multiple files for aesthetics alone.
|
|
45
|
+
- Do not let feature boundaries follow implementation accidents instead of domain meaning.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: http-api-conventions
|
|
3
|
+
description: Use this skill when a project exposes HTTP endpoints. It defines the standard route design, parameter naming, validation, response shapes, status codes, and README/test expectations for scaffolded HTTP APIs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# HTTP API Conventions
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill whenever a `node-service` project adds, changes, or documents HTTP endpoints.
|
|
11
|
+
|
|
12
|
+
## Framework And Placement
|
|
13
|
+
|
|
14
|
+
- Use `hono` only.
|
|
15
|
+
- Keep transport concerns under `src/http/`.
|
|
16
|
+
- Keep very small route wiring in `src/http/http-server.service.ts` when that remains clear.
|
|
17
|
+
- Extract `*.controller.ts` or `*.schema.ts` only when endpoint count or validation complexity justifies them.
|
|
18
|
+
- Keep business logic in feature or app services, not in transport handlers.
|
|
19
|
+
|
|
20
|
+
## Route Design
|
|
21
|
+
|
|
22
|
+
- Prefer pure REST resource routes.
|
|
23
|
+
- Use plural resource names in URL paths.
|
|
24
|
+
- Use `kebab-case` path segments.
|
|
25
|
+
- Keep code feature folders singular even when route paths are plural.
|
|
26
|
+
- Reserve `GET /` for service info, health, or root metadata when the template already uses it.
|
|
27
|
+
- Put business routes under `/api/<resource-plural>`.
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
|
|
31
|
+
- `GET /`
|
|
32
|
+
- `GET /api/users`
|
|
33
|
+
- `GET /api/users/:userId`
|
|
34
|
+
- `POST /api/users`
|
|
35
|
+
- `PATCH /api/users/:userId`
|
|
36
|
+
- `DELETE /api/users/:userId`
|
|
37
|
+
|
|
38
|
+
## Method Rules
|
|
39
|
+
|
|
40
|
+
- `GET` for retrieval
|
|
41
|
+
- `POST` for creation
|
|
42
|
+
- `PUT` only for real full replacement
|
|
43
|
+
- `PATCH` for partial updates
|
|
44
|
+
- `DELETE` for deletion
|
|
45
|
+
|
|
46
|
+
Defaults:
|
|
47
|
+
|
|
48
|
+
- prefer `PATCH` over `PUT` unless full replacement semantics are real
|
|
49
|
+
- avoid action verbs in paths when a resource-oriented route works
|
|
50
|
+
- if a non-REST action is unavoidable, use `POST /api/<resource-plural>/:resourceId/<action-kebab-case>`
|
|
51
|
+
|
|
52
|
+
## Parameters
|
|
53
|
+
|
|
54
|
+
### Path Params
|
|
55
|
+
|
|
56
|
+
- use lowerCamelCase names with `Id` suffix for identifiers
|
|
57
|
+
- use semantic names such as `userId` or `invoiceId`
|
|
58
|
+
- do not use generic names such as `id`, `item`, or `value`
|
|
59
|
+
|
|
60
|
+
### Query Params
|
|
61
|
+
|
|
62
|
+
Use query params only for read modifiers:
|
|
63
|
+
|
|
64
|
+
- filtering
|
|
65
|
+
- pagination
|
|
66
|
+
- sorting
|
|
67
|
+
- search
|
|
68
|
+
|
|
69
|
+
Canonical names:
|
|
70
|
+
|
|
71
|
+
- `page`
|
|
72
|
+
- `pageSize`
|
|
73
|
+
- `sort`
|
|
74
|
+
- `search`
|
|
75
|
+
- feature-specific names such as `status`, `fromDate`, `toDate`
|
|
76
|
+
|
|
77
|
+
Rules:
|
|
78
|
+
|
|
79
|
+
- keep query params flat
|
|
80
|
+
- avoid nested query structures
|
|
81
|
+
- avoid ad hoc operator syntax unless current behavior truly requires it
|
|
82
|
+
|
|
83
|
+
## Request Bodies
|
|
84
|
+
|
|
85
|
+
- `GET` and `DELETE` must not accept bodies
|
|
86
|
+
- `POST`, `PUT`, and `PATCH` use JSON bodies
|
|
87
|
+
- bodies should be plain objects by default
|
|
88
|
+
- avoid generic `{ data: ... }` wrappers unless there is a current need for metadata
|
|
89
|
+
|
|
90
|
+
## Success Responses
|
|
91
|
+
|
|
92
|
+
- return plain JSON payloads by default
|
|
93
|
+
- do not introduce a generic transport envelope without current need
|
|
94
|
+
- return arrays directly for simple collections
|
|
95
|
+
- return metadata objects only when metadata actually exists
|
|
96
|
+
|
|
97
|
+
Status defaults:
|
|
98
|
+
|
|
99
|
+
- `GET`: `200`
|
|
100
|
+
- `POST` create: `201`
|
|
101
|
+
- `PATCH` and `PUT`: `200`
|
|
102
|
+
- `DELETE`: `204` with no body
|
|
103
|
+
- `POST` async accepted work: `202` only when genuinely asynchronous
|
|
104
|
+
|
|
105
|
+
For `201` responses:
|
|
106
|
+
|
|
107
|
+
- include a `Location` header when a canonical resource URL exists and doing so is straightforward
|
|
108
|
+
|
|
109
|
+
## Error Responses
|
|
110
|
+
|
|
111
|
+
Use this transport error shape:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"code": "invalid_request",
|
|
116
|
+
"message": "Human-readable explanation"
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Optional:
|
|
121
|
+
|
|
122
|
+
- `details` only when validation detail is genuinely useful
|
|
123
|
+
|
|
124
|
+
Canonical error codes:
|
|
125
|
+
|
|
126
|
+
- `invalid_request`
|
|
127
|
+
- `not_found`
|
|
128
|
+
- `conflict`
|
|
129
|
+
- `internal_error`
|
|
130
|
+
|
|
131
|
+
Status mapping:
|
|
132
|
+
|
|
133
|
+
- invalid path, query, body, or header input: `400`
|
|
134
|
+
- missing resource: `404`
|
|
135
|
+
- state conflict: `409`
|
|
136
|
+
- unexpected failure: `500`
|
|
137
|
+
|
|
138
|
+
Defaults:
|
|
139
|
+
|
|
140
|
+
- prefer `400` over `422` unless there is an explicit product reason
|
|
141
|
+
- keep error responses small and stable
|
|
142
|
+
- never leak stack traces or internals
|
|
143
|
+
|
|
144
|
+
## Validation
|
|
145
|
+
|
|
146
|
+
- validate path params, query params, and bodies at the HTTP boundary
|
|
147
|
+
- keep validation near transport
|
|
148
|
+
- use `<feature>.schema.ts` only when validation is non-trivial enough to justify it
|
|
149
|
+
- inline trivial validation when it stays compact and obvious
|
|
150
|
+
- validation failures must return the standard `400` error shape
|
|
151
|
+
- validation logic must not drift into domain services
|
|
152
|
+
|
|
153
|
+
## README And Tests
|
|
154
|
+
|
|
155
|
+
Whenever HTTP behavior changes:
|
|
156
|
+
|
|
157
|
+
- update `## HTTP API`
|
|
158
|
+
- document method and path
|
|
159
|
+
- document params
|
|
160
|
+
- document success status
|
|
161
|
+
- document response shape
|
|
162
|
+
- document meaningful failure statuses
|
|
163
|
+
- keep examples aligned with actual routes and payloads
|
|
164
|
+
|
|
165
|
+
For meaningful endpoint changes, tests should cover:
|
|
166
|
+
|
|
167
|
+
- success status
|
|
168
|
+
- success payload
|
|
169
|
+
- validation failure when applicable
|
|
170
|
+
- not-found or conflict behavior when applicable
|
|
171
|
+
- `204` no-body behavior when applicable
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init-workflow
|
|
3
|
+
description: Use this skill when implementing the first behavior in a freshly generated scaffold. It defines the required execution order, scaffold-preservation rules, and final reporting for init-based work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Init Workflow
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill when the project was generated with `code-standards init` and the task is to implement new behavior inside the fresh scaffold.
|
|
11
|
+
|
|
12
|
+
## Read First
|
|
13
|
+
|
|
14
|
+
- `AGENTS.md`
|
|
15
|
+
- `SKILLS.md`
|
|
16
|
+
- `ai/contract.json`
|
|
17
|
+
- `ai/rules.md`
|
|
18
|
+
- `prompts/init-contract.md`
|
|
19
|
+
- `src/index.ts`
|
|
20
|
+
- `src/config.ts`
|
|
21
|
+
|
|
22
|
+
## Required Execution Order
|
|
23
|
+
|
|
24
|
+
1. Inspect the generated scaffold before changing code so the public shape and feature layout stay aligned with the template.
|
|
25
|
+
2. Map the requested behavior onto the existing `src/` and `test/` structure before adding files.
|
|
26
|
+
3. Implement the smallest correct change inside the scaffold-native structure.
|
|
27
|
+
4. Update or add tests for the behavior change.
|
|
28
|
+
5. If `README.md` changes, load `skills/readme-authoring/SKILL.md` and rewrite the README after behavior is stable.
|
|
29
|
+
6. Run `npm run standards:check`.
|
|
30
|
+
7. Fix every `error`, review every `warning`, report every `audit` item, and rerun until the default verification passes.
|
|
31
|
+
8. Run `npm run check`.
|
|
32
|
+
9. Fix failures and rerun `npm run check` until it passes.
|
|
33
|
+
|
|
34
|
+
## Prohibited Actions
|
|
35
|
+
|
|
36
|
+
- Do not replace scaffold structure with an unrelated architecture.
|
|
37
|
+
- Do not edit managed files unless the user explicitly asked for a standards update.
|
|
38
|
+
- Do not introduce helper layers, wrappers, or extra files unless the current requirement justifies them.
|
|
39
|
+
- Do not leave `README.md` as scaffold text when the task changes real behavior.
|
|
40
|
+
|
|
41
|
+
## Implementation Focus
|
|
42
|
+
|
|
43
|
+
- Preserve scaffold naming conventions and feature boundaries.
|
|
44
|
+
- Keep helper logic inside classes as private or static methods in class-oriented source files.
|
|
45
|
+
- Split oversized classes into smaller cohesive units instead of keeping monolithic files.
|
|
46
|
+
- Keep generated and edited content in English, including code comments, README text, and examples.
|
|
47
|
+
|
|
48
|
+
## Final Response Checklist
|
|
49
|
+
|
|
50
|
+
- List changed files.
|
|
51
|
+
- Include a short compliance checklist.
|
|
52
|
+
- Provide proof that `npm run check` passed.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: readme-authoring
|
|
3
|
+
description: Use this skill when creating or updating README.md. It defines the required documentation workflow, evidence to collect from the public API, and quality checks for package-grade README output.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# README Authoring
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill when the task creates, rewrites, or updates `README.md`.
|
|
11
|
+
|
|
12
|
+
## Read First
|
|
13
|
+
|
|
14
|
+
- `AGENTS.md`
|
|
15
|
+
- `ai/contract.json`
|
|
16
|
+
- `ai/rules.md`
|
|
17
|
+
- `README.md`
|
|
18
|
+
- `src/index.ts`
|
|
19
|
+
- `src/config.ts`
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. Inspect the real public exports from `src/index.ts`.
|
|
24
|
+
2. Inspect public class methods that are reachable through the package boundary.
|
|
25
|
+
3. Inspect `src/config.ts` and extract each user-facing configuration key and its impact.
|
|
26
|
+
4. Inspect scripts, runtime constraints, and actual usage flow before writing prose.
|
|
27
|
+
5. Rewrite `README.md` so it matches the real behavior rather than the scaffold.
|
|
28
|
+
|
|
29
|
+
## Writing Rules
|
|
30
|
+
|
|
31
|
+
- Write the README in English.
|
|
32
|
+
- Write like the package maintainer speaking to another engineer.
|
|
33
|
+
- Lead with fast value, runnable commands, and practical examples.
|
|
34
|
+
- Keep the README focused on real package or runtime behavior.
|
|
35
|
+
- Document every public export from `src/index.ts`.
|
|
36
|
+
- If a public export is a class, document each public method with purpose, return value, and behavior notes.
|
|
37
|
+
- Include runnable examples that import from the real package boundary.
|
|
38
|
+
- Describe configuration in user terms, not as a raw constant dump.
|
|
39
|
+
|
|
40
|
+
## Avoid
|
|
41
|
+
|
|
42
|
+
- Do not leave placeholder language, TODOs, or scaffold narration.
|
|
43
|
+
- Do not describe the project as generated or templated outside the `AI Workflow` section.
|
|
44
|
+
- Do not force the reader to inspect source files to understand the public API.
|
|
45
|
+
- Do not claim support, behavior, or setup steps that the code does not implement.
|
|
46
|
+
|
|
47
|
+
## Validation
|
|
48
|
+
|
|
49
|
+
- Verify the README still matches the current public API and commands.
|
|
50
|
+
- Verify examples are copy-pasteable and aligned with the actual package surface.
|
|
51
|
+
- Verify the README reflects the final behavior after code changes, not before them.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refactor-workflow
|
|
3
|
+
description: Use this skill when refactoring an existing project or rebuilding legacy code on top of a regenerated scaffold. It defines the required execution order, forbidden actions, and final reporting for scaffold-first refactor work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Refactor Workflow
|
|
7
|
+
|
|
8
|
+
## When To Use
|
|
9
|
+
|
|
10
|
+
Use this skill when the task is to refactor an existing project, rebuild a legacy implementation on top of a regenerated scaffold, or work from `.code-standards/refactor-source/`.
|
|
11
|
+
|
|
12
|
+
## Read First
|
|
13
|
+
|
|
14
|
+
- `AGENTS.md`
|
|
15
|
+
- `ai/contract.json`
|
|
16
|
+
- `ai/rules.md`
|
|
17
|
+
- `.code-standards/refactor-source/public-contract.json`
|
|
18
|
+
- `.code-standards/refactor-source/preservation.json`
|
|
19
|
+
- `.code-standards/refactor-source/analysis-summary.md`
|
|
20
|
+
|
|
21
|
+
## Required Execution Order
|
|
22
|
+
|
|
23
|
+
1. Analyze the legacy code and extract only required behavior, preserved contracts, business rules, and edge cases.
|
|
24
|
+
2. Treat the snapshot under `.code-standards/refactor-source/latest/` as reference material only.
|
|
25
|
+
3. Rebuild the solution in the fresh scaffold under `src/` and `test/`.
|
|
26
|
+
4. Compare the planned target structure against the active standards before writing final code.
|
|
27
|
+
5. Run `npm run check`.
|
|
28
|
+
6. Fix failures in `src/` and `test/` and rerun `npm run check` until it passes.
|
|
29
|
+
|
|
30
|
+
## Prohibited Actions
|
|
31
|
+
|
|
32
|
+
- Do not copy legacy files into the new scaffold and make only superficial edits.
|
|
33
|
+
- Do not reproduce the legacy folder tree, helper layers, wrappers, plural feature folders, typed errors, or abstraction patterns unless preserved contracts force them.
|
|
34
|
+
- Do not restore `AGENTS.md`, `SKILLS.md`, `skills/*`, `ai/*`, `prompts/*`, `.vscode/*`, `biome.json`, `tsconfig*.json`, `package.json`, or lockfiles from the snapshot.
|
|
35
|
+
- Do not use `git checkout`, `git restore`, or snapshot copies to roll managed files back.
|
|
36
|
+
- Do not preserve unjustified legacy complexity by inertia.
|
|
37
|
+
|
|
38
|
+
## Implementation Focus
|
|
39
|
+
|
|
40
|
+
- Prefer the scaffold-native design when legacy structure conflicts with current standards.
|
|
41
|
+
- Fold helper logic into private or static class methods in class-oriented source files.
|
|
42
|
+
- Split oversized classes into smaller cohesive units instead of keeping monolithic files.
|
|
43
|
+
- Keep all generated and edited content in English, including README and code comments.
|
|
44
|
+
|
|
45
|
+
## Final Response Checklist
|
|
46
|
+
|
|
47
|
+
- List changed files.
|
|
48
|
+
- Include the preserved contracts checklist.
|
|
49
|
+
- Note intentionally non-preserved legacy items, if any.
|
|
50
|
+
- Provide proof that `npm run check` passed.
|