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,170 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Cerber TEAM - Focus Mode
|
|
3
|
+
#
|
|
4
|
+
# Author: Stefan Pitek
|
|
5
|
+
# Copyright: 2026 Stefan Pitek
|
|
6
|
+
# License: MIT
|
|
7
|
+
#
|
|
8
|
+
# Creates FOCUS_CONTEXT.md with all relevant information for a single module
|
|
9
|
+
# This allows AI to work with 500 LOC instead of 10,000 LOC (10x faster)
|
|
10
|
+
|
|
11
|
+
set -e
|
|
12
|
+
|
|
13
|
+
# Colors for output
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
BLUE='\033[0;34m'
|
|
18
|
+
CYAN='\033[0;36m'
|
|
19
|
+
NC='\033[0m' # No Color
|
|
20
|
+
|
|
21
|
+
# Check if module name provided
|
|
22
|
+
if [ -z "$1" ]; then
|
|
23
|
+
echo -e "${RED}❌ Error: Module name required${NC}"
|
|
24
|
+
echo ""
|
|
25
|
+
echo "Usage: bash team/scripts/cerber-focus.sh <module-name>"
|
|
26
|
+
echo ""
|
|
27
|
+
echo "Example:"
|
|
28
|
+
echo " bash team/scripts/cerber-focus.sh pricing-engine"
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
MODULE_NAME="$1"
|
|
33
|
+
MODULE_DIR=".cerber/modules/${MODULE_NAME}"
|
|
34
|
+
OUTPUT_FILE=".cerber/FOCUS_CONTEXT.md"
|
|
35
|
+
|
|
36
|
+
# Check if module exists
|
|
37
|
+
if [ ! -d "$MODULE_DIR" ]; then
|
|
38
|
+
echo -e "${RED}❌ Error: Module '${MODULE_NAME}' not found${NC}"
|
|
39
|
+
echo ""
|
|
40
|
+
echo "Module directory does not exist: ${MODULE_DIR}"
|
|
41
|
+
echo ""
|
|
42
|
+
echo "Available modules:"
|
|
43
|
+
if [ -d ".cerber/modules" ]; then
|
|
44
|
+
ls -1 .cerber/modules/ 2>/dev/null || echo " (none)"
|
|
45
|
+
else
|
|
46
|
+
echo " (none - .cerber/modules directory not found)"
|
|
47
|
+
fi
|
|
48
|
+
echo ""
|
|
49
|
+
echo "Create a new module with:"
|
|
50
|
+
echo " bash team/scripts/cerber-add-module.sh ${MODULE_NAME}"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Create .cerber directory if it doesn't exist
|
|
55
|
+
mkdir -p .cerber
|
|
56
|
+
|
|
57
|
+
# Start building focus context
|
|
58
|
+
echo "# FOCUS CONTEXT - ${MODULE_NAME}" > "$OUTPUT_FILE"
|
|
59
|
+
echo "" >> "$OUTPUT_FILE"
|
|
60
|
+
echo "**Generated:** $(date '+%Y-%m-%d %H:%M:%S')" >> "$OUTPUT_FILE"
|
|
61
|
+
echo "**Module:** ${MODULE_NAME}" >> "$OUTPUT_FILE"
|
|
62
|
+
echo "" >> "$OUTPUT_FILE"
|
|
63
|
+
echo "---" >> "$OUTPUT_FILE"
|
|
64
|
+
echo "" >> "$OUTPUT_FILE"
|
|
65
|
+
|
|
66
|
+
# Add MODULE.md (required)
|
|
67
|
+
if [ -f "${MODULE_DIR}/MODULE.md" ]; then
|
|
68
|
+
echo "## Module Documentation" >> "$OUTPUT_FILE"
|
|
69
|
+
echo "" >> "$OUTPUT_FILE"
|
|
70
|
+
cat "${MODULE_DIR}/MODULE.md" >> "$OUTPUT_FILE"
|
|
71
|
+
echo "" >> "$OUTPUT_FILE"
|
|
72
|
+
echo "---" >> "$OUTPUT_FILE"
|
|
73
|
+
echo "" >> "$OUTPUT_FILE"
|
|
74
|
+
else
|
|
75
|
+
echo -e "${RED}❌ Error: ${MODULE_DIR}/MODULE.md not found${NC}"
|
|
76
|
+
echo ""
|
|
77
|
+
echo "MODULE.md is required for focus mode. Create it with:"
|
|
78
|
+
echo " bash team/scripts/cerber-add-module.sh ${MODULE_NAME}"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Add contract.json
|
|
83
|
+
if [ -f "${MODULE_DIR}/contract.json" ]; then
|
|
84
|
+
echo "## Module Contract (Public Interface)" >> "$OUTPUT_FILE"
|
|
85
|
+
echo "" >> "$OUTPUT_FILE"
|
|
86
|
+
echo '```json' >> "$OUTPUT_FILE"
|
|
87
|
+
cat "${MODULE_DIR}/contract.json" >> "$OUTPUT_FILE"
|
|
88
|
+
echo "" >> "$OUTPUT_FILE"
|
|
89
|
+
echo '```' >> "$OUTPUT_FILE"
|
|
90
|
+
echo "" >> "$OUTPUT_FILE"
|
|
91
|
+
echo "---" >> "$OUTPUT_FILE"
|
|
92
|
+
echo "" >> "$OUTPUT_FILE"
|
|
93
|
+
else
|
|
94
|
+
echo -e "${YELLOW}⚠️ Warning: ${MODULE_DIR}/contract.json not found${NC}"
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# Add dependencies.json
|
|
98
|
+
if [ -f "${MODULE_DIR}/dependencies.json" ]; then
|
|
99
|
+
echo "## Module Dependencies" >> "$OUTPUT_FILE"
|
|
100
|
+
echo "" >> "$OUTPUT_FILE"
|
|
101
|
+
echo '```json' >> "$OUTPUT_FILE"
|
|
102
|
+
cat "${MODULE_DIR}/dependencies.json" >> "$OUTPUT_FILE"
|
|
103
|
+
echo "" >> "$OUTPUT_FILE"
|
|
104
|
+
echo '```' >> "$OUTPUT_FILE"
|
|
105
|
+
echo "" >> "$OUTPUT_FILE"
|
|
106
|
+
echo "---" >> "$OUTPUT_FILE"
|
|
107
|
+
echo "" >> "$OUTPUT_FILE"
|
|
108
|
+
else
|
|
109
|
+
echo -e "${YELLOW}⚠️ Warning: ${MODULE_DIR}/dependencies.json not found${NC}"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# Find and add connection contracts
|
|
113
|
+
CONNECTIONS_DIR=".cerber/connections/contracts"
|
|
114
|
+
if [ -d "$CONNECTIONS_DIR" ]; then
|
|
115
|
+
# Find contracts that mention this module
|
|
116
|
+
FOUND_CONNECTIONS=false
|
|
117
|
+
|
|
118
|
+
echo "## Connection Contracts" >> "$OUTPUT_FILE"
|
|
119
|
+
echo "" >> "$OUTPUT_FILE"
|
|
120
|
+
|
|
121
|
+
for contract in "$CONNECTIONS_DIR"/*.json; do
|
|
122
|
+
if [ -f "$contract" ]; then
|
|
123
|
+
# Check if this contract involves our module
|
|
124
|
+
if grep -q "\"${MODULE_NAME}\"" "$contract" 2>/dev/null; then
|
|
125
|
+
if [ "$FOUND_CONNECTIONS" = false ]; then
|
|
126
|
+
FOUND_CONNECTIONS=true
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
CONTRACT_NAME=$(basename "$contract")
|
|
130
|
+
echo "### ${CONTRACT_NAME}" >> "$OUTPUT_FILE"
|
|
131
|
+
echo "" >> "$OUTPUT_FILE"
|
|
132
|
+
echo '```json' >> "$OUTPUT_FILE"
|
|
133
|
+
cat "$contract" >> "$OUTPUT_FILE"
|
|
134
|
+
echo "" >> "$OUTPUT_FILE"
|
|
135
|
+
echo '```' >> "$OUTPUT_FILE"
|
|
136
|
+
echo "" >> "$OUTPUT_FILE"
|
|
137
|
+
fi
|
|
138
|
+
fi
|
|
139
|
+
done
|
|
140
|
+
|
|
141
|
+
if [ "$FOUND_CONNECTIONS" = false ]; then
|
|
142
|
+
echo "*No connection contracts found for this module.*" >> "$OUTPUT_FILE"
|
|
143
|
+
echo "" >> "$OUTPUT_FILE"
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
echo "---" >> "$OUTPUT_FILE"
|
|
147
|
+
echo "" >> "$OUTPUT_FILE"
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Calculate statistics
|
|
151
|
+
LINE_COUNT=$(wc -l < "$OUTPUT_FILE")
|
|
152
|
+
CHAR_COUNT=$(wc -c < "$OUTPUT_FILE")
|
|
153
|
+
|
|
154
|
+
# Output success message
|
|
155
|
+
echo ""
|
|
156
|
+
echo -e "${GREEN}✅ Focus context created successfully!${NC}"
|
|
157
|
+
echo ""
|
|
158
|
+
echo -e "${CYAN}📖 Focus context: ${OUTPUT_FILE}${NC}"
|
|
159
|
+
echo -e "${CYAN}📊 Context contains ${LINE_COUNT} lines (${CHAR_COUNT} characters)${NC}"
|
|
160
|
+
echo ""
|
|
161
|
+
echo -e "${BLUE}🤖 AI can now work with focused context instead of entire codebase${NC}"
|
|
162
|
+
echo -e "${BLUE} This is typically 10x faster for AI processing${NC}"
|
|
163
|
+
echo ""
|
|
164
|
+
echo -e "Next steps:"
|
|
165
|
+
echo -e " 1. View context: ${CYAN}cat ${OUTPUT_FILE}${NC}"
|
|
166
|
+
echo -e " 2. Share with AI for focused work on ${MODULE_NAME}"
|
|
167
|
+
echo -e " 3. Validate module: ${CYAN}bash team/scripts/cerber-module-check.sh ${MODULE_NAME}${NC}"
|
|
168
|
+
echo ""
|
|
169
|
+
|
|
170
|
+
exit 0
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Cerber TEAM - Module Validation
|
|
3
|
+
#
|
|
4
|
+
# Author: Stefan Pitek
|
|
5
|
+
# Copyright: 2026 Stefan Pitek
|
|
6
|
+
# License: MIT
|
|
7
|
+
#
|
|
8
|
+
# Validates a single module for compliance with module system requirements
|
|
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
|
+
# Check if module name provided
|
|
20
|
+
if [ -z "$1" ]; then
|
|
21
|
+
echo -e "${RED}❌ Error: Module name required${NC}"
|
|
22
|
+
echo ""
|
|
23
|
+
echo "Usage: bash team/scripts/cerber-module-check.sh <module-name>"
|
|
24
|
+
echo ""
|
|
25
|
+
echo "Example:"
|
|
26
|
+
echo " bash team/scripts/cerber-module-check.sh pricing-engine"
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
MODULE_NAME="$1"
|
|
31
|
+
MODULE_DIR=".cerber/modules/${MODULE_NAME}"
|
|
32
|
+
ERRORS=0
|
|
33
|
+
WARNINGS=0
|
|
34
|
+
|
|
35
|
+
echo ""
|
|
36
|
+
echo "🔍 Validating module: ${MODULE_NAME}"
|
|
37
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
38
|
+
echo ""
|
|
39
|
+
|
|
40
|
+
# Check if module exists
|
|
41
|
+
if [ ! -d "$MODULE_DIR" ]; then
|
|
42
|
+
echo -e "${RED}❌ Module directory not found: ${MODULE_DIR}${NC}"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Check MODULE.md exists
|
|
47
|
+
if [ -f "${MODULE_DIR}/MODULE.md" ]; then
|
|
48
|
+
echo -e "${GREEN}✅${NC} MODULE.md exists"
|
|
49
|
+
|
|
50
|
+
# Check if MODULE.md has required sections
|
|
51
|
+
if grep -q "## Purpose" "${MODULE_DIR}/MODULE.md" && \
|
|
52
|
+
grep -q "## Responsibilities" "${MODULE_DIR}/MODULE.md" && \
|
|
53
|
+
grep -q "## Public Interface" "${MODULE_DIR}/MODULE.md"; then
|
|
54
|
+
echo -e "${GREEN}✅${NC} MODULE.md has required sections"
|
|
55
|
+
else
|
|
56
|
+
echo -e "${YELLOW}⚠️${NC} MODULE.md missing required sections (Purpose, Responsibilities, Public Interface)"
|
|
57
|
+
WARNINGS=$((WARNINGS + 1))
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Check if MODULE.md is not just template
|
|
61
|
+
if grep -q "\[MODULE_NAME\]" "${MODULE_DIR}/MODULE.md"; then
|
|
62
|
+
echo -e "${YELLOW}⚠️${NC} MODULE.md appears to be unmodified template"
|
|
63
|
+
WARNINGS=$((WARNINGS + 1))
|
|
64
|
+
fi
|
|
65
|
+
else
|
|
66
|
+
echo -e "${RED}❌${NC} MODULE.md missing"
|
|
67
|
+
ERRORS=$((ERRORS + 1))
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# Check contract.json exists and is valid JSON
|
|
71
|
+
if [ -f "${MODULE_DIR}/contract.json" ]; then
|
|
72
|
+
echo -e "${GREEN}✅${NC} contract.json exists"
|
|
73
|
+
|
|
74
|
+
# Validate JSON syntax
|
|
75
|
+
if python3 -m json.tool "${MODULE_DIR}/contract.json" >/dev/null 2>&1 || \
|
|
76
|
+
node -e "JSON.parse(require('fs').readFileSync('${MODULE_DIR}/contract.json', 'utf8'))" 2>/dev/null; then
|
|
77
|
+
echo -e "${GREEN}✅${NC} contract.json is valid JSON"
|
|
78
|
+
|
|
79
|
+
# Check required fields
|
|
80
|
+
if grep -q '"version"' "${MODULE_DIR}/contract.json" && \
|
|
81
|
+
grep -q '"publicInterface"' "${MODULE_DIR}/contract.json"; then
|
|
82
|
+
echo -e "${GREEN}✅${NC} contract.json has required fields"
|
|
83
|
+
else
|
|
84
|
+
echo -e "${YELLOW}⚠️${NC} contract.json missing required fields (version, publicInterface)"
|
|
85
|
+
WARNINGS=$((WARNINGS + 1))
|
|
86
|
+
fi
|
|
87
|
+
else
|
|
88
|
+
echo -e "${RED}❌${NC} contract.json has invalid JSON syntax"
|
|
89
|
+
ERRORS=$((ERRORS + 1))
|
|
90
|
+
fi
|
|
91
|
+
else
|
|
92
|
+
echo -e "${RED}❌${NC} contract.json missing"
|
|
93
|
+
ERRORS=$((ERRORS + 1))
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Check dependencies.json exists and is valid JSON
|
|
97
|
+
if [ -f "${MODULE_DIR}/dependencies.json" ]; then
|
|
98
|
+
echo -e "${GREEN}✅${NC} dependencies.json exists"
|
|
99
|
+
|
|
100
|
+
# Validate JSON syntax
|
|
101
|
+
if python3 -m json.tool "${MODULE_DIR}/dependencies.json" >/dev/null 2>&1 || \
|
|
102
|
+
node -e "JSON.parse(require('fs').readFileSync('${MODULE_DIR}/dependencies.json', 'utf8'))" 2>/dev/null; then
|
|
103
|
+
echo -e "${GREEN}✅${NC} dependencies.json is valid JSON"
|
|
104
|
+
|
|
105
|
+
# Check if dependencies reference valid modules
|
|
106
|
+
if [ -f "${MODULE_DIR}/dependencies.json" ]; then
|
|
107
|
+
# Extract dependency names (assuming array format)
|
|
108
|
+
deps=$(grep -o '"[^"]*"' "${MODULE_DIR}/dependencies.json" | tr -d '"' | grep -v "dependencies" || echo "")
|
|
109
|
+
if [ -n "$deps" ]; then
|
|
110
|
+
ALL_DEPS_VALID=true
|
|
111
|
+
for dep in $deps; do
|
|
112
|
+
if [ -d ".cerber/modules/${dep}" ]; then
|
|
113
|
+
: # Dependency exists
|
|
114
|
+
else
|
|
115
|
+
echo -e "${YELLOW}⚠️${NC} Dependency '${dep}' not found in .cerber/modules/"
|
|
116
|
+
WARNINGS=$((WARNINGS + 1))
|
|
117
|
+
ALL_DEPS_VALID=false
|
|
118
|
+
fi
|
|
119
|
+
done
|
|
120
|
+
if [ "$ALL_DEPS_VALID" = true ]; then
|
|
121
|
+
echo -e "${GREEN}✅${NC} All dependencies reference valid modules"
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
fi
|
|
125
|
+
else
|
|
126
|
+
echo -e "${RED}❌${NC} dependencies.json has invalid JSON syntax"
|
|
127
|
+
ERRORS=$((ERRORS + 1))
|
|
128
|
+
fi
|
|
129
|
+
else
|
|
130
|
+
echo -e "${YELLOW}⚠️${NC} dependencies.json missing (optional but recommended)"
|
|
131
|
+
WARNINGS=$((WARNINGS + 1))
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Check for forbidden cross-module imports (if source files exist)
|
|
135
|
+
# This is a placeholder - would need to know actual source directory structure
|
|
136
|
+
if [ -d "src/modules/${MODULE_NAME}" ]; then
|
|
137
|
+
echo -e "${BLUE}ℹ️${NC} Source directory found: src/modules/${MODULE_NAME}"
|
|
138
|
+
# Could add more sophisticated import checking here
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
echo ""
|
|
142
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
143
|
+
|
|
144
|
+
# Summary
|
|
145
|
+
if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
|
|
146
|
+
echo -e "${GREEN}✅ MODULE CHECK PASSED${NC}"
|
|
147
|
+
echo ""
|
|
148
|
+
echo "Module '${MODULE_NAME}' is fully compliant!"
|
|
149
|
+
echo ""
|
|
150
|
+
exit 0
|
|
151
|
+
elif [ $ERRORS -eq 0 ]; then
|
|
152
|
+
echo -e "${YELLOW}⚠️ MODULE CHECK PASSED WITH WARNINGS${NC}"
|
|
153
|
+
echo ""
|
|
154
|
+
echo "Found ${WARNINGS} warning(s)"
|
|
155
|
+
echo "Module is functional but could be improved"
|
|
156
|
+
echo ""
|
|
157
|
+
exit 0
|
|
158
|
+
else
|
|
159
|
+
echo -e "${RED}❌ MODULE CHECK FAILED${NC}"
|
|
160
|
+
echo ""
|
|
161
|
+
echo "Found ${ERRORS} error(s) and ${WARNINGS} warning(s)"
|
|
162
|
+
echo "Please fix errors before using this module"
|
|
163
|
+
echo ""
|
|
164
|
+
exit 1
|
|
165
|
+
fi
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Cerber TEAM - Team Morning Dashboard
|
|
3
|
+
#
|
|
4
|
+
# Author: Stefan Pitek
|
|
5
|
+
# Copyright: 2026 Stefan Pitek
|
|
6
|
+
# License: MIT
|
|
7
|
+
#
|
|
8
|
+
# Shows team morning dashboard with module health and assignments
|
|
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
|
+
MAGENTA='\033[0;35m'
|
|
19
|
+
BOLD='\033[1m'
|
|
20
|
+
NC='\033[0m' # No Color
|
|
21
|
+
|
|
22
|
+
echo ""
|
|
23
|
+
echo -e "${BOLD}${CYAN}╔═══════════════════════════════════════════════════════════╗${NC}"
|
|
24
|
+
echo -e "${BOLD}${CYAN}║ 🛡️ CERBER TEAM - Morning Dashboard ║${NC}"
|
|
25
|
+
echo -e "${BOLD}${CYAN}╚═══════════════════════════════════════════════════════════╝${NC}"
|
|
26
|
+
echo ""
|
|
27
|
+
echo -e "${BLUE}Date:${NC} $(date '+%A, %B %d, %Y at %H:%M')"
|
|
28
|
+
echo ""
|
|
29
|
+
|
|
30
|
+
# Check if .cerber directory exists
|
|
31
|
+
if [ ! -d ".cerber" ]; then
|
|
32
|
+
echo -e "${YELLOW}⚠️ No .cerber directory found${NC}"
|
|
33
|
+
echo ""
|
|
34
|
+
echo "Initialize Cerber TEAM by creating your first module:"
|
|
35
|
+
echo " bash team/scripts/cerber-add-module.sh my-first-module"
|
|
36
|
+
echo ""
|
|
37
|
+
exit 0
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Module Status
|
|
41
|
+
echo -e "${BOLD}📦 Modules Status${NC}"
|
|
42
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
43
|
+
echo ""
|
|
44
|
+
|
|
45
|
+
if [ -d ".cerber/modules" ]; then
|
|
46
|
+
MODULE_COUNT=$(find .cerber/modules -maxdepth 1 -type d | tail -n +2 | wc -l)
|
|
47
|
+
|
|
48
|
+
if [ "$MODULE_COUNT" -eq 0 ]; then
|
|
49
|
+
echo -e "${BLUE}ℹ️${NC} No modules found"
|
|
50
|
+
echo ""
|
|
51
|
+
echo "Create your first module:"
|
|
52
|
+
echo " bash team/scripts/cerber-add-module.sh my-module"
|
|
53
|
+
else
|
|
54
|
+
echo -e "Total modules: ${GREEN}${MODULE_COUNT}${NC}"
|
|
55
|
+
echo ""
|
|
56
|
+
|
|
57
|
+
# List modules with basic health check
|
|
58
|
+
for module_dir in .cerber/modules/*/; do
|
|
59
|
+
if [ -d "$module_dir" ]; then
|
|
60
|
+
module_name=$(basename "$module_dir")
|
|
61
|
+
|
|
62
|
+
# Quick health check
|
|
63
|
+
HEALTH="✅"
|
|
64
|
+
HEALTH_MSG="Healthy"
|
|
65
|
+
|
|
66
|
+
if [ ! -f "${module_dir}/MODULE.md" ]; then
|
|
67
|
+
HEALTH="⚠️"
|
|
68
|
+
HEALTH_MSG="Missing MODULE.md"
|
|
69
|
+
elif [ ! -f "${module_dir}/contract.json" ]; then
|
|
70
|
+
HEALTH="⚠️"
|
|
71
|
+
HEALTH_MSG="Missing contract.json"
|
|
72
|
+
elif grep -q "\[MODULE_NAME\]" "${module_dir}/MODULE.md" 2>/dev/null; then
|
|
73
|
+
HEALTH="⚠️"
|
|
74
|
+
HEALTH_MSG="Uninitialized template"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# Get owner if available
|
|
78
|
+
OWNER="Unknown"
|
|
79
|
+
if [ -f "${module_dir}/MODULE.md" ]; then
|
|
80
|
+
OWNER=$(grep "^\*\*Owner:\*\*" "${module_dir}/MODULE.md" | sed 's/\*\*Owner:\*\* //' | sed 's/\[Team Member Name\]/Unknown/' | sed 's/\[Your Name\]/Unknown/' || echo "Unknown")
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
echo -e " ${HEALTH} ${CYAN}${module_name}${NC}"
|
|
84
|
+
echo -e " Owner: ${OWNER}"
|
|
85
|
+
echo -e " Status: ${HEALTH_MSG}"
|
|
86
|
+
echo ""
|
|
87
|
+
fi
|
|
88
|
+
done
|
|
89
|
+
fi
|
|
90
|
+
else
|
|
91
|
+
echo -e "${BLUE}ℹ️${NC} No modules directory found"
|
|
92
|
+
echo ""
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Connection Contracts Status
|
|
96
|
+
echo ""
|
|
97
|
+
echo -e "${BOLD}🔗 Connection Contracts${NC}"
|
|
98
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
99
|
+
echo ""
|
|
100
|
+
|
|
101
|
+
if [ -d ".cerber/connections/contracts" ]; then
|
|
102
|
+
CONTRACT_COUNT=$(find .cerber/connections/contracts -name "*.json" 2>/dev/null | wc -l)
|
|
103
|
+
|
|
104
|
+
if [ "$CONTRACT_COUNT" -eq 0 ]; then
|
|
105
|
+
echo -e "${BLUE}ℹ️${NC} No connection contracts found"
|
|
106
|
+
else
|
|
107
|
+
echo -e "Total connections: ${GREEN}${CONTRACT_COUNT}${NC}"
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
# Quick validation
|
|
111
|
+
VALID=0
|
|
112
|
+
INVALID=0
|
|
113
|
+
|
|
114
|
+
for contract in .cerber/connections/contracts/*.json; do
|
|
115
|
+
if [ -f "$contract" ]; then
|
|
116
|
+
if python3 -m json.tool "$contract" >/dev/null 2>&1 || \
|
|
117
|
+
node -e "JSON.parse(require('fs').readFileSync('$contract', 'utf8'))" 2>/dev/null; then
|
|
118
|
+
VALID=$((VALID + 1))
|
|
119
|
+
else
|
|
120
|
+
INVALID=$((INVALID + 1))
|
|
121
|
+
fi
|
|
122
|
+
fi
|
|
123
|
+
done
|
|
124
|
+
|
|
125
|
+
echo -e " ${GREEN}✅${NC} Valid: ${VALID}"
|
|
126
|
+
if [ $INVALID -gt 0 ]; then
|
|
127
|
+
echo -e " ${RED}❌${NC} Invalid: ${INVALID}"
|
|
128
|
+
fi
|
|
129
|
+
fi
|
|
130
|
+
else
|
|
131
|
+
echo -e "${BLUE}ℹ️${NC} No connections directory found"
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Recent Activity
|
|
135
|
+
echo ""
|
|
136
|
+
echo -e "${BOLD}📊 Recent Activity${NC}"
|
|
137
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
138
|
+
echo ""
|
|
139
|
+
|
|
140
|
+
if [ -d ".cerber/modules" ]; then
|
|
141
|
+
# Find most recently modified modules
|
|
142
|
+
echo "Recently updated modules:"
|
|
143
|
+
echo ""
|
|
144
|
+
|
|
145
|
+
find .cerber/modules -name "MODULE.md" -type f -exec ls -lt {} + 2>/dev/null | head -5 | while read -r line; do
|
|
146
|
+
file=$(echo "$line" | awk '{print $NF}')
|
|
147
|
+
module=$(echo "$file" | sed 's|.cerber/modules/||' | sed 's|/MODULE.md||')
|
|
148
|
+
mod_time=$(echo "$line" | awk '{print $6, $7, $8}')
|
|
149
|
+
|
|
150
|
+
if [ -n "$module" ]; then
|
|
151
|
+
echo -e " ${CYAN}${module}${NC} - Last modified: ${mod_time}"
|
|
152
|
+
fi
|
|
153
|
+
done
|
|
154
|
+
else
|
|
155
|
+
echo -e "${BLUE}ℹ️${NC} No activity to show"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Quick Actions
|
|
159
|
+
echo ""
|
|
160
|
+
echo ""
|
|
161
|
+
echo -e "${BOLD}🚀 Quick Actions${NC}"
|
|
162
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
163
|
+
echo ""
|
|
164
|
+
echo " Create module: bash team/scripts/cerber-add-module.sh <name>"
|
|
165
|
+
echo " Focus on module: bash team/scripts/cerber-focus.sh <name>"
|
|
166
|
+
echo " Check module: bash team/scripts/cerber-module-check.sh <name>"
|
|
167
|
+
echo " Check connections: bash team/scripts/cerber-connections-check.sh"
|
|
168
|
+
echo ""
|
|
169
|
+
|
|
170
|
+
# Recommendations
|
|
171
|
+
echo -e "${BOLD}💡 Today's Focus${NC}"
|
|
172
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
173
|
+
echo ""
|
|
174
|
+
|
|
175
|
+
# Check for issues that need attention
|
|
176
|
+
NEEDS_ATTENTION=false
|
|
177
|
+
|
|
178
|
+
if [ -d ".cerber/modules" ]; then
|
|
179
|
+
for module_dir in .cerber/modules/*/; do
|
|
180
|
+
if [ -d "$module_dir" ]; then
|
|
181
|
+
module_name=$(basename "$module_dir")
|
|
182
|
+
|
|
183
|
+
if [ ! -f "${module_dir}/MODULE.md" ] || [ ! -f "${module_dir}/contract.json" ]; then
|
|
184
|
+
if [ "$NEEDS_ATTENTION" = false ]; then
|
|
185
|
+
echo -e "${YELLOW}Modules needing attention:${NC}"
|
|
186
|
+
NEEDS_ATTENTION=true
|
|
187
|
+
fi
|
|
188
|
+
echo -e " • ${module_name} - incomplete setup"
|
|
189
|
+
elif grep -q "\[MODULE_NAME\]" "${module_dir}/MODULE.md" 2>/dev/null; then
|
|
190
|
+
if [ "$NEEDS_ATTENTION" = false ]; then
|
|
191
|
+
echo -e "${YELLOW}Modules needing attention:${NC}"
|
|
192
|
+
NEEDS_ATTENTION=true
|
|
193
|
+
fi
|
|
194
|
+
echo -e " • ${module_name} - template not customized"
|
|
195
|
+
fi
|
|
196
|
+
fi
|
|
197
|
+
done
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
if [ "$NEEDS_ATTENTION" = false ]; then
|
|
201
|
+
echo -e "${GREEN}✅ All modules are in good shape!${NC}"
|
|
202
|
+
echo ""
|
|
203
|
+
echo "Ready to build great things today! 🚀"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
echo ""
|
|
207
|
+
echo -e "${BOLD}${CYAN}═══════════════════════════════════════════════════════════${NC}"
|
|
208
|
+
echo ""
|
|
209
|
+
|
|
210
|
+
exit 0
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# PROJECT BIBLE - Master Map
|
|
2
|
+
|
|
3
|
+
**Project:** [Project Name]
|
|
4
|
+
**Owner:** Stefan Pitek
|
|
5
|
+
**Last Updated:** YYYY-MM-DD
|
|
6
|
+
|
|
7
|
+
## Architecture Overview
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────┐
|
|
11
|
+
│ Frontend (React/Next.js) │
|
|
12
|
+
└─────────────────┬───────────────────────┘
|
|
13
|
+
│
|
|
14
|
+
▼
|
|
15
|
+
┌─────────────────────────────────────────┐
|
|
16
|
+
│ API Layer (Express) │
|
|
17
|
+
└─────────────────┬───────────────────────┘
|
|
18
|
+
│
|
|
19
|
+
┌─────────┼─────────┐
|
|
20
|
+
▼ ▼ ▼
|
|
21
|
+
Module A Module B Module C
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Modules Index
|
|
25
|
+
|
|
26
|
+
### Core Modules
|
|
27
|
+
|
|
28
|
+
1. **module-a** - Purpose
|
|
29
|
+
- Owner: Name
|
|
30
|
+
- Status: Active
|
|
31
|
+
- Files: `src/modules/module-a/`
|
|
32
|
+
|
|
33
|
+
2. **module-b** - Purpose
|
|
34
|
+
- Owner: Name
|
|
35
|
+
- Status: Active
|
|
36
|
+
- Files: `src/modules/module-b/`
|
|
37
|
+
|
|
38
|
+
## Connections Map
|
|
39
|
+
|
|
40
|
+
- `module-a` → `module-b`: processData()
|
|
41
|
+
- `module-b` → `module-c`: validateInput()
|
|
42
|
+
|
|
43
|
+
## Team Responsibilities
|
|
44
|
+
|
|
45
|
+
- **Developer A**: module-a, module-d
|
|
46
|
+
- **Developer B**: module-b, module-c
|
|
47
|
+
|
|
48
|
+
## Tech Stack
|
|
49
|
+
|
|
50
|
+
- Backend: Node.js, Express, TypeScript
|
|
51
|
+
- Database: PostgreSQL, Redis
|
|
52
|
+
- Testing: Jest, Supertest
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "module-a-to-module-b",
|
|
3
|
+
"from": "module-a",
|
|
4
|
+
"to": "module-b",
|
|
5
|
+
"type": "function-call",
|
|
6
|
+
"interface": {
|
|
7
|
+
"function": "processData",
|
|
8
|
+
"input": {
|
|
9
|
+
"type": "ProcessParams",
|
|
10
|
+
"fields": ["userId", "data"]
|
|
11
|
+
},
|
|
12
|
+
"output": {
|
|
13
|
+
"type": "ProcessResult",
|
|
14
|
+
"fields": ["success", "result"]
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"version": "1.0.0",
|
|
18
|
+
"breaking_changes": [],
|
|
19
|
+
"notes": ""
|
|
20
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Module: [MODULE_NAME]
|
|
2
|
+
|
|
3
|
+
**Owner:** [Team Member Name]
|
|
4
|
+
**Status:** Active
|
|
5
|
+
**Last Updated:** YYYY-MM-DD
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
What this module does (1-2 sentences).
|
|
10
|
+
|
|
11
|
+
## Responsibilities
|
|
12
|
+
|
|
13
|
+
- Responsibility 1
|
|
14
|
+
- Responsibility 2
|
|
15
|
+
|
|
16
|
+
## Public Interface
|
|
17
|
+
|
|
18
|
+
Functions/classes that other modules can use:
|
|
19
|
+
|
|
20
|
+
### `functionName(params: Type): ReturnType`
|
|
21
|
+
|
|
22
|
+
Description of what it does.
|
|
23
|
+
|
|
24
|
+
**Parameters:**
|
|
25
|
+
- `param1` - Description
|
|
26
|
+
|
|
27
|
+
**Returns:**
|
|
28
|
+
- Description
|
|
29
|
+
|
|
30
|
+
**Example:**
|
|
31
|
+
```typescript
|
|
32
|
+
import { functionName } from './modules/[MODULE_NAME]';
|
|
33
|
+
const result = functionName({ ... });
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Dependencies
|
|
37
|
+
|
|
38
|
+
Modules this module uses:
|
|
39
|
+
- `module-a` - Why we use it
|
|
40
|
+
- `module-b` - Why we use it
|
|
41
|
+
|
|
42
|
+
## File Structure
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
src/modules/module-name/
|
|
46
|
+
├── index.ts - Public interface
|
|
47
|
+
├── core.ts - Core logic
|
|
48
|
+
└── types.ts - Type definitions
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Testing
|
|
52
|
+
|
|
53
|
+
How to test this module:
|
|
54
|
+
```bash
|
|
55
|
+
npm test -- module-name
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Notes
|
|
59
|
+
|
|
60
|
+
Any special considerations, gotchas, or future plans.
|