ma-agents 3.2.0 → 3.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/.opencode/skills/.ma-agents.json +99 -99
- package/.roo/rules/00-ma-agents.md +13 -0
- package/.roo/skills/.ma-agents.json +241 -0
- package/.roo/skills/MANIFEST.yaml +254 -0
- package/.roo/skills/ai-audit-trail/SKILL.md +23 -0
- package/.roo/skills/auto-bug-detection/SKILL.md +169 -0
- package/.roo/skills/cmake-best-practices/SKILL.md +64 -0
- package/.roo/skills/cmake-best-practices/examples/cmake.md +59 -0
- package/.roo/skills/code-documentation/SKILL.md +57 -0
- package/.roo/skills/code-documentation/examples/cpp.md +29 -0
- package/.roo/skills/code-documentation/examples/csharp.md +28 -0
- package/.roo/skills/code-documentation/examples/javascript_typescript.md +28 -0
- package/.roo/skills/code-documentation/examples/python.md +57 -0
- package/.roo/skills/code-review/SKILL.md +43 -0
- package/.roo/skills/commit-message/SKILL.md +79 -0
- package/.roo/skills/cpp-best-practices/SKILL.md +234 -0
- package/.roo/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
- package/.roo/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
- package/.roo/skills/cpp-concurrency-safety/SKILL.md +60 -0
- package/.roo/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
- package/.roo/skills/cpp-const-correctness/SKILL.md +63 -0
- package/.roo/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
- package/.roo/skills/cpp-memory-handling/SKILL.md +42 -0
- package/.roo/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
- package/.roo/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
- package/.roo/skills/cpp-modern-composition/SKILL.md +64 -0
- package/.roo/skills/cpp-modern-composition/examples/composition.md +51 -0
- package/.roo/skills/cpp-robust-interfaces/SKILL.md +55 -0
- package/.roo/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
- package/.roo/skills/create-hardened-docker-skill/SKILL.md +637 -0
- package/.roo/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
- package/.roo/skills/csharp-best-practices/SKILL.md +278 -0
- package/.roo/skills/docker-hardening-verification/SKILL.md +28 -0
- package/.roo/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
- package/.roo/skills/docker-image-signing/SKILL.md +28 -0
- package/.roo/skills/docker-image-signing/scripts/sign-image.sh +33 -0
- package/.roo/skills/document-revision-history/SKILL.md +104 -0
- package/.roo/skills/git-workflow-skill/SKILL.md +194 -0
- package/.roo/skills/git-workflow-skill/hooks/commit-msg +61 -0
- package/.roo/skills/git-workflow-skill/hooks/pre-commit +38 -0
- package/.roo/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
- package/.roo/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
- package/.roo/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
- package/.roo/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
- package/.roo/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
- package/.roo/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
- package/.roo/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
- package/.roo/skills/js-ts-security-skill/SKILL.md +64 -0
- package/.roo/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
- package/.roo/skills/logging-best-practices/SKILL.md +50 -0
- package/.roo/skills/logging-best-practices/examples/cpp.md +36 -0
- package/.roo/skills/logging-best-practices/examples/csharp.md +49 -0
- package/.roo/skills/logging-best-practices/examples/javascript.md +77 -0
- package/.roo/skills/logging-best-practices/examples/python.md +57 -0
- package/.roo/skills/logging-best-practices/references/logging-standards.md +29 -0
- package/.roo/skills/open-presentation/SKILL.md +35 -0
- package/.roo/skills/opentelemetry-best-practices/SKILL.md +34 -0
- package/.roo/skills/opentelemetry-best-practices/examples/go.md +32 -0
- package/.roo/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
- package/.roo/skills/opentelemetry-best-practices/examples/python.md +37 -0
- package/.roo/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
- package/.roo/skills/python-best-practices/SKILL.md +385 -0
- package/.roo/skills/python-dependency-mgmt/SKILL.md +42 -0
- package/.roo/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
- package/.roo/skills/python-security-skill/SKILL.md +56 -0
- package/.roo/skills/python-security-skill/examples/security.md +56 -0
- package/.roo/skills/self-signed-cert/SKILL.md +42 -0
- package/.roo/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
- package/.roo/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
- package/.roo/skills/skill-creator/SKILL.md +196 -0
- package/.roo/skills/skill-creator/references/output-patterns.md +82 -0
- package/.roo/skills/skill-creator/references/workflows.md +28 -0
- package/.roo/skills/skill-creator/scripts/init_skill.py +208 -0
- package/.roo/skills/skill-creator/scripts/package_skill.py +99 -0
- package/.roo/skills/skill-creator/scripts/quick_validate.py +113 -0
- package/.roo/skills/story-status-lookup/SKILL.md +78 -0
- package/.roo/skills/test-accompanied-development/SKILL.md +50 -0
- package/.roo/skills/test-generator/SKILL.md +65 -0
- package/.roo/skills/vercel-react-best-practices/SKILL.md +109 -0
- package/.roo/skills/verify-hardened-docker-skill/SKILL.md +442 -0
- package/.roo/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
- package/README.md +2 -1
- package/lib/agents.js +23 -0
- package/package.json +4 -3
- package/test/roo-code-agent.test.js +166 -0
- package/test/roo-code-injection.test.js +172 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# start-feature.sh - Create a new feature branch in an isolated worktree
|
|
3
|
+
# Usage: start-feature.sh <branch-type> <description>
|
|
4
|
+
# Example: start-feature.sh feature add-oauth-support
|
|
5
|
+
#
|
|
6
|
+
# Creates a git worktree so multiple agents can work in parallel
|
|
7
|
+
# without interfering with each other's working directories.
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
RED='\033[0;31m'
|
|
12
|
+
GREEN='\033[0;32m'
|
|
13
|
+
YELLOW='\033[1;33m'
|
|
14
|
+
CYAN='\033[0;36m'
|
|
15
|
+
NC='\033[0m'
|
|
16
|
+
|
|
17
|
+
error() { echo -e "${RED}ERROR: $1${NC}" >&2; exit 1; }
|
|
18
|
+
warn() { echo -e "${YELLOW}WARNING: $1${NC}" >&2; }
|
|
19
|
+
success() { echo -e "${GREEN}$1${NC}"; }
|
|
20
|
+
info() { echo -e "${CYAN}$1${NC}"; }
|
|
21
|
+
|
|
22
|
+
# Validate arguments
|
|
23
|
+
BRANCH_TYPE="$1"
|
|
24
|
+
DESCRIPTION="$2"
|
|
25
|
+
|
|
26
|
+
if [[ -z "$BRANCH_TYPE" || -z "$DESCRIPTION" ]]; then
|
|
27
|
+
echo "Usage: $0 <branch-type> <description>"
|
|
28
|
+
echo "Branch types: feature, bugfix, hotfix, chore"
|
|
29
|
+
echo "Example: $0 feature add-oauth-support"
|
|
30
|
+
echo ""
|
|
31
|
+
echo "Creates an isolated worktree for parallel multi-agent development."
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# Validate branch type
|
|
36
|
+
case "$BRANCH_TYPE" in
|
|
37
|
+
feature|bugfix|hotfix|chore) ;;
|
|
38
|
+
*) error "Invalid branch type '$BRANCH_TYPE'. Use: feature, bugfix, hotfix, chore" ;;
|
|
39
|
+
esac
|
|
40
|
+
|
|
41
|
+
# Sanitize description (replace spaces with dashes, lowercase)
|
|
42
|
+
DESCRIPTION=$(echo "$DESCRIPTION" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd '[:alnum:]-')
|
|
43
|
+
BRANCH_NAME="${BRANCH_TYPE}/${DESCRIPTION}"
|
|
44
|
+
|
|
45
|
+
# Check we're in a git repo
|
|
46
|
+
git rev-parse --git-dir > /dev/null 2>&1 || error "Not in a git repository"
|
|
47
|
+
|
|
48
|
+
# Resolve the main repo root (works from inside a worktree too)
|
|
49
|
+
GIT_COMMON=$(git rev-parse --git-common-dir 2>/dev/null)
|
|
50
|
+
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
|
51
|
+
|
|
52
|
+
if [[ "$GIT_COMMON" != "$GIT_DIR" && "$GIT_COMMON" != "." ]]; then
|
|
53
|
+
# We're inside a worktree — resolve main repo from .git/worktrees/xxx/../../..
|
|
54
|
+
MAIN_REPO=$(cd "$GIT_COMMON/.." && pwd)
|
|
55
|
+
else
|
|
56
|
+
MAIN_REPO=$(git rev-parse --show-toplevel)
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
WORKTREE_DIR="${MAIN_REPO}/.worktrees/${DESCRIPTION}"
|
|
60
|
+
|
|
61
|
+
# Fetch latest from remote
|
|
62
|
+
echo "Fetching from remote..."
|
|
63
|
+
git fetch origin
|
|
64
|
+
|
|
65
|
+
# Verify dev branch exists
|
|
66
|
+
if ! git branch -a | grep -qE '(^|\s)origin/dev$'; then
|
|
67
|
+
error "Branch 'dev' does not exist on remote. Please create it first."
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# Check if branch already exists
|
|
71
|
+
if git show-ref --verify --quiet "refs/heads/${BRANCH_NAME}" 2>/dev/null || \
|
|
72
|
+
git show-ref --verify --quiet "refs/remotes/origin/${BRANCH_NAME}" 2>/dev/null; then
|
|
73
|
+
error "Branch '${BRANCH_NAME}' already exists. Use a different description or clean up the old branch."
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Check if worktree directory already exists
|
|
77
|
+
if [[ -d "$WORKTREE_DIR" ]]; then
|
|
78
|
+
error "Worktree directory already exists: ${WORKTREE_DIR}
|
|
79
|
+
To remove it: git worktree remove ${WORKTREE_DIR}"
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Ensure .worktrees directory exists and is gitignored
|
|
83
|
+
mkdir -p "${MAIN_REPO}/.worktrees"
|
|
84
|
+
if [[ -f "${MAIN_REPO}/.gitignore" ]]; then
|
|
85
|
+
if ! grep -q '^\.worktrees' "${MAIN_REPO}/.gitignore" 2>/dev/null; then
|
|
86
|
+
echo ".worktrees/" >> "${MAIN_REPO}/.gitignore"
|
|
87
|
+
info "Added .worktrees/ to .gitignore"
|
|
88
|
+
fi
|
|
89
|
+
else
|
|
90
|
+
echo ".worktrees/" > "${MAIN_REPO}/.gitignore"
|
|
91
|
+
info "Created .gitignore with .worktrees/"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Create worktree with new branch based on origin/dev
|
|
95
|
+
echo "Creating worktree for '${BRANCH_NAME}'..."
|
|
96
|
+
git worktree add -b "$BRANCH_NAME" "$WORKTREE_DIR" origin/dev
|
|
97
|
+
|
|
98
|
+
success "Worktree created successfully"
|
|
99
|
+
echo ""
|
|
100
|
+
info " Branch: ${BRANCH_NAME}"
|
|
101
|
+
info " Directory: ${WORKTREE_DIR}"
|
|
102
|
+
echo ""
|
|
103
|
+
echo "Next steps:"
|
|
104
|
+
echo " 1. cd ${WORKTREE_DIR}"
|
|
105
|
+
echo " 2. Make your changes in this isolated directory"
|
|
106
|
+
echo " 3. Commit: git commit -m 'type(scope): description'"
|
|
107
|
+
echo " 4. Finish: run finish-feature.sh from inside the worktree"
|
|
108
|
+
echo ""
|
|
109
|
+
echo "Active worktrees:"
|
|
110
|
+
git worktree list
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# validate-workflow.sh - Check if current state follows git workflow rules
|
|
3
|
+
# Usage: validate-workflow.sh [--list]
|
|
4
|
+
#
|
|
5
|
+
# Worktree-aware: detects whether you're in a worktree or main repo
|
|
6
|
+
# and validates accordingly.
|
|
7
|
+
|
|
8
|
+
set -e
|
|
9
|
+
|
|
10
|
+
RED='\033[0;31m'
|
|
11
|
+
GREEN='\033[0;32m'
|
|
12
|
+
YELLOW='\033[1;33m'
|
|
13
|
+
CYAN='\033[0;36m'
|
|
14
|
+
NC='\033[0m'
|
|
15
|
+
|
|
16
|
+
ERRORS=0
|
|
17
|
+
WARNINGS=0
|
|
18
|
+
|
|
19
|
+
error() { echo -e "${RED}x ERROR: $1${NC}"; ERRORS=$((ERRORS + 1)); }
|
|
20
|
+
warn() { echo -e "${YELLOW}! WARNING: $1${NC}"; WARNINGS=$((WARNINGS + 1)); }
|
|
21
|
+
ok() { echo -e "${GREEN}+ $1${NC}"; }
|
|
22
|
+
info() { echo -e " $1"; }
|
|
23
|
+
|
|
24
|
+
# Handle --list flag to show active worktrees
|
|
25
|
+
if [[ "$1" == "--list" ]]; then
|
|
26
|
+
echo "Active Worktrees"
|
|
27
|
+
echo "================"
|
|
28
|
+
git worktree list 2>/dev/null || echo "Not in a git repository"
|
|
29
|
+
exit 0
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
echo "Git Workflow Validation (Worktree-Aware)"
|
|
33
|
+
echo "========================================="
|
|
34
|
+
echo ""
|
|
35
|
+
|
|
36
|
+
# Check we're in a git repo
|
|
37
|
+
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
38
|
+
error "Not in a git repository"
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Detect worktree status
|
|
43
|
+
GIT_COMMON=$(git rev-parse --git-common-dir 2>/dev/null)
|
|
44
|
+
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
|
45
|
+
CURRENT_DIR=$(git rev-parse --show-toplevel)
|
|
46
|
+
|
|
47
|
+
IS_WORKTREE=false
|
|
48
|
+
if [[ "$GIT_COMMON" != "$GIT_DIR" && "$GIT_COMMON" != "." ]]; then
|
|
49
|
+
IS_WORKTREE=true
|
|
50
|
+
MAIN_REPO=$(cd "$GIT_COMMON/.." && pwd)
|
|
51
|
+
echo -e "${CYAN}Context: Inside worktree${NC}"
|
|
52
|
+
info "Worktree: $CURRENT_DIR"
|
|
53
|
+
info "Main repo: $MAIN_REPO"
|
|
54
|
+
else
|
|
55
|
+
MAIN_REPO="$CURRENT_DIR"
|
|
56
|
+
echo -e "${CYAN}Context: Main repository${NC}"
|
|
57
|
+
info "Repo: $MAIN_REPO"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Get current branch
|
|
61
|
+
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
62
|
+
echo "Branch: $CURRENT_BRANCH"
|
|
63
|
+
echo ""
|
|
64
|
+
|
|
65
|
+
# Check 1: Not on protected branch
|
|
66
|
+
echo "Checking branch..."
|
|
67
|
+
if [[ "$CURRENT_BRANCH" == "dev" || "$CURRENT_BRANCH" == "main" || "$CURRENT_BRANCH" == "master" ]]; then
|
|
68
|
+
if [[ "$IS_WORKTREE" == true ]]; then
|
|
69
|
+
error "Worktree is on protected branch '$CURRENT_BRANCH'. Worktrees should be on feature branches."
|
|
70
|
+
else
|
|
71
|
+
# Main repo on dev is fine — that's the expected state
|
|
72
|
+
ok "Main repo is on '$CURRENT_BRANCH' (expected)"
|
|
73
|
+
fi
|
|
74
|
+
else
|
|
75
|
+
ok "On feature branch '$CURRENT_BRANCH'"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Check 2: Branch naming convention (only for feature branches)
|
|
79
|
+
if [[ "$CURRENT_BRANCH" != "dev" && "$CURRENT_BRANCH" != "main" && "$CURRENT_BRANCH" != "master" ]]; then
|
|
80
|
+
if echo "$CURRENT_BRANCH" | grep -qE '^(feature|bugfix|hotfix|chore)/[a-z0-9-]+$'; then
|
|
81
|
+
ok "Branch name follows convention"
|
|
82
|
+
else
|
|
83
|
+
warn "Branch name '$CURRENT_BRANCH' doesn't follow convention: <type>/<description>"
|
|
84
|
+
info "Expected: feature|bugfix|hotfix|chore followed by lowercase alphanumeric with dashes"
|
|
85
|
+
fi
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Check 3: dev branch exists
|
|
89
|
+
echo ""
|
|
90
|
+
echo "Checking repository setup..."
|
|
91
|
+
git fetch origin 2>/dev/null || warn "Could not fetch from origin"
|
|
92
|
+
|
|
93
|
+
if git branch -a | grep -qE '(^|\s)origin/dev$'; then
|
|
94
|
+
ok "Remote 'dev' branch exists"
|
|
95
|
+
else
|
|
96
|
+
error "Remote 'dev' branch not found. Create it before using this workflow."
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Check 4: Up to date with dev (for feature branches)
|
|
100
|
+
echo ""
|
|
101
|
+
echo "Checking sync status..."
|
|
102
|
+
if [[ "$CURRENT_BRANCH" != "dev" && "$CURRENT_BRANCH" != "main" && "$CURRENT_BRANCH" != "master" ]]; then
|
|
103
|
+
if git branch -a | grep -qE '(^|\s)origin/dev$'; then
|
|
104
|
+
BEHIND=$(git rev-list --count HEAD..origin/dev 2>/dev/null || echo "0")
|
|
105
|
+
if [[ "$BEHIND" == "0" ]]; then
|
|
106
|
+
ok "Branch is up to date with dev"
|
|
107
|
+
else
|
|
108
|
+
warn "Branch is $BEHIND commit(s) behind dev. Consider rebasing."
|
|
109
|
+
info "Run: git fetch origin dev && git rebase origin/dev"
|
|
110
|
+
fi
|
|
111
|
+
fi
|
|
112
|
+
else
|
|
113
|
+
ok "On base branch — sync check not needed"
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Check 5: Uncommitted changes
|
|
117
|
+
echo ""
|
|
118
|
+
echo "Checking working directory..."
|
|
119
|
+
if git diff-index --quiet HEAD -- 2>/dev/null; then
|
|
120
|
+
ok "No uncommitted changes"
|
|
121
|
+
else
|
|
122
|
+
warn "Uncommitted changes detected"
|
|
123
|
+
info "Run: git status"
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
# Check 6: Untracked files (that aren't ignored)
|
|
127
|
+
UNTRACKED=$(git ls-files --others --exclude-standard | wc -l)
|
|
128
|
+
if [[ "$UNTRACKED" -gt 0 ]]; then
|
|
129
|
+
warn "$UNTRACKED untracked file(s) found"
|
|
130
|
+
info "Run: git status"
|
|
131
|
+
else
|
|
132
|
+
ok "No untracked files"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Check 7: Validate recent commit messages (for feature branches)
|
|
136
|
+
echo ""
|
|
137
|
+
echo "Checking commit messages..."
|
|
138
|
+
if [[ "$CURRENT_BRANCH" != "dev" && "$CURRENT_BRANCH" != "main" && "$CURRENT_BRANCH" != "master" ]]; then
|
|
139
|
+
COMMITS=$(git rev-list --count origin/dev..HEAD 2>/dev/null || echo "0")
|
|
140
|
+
if [[ "$COMMITS" -gt 0 ]]; then
|
|
141
|
+
INVALID=0
|
|
142
|
+
while IFS= read -r msg; do
|
|
143
|
+
if ! echo "$msg" | grep -qE '^(feat|fix|chore|docs|refactor|test)(\([^)]+\))?: .+'; then
|
|
144
|
+
INVALID=$((INVALID + 1))
|
|
145
|
+
fi
|
|
146
|
+
done < <(git log origin/dev..HEAD --pretty=format:"%s" 2>/dev/null)
|
|
147
|
+
|
|
148
|
+
if [[ "$INVALID" -eq 0 ]]; then
|
|
149
|
+
ok "All $COMMITS commit(s) follow conventional format"
|
|
150
|
+
else
|
|
151
|
+
warn "$INVALID of $COMMITS commit(s) don't follow conventional format"
|
|
152
|
+
info "Format: <type>(<scope>): <description>"
|
|
153
|
+
info "Types: feat, fix, chore, docs, refactor, test"
|
|
154
|
+
fi
|
|
155
|
+
else
|
|
156
|
+
info "No commits ahead of dev yet"
|
|
157
|
+
fi
|
|
158
|
+
else
|
|
159
|
+
info "On base branch — commit check not needed"
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
# Check 8: Git hooks installed
|
|
163
|
+
echo ""
|
|
164
|
+
echo "Checking git hooks..."
|
|
165
|
+
HOOKS_DIR="${GIT_COMMON}/hooks"
|
|
166
|
+
if [[ "$IS_WORKTREE" == true ]]; then
|
|
167
|
+
# Worktrees share hooks with the main repo
|
|
168
|
+
HOOKS_DIR="${GIT_COMMON}/hooks"
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
if [[ -f "$HOOKS_DIR/pre-commit" && -x "$HOOKS_DIR/pre-commit" ]]; then
|
|
172
|
+
ok "pre-commit hook installed"
|
|
173
|
+
else
|
|
174
|
+
warn "pre-commit hook not installed"
|
|
175
|
+
info "Run: ./scripts/install-hooks.sh"
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
if [[ -f "$HOOKS_DIR/commit-msg" && -x "$HOOKS_DIR/commit-msg" ]]; then
|
|
179
|
+
ok "commit-msg hook installed"
|
|
180
|
+
else
|
|
181
|
+
warn "commit-msg hook not installed"
|
|
182
|
+
info "Run: ./scripts/install-hooks.sh"
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
# Check 9: Worktree health
|
|
186
|
+
echo ""
|
|
187
|
+
echo "Checking worktrees..."
|
|
188
|
+
WORKTREE_COUNT=$(git worktree list | wc -l)
|
|
189
|
+
ok "$WORKTREE_COUNT worktree(s) registered"
|
|
190
|
+
|
|
191
|
+
# Check for stale worktrees
|
|
192
|
+
STALE_COUNT=$(git worktree list --porcelain | grep -c "^prunable" 2>/dev/null || echo "0")
|
|
193
|
+
if [[ "$STALE_COUNT" -gt 0 ]]; then
|
|
194
|
+
warn "$STALE_COUNT stale worktree(s) found"
|
|
195
|
+
info "Run: git worktree prune"
|
|
196
|
+
else
|
|
197
|
+
ok "No stale worktrees"
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
# Check .worktrees in .gitignore
|
|
201
|
+
if [[ -f "${MAIN_REPO}/.gitignore" ]]; then
|
|
202
|
+
if grep -q '^\.worktrees' "${MAIN_REPO}/.gitignore" 2>/dev/null; then
|
|
203
|
+
ok ".worktrees/ is in .gitignore"
|
|
204
|
+
else
|
|
205
|
+
warn ".worktrees/ is NOT in .gitignore"
|
|
206
|
+
info "Add '.worktrees/' to your .gitignore"
|
|
207
|
+
fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# List active worktrees
|
|
211
|
+
echo ""
|
|
212
|
+
echo "Active worktrees:"
|
|
213
|
+
git worktree list | while IFS= read -r line; do
|
|
214
|
+
echo " $line"
|
|
215
|
+
done
|
|
216
|
+
|
|
217
|
+
# Summary
|
|
218
|
+
echo ""
|
|
219
|
+
echo "========================================="
|
|
220
|
+
if [[ $ERRORS -gt 0 ]]; then
|
|
221
|
+
echo -e "${RED}Validation failed: $ERRORS error(s), $WARNINGS warning(s)${NC}"
|
|
222
|
+
exit 1
|
|
223
|
+
elif [[ $WARNINGS -gt 0 ]]; then
|
|
224
|
+
echo -e "${YELLOW}Validation passed with $WARNINGS warning(s)${NC}"
|
|
225
|
+
exit 0
|
|
226
|
+
else
|
|
227
|
+
echo -e "${GREEN}Validation passed: All checks OK${NC}"
|
|
228
|
+
exit 0
|
|
229
|
+
fi
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: JS/TS Dependency Management
|
|
3
|
+
description: Standardize package management and security across NPM, Yarn, and PNPM.
|
|
4
|
+
---
|
|
5
|
+
# JS/TS Dependency Management (NPM, Yarn, PNPM)
|
|
6
|
+
|
|
7
|
+
This skill enforces best practices for managing dependencies in the JS/TS ecosystem, focusing on build stability, supply chain security, and environment hygiene.
|
|
8
|
+
|
|
9
|
+
## Policies
|
|
10
|
+
|
|
11
|
+
### 1. Build Stability & Reproducibility
|
|
12
|
+
* **Rule**: Always use a lockfile (`package-lock.json`, `yarn.lock`, or `pnpm-lock.yaml`) and pin versions.
|
|
13
|
+
* **Action**:
|
|
14
|
+
- Use specific versions in `package.json` (prefer `1.2.3` over `^1.2.3` for critical production apps).
|
|
15
|
+
- NEVER use `*` or `latest`.
|
|
16
|
+
- Always commit the lockfile to version control.
|
|
17
|
+
|
|
18
|
+
### 2. Supply Chain Security (OWASP A03:2025)
|
|
19
|
+
* **Rule**: Mandatory scanning for known vulnerabilities in dependencies.
|
|
20
|
+
* **Action**:
|
|
21
|
+
- Consistently run `npm audit` or `yarn audit`.
|
|
22
|
+
- Ban insecure registry URLs (use HTTPS only).
|
|
23
|
+
- Avoid Git-based dependencies (`"pkg": "git+https://..."`) unless from an internal/verified source.
|
|
24
|
+
- Be cautious of "Typosquatting"—double-check package names before installation.
|
|
25
|
+
|
|
26
|
+
### 3. Dependency Categorization
|
|
27
|
+
* **Rule**: Correctly distinguish between runtime and development dependencies.
|
|
28
|
+
* **Action**:
|
|
29
|
+
- **dependencies**: Packages needed for the app to run (e.g., `express`, `react`).
|
|
30
|
+
- **devDependencies**: Packages needed only for building/testing (e.g., `typescript`, `jest`, `eslint`).
|
|
31
|
+
- **peerDependencies**: Libraries intended to be used with other specific versions of a host package.
|
|
32
|
+
|
|
33
|
+
### 4. Registry Hygiene
|
|
34
|
+
* **Rule**: Standardize configuration via `.npmrc`.
|
|
35
|
+
* **Action**:
|
|
36
|
+
- Define `save-exact=true` if pinning is the default project policy.
|
|
37
|
+
- Set up scoped registries for private packages correctly.
|
|
38
|
+
|
|
39
|
+
### 5. Automated Updates
|
|
40
|
+
* **Rule**: Keep dependencies current while maintaining safety.
|
|
41
|
+
* **Action**: Use tools like `npm-check-updates` (ncu) to audit updates, but verify them in separate PRs/branches.
|
|
42
|
+
|
|
43
|
+
## Process Reference
|
|
44
|
+
|
|
45
|
+
| Tool | Lockfile | Installation | Audit |
|
|
46
|
+
| :--- | :--- | :--- | :--- |
|
|
47
|
+
| **NPM** | `package-lock.json` | `npm install` | `npm audit` |
|
|
48
|
+
| **Yarn** | `yarn.lock` | `yarn install` | `yarn audit` |
|
|
49
|
+
| **PNPM** | `pnpm-lock.yaml` | `pnpm install` | `pnpm audit` |
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# JS/TS Dependency Management Examples
|
|
2
|
+
|
|
3
|
+
### 1. Secure `package.json` Structure
|
|
4
|
+
**Good Pattern:**
|
|
5
|
+
```json
|
|
6
|
+
{
|
|
7
|
+
"name": "secure-app",
|
|
8
|
+
"version": "1.0.0",
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"axios": "1.6.2", // Pinned version
|
|
11
|
+
"express": "4.18.2" // Pinned version
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"typescript": "5.3.2",
|
|
15
|
+
"jest": "29.7.0",
|
|
16
|
+
"eslint": "8.54.0"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. Standardized `.npmrc`
|
|
22
|
+
```text
|
|
23
|
+
# Enforce exact version saving by default
|
|
24
|
+
save-exact=true
|
|
25
|
+
|
|
26
|
+
# Ensure every developer uses the same registry
|
|
27
|
+
registry=https://registry.npmjs.org/
|
|
28
|
+
|
|
29
|
+
# Forbid scrips for security during install if possible
|
|
30
|
+
# ignore-scripts=true
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 3. Managing Scoped/Private Packages
|
|
34
|
+
If you use a private registry (like Artifactory or GitHub Packages):
|
|
35
|
+
```text
|
|
36
|
+
@my-org:registry=https://npm.pkg.github.com
|
|
37
|
+
//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 4. Dependency Auditing Workflow
|
|
41
|
+
**Routine Check:**
|
|
42
|
+
```bash
|
|
43
|
+
# Check for vulnerabilities
|
|
44
|
+
npm audit
|
|
45
|
+
|
|
46
|
+
# Fix minor issues automatically
|
|
47
|
+
npm audit fix
|
|
48
|
+
|
|
49
|
+
# Check for outdated packages without installing
|
|
50
|
+
npx npm-check-updates
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 5. Cleaning up Node Modules
|
|
54
|
+
```bash
|
|
55
|
+
# Remove unused dependencies
|
|
56
|
+
npm prune
|
|
57
|
+
|
|
58
|
+
# Clean install (deletes node_modules and installs from lockfile)
|
|
59
|
+
npm ci
|
|
60
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: JS/TS Security
|
|
3
|
+
description: Verify security of JavaScript and TypeScript codebases against OWASP Top 10 2025 standards
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# JS/TS Security Skill
|
|
7
|
+
|
|
8
|
+
This skill provides a set of tools and best practices to ensure that JavaScript and TypeScript code (both client-side and server-side) is secure and compliant with the latest security standards, specifically the **OWASP Top 10 2025**.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
- Before committing code to a repository.
|
|
12
|
+
- During a security audit of an existing codebase.
|
|
13
|
+
- When adding new dependencies or updating CI/CD pipelines.
|
|
14
|
+
- When implementing critical features like authentication, authorization, or error handling.
|
|
15
|
+
|
|
16
|
+
## Security Checks (OWASP 2025 Mapping)
|
|
17
|
+
|
|
18
|
+
### A01:2025 - Broken Access Control
|
|
19
|
+
- Verification of authorization logic.
|
|
20
|
+
- **SSRF (Server-Side Request Forgery)**: Detecting unvalidated URL fetching in `fetch`, `axios`, `http.get`.
|
|
21
|
+
|
|
22
|
+
### A02:2025 - Security Misconfiguration
|
|
23
|
+
- Auditing configuration files (`.env`, `docker-compose.yml`).
|
|
24
|
+
- Checking for insecure defaults and exposed debug endpoints.
|
|
25
|
+
|
|
26
|
+
### A03:2025 - Software Supply Chain Failures
|
|
27
|
+
- **NEW**: Focusing on dependency integrity.
|
|
28
|
+
- Verification of lockfiles (`package-lock.json`, `yarn.lock`).
|
|
29
|
+
- Checking for insecure registry URLs (HTTP).
|
|
30
|
+
|
|
31
|
+
### A04:2025 - Cryptographic Failures
|
|
32
|
+
- Detecting weak hashing (MD5, SHA1).
|
|
33
|
+
- Checking for insecure randomness (`Math.random()`).
|
|
34
|
+
|
|
35
|
+
### A05:2025 - Injection
|
|
36
|
+
- Expanded detection for OS commands (`child_process.exec`), SQL injection, and NoSQL injection.
|
|
37
|
+
|
|
38
|
+
### A06:2025 - Insecure Design
|
|
39
|
+
- Documentation on secure design principles (e.g., Fail Secure, Least Privilege).
|
|
40
|
+
|
|
41
|
+
### A07:2025 - Authentication Failures
|
|
42
|
+
- Checking for insecure cookies (`httpOnly: false`).
|
|
43
|
+
- Hardcoded credentials and weak session management.
|
|
44
|
+
|
|
45
|
+
### A08:2025 - Software or Data Integrity Failures
|
|
46
|
+
- Detecting unsafe deserialization (`unserialize`, `JSON.parse` of untrusted input).
|
|
47
|
+
|
|
48
|
+
### A09:2025 - Logging & Alerting Failures
|
|
49
|
+
- Identifying lack of security logging.
|
|
50
|
+
- Empty catch blocks that swallow security errors.
|
|
51
|
+
|
|
52
|
+
### A10:2025 - Mishandling of Exceptional Conditions
|
|
53
|
+
- **NEW**: Identifying insecure error handling.
|
|
54
|
+
- Detecting empty `catch` blocks and `console.log(err)` in critical paths.
|
|
55
|
+
|
|
56
|
+
## Usage
|
|
57
|
+
|
|
58
|
+
### Run OWASP 2025 Security Scan
|
|
59
|
+
The primary method for automated security verification is the `verify-security.sh` script. This script executes multiple scanning phases (SAST, Audit, Secret Scanning) and maps all findings directly to OWASP 2025 categories.
|
|
60
|
+
|
|
61
|
+
Run the scan from the project root:
|
|
62
|
+
```bash
|
|
63
|
+
/d/Code/agents/skills/js-ts-security-skill/scripts/verify-security.sh
|
|
64
|
+
```
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# JS/TS Security Verification Script (OWASP Top 10 2025)
|
|
4
|
+
# This script performs a series of security checks on a JavaScript/TypeScript project.
|
|
5
|
+
|
|
6
|
+
RED='\033[0;31m'
|
|
7
|
+
GREEN='\033[0;32m'
|
|
8
|
+
YELLOW='\033[1;33m'
|
|
9
|
+
CYAN='\033[0;36m'
|
|
10
|
+
NC='\033[0m' # No Color
|
|
11
|
+
|
|
12
|
+
echo -e "${CYAN}====================================================${NC}"
|
|
13
|
+
echo -e "${CYAN} JS/TS Security Audit - OWASP Top 10 2025 ${NC}"
|
|
14
|
+
echo -e "${CYAN}====================================================${NC}\n"
|
|
15
|
+
|
|
16
|
+
# A03:2025 - Software Supply Chain Failures
|
|
17
|
+
echo -e "${YELLOW}[1/5] A03:2025 - Software Supply Chain Failures${NC}"
|
|
18
|
+
SUPPLY_CHAIN_ISSUES=0
|
|
19
|
+
if [ ! -f "package-lock.json" ] && [ ! -f "yarn.lock" ] && [ ! -f "pnpm-lock.yaml" ]; then
|
|
20
|
+
echo -e "${RED}✗ CRITICAL: No lockfile found (package-lock.json, yarn.lock, or pnpm-lock.yaml).${NC}"
|
|
21
|
+
echo " Impact: Non-deterministic builds increase supply chain vulnerability."
|
|
22
|
+
SUPPLY_CHAIN_ISSUES=$((SUPPLY_CHAIN_ISSUES + 1))
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
HTTP_REGISTRY=$(grep -r "http://" package.json 2>/dev/null)
|
|
26
|
+
if [ ! -z "$HTTP_REGISTRY" ]; then
|
|
27
|
+
echo -e "${RED}✗ WARNING: Insecure registry found in package.json (using HTTP instead of HTTPS).${NC}"
|
|
28
|
+
echo "$HTTP_REGISTRY"
|
|
29
|
+
SUPPLY_CHAIN_ISSUES=$((SUPPLY_CHAIN_ISSUES + 1))
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
if [ $SUPPLY_CHAIN_ISSUES -eq 0 ]; then
|
|
33
|
+
echo -e "${GREEN}✓ No immediate supply chain issues found.${NC}\n"
|
|
34
|
+
else
|
|
35
|
+
echo -e "${RED}✗ Total supply chain issues: $SUPPLY_CHAIN_ISSUES${NC}\n"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# A03:2025 / A06:2021 - Dependency Audit
|
|
39
|
+
echo -e "${YELLOW}[2/5] A03:2025 - Vulnerable Components (Audit)${NC}"
|
|
40
|
+
if [ -f "package-lock.json" ]; then
|
|
41
|
+
npm audit --audit-level=high
|
|
42
|
+
AUDIT_EXIT=$?
|
|
43
|
+
elif [ -f "yarn.lock" ]; then
|
|
44
|
+
yarn audit --level high
|
|
45
|
+
AUDIT_EXIT=$?
|
|
46
|
+
else
|
|
47
|
+
echo -e "${YELLOW} Skipping dependency audit: No lockfile found.${NC}"
|
|
48
|
+
AUDIT_EXIT=0
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if [ $AUDIT_EXIT -eq 0 ]; then
|
|
52
|
+
echo -e "${GREEN}✓ No high-severity vulnerabilities in dependencies.${NC}\n"
|
|
53
|
+
else
|
|
54
|
+
echo -e "${RED}✗ Vulnerabilities found. Run 'npm audit fix'.${NC}\n"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# A01/A04/A05/A08 - Static Analysis (SAST)
|
|
58
|
+
echo -e "${YELLOW}[3/5] Static Analysis (OWASP A01, A04, A05, A08)${NC}"
|
|
59
|
+
declare -A DANGEROUS_PATTERNS
|
|
60
|
+
DANGEROUS_PATTERNS["A01: SSRF/Access Control"]="fetch\(\`|axios\.get\(\`|http\.get\(\`"
|
|
61
|
+
DANGEROUS_PATTERNS["A05: Injection"]="eval\(|new Function\(|child_process\.exec\(|require\('child_process'\)\.exec"
|
|
62
|
+
DANGEROUS_PATTERNS["A04: Cryptographic Failures"]="crypto\.createHash\('md5'\)|crypto\.createHash\('sha1'\)|Math\.random\(\)"
|
|
63
|
+
DANGEROUS_PATTERNS["A08: Software/Data Integrity"]="unserialize\(|JSON\.parse\("
|
|
64
|
+
DANGEROUS_PATTERNS["A07: Authentication Failures"]="res\.cookie\(.*httpOnly: false|res\.cookie\(.*secure: false"
|
|
65
|
+
|
|
66
|
+
FOUND_ISSUES=0
|
|
67
|
+
for cat in "A01: SSRF/Access Control" "A05: Injection" "A04: Cryptographic Failures" "A08: Software/Data Integrity" "A07: Authentication Failures"; do
|
|
68
|
+
pattern=${DANGEROUS_PATTERNS[$cat]}
|
|
69
|
+
MATCHES=$(grep -rnE "$pattern" --include="*.js" --include="*.ts" --exclude-dir=node_modules . 2>/dev/null)
|
|
70
|
+
if [ ! -z "$MATCHES" ]; then
|
|
71
|
+
echo -e "${RED}✗ Found Risk: [$cat]${NC}"
|
|
72
|
+
echo "$MATCHES" | sed 's/^/ /'
|
|
73
|
+
FOUND_ISSUES=$((FOUND_ISSUES + 1))
|
|
74
|
+
fi
|
|
75
|
+
done
|
|
76
|
+
|
|
77
|
+
if [ $FOUND_ISSUES -eq 0 ]; then
|
|
78
|
+
echo -e "${GREEN}✓ No dangerous patterns detected via SAST.${NC}\n"
|
|
79
|
+
else
|
|
80
|
+
echo -e "${RED}✗ Total dangerous patterns: $FOUND_ISSUES${NC}\n"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# A10:2025 - Mishandling of Exceptional Conditions
|
|
84
|
+
echo -e "${YELLOW}[4/5] A10:2025 - Mishandling of Exceptional Conditions${NC}"
|
|
85
|
+
EMPTY_CATCH=$(grep -rnE "catch\s*\(\w*\)\s*\{\s*\}" --include="*.js" --include="*.ts" --exclude-dir=node_modules . 2>/dev/null)
|
|
86
|
+
FOUND_EXCEPTION_ISSUES=0
|
|
87
|
+
if [ ! -z "$EMPTY_CATCH" ]; then
|
|
88
|
+
echo -e "${RED}✗ Found Risk: Empty catch blocks (Swallowing exceptions)${NC}"
|
|
89
|
+
echo "$EMPTY_CATCH" | sed 's/^/ /'
|
|
90
|
+
FOUND_EXCEPTION_ISSUES=$((FOUND_EXCEPTION_ISSUES + 1))
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
if [ $FOUND_EXCEPTION_ISSUES -eq 0 ]; then
|
|
94
|
+
echo -e "${GREEN}✓ Exception handling patterns appear secure.${NC}\n"
|
|
95
|
+
else
|
|
96
|
+
echo -e "${RED}✗ Total exception handling issues: $FOUND_EXCEPTION_ISSUES${NC}\n"
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Secret Detection (A01/A07)
|
|
100
|
+
echo -e "${YELLOW}[5/5] A01/A07 - Hardcoded Secrets Scanning${NC}"
|
|
101
|
+
SECRET_PATTERNS=("AIza[0-9A-Za-z-_]{35}" "sk_live_[0-9a-zA-Z]{24}" "xox[pb]-[0-9]{12}-[0-9]{12}-[0-9]{12}-[a-z0-9]{32}" "-----BEGIN RSA PRIVATE KEY-----")
|
|
102
|
+
|
|
103
|
+
FOUND_SECRETS=0
|
|
104
|
+
for pattern in "${SECRET_PATTERNS[@]}"; do
|
|
105
|
+
MATCHES=$(grep -rnE "$pattern" --include="*.js" --include="*.ts" --include="*.env" --exclude-dir=node_modules . 2>/dev/null)
|
|
106
|
+
if [ ! -z "$MATCHES" ]; then
|
|
107
|
+
echo -e "${RED}✗ Found Risk: Potential secret leakage ($pattern)${NC}"
|
|
108
|
+
echo "$MATCHES" | sed 's/^/ /'
|
|
109
|
+
FOUND_SECRETS=$((FOUND_SECRETS + 1))
|
|
110
|
+
fi
|
|
111
|
+
done
|
|
112
|
+
|
|
113
|
+
if [ $FOUND_SECRETS -eq 0 ]; then
|
|
114
|
+
echo -e "${GREEN}✓ No hardcoded secrets detected.${NC}\n"
|
|
115
|
+
else
|
|
116
|
+
echo -e "${RED}✗ Total secrets found: $FOUND_SECRETS${NC}\n"
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# Summary
|
|
120
|
+
echo -e "${CYAN}----------------------------------------------------${NC}"
|
|
121
|
+
echo -e "${CYAN} OWASP 2025 Audit Summary ${NC}"
|
|
122
|
+
echo -e "${CYAN}----------------------------------------------------${NC}"
|
|
123
|
+
[ $SUPPLY_CHAIN_ISSUES -eq 0 ] && echo -e "A03: Supply Chain - ${GREEN}PASS${NC}" || echo -e "A03: Supply Chain - ${RED}FAIL${NC}"
|
|
124
|
+
[ $AUDIT_EXIT -eq 0 ] && echo -e "A03: Vulnerabilities - ${GREEN}PASS${NC}" || echo -e "A03: Vulnerabilities - ${RED}FAIL${NC}"
|
|
125
|
+
[ $FOUND_ISSUES -eq 0 ] && echo -e "A01/04/05/08: Code Patterns - ${GREEN}PASS${NC}" || echo -e "A01/04/05/08: Code Patterns - ${RED}FAIL${NC}"
|
|
126
|
+
[ $FOUND_EXCEPTION_ISSUES -eq 0 ] && echo -e "A10: Exception Handling - ${GREEN}PASS${NC}" || echo -e "A10: Exception Handling - ${RED}FAIL${NC}"
|
|
127
|
+
[ $FOUND_SECRETS -eq 0 ] && echo -e "A01/A07: Secrets - ${GREEN}PASS${NC}" || echo -e "A01/A07: Secrets - ${RED}FAIL${NC}"
|
|
128
|
+
echo -e "${CYAN}----------------------------------------------------${NC}"
|
|
129
|
+
|
|
130
|
+
if [ $AUDIT_EXIT -eq 0 ] && [ $FOUND_ISSUES -eq 0 ] && [ $FOUND_SECRETS -eq 0 ] && [ $SUPPLY_CHAIN_ISSUES -eq 0 ] && [ $FOUND_EXCEPTION_ISSUES -eq 0 ]; then
|
|
131
|
+
echo -e "${GREEN}Final Result: SECURE${NC}"
|
|
132
|
+
exit 0
|
|
133
|
+
else
|
|
134
|
+
echo -e "${RED}Final Result: VULNERABLE${NC}"
|
|
135
|
+
exit 1
|
|
136
|
+
fi
|