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.
Files changed (86) hide show
  1. package/.opencode/skills/.ma-agents.json +99 -99
  2. package/.roo/rules/00-ma-agents.md +13 -0
  3. package/.roo/skills/.ma-agents.json +241 -0
  4. package/.roo/skills/MANIFEST.yaml +254 -0
  5. package/.roo/skills/ai-audit-trail/SKILL.md +23 -0
  6. package/.roo/skills/auto-bug-detection/SKILL.md +169 -0
  7. package/.roo/skills/cmake-best-practices/SKILL.md +64 -0
  8. package/.roo/skills/cmake-best-practices/examples/cmake.md +59 -0
  9. package/.roo/skills/code-documentation/SKILL.md +57 -0
  10. package/.roo/skills/code-documentation/examples/cpp.md +29 -0
  11. package/.roo/skills/code-documentation/examples/csharp.md +28 -0
  12. package/.roo/skills/code-documentation/examples/javascript_typescript.md +28 -0
  13. package/.roo/skills/code-documentation/examples/python.md +57 -0
  14. package/.roo/skills/code-review/SKILL.md +43 -0
  15. package/.roo/skills/commit-message/SKILL.md +79 -0
  16. package/.roo/skills/cpp-best-practices/SKILL.md +234 -0
  17. package/.roo/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
  18. package/.roo/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
  19. package/.roo/skills/cpp-concurrency-safety/SKILL.md +60 -0
  20. package/.roo/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
  21. package/.roo/skills/cpp-const-correctness/SKILL.md +63 -0
  22. package/.roo/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
  23. package/.roo/skills/cpp-memory-handling/SKILL.md +42 -0
  24. package/.roo/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
  25. package/.roo/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
  26. package/.roo/skills/cpp-modern-composition/SKILL.md +64 -0
  27. package/.roo/skills/cpp-modern-composition/examples/composition.md +51 -0
  28. package/.roo/skills/cpp-robust-interfaces/SKILL.md +55 -0
  29. package/.roo/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
  30. package/.roo/skills/create-hardened-docker-skill/SKILL.md +637 -0
  31. package/.roo/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
  32. package/.roo/skills/csharp-best-practices/SKILL.md +278 -0
  33. package/.roo/skills/docker-hardening-verification/SKILL.md +28 -0
  34. package/.roo/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
  35. package/.roo/skills/docker-image-signing/SKILL.md +28 -0
  36. package/.roo/skills/docker-image-signing/scripts/sign-image.sh +33 -0
  37. package/.roo/skills/document-revision-history/SKILL.md +104 -0
  38. package/.roo/skills/git-workflow-skill/SKILL.md +194 -0
  39. package/.roo/skills/git-workflow-skill/hooks/commit-msg +61 -0
  40. package/.roo/skills/git-workflow-skill/hooks/pre-commit +38 -0
  41. package/.roo/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
  42. package/.roo/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
  43. package/.roo/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
  44. package/.roo/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
  45. package/.roo/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
  46. package/.roo/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
  47. package/.roo/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
  48. package/.roo/skills/js-ts-security-skill/SKILL.md +64 -0
  49. package/.roo/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
  50. package/.roo/skills/logging-best-practices/SKILL.md +50 -0
  51. package/.roo/skills/logging-best-practices/examples/cpp.md +36 -0
  52. package/.roo/skills/logging-best-practices/examples/csharp.md +49 -0
  53. package/.roo/skills/logging-best-practices/examples/javascript.md +77 -0
  54. package/.roo/skills/logging-best-practices/examples/python.md +57 -0
  55. package/.roo/skills/logging-best-practices/references/logging-standards.md +29 -0
  56. package/.roo/skills/open-presentation/SKILL.md +35 -0
  57. package/.roo/skills/opentelemetry-best-practices/SKILL.md +34 -0
  58. package/.roo/skills/opentelemetry-best-practices/examples/go.md +32 -0
  59. package/.roo/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
  60. package/.roo/skills/opentelemetry-best-practices/examples/python.md +37 -0
  61. package/.roo/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
  62. package/.roo/skills/python-best-practices/SKILL.md +385 -0
  63. package/.roo/skills/python-dependency-mgmt/SKILL.md +42 -0
  64. package/.roo/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
  65. package/.roo/skills/python-security-skill/SKILL.md +56 -0
  66. package/.roo/skills/python-security-skill/examples/security.md +56 -0
  67. package/.roo/skills/self-signed-cert/SKILL.md +42 -0
  68. package/.roo/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
  69. package/.roo/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
  70. package/.roo/skills/skill-creator/SKILL.md +196 -0
  71. package/.roo/skills/skill-creator/references/output-patterns.md +82 -0
  72. package/.roo/skills/skill-creator/references/workflows.md +28 -0
  73. package/.roo/skills/skill-creator/scripts/init_skill.py +208 -0
  74. package/.roo/skills/skill-creator/scripts/package_skill.py +99 -0
  75. package/.roo/skills/skill-creator/scripts/quick_validate.py +113 -0
  76. package/.roo/skills/story-status-lookup/SKILL.md +78 -0
  77. package/.roo/skills/test-accompanied-development/SKILL.md +50 -0
  78. package/.roo/skills/test-generator/SKILL.md +65 -0
  79. package/.roo/skills/vercel-react-best-practices/SKILL.md +109 -0
  80. package/.roo/skills/verify-hardened-docker-skill/SKILL.md +442 -0
  81. package/.roo/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
  82. package/README.md +2 -1
  83. package/lib/agents.js +23 -0
  84. package/package.json +4 -3
  85. package/test/roo-code-agent.test.js +166 -0
  86. 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