@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,74 @@
|
|
|
1
|
+
<!-- LUA:START -->
|
|
2
|
+
# Lua 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
|
+
stylua --check . # Format check
|
|
11
|
+
luacheck . # Linting
|
|
12
|
+
busted # All tests (100% pass)
|
|
13
|
+
|
|
14
|
+
# No standard security audit for Lua
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Lua Configuration
|
|
18
|
+
|
|
19
|
+
**CRITICAL**: Use Lua 5.4 or LuaJIT with linting.
|
|
20
|
+
|
|
21
|
+
- **Version**: Lua 5.4 or LuaJIT 2.1+
|
|
22
|
+
- **Linter**: luacheck
|
|
23
|
+
- **Formatter**: StyLua
|
|
24
|
+
- **Testing**: busted or luaunit
|
|
25
|
+
|
|
26
|
+
## Code Quality Standards
|
|
27
|
+
|
|
28
|
+
### Mandatory Quality Checks
|
|
29
|
+
|
|
30
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows!
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
34
|
+
|
|
35
|
+
# 1. Format check (matches workflow)
|
|
36
|
+
stylua --check src/ tests/
|
|
37
|
+
|
|
38
|
+
# 2. Lint (matches workflow)
|
|
39
|
+
luacheck src/ tests/ --std luajit --no-unused-args
|
|
40
|
+
|
|
41
|
+
# 3. Run tests (matches workflow)
|
|
42
|
+
busted tests/
|
|
43
|
+
|
|
44
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Why This Matters:**
|
|
48
|
+
- Example: Using `stylua` (writes) locally but `stylua --check` in CI = failure
|
|
49
|
+
|
|
50
|
+
### Testing Example (busted)
|
|
51
|
+
|
|
52
|
+
```lua
|
|
53
|
+
describe("DataProcessor", function()
|
|
54
|
+
local processor
|
|
55
|
+
|
|
56
|
+
before_each(function()
|
|
57
|
+
processor = require("data_processor").new()
|
|
58
|
+
end)
|
|
59
|
+
|
|
60
|
+
it("processes valid input", function()
|
|
61
|
+
local result = processor:process({1, 2, 3})
|
|
62
|
+
assert.are.same({2, 4, 6}, result)
|
|
63
|
+
end)
|
|
64
|
+
|
|
65
|
+
it("handles empty input", function()
|
|
66
|
+
assert.has_no.errors(function()
|
|
67
|
+
processor:process({})
|
|
68
|
+
end)
|
|
69
|
+
end)
|
|
70
|
+
end)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
<!-- LUA:END -->
|
|
74
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!-- OBJECTIVEC:START -->
|
|
2
|
+
# Objective-C 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
|
+
xcodebuild clean build # Build verification
|
|
11
|
+
xcodebuild test -scheme YourScheme # All tests
|
|
12
|
+
# clang static analyzer runs automatically in Xcode builds
|
|
13
|
+
|
|
14
|
+
# Security audit:
|
|
15
|
+
# Use Xcode's built-in analyzer or third-party tools
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Objective-C Configuration
|
|
19
|
+
|
|
20
|
+
**CRITICAL**: Use Modern Objective-C with ARC and strict warnings.
|
|
21
|
+
|
|
22
|
+
- **Version**: Xcode 15+
|
|
23
|
+
- **ARC**: Automatic Reference Counting required
|
|
24
|
+
- **Formatter**: clang-format
|
|
25
|
+
- **Testing**: XCTest
|
|
26
|
+
- **Analyzer**: clang static analyzer
|
|
27
|
+
|
|
28
|
+
## Code Quality Standards
|
|
29
|
+
|
|
30
|
+
### Mandatory Quality Checks
|
|
31
|
+
|
|
32
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows!
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
36
|
+
|
|
37
|
+
# 1. Format check (matches workflow)
|
|
38
|
+
clang-format --dry-run --Werror **/*.{h,m}
|
|
39
|
+
|
|
40
|
+
# 2. Static analysis (matches workflow)
|
|
41
|
+
xcodebuild analyze -scheme YourScheme -sdk iphonesimulator
|
|
42
|
+
|
|
43
|
+
# 3. Build (matches workflow)
|
|
44
|
+
xcodebuild build -scheme YourScheme -sdk iphonesimulator \
|
|
45
|
+
ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
|
|
46
|
+
|
|
47
|
+
# 4. Run tests (matches workflow)
|
|
48
|
+
xcodebuild test -scheme YourScheme -sdk iphonesimulator \
|
|
49
|
+
-destination 'platform=iOS Simulator,name=iPhone 15'
|
|
50
|
+
|
|
51
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Why This Matters:**
|
|
55
|
+
- Example: Using `clang-format -i` locally but `--dry-run` in CI = failure
|
|
56
|
+
|
|
57
|
+
### Testing Example (XCTest)
|
|
58
|
+
|
|
59
|
+
```objective-c
|
|
60
|
+
@import XCTest;
|
|
61
|
+
#import "DataProcessor.h"
|
|
62
|
+
|
|
63
|
+
@interface DataProcessorTests : XCTestCase
|
|
64
|
+
@property (nonatomic, strong) DataProcessor *processor;
|
|
65
|
+
@end
|
|
66
|
+
|
|
67
|
+
@implementation DataProcessorTests
|
|
68
|
+
|
|
69
|
+
- (void)setUp {
|
|
70
|
+
[super setUp];
|
|
71
|
+
self.processor = [[DataProcessor alloc] initWithThreshold:0.5];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
- (void)testProcessValidInput {
|
|
75
|
+
NSArray *input = @[@1, @2, @3];
|
|
76
|
+
NSArray *result = [self.processor process:input];
|
|
77
|
+
|
|
78
|
+
XCTAssertNotNil(result);
|
|
79
|
+
XCTAssertGreaterThan(result.count, 0);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
- (void)testProcessHandlesNil {
|
|
83
|
+
XCTAssertThrows([self.processor process:nil]);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@end
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<!-- OBJECTIVEC:END -->
|
|
90
|
+
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
<!-- PHP:START -->
|
|
2
|
+
# PHP 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
|
+
./vendor/bin/pint --test # Format check (Laravel Pint)
|
|
11
|
+
# OR: ./vendor/bin/php-cs-fixer fix --dry-run
|
|
12
|
+
./vendor/bin/phpstan analyze # Static analysis
|
|
13
|
+
./vendor/bin/phpunit # All tests (100% pass)
|
|
14
|
+
./vendor/bin/phpunit --coverage-text # Coverage (95%+ required)
|
|
15
|
+
|
|
16
|
+
# Security audit:
|
|
17
|
+
composer audit # Vulnerability scan
|
|
18
|
+
composer outdated # Check outdated deps
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## PHP Configuration
|
|
22
|
+
|
|
23
|
+
**CRITICAL**: Use PHP 8.2+ with strict types enabled.
|
|
24
|
+
|
|
25
|
+
- **Version**: PHP 8.2+
|
|
26
|
+
- **Strict Types**: Enabled
|
|
27
|
+
- **Type Hints**: Required for all functions
|
|
28
|
+
- **Error Reporting**: E_ALL | E_STRICT
|
|
29
|
+
|
|
30
|
+
### composer.json Requirements
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"name": "your-vendor/your-package",
|
|
35
|
+
"description": "A short description of your package",
|
|
36
|
+
"type": "library",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"authors": [
|
|
39
|
+
{
|
|
40
|
+
"name": "Your Name",
|
|
41
|
+
"email": "your.email@example.com"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"require": {
|
|
45
|
+
"php": "^8.2"
|
|
46
|
+
},
|
|
47
|
+
"require-dev": {
|
|
48
|
+
"phpunit/phpunit": "^11.0",
|
|
49
|
+
"phpstan/phpstan": "^1.10",
|
|
50
|
+
"squizlabs/php_codesniffer": "^3.8",
|
|
51
|
+
"friendsofphp/php-cs-fixer": "^3.48"
|
|
52
|
+
},
|
|
53
|
+
"autoload": {
|
|
54
|
+
"psr-4": {
|
|
55
|
+
"YourVendor\\YourPackage\\": "src/"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"autoload-dev": {
|
|
59
|
+
"psr-4": {
|
|
60
|
+
"YourVendor\\YourPackage\\Tests\\": "tests/"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"test": "phpunit",
|
|
65
|
+
"cs-fix": "php-cs-fixer fix",
|
|
66
|
+
"cs-check": "php-cs-fixer fix --dry-run --diff",
|
|
67
|
+
"stan": "phpstan analyse",
|
|
68
|
+
"phpcs": "phpcs src tests"
|
|
69
|
+
},
|
|
70
|
+
"minimum-stability": "stable",
|
|
71
|
+
"prefer-stable": true
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Code Quality Standards
|
|
76
|
+
|
|
77
|
+
### Mandatory Quality Checks
|
|
78
|
+
|
|
79
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
80
|
+
|
|
81
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
85
|
+
|
|
86
|
+
# 1. Format check (matches workflow - use check, not fix!)
|
|
87
|
+
composer cs-check
|
|
88
|
+
|
|
89
|
+
# 2. Static analysis (MUST pass with no errors - matches workflow)
|
|
90
|
+
composer stan
|
|
91
|
+
|
|
92
|
+
# 3. Code style check (matches workflow)
|
|
93
|
+
composer phpcs
|
|
94
|
+
|
|
95
|
+
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
96
|
+
composer test
|
|
97
|
+
|
|
98
|
+
# 5. Check coverage (MUST meet threshold)
|
|
99
|
+
./vendor/bin/phpunit --coverage-text
|
|
100
|
+
|
|
101
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
105
|
+
|
|
106
|
+
**Why This Matters:**
|
|
107
|
+
- CI/CD failures happen when local commands differ from workflows
|
|
108
|
+
- Example: Using `cs-fix` locally but `cs-check` in CI = failure
|
|
109
|
+
- Example: Missing static analysis locally = CI PHPStan failures
|
|
110
|
+
|
|
111
|
+
### Code Style
|
|
112
|
+
|
|
113
|
+
Use PHP-CS-Fixer with PSR-12 standard. Configuration in `.php-cs-fixer.php`:
|
|
114
|
+
|
|
115
|
+
```php
|
|
116
|
+
<?php
|
|
117
|
+
|
|
118
|
+
declare(strict_types=1);
|
|
119
|
+
|
|
120
|
+
$finder = PhpCsFixer\Finder::create()
|
|
121
|
+
->in(__DIR__ . '/src')
|
|
122
|
+
->in(__DIR__ . '/tests');
|
|
123
|
+
|
|
124
|
+
return (new PhpCsFixer\Config())
|
|
125
|
+
->setRules([
|
|
126
|
+
'@PSR12' => true,
|
|
127
|
+
'@PHP82Migration' => true,
|
|
128
|
+
'strict_param' => true,
|
|
129
|
+
'array_syntax' => ['syntax' => 'short'],
|
|
130
|
+
'declare_strict_types' => true,
|
|
131
|
+
'native_function_invocation' => ['include' => ['@all']],
|
|
132
|
+
'no_unused_imports' => true,
|
|
133
|
+
'ordered_imports' => ['sort_algorithm' => 'alpha'],
|
|
134
|
+
'phpdoc_align' => true,
|
|
135
|
+
'phpdoc_order' => true,
|
|
136
|
+
'trailing_comma_in_multiline' => ['elements' => ['arrays']],
|
|
137
|
+
])
|
|
138
|
+
->setFinder($finder);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Static Analysis
|
|
142
|
+
|
|
143
|
+
Use PHPStan at maximum level. Configuration in `phpstan.neon`:
|
|
144
|
+
|
|
145
|
+
```neon
|
|
146
|
+
parameters:
|
|
147
|
+
level: max
|
|
148
|
+
paths:
|
|
149
|
+
- src
|
|
150
|
+
- tests
|
|
151
|
+
excludePaths:
|
|
152
|
+
- tests/Fixtures/*
|
|
153
|
+
checkMissingIterableValueType: true
|
|
154
|
+
checkGenericClassInNonGenericObjectType: true
|
|
155
|
+
reportUnmatchedIgnoredErrors: true
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Testing
|
|
159
|
+
|
|
160
|
+
- **Framework**: PHPUnit 11+
|
|
161
|
+
- **Location**: `tests/` directory
|
|
162
|
+
- **Coverage**: XDebug or PCOV
|
|
163
|
+
- **Coverage Threshold**: 95%+
|
|
164
|
+
|
|
165
|
+
Configuration in `phpunit.xml`:
|
|
166
|
+
|
|
167
|
+
```xml
|
|
168
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
169
|
+
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
170
|
+
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
|
171
|
+
bootstrap="vendor/autoload.php"
|
|
172
|
+
colors="true"
|
|
173
|
+
failOnRisky="true"
|
|
174
|
+
failOnWarning="true"
|
|
175
|
+
cacheDirectory=".phpunit.cache">
|
|
176
|
+
<testsuites>
|
|
177
|
+
<testsuite name="Unit">
|
|
178
|
+
<directory>tests/Unit</directory>
|
|
179
|
+
</testsuite>
|
|
180
|
+
<testsuite name="Integration">
|
|
181
|
+
<directory>tests/Integration</directory>
|
|
182
|
+
</testsuite>
|
|
183
|
+
</testsuites>
|
|
184
|
+
<source>
|
|
185
|
+
<include>
|
|
186
|
+
<directory>src</directory>
|
|
187
|
+
</include>
|
|
188
|
+
</source>
|
|
189
|
+
<coverage>
|
|
190
|
+
<report>
|
|
191
|
+
<html outputDirectory="coverage"/>
|
|
192
|
+
<text outputFile="php://stdout"/>
|
|
193
|
+
</report>
|
|
194
|
+
</coverage>
|
|
195
|
+
</phpunit>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Example test:
|
|
199
|
+
|
|
200
|
+
```php
|
|
201
|
+
<?php
|
|
202
|
+
|
|
203
|
+
declare(strict_types=1);
|
|
204
|
+
|
|
205
|
+
namespace YourVendor\YourPackage\Tests;
|
|
206
|
+
|
|
207
|
+
use PHPUnit\Framework\TestCase;
|
|
208
|
+
use YourVendor\YourPackage\MyClass;
|
|
209
|
+
|
|
210
|
+
final class MyClassTest extends TestCase
|
|
211
|
+
{
|
|
212
|
+
public function testProcessValidInput(): void
|
|
213
|
+
{
|
|
214
|
+
$myClass = new MyClass();
|
|
215
|
+
$result = $myClass->process('hello');
|
|
216
|
+
|
|
217
|
+
$this->assertSame('HELLO', $result);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
public function testProcessEmptyInputThrowsException(): void
|
|
221
|
+
{
|
|
222
|
+
$this->expectException(\InvalidArgumentException::class);
|
|
223
|
+
$this->expectExceptionMessage('Input cannot be empty');
|
|
224
|
+
|
|
225
|
+
$myClass = new MyClass();
|
|
226
|
+
$myClass->process('');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Type Declarations
|
|
232
|
+
|
|
233
|
+
- Use strict types in all files
|
|
234
|
+
- Type hint all parameters and return types
|
|
235
|
+
- Use union types and nullable types appropriately
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
|
|
239
|
+
```php
|
|
240
|
+
<?php
|
|
241
|
+
|
|
242
|
+
declare(strict_types=1);
|
|
243
|
+
|
|
244
|
+
namespace YourVendor\YourPackage;
|
|
245
|
+
|
|
246
|
+
use InvalidArgumentException;
|
|
247
|
+
|
|
248
|
+
final class DataProcessor
|
|
249
|
+
{
|
|
250
|
+
/**
|
|
251
|
+
* Process the input data and return the result.
|
|
252
|
+
*
|
|
253
|
+
* @param string $input The input to process
|
|
254
|
+
* @return string The processed output
|
|
255
|
+
* @throws InvalidArgumentException If input is empty
|
|
256
|
+
*/
|
|
257
|
+
public function process(string $input): string
|
|
258
|
+
{
|
|
259
|
+
if ($input === '') {
|
|
260
|
+
throw new InvalidArgumentException('Input cannot be empty');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return strtoupper($input);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Find a value in the data.
|
|
268
|
+
*
|
|
269
|
+
* @param array<string, mixed> $data
|
|
270
|
+
* @param string $key
|
|
271
|
+
* @return mixed|null
|
|
272
|
+
*/
|
|
273
|
+
public function findValue(array $data, string $key): mixed
|
|
274
|
+
{
|
|
275
|
+
return $data[$key] ?? null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Process multiple items.
|
|
280
|
+
*
|
|
281
|
+
* @param list<string> $items
|
|
282
|
+
* @return list<string>
|
|
283
|
+
*/
|
|
284
|
+
public function processMany(array $items): array
|
|
285
|
+
{
|
|
286
|
+
return array_map(
|
|
287
|
+
fn (string $item): string => $this->process($item),
|
|
288
|
+
$items
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Documentation
|
|
295
|
+
|
|
296
|
+
- Use PHPDoc blocks for all public methods
|
|
297
|
+
- Include `@param`, `@return`, `@throws` tags
|
|
298
|
+
- Use generics annotations for arrays
|
|
299
|
+
|
|
300
|
+
Example:
|
|
301
|
+
|
|
302
|
+
```php
|
|
303
|
+
<?php
|
|
304
|
+
|
|
305
|
+
declare(strict_types=1);
|
|
306
|
+
|
|
307
|
+
namespace YourVendor\YourPackage;
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Service for managing user data.
|
|
311
|
+
*
|
|
312
|
+
* This class provides methods for creating, updating, and retrieving user information.
|
|
313
|
+
*/
|
|
314
|
+
final class UserService
|
|
315
|
+
{
|
|
316
|
+
/**
|
|
317
|
+
* Find a user by ID.
|
|
318
|
+
*
|
|
319
|
+
* @param positive-int $userId The user ID
|
|
320
|
+
* @return array{id: int, name: string, email: string}|null User data or null if not found
|
|
321
|
+
*/
|
|
322
|
+
public function findById(int $userId): ?array
|
|
323
|
+
{
|
|
324
|
+
// Implementation
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Get all users.
|
|
329
|
+
*
|
|
330
|
+
* @return list<array{id: int, name: string, email: string}>
|
|
331
|
+
*/
|
|
332
|
+
public function getAll(): array
|
|
333
|
+
{
|
|
334
|
+
// Implementation
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Project Structure
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
project/
|
|
343
|
+
├── composer.json # Composer configuration
|
|
344
|
+
├── phpunit.xml # PHPUnit configuration
|
|
345
|
+
├── phpstan.neon # PHPStan configuration
|
|
346
|
+
├── .php-cs-fixer.php # PHP-CS-Fixer configuration
|
|
347
|
+
├── README.md # Project overview (allowed in root)
|
|
348
|
+
├── CHANGELOG.md # Version history (allowed in root)
|
|
349
|
+
├── LICENSE # Project license (allowed in root)
|
|
350
|
+
├── src/
|
|
351
|
+
│ └── YourClass.php
|
|
352
|
+
├── tests/
|
|
353
|
+
│ ├── Unit/
|
|
354
|
+
│ └── Integration/
|
|
355
|
+
└── docs/ # Project documentation
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## CI/CD Requirements
|
|
359
|
+
|
|
360
|
+
Must include GitHub Actions workflows for:
|
|
361
|
+
|
|
362
|
+
1. **Testing** (`php-test.yml`):
|
|
363
|
+
- Test on ubuntu-latest, windows-latest
|
|
364
|
+
- Test on PHP 8.2, 8.3
|
|
365
|
+
- Upload coverage reports
|
|
366
|
+
|
|
367
|
+
2. **Linting** (`php-lint.yml`):
|
|
368
|
+
- PHPStan: `composer stan`
|
|
369
|
+
- PHP-CS-Fixer: `composer cs-check`
|
|
370
|
+
- PHPCS: `composer phpcs`
|
|
371
|
+
|
|
372
|
+
## Package Publication
|
|
373
|
+
|
|
374
|
+
### Publishing to Packagist
|
|
375
|
+
|
|
376
|
+
**Prerequisites:**
|
|
377
|
+
1. Create account at https://packagist.org
|
|
378
|
+
2. Submit your package (automatic sync with GitHub)
|
|
379
|
+
3. Configure webhook in GitHub for auto-updates
|
|
380
|
+
|
|
381
|
+
**Publishing Workflow:**
|
|
382
|
+
|
|
383
|
+
1. Update version in composer.json (optional, uses git tags)
|
|
384
|
+
2. Update CHANGELOG.md
|
|
385
|
+
3. Run quality checks:
|
|
386
|
+
```bash
|
|
387
|
+
composer cs-fix
|
|
388
|
+
composer stan
|
|
389
|
+
composer test
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
4. Create git tag: `git tag v1.0.0 && git push --tags`
|
|
393
|
+
5. Packagist automatically updates from GitHub
|
|
394
|
+
6. Package available at: `https://packagist.org/packages/your-vendor/your-package`
|
|
395
|
+
|
|
396
|
+
**Publishing Checklist:**
|
|
397
|
+
|
|
398
|
+
- ✅ All tests passing
|
|
399
|
+
- ✅ PHPStan at max level passes
|
|
400
|
+
- ✅ Code style conforms to PSR-12
|
|
401
|
+
- ✅ CHANGELOG.md updated
|
|
402
|
+
- ✅ README.md up to date
|
|
403
|
+
- ✅ LICENSE file present
|
|
404
|
+
- ✅ composer.json metadata complete
|
|
405
|
+
- ✅ GitHub repository public
|
|
406
|
+
- ✅ Webhook configured on Packagist
|
|
407
|
+
|
|
408
|
+
**Semantic Versioning:**
|
|
409
|
+
|
|
410
|
+
Packagist uses git tags for versions:
|
|
411
|
+
- Tag format: `v1.0.0`
|
|
412
|
+
- Follows [SemVer](https://semver.org/)
|
|
413
|
+
- Composer constraints: `^1.0`, `~1.0`, `1.0.*`
|
|
414
|
+
|
|
415
|
+
<!-- PHP:END -->
|
|
416
|
+
|