ma-agents 1.1.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/CONTRIBUTING.md +96 -0
- package/LICENSE +20 -0
- package/QUICK_START.md +148 -0
- package/README.md +420 -0
- package/bin/cli.js +198 -0
- package/examples/programmatic-usage.js +62 -0
- package/index.js +20 -0
- package/lib/agents.js +131 -0
- package/lib/installer.js +120 -0
- package/package.json +35 -0
- package/skills/README.md +312 -0
- package/skills/code-review/claude-code.md +64 -0
- package/skills/code-review/cline.md +55 -0
- package/skills/code-review/generic.md +39 -0
- package/skills/code-review/skill.json +7 -0
- package/skills/commit-message/generic.md +75 -0
- package/skills/commit-message/skill.json +7 -0
- package/skills/create-hardened-docker-skill/README.md +85 -0
- package/skills/create-hardened-docker-skill/SKILL.md +638 -0
- package/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
- package/skills/create-hardened-docker-skill/skill.json +7 -0
- package/skills/git-workflow-skill/README.md +135 -0
- package/skills/git-workflow-skill/SKILL.md +182 -0
- package/skills/git-workflow-skill/hooks/commit-msg +61 -0
- package/skills/git-workflow-skill/hooks/pre-commit +38 -0
- package/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
- package/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
- package/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
- package/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
- package/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
- package/skills/git-workflow-skill/skill.json +7 -0
- package/skills/js-ts-security-skill/README.md +28 -0
- package/skills/js-ts-security-skill/SKILL.md +64 -0
- package/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
- package/skills/js-ts-security-skill/skill.json +7 -0
- package/skills/skill-creator/claude-code.md +66 -0
- package/skills/skill-creator/generic.md +197 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +208 -0
- package/skills/skill-creator/scripts/package_skill.py +99 -0
- package/skills/skill-creator/scripts/quick_validate.py +113 -0
- package/skills/skill-creator/skill.json +8 -0
- package/skills/test-generator/claude-code.md +103 -0
- package/skills/test-generator/cline.md +69 -0
- package/skills/test-generator/generic.md +61 -0
- package/skills/test-generator/skill.json +7 -0
- package/skills/vercel-react-best-practices/claude-code.md +80 -0
- package/skills/vercel-react-best-practices/generic.md +105 -0
- package/skills/vercel-react-best-practices/skill.json +8 -0
- package/skills/verify-hardened-docker-skill/README.md +85 -0
- package/skills/verify-hardened-docker-skill/SKILL.md +443 -0
- package/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
- package/skills/verify-hardened-docker-skill/skill.json +7 -0
|
@@ -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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Git Workflow",
|
|
3
|
+
"description": "Worktree-based feature branch workflow for parallel multi-agent development with conventional commits and PR-based merging",
|
|
4
|
+
"version": "2.0.0",
|
|
5
|
+
"author": "AI Agent Skills",
|
|
6
|
+
"tags": ["git", "worktrees", "workflow", "branching", "conventional-commits", "pull-requests", "multi-agent"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# JS/TS Security Skill (OWASP 2025)
|
|
2
|
+
|
|
3
|
+
Comprehensive security verification for JavaScript and TypeScript codebases following **OWASP Top 10 2025** standards.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Verify security of the current project
|
|
9
|
+
./skills/js-ts-security-skill/scripts/verify-security.sh
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- ✅ **Dependency Auditing**: Checks for known vulnerabilities in `node_modules`.
|
|
15
|
+
- ✅ **Static Analysis**: Detects dangerous code patterns (eval, unsafe regex, etc.).
|
|
16
|
+
- ✅ **Secret Scanning**: Finds hardcoded credentials and API keys.
|
|
17
|
+
- ✅ **OWASP Compliance**: Maps findings to OWASP Top 10 categories.
|
|
18
|
+
- ✅ **Actionable Reports**: Provides clear instructions on how to fix identified issues.
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
- Node.js and npm/yarn
|
|
23
|
+
- `eslint` (installed in the project or globally)
|
|
24
|
+
- `eslint-plugin-security` (recommended for better results)
|
|
25
|
+
|
|
26
|
+
## Configuration
|
|
27
|
+
|
|
28
|
+
You can customize the audit by adding a `.securityrc` or specifying excludes in the script, though the default settings are designed to be comprehensive.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: js-ts-security-skill
|
|
3
|
+
description: Verify the 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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "JS/TS Security",
|
|
3
|
+
"description": "Verify security of JavaScript and TypeScript codebases against OWASP Top 10 2025 standards",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"author": "AI Agent Skills",
|
|
6
|
+
"tags": ["javascript", "typescript", "security", "OWASP", "vulnerability-scanning"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-creator
|
|
3
|
+
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill Creator
|
|
7
|
+
|
|
8
|
+
## Description
|
|
9
|
+
Guide for creating effective skills that extend Claude's capabilities with specialized knowledge, workflows, and tool integrations.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
Invoke this skill when creating or updating a skill package.
|
|
13
|
+
|
|
14
|
+
## Instructions
|
|
15
|
+
|
|
16
|
+
### Skill Creation Process
|
|
17
|
+
|
|
18
|
+
Follow these steps in order:
|
|
19
|
+
|
|
20
|
+
1. **Understand** the skill with concrete examples
|
|
21
|
+
2. **Plan** reusable skill contents (scripts, references, assets)
|
|
22
|
+
3. **Initialize** the skill (run `scripts/init_skill.py <name> --path <dir>`)
|
|
23
|
+
4. **Edit** the skill (implement resources, write SKILL.md)
|
|
24
|
+
5. **Package** the skill (run `scripts/package_skill.py <path>`)
|
|
25
|
+
6. **Iterate** based on real usage
|
|
26
|
+
|
|
27
|
+
### Core Principles
|
|
28
|
+
|
|
29
|
+
- **Concise is key**: Claude is already smart — only add context it doesn't have. Challenge each piece of information: "Does Claude really need this?"
|
|
30
|
+
- **Appropriate freedom**: Match specificity to task fragility. High freedom for flexible tasks, low freedom for fragile operations.
|
|
31
|
+
- **Progressive disclosure**: Keep SKILL.md under 500 lines. Use references/ for detailed content.
|
|
32
|
+
|
|
33
|
+
### Skill Structure
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
skill-name/
|
|
37
|
+
├── SKILL.md (required — YAML frontmatter + markdown body)
|
|
38
|
+
├── scripts/ (executable code, Python/Bash)
|
|
39
|
+
├── references/ (documentation loaded into context as needed)
|
|
40
|
+
└── assets/ (files used in output: templates, images, fonts)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### SKILL.md Frontmatter
|
|
44
|
+
|
|
45
|
+
Only `name` and `description` are required. Description is the primary trigger mechanism — include both what the skill does AND when to use it.
|
|
46
|
+
|
|
47
|
+
### Bundled Resources
|
|
48
|
+
|
|
49
|
+
- **scripts/**: For code that's rewritten repeatedly or needs deterministic reliability
|
|
50
|
+
- **references/**: For documentation Claude should reference while working (schemas, APIs, policies)
|
|
51
|
+
- **assets/**: For files used in output but not loaded into context (templates, images, fonts)
|
|
52
|
+
|
|
53
|
+
### What NOT to Include
|
|
54
|
+
|
|
55
|
+
Do NOT create README.md, INSTALLATION_GUIDE.md, QUICK_REFERENCE.md, CHANGELOG.md, or other auxiliary docs. Only include what an AI agent needs to execute tasks.
|
|
56
|
+
|
|
57
|
+
### Design Patterns
|
|
58
|
+
|
|
59
|
+
- **Multi-step processes**: See [references/workflows.md](references/workflows.md)
|
|
60
|
+
- **Output formats**: See [references/output-patterns.md](references/output-patterns.md)
|
|
61
|
+
|
|
62
|
+
### Tools
|
|
63
|
+
|
|
64
|
+
- **Initialize**: `scripts/init_skill.py <skill-name> --path <output-dir>`
|
|
65
|
+
- **Validate**: `scripts/quick_validate.py <skill-dir>`
|
|
66
|
+
- **Package**: `scripts/package_skill.py <skill-dir> [output-dir]`
|