@damian87/omp 0.17.0 → 0.19.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/.github/dependabot.yml +42 -0
- package/.github/skills/code-review/SKILL.md +5 -1
- package/.github/skills/debug/SKILL.md +1 -1
- package/.github/skills/qa-browse/SKILL.md +125 -0
- package/.github/skills/ralplan/SKILL.md +4 -1
- package/.github/skills/tdd/SKILL.md +21 -6
- package/.github/skills/ultraqa/SKILL.md +1 -1
- package/.github/skills/verify/SKILL.md +1 -1
- package/.github/workflows/ci.yml +67 -0
- package/.github/workflows/security.yml +157 -0
- package/README.md +2 -0
- package/dist/src/env/init.js +1 -1
- package/dist/src/env/init.js.map +1 -1
- package/dist/src/memory-review/transcript.js +1 -1
- package/dist/src/memory-review/transcript.js.map +1 -1
- package/docs/security-pipeline.md +101 -0
- package/package.json +13 -6
- package/plugin.json +1 -1
- package/scripts/skills-safety-scan.mjs +231 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# npm dependencies
|
|
4
|
+
- package-ecosystem: npm
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: weekly
|
|
8
|
+
day: monday
|
|
9
|
+
time: "06:00"
|
|
10
|
+
timezone: Europe/London
|
|
11
|
+
open-pull-requests-limit: 10
|
|
12
|
+
labels: ["dependencies"]
|
|
13
|
+
groups:
|
|
14
|
+
# Coupled peer pairs must upgrade together or npm hits ERESOLVE.
|
|
15
|
+
# Listed first so they take precedence over the type-based groups
|
|
16
|
+
# below, and intentionally unrestricted on update-types so majors
|
|
17
|
+
# (e.g. eslint 9->10) bump alongside their peers in one PR.
|
|
18
|
+
eslint:
|
|
19
|
+
patterns: ["eslint", "@eslint/*"]
|
|
20
|
+
vitest:
|
|
21
|
+
patterns: ["vitest", "@vitest/*"]
|
|
22
|
+
dev-dependencies:
|
|
23
|
+
dependency-type: development
|
|
24
|
+
update-types: ["minor", "patch"]
|
|
25
|
+
production-dependencies:
|
|
26
|
+
dependency-type: production
|
|
27
|
+
update-types: ["minor", "patch"]
|
|
28
|
+
commit-message:
|
|
29
|
+
prefix: "chore(deps)"
|
|
30
|
+
prefix-development: "chore(dev-deps)"
|
|
31
|
+
|
|
32
|
+
# GitHub Actions used in workflows
|
|
33
|
+
- package-ecosystem: github-actions
|
|
34
|
+
directory: "/"
|
|
35
|
+
schedule:
|
|
36
|
+
interval: weekly
|
|
37
|
+
day: monday
|
|
38
|
+
time: "06:00"
|
|
39
|
+
timezone: Europe/London
|
|
40
|
+
labels: ["ci", "dependencies"]
|
|
41
|
+
commit-message:
|
|
42
|
+
prefix: "ci(actions)"
|
|
@@ -17,13 +17,17 @@ Use `/code-review` before merge or final handoff.
|
|
|
17
17
|
|
|
18
18
|
1. **Read the diff** — `git diff` for unstaged, `git diff --staged` for staged, or `git diff main...HEAD` for branch diff
|
|
19
19
|
2. **Check for blockers** — bugs, logic errors, missing error handling, broken contracts
|
|
20
|
-
3. **Check for security** — secrets in code, injection risks, auth gaps, unsafe defaults
|
|
20
|
+
3. **Check for security** — secrets in code, injection risks, auth gaps, unsafe defaults, and
|
|
21
|
+
**data exposure / least privilege**: does the change return, log, or expose more than it
|
|
22
|
+
needs (PII, password hashes, `SELECT *`, tokens, internal fields)?
|
|
21
23
|
4. **Check for regressions** — does the change break existing tests or documented behaviour?
|
|
22
24
|
5. **Check for scope drift** — does the change do more or less than requested?
|
|
23
25
|
6. **Run tests** if they exist and haven't been run
|
|
24
26
|
|
|
25
27
|
## Rules
|
|
26
28
|
|
|
29
|
+
- **Don't stop at the first issue.** Once you find a blocker, keep scanning the whole change —
|
|
30
|
+
a serious bug (e.g. a data leak) often hides behind the obvious one. Review every line.
|
|
27
31
|
- Only flag issues that genuinely matter — no style nits, no formatting opinions
|
|
28
32
|
- If the code works, tests pass, and scope is right, say so clearly
|
|
29
33
|
- Flag anything you'd reject in a PR review
|
|
@@ -17,7 +17,7 @@ Use `/debug` for broken, failing, slow, or confusing behavior.
|
|
|
17
17
|
|
|
18
18
|
## Steps (follow in order)
|
|
19
19
|
|
|
20
|
-
1. **Reproduce** — get the failure to happen reliably. If you can't reproduce, that's important information.
|
|
20
|
+
1. **Reproduce** — get the failure to happen reliably. If you can't reproduce, that's important information. For a web UI bug, use `/qa-browse` to drive the page and reproduce the broken flow.
|
|
21
21
|
2. **Minimise** — find the smallest case that still fails. Strip away unrelated code/config.
|
|
22
22
|
3. **Hypothesise** — form 2–3 ranked theories about the cause. Start with the most likely.
|
|
23
23
|
4. **Inspect** — gather evidence for/against each hypothesis. Read code, add logging, check state.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-browse
|
|
3
|
+
description: Drive a real browser from the CLI to QA a flow — navigate, click, fill, verify. Uses @playwright/cli (token-efficient, not MCP). Use with /qa-browse when the user wants to manually check a web flow works, not write a test suite.
|
|
4
|
+
argument-hint: "<url> <what to verify>"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QA Browse — CLI browser driving with @playwright/cli
|
|
8
|
+
|
|
9
|
+
`/qa-browse` opens a live browser via `@playwright/cli` (binary `playwright-cli`) and walks a flow to verify it works. No test files. No MCP. This is distinct from the standard Playwright CLI (`npx playwright`, used for test/codegen/show-trace).
|
|
10
|
+
|
|
11
|
+
Engine: `@playwright/cli` (Microsoft). Snapshots live on disk, not in context — cheap tokens. Browser stays alive between commands.
|
|
12
|
+
|
|
13
|
+
## Rules
|
|
14
|
+
|
|
15
|
+
- If not installed globally, run via the scoped package: `npx @playwright/cli` (NOT `npx playwright-cli` — that resolves the unscoped name and fails with ENOTFOUND). Never assume global.
|
|
16
|
+
- Loop: **snapshot → read refs → act → re-snapshot.** Always.
|
|
17
|
+
- Refs (`e5`, `e12`) are valid only for the latest snapshot. Re-snapshot after any navigation/click that changes the page.
|
|
18
|
+
- Headless by default. Add `--headed` only when a human must watch.
|
|
19
|
+
- Prefer refs over CSS. Use `getByRole`/`getByText` selectors only if a ref isn't available.
|
|
20
|
+
- Verify with `eval` or a snapshot of the result region — don't assume an action worked.
|
|
21
|
+
- Screenshot on each pass/fail checkpoint so there's evidence.
|
|
22
|
+
- `close` when done.
|
|
23
|
+
|
|
24
|
+
## Setup
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g @playwright/cli@latest # or run ad-hoc: npx @playwright/cli
|
|
28
|
+
playwright-cli install-browser chromium # first run in a fresh env (NOT `install` — that inits a workspace)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Core loop
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
playwright-cli open <url> # open + navigate (prints a snapshot path)
|
|
35
|
+
playwright-cli snapshot # accessibility tree with refs → read it
|
|
36
|
+
playwright-cli click e15 # act using a ref
|
|
37
|
+
playwright-cli fill e5 "text" # fill input (add --submit to press Enter)
|
|
38
|
+
playwright-cli type "text" # type into focused element
|
|
39
|
+
playwright-cli press Enter # key press
|
|
40
|
+
playwright-cli snapshot # re-snapshot to confirm new state
|
|
41
|
+
playwright-cli screenshot # evidence
|
|
42
|
+
playwright-cli close
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Interact
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
playwright-cli click <ref> [button] # left/right/middle
|
|
49
|
+
playwright-cli dblclick <ref>
|
|
50
|
+
playwright-cli fill <ref> <text> --submit
|
|
51
|
+
playwright-cli select <ref> <value> # dropdown
|
|
52
|
+
playwright-cli check <ref> / uncheck <ref>
|
|
53
|
+
playwright-cli hover <ref>
|
|
54
|
+
playwright-cli drag <startRef> <endRef>
|
|
55
|
+
playwright-cli upload ./file.pdf
|
|
56
|
+
playwright-cli dialog-accept / dialog-dismiss
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Navigate
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
playwright-cli goto <url>
|
|
63
|
+
playwright-cli go-back / go-forward / reload
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Inspect & verify
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
playwright-cli snapshot --depth=4 # shallow tree on big pages
|
|
70
|
+
playwright-cli snapshot e34 # drill into a subtree
|
|
71
|
+
playwright-cli snapshot --raw | grep button # script-friendly
|
|
72
|
+
playwright-cli eval "document.title" # read page state
|
|
73
|
+
playwright-cli eval "el => el.textContent" e5
|
|
74
|
+
playwright-cli eval "el => el.getAttribute('data-testid')" e5
|
|
75
|
+
playwright-cli console # console messages
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Evidence
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
playwright-cli screenshot --full-page # full scrollable page (bare `screenshot` = current viewport)
|
|
82
|
+
playwright-cli screenshot e5 # one element
|
|
83
|
+
playwright-cli screenshot --filename=step1.png
|
|
84
|
+
playwright-cli video-start / video-stop
|
|
85
|
+
playwright-cli tracing-start / tracing-stop # record a trace; view it with: npx playwright show-trace <trace>
|
|
86
|
+
playwright-cli pdf --filename=page.pdf
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Sessions
|
|
90
|
+
|
|
91
|
+
State (cookies, localStorage) persists within a session across commands.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
playwright-cli --session=qa open <url> # named session
|
|
95
|
+
playwright-cli -s=qa open <url> --persistent # save profile to disk
|
|
96
|
+
playwright-cli list # running sessions
|
|
97
|
+
playwright-cli show # live dashboard, take over mouse/kbd
|
|
98
|
+
playwright-cli close-all / kill-all
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## QA flow checklist
|
|
102
|
+
|
|
103
|
+
1. `open <url>` → `snapshot`.
|
|
104
|
+
2. For each step: find ref in snapshot → act → re-snapshot → verify expected element/text.
|
|
105
|
+
3. `screenshot` at each checkpoint (pass and fail).
|
|
106
|
+
4. On failure: `eval` the element, capture `console`, take a `--headed` re-run or trace.
|
|
107
|
+
5. Report: what passed, what failed, with screenshot/snapshot paths. `close`.
|
|
108
|
+
|
|
109
|
+
## Example — login flow
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
playwright-cli open https://app.example.com/login
|
|
113
|
+
playwright-cli snapshot
|
|
114
|
+
playwright-cli fill e1 "user@example.com"
|
|
115
|
+
playwright-cli fill e2 "secret" --submit
|
|
116
|
+
playwright-cli snapshot # expect dashboard
|
|
117
|
+
playwright-cli eval "document.title"
|
|
118
|
+
playwright-cli screenshot --filename=logged-in.png
|
|
119
|
+
playwright-cli close
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## When NOT to use
|
|
123
|
+
|
|
124
|
+
- Want a saved, repeatable test suite → use `/tdd` or write `@playwright/test` specs.
|
|
125
|
+
- Need long-running autonomous loops or persistent introspection → Playwright MCP may fit better.
|
|
@@ -19,7 +19,10 @@ Use `/ralplan` when the task needs planning before edits.
|
|
|
19
19
|
2. **List implementation slices** in execution order — each slice should be independently verifiable
|
|
20
20
|
3. **Define acceptance criteria** — what must be true when done
|
|
21
21
|
4. **Define test shape** — which tests to write or run, what they cover
|
|
22
|
-
5. **Call out risks** — what could go wrong, tradeoffs chosen, alternatives rejected
|
|
22
|
+
5. **Call out risks** — what could go wrong, tradeoffs chosen, alternatives rejected. For any
|
|
23
|
+
auth, security, or data-handling feature, the plan **must** name the security specifics even
|
|
24
|
+
if the request didn't: secret/token **expiry**, **single-use / replay** protection, and
|
|
25
|
+
**enumeration / rate-limiting**. Leaving these implicit is how the plan ships a hole.
|
|
23
26
|
6. **Stop at the plan** unless the user explicitly asked to implement
|
|
24
27
|
|
|
25
28
|
## Output
|
|
@@ -13,15 +13,29 @@ Use `/tdd` when a change can be specified by tests.
|
|
|
13
13
|
- The codebase has an existing test framework
|
|
14
14
|
- You want to prove correctness incrementally
|
|
15
15
|
|
|
16
|
-
## Loop (repeat until
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
## Loop (Canon TDD — repeat until the list is empty)
|
|
17
|
+
|
|
18
|
+
0. **List first** — before writing any code, read the **full spec/docstring** and write a
|
|
19
|
+
**test list**: every scenario you need to cover. Don't start from the happy path — walk the
|
|
20
|
+
edge-case taxonomy against the spec and add a line for each that applies:
|
|
21
|
+
- **Boundary** — min/max, zero, empty, first/last, length limits, collapsing/trimming
|
|
22
|
+
- **Empty/Null** — `""`, `None`, empty collection, whitespace-only
|
|
23
|
+
- **Format** — **unicode / accented characters**, emoji, special chars, malformed input
|
|
24
|
+
- **Implicit** — anything the spec *implies* but the prompt didn't spell out
|
|
25
|
+
A requirement that appears in the spec but not your list is the bug you're about to ship.
|
|
26
|
+
1. **Red** — turn **exactly one** list item into a concrete test with real **assertions**
|
|
27
|
+
(`assert`, `expect`, `self.assertEqual`); run it and watch it **fail for the right reason**.
|
|
28
|
+
2. **Green** — write the minimal code to make that test (and all previous tests) pass.
|
|
29
|
+
3. **Refactor** — clean up while tests stay green.
|
|
30
|
+
4. **Repeat** — take the next list item; add new items as you discover them. Run the full
|
|
31
|
+
related suite at the end to check for regressions.
|
|
22
32
|
|
|
23
33
|
## Rules
|
|
24
34
|
|
|
35
|
+
- Use **executable assertions** — a script that only prints results for a human to eyeball is
|
|
36
|
+
**not a test** and does not count as red-green. Every scenario on the list gets an assertion.
|
|
37
|
+
- Work the **whole list**, not just the first case — the bugs hide in the edge cases the prompt
|
|
38
|
+
didn't spell out (unicode/accents, empty input, boundaries).
|
|
25
39
|
- Test **behaviour** through public surfaces, not implementation details
|
|
26
40
|
- Each test should describe one behaviour — name it clearly (e.g. "returns 404 when user not found")
|
|
27
41
|
- Avoid brittle tests that break when implementation changes but behaviour doesn't
|
|
@@ -30,6 +44,7 @@ Use `/tdd` when a change can be specified by tests.
|
|
|
30
44
|
|
|
31
45
|
## Output
|
|
32
46
|
|
|
47
|
+
- `Test list` — the scenarios you enumerated from the spec (incl. the edge cases)
|
|
33
48
|
- `Tests written` — list of test names and what they cover
|
|
34
49
|
- `Implementation` — what was changed to make tests pass
|
|
35
50
|
- `Refactoring` — what was cleaned up
|
|
@@ -54,7 +54,7 @@ Number every cycle explicitly: "Cycle 1", "Cycle 2", etc.
|
|
|
54
54
|
|
|
55
55
|
## Rules
|
|
56
56
|
|
|
57
|
-
- Prefer runnable checks over inspection — run tests, don't just read code
|
|
57
|
+
- Prefer runnable checks over inspection — run tests, don't just read code. For web UI flows, exercise the real page with `/qa-browse` rather than inspecting markup.
|
|
58
58
|
- If tests don't exist, write minimal ones that cover the change
|
|
59
59
|
- Route fixes back to `/ralph` or `/ultrawork` if they're substantial
|
|
60
60
|
|
|
@@ -20,7 +20,7 @@ Use `/verify` before saying done.
|
|
|
20
20
|
- Tests: `npm test`, `pytest`, etc.
|
|
21
21
|
- Build: does it compile/build without errors?
|
|
22
22
|
- Lint: any new warnings?
|
|
23
|
-
- Behaviour: does the feature work as described?
|
|
23
|
+
- Behaviour: does the feature work as described? For web UI flows, use `/qa-browse` to drive the live page and capture snapshot/screenshot evidence.
|
|
24
24
|
3. **Read outputs** — don't assume green means pass; read the actual results
|
|
25
25
|
4. **Report honestly** — if there are gaps, say so
|
|
26
26
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
# Avoid piling up redundant runs on the same ref.
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
env:
|
|
19
|
+
# Hermetic runs — never auto-load a developer's ~/.omp/.env, never self-update.
|
|
20
|
+
OMP_SKIP_USER_ENV: "1"
|
|
21
|
+
OMP_NO_UPDATE_CHECK: "1"
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
build-test:
|
|
25
|
+
name: Build · Test · Lint (Node ${{ matrix.node }})
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
node: [20, 22]
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v7
|
|
33
|
+
|
|
34
|
+
- uses: actions/setup-node@v6
|
|
35
|
+
with:
|
|
36
|
+
node-version: ${{ matrix.node }}
|
|
37
|
+
cache: npm
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: npm ci
|
|
41
|
+
|
|
42
|
+
- name: Build (tsc)
|
|
43
|
+
run: npm run build
|
|
44
|
+
|
|
45
|
+
- name: Lint (eslint)
|
|
46
|
+
run: npm run lint
|
|
47
|
+
|
|
48
|
+
- name: Unit tests (vitest)
|
|
49
|
+
run: npm test
|
|
50
|
+
|
|
51
|
+
skills:
|
|
52
|
+
name: Validate skills & catalog
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v7
|
|
56
|
+
- uses: actions/setup-node@v6
|
|
57
|
+
with:
|
|
58
|
+
node-version: 20
|
|
59
|
+
cache: npm
|
|
60
|
+
- run: npm ci
|
|
61
|
+
|
|
62
|
+
# Project's own validators.
|
|
63
|
+
- name: Lint skills (omp lint:skills)
|
|
64
|
+
run: npm run lint:skills
|
|
65
|
+
|
|
66
|
+
- name: Validate catalog
|
|
67
|
+
run: npm run check:catalog
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
name: Security
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
schedule:
|
|
9
|
+
# Weekly full scan (Mondays 06:17 UTC) to catch newly disclosed CVEs.
|
|
10
|
+
- cron: "17 6 * * 1"
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: security-${{ github.workflow }}-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
|
|
20
|
+
env:
|
|
21
|
+
OMP_SKIP_USER_ENV: "1"
|
|
22
|
+
OMP_NO_UPDATE_CHECK: "1"
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
# ── 1. Native, free, zero-secret baseline ─────────────────────────────
|
|
26
|
+
npm-audit:
|
|
27
|
+
name: npm audit (prod deps)
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v7
|
|
31
|
+
- uses: actions/setup-node@v6
|
|
32
|
+
with:
|
|
33
|
+
node-version: 20
|
|
34
|
+
cache: npm
|
|
35
|
+
- run: npm ci
|
|
36
|
+
# Fail only on HIGH/critical in production dependencies.
|
|
37
|
+
- name: npm audit (high+, prod only)
|
|
38
|
+
run: npm run audit:ci
|
|
39
|
+
|
|
40
|
+
skills-safety:
|
|
41
|
+
name: Skills safety scan
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v7
|
|
45
|
+
- uses: actions/setup-node@v6
|
|
46
|
+
with:
|
|
47
|
+
node-version: 20
|
|
48
|
+
# No install needed — pure Node script over SKILL.md / agents / catalog.
|
|
49
|
+
- name: Static safety audit of skills & agents
|
|
50
|
+
run: node scripts/skills-safety-scan.mjs --root .
|
|
51
|
+
|
|
52
|
+
codeql:
|
|
53
|
+
name: CodeQL (JS/TS)
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
permissions:
|
|
56
|
+
contents: read
|
|
57
|
+
security-events: write
|
|
58
|
+
actions: read
|
|
59
|
+
steps:
|
|
60
|
+
- uses: actions/checkout@v7
|
|
61
|
+
- uses: github/codeql-action/init@v4
|
|
62
|
+
with:
|
|
63
|
+
languages: javascript-typescript
|
|
64
|
+
queries: security-and-quality
|
|
65
|
+
- uses: github/codeql-action/analyze@v4
|
|
66
|
+
with:
|
|
67
|
+
category: "/language:javascript-typescript"
|
|
68
|
+
|
|
69
|
+
dependency-review:
|
|
70
|
+
name: Dependency review (PR only)
|
|
71
|
+
if: github.event_name == 'pull_request'
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
permissions:
|
|
74
|
+
contents: read
|
|
75
|
+
pull-requests: write
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/checkout@v7
|
|
78
|
+
- uses: actions/dependency-review-action@v5
|
|
79
|
+
with:
|
|
80
|
+
fail-on-severity: high
|
|
81
|
+
comment-summary-in-pr: on-failure
|
|
82
|
+
|
|
83
|
+
# ── 2. Socket — supply-chain / malicious package detection ────────────
|
|
84
|
+
# Requires repo secret SOCKET_SECURITY_API_KEY (free at socket.dev).
|
|
85
|
+
socket:
|
|
86
|
+
name: Socket supply-chain scan
|
|
87
|
+
runs-on: ubuntu-latest
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v7
|
|
90
|
+
- name: Check for Socket token
|
|
91
|
+
id: gate
|
|
92
|
+
run: |
|
|
93
|
+
if [ -n "${{ secrets.SOCKET_SECURITY_API_KEY }}" ]; then
|
|
94
|
+
echo "enabled=true" >> "$GITHUB_OUTPUT"
|
|
95
|
+
else
|
|
96
|
+
echo "enabled=false" >> "$GITHUB_OUTPUT"
|
|
97
|
+
echo "::notice title=Socket skipped::Set the SOCKET_SECURITY_API_KEY repo secret to enable Socket scanning."
|
|
98
|
+
fi
|
|
99
|
+
- uses: actions/setup-node@v6
|
|
100
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
101
|
+
with:
|
|
102
|
+
node-version: 20
|
|
103
|
+
- name: Socket CLI scan
|
|
104
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
105
|
+
env:
|
|
106
|
+
SOCKET_SECURITY_API_KEY: ${{ secrets.SOCKET_SECURITY_API_KEY }}
|
|
107
|
+
run: npx -y @socketsecurity/cli@latest scan create . --view --no-interactive
|
|
108
|
+
|
|
109
|
+
# ── 3. Snyk — dependency + code vulnerability scanning ────────────────
|
|
110
|
+
# Requires repo secret SNYK_TOKEN (free at snyk.io). Uploads SARIF to the
|
|
111
|
+
# GitHub Security tab.
|
|
112
|
+
snyk:
|
|
113
|
+
name: Snyk (deps + code)
|
|
114
|
+
runs-on: ubuntu-latest
|
|
115
|
+
permissions:
|
|
116
|
+
contents: read
|
|
117
|
+
security-events: write
|
|
118
|
+
steps:
|
|
119
|
+
- uses: actions/checkout@v7
|
|
120
|
+
- name: Check for Snyk token
|
|
121
|
+
id: gate
|
|
122
|
+
run: |
|
|
123
|
+
if [ -n "${{ secrets.SNYK_TOKEN }}" ]; then
|
|
124
|
+
echo "enabled=true" >> "$GITHUB_OUTPUT"
|
|
125
|
+
else
|
|
126
|
+
echo "enabled=false" >> "$GITHUB_OUTPUT"
|
|
127
|
+
echo "::notice title=Snyk skipped::Set the SNYK_TOKEN repo secret to enable Snyk scanning."
|
|
128
|
+
fi
|
|
129
|
+
- uses: actions/setup-node@v6
|
|
130
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
131
|
+
with:
|
|
132
|
+
node-version: 20
|
|
133
|
+
cache: npm
|
|
134
|
+
- run: npm ci
|
|
135
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
136
|
+
|
|
137
|
+
- name: Snyk Open Source (dependencies)
|
|
138
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
139
|
+
continue-on-error: true
|
|
140
|
+
env:
|
|
141
|
+
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
142
|
+
run: npx -y snyk@latest test --severity-threshold=high --sarif-file-output=snyk-deps.sarif
|
|
143
|
+
|
|
144
|
+
- name: Snyk Code (SAST)
|
|
145
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
146
|
+
continue-on-error: true
|
|
147
|
+
env:
|
|
148
|
+
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
149
|
+
run: npx -y snyk@latest code test --severity-threshold=high --sarif-file-output=snyk-code.sarif
|
|
150
|
+
|
|
151
|
+
- name: Upload Snyk results to GitHub Security
|
|
152
|
+
if: steps.gate.outputs.enabled == 'true'
|
|
153
|
+
uses: github/codeql-action/upload-sarif@v4
|
|
154
|
+
with:
|
|
155
|
+
sarif_file: .
|
|
156
|
+
category: snyk
|
|
157
|
+
continue-on-error: true
|
package/README.md
CHANGED
|
@@ -385,6 +385,7 @@ omp grows in vertical slices. Items aren't pinned to specific semver versions
|
|
|
385
385
|
- [Jira adapter](docs/jira.md) — configuration discovery, safe operations, dry-runs, fallback payloads
|
|
386
386
|
- [Self-evolve](docs/self-evolve.md) — extracting reusable skills from session transcripts
|
|
387
387
|
- [Slack setup](docs/slack-setup.md) — Slack app manifest, scopes, Socket-Mode token, `omp gateway serve`
|
|
388
|
+
- [Skill benchmark](benchmarks/skill-bench/README.md) — agentic benchmark that measures whether a skill actually beats *just telling the model* (baseline / one-line prompt / skill arms), with live Haiku 4.5 findings
|
|
388
389
|
|
|
389
390
|
## Layout
|
|
390
391
|
|
|
@@ -394,6 +395,7 @@ omp grows in vertical slices. Items aren't pinned to specific semver versions
|
|
|
394
395
|
hooks/hooks.json # lifecycle hook manifest
|
|
395
396
|
scripts/*.mjs # hook implementations
|
|
396
397
|
src/ # omp CLI, team runtime, gateway/comms, schedule, mode-state loops
|
|
398
|
+
benchmarks/skill-bench/ # agentic benchmark: does a skill beat just telling the model?
|
|
397
399
|
```
|
|
398
400
|
|
|
399
401
|
Skills follow the [Copilot agent-skills docs](https://docs.github.com/en/copilot) — project skills live in `.github/skills/` and are invoked with `/skill-name`.
|
package/dist/src/env/init.js
CHANGED
|
@@ -182,7 +182,7 @@ export async function runEnvInit(opts) {
|
|
|
182
182
|
// no chance of stomping a pre-existing temp file with stale perms. The
|
|
183
183
|
// final rename then atomically installs the 0o600 file into place.
|
|
184
184
|
let tmpDir = null;
|
|
185
|
-
let tmpFile
|
|
185
|
+
let tmpFile;
|
|
186
186
|
try {
|
|
187
187
|
tmpDir = mkdtempSync(join(dirname(path), ".env-init-"));
|
|
188
188
|
tmpFile = join(tmpDir, "env");
|
package/dist/src/env/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/env/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/env/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/memory-review/transcript.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/memory-review/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Security & quality pipeline
|
|
2
|
+
|
|
3
|
+
This repo ships two GitHub Actions workflows plus Dependabot. Together they cover
|
|
4
|
+
dependency vulnerabilities, supply-chain/malicious-package risk, static code
|
|
5
|
+
analysis, and **AI-skill-specific safety** (the same classes of issue that the
|
|
6
|
+
[skills.sh](https://www.skills.sh) audits — Agent Trust Hub, Socket, Snyk —
|
|
7
|
+
flag for Agent Skills).
|
|
8
|
+
|
|
9
|
+
## Workflows
|
|
10
|
+
|
|
11
|
+
### `.github/workflows/ci.yml` — build, test, lint, skills validation
|
|
12
|
+
|
|
13
|
+
| Job | What it runs |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `build-test` | `npm ci` → `npm run build` (tsc) → `npm run lint` (eslint) → `npm test` (vitest), on Node 20 & 22 |
|
|
16
|
+
| `skills` | `npm run lint:skills` (omp's own validator) + `npm run check:catalog` |
|
|
17
|
+
|
|
18
|
+
### `.github/workflows/security.yml` — security scanners
|
|
19
|
+
|
|
20
|
+
| Job | Tool | Secret required | Gate |
|
|
21
|
+
| --- | --- | --- | --- |
|
|
22
|
+
| `npm-audit` | `npm audit` | none | fails on **high+** in **production** deps |
|
|
23
|
+
| `skills-safety` | `scripts/skills-safety-scan.mjs` | none | fails on any **HIGH** finding |
|
|
24
|
+
| `codeql` | GitHub CodeQL (JS/TS) | none | results in Security tab |
|
|
25
|
+
| `dependency-review` | GitHub Dependency Review | none (PRs only) | fails on **high** severity |
|
|
26
|
+
| `socket` | Socket CLI | `SOCKET_SECURITY_API_KEY` | skipped if secret unset |
|
|
27
|
+
| `snyk` | Snyk Open Source + Snyk Code | `SNYK_TOKEN` | SARIF → Security tab |
|
|
28
|
+
|
|
29
|
+
Runs on every push/PR to `main`, plus a weekly scheduled full scan (Mondays).
|
|
30
|
+
Socket and Snyk jobs **self-skip with a notice** if their secret isn't set, so
|
|
31
|
+
the pipeline is green out of the box and lights up as you add tokens.
|
|
32
|
+
|
|
33
|
+
## Required secrets (optional but recommended)
|
|
34
|
+
|
|
35
|
+
Add these under **Settings → Secrets and variables → Actions → New repository secret**:
|
|
36
|
+
|
|
37
|
+
| Secret | Where to get it | Free tier |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| `SNYK_TOKEN` | [snyk.io](https://snyk.io) → Account settings → Auth Token | Yes |
|
|
40
|
+
| `SOCKET_SECURITY_API_KEY` | [socket.dev](https://socket.dev) → Settings → API Tokens | Yes |
|
|
41
|
+
|
|
42
|
+
`GITHUB_TOKEN` is provided automatically — no setup needed for CodeQL,
|
|
43
|
+
Dependency Review, or SARIF upload.
|
|
44
|
+
|
|
45
|
+
## GitHub repo settings to flip on (one-time, free)
|
|
46
|
+
|
|
47
|
+
These complement the workflows and live in **Settings → Code security**:
|
|
48
|
+
|
|
49
|
+
- **Dependabot alerts** + **security updates** — `.github/dependabot.yml` already
|
|
50
|
+
schedules weekly version bumps for npm and Actions.
|
|
51
|
+
- **Secret scanning** + **push protection** — blocks committed credentials.
|
|
52
|
+
- **Code scanning** — surfaces CodeQL/Snyk SARIF in the Security tab.
|
|
53
|
+
|
|
54
|
+
## The skills safety scanner
|
|
55
|
+
|
|
56
|
+
`scripts/skills-safety-scan.mjs` statically audits `.github/skills/**`,
|
|
57
|
+
`.github/agents/**`, and `catalog/**` — including SKILL.md docs and bundled
|
|
58
|
+
helper scripts (`*.sh`, `*.py`, `*.mjs`, …) — for the risk classes those
|
|
59
|
+
external audits care about. To avoid false positives on documentation, the
|
|
60
|
+
command-style rules (S001–S003, S005–S007) only match inside fenced code blocks
|
|
61
|
+
in markdown (and the full body of script files); only the prompt-injection rule
|
|
62
|
+
(S004) scans prose. Multi-line commands joined with `\` are merged before
|
|
63
|
+
matching so a wrapped `curl … | sh` can't slip through.
|
|
64
|
+
|
|
65
|
+
| Rule | Severity | Detects |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| S001 | HIGH | `curl … | sh` remote code execution |
|
|
68
|
+
| S002 | MEDIUM | Unpinned remote install / `npx <pkg> add` |
|
|
69
|
+
| S003 | LOW | Global `-g` installs |
|
|
70
|
+
| S004 | MEDIUM | Indirect prompt-injection surface (fetch + act on untrusted/third-party content — cf. Snyk W011) |
|
|
71
|
+
| S005 | HIGH | Credential/secret exfiltration |
|
|
72
|
+
| S006 | MEDIUM | Obfuscation (`base64 -d | sh`, `eval(`, `Function(`) |
|
|
73
|
+
| S007 | HIGH | Destructive shell (`rm -rf /`, `dd`, `mkfs`, `chmod 777`) |
|
|
74
|
+
| S100/S101 | MEDIUM | SKILL.md missing `name` / `description` frontmatter |
|
|
75
|
+
|
|
76
|
+
Run locally:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm run scan:skills # human-readable, fails on HIGH
|
|
80
|
+
node scripts/skills-safety-scan.mjs --json # machine-readable
|
|
81
|
+
node scripts/skills-safety-scan.mjs --strict # also fail on MEDIUM
|
|
82
|
+
node scripts/skills-safety-scan.mjs --allow-empty # don't fail when no skills exist
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Local commands
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm run lint # eslint over src + scripts
|
|
89
|
+
npm run lint:fix # auto-fix
|
|
90
|
+
npm run lint:skills # omp's own SKILL.md validator
|
|
91
|
+
npm run check:catalog # catalog schema validation
|
|
92
|
+
npm run scan:skills # AI-skill safety scan
|
|
93
|
+
npm run audit:ci # prod-dep vulnerability gate (high+)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Notes
|
|
97
|
+
|
|
98
|
+
- ESLint is scoped to `src/**` and `scripts/**`. Tests (`test/**`) are covered
|
|
99
|
+
by vitest and kept out of the lint gate to avoid a large up-front refactor.
|
|
100
|
+
- `npm audit` gates on **production** dependencies only (`--omit=dev`); dev-only
|
|
101
|
+
vulns (vitest, vite, etc.) are handled by Dependabot PRs rather than blocking CI.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@damian87/omp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Multi-agent orchestration for GitHub Copilot CLI — autonomous loops (Autopilot, Ralph, UltraQA, Ultrawork), parallel tmux agent teams, a weighted-consensus model council, a Slack chat bridge, durable scheduled jobs, and in-session skills + custom agents. Zero learning curve.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -30,7 +30,11 @@
|
|
|
30
30
|
"catalog:list": "npm run build && node dist/src/cli.js catalog list",
|
|
31
31
|
"project:inspect": "npm run build && node dist/src/cli.js project inspect",
|
|
32
32
|
"test": "vitest run",
|
|
33
|
+
"lint": "eslint .",
|
|
34
|
+
"lint:fix": "eslint . --fix",
|
|
33
35
|
"lint:skills": "npm run build && node dist/src/cli.js lint:skills --root .",
|
|
36
|
+
"scan:skills": "node scripts/skills-safety-scan.mjs --root .",
|
|
37
|
+
"audit:ci": "npm audit --audit-level=high --omit=dev",
|
|
34
38
|
"sync:dry-run": "npm run build && node dist/src/cli.js sync:dry-run --root .",
|
|
35
39
|
"jira:dry-run": "npm run build && node dist/src/cli.js jira:dry-run --root .",
|
|
36
40
|
"omp:version": "npm run build && node dist/src/cli.js version",
|
|
@@ -57,12 +61,15 @@
|
|
|
57
61
|
"node": ">=20"
|
|
58
62
|
},
|
|
59
63
|
"devDependencies": {
|
|
60
|
-
"@
|
|
64
|
+
"@eslint/js": "^10.0.1",
|
|
65
|
+
"eslint": "^10.5.0",
|
|
66
|
+
"typescript-eslint": "^8.11.0",
|
|
67
|
+
"@types/node": "^26.0.1",
|
|
61
68
|
"@types/node-notifier": "^8.0.5",
|
|
62
|
-
"@vitest/coverage-v8": "^
|
|
63
|
-
"tsx": "^4.
|
|
64
|
-
"typescript": "^
|
|
65
|
-
"vitest": "^
|
|
69
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
70
|
+
"tsx": "^4.22.4",
|
|
71
|
+
"typescript": "^6.0.3",
|
|
72
|
+
"vitest": "^4.1.9"
|
|
66
73
|
},
|
|
67
74
|
"dependencies": {
|
|
68
75
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-copilot",
|
|
3
3
|
"description": "Multi-agent orchestration skills for GitHub Copilot CLI — autopilot, ralph, ultrawork, ultraqa, team, council, code-review and more as in-session slash skills + custom agents.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.19.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Damian Borek",
|
|
7
7
|
"email": "borekdamian@yahoo.pl"
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* skills-safety-scan — static safety audit for Agent Skills (SKILL.md) and agents.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the kinds of issues that Agent Trust Hub / Socket / Snyk flag for
|
|
6
|
+
* AI skills (see skills.sh audits), but runs locally with no network and no
|
|
7
|
+
* secrets so it can gate every PR:
|
|
8
|
+
*
|
|
9
|
+
* - Untrusted install / remote-code execution surfaces (curl | sh, npx <pkg>, -g, npm i remote)
|
|
10
|
+
* - Indirect prompt-injection surfaces (fetching + acting on third-party/user content)
|
|
11
|
+
* - Credential / secret exfiltration patterns
|
|
12
|
+
* - Obfuscation (base64 decode + exec, eval, large encoded blobs)
|
|
13
|
+
* - Destructive shell (rm -rf, dd, mkfs, chmod 777)
|
|
14
|
+
* - Frontmatter hygiene (missing name/description)
|
|
15
|
+
*
|
|
16
|
+
* Exit codes:
|
|
17
|
+
* 0 = no HIGH findings (warnings allowed)
|
|
18
|
+
* 1 = at least one HIGH finding, with --strict any MEDIUM finding, or no files
|
|
19
|
+
* scanned (target moved) unless --allow-empty is passed
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* node scripts/skills-safety-scan.mjs [--root .] [--strict] [--json] [--allow-empty]
|
|
23
|
+
*/
|
|
24
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
25
|
+
import { join, relative, sep } from "node:path";
|
|
26
|
+
|
|
27
|
+
const args = process.argv.slice(2);
|
|
28
|
+
const opt = (flag, def = null) => {
|
|
29
|
+
const i = args.indexOf(flag);
|
|
30
|
+
return i >= 0 ? (args[i + 1] && !args[i + 1].startsWith("--") ? args[i + 1] : true) : def;
|
|
31
|
+
};
|
|
32
|
+
const ROOT = typeof opt("--root") === "string" ? opt("--root") : ".";
|
|
33
|
+
const STRICT = !!opt("--strict", false);
|
|
34
|
+
const JSON_OUT = !!opt("--json", false);
|
|
35
|
+
const ALLOW_EMPTY = !!opt("--allow-empty", false);
|
|
36
|
+
|
|
37
|
+
// Where skills/agents live in this repo.
|
|
38
|
+
const SCAN_DIRS = [".github/skills", ".github/agents", "catalog"];
|
|
39
|
+
// Markdown/JSON docs plus bundled executable helpers — dangerous shell often
|
|
40
|
+
// lives in a skill's `scripts/*.sh`, not just its prose.
|
|
41
|
+
const SCAN_EXT = [".md", ".json", ".sh", ".bash", ".zsh", ".py", ".ps1", ".mjs", ".cjs", ".js"];
|
|
42
|
+
|
|
43
|
+
/** @type {{severity:'HIGH'|'MEDIUM'|'LOW',rule:string,file:string,line:number,match:string,why:string}[]} */
|
|
44
|
+
const findings = [];
|
|
45
|
+
|
|
46
|
+
const RULES = [
|
|
47
|
+
{
|
|
48
|
+
rule: "S001 remote-code-execution",
|
|
49
|
+
severity: "HIGH",
|
|
50
|
+
re: /\b(curl|wget)\b[^\n|]*\|\s*(sudo\s+)?(ba)?sh\b/i,
|
|
51
|
+
why: "Pipes a downloaded script straight into a shell (untrusted remote code execution).",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
rule: "S002 unpinned-remote-install",
|
|
55
|
+
severity: "MEDIUM",
|
|
56
|
+
re: /\bnpx\s+(?:-y\s+|--yes\s+)?(?!tsc\b|vitest\b|eslint\b)[a-z@][\w@/.-]*\s+add\b|\bnpm\s+i(nstall)?\s+(-g\s+)?https?:\/\//i,
|
|
57
|
+
why: "Installs/executes packages from an external source at runtime (supply-chain + untrusted install surface).",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
rule: "S003 global-install",
|
|
61
|
+
severity: "LOW",
|
|
62
|
+
re: /\bnpm\s+i(nstall)?\s+-g\b|\bnpx\b[^\n]*\s-g\b/i,
|
|
63
|
+
why: "Global install persists tooling at user/system level.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
rule: "S004 prompt-injection-surface",
|
|
67
|
+
severity: "MEDIUM",
|
|
68
|
+
// Natural-language instruction, not a shell command — scan prose, not just code.
|
|
69
|
+
context: "prose",
|
|
70
|
+
re: /\b(fetch|read|download|ingest|browse)\b[^\n]*\b(untrusted|third-?party|user-generated|external (registry|source|content|repos?))\b/i,
|
|
71
|
+
why: "Fetches and may act on third-party/untrusted content — indirect prompt-injection risk (cf. Snyk W011).",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
rule: "S005 credential-exfiltration",
|
|
75
|
+
severity: "HIGH",
|
|
76
|
+
// The token keyword may be a suffix/component of the var name
|
|
77
|
+
// (`$GITHUB_TOKEN`, `$NPM_TOKEN`, `$AWS_SECRET_ACCESS_KEY`), not just a prefix.
|
|
78
|
+
re: /\b(env|printenv|cat)\b[^\n]*\b(\.env|secret|token|api[_-]?key|password|credential)\b[^\n]*\|\s*(curl|wget|nc)\b|\b(curl|wget)\b[^\n]*\$\{?\s*[A-Z0-9_]*(SECRET|TOKEN|API[_-]?KEY|PASSWORD)/i,
|
|
79
|
+
why: "Reads secrets/credentials and sends them off the machine.",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
rule: "S006 obfuscation",
|
|
83
|
+
severity: "MEDIUM",
|
|
84
|
+
re: /\bbase64\b\s+(-d|--decode)\b[^\n]*\|\s*(ba)?sh|\beval\b\s*\(|\bFunction\s*\(\s*['"`]/i,
|
|
85
|
+
why: "Decodes/evaluates hidden code at runtime (obfuscation).",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
rule: "S007 destructive-shell",
|
|
89
|
+
severity: "HIGH",
|
|
90
|
+
// `chmod 777` and `chmod -R 777` (and `0777`) are all world-writable.
|
|
91
|
+
re: /\brm\s+-rf\s+[/~]|\bdd\s+if=|\bmkfs\b|\bchmod\s+(-R\s+)?0?777\b|>\s*\/dev\/sd/i,
|
|
92
|
+
why: "Destructive or overly-permissive filesystem operation.",
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
function walk(dir) {
|
|
97
|
+
let out = [];
|
|
98
|
+
let entries;
|
|
99
|
+
try {
|
|
100
|
+
entries = readdirSync(dir);
|
|
101
|
+
} catch {
|
|
102
|
+
return out; // dir may not exist in every repo
|
|
103
|
+
}
|
|
104
|
+
for (const name of entries) {
|
|
105
|
+
const p = join(dir, name);
|
|
106
|
+
let s;
|
|
107
|
+
try {
|
|
108
|
+
s = statSync(p);
|
|
109
|
+
} catch {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (s.isDirectory()) out = out.concat(walk(p));
|
|
113
|
+
else if (SCAN_EXT.some((e) => name.endsWith(e))) out.push(p);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Logical "code" lines for command-style rules:
|
|
119
|
+
// - Markdown (.md): only lines inside fenced code blocks (``` or ~~~), so
|
|
120
|
+
// documentation that merely *mentions* a dangerous command in prose can't
|
|
121
|
+
// trip a HIGH rule and block every PR.
|
|
122
|
+
// - Scripts/JSON: the whole file is code.
|
|
123
|
+
// Backslash line-continuations are merged into one logical line so a command
|
|
124
|
+
// wrapped across multiple lines can't slip past single-line regexes.
|
|
125
|
+
function codeLines(text, file) {
|
|
126
|
+
const isMarkdown = file.endsWith(".md");
|
|
127
|
+
const raw = text.split(/\r?\n/);
|
|
128
|
+
const out = [];
|
|
129
|
+
let inFence = false;
|
|
130
|
+
let fenceChar = "";
|
|
131
|
+
for (let i = 0; i < raw.length; i++) {
|
|
132
|
+
let line = raw[i];
|
|
133
|
+
if (isMarkdown) {
|
|
134
|
+
const fence = line.match(/^\s*(`{3,}|~{3,})/);
|
|
135
|
+
if (fence) {
|
|
136
|
+
const ch = fence[1][0];
|
|
137
|
+
if (!inFence) {
|
|
138
|
+
inFence = true;
|
|
139
|
+
fenceChar = ch;
|
|
140
|
+
} else if (ch === fenceChar) {
|
|
141
|
+
inFence = false;
|
|
142
|
+
}
|
|
143
|
+
continue; // never scan the fence marker line itself
|
|
144
|
+
}
|
|
145
|
+
if (!inFence) continue; // skip prose
|
|
146
|
+
}
|
|
147
|
+
const startLine = i + 1;
|
|
148
|
+
while (/\\[ \t]*$/.test(line) && i + 1 < raw.length) {
|
|
149
|
+
i += 1;
|
|
150
|
+
line = line.replace(/\\[ \t]*$/, " ") + raw[i];
|
|
151
|
+
}
|
|
152
|
+
out.push({ line: startLine, text: line });
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function scanFile(file) {
|
|
158
|
+
const rel = relative(ROOT, file).split(sep).join("/");
|
|
159
|
+
const text = readFileSync(file, "utf8");
|
|
160
|
+
|
|
161
|
+
// Frontmatter hygiene for SKILL.md
|
|
162
|
+
if (file.endsWith("SKILL.md")) {
|
|
163
|
+
const fmEnd = text.indexOf("\n---", 3);
|
|
164
|
+
const fm = text.startsWith("---") && fmEnd !== -1 ? text.slice(3, fmEnd) : "";
|
|
165
|
+
if (!/\bname\s*:/.test(fm))
|
|
166
|
+
findings.push({ severity: "MEDIUM", rule: "S100 missing-name", file: rel, line: 1, match: "frontmatter", why: "SKILL.md is missing a `name` in frontmatter." });
|
|
167
|
+
if (!/\bdescription\s*:/.test(fm))
|
|
168
|
+
findings.push({ severity: "MEDIUM", rule: "S101 missing-description", file: rel, line: 1, match: "frontmatter", why: "SKILL.md is missing a `description` in frontmatter." });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const push = (r, line, m) =>
|
|
172
|
+
findings.push({ severity: r.severity, rule: r.rule, file: rel, line, match: m[0].slice(0, 120), why: r.why });
|
|
173
|
+
|
|
174
|
+
// Command-style rules over code context (fenced blocks / whole scripts).
|
|
175
|
+
const cmdRules = RULES.filter((r) => r.context !== "prose");
|
|
176
|
+
for (const { line, text: lt } of codeLines(text, file)) {
|
|
177
|
+
for (const r of cmdRules) {
|
|
178
|
+
const m = r.re.exec(lt);
|
|
179
|
+
if (m) push(r, line, m);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Prose rules (e.g. prompt-injection) scan the full natural-language text.
|
|
184
|
+
const proseRules = RULES.filter((r) => r.context === "prose");
|
|
185
|
+
if (proseRules.length) {
|
|
186
|
+
text.split(/\r?\n/).forEach((line, i) => {
|
|
187
|
+
for (const r of proseRules) {
|
|
188
|
+
const m = r.re.exec(line);
|
|
189
|
+
if (m) push(r, i + 1, m);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Run
|
|
196
|
+
const files = SCAN_DIRS.flatMap((d) => walk(join(ROOT, d)));
|
|
197
|
+
files.forEach(scanFile);
|
|
198
|
+
|
|
199
|
+
const counts = { HIGH: 0, MEDIUM: 0, LOW: 0 };
|
|
200
|
+
findings.forEach((f) => (counts[f.severity] += 1));
|
|
201
|
+
|
|
202
|
+
if (JSON_OUT) {
|
|
203
|
+
console.log(JSON.stringify({ scanned: files.length, counts, findings }, null, 2));
|
|
204
|
+
} else {
|
|
205
|
+
const C = { HIGH: "\x1b[31m", MEDIUM: "\x1b[33m", LOW: "\x1b[36m", reset: "\x1b[0m" };
|
|
206
|
+
console.log(`\nskills-safety-scan — scanned ${files.length} file(s) in ${SCAN_DIRS.join(", ")}\n`);
|
|
207
|
+
if (findings.length === 0) {
|
|
208
|
+
console.log(" ✓ No issues found.\n");
|
|
209
|
+
} else {
|
|
210
|
+
for (const f of findings.sort((a, b) => ("HML".indexOf(a.severity[0]) - "HML".indexOf(b.severity[0])))) {
|
|
211
|
+
console.log(` ${C[f.severity]}${f.severity}${C.reset} ${f.rule}`);
|
|
212
|
+
console.log(` ${f.file}:${f.line}`);
|
|
213
|
+
console.log(` match: ${f.match}`);
|
|
214
|
+
console.log(` why: ${f.why}\n`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
console.log(`Summary: ${counts.HIGH} high, ${counts.MEDIUM} medium, ${counts.LOW} low\n`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Scanning zero files almost always means the target moved (renamed skill dir,
|
|
221
|
+
// wrong --root) rather than a clean repo — fail loudly instead of passing green.
|
|
222
|
+
const emptyScan = files.length === 0 && !ALLOW_EMPTY;
|
|
223
|
+
if (emptyScan) {
|
|
224
|
+
console.error(
|
|
225
|
+
`skills-safety-scan: ERROR — scanned 0 files under ${SCAN_DIRS.join(", ")}. ` +
|
|
226
|
+
`The scan target may have moved. Pass --allow-empty if this is intentional.`,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const fail = counts.HIGH > 0 || (STRICT && counts.MEDIUM > 0) || emptyScan;
|
|
231
|
+
process.exit(fail ? 1 : 0);
|