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.
- package/.cerber-example/BIBLE.md +132 -0
- package/.cerber-example/CERBER_LAW.md +200 -0
- package/.cerber-example/connections/contracts/booking-to-pricing.json +44 -0
- package/.cerber-example/connections/contracts/pricing-to-booking.json +37 -0
- package/.cerber-example/modules/booking-calendar/MODULE.md +225 -0
- package/.cerber-example/modules/booking-calendar/contract.json +106 -0
- package/.cerber-example/modules/booking-calendar/dependencies.json +8 -0
- package/.cerber-example/modules/pricing-engine/MODULE.md +160 -0
- package/.cerber-example/modules/pricing-engine/contract.json +64 -0
- package/.cerber-example/modules/pricing-engine/dependencies.json +8 -0
- package/CHANGELOG.md +68 -0
- package/LICENSE +21 -0
- package/README.md +1379 -0
- package/bin/cerber +105 -0
- package/bin/cerber-focus +31 -0
- package/bin/cerber-guardian +90 -0
- package/bin/cerber-health +113 -0
- package/bin/cerber-morning +19 -0
- package/bin/cerber-repair +21 -0
- package/dist/cerber/index.d.ts +47 -0
- package/dist/cerber/index.d.ts.map +1 -0
- package/dist/cerber/index.js +154 -0
- package/dist/cerber/index.js.map +1 -0
- package/dist/guardian/index.d.ts +70 -0
- package/dist/guardian/index.d.ts.map +1 -0
- package/dist/guardian/index.js +271 -0
- package/dist/guardian/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/examples/backend-schema.ts +72 -0
- package/examples/frontend-schema.ts +67 -0
- package/examples/health-checks.ts +196 -0
- package/examples/solo-integration/README.md +457 -0
- package/examples/solo-integration/package.json +47 -0
- package/examples/team-integration/README.md +347 -0
- package/examples/team-integration/package.json +23 -0
- package/package.json +104 -0
- package/solo/README.md +258 -0
- package/solo/config/performance-budget.json +53 -0
- package/solo/config/solo-contract.json +71 -0
- package/solo/lib/feature-flags.ts +177 -0
- package/solo/scripts/cerber-auto-repair.js +260 -0
- package/solo/scripts/cerber-daily-check.js +282 -0
- package/solo/scripts/cerber-dashboard.js +191 -0
- package/solo/scripts/cerber-deps-health.js +247 -0
- package/solo/scripts/cerber-docs-sync.js +304 -0
- package/solo/scripts/cerber-flags-check.js +229 -0
- package/solo/scripts/cerber-performance-budget.js +271 -0
- package/solo/scripts/cerber-rollback.js +229 -0
- package/solo/scripts/cerber-snapshot.js +319 -0
- package/team/README.md +327 -0
- package/team/config/team-contract.json +27 -0
- package/team/lib/module-system.ts +157 -0
- package/team/scripts/cerber-add-module.sh +195 -0
- package/team/scripts/cerber-connections-check.sh +186 -0
- package/team/scripts/cerber-focus.sh +170 -0
- package/team/scripts/cerber-module-check.sh +165 -0
- package/team/scripts/cerber-team-morning.sh +210 -0
- package/team/templates/BIBLE_TEMPLATE.md +52 -0
- package/team/templates/CONNECTION_TEMPLATE.json +20 -0
- 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
|