@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,265 @@
|
|
|
1
|
+
<!-- ZIG:START -->
|
|
2
|
+
# Zig 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
|
+
zig fmt --check . # Format check
|
|
11
|
+
zig build # Build verification
|
|
12
|
+
zig build test # All tests (100% pass)
|
|
13
|
+
|
|
14
|
+
# No standard security audit tool for Zig yet
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Zig Configuration
|
|
18
|
+
|
|
19
|
+
**CRITICAL**: Use Zig 0.11+ with strict compilation and comprehensive testing.
|
|
20
|
+
|
|
21
|
+
- **Version**: Zig 0.11+
|
|
22
|
+
- **Recommended**: Zig 0.13+
|
|
23
|
+
- **Build System**: zig build (built-in)
|
|
24
|
+
- **Testing**: zig test (built-in)
|
|
25
|
+
- **Formatter**: zig fmt (built-in)
|
|
26
|
+
|
|
27
|
+
### build.zig Requirements
|
|
28
|
+
|
|
29
|
+
```zig
|
|
30
|
+
const std = @import("std");
|
|
31
|
+
|
|
32
|
+
pub fn build(b: *std.Build) void {
|
|
33
|
+
const target = b.standardTargetOptions(.{});
|
|
34
|
+
const optimize = b.standardOptimizeOption(.{});
|
|
35
|
+
|
|
36
|
+
// Library
|
|
37
|
+
const lib = b.addStaticLibrary(.{
|
|
38
|
+
.name = "your-lib",
|
|
39
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
40
|
+
.target = target,
|
|
41
|
+
.optimize = optimize,
|
|
42
|
+
});
|
|
43
|
+
b.installArtifact(lib);
|
|
44
|
+
|
|
45
|
+
// Executable
|
|
46
|
+
const exe = b.addExecutable(.{
|
|
47
|
+
.name = "your-app",
|
|
48
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
49
|
+
.target = target,
|
|
50
|
+
.optimize = optimize,
|
|
51
|
+
});
|
|
52
|
+
b.installArtifact(exe);
|
|
53
|
+
|
|
54
|
+
// Tests
|
|
55
|
+
const main_tests = b.addTest(.{
|
|
56
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
57
|
+
.target = target,
|
|
58
|
+
.optimize = optimize,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const run_main_tests = b.addRunArtifact(main_tests);
|
|
62
|
+
const test_step = b.step("test", "Run library tests");
|
|
63
|
+
test_step.dependOn(&run_main_tests.step);
|
|
64
|
+
|
|
65
|
+
// Run command
|
|
66
|
+
const run_cmd = b.addRunArtifact(exe);
|
|
67
|
+
run_cmd.step.dependOn(b.getInstallStep());
|
|
68
|
+
if (b.args) |args| {
|
|
69
|
+
run_cmd.addArgs(args);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const run_step = b.step("run", "Run the app");
|
|
73
|
+
run_step.dependOn(&run_cmd.step);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Code Quality Standards
|
|
78
|
+
|
|
79
|
+
### Mandatory Quality Checks
|
|
80
|
+
|
|
81
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
82
|
+
|
|
83
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
87
|
+
|
|
88
|
+
# 1. Format check (matches workflow)
|
|
89
|
+
zig fmt --check src/ tests/
|
|
90
|
+
|
|
91
|
+
# 2. Build (MUST pass - matches workflow)
|
|
92
|
+
zig build -Doptimize=ReleaseFast
|
|
93
|
+
|
|
94
|
+
# 3. Build with all optimizations (matches workflow)
|
|
95
|
+
zig build -Doptimize=ReleaseSmall
|
|
96
|
+
zig build -Doptimize=ReleaseSafe
|
|
97
|
+
|
|
98
|
+
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
99
|
+
zig build test
|
|
100
|
+
|
|
101
|
+
# 5. Test with different targets (matches workflow)
|
|
102
|
+
zig build test -Dtarget=x86_64-linux
|
|
103
|
+
zig build test -Dtarget=x86_64-windows
|
|
104
|
+
zig build test -Dtarget=aarch64-macos
|
|
105
|
+
|
|
106
|
+
# 6. Check for memory leaks (matches workflow)
|
|
107
|
+
zig build test -Doptimize=Debug --summary all
|
|
108
|
+
|
|
109
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
113
|
+
|
|
114
|
+
**Why This Matters:**
|
|
115
|
+
- Running different commands locally than in CI causes build failures
|
|
116
|
+
- Zig's compile-time guarantees only work if all checks pass
|
|
117
|
+
- Example: Using `zig fmt src/` locally but `zig fmt --check src/` in CI = failure
|
|
118
|
+
- Example: Only testing Debug builds locally = Release builds fail in CI
|
|
119
|
+
- Example: Not testing cross-compilation = deployment fails on target platform
|
|
120
|
+
|
|
121
|
+
### Testing
|
|
122
|
+
|
|
123
|
+
- **Framework**: Built-in `zig test`
|
|
124
|
+
- **Location**: Tests can be inline or in `/tests`
|
|
125
|
+
- **Coverage**: Comprehensive test coverage required
|
|
126
|
+
- **Memory**: No leaks allowed (valgrind clean)
|
|
127
|
+
|
|
128
|
+
Example test structure:
|
|
129
|
+
```zig
|
|
130
|
+
const std = @import("std");
|
|
131
|
+
const testing = std.testing;
|
|
132
|
+
const DataProcessor = @import("processor.zig").DataProcessor;
|
|
133
|
+
|
|
134
|
+
test "DataProcessor: basic functionality" {
|
|
135
|
+
var processor = DataProcessor.init(0.5);
|
|
136
|
+
defer processor.deinit();
|
|
137
|
+
|
|
138
|
+
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
139
|
+
const result = try processor.process(&input);
|
|
140
|
+
defer testing.allocator.free(result);
|
|
141
|
+
|
|
142
|
+
try testing.expect(result.len > 0);
|
|
143
|
+
try testing.expectEqual(@as(usize, 3), result.len);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
test "DataProcessor: handles empty input" {
|
|
147
|
+
var processor = DataProcessor.init(0.5);
|
|
148
|
+
defer processor.deinit();
|
|
149
|
+
|
|
150
|
+
const input = [_]i32{};
|
|
151
|
+
const result = try processor.process(&input);
|
|
152
|
+
defer testing.allocator.free(result);
|
|
153
|
+
|
|
154
|
+
try testing.expectEqual(@as(usize, 0), result.len);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
test "DataProcessor: memory management" {
|
|
158
|
+
// Test that all allocations are freed
|
|
159
|
+
const allocator = testing.allocator;
|
|
160
|
+
|
|
161
|
+
var processor = try DataProcessor.initWithAllocator(allocator, 0.5);
|
|
162
|
+
defer processor.deinit();
|
|
163
|
+
|
|
164
|
+
const input = try allocator.alloc(i32, 1000);
|
|
165
|
+
defer allocator.free(input);
|
|
166
|
+
|
|
167
|
+
for (input, 0..) |*item, i| {
|
|
168
|
+
item.* = @intCast(i);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const result = try processor.process(input);
|
|
172
|
+
defer allocator.free(result);
|
|
173
|
+
|
|
174
|
+
// If we reach here without leaks, test passes
|
|
175
|
+
try testing.expect(result.len > 0);
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Memory Safety
|
|
180
|
+
|
|
181
|
+
**CRITICAL**: Zig provides compile-time safety - use it!
|
|
182
|
+
|
|
183
|
+
```zig
|
|
184
|
+
// ✅ GOOD: Safe memory management
|
|
185
|
+
const std = @import("std");
|
|
186
|
+
|
|
187
|
+
pub fn processData(allocator: std.mem.Allocator, input: []const i32) ![]i32 {
|
|
188
|
+
var result = std.ArrayList(i32).init(allocator);
|
|
189
|
+
defer result.deinit(); // Always cleanup!
|
|
190
|
+
|
|
191
|
+
for (input) |value| {
|
|
192
|
+
if (value > 0) {
|
|
193
|
+
try result.append(value * 2);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return result.toOwnedSlice();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Usage with proper cleanup
|
|
201
|
+
pub fn main() !void {
|
|
202
|
+
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
203
|
+
defer _ = gpa.deinit();
|
|
204
|
+
|
|
205
|
+
const allocator = gpa.allocator();
|
|
206
|
+
|
|
207
|
+
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
208
|
+
const result = try processData(allocator, &input);
|
|
209
|
+
defer allocator.free(result); // Free returned memory!
|
|
210
|
+
|
|
211
|
+
for (result) |value| {
|
|
212
|
+
std.debug.print("{}\n", .{value});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ❌ BAD: Memory leaks
|
|
217
|
+
pub fn processDataLeaky(allocator: std.mem.Allocator) ![]i32 {
|
|
218
|
+
var result = std.ArrayList(i32).init(allocator);
|
|
219
|
+
// Missing defer result.deinit()!
|
|
220
|
+
|
|
221
|
+
try result.append(42);
|
|
222
|
+
return result.toOwnedSlice(); // Leaks ArrayList memory!
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Best Practices
|
|
227
|
+
|
|
228
|
+
### DO's ✅
|
|
229
|
+
|
|
230
|
+
- **USE** defer for cleanup
|
|
231
|
+
- **CHECK** all error returns
|
|
232
|
+
- **VALIDATE** all inputs
|
|
233
|
+
- **TEST** with different allocators
|
|
234
|
+
- **USE** comptime for compile-time computations
|
|
235
|
+
- **PREFER** stack allocation when possible
|
|
236
|
+
- **USE** tagged unions for variants
|
|
237
|
+
- **CROSS-COMPILE** to verify portability
|
|
238
|
+
|
|
239
|
+
### DON'Ts ❌
|
|
240
|
+
|
|
241
|
+
- **NEVER** ignore error returns
|
|
242
|
+
- **NEVER** use undefined behavior
|
|
243
|
+
- **NEVER** leak memory
|
|
244
|
+
- **NEVER** use @ptrCast without validation
|
|
245
|
+
- **NEVER** assume platform specifics
|
|
246
|
+
- **NEVER** skip cross-compilation tests
|
|
247
|
+
- **NEVER** use global mutable state
|
|
248
|
+
|
|
249
|
+
## CI/CD Requirements
|
|
250
|
+
|
|
251
|
+
Must include GitHub Actions workflows:
|
|
252
|
+
|
|
253
|
+
1. **Testing** (`zig-test.yml`):
|
|
254
|
+
- Test on Linux, Windows, macOS
|
|
255
|
+
- Test with Debug, ReleaseSafe, ReleaseFast, ReleaseSmall
|
|
256
|
+
- Cross-compilation tests
|
|
257
|
+
- Memory leak detection
|
|
258
|
+
|
|
259
|
+
2. **Linting** (`zig-lint.yml`):
|
|
260
|
+
- zig fmt --check
|
|
261
|
+
- Build verification
|
|
262
|
+
- All optimize modes
|
|
263
|
+
|
|
264
|
+
<!-- ZIG:END -->
|
|
265
|
+
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
<!-- ATLASSIAN:START -->
|
|
2
|
+
# Atlassian MCP Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use MCP Atlassian for Jira issues, Confluence documentation, and Bitbucket repositories.
|
|
5
|
+
|
|
6
|
+
## Jira Operations
|
|
7
|
+
|
|
8
|
+
### Issue Management
|
|
9
|
+
```typescript
|
|
10
|
+
// Create issue
|
|
11
|
+
jira.issues.createIssue({
|
|
12
|
+
fields: {
|
|
13
|
+
project: { key: 'PROJ' },
|
|
14
|
+
summary: 'Bug in authentication',
|
|
15
|
+
description: 'Users cannot login with valid credentials',
|
|
16
|
+
issuetype: { name: 'Bug' },
|
|
17
|
+
priority: { name: 'High' }
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
// Update issue
|
|
22
|
+
jira.issues.updateIssue({
|
|
23
|
+
issueIdOrKey: 'PROJ-123',
|
|
24
|
+
fields: {
|
|
25
|
+
status: { name: 'In Progress' },
|
|
26
|
+
assignee: { accountId: 'user-id' }
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
// Get issue
|
|
31
|
+
jira.issues.getIssue({ issueIdOrKey: 'PROJ-123' })
|
|
32
|
+
|
|
33
|
+
// Search issues
|
|
34
|
+
jira.issueSearch.searchForIssuesUsingJql({
|
|
35
|
+
jql: 'project = PROJ AND status = "To Do" ORDER BY priority DESC'
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// Add comment
|
|
39
|
+
jira.issueComments.addComment({
|
|
40
|
+
issueIdOrKey: 'PROJ-123',
|
|
41
|
+
body: 'Working on this issue'
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Transitions
|
|
46
|
+
```typescript
|
|
47
|
+
// Get transitions
|
|
48
|
+
const transitions = await jira.issues.getTransitions({ issueIdOrKey: 'PROJ-123' })
|
|
49
|
+
|
|
50
|
+
// Transition issue
|
|
51
|
+
jira.issues.doTransition({
|
|
52
|
+
issueIdOrKey: 'PROJ-123',
|
|
53
|
+
transition: { id: transitionId }
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Confluence Operations
|
|
58
|
+
|
|
59
|
+
### Page Management
|
|
60
|
+
```typescript
|
|
61
|
+
// Create page
|
|
62
|
+
confluence.content.createContent({
|
|
63
|
+
type: 'page',
|
|
64
|
+
title: 'API Documentation',
|
|
65
|
+
space: { key: 'DOCS' },
|
|
66
|
+
body: {
|
|
67
|
+
storage: {
|
|
68
|
+
value: '<h1>Introduction</h1><p>Content here</p>',
|
|
69
|
+
representation: 'storage'
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// Update page
|
|
75
|
+
confluence.content.updateContent({
|
|
76
|
+
id: 'page-id',
|
|
77
|
+
type: 'page',
|
|
78
|
+
title: 'Updated Title',
|
|
79
|
+
version: { number: currentVersion + 1 },
|
|
80
|
+
body: {
|
|
81
|
+
storage: {
|
|
82
|
+
value: '<p>Updated content</p>',
|
|
83
|
+
representation: 'storage'
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
// Get page
|
|
89
|
+
confluence.content.getContentById({ id: 'page-id' })
|
|
90
|
+
|
|
91
|
+
// Search
|
|
92
|
+
confluence.search.search({
|
|
93
|
+
cql: 'type=page AND space=DOCS AND title~"API"'
|
|
94
|
+
})
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Attachments
|
|
98
|
+
```typescript
|
|
99
|
+
// Add attachment
|
|
100
|
+
confluence.content.createAttachment({
|
|
101
|
+
id: 'page-id',
|
|
102
|
+
file: fileBuffer,
|
|
103
|
+
filename: 'document.pdf'
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
// Get attachments
|
|
107
|
+
confluence.content.getAttachments({ id: 'page-id' })
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Bitbucket Operations
|
|
111
|
+
|
|
112
|
+
### Repository Management
|
|
113
|
+
```typescript
|
|
114
|
+
// Get repositories
|
|
115
|
+
bitbucket.repositories.list({ workspace: 'my-workspace' })
|
|
116
|
+
|
|
117
|
+
// Get repository
|
|
118
|
+
bitbucket.repositories.get({
|
|
119
|
+
workspace: 'my-workspace',
|
|
120
|
+
repo_slug: 'my-repo'
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
// Get branches
|
|
124
|
+
bitbucket.refs.listBranches({
|
|
125
|
+
workspace: 'my-workspace',
|
|
126
|
+
repo_slug: 'my-repo'
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Pull Requests
|
|
131
|
+
```typescript
|
|
132
|
+
// Create PR
|
|
133
|
+
bitbucket.pullrequests.create({
|
|
134
|
+
workspace: 'my-workspace',
|
|
135
|
+
repo_slug: 'my-repo',
|
|
136
|
+
title: 'Add new feature',
|
|
137
|
+
source: { branch: { name: 'feature/new-feature' } },
|
|
138
|
+
destination: { branch: { name: 'main' } },
|
|
139
|
+
description: 'Implements feature X'
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
// List PRs
|
|
143
|
+
bitbucket.pullrequests.list({
|
|
144
|
+
workspace: 'my-workspace',
|
|
145
|
+
repo_slug: 'my-repo',
|
|
146
|
+
state: 'OPEN'
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// Approve PR
|
|
150
|
+
bitbucket.pullrequests.approve({
|
|
151
|
+
workspace: 'my-workspace',
|
|
152
|
+
repo_slug: 'my-repo',
|
|
153
|
+
pull_request_id: 123
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Common Patterns
|
|
158
|
+
|
|
159
|
+
### CI/CD Integration
|
|
160
|
+
```typescript
|
|
161
|
+
// Create issue on test failure
|
|
162
|
+
if (testsFailed) {
|
|
163
|
+
await jira.issues.createIssue({
|
|
164
|
+
fields: {
|
|
165
|
+
project: { key: 'PROJ' },
|
|
166
|
+
summary: `Test failure in ${testSuite}`,
|
|
167
|
+
description: `Tests failed with errors:\n${errors.join('\n')}`,
|
|
168
|
+
issuetype: { name: 'Bug' },
|
|
169
|
+
labels: ['ci-failure', 'automated']
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Documentation Sync
|
|
176
|
+
```typescript
|
|
177
|
+
// Sync CHANGELOG to Confluence
|
|
178
|
+
const changelog = fs.readFileSync('CHANGELOG.md', 'utf-8')
|
|
179
|
+
const html = markdownToConfluenceHtml(changelog)
|
|
180
|
+
|
|
181
|
+
await confluence.content.updateContent({
|
|
182
|
+
id: changelogPageId,
|
|
183
|
+
type: 'page',
|
|
184
|
+
title: 'Changelog',
|
|
185
|
+
version: { number: version + 1 },
|
|
186
|
+
body: { storage: { value: html, representation: 'storage' } }
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Sprint Planning
|
|
191
|
+
```typescript
|
|
192
|
+
// Get sprint tasks
|
|
193
|
+
const issues = await jira.issueSearch.searchForIssuesUsingJql({
|
|
194
|
+
jql: 'sprint = ACTIVE AND project = PROJ',
|
|
195
|
+
fields: ['summary', 'status', 'assignee', 'priority']
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
// Generate sprint report
|
|
199
|
+
const report = issues.issues.map(issue => ({
|
|
200
|
+
key: issue.key,
|
|
201
|
+
summary: issue.fields.summary,
|
|
202
|
+
status: issue.fields.status.name,
|
|
203
|
+
assignee: issue.fields.assignee?.displayName
|
|
204
|
+
}))
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Best Practices
|
|
208
|
+
|
|
209
|
+
✅ **DO:**
|
|
210
|
+
- Use JQL for complex Jira queries
|
|
211
|
+
- Cache project/user data
|
|
212
|
+
- Handle rate limits
|
|
213
|
+
- Use issue transitions properly
|
|
214
|
+
- Version Confluence pages correctly
|
|
215
|
+
- Link issues to commits/PRs
|
|
216
|
+
|
|
217
|
+
❌ **DON'T:**
|
|
218
|
+
- Create duplicate issues
|
|
219
|
+
- Skip issue validation
|
|
220
|
+
- Ignore rate limiting
|
|
221
|
+
- Hardcode issue keys
|
|
222
|
+
- Update without version check
|
|
223
|
+
- Store credentials in code
|
|
224
|
+
|
|
225
|
+
## Configuration
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
{
|
|
229
|
+
"mcpServers": {
|
|
230
|
+
"atlassian": {
|
|
231
|
+
"command": "npx",
|
|
232
|
+
"args": ["-y", "@modelcontextprotocol/server-atlassian"],
|
|
233
|
+
"env": {
|
|
234
|
+
"JIRA_HOST": "your-domain.atlassian.net",
|
|
235
|
+
"JIRA_EMAIL": "your-email@example.com",
|
|
236
|
+
"JIRA_API_TOKEN": "your-api-token",
|
|
237
|
+
"CONFLUENCE_HOST": "your-domain.atlassian.net",
|
|
238
|
+
"CONFLUENCE_EMAIL": "your-email@example.com",
|
|
239
|
+
"CONFLUENCE_API_TOKEN": "your-api-token",
|
|
240
|
+
"BITBUCKET_WORKSPACE": "your-workspace",
|
|
241
|
+
"BITBUCKET_USERNAME": "your-username",
|
|
242
|
+
"BITBUCKET_APP_PASSWORD": "your-app-password"
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Setup:**
|
|
250
|
+
1. Generate API token at https://id.atlassian.com/manage-profile/security/api-tokens
|
|
251
|
+
2. For Bitbucket, create app password in account settings
|
|
252
|
+
3. Never commit credentials
|
|
253
|
+
|
|
254
|
+
<!-- ATLASSIAN:END -->
|
|
255
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<!-- CONTEXT7:START -->
|
|
2
|
+
# Context7 Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use MCP Context7 to access up-to-date library documentation before adding dependencies.
|
|
5
|
+
|
|
6
|
+
## Core Functions
|
|
7
|
+
|
|
8
|
+
### 1. resolve-library-id
|
|
9
|
+
Resolve a package name to Context7-compatible library ID:
|
|
10
|
+
```
|
|
11
|
+
resolve-library-id("tokio") → "/tokio-rs/tokio"
|
|
12
|
+
resolve-library-id("react") → "/facebook/react"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 2. get-library-docs
|
|
16
|
+
Fetch documentation with optional topic filter:
|
|
17
|
+
```
|
|
18
|
+
get-library-docs("/tokio-rs/tokio", topic="async")
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
**Before adding ANY dependency:**
|
|
24
|
+
```
|
|
25
|
+
1. resolve-library-id(library_name)
|
|
26
|
+
2. get-library-docs(library_id)
|
|
27
|
+
3. Check latest version and security
|
|
28
|
+
4. Add dependency with correct version
|
|
29
|
+
5. Document choice in commit
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Before updating major version:**
|
|
33
|
+
```
|
|
34
|
+
1. get-library-docs for current version
|
|
35
|
+
2. get-library-docs for target version
|
|
36
|
+
3. Review breaking changes
|
|
37
|
+
4. Plan migration
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Best Practices
|
|
41
|
+
|
|
42
|
+
✅ **DO:**
|
|
43
|
+
- Always check Context7 before adding dependencies
|
|
44
|
+
- Use topic parameter for specific info
|
|
45
|
+
- Document version choices
|
|
46
|
+
- Review security advisories
|
|
47
|
+
|
|
48
|
+
❌ **DON'T:**
|
|
49
|
+
- Add dependencies without checking latest version
|
|
50
|
+
- Skip migration guides on major updates
|
|
51
|
+
- Ignore security warnings
|
|
52
|
+
|
|
53
|
+
<!-- CONTEXT7:END -->
|
|
54
|
+
|