@hivehub/rulebook 1.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.
- package/LICENSE +191 -0
- package/README.md +539 -0
- package/dist/agents/claude-code.d.ts +69 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +180 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +184 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +299 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +69 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +180 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/cli/commands.d.ts +57 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1370 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/docs-prompts.d.ts +3 -0
- package/dist/cli/docs-prompts.d.ts.map +1 -0
- package/dist/cli/docs-prompts.js +45 -0
- package/dist/cli/docs-prompts.js.map +1 -0
- package/dist/cli/prompts.d.ts +6 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +376 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/agent-manager.d.ts +89 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +546 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/auto-fixer.d.ts +14 -0
- package/dist/core/auto-fixer.d.ts.map +1 -0
- package/dist/core/auto-fixer.js +207 -0
- package/dist/core/auto-fixer.js.map +1 -0
- package/dist/core/changelog-generator.d.ts +44 -0
- package/dist/core/changelog-generator.d.ts.map +1 -0
- package/dist/core/changelog-generator.js +222 -0
- package/dist/core/changelog-generator.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +113 -0
- package/dist/core/cli-bridge.d.ts.map +1 -0
- package/dist/core/cli-bridge.js +1094 -0
- package/dist/core/cli-bridge.js.map +1 -0
- package/dist/core/config-manager.d.ts +65 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +266 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/coverage-checker.d.ts +14 -0
- package/dist/core/coverage-checker.d.ts.map +1 -0
- package/dist/core/coverage-checker.js +176 -0
- package/dist/core/coverage-checker.js.map +1 -0
- package/dist/core/custom-templates.d.ts +27 -0
- package/dist/core/custom-templates.d.ts.map +1 -0
- package/dist/core/custom-templates.js +122 -0
- package/dist/core/custom-templates.js.map +1 -0
- package/dist/core/dependency-checker.d.ts +21 -0
- package/dist/core/dependency-checker.d.ts.map +1 -0
- package/dist/core/dependency-checker.js +247 -0
- package/dist/core/dependency-checker.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +1443 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/docs-generator.d.ts +9 -0
- package/dist/core/docs-generator.d.ts.map +1 -0
- package/dist/core/docs-generator.js +531 -0
- package/dist/core/docs-generator.js.map +1 -0
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +561 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/gitignore-generator.d.ts +13 -0
- package/dist/core/gitignore-generator.d.ts.map +1 -0
- package/dist/core/gitignore-generator.js +307 -0
- package/dist/core/gitignore-generator.js.map +1 -0
- package/dist/core/health-scorer.d.ts +22 -0
- package/dist/core/health-scorer.d.ts.map +1 -0
- package/dist/core/health-scorer.js +395 -0
- package/dist/core/health-scorer.js.map +1 -0
- package/dist/core/logger.d.ts +116 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +289 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/merger.d.ts +6 -0
- package/dist/core/merger.d.ts.map +1 -0
- package/dist/core/merger.js +131 -0
- package/dist/core/merger.js.map +1 -0
- package/dist/core/migrator.d.ts +19 -0
- package/dist/core/migrator.d.ts.map +1 -0
- package/dist/core/migrator.js +102 -0
- package/dist/core/migrator.js.map +1 -0
- package/dist/core/minimal-scaffolder.d.ts +8 -0
- package/dist/core/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/minimal-scaffolder.js +51 -0
- package/dist/core/minimal-scaffolder.js.map +1 -0
- package/dist/core/modern-console-new.d.ts +81 -0
- package/dist/core/modern-console-new.d.ts.map +1 -0
- package/dist/core/modern-console-new.js +340 -0
- package/dist/core/modern-console-new.js.map +1 -0
- package/dist/core/modern-console.d.ts +99 -0
- package/dist/core/modern-console.d.ts.map +1 -0
- package/dist/core/modern-console.js +568 -0
- package/dist/core/modern-console.js.map +1 -0
- package/dist/core/openspec-manager.d.ts +133 -0
- package/dist/core/openspec-manager.d.ts.map +1 -0
- package/dist/core/openspec-manager.js +605 -0
- package/dist/core/openspec-manager.js.map +1 -0
- package/dist/core/openspec-migrator.d.ts +27 -0
- package/dist/core/openspec-migrator.d.ts.map +1 -0
- package/dist/core/openspec-migrator.js +255 -0
- package/dist/core/openspec-migrator.js.map +1 -0
- package/dist/core/task-manager.d.ts +65 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +318 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/test-task-manager.d.ts +49 -0
- package/dist/core/test-task-manager.d.ts.map +1 -0
- package/dist/core/test-task-manager.js +121 -0
- package/dist/core/test-task-manager.js.map +1 -0
- package/dist/core/validator.d.ts +21 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/version-bumper.d.ts +19 -0
- package/dist/core/version-bumper.d.ts.map +1 -0
- package/dist/core/version-bumper.js +180 -0
- package/dist/core/version-bumper.js.map +1 -0
- package/dist/core/watcher.d.ts +9 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +22 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/workflow-generator.d.ts +10 -0
- package/dist/core/workflow-generator.d.ts.map +1 -0
- package/dist/core/workflow-generator.js +279 -0
- package/dist/core/workflow-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/archive-task.d.ts +17 -0
- package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
- package/dist/mcp/handlers/archive-task.js +36 -0
- package/dist/mcp/handlers/archive-task.js.map +1 -0
- package/dist/mcp/handlers/create-task.d.ts +17 -0
- package/dist/mcp/handlers/create-task.d.ts.map +1 -0
- package/dist/mcp/handlers/create-task.js +56 -0
- package/dist/mcp/handlers/create-task.js.map +1 -0
- package/dist/mcp/handlers/list-tasks.d.ts +22 -0
- package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
- package/dist/mcp/handlers/list-tasks.js +42 -0
- package/dist/mcp/handlers/list-tasks.js.map +1 -0
- package/dist/mcp/handlers/show-task.d.ts +25 -0
- package/dist/mcp/handlers/show-task.d.ts.map +1 -0
- package/dist/mcp/handlers/show-task.js +43 -0
- package/dist/mcp/handlers/show-task.js.map +1 -0
- package/dist/mcp/handlers/update-task.d.ts +17 -0
- package/dist/mcp/handlers/update-task.d.ts.map +1 -0
- package/dist/mcp/handlers/update-task.js +35 -0
- package/dist/mcp/handlers/update-task.js.map +1 -0
- package/dist/mcp/handlers/validate-task.d.ts +15 -0
- package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
- package/dist/mcp/handlers/validate-task.js +27 -0
- package/dist/mcp/handlers/validate-task.js.map +1 -0
- package/dist/mcp/rulebook-config.d.ts +22 -0
- package/dist/mcp/rulebook-config.d.ts.map +1 -0
- package/dist/mcp/rulebook-config.js +65 -0
- package/dist/mcp/rulebook-config.js.map +1 -0
- package/dist/mcp/rulebook-server.d.ts +4 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -0
- package/dist/mcp/rulebook-server.js +246 -0
- package/dist/mcp/rulebook-server.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +51 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +8 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +440 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/rulesignore.d.ts +9 -0
- package/dist/utils/rulesignore.d.ts.map +1 -0
- package/dist/utils/rulesignore.js +42 -0
- package/dist/utils/rulesignore.js.map +1 -0
- package/package.json +106 -0
- package/templates/cli/AIDER.md +49 -0
- package/templates/cli/AMAZON_Q.md +25 -0
- package/templates/cli/AUGGIE.md +32 -0
- package/templates/cli/CLAUDE.md +32 -0
- package/templates/cli/CLAUDE_CODE.md +35 -0
- package/templates/cli/CLINE.md +32 -0
- package/templates/cli/CODEBUDDY.md +20 -0
- package/templates/cli/CODEIUM.md +20 -0
- package/templates/cli/CODEX.md +21 -0
- package/templates/cli/CONTINUE.md +34 -0
- package/templates/cli/CURSOR_CLI.md +28 -0
- package/templates/cli/FACTORY.md +18 -0
- package/templates/cli/GEMINI.md +35 -0
- package/templates/cli/KILOCODE.md +18 -0
- package/templates/cli/OPENCODE.md +18 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
- package/templates/commands/rulebook-task-apply.md +67 -0
- package/templates/commands/rulebook-task-archive.md +70 -0
- package/templates/commands/rulebook-task-create.md +93 -0
- package/templates/commands/rulebook-task-list.md +42 -0
- package/templates/commands/rulebook-task-show.md +52 -0
- package/templates/commands/rulebook-task-validate.md +53 -0
- package/templates/core/AGENT_AUTOMATION.md +184 -0
- package/templates/core/DAG.md +304 -0
- package/templates/core/DOCUMENTATION_RULES.md +37 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
- package/templates/core/RULEBOOK.md +1874 -0
- package/templates/frameworks/ANGULAR.md +36 -0
- package/templates/frameworks/DJANGO.md +83 -0
- package/templates/frameworks/ELECTRON.md +147 -0
- package/templates/frameworks/FLASK.md +38 -0
- package/templates/frameworks/FLUTTER.md +55 -0
- package/templates/frameworks/JQUERY.md +32 -0
- package/templates/frameworks/LARAVEL.md +38 -0
- package/templates/frameworks/NESTJS.md +43 -0
- package/templates/frameworks/NEXTJS.md +127 -0
- package/templates/frameworks/NUXT.md +40 -0
- package/templates/frameworks/RAILS.md +66 -0
- package/templates/frameworks/REACT.md +38 -0
- package/templates/frameworks/REACT_NATIVE.md +47 -0
- package/templates/frameworks/SPRING.md +39 -0
- package/templates/frameworks/SYMFONY.md +36 -0
- package/templates/frameworks/VUE.md +36 -0
- package/templates/frameworks/ZEND.md +35 -0
- package/templates/git/CI_CD_PATTERNS.md +661 -0
- package/templates/git/GITHUB_ACTIONS.md +728 -0
- package/templates/git/GITLAB_CI.md +730 -0
- package/templates/git/GIT_WORKFLOW.md +1157 -0
- package/templates/git/SECRETS_MANAGEMENT.md +585 -0
- package/templates/hooks/COMMIT_MSG.md +530 -0
- package/templates/hooks/POST_CHECKOUT.md +546 -0
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
- package/templates/hooks/PRE_COMMIT.md +414 -0
- package/templates/hooks/PRE_PUSH.md +601 -0
- package/templates/hooks/csharp-pre-commit.sh +23 -0
- package/templates/hooks/csharp-pre-push.sh +23 -0
- package/templates/hooks/dart-pre-commit.sh +30 -0
- package/templates/hooks/dart-pre-push.sh +25 -0
- package/templates/hooks/elixir-pre-commit.sh +32 -0
- package/templates/hooks/elixir-pre-push.sh +31 -0
- package/templates/hooks/erlang-pre-commit.sh +30 -0
- package/templates/hooks/erlang-pre-push.sh +37 -0
- package/templates/hooks/go-pre-commit.sh +40 -0
- package/templates/hooks/go-pre-push.sh +31 -0
- package/templates/hooks/haskell-pre-commit.sh +41 -0
- package/templates/hooks/haskell-pre-push.sh +37 -0
- package/templates/hooks/java-pre-commit.sh +34 -0
- package/templates/hooks/java-pre-push.sh +24 -0
- package/templates/hooks/kotlin-pre-commit.sh +32 -0
- package/templates/hooks/kotlin-pre-push.sh +16 -0
- package/templates/hooks/php-pre-commit.sh +36 -0
- package/templates/hooks/php-pre-push.sh +26 -0
- package/templates/hooks/python-pre-commit.sh +51 -0
- package/templates/hooks/python-pre-push.sh +25 -0
- package/templates/hooks/ruby-pre-commit.sh +33 -0
- package/templates/hooks/ruby-pre-push.sh +32 -0
- package/templates/hooks/rust-pre-commit.sh +30 -0
- package/templates/hooks/rust-pre-push.sh +30 -0
- package/templates/hooks/scala-pre-commit.sh +32 -0
- package/templates/hooks/scala-pre-push.sh +24 -0
- package/templates/hooks/swift-pre-commit.sh +25 -0
- package/templates/hooks/swift-pre-push.sh +23 -0
- package/templates/hooks/typescript-pre-commit.sh +37 -0
- package/templates/hooks/typescript-pre-push.sh +36 -0
- package/templates/ides/COPILOT.md +37 -0
- package/templates/ides/CURSOR.md +43 -0
- package/templates/ides/JETBRAINS_AI.md +35 -0
- package/templates/ides/REPLIT.md +36 -0
- package/templates/ides/TABNINE.md +29 -0
- package/templates/ides/VSCODE.md +40 -0
- package/templates/ides/WINDSURF.md +36 -0
- package/templates/ides/ZED.md +32 -0
- package/templates/languages/ADA.md +58 -0
- package/templates/languages/C.md +333 -0
- package/templates/languages/CPP.md +743 -0
- package/templates/languages/CSHARP.md +417 -0
- package/templates/languages/DART.md +332 -0
- package/templates/languages/ELIXIR.md +454 -0
- package/templates/languages/ERLANG.md +361 -0
- package/templates/languages/GO.md +645 -0
- package/templates/languages/HASKELL.md +177 -0
- package/templates/languages/JAVA.md +607 -0
- package/templates/languages/JAVASCRIPT.md +631 -0
- package/templates/languages/JULIA.md +97 -0
- package/templates/languages/KOTLIN.md +511 -0
- package/templates/languages/LISP.md +100 -0
- package/templates/languages/LUA.md +74 -0
- package/templates/languages/OBJECTIVEC.md +90 -0
- package/templates/languages/PHP.md +416 -0
- package/templates/languages/PYTHON.md +682 -0
- package/templates/languages/R.md +350 -0
- package/templates/languages/RUBY.md +421 -0
- package/templates/languages/RUST.md +477 -0
- package/templates/languages/SAS.md +73 -0
- package/templates/languages/SCALA.md +348 -0
- package/templates/languages/SOLIDITY.md +580 -0
- package/templates/languages/SQL.md +137 -0
- package/templates/languages/SWIFT.md +466 -0
- package/templates/languages/TYPESCRIPT.md +591 -0
- package/templates/languages/ZIG.md +265 -0
- package/templates/modules/ATLASSIAN.md +255 -0
- package/templates/modules/CONTEXT7.md +54 -0
- package/templates/modules/FIGMA.md +267 -0
- package/templates/modules/GITHUB_MCP.md +64 -0
- package/templates/modules/GRAFANA.md +328 -0
- package/templates/modules/NOTION.md +247 -0
- package/templates/modules/PLAYWRIGHT.md +90 -0
- package/templates/modules/RULEBOOK_MCP.md +156 -0
- package/templates/modules/SERENA.md +337 -0
- package/templates/modules/SUPABASE.md +223 -0
- package/templates/modules/SYNAP.md +69 -0
- package/templates/modules/VECTORIZER.md +63 -0
- package/templates/services/AZURE_BLOB.md +184 -0
- package/templates/services/CASSANDRA.md +239 -0
- package/templates/services/DYNAMODB.md +308 -0
- package/templates/services/ELASTICSEARCH.md +347 -0
- package/templates/services/GCS.md +178 -0
- package/templates/services/INFLUXDB.md +265 -0
- package/templates/services/KAFKA.md +341 -0
- package/templates/services/MARIADB.md +183 -0
- package/templates/services/MEMCACHED.md +242 -0
- package/templates/services/MINIO.md +201 -0
- package/templates/services/MONGODB.md +268 -0
- package/templates/services/MYSQL.md +358 -0
- package/templates/services/NEO4J.md +247 -0
- package/templates/services/ORACLE.md +290 -0
- package/templates/services/POSTGRESQL.md +326 -0
- package/templates/services/RABBITMQ.md +286 -0
- package/templates/services/REDIS.md +292 -0
- package/templates/services/S3.md +298 -0
- package/templates/services/SQLITE.md +294 -0
- package/templates/services/SQLSERVER.md +294 -0
- package/templates/workflows/codespell.yml +31 -0
- package/templates/workflows/cpp-lint.yml +47 -0
- package/templates/workflows/cpp-publish.yml +119 -0
- package/templates/workflows/cpp-test.yml +77 -0
- package/templates/workflows/dotnet-lint.yml +29 -0
- package/templates/workflows/dotnet-publish.yml +40 -0
- package/templates/workflows/dotnet-test.yml +41 -0
- package/templates/workflows/elixir-lint.yml +45 -0
- package/templates/workflows/elixir-publish.yml +49 -0
- package/templates/workflows/elixir-test.yml +54 -0
- package/templates/workflows/erlang-lint.yml +47 -0
- package/templates/workflows/erlang-test.yml +62 -0
- package/templates/workflows/go-lint.yml +39 -0
- package/templates/workflows/go-publish.yml +95 -0
- package/templates/workflows/go-test.yml +59 -0
- package/templates/workflows/java-lint.yml +60 -0
- package/templates/workflows/java-publish.yml +120 -0
- package/templates/workflows/java-test.yml +85 -0
- package/templates/workflows/kotlin-lint.yml +34 -0
- package/templates/workflows/kotlin-publish.yml +56 -0
- package/templates/workflows/kotlin-test.yml +48 -0
- package/templates/workflows/php-lint.yml +39 -0
- package/templates/workflows/php-publish.yml +50 -0
- package/templates/workflows/php-test.yml +54 -0
- package/templates/workflows/python-lint.yml +47 -0
- package/templates/workflows/python-publish.yml +91 -0
- package/templates/workflows/python-test.yml +59 -0
- package/templates/workflows/rust-lint.yml +54 -0
- package/templates/workflows/rust-publish.yml +66 -0
- package/templates/workflows/rust-test.yml +75 -0
- package/templates/workflows/solidity-lint.yml +41 -0
- package/templates/workflows/solidity-test.yml +47 -0
- package/templates/workflows/swift-lint.yml +32 -0
- package/templates/workflows/swift-publish.yml +58 -0
- package/templates/workflows/swift-test.yml +44 -0
- package/templates/workflows/typescript-lint.yml +61 -0
- package/templates/workflows/typescript-publish.yml +60 -0
- package/templates/workflows/typescript-test.yml +73 -0
- package/templates/workflows/zig-lint.yml +27 -0
- package/templates/workflows/zig-test.yml +40 -0
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
<!-- TYPESCRIPT:START -->
|
|
2
|
+
# TypeScript Project Rules
|
|
3
|
+
|
|
4
|
+
## Agent Automation Commands
|
|
5
|
+
|
|
6
|
+
**CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Complete quality check sequence:
|
|
10
|
+
npm run type-check # Type checking
|
|
11
|
+
npm run lint # Linting (0 warnings required)
|
|
12
|
+
npm run format # Code formatting
|
|
13
|
+
npm test # All tests (100% pass required)
|
|
14
|
+
npm run test:coverage # Coverage check (95%+ required)
|
|
15
|
+
npm run build # Build verification
|
|
16
|
+
|
|
17
|
+
# Security audit:
|
|
18
|
+
npm audit --production # Vulnerability scan
|
|
19
|
+
npm outdated # Check outdated deps (informational)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## TypeScript Configuration
|
|
23
|
+
|
|
24
|
+
**CRITICAL**: Use TypeScript 5.3+ with strict mode enabled.
|
|
25
|
+
|
|
26
|
+
- **Version**: TypeScript 5.3+
|
|
27
|
+
- **Mode**: Strict mode enabled
|
|
28
|
+
- **Target**: ES2022 or later
|
|
29
|
+
- **Module**: ESNext with Node16 module resolution
|
|
30
|
+
|
|
31
|
+
### tsconfig.json Requirements
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"compilerOptions": {
|
|
36
|
+
"target": "ES2022",
|
|
37
|
+
"module": "ESNext",
|
|
38
|
+
"moduleResolution": "node",
|
|
39
|
+
"strict": true,
|
|
40
|
+
"esModuleInterop": true,
|
|
41
|
+
"skipLibCheck": true,
|
|
42
|
+
"forceConsistentCasingInFileNames": true,
|
|
43
|
+
"resolveJsonModule": true,
|
|
44
|
+
"declaration": true,
|
|
45
|
+
"declarationMap": true,
|
|
46
|
+
"sourceMap": true,
|
|
47
|
+
"noUnusedLocals": true,
|
|
48
|
+
"noUnusedParameters": true,
|
|
49
|
+
"noImplicitReturns": true,
|
|
50
|
+
"noFallthroughCasesInSwitch": true
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Code Quality Standards
|
|
56
|
+
|
|
57
|
+
### Mandatory Quality Checks
|
|
58
|
+
|
|
59
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
60
|
+
|
|
61
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
65
|
+
|
|
66
|
+
# 1. Type check (matches workflow)
|
|
67
|
+
npm run type-check # or: tsc --noEmit
|
|
68
|
+
|
|
69
|
+
# 2. Lint (MUST pass with no warnings - matches workflow)
|
|
70
|
+
npm run lint
|
|
71
|
+
|
|
72
|
+
# 3. Format check (matches workflow - use same command as CI)
|
|
73
|
+
npx prettier --check 'src/**/*.ts' 'tests/**/*.ts'
|
|
74
|
+
|
|
75
|
+
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
76
|
+
npm test
|
|
77
|
+
|
|
78
|
+
# 5. Build (MUST succeed - matches workflow)
|
|
79
|
+
npm run build
|
|
80
|
+
|
|
81
|
+
# 6. Check coverage (MUST meet threshold)
|
|
82
|
+
npm run test:coverage
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
86
|
+
|
|
87
|
+
**Why This Matters:**
|
|
88
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
89
|
+
- CI/CD workflows will fail if commands don't match
|
|
90
|
+
- Example: Using `prettier --write` locally but `prettier --check` in CI = failure
|
|
91
|
+
- Example: Forgetting `npm run build` locally = CI build failures
|
|
92
|
+
|
|
93
|
+
### Linting
|
|
94
|
+
|
|
95
|
+
- Use ESLint with TypeScript plugin
|
|
96
|
+
- Configuration in `eslint.config.js` or `.eslintrc.json`
|
|
97
|
+
- Must pass with no warnings: `eslint src/**/*.ts`
|
|
98
|
+
- Fix automatically when possible: `eslint src/**/*.ts --fix`
|
|
99
|
+
|
|
100
|
+
Example ESLint config:
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"extends": [
|
|
104
|
+
"eslint:recommended",
|
|
105
|
+
"plugin:@typescript-eslint/recommended"
|
|
106
|
+
],
|
|
107
|
+
"parser": "@typescript-eslint/parser",
|
|
108
|
+
"plugins": ["@typescript-eslint"],
|
|
109
|
+
"rules": {
|
|
110
|
+
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
111
|
+
"@typescript-eslint/explicit-function-return-type": "warn",
|
|
112
|
+
"@typescript-eslint/no-explicit-any": "warn"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Formatting
|
|
118
|
+
|
|
119
|
+
- Use Prettier for code formatting
|
|
120
|
+
- Configuration in `.prettierrc.json`
|
|
121
|
+
- Integrate with ESLint for consistency
|
|
122
|
+
- Format before committing: `prettier --write "src/**/*.ts"`
|
|
123
|
+
|
|
124
|
+
Example Prettier config:
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"semi": true,
|
|
128
|
+
"trailingComma": "es5",
|
|
129
|
+
"singleQuote": true,
|
|
130
|
+
"printWidth": 100,
|
|
131
|
+
"tabWidth": 2
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Testing
|
|
136
|
+
|
|
137
|
+
- **Framework**: Vitest (recommended) or Jest
|
|
138
|
+
- **Location**: `/tests` directory or co-located `*.test.ts` files
|
|
139
|
+
- **Coverage**: Must meet project threshold (default 95%)
|
|
140
|
+
- **Watch Mode**: Use `vitest` or `vitest --watch` for development
|
|
141
|
+
- **CI Mode**: **CRITICAL** - Default `npm test` command MUST include `--run` flag
|
|
142
|
+
- This prevents Vitest from entering watch mode, which never terminates
|
|
143
|
+
- In `package.json`: `"test": "vitest --run"`
|
|
144
|
+
- In CI workflows: use `npm test` (do NOT add `--run` argument)
|
|
145
|
+
- For manual development, use `npm run test:watch`
|
|
146
|
+
|
|
147
|
+
Example test structure:
|
|
148
|
+
```typescript
|
|
149
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
150
|
+
import { myFunction } from './my-module';
|
|
151
|
+
|
|
152
|
+
describe('myFunction', () => {
|
|
153
|
+
beforeEach(() => {
|
|
154
|
+
// Setup
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
afterEach(() => {
|
|
158
|
+
// Cleanup
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('should handle valid input', () => {
|
|
162
|
+
const result = myFunction('input');
|
|
163
|
+
expect(result).toBe('expected');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('should throw on invalid input', () => {
|
|
167
|
+
expect(() => myFunction('')).toThrow('Invalid input');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Test Categories: S2S and Slow Tests
|
|
173
|
+
|
|
174
|
+
**CRITICAL**: Tests must be categorized based on execution time and dependencies.
|
|
175
|
+
|
|
176
|
+
#### Test Time Limits
|
|
177
|
+
|
|
178
|
+
- **Fast Tests**: Must complete in ≤ 10-20 seconds
|
|
179
|
+
- **Slow Tests**: Any test taking > 10-20 seconds must be marked as slow
|
|
180
|
+
- **S2S Tests**: Tests requiring active server/database must be isolated and run on-demand
|
|
181
|
+
|
|
182
|
+
#### S2S (Server-to-Server) Tests
|
|
183
|
+
|
|
184
|
+
**Tests that require active servers, databases, or external services must be isolated using test tags.**
|
|
185
|
+
|
|
186
|
+
**Implementation**:
|
|
187
|
+
|
|
188
|
+
1. **Use Vitest test tags**:
|
|
189
|
+
```typescript
|
|
190
|
+
import { describe, it, expect } from 'vitest';
|
|
191
|
+
|
|
192
|
+
// Regular fast test (always runs)
|
|
193
|
+
describe('local computation', () => {
|
|
194
|
+
it('should compute correctly', () => {
|
|
195
|
+
// Fast test, no external dependencies
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// S2S test (only runs with --grep s2s)
|
|
200
|
+
describe('database integration', () => {
|
|
201
|
+
it.skipIf(!process.env.RUN_S2S_TESTS)('should connect to database', async () => {
|
|
202
|
+
// Requires active database server
|
|
203
|
+
const db = await connectToDatabase();
|
|
204
|
+
// ... test implementation
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Alternative: Use Vitest tags
|
|
209
|
+
describe('API integration', () => {
|
|
210
|
+
it.tags('s2s')('should call external API', async () => {
|
|
211
|
+
// Requires active API server
|
|
212
|
+
const client = createApiClient();
|
|
213
|
+
// ... test implementation
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
2. **Configure `vitest.config.ts`**:
|
|
219
|
+
```typescript
|
|
220
|
+
import { defineConfig } from 'vitest/config';
|
|
221
|
+
|
|
222
|
+
export default defineConfig({
|
|
223
|
+
test: {
|
|
224
|
+
// Exclude S2S tests by default
|
|
225
|
+
exclude: ['**/node_modules/**', '**/dist/**', '**/*.s2s.test.ts'],
|
|
226
|
+
// Include S2S tests when explicitly requested
|
|
227
|
+
include: process.env.RUN_S2S_TESTS
|
|
228
|
+
? ['**/*.{test,spec}.ts', '**/*.s2s.test.ts']
|
|
229
|
+
: ['**/*.{test,spec}.ts'],
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
3. **Run tests**:
|
|
235
|
+
```bash
|
|
236
|
+
# Regular tests (excludes S2S)
|
|
237
|
+
npm test
|
|
238
|
+
|
|
239
|
+
# Include S2S tests (requires active servers)
|
|
240
|
+
RUN_S2S_TESTS=1 npm test
|
|
241
|
+
|
|
242
|
+
# Run only S2S tests
|
|
243
|
+
npm test -- --grep s2s
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
#### Slow Tests
|
|
247
|
+
|
|
248
|
+
**Tests that take > 10-20 seconds must be marked and run separately.**
|
|
249
|
+
|
|
250
|
+
**Implementation**:
|
|
251
|
+
|
|
252
|
+
1. **Mark slow tests with tags or separate files**:
|
|
253
|
+
```typescript
|
|
254
|
+
import { describe, it, expect } from 'vitest';
|
|
255
|
+
|
|
256
|
+
// Fast test (always runs)
|
|
257
|
+
describe('quick operations', () => {
|
|
258
|
+
it('should complete quickly', () => {
|
|
259
|
+
// Completes in < 1 second
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// Slow test (only runs with --grep slow)
|
|
264
|
+
describe('heavy computation', () => {
|
|
265
|
+
it.tags('slow')('should process large dataset', async () => {
|
|
266
|
+
// Takes 30+ seconds
|
|
267
|
+
// Heavy processing, large dataset, etc.
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Or use separate file: `large-file.test.slow.ts`
|
|
272
|
+
describe('large file processing', () => {
|
|
273
|
+
it('should process large files', async () => {
|
|
274
|
+
// Processes large files, takes > 20 seconds
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
2. **Configure `vitest.config.ts`**:
|
|
280
|
+
```typescript
|
|
281
|
+
export default defineConfig({
|
|
282
|
+
test: {
|
|
283
|
+
// Exclude slow tests by default
|
|
284
|
+
exclude: ['**/node_modules/**', '**/dist/**', '**/*.slow.test.ts'],
|
|
285
|
+
// Include slow tests when explicitly requested
|
|
286
|
+
include: process.env.RUN_SLOW_TESTS
|
|
287
|
+
? ['**/*.{test,spec}.ts', '**/*.slow.test.ts']
|
|
288
|
+
: ['**/*.{test,spec}.ts'],
|
|
289
|
+
// Set timeout for slow tests
|
|
290
|
+
testTimeout: process.env.RUN_SLOW_TESTS ? 60000 : 20000,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
3. **Run tests**:
|
|
296
|
+
```bash
|
|
297
|
+
# Regular tests (excludes slow)
|
|
298
|
+
npm test
|
|
299
|
+
|
|
300
|
+
# Include slow tests
|
|
301
|
+
RUN_SLOW_TESTS=1 npm test
|
|
302
|
+
|
|
303
|
+
# Run only slow tests
|
|
304
|
+
npm test -- --grep slow
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
4. **Add npm scripts in `package.json`**:
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"scripts": {
|
|
311
|
+
"test": "vitest --run",
|
|
312
|
+
"test:watch": "vitest",
|
|
313
|
+
"test:s2s": "RUN_S2S_TESTS=1 vitest --run",
|
|
314
|
+
"test:slow": "RUN_SLOW_TESTS=1 vitest --run",
|
|
315
|
+
"test:all": "RUN_S2S_TESTS=1 RUN_SLOW_TESTS=1 vitest --run"
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### Best Practices
|
|
321
|
+
|
|
322
|
+
- ✅ **Always run fast tests** in CI/CD by default
|
|
323
|
+
- ✅ **Isolate S2S tests** - never run them in standard test suite
|
|
324
|
+
- ✅ **Mark slow tests** - prevent CI/CD timeouts
|
|
325
|
+
- ✅ **Document requirements** - specify which servers/services are needed for S2S tests
|
|
326
|
+
- ✅ **Use timeouts** - Set appropriate timeouts: `it('test', async () => { ... }, { timeout: 30000 })`
|
|
327
|
+
- ✅ **Use test tags** - Vitest tags (`it.tags('s2s')`) or Jest tags (`it.tags(['s2s'])`)
|
|
328
|
+
- ❌ **Never mix** fast and slow/S2S tests in same test run
|
|
329
|
+
- ❌ **Never require** external services for standard test suite
|
|
330
|
+
- ❌ **Never exceed** 10-20 seconds for regular tests
|
|
331
|
+
|
|
332
|
+
## Package Management
|
|
333
|
+
|
|
334
|
+
**CRITICAL**: Use consistent package manager across team.
|
|
335
|
+
|
|
336
|
+
- **Default**: npm (most compatible, built-in)
|
|
337
|
+
- **Alternative**: pnpm (fast, disk-efficient) or yarn
|
|
338
|
+
- **Lockfile**: Always commit lockfile (`package-lock.json`, `pnpm-lock.yaml`, or `yarn.lock`)
|
|
339
|
+
- **Workspaces**: Use for monorepos
|
|
340
|
+
- **CI/CD**: Update GitHub Actions workflows to match your package manager (see workflow comments)
|
|
341
|
+
|
|
342
|
+
### Dependencies
|
|
343
|
+
|
|
344
|
+
1. **Check for latest versions**:
|
|
345
|
+
- Use Context7 MCP tool if available
|
|
346
|
+
- Check npm registry: `npm view <package> versions`
|
|
347
|
+
- Review changelog for breaking changes
|
|
348
|
+
|
|
349
|
+
2. **Dependency Guidelines**:
|
|
350
|
+
- ✅ Use exact versions for applications (`"1.2.3"`)
|
|
351
|
+
- ✅ Use semver for libraries (`"^1.2.3"`)
|
|
352
|
+
- ✅ Keep dependencies updated regularly
|
|
353
|
+
- ✅ Use `npm audit` or `pnpm audit` for security
|
|
354
|
+
- ❌ Don't use deprecated packages
|
|
355
|
+
- ❌ Don't add unnecessary dependencies
|
|
356
|
+
|
|
357
|
+
3. **Document new dependencies**:
|
|
358
|
+
- Update CHANGELOG.md
|
|
359
|
+
- Document why dependency was added
|
|
360
|
+
- Note any peer dependencies
|
|
361
|
+
|
|
362
|
+
## Type Safety
|
|
363
|
+
|
|
364
|
+
- **No `any`**: Avoid `any` type - use `unknown` and type guards
|
|
365
|
+
- **Strict null checks**: Handle null/undefined explicitly
|
|
366
|
+
- **Type assertions**: Minimize use of `as` - prefer type guards
|
|
367
|
+
- **Generics**: Use for reusable type-safe code
|
|
368
|
+
|
|
369
|
+
Example type-safe code:
|
|
370
|
+
```typescript
|
|
371
|
+
// Good: Type guard
|
|
372
|
+
function isString(value: unknown): value is string {
|
|
373
|
+
return typeof value === 'string';
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function process(input: unknown): string {
|
|
377
|
+
if (isString(input)) {
|
|
378
|
+
return input.toUpperCase();
|
|
379
|
+
}
|
|
380
|
+
throw new Error('Invalid input');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Bad: Type assertion
|
|
384
|
+
function processUnsafe(input: unknown): string {
|
|
385
|
+
return (input as string).toUpperCase(); // Runtime error if not string
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Error Handling
|
|
390
|
+
|
|
391
|
+
- Create custom error classes
|
|
392
|
+
- Use type guards for error checking
|
|
393
|
+
- Document errors in JSDoc/TSDoc
|
|
394
|
+
- Never swallow errors silently
|
|
395
|
+
|
|
396
|
+
Example:
|
|
397
|
+
```typescript
|
|
398
|
+
export class ValidationError extends Error {
|
|
399
|
+
constructor(
|
|
400
|
+
message: string,
|
|
401
|
+
public readonly field: string
|
|
402
|
+
) {
|
|
403
|
+
super(message);
|
|
404
|
+
this.name = 'ValidationError';
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export function validate(data: unknown): Data {
|
|
409
|
+
if (!isValidData(data)) {
|
|
410
|
+
throw new ValidationError('Invalid data structure', 'data');
|
|
411
|
+
}
|
|
412
|
+
return data;
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
## Documentation
|
|
417
|
+
|
|
418
|
+
- **JSDoc/TSDoc**: Document public APIs
|
|
419
|
+
- **Examples**: Include usage examples
|
|
420
|
+
- **Type exports**: Export types for library consumers
|
|
421
|
+
- **README**: Include API documentation
|
|
422
|
+
|
|
423
|
+
Example:
|
|
424
|
+
```typescript
|
|
425
|
+
/**
|
|
426
|
+
* Processes the input data and returns a formatted result.
|
|
427
|
+
*
|
|
428
|
+
* @param input - The input string to process
|
|
429
|
+
* @param options - Optional processing options
|
|
430
|
+
* @returns The processed string in uppercase
|
|
431
|
+
* @throws {ValidationError} If input is empty
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* ```typescript
|
|
435
|
+
* const result = process('hello', { trim: true });
|
|
436
|
+
* console.log(result); // 'HELLO'
|
|
437
|
+
* ```
|
|
438
|
+
*/
|
|
439
|
+
export function process(
|
|
440
|
+
input: string,
|
|
441
|
+
options?: ProcessOptions
|
|
442
|
+
): string {
|
|
443
|
+
// Implementation
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
## Project Structure
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
project/
|
|
451
|
+
├── package.json # Package manifest
|
|
452
|
+
├── tsconfig.json # TypeScript config
|
|
453
|
+
├── vitest.config.ts # Test config
|
|
454
|
+
├── README.md # Project overview (allowed in root)
|
|
455
|
+
├── CHANGELOG.md # Version history (allowed in root)
|
|
456
|
+
├── AGENTS.md # AI assistant rules (allowed in root)
|
|
457
|
+
├── LICENSE # Project license (allowed in root)
|
|
458
|
+
├── CONTRIBUTING.md # Contribution guidelines (allowed in root)
|
|
459
|
+
├── CODE_OF_CONDUCT.md # Code of conduct (allowed in root)
|
|
460
|
+
├── SECURITY.md # Security policy (allowed in root)
|
|
461
|
+
├── src/
|
|
462
|
+
│ ├── index.ts # Main entry point
|
|
463
|
+
│ ├── types.ts # Type definitions
|
|
464
|
+
│ └── ...
|
|
465
|
+
├── tests/ # Test files
|
|
466
|
+
├── dist/ # Compiled output (gitignored)
|
|
467
|
+
└── docs/ # Project documentation
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Module System
|
|
471
|
+
|
|
472
|
+
- Use ES modules (`import`/`export`)
|
|
473
|
+
- Set `"type": "module"` in `package.json`
|
|
474
|
+
- Use `.js` extensions in imports for Node.js compatibility
|
|
475
|
+
- Configure `moduleResolution: "node"` in tsconfig.json
|
|
476
|
+
|
|
477
|
+
Example:
|
|
478
|
+
```typescript
|
|
479
|
+
// Good: ES modules with .js extension
|
|
480
|
+
import { myFunction } from './my-module.js';
|
|
481
|
+
|
|
482
|
+
export { myFunction };
|
|
483
|
+
export default class MyClass {}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## CI/CD Requirements
|
|
487
|
+
|
|
488
|
+
**CRITICAL**: GitHub Actions `cache: 'npm'` requires `package-lock.json` to be committed.
|
|
489
|
+
|
|
490
|
+
- **Lockfile Requirement**: Remove `package-lock.json` from `.gitignore`
|
|
491
|
+
- **Cache Strategy**: Use `cache: 'npm'` in `setup-node` action
|
|
492
|
+
- **Install Command**: Use `npm ci` (not `npm install`) for reproducible builds
|
|
493
|
+
- **Error Prevention**: Without committed lockfile, you'll get:
|
|
494
|
+
```
|
|
495
|
+
Error: Dependencies lock file is not found in repository
|
|
496
|
+
Supported file patterns: package-lock.json,npm-shrinkwrap.json,yarn.lock
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
Must include GitHub Actions workflows for:
|
|
500
|
+
|
|
501
|
+
1. **Testing** (`typescript-test.yml`):
|
|
502
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
503
|
+
- Use Vitest for fast execution
|
|
504
|
+
- Upload coverage reports
|
|
505
|
+
- **MUST**: Commit package-lock.json for caching
|
|
506
|
+
|
|
507
|
+
2. **Linting** (`typescript-lint.yml`):
|
|
508
|
+
- Type check: `tsc --noEmit`
|
|
509
|
+
- ESLint: `eslint src/**/*.ts`
|
|
510
|
+
- Prettier: `prettier --check "src/**/*.ts"`
|
|
511
|
+
- **MUST**: Commit package-lock.json for caching
|
|
512
|
+
|
|
513
|
+
3. **Build** (`typescript-build.yml`):
|
|
514
|
+
- Build: `npm run build`
|
|
515
|
+
- Verify no type errors
|
|
516
|
+
- Check output artifacts
|
|
517
|
+
- **MUST**: Commit package-lock.json for caching
|
|
518
|
+
|
|
519
|
+
## Package Publication
|
|
520
|
+
|
|
521
|
+
### Publishing to npm
|
|
522
|
+
|
|
523
|
+
**Prerequisites:**
|
|
524
|
+
1. Create npm account at https://www.npmjs.com
|
|
525
|
+
2. Generate npm token (Account Settings → Access Tokens → Generate New Token)
|
|
526
|
+
3. Add `NPM_TOKEN` to GitHub repository secrets
|
|
527
|
+
|
|
528
|
+
**package.json Configuration:**
|
|
529
|
+
|
|
530
|
+
```json
|
|
531
|
+
{
|
|
532
|
+
"name": "@your-org/package-name",
|
|
533
|
+
"version": "1.0.0",
|
|
534
|
+
"description": "Package description",
|
|
535
|
+
"main": "./dist/index.js",
|
|
536
|
+
"types": "./dist/index.d.ts",
|
|
537
|
+
"type": "module",
|
|
538
|
+
"exports": {
|
|
539
|
+
".": {
|
|
540
|
+
"types": "./dist/index.d.ts",
|
|
541
|
+
"import": "./dist/index.js"
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"files": [
|
|
545
|
+
"dist",
|
|
546
|
+
"README.md",
|
|
547
|
+
"LICENSE"
|
|
548
|
+
],
|
|
549
|
+
"scripts": {
|
|
550
|
+
"prepublishOnly": "npm run build && npm test"
|
|
551
|
+
},
|
|
552
|
+
"keywords": ["your", "keywords"],
|
|
553
|
+
"author": "Your Name",
|
|
554
|
+
"license": "MIT",
|
|
555
|
+
"repository": {
|
|
556
|
+
"type": "git",
|
|
557
|
+
"url": "https://github.com/your-org/package-name"
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
**Publishing Workflow:**
|
|
563
|
+
|
|
564
|
+
1. Update version: `npm version patch|minor|major`
|
|
565
|
+
2. Create release tag: `git push --tags`
|
|
566
|
+
3. GitHub Actions automatically publishes to npm
|
|
567
|
+
4. Or manual publish: `npm publish --access public`
|
|
568
|
+
|
|
569
|
+
**Publishing Checklist:**
|
|
570
|
+
|
|
571
|
+
- ✅ All tests passing
|
|
572
|
+
- ✅ Code linted and formatted
|
|
573
|
+
- ✅ Version updated in package.json
|
|
574
|
+
- ✅ CHANGELOG.md updated
|
|
575
|
+
- ✅ README.md up to date
|
|
576
|
+
- ✅ Type declarations generated
|
|
577
|
+
- ✅ Package size reasonable (`npm pack` to check)
|
|
578
|
+
- ✅ .npmignore or package.json "files" configured
|
|
579
|
+
- ✅ Provenance enabled for security
|
|
580
|
+
|
|
581
|
+
**npm Provenance:**
|
|
582
|
+
|
|
583
|
+
Enable provenance for better security and transparency:
|
|
584
|
+
```bash
|
|
585
|
+
npm publish --provenance --access public
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
This links your package to its source code and build process.
|
|
589
|
+
|
|
590
|
+
<!-- TYPESCRIPT:END -->
|
|
591
|
+
|