@hivehub/rulebook 4.2.2 → 4.3.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/.claude/commands/continue.md +33 -33
- package/.claude/commands/ralph-config.md +112 -112
- package/.claude/commands/ralph-history.md +110 -110
- package/.claude/commands/ralph-init.md +72 -72
- package/.claude/commands/ralph-pause-resume.md +105 -105
- package/.claude/commands/ralph-run.md +101 -101
- package/.claude/commands/ralph-status.md +76 -76
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +70 -70
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/README.md +8 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +4 -4
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +8 -1
- package/dist/core/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude-mcp.js +32 -1
- package/dist/core/claude-mcp.js.map +1 -1
- package/dist/core/generator.d.ts +13 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +283 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/core/workspace/workspace-manager.js +2 -6
- package/dist/core/workspace/workspace-manager.js.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +5 -4
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/package.json +21 -22
- package/templates/agents/accessibility-reviewer.md +43 -0
- package/templates/agents/api-designer.md +42 -0
- package/templates/agents/architect.md +51 -0
- package/templates/agents/build-engineer.md +36 -0
- package/templates/agents/code-reviewer.md +47 -0
- package/templates/agents/database-architect.md +41 -0
- package/templates/agents/devops-engineer.md +42 -0
- package/templates/agents/docs-writer.md +38 -0
- package/templates/agents/i18n-engineer.md +42 -0
- package/templates/agents/implementer.md +38 -35
- package/templates/agents/migration-engineer.md +42 -0
- package/templates/agents/performance-engineer.md +49 -0
- package/templates/agents/refactoring-agent.md +41 -0
- package/templates/agents/researcher.md +38 -34
- package/templates/agents/security-reviewer.md +40 -0
- package/templates/agents/team-lead.md +37 -34
- package/templates/agents/tester.md +45 -42
- package/templates/agents/ux-reviewer.md +43 -0
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/OPENCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/core/AGENTS_LEAN.md +25 -25
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +288 -288
- package/templates/core/DAG.md +304 -304
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RALPH.md +471 -471
- package/templates/core/RULEBOOK.md +1935 -1935
- package/templates/frameworks/ANGULAR.md +36 -36
- package/templates/frameworks/DJANGO.md +83 -83
- package/templates/frameworks/ELECTRON.md +147 -147
- package/templates/frameworks/FLASK.md +38 -38
- package/templates/frameworks/FLUTTER.md +55 -55
- package/templates/frameworks/JQUERY.md +32 -32
- package/templates/frameworks/LARAVEL.md +38 -38
- package/templates/frameworks/NESTJS.md +43 -43
- package/templates/frameworks/NEXTJS.md +127 -127
- package/templates/frameworks/NUXT.md +40 -40
- package/templates/frameworks/RAILS.md +66 -66
- package/templates/frameworks/REACT.md +38 -38
- package/templates/frameworks/REACT_NATIVE.md +47 -47
- package/templates/frameworks/SPRING.md +39 -39
- package/templates/frameworks/SYMFONY.md +36 -36
- package/templates/frameworks/VUE.md +36 -36
- package/templates/frameworks/ZEND.md +35 -35
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1157 -1157
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT.md +37 -37
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/CURSOR.md +43 -43
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/JETBRAINS_AI.md +35 -35
- package/templates/ides/REPLIT.md +36 -36
- package/templates/ides/TABNINE.md +29 -29
- package/templates/ides/VSCODE.md +40 -40
- package/templates/ides/WINDSURF.md +36 -36
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/ides/ZED.md +32 -32
- package/templates/ides/cursor-mdc/go.mdc +24 -24
- package/templates/ides/cursor-mdc/python.mdc +24 -24
- package/templates/ides/cursor-mdc/quality.mdc +25 -25
- package/templates/ides/cursor-mdc/ralph.mdc +39 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
- package/templates/ides/cursor-mdc/rust.mdc +24 -24
- package/templates/ides/cursor-mdc/typescript.mdc +25 -25
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +156 -156
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/ralph/ralph-history.bat +4 -4
- package/templates/ralph/ralph-history.sh +5 -5
- package/templates/ralph/ralph-init.bat +5 -5
- package/templates/ralph/ralph-init.sh +5 -5
- package/templates/ralph/ralph-pause.bat +5 -5
- package/templates/ralph/ralph-pause.sh +5 -5
- package/templates/ralph/ralph-run.bat +5 -5
- package/templates/ralph/ralph-run.sh +5 -5
- package/templates/ralph/ralph-status.bat +4 -4
- package/templates/ralph/ralph-status.sh +5 -5
- package/templates/services/AZURE_BLOB.md +184 -184
- package/templates/services/CASSANDRA.md +239 -239
- package/templates/services/DATADOG.md +26 -26
- package/templates/services/DOCKER.md +124 -124
- package/templates/services/DOCKER_COMPOSE.md +168 -168
- package/templates/services/DYNAMODB.md +308 -308
- package/templates/services/ELASTICSEARCH.md +347 -347
- package/templates/services/GCS.md +178 -178
- package/templates/services/HELM.md +194 -194
- package/templates/services/INFLUXDB.md +265 -265
- package/templates/services/KAFKA.md +341 -341
- package/templates/services/KUBERNETES.md +208 -208
- package/templates/services/MARIADB.md +183 -183
- package/templates/services/MEMCACHED.md +242 -242
- package/templates/services/MINIO.md +201 -201
- package/templates/services/MONGODB.md +268 -268
- package/templates/services/MYSQL.md +358 -358
- package/templates/services/NEO4J.md +247 -247
- package/templates/services/OPENTELEMETRY.md +25 -25
- package/templates/services/ORACLE.md +290 -290
- package/templates/services/PINO.md +24 -24
- package/templates/services/POSTGRESQL.md +326 -326
- package/templates/services/PROMETHEUS.md +33 -33
- package/templates/services/RABBITMQ.md +286 -286
- package/templates/services/REDIS.md +292 -292
- package/templates/services/S3.md +298 -298
- package/templates/services/SENTRY.md +23 -23
- package/templates/services/SQLITE.md +294 -294
- package/templates/services/SQLSERVER.md +294 -294
- package/templates/services/WINSTON.md +30 -30
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/cli/opencode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/dev/accessibility/SKILL.md +17 -0
- package/templates/skills/dev/api-design/SKILL.md +15 -0
- package/templates/skills/dev/architect/SKILL.md +17 -0
- package/templates/skills/dev/build-fix/SKILL.md +17 -0
- package/templates/skills/dev/db-design/SKILL.md +15 -0
- package/templates/skills/dev/debug/SKILL.md +16 -0
- package/templates/skills/dev/deploy/SKILL.md +17 -0
- package/templates/skills/dev/docs/SKILL.md +17 -0
- package/templates/skills/dev/migrate/SKILL.md +15 -0
- package/templates/skills/dev/perf/SKILL.md +17 -0
- package/templates/skills/dev/refactor/SKILL.md +17 -0
- package/templates/skills/dev/research/SKILL.md +14 -0
- package/templates/skills/dev/review/SKILL.md +18 -0
- package/templates/skills/dev/security-audit/SKILL.md +17 -0
- package/templates/skills/frameworks/angular/SKILL.md +46 -46
- package/templates/skills/frameworks/django/SKILL.md +93 -93
- package/templates/skills/frameworks/electron/SKILL.md +157 -157
- package/templates/skills/frameworks/flask/SKILL.md +48 -48
- package/templates/skills/frameworks/flutter/SKILL.md +65 -65
- package/templates/skills/frameworks/jquery/SKILL.md +42 -42
- package/templates/skills/frameworks/laravel/SKILL.md +48 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
- package/templates/skills/frameworks/rails/SKILL.md +76 -76
- package/templates/skills/frameworks/react/SKILL.md +48 -48
- package/templates/skills/frameworks/react-native/SKILL.md +57 -57
- package/templates/skills/frameworks/spring/SKILL.md +49 -49
- package/templates/skills/frameworks/symfony/SKILL.md +46 -46
- package/templates/skills/frameworks/vue/SKILL.md +46 -46
- package/templates/skills/frameworks/zend/SKILL.md +45 -45
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/templates/skills/services/azure-blob/SKILL.md +194 -194
- package/templates/skills/services/cassandra/SKILL.md +249 -249
- package/templates/skills/services/dynamodb/SKILL.md +318 -318
- package/templates/skills/services/elasticsearch/SKILL.md +357 -357
- package/templates/skills/services/gcs/SKILL.md +188 -188
- package/templates/skills/services/influxdb/SKILL.md +275 -275
- package/templates/skills/services/kafka/SKILL.md +351 -351
- package/templates/skills/services/mariadb/SKILL.md +193 -193
- package/templates/skills/services/memcached/SKILL.md +252 -252
- package/templates/skills/services/minio/SKILL.md +211 -211
- package/templates/skills/services/mongodb/SKILL.md +278 -278
- package/templates/skills/services/mysql/SKILL.md +368 -368
- package/templates/skills/services/neo4j/SKILL.md +257 -257
- package/templates/skills/services/oracle/SKILL.md +300 -300
- package/templates/skills/services/postgresql/SKILL.md +336 -336
- package/templates/skills/services/rabbitmq/SKILL.md +296 -296
- package/templates/skills/services/redis/SKILL.md +302 -302
- package/templates/skills/services/s3/SKILL.md +308 -308
- package/templates/skills/services/sqlite/SKILL.md +304 -304
- package/templates/skills/services/sqlserver/SKILL.md +304 -304
- package/templates/skills/workflows/ralph/SKILL.md +309 -309
- package/templates/skills/workflows/ralph/install.sh +87 -87
- package/templates/skills/workflows/ralph/manifest.json +158 -158
|
@@ -1,314 +1,314 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "DAG Workflow"
|
|
3
|
-
description: "Maintain a clean dependency graph (DAG) to prevent circular dependencies and ensure maintainable architecture."
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "core"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["core"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- DAG:START -->
|
|
12
|
-
# Dependency Architecture Guidelines (DAG)
|
|
13
|
-
|
|
14
|
-
**CRITICAL**: Maintain a clean dependency graph (DAG) to prevent circular dependencies and ensure maintainable architecture.
|
|
15
|
-
|
|
16
|
-
## Core Principles
|
|
17
|
-
|
|
18
|
-
### No Circular Dependencies
|
|
19
|
-
- **NEVER** create circular dependencies between components
|
|
20
|
-
- **ALWAYS** ensure dependencies form a Directed Acyclic Graph (DAG)
|
|
21
|
-
- **ALWAYS** validate dependency structure before committing
|
|
22
|
-
|
|
23
|
-
### Layer Separation
|
|
24
|
-
- **ALWAYS** maintain clear layer boundaries
|
|
25
|
-
- **ALWAYS** ensure higher layers depend only on lower layers
|
|
26
|
-
- **NEVER** allow lower layers to depend on higher layers
|
|
27
|
-
|
|
28
|
-
### Interface Boundaries
|
|
29
|
-
- **ALWAYS** use interfaces for cross-component communication
|
|
30
|
-
- **ALWAYS** define clear contracts between components
|
|
31
|
-
- **NEVER** create tight coupling between components
|
|
32
|
-
|
|
33
|
-
## Dependency Rules
|
|
34
|
-
|
|
35
|
-
### Layer Architecture
|
|
36
|
-
|
|
37
|
-
**Layer 1: Foundation**
|
|
38
|
-
- Utils, helpers, utilities
|
|
39
|
-
- Type definitions
|
|
40
|
-
- Configuration management
|
|
41
|
-
- Base constants and enums
|
|
42
|
-
|
|
43
|
-
**Layer 2: Core**
|
|
44
|
-
- Core business logic
|
|
45
|
-
- Data models and schemas
|
|
46
|
-
- Base services and repositories
|
|
47
|
-
- Domain entities
|
|
48
|
-
|
|
49
|
-
**Layer 3: Features**
|
|
50
|
-
- Feature implementations
|
|
51
|
-
- Business logic
|
|
52
|
-
- API endpoints
|
|
53
|
-
- Service orchestration
|
|
54
|
-
|
|
55
|
-
**Layer 4: Presentation**
|
|
56
|
-
- UI components
|
|
57
|
-
- CLI interfaces
|
|
58
|
-
- API controllers
|
|
59
|
-
- View models
|
|
60
|
-
|
|
61
|
-
### Dependency Flow
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
Foundation → Core → Features → Presentation
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Rules:**
|
|
68
|
-
- ✅ Foundation can depend on nothing (or external libraries only)
|
|
69
|
-
- ✅ Core can depend on Foundation
|
|
70
|
-
- ✅ Features can depend on Core and Foundation
|
|
71
|
-
- ✅ Presentation can depend on Features, Core, and Foundation
|
|
72
|
-
- ❌ Foundation CANNOT depend on Core, Features, or Presentation
|
|
73
|
-
- ❌ Core CANNOT depend on Features or Presentation
|
|
74
|
-
- ❌ Features CANNOT depend on Presentation
|
|
75
|
-
|
|
76
|
-
## Component Graph Structure
|
|
77
|
-
|
|
78
|
-
### Example Valid DAG
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
Core
|
|
82
|
-
├── Utils
|
|
83
|
-
├── Types
|
|
84
|
-
└── Config
|
|
85
|
-
|
|
86
|
-
Features
|
|
87
|
-
├── Feature A
|
|
88
|
-
│ └── Core
|
|
89
|
-
└── Feature B
|
|
90
|
-
├── Core
|
|
91
|
-
└── Feature A
|
|
92
|
-
|
|
93
|
-
Presentation
|
|
94
|
-
├── CLI
|
|
95
|
-
│ └── Features
|
|
96
|
-
└── API
|
|
97
|
-
└── Features
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Invalid Patterns (Circular Dependencies)
|
|
101
|
-
|
|
102
|
-
```
|
|
103
|
-
❌ Feature A → Feature B → Feature A
|
|
104
|
-
❌ Core → Feature → Core
|
|
105
|
-
❌ Utils → Core → Utils
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Verification
|
|
109
|
-
|
|
110
|
-
### Before Committing
|
|
111
|
-
|
|
112
|
-
**MANDATORY**: Verify dependency structure:
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
# Check for circular dependencies
|
|
116
|
-
# Add your dependency check command here
|
|
117
|
-
# Examples:
|
|
118
|
-
# - TypeScript: tsc --noEmit (catches import cycles)
|
|
119
|
-
# - Rust: cargo check (catches circular dependencies)
|
|
120
|
-
# - Python: pylint --disable=all --enable=import-error
|
|
121
|
-
# - Go: go vet ./...
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### Dependency Analysis Tools
|
|
125
|
-
|
|
126
|
-
**TypeScript/JavaScript:**
|
|
127
|
-
```bash
|
|
128
|
-
# Use madge to detect circular dependencies
|
|
129
|
-
npx madge --circular src/
|
|
130
|
-
|
|
131
|
-
# Use dependency-cruiser
|
|
132
|
-
npx dependency-cruiser --validate src/
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**Rust:**
|
|
136
|
-
```bash
|
|
137
|
-
# Cargo automatically detects circular dependencies
|
|
138
|
-
cargo check
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
**Python:**
|
|
142
|
-
```bash
|
|
143
|
-
# Use vulture or pylint
|
|
144
|
-
pylint --disable=all --enable=import-error src/
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**Go:**
|
|
148
|
-
```bash
|
|
149
|
-
# Use go vet
|
|
150
|
-
go vet ./...
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Best Practices
|
|
154
|
-
|
|
155
|
-
### DO's ✅
|
|
156
|
-
|
|
157
|
-
- **ALWAYS** maintain clear layer boundaries
|
|
158
|
-
- **ALWAYS** validate dependencies before committing
|
|
159
|
-
- **ALWAYS** use interfaces for cross-layer communication
|
|
160
|
-
- **ALWAYS** document component dependencies
|
|
161
|
-
- **ALWAYS** refactor when circular dependencies are detected
|
|
162
|
-
- **ALWAYS** keep dependency graph shallow (avoid deep nesting)
|
|
163
|
-
|
|
164
|
-
### DON'Ts ❌
|
|
165
|
-
|
|
166
|
-
- **NEVER** create circular dependencies
|
|
167
|
-
- **NEVER** allow lower layers to depend on higher layers
|
|
168
|
-
- **NEVER** create tight coupling between components
|
|
169
|
-
- **NEVER** skip dependency validation
|
|
170
|
-
- **NEVER** mix concerns across layers
|
|
171
|
-
- **NEVER** create bidirectional dependencies
|
|
172
|
-
|
|
173
|
-
## Dependency Documentation
|
|
174
|
-
|
|
175
|
-
### Documenting Dependencies
|
|
176
|
-
|
|
177
|
-
**In code:**
|
|
178
|
-
```typescript
|
|
179
|
-
// Component: UserService
|
|
180
|
-
// Dependencies:
|
|
181
|
-
// - UserRepository (Core layer)
|
|
182
|
-
// - Logger (Foundation layer)
|
|
183
|
-
// - Config (Foundation layer)
|
|
184
|
-
// Does NOT depend on:
|
|
185
|
-
// - UserController (Presentation layer)
|
|
186
|
-
// - UserAPI (Presentation layer)
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
**In documentation:**
|
|
190
|
-
- Maintain `docs/DAG.md` with component dependency graph
|
|
191
|
-
- Update when adding new components
|
|
192
|
-
- Include dependency direction and purpose
|
|
193
|
-
|
|
194
|
-
## Refactoring Circular Dependencies
|
|
195
|
-
|
|
196
|
-
### When Circular Dependency is Detected
|
|
197
|
-
|
|
198
|
-
1. **Identify the cycle**: Map the dependency chain
|
|
199
|
-
2. **Find common dependency**: Extract shared functionality
|
|
200
|
-
3. **Introduce interface**: Use dependency inversion
|
|
201
|
-
4. **Restructure layers**: Move components to appropriate layer
|
|
202
|
-
5. **Validate fix**: Run dependency check again
|
|
203
|
-
|
|
204
|
-
### Example Refactoring
|
|
205
|
-
|
|
206
|
-
**Before (Circular):**
|
|
207
|
-
```
|
|
208
|
-
Feature A → Feature B → Feature A
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**After (Fixed):**
|
|
212
|
-
```
|
|
213
|
-
Core
|
|
214
|
-
└── SharedService
|
|
215
|
-
|
|
216
|
-
Feature A → Core
|
|
217
|
-
Feature B → Core
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
## Integration with AGENT_AUTOMATION
|
|
221
|
-
|
|
222
|
-
**CRITICAL**: Include dependency validation in AGENT_AUTOMATION workflow:
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
# Step 1.5: Dependency Validation (before implementation)
|
|
226
|
-
# Check for circular dependencies
|
|
227
|
-
npm run check-deps # or equivalent for your language
|
|
228
|
-
|
|
229
|
-
# If circular dependencies detected:
|
|
230
|
-
# ❌ STOP - Fix architecture first
|
|
231
|
-
# ✅ Refactor to remove cycles
|
|
232
|
-
# ✅ Re-validate before proceeding
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## Language-Specific Guidelines
|
|
236
|
-
|
|
237
|
-
### TypeScript/JavaScript
|
|
238
|
-
- Use `madge` or `dependency-cruiser` for validation
|
|
239
|
-
- Configure ESLint rules for import ordering
|
|
240
|
-
- Use path aliases to enforce layer structure
|
|
241
|
-
|
|
242
|
-
### Rust
|
|
243
|
-
- Cargo automatically detects circular dependencies
|
|
244
|
-
- Use `cargo tree` to visualize dependencies
|
|
245
|
-
- Organize modules to reflect layer structure
|
|
246
|
-
|
|
247
|
-
### Python
|
|
248
|
-
- Use `pylint` or `vulture` for import analysis
|
|
249
|
-
- Organize packages to reflect layer structure
|
|
250
|
-
- Use `__init__.py` to control exports
|
|
251
|
-
|
|
252
|
-
### Go
|
|
253
|
-
- Use `go vet` for dependency validation
|
|
254
|
-
- Organize packages in directories reflecting layers
|
|
255
|
-
- Use interfaces to decouple components
|
|
256
|
-
|
|
257
|
-
## Examples
|
|
258
|
-
|
|
259
|
-
### Good Architecture ✅
|
|
260
|
-
|
|
261
|
-
```
|
|
262
|
-
src/
|
|
263
|
-
├── foundation/
|
|
264
|
-
│ ├── utils/
|
|
265
|
-
│ ├── types/
|
|
266
|
-
│ └── config/
|
|
267
|
-
├── core/
|
|
268
|
-
│ ├── models/
|
|
269
|
-
│ ├── services/
|
|
270
|
-
│ └── repositories/
|
|
271
|
-
├── features/
|
|
272
|
-
│ ├── auth/
|
|
273
|
-
│ │ └── (depends on core, foundation)
|
|
274
|
-
│ └── payments/
|
|
275
|
-
│ └── (depends on core, foundation)
|
|
276
|
-
└── presentation/
|
|
277
|
-
├── cli/
|
|
278
|
-
│ └── (depends on features, core, foundation)
|
|
279
|
-
└── api/
|
|
280
|
-
└── (depends on features, core, foundation)
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### Bad Architecture ❌
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
src/
|
|
287
|
-
├── features/
|
|
288
|
-
│ └── auth/
|
|
289
|
-
│ └── (depends on presentation) # ❌ Wrong direction
|
|
290
|
-
├── core/
|
|
291
|
-
│ └── (depends on features) # ❌ Wrong direction
|
|
292
|
-
└── presentation/
|
|
293
|
-
└── (depends on foundation only) # ❌ Missing dependencies
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
## Maintenance
|
|
297
|
-
|
|
298
|
-
### Regular Checks
|
|
299
|
-
|
|
300
|
-
- **Before every commit**: Run dependency validation
|
|
301
|
-
- **Weekly**: Review dependency graph for optimization
|
|
302
|
-
- **Before major refactoring**: Document current dependencies
|
|
303
|
-
- **After adding new components**: Update DAG documentation
|
|
304
|
-
|
|
305
|
-
### Tools Integration
|
|
306
|
-
|
|
307
|
-
Add dependency checks to:
|
|
308
|
-
- Pre-commit hooks
|
|
309
|
-
- CI/CD pipelines
|
|
310
|
-
- AGENT_AUTOMATION workflow
|
|
311
|
-
- Quality gates
|
|
312
|
-
|
|
313
|
-
<!-- DAG:END -->
|
|
314
|
-
|
|
1
|
+
---
|
|
2
|
+
name: "DAG Workflow"
|
|
3
|
+
description: "Maintain a clean dependency graph (DAG) to prevent circular dependencies and ensure maintainable architecture."
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
category: "core"
|
|
6
|
+
author: "Rulebook"
|
|
7
|
+
tags: ["core"]
|
|
8
|
+
dependencies: []
|
|
9
|
+
conflicts: []
|
|
10
|
+
---
|
|
11
|
+
<!-- DAG:START -->
|
|
12
|
+
# Dependency Architecture Guidelines (DAG)
|
|
13
|
+
|
|
14
|
+
**CRITICAL**: Maintain a clean dependency graph (DAG) to prevent circular dependencies and ensure maintainable architecture.
|
|
15
|
+
|
|
16
|
+
## Core Principles
|
|
17
|
+
|
|
18
|
+
### No Circular Dependencies
|
|
19
|
+
- **NEVER** create circular dependencies between components
|
|
20
|
+
- **ALWAYS** ensure dependencies form a Directed Acyclic Graph (DAG)
|
|
21
|
+
- **ALWAYS** validate dependency structure before committing
|
|
22
|
+
|
|
23
|
+
### Layer Separation
|
|
24
|
+
- **ALWAYS** maintain clear layer boundaries
|
|
25
|
+
- **ALWAYS** ensure higher layers depend only on lower layers
|
|
26
|
+
- **NEVER** allow lower layers to depend on higher layers
|
|
27
|
+
|
|
28
|
+
### Interface Boundaries
|
|
29
|
+
- **ALWAYS** use interfaces for cross-component communication
|
|
30
|
+
- **ALWAYS** define clear contracts between components
|
|
31
|
+
- **NEVER** create tight coupling between components
|
|
32
|
+
|
|
33
|
+
## Dependency Rules
|
|
34
|
+
|
|
35
|
+
### Layer Architecture
|
|
36
|
+
|
|
37
|
+
**Layer 1: Foundation**
|
|
38
|
+
- Utils, helpers, utilities
|
|
39
|
+
- Type definitions
|
|
40
|
+
- Configuration management
|
|
41
|
+
- Base constants and enums
|
|
42
|
+
|
|
43
|
+
**Layer 2: Core**
|
|
44
|
+
- Core business logic
|
|
45
|
+
- Data models and schemas
|
|
46
|
+
- Base services and repositories
|
|
47
|
+
- Domain entities
|
|
48
|
+
|
|
49
|
+
**Layer 3: Features**
|
|
50
|
+
- Feature implementations
|
|
51
|
+
- Business logic
|
|
52
|
+
- API endpoints
|
|
53
|
+
- Service orchestration
|
|
54
|
+
|
|
55
|
+
**Layer 4: Presentation**
|
|
56
|
+
- UI components
|
|
57
|
+
- CLI interfaces
|
|
58
|
+
- API controllers
|
|
59
|
+
- View models
|
|
60
|
+
|
|
61
|
+
### Dependency Flow
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Foundation → Core → Features → Presentation
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Rules:**
|
|
68
|
+
- ✅ Foundation can depend on nothing (or external libraries only)
|
|
69
|
+
- ✅ Core can depend on Foundation
|
|
70
|
+
- ✅ Features can depend on Core and Foundation
|
|
71
|
+
- ✅ Presentation can depend on Features, Core, and Foundation
|
|
72
|
+
- ❌ Foundation CANNOT depend on Core, Features, or Presentation
|
|
73
|
+
- ❌ Core CANNOT depend on Features or Presentation
|
|
74
|
+
- ❌ Features CANNOT depend on Presentation
|
|
75
|
+
|
|
76
|
+
## Component Graph Structure
|
|
77
|
+
|
|
78
|
+
### Example Valid DAG
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Core
|
|
82
|
+
├── Utils
|
|
83
|
+
├── Types
|
|
84
|
+
└── Config
|
|
85
|
+
|
|
86
|
+
Features
|
|
87
|
+
├── Feature A
|
|
88
|
+
│ └── Core
|
|
89
|
+
└── Feature B
|
|
90
|
+
├── Core
|
|
91
|
+
└── Feature A
|
|
92
|
+
|
|
93
|
+
Presentation
|
|
94
|
+
├── CLI
|
|
95
|
+
│ └── Features
|
|
96
|
+
└── API
|
|
97
|
+
└── Features
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Invalid Patterns (Circular Dependencies)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
❌ Feature A → Feature B → Feature A
|
|
104
|
+
❌ Core → Feature → Core
|
|
105
|
+
❌ Utils → Core → Utils
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Verification
|
|
109
|
+
|
|
110
|
+
### Before Committing
|
|
111
|
+
|
|
112
|
+
**MANDATORY**: Verify dependency structure:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Check for circular dependencies
|
|
116
|
+
# Add your dependency check command here
|
|
117
|
+
# Examples:
|
|
118
|
+
# - TypeScript: tsc --noEmit (catches import cycles)
|
|
119
|
+
# - Rust: cargo check (catches circular dependencies)
|
|
120
|
+
# - Python: pylint --disable=all --enable=import-error
|
|
121
|
+
# - Go: go vet ./...
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Dependency Analysis Tools
|
|
125
|
+
|
|
126
|
+
**TypeScript/JavaScript:**
|
|
127
|
+
```bash
|
|
128
|
+
# Use madge to detect circular dependencies
|
|
129
|
+
npx madge --circular src/
|
|
130
|
+
|
|
131
|
+
# Use dependency-cruiser
|
|
132
|
+
npx dependency-cruiser --validate src/
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Rust:**
|
|
136
|
+
```bash
|
|
137
|
+
# Cargo automatically detects circular dependencies
|
|
138
|
+
cargo check
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Python:**
|
|
142
|
+
```bash
|
|
143
|
+
# Use vulture or pylint
|
|
144
|
+
pylint --disable=all --enable=import-error src/
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Go:**
|
|
148
|
+
```bash
|
|
149
|
+
# Use go vet
|
|
150
|
+
go vet ./...
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Best Practices
|
|
154
|
+
|
|
155
|
+
### DO's ✅
|
|
156
|
+
|
|
157
|
+
- **ALWAYS** maintain clear layer boundaries
|
|
158
|
+
- **ALWAYS** validate dependencies before committing
|
|
159
|
+
- **ALWAYS** use interfaces for cross-layer communication
|
|
160
|
+
- **ALWAYS** document component dependencies
|
|
161
|
+
- **ALWAYS** refactor when circular dependencies are detected
|
|
162
|
+
- **ALWAYS** keep dependency graph shallow (avoid deep nesting)
|
|
163
|
+
|
|
164
|
+
### DON'Ts ❌
|
|
165
|
+
|
|
166
|
+
- **NEVER** create circular dependencies
|
|
167
|
+
- **NEVER** allow lower layers to depend on higher layers
|
|
168
|
+
- **NEVER** create tight coupling between components
|
|
169
|
+
- **NEVER** skip dependency validation
|
|
170
|
+
- **NEVER** mix concerns across layers
|
|
171
|
+
- **NEVER** create bidirectional dependencies
|
|
172
|
+
|
|
173
|
+
## Dependency Documentation
|
|
174
|
+
|
|
175
|
+
### Documenting Dependencies
|
|
176
|
+
|
|
177
|
+
**In code:**
|
|
178
|
+
```typescript
|
|
179
|
+
// Component: UserService
|
|
180
|
+
// Dependencies:
|
|
181
|
+
// - UserRepository (Core layer)
|
|
182
|
+
// - Logger (Foundation layer)
|
|
183
|
+
// - Config (Foundation layer)
|
|
184
|
+
// Does NOT depend on:
|
|
185
|
+
// - UserController (Presentation layer)
|
|
186
|
+
// - UserAPI (Presentation layer)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**In documentation:**
|
|
190
|
+
- Maintain `docs/DAG.md` with component dependency graph
|
|
191
|
+
- Update when adding new components
|
|
192
|
+
- Include dependency direction and purpose
|
|
193
|
+
|
|
194
|
+
## Refactoring Circular Dependencies
|
|
195
|
+
|
|
196
|
+
### When Circular Dependency is Detected
|
|
197
|
+
|
|
198
|
+
1. **Identify the cycle**: Map the dependency chain
|
|
199
|
+
2. **Find common dependency**: Extract shared functionality
|
|
200
|
+
3. **Introduce interface**: Use dependency inversion
|
|
201
|
+
4. **Restructure layers**: Move components to appropriate layer
|
|
202
|
+
5. **Validate fix**: Run dependency check again
|
|
203
|
+
|
|
204
|
+
### Example Refactoring
|
|
205
|
+
|
|
206
|
+
**Before (Circular):**
|
|
207
|
+
```
|
|
208
|
+
Feature A → Feature B → Feature A
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**After (Fixed):**
|
|
212
|
+
```
|
|
213
|
+
Core
|
|
214
|
+
└── SharedService
|
|
215
|
+
|
|
216
|
+
Feature A → Core
|
|
217
|
+
Feature B → Core
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Integration with AGENT_AUTOMATION
|
|
221
|
+
|
|
222
|
+
**CRITICAL**: Include dependency validation in AGENT_AUTOMATION workflow:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Step 1.5: Dependency Validation (before implementation)
|
|
226
|
+
# Check for circular dependencies
|
|
227
|
+
npm run check-deps # or equivalent for your language
|
|
228
|
+
|
|
229
|
+
# If circular dependencies detected:
|
|
230
|
+
# ❌ STOP - Fix architecture first
|
|
231
|
+
# ✅ Refactor to remove cycles
|
|
232
|
+
# ✅ Re-validate before proceeding
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Language-Specific Guidelines
|
|
236
|
+
|
|
237
|
+
### TypeScript/JavaScript
|
|
238
|
+
- Use `madge` or `dependency-cruiser` for validation
|
|
239
|
+
- Configure ESLint rules for import ordering
|
|
240
|
+
- Use path aliases to enforce layer structure
|
|
241
|
+
|
|
242
|
+
### Rust
|
|
243
|
+
- Cargo automatically detects circular dependencies
|
|
244
|
+
- Use `cargo tree` to visualize dependencies
|
|
245
|
+
- Organize modules to reflect layer structure
|
|
246
|
+
|
|
247
|
+
### Python
|
|
248
|
+
- Use `pylint` or `vulture` for import analysis
|
|
249
|
+
- Organize packages to reflect layer structure
|
|
250
|
+
- Use `__init__.py` to control exports
|
|
251
|
+
|
|
252
|
+
### Go
|
|
253
|
+
- Use `go vet` for dependency validation
|
|
254
|
+
- Organize packages in directories reflecting layers
|
|
255
|
+
- Use interfaces to decouple components
|
|
256
|
+
|
|
257
|
+
## Examples
|
|
258
|
+
|
|
259
|
+
### Good Architecture ✅
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
src/
|
|
263
|
+
├── foundation/
|
|
264
|
+
│ ├── utils/
|
|
265
|
+
│ ├── types/
|
|
266
|
+
│ └── config/
|
|
267
|
+
├── core/
|
|
268
|
+
│ ├── models/
|
|
269
|
+
│ ├── services/
|
|
270
|
+
│ └── repositories/
|
|
271
|
+
├── features/
|
|
272
|
+
│ ├── auth/
|
|
273
|
+
│ │ └── (depends on core, foundation)
|
|
274
|
+
│ └── payments/
|
|
275
|
+
│ └── (depends on core, foundation)
|
|
276
|
+
└── presentation/
|
|
277
|
+
├── cli/
|
|
278
|
+
│ └── (depends on features, core, foundation)
|
|
279
|
+
└── api/
|
|
280
|
+
└── (depends on features, core, foundation)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Bad Architecture ❌
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
src/
|
|
287
|
+
├── features/
|
|
288
|
+
│ └── auth/
|
|
289
|
+
│ └── (depends on presentation) # ❌ Wrong direction
|
|
290
|
+
├── core/
|
|
291
|
+
│ └── (depends on features) # ❌ Wrong direction
|
|
292
|
+
└── presentation/
|
|
293
|
+
└── (depends on foundation only) # ❌ Missing dependencies
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Maintenance
|
|
297
|
+
|
|
298
|
+
### Regular Checks
|
|
299
|
+
|
|
300
|
+
- **Before every commit**: Run dependency validation
|
|
301
|
+
- **Weekly**: Review dependency graph for optimization
|
|
302
|
+
- **Before major refactoring**: Document current dependencies
|
|
303
|
+
- **After adding new components**: Update DAG documentation
|
|
304
|
+
|
|
305
|
+
### Tools Integration
|
|
306
|
+
|
|
307
|
+
Add dependency checks to:
|
|
308
|
+
- Pre-commit hooks
|
|
309
|
+
- CI/CD pipelines
|
|
310
|
+
- AGENT_AUTOMATION workflow
|
|
311
|
+
- Quality gates
|
|
312
|
+
|
|
313
|
+
<!-- DAG:END -->
|
|
314
|
+
|