cerber-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.cerber-example/BIBLE.md +132 -0
  2. package/.cerber-example/CERBER_LAW.md +200 -0
  3. package/.cerber-example/connections/contracts/booking-to-pricing.json +44 -0
  4. package/.cerber-example/connections/contracts/pricing-to-booking.json +37 -0
  5. package/.cerber-example/modules/booking-calendar/MODULE.md +225 -0
  6. package/.cerber-example/modules/booking-calendar/contract.json +106 -0
  7. package/.cerber-example/modules/booking-calendar/dependencies.json +8 -0
  8. package/.cerber-example/modules/pricing-engine/MODULE.md +160 -0
  9. package/.cerber-example/modules/pricing-engine/contract.json +64 -0
  10. package/.cerber-example/modules/pricing-engine/dependencies.json +8 -0
  11. package/CHANGELOG.md +68 -0
  12. package/LICENSE +21 -0
  13. package/README.md +1379 -0
  14. package/bin/cerber +105 -0
  15. package/bin/cerber-focus +31 -0
  16. package/bin/cerber-guardian +90 -0
  17. package/bin/cerber-health +113 -0
  18. package/bin/cerber-morning +19 -0
  19. package/bin/cerber-repair +21 -0
  20. package/dist/cerber/index.d.ts +47 -0
  21. package/dist/cerber/index.d.ts.map +1 -0
  22. package/dist/cerber/index.js +154 -0
  23. package/dist/cerber/index.js.map +1 -0
  24. package/dist/guardian/index.d.ts +70 -0
  25. package/dist/guardian/index.d.ts.map +1 -0
  26. package/dist/guardian/index.js +271 -0
  27. package/dist/guardian/index.js.map +1 -0
  28. package/dist/index.d.ts +9 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/types.d.ts +76 -0
  33. package/dist/types.d.ts.map +1 -0
  34. package/dist/types.js +5 -0
  35. package/dist/types.js.map +1 -0
  36. package/examples/backend-schema.ts +72 -0
  37. package/examples/frontend-schema.ts +67 -0
  38. package/examples/health-checks.ts +196 -0
  39. package/examples/solo-integration/README.md +457 -0
  40. package/examples/solo-integration/package.json +47 -0
  41. package/examples/team-integration/README.md +347 -0
  42. package/examples/team-integration/package.json +23 -0
  43. package/package.json +104 -0
  44. package/solo/README.md +258 -0
  45. package/solo/config/performance-budget.json +53 -0
  46. package/solo/config/solo-contract.json +71 -0
  47. package/solo/lib/feature-flags.ts +177 -0
  48. package/solo/scripts/cerber-auto-repair.js +260 -0
  49. package/solo/scripts/cerber-daily-check.js +282 -0
  50. package/solo/scripts/cerber-dashboard.js +191 -0
  51. package/solo/scripts/cerber-deps-health.js +247 -0
  52. package/solo/scripts/cerber-docs-sync.js +304 -0
  53. package/solo/scripts/cerber-flags-check.js +229 -0
  54. package/solo/scripts/cerber-performance-budget.js +271 -0
  55. package/solo/scripts/cerber-rollback.js +229 -0
  56. package/solo/scripts/cerber-snapshot.js +319 -0
  57. package/team/README.md +327 -0
  58. package/team/config/team-contract.json +27 -0
  59. package/team/lib/module-system.ts +157 -0
  60. package/team/scripts/cerber-add-module.sh +195 -0
  61. package/team/scripts/cerber-connections-check.sh +186 -0
  62. package/team/scripts/cerber-focus.sh +170 -0
  63. package/team/scripts/cerber-module-check.sh +165 -0
  64. package/team/scripts/cerber-team-morning.sh +210 -0
  65. package/team/templates/BIBLE_TEMPLATE.md +52 -0
  66. package/team/templates/CONNECTION_TEMPLATE.json +20 -0
  67. package/team/templates/MODULE_TEMPLATE.md +60 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Cerber TEAM - Module System
3
+ *
4
+ * @author Stefan Pitek
5
+ * @copyright 2026 Stefan Pitek
6
+ * @license MIT
7
+ */
8
+
9
+ export interface Module {
10
+ name: string;
11
+ owner: string;
12
+ status: 'active' | 'deprecated' | 'planned';
13
+ path: string;
14
+ }
15
+
16
+ export interface ModuleContract {
17
+ version: string;
18
+ publicInterface: Record<string, FunctionSignature>;
19
+ dependencies: string[];
20
+ }
21
+
22
+ export interface FunctionSignature {
23
+ name: string;
24
+ params: Record<string, string>;
25
+ returns: string;
26
+ description: string;
27
+ }
28
+
29
+ export interface Connection {
30
+ id: string;
31
+ from: string;
32
+ to: string;
33
+ type: 'function-call' | 'event' | 'data-flow';
34
+ interface: any;
35
+ version?: string;
36
+ breaking_changes?: string[];
37
+ notes?: string;
38
+ }
39
+
40
+ export interface ValidationResult {
41
+ valid: boolean;
42
+ errors: string[];
43
+ warnings: string[];
44
+ }
45
+
46
+ /**
47
+ * Load module metadata from MODULE.md
48
+ *
49
+ * @todo Implementation pending - use bash scripts for now
50
+ */
51
+ export function loadModule(moduleName: string): Module {
52
+ // TODO: Implementation would read from .cerber/modules/{moduleName}/MODULE.md
53
+ // For now, use: bash team/scripts/cerber-focus.sh <module-name>
54
+ throw new Error('Not implemented - use bash scripts for now');
55
+ }
56
+
57
+ /**
58
+ * Load module contract from contract.json
59
+ *
60
+ * @todo Implementation pending - use bash scripts for now
61
+ */
62
+ export function loadContract(moduleName: string): ModuleContract {
63
+ // TODO: Implementation would read from .cerber/modules/{moduleName}/contract.json
64
+ throw new Error('Not implemented - use bash scripts for now');
65
+ }
66
+
67
+ /**
68
+ * Validate a single module for compliance
69
+ *
70
+ * @todo Implementation pending - use cerber-module-check.sh
71
+ */
72
+ export function validateModule(moduleName: string): ValidationResult {
73
+ // TODO: Implementation would check:
74
+ // - MODULE.md exists and has required sections
75
+ // - contract.json is valid JSON with required fields
76
+ // - dependencies.json references valid modules
77
+ // - No forbidden cross-module imports
78
+ // For now, use: bash team/scripts/cerber-module-check.sh <module-name>
79
+ throw new Error('Not implemented - use cerber-module-check.sh');
80
+ }
81
+
82
+ /**
83
+ * Validate all connection contracts
84
+ *
85
+ * @todo Implementation pending - use cerber-connections-check.sh
86
+ */
87
+ export function validateConnections(): ValidationResult[] {
88
+ // TODO: Implementation would check:
89
+ // - All connections have both sides
90
+ // - Input/output types match
91
+ // - No circular dependencies
92
+ // - Breaking changes detected
93
+ // For now, use: bash team/scripts/cerber-connections-check.sh
94
+ throw new Error('Not implemented - use cerber-connections-check.sh');
95
+ }
96
+
97
+ /**
98
+ * Create focus context for a module
99
+ *
100
+ * Generates FOCUS_CONTEXT.md containing:
101
+ * - MODULE.md content
102
+ * - contract.json interface
103
+ * - dependencies.json
104
+ * - Connection contracts with other modules
105
+ *
106
+ * @todo Implementation pending - use cerber-focus.sh
107
+ */
108
+ export function createFocusContext(moduleName: string): string {
109
+ // TODO: Implementation would concatenate:
110
+ // - .cerber/modules/{moduleName}/MODULE.md
111
+ // - .cerber/modules/{moduleName}/contract.json
112
+ // - .cerber/modules/{moduleName}/dependencies.json
113
+ // - All connection contracts mentioning this module
114
+ // For now, use: bash team/scripts/cerber-focus.sh <module-name>
115
+ throw new Error('Not implemented - use cerber-focus.sh');
116
+ }
117
+
118
+ /**
119
+ * Get list of all modules
120
+ *
121
+ * @todo Implementation pending - use bash to list directories
122
+ */
123
+ export function listModules(): Module[] {
124
+ // TODO: Implementation would scan .cerber/modules directory
125
+ throw new Error('Not implemented - use bash to list .cerber/modules');
126
+ }
127
+
128
+ /**
129
+ * Get module dependencies
130
+ *
131
+ * @todo Implementation pending - parse dependencies.json
132
+ */
133
+ export function getModuleDependencies(moduleName: string): string[] {
134
+ // TODO: Implementation would read dependencies.json
135
+ throw new Error('Not implemented - parse dependencies.json directly');
136
+ }
137
+
138
+ /**
139
+ * Check for circular dependencies
140
+ *
141
+ * @todo Implementation pending - use cerber-connections-check.sh
142
+ */
143
+ export function detectCircularDependencies(): string[][] {
144
+ // TODO: Implementation would build dependency graph and detect cycles
145
+ // For now, use: bash team/scripts/cerber-connections-check.sh
146
+ throw new Error('Not implemented - use cerber-connections-check.sh');
147
+ }
148
+
149
+ /**
150
+ * Get connection contracts for a module
151
+ *
152
+ * @todo Implementation pending - grep connection contracts
153
+ */
154
+ export function getModuleConnections(moduleName: string): Connection[] {
155
+ // TODO: Implementation would find all contracts mentioning the module
156
+ throw new Error('Not implemented - grep .cerber/connections/contracts');
157
+ }
@@ -0,0 +1,195 @@
1
+ #!/bin/bash
2
+ # Cerber TEAM - Add New Module
3
+ #
4
+ # Author: Stefan Pitek
5
+ # Copyright: 2026 Stefan Pitek
6
+ # License: MIT
7
+ #
8
+ # Creates a new module from template with all required files
9
+
10
+ set -e
11
+
12
+ # Colors for output
13
+ RED='\033[0;31m'
14
+ GREEN='\033[0;32m'
15
+ YELLOW='\033[1;33m'
16
+ BLUE='\033[0;34m'
17
+ CYAN='\033[0;36m'
18
+ NC='\033[0m' # No Color
19
+
20
+ # Check if module name provided
21
+ if [ -z "$1" ]; then
22
+ echo -e "${RED}❌ Error: Module name required${NC}"
23
+ echo ""
24
+ echo "Usage: bash team/scripts/cerber-add-module.sh <module-name>"
25
+ echo ""
26
+ echo "Example:"
27
+ echo " bash team/scripts/cerber-add-module.sh payment-gateway"
28
+ echo ""
29
+ echo "Module naming conventions:"
30
+ echo " - Use kebab-case (lowercase with hyphens)"
31
+ echo " - Be descriptive but concise"
32
+ echo " - Examples: pricing-engine, user-auth, payment-gateway"
33
+ exit 1
34
+ fi
35
+
36
+ MODULE_NAME="$1"
37
+ MODULE_DIR=".cerber/modules/${MODULE_NAME}"
38
+ TEMPLATE_DIR="team/templates"
39
+
40
+ echo ""
41
+ echo "🆕 Creating new module: ${MODULE_NAME}"
42
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
43
+ echo ""
44
+
45
+ # Check if module already exists
46
+ if [ -d "$MODULE_DIR" ]; then
47
+ echo -e "${RED}❌ Error: Module '${MODULE_NAME}' already exists${NC}"
48
+ echo ""
49
+ echo "Module directory: ${MODULE_DIR}"
50
+ echo ""
51
+ echo "To work on this module, use:"
52
+ echo " bash team/scripts/cerber-focus.sh ${MODULE_NAME}"
53
+ exit 1
54
+ fi
55
+
56
+ # Create module directory
57
+ echo "Creating module directory..."
58
+ mkdir -p "$MODULE_DIR"
59
+ echo -e "${GREEN}✅${NC} Created ${MODULE_DIR}/"
60
+
61
+ # Copy MODULE.md from template
62
+ echo ""
63
+ echo "Creating MODULE.md from template..."
64
+ if [ -f "${TEMPLATE_DIR}/MODULE_TEMPLATE.md" ]; then
65
+ cp "${TEMPLATE_DIR}/MODULE_TEMPLATE.md" "${MODULE_DIR}/MODULE.md"
66
+
67
+ # Replace placeholder with actual module name
68
+ # Using sed -i.bak for cross-platform compatibility (works on both Linux and macOS)
69
+ sed -i.bak "s/\[MODULE_NAME\]/${MODULE_NAME}/g" "${MODULE_DIR}/MODULE.md"
70
+ rm -f "${MODULE_DIR}/MODULE.md.bak"
71
+
72
+ # Update date
73
+ CURRENT_DATE=$(date '+%Y-%m-%d')
74
+ sed -i.bak "s/YYYY-MM-DD/${CURRENT_DATE}/g" "${MODULE_DIR}/MODULE.md"
75
+ rm -f "${MODULE_DIR}/MODULE.md.bak"
76
+
77
+ echo -e "${GREEN}✅${NC} MODULE.md created from template"
78
+ else
79
+ echo -e "${YELLOW}⚠️${NC} Template not found, creating basic MODULE.md"
80
+ cat > "${MODULE_DIR}/MODULE.md" <<EOF
81
+ # Module: ${MODULE_NAME}
82
+
83
+ **Owner:** [Your Name]
84
+ **Status:** Active
85
+ **Last Updated:** $(date '+%Y-%m-%d')
86
+
87
+ ## Purpose
88
+
89
+ What this module does.
90
+
91
+ ## Responsibilities
92
+
93
+ - Responsibility 1
94
+ - Responsibility 2
95
+
96
+ ## Public Interface
97
+
98
+ Functions/classes that other modules can use.
99
+
100
+ ## Dependencies
101
+
102
+ Modules this module uses.
103
+ EOF
104
+ echo -e "${GREEN}✅${NC} Basic MODULE.md created"
105
+ fi
106
+
107
+ # Create contract.json
108
+ echo ""
109
+ echo "Creating contract.json..."
110
+ cat > "${MODULE_DIR}/contract.json" <<EOF
111
+ {
112
+ "version": "1.0.0",
113
+ "publicInterface": {},
114
+ "dependencies": []
115
+ }
116
+ EOF
117
+ echo -e "${GREEN}✅${NC} contract.json initialized"
118
+
119
+ # Create dependencies.json
120
+ echo ""
121
+ echo "Creating dependencies.json..."
122
+ cat > "${MODULE_DIR}/dependencies.json" <<EOF
123
+ {
124
+ "dependencies": []
125
+ }
126
+ EOF
127
+ echo -e "${GREEN}✅${NC} dependencies.json created"
128
+
129
+ # Update BIBLE.md if it exists
130
+ BIBLE_PATH=".cerber/BIBLE.md"
131
+ if [ -f "$BIBLE_PATH" ]; then
132
+ echo ""
133
+ echo "Updating BIBLE.md..."
134
+
135
+ # Add module entry to BIBLE.md
136
+ if ! grep -q "${MODULE_NAME}" "$BIBLE_PATH"; then
137
+ # Try to add after "### Core Modules" section
138
+ if grep -q "### Core Modules" "$BIBLE_PATH"; then
139
+ # Find line number and insert after it
140
+ LINE_NUM=$(grep -n "### Core Modules" "$BIBLE_PATH" | head -1 | cut -d: -f1)
141
+ LINE_NUM=$((LINE_NUM + 2))
142
+
143
+ # Create backup
144
+ cp "$BIBLE_PATH" "${BIBLE_PATH}.bak"
145
+
146
+ # Insert new module entry
147
+ head -n $LINE_NUM "${BIBLE_PATH}.bak" > "$BIBLE_PATH"
148
+ echo "" >> "$BIBLE_PATH"
149
+ echo "**${MODULE_NAME}** - [Add description]" >> "$BIBLE_PATH"
150
+ echo " - Owner: [Your Name]" >> "$BIBLE_PATH"
151
+ echo " - Status: Active" >> "$BIBLE_PATH"
152
+ echo " - Files: \`src/modules/${MODULE_NAME}/\`" >> "$BIBLE_PATH"
153
+ echo "" >> "$BIBLE_PATH"
154
+ tail -n +$((LINE_NUM + 1)) "${BIBLE_PATH}.bak" >> "$BIBLE_PATH"
155
+
156
+ rm -f "${BIBLE_PATH}.bak"
157
+ echo -e "${GREEN}✅${NC} BIBLE.md updated with new module"
158
+ else
159
+ echo -e "${YELLOW}⚠️${NC} Could not find '### Core Modules' section in BIBLE.md"
160
+ echo " Please manually add module to BIBLE.md"
161
+ fi
162
+ else
163
+ echo -e "${BLUE}ℹ️${NC} Module already exists in BIBLE.md"
164
+ fi
165
+ else
166
+ echo ""
167
+ echo -e "${YELLOW}⚠️${NC} BIBLE.md not found at ${BIBLE_PATH}"
168
+ echo " Consider creating a project BIBLE.md with:"
169
+ echo " cp team/templates/BIBLE_TEMPLATE.md .cerber/BIBLE.md"
170
+ fi
171
+
172
+ echo ""
173
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
174
+ echo -e "${GREEN}✅ Module '${MODULE_NAME}' created successfully!${NC}"
175
+ echo ""
176
+ echo "Module location: ${CYAN}${MODULE_DIR}/${NC}"
177
+ echo ""
178
+ echo "Next steps:"
179
+ echo " 1. Edit module documentation:"
180
+ echo " ${CYAN}nano ${MODULE_DIR}/MODULE.md${NC}"
181
+ echo ""
182
+ echo " 2. Define public interface in:"
183
+ echo " ${CYAN}nano ${MODULE_DIR}/contract.json${NC}"
184
+ echo ""
185
+ echo " 3. List dependencies in:"
186
+ echo " ${CYAN}nano ${MODULE_DIR}/dependencies.json${NC}"
187
+ echo ""
188
+ echo " 4. Enter focus mode to work on this module:"
189
+ echo " ${CYAN}bash team/scripts/cerber-focus.sh ${MODULE_NAME}${NC}"
190
+ echo ""
191
+ echo " 5. Validate your module:"
192
+ echo " ${CYAN}bash team/scripts/cerber-module-check.sh ${MODULE_NAME}${NC}"
193
+ echo ""
194
+
195
+ exit 0
@@ -0,0 +1,186 @@
1
+ #!/bin/bash
2
+ # Cerber TEAM - Connection Contract Validation
3
+ #
4
+ # Author: Stefan Pitek
5
+ # Copyright: 2026 Stefan Pitek
6
+ # License: MIT
7
+ #
8
+ # Validates all connection contracts between modules
9
+
10
+ set -e
11
+
12
+ # Colors for output
13
+ RED='\033[0;31m'
14
+ GREEN='\033[0;32m'
15
+ YELLOW='\033[1;33m'
16
+ BLUE='\033[0;34m'
17
+ NC='\033[0m' # No Color
18
+
19
+ CONNECTIONS_DIR=".cerber/connections/contracts"
20
+ ERRORS=0
21
+ WARNINGS=0
22
+ CHECKED=0
23
+
24
+ echo ""
25
+ echo "🔗 Checking connection contracts..."
26
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
27
+ echo ""
28
+
29
+ # Check if connections directory exists
30
+ if [ ! -d "$CONNECTIONS_DIR" ]; then
31
+ echo -e "${YELLOW}⚠️ No connections directory found${NC}"
32
+ echo ""
33
+ echo "Expected: ${CONNECTIONS_DIR}"
34
+ echo ""
35
+ echo "If you have modules with connections, create connection contracts:"
36
+ echo " mkdir -p ${CONNECTIONS_DIR}"
37
+ echo " cp team/templates/CONNECTION_TEMPLATE.json ${CONNECTIONS_DIR}/module-a-to-module-b.json"
38
+ echo ""
39
+ exit 0
40
+ fi
41
+
42
+ # Check if any contracts exist
43
+ CONTRACT_COUNT=$(find "$CONNECTIONS_DIR" -name "*.json" 2>/dev/null | wc -l)
44
+
45
+ if [ "$CONTRACT_COUNT" -eq 0 ]; then
46
+ echo -e "${BLUE}ℹ️${NC} No connection contracts found"
47
+ echo ""
48
+ echo "This is OK if modules don't communicate yet."
49
+ echo ""
50
+ echo "To create a connection contract:"
51
+ echo " cp team/templates/CONNECTION_TEMPLATE.json ${CONNECTIONS_DIR}/module-a-to-module-b.json"
52
+ echo ""
53
+ exit 0
54
+ fi
55
+
56
+ echo "Found ${CONTRACT_COUNT} connection contract(s)"
57
+ echo ""
58
+
59
+ # Track connections for circular dependency detection
60
+ declare -A connections
61
+
62
+ # Process each contract
63
+ for contract in "$CONNECTIONS_DIR"/*.json; do
64
+ if [ ! -f "$contract" ]; then
65
+ continue
66
+ fi
67
+
68
+ CHECKED=$((CHECKED + 1))
69
+ CONTRACT_NAME=$(basename "$contract")
70
+
71
+ echo "Checking: ${CONTRACT_NAME}"
72
+
73
+ # Validate JSON syntax
74
+ if ! python3 -m json.tool "$contract" >/dev/null 2>&1 && \
75
+ ! node -e "JSON.parse(require('fs').readFileSync('$contract', 'utf8'))" 2>/dev/null; then
76
+ echo -e " ${RED}❌${NC} Invalid JSON syntax"
77
+ ERRORS=$((ERRORS + 1))
78
+ continue
79
+ fi
80
+
81
+ # Extract from and to modules
82
+ FROM_MODULE=$(grep -o '"from"[[:space:]]*:[[:space:]]*"[^"]*"' "$contract" | head -1 | sed 's/.*"\([^"]*\)".*/\1/')
83
+ TO_MODULE=$(grep -o '"to"[[:space:]]*:[[:space:]]*"[^"]*"' "$contract" | head -1 | sed 's/.*"\([^"]*\)".*/\1/')
84
+
85
+ if [ -z "$FROM_MODULE" ] || [ -z "$TO_MODULE" ]; then
86
+ echo -e " ${RED}❌${NC} Missing 'from' or 'to' field"
87
+ ERRORS=$((ERRORS + 1))
88
+ continue
89
+ fi
90
+
91
+ # Store connection for circular check
92
+ connections["${FROM_MODULE}->${TO_MODULE}"]=1
93
+
94
+ # Check if modules exist
95
+ FROM_EXISTS=false
96
+ TO_EXISTS=false
97
+
98
+ if [ -d ".cerber/modules/${FROM_MODULE}" ]; then
99
+ FROM_EXISTS=true
100
+ fi
101
+
102
+ if [ -d ".cerber/modules/${TO_MODULE}" ]; then
103
+ TO_EXISTS=true
104
+ fi
105
+
106
+ if [ "$FROM_EXISTS" = true ] && [ "$TO_EXISTS" = true ]; then
107
+ echo -e " ${GREEN}✅${NC} ${FROM_MODULE} → ${TO_MODULE} (valid)"
108
+ else
109
+ if [ "$FROM_EXISTS" = false ]; then
110
+ echo -e " ${RED}❌${NC} Module '${FROM_MODULE}' not found"
111
+ ERRORS=$((ERRORS + 1))
112
+ fi
113
+ if [ "$TO_EXISTS" = false ]; then
114
+ echo -e " ${RED}❌${NC} Module '${TO_MODULE}' not found"
115
+ ERRORS=$((ERRORS + 1))
116
+ fi
117
+ fi
118
+
119
+ # Check required fields
120
+ HAS_INTERFACE=$(grep -q '"interface"' "$contract" && echo "true" || echo "false")
121
+ HAS_VERSION=$(grep -q '"version"' "$contract" && echo "true" || echo "false")
122
+
123
+ if [ "$HAS_INTERFACE" = false ]; then
124
+ echo -e " ${YELLOW}⚠️${NC} Missing 'interface' field"
125
+ WARNINGS=$((WARNINGS + 1))
126
+ fi
127
+
128
+ if [ "$HAS_VERSION" = false ]; then
129
+ echo -e " ${YELLOW}⚠️${NC} Missing 'version' field"
130
+ WARNINGS=$((WARNINGS + 1))
131
+ fi
132
+
133
+ # Check for breaking changes field
134
+ if ! grep -q '"breaking_changes"' "$contract"; then
135
+ echo -e " ${YELLOW}⚠️${NC} Missing 'breaking_changes' field (recommended for versioning)"
136
+ WARNINGS=$((WARNINGS + 1))
137
+ fi
138
+
139
+ echo ""
140
+ done
141
+
142
+ # Check for circular dependencies (simple check)
143
+ echo "Checking for circular dependencies..."
144
+ CIRCULAR_FOUND=false
145
+
146
+ for key in "${!connections[@]}"; do
147
+ FROM=$(echo "$key" | cut -d'-' -f1)
148
+ TO=$(echo "$key" | cut -d'>' -f2)
149
+
150
+ # Check if reverse connection exists
151
+ if [ -n "${connections[${TO}->${FROM}]}" ]; then
152
+ echo -e "${YELLOW}⚠️${NC} Potential circular dependency: ${FROM} ↔ ${TO}"
153
+ CIRCULAR_FOUND=true
154
+ WARNINGS=$((WARNINGS + 1))
155
+ fi
156
+ done
157
+
158
+ if [ "$CIRCULAR_FOUND" = false ]; then
159
+ echo -e "${GREEN}✅${NC} No circular dependencies detected"
160
+ fi
161
+
162
+ echo ""
163
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
164
+
165
+ # Summary
166
+ if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
167
+ echo -e "${GREEN}✅ ALL CONNECTION CHECKS PASSED${NC}"
168
+ echo ""
169
+ echo "All ${CHECKED} connection contract(s) are valid!"
170
+ echo ""
171
+ exit 0
172
+ elif [ $ERRORS -eq 0 ]; then
173
+ echo -e "${YELLOW}⚠️ CONNECTION CHECKS PASSED WITH WARNINGS${NC}"
174
+ echo ""
175
+ echo "Checked ${CHECKED} contract(s)"
176
+ echo "Found ${WARNINGS} warning(s)"
177
+ echo ""
178
+ exit 0
179
+ else
180
+ echo -e "${RED}❌ CONNECTION CHECK FAILED${NC}"
181
+ echo ""
182
+ echo "Checked ${CHECKED} contract(s)"
183
+ echo "Found ${ERRORS} error(s) and ${WARNINGS} warning(s)"
184
+ echo ""
185
+ exit 1
186
+ fi