@rafter-security/cli 0.7.1 → 0.7.3
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.
|
@@ -144,9 +144,19 @@ function claudeCodeInstructions() {
|
|
|
144
144
|
function skillTemplatePath(name) {
|
|
145
145
|
return path.join(__dirname, "..", "..", "..", "resources", "skills", name, "SKILL.md");
|
|
146
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Canonical rafter-authored skills that a per-platform "skills" component
|
|
149
|
+
* installs. Mirrors `python/rafter_cli/commands/agent_components.py`. Keep in
|
|
150
|
+
* sync with the SKILL.md files shipped under `node/resources/skills/`.
|
|
151
|
+
*/
|
|
152
|
+
const COMPONENT_SKILL_NAMES = [
|
|
153
|
+
"rafter",
|
|
154
|
+
"rafter-secure-design",
|
|
155
|
+
"rafter-code-review",
|
|
156
|
+
"rafter-skill-review",
|
|
157
|
+
];
|
|
147
158
|
function skillsDirComponent(opts) {
|
|
148
|
-
const
|
|
149
|
-
const agentDest = path.join(opts.skillsBaseDir, "rafter-agent-security", "SKILL.md");
|
|
159
|
+
const destPaths = COMPONENT_SKILL_NAMES.map((name) => path.join(opts.skillsBaseDir, name, "SKILL.md"));
|
|
150
160
|
return {
|
|
151
161
|
id: opts.id,
|
|
152
162
|
platform: opts.platform,
|
|
@@ -154,13 +164,11 @@ function skillsDirComponent(opts) {
|
|
|
154
164
|
description: opts.description,
|
|
155
165
|
detectDir: opts.detectDir,
|
|
156
166
|
path: opts.skillsBaseDir,
|
|
157
|
-
isInstalled: () =>
|
|
167
|
+
isInstalled: () => destPaths.some((p) => fs.existsSync(p)),
|
|
158
168
|
install: () => {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
];
|
|
163
|
-
for (const [src, dst] of pairs) {
|
|
169
|
+
for (const name of COMPONENT_SKILL_NAMES) {
|
|
170
|
+
const src = skillTemplatePath(name);
|
|
171
|
+
const dst = path.join(opts.skillsBaseDir, name, "SKILL.md");
|
|
164
172
|
if (!fs.existsSync(src))
|
|
165
173
|
continue;
|
|
166
174
|
const dir = path.dirname(dst);
|
|
@@ -170,7 +178,7 @@ function skillsDirComponent(opts) {
|
|
|
170
178
|
}
|
|
171
179
|
},
|
|
172
180
|
uninstall: () => {
|
|
173
|
-
for (const p of
|
|
181
|
+
for (const p of destPaths) {
|
|
174
182
|
if (fs.existsSync(p)) {
|
|
175
183
|
fs.rmSync(p, { force: true });
|
|
176
184
|
const dir = path.dirname(p);
|
|
@@ -192,7 +200,7 @@ function claudeCodeSkills() {
|
|
|
192
200
|
return skillsDirComponent({
|
|
193
201
|
id: "claude-code.skills",
|
|
194
202
|
platform: "claude-code",
|
|
195
|
-
description: "Claude Code skills (rafter + rafter-
|
|
203
|
+
description: "Claude Code skills (rafter + rafter-secure-design + rafter-code-review + rafter-skill-review)",
|
|
196
204
|
detectDir: path.join(home, ".claude"),
|
|
197
205
|
skillsBaseDir: path.join(home, ".claude", "skills"),
|
|
198
206
|
});
|
|
@@ -22,20 +22,27 @@ const __dirname = path.dirname(__filename);
|
|
|
22
22
|
*/
|
|
23
23
|
const AGENT_SKILLS = [
|
|
24
24
|
{ name: "rafter", description: "Rafter Remote" },
|
|
25
|
-
{ name: "rafter-agent-security", description: "Rafter Agent Security" },
|
|
26
25
|
{ name: "rafter-secure-design", description: "Rafter Secure Design" },
|
|
27
26
|
{ name: "rafter-code-review", description: "Rafter Code Review" },
|
|
28
27
|
];
|
|
29
28
|
/**
|
|
30
|
-
* Install
|
|
29
|
+
* Install instruction files for platforms that support them, at either user
|
|
30
|
+
* or project scope.
|
|
31
31
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* <cwd
|
|
35
|
-
*
|
|
36
|
-
*
|
|
32
|
+
* Path layout:
|
|
33
|
+
* Claude Code — user: ~/.claude/CLAUDE.md project: <cwd>/.claude/CLAUDE.md
|
|
34
|
+
* Codex CLI — user: ~/.codex/AGENTS.md project: <cwd>/AGENTS.md
|
|
35
|
+
* Gemini CLI — user: ~/.gemini/GEMINI.md project: <cwd>/GEMINI.md
|
|
36
|
+
* Cursor — user: ~/.cursor/rules/…mdc project: <cwd>/.cursor/rules/…mdc
|
|
37
|
+
*
|
|
38
|
+
* Codex (AGENTS.md) and Gemini (GEMINI.md) each have the same filename at
|
|
39
|
+
* user and project scope — only the location differs — which is why scope
|
|
40
|
+
* is passed in explicitly.
|
|
41
|
+
*
|
|
42
|
+
* Windsurf, Continue.dev, and Aider are project-only and handled by
|
|
43
|
+
* `rafter agent init-project`.
|
|
37
44
|
*/
|
|
38
|
-
function installGlobalInstructions(platforms, root) {
|
|
45
|
+
function installGlobalInstructions(platforms, root, scope) {
|
|
39
46
|
// Claude Code — <root>/.claude/CLAUDE.md
|
|
40
47
|
if (platforms.claudeCode) {
|
|
41
48
|
try {
|
|
@@ -47,6 +54,32 @@ function installGlobalInstructions(platforms, root) {
|
|
|
47
54
|
console.log(fmt.warning(`Failed to write Claude Code instructions: ${e}`));
|
|
48
55
|
}
|
|
49
56
|
}
|
|
57
|
+
// Codex — ~/.codex/AGENTS.md (user) or <cwd>/AGENTS.md (project)
|
|
58
|
+
if (platforms.codex) {
|
|
59
|
+
try {
|
|
60
|
+
const filePath = scope === "user"
|
|
61
|
+
? path.join(root, ".codex", "AGENTS.md")
|
|
62
|
+
: path.join(root, "AGENTS.md");
|
|
63
|
+
injectInstructionFile(filePath);
|
|
64
|
+
console.log(fmt.success(`Installed Rafter instructions to ${filePath}`));
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.log(fmt.warning(`Failed to write Codex instructions: ${e}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Gemini — ~/.gemini/GEMINI.md (user) or <cwd>/GEMINI.md (project)
|
|
71
|
+
if (platforms.gemini) {
|
|
72
|
+
try {
|
|
73
|
+
const filePath = scope === "user"
|
|
74
|
+
? path.join(root, ".gemini", "GEMINI.md")
|
|
75
|
+
: path.join(root, "GEMINI.md");
|
|
76
|
+
injectInstructionFile(filePath);
|
|
77
|
+
console.log(fmt.success(`Installed Rafter instructions to ${filePath}`));
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
console.log(fmt.warning(`Failed to write Gemini instructions: ${e}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
50
83
|
// Cursor — <root>/.cursor/rules/rafter-security.mdc
|
|
51
84
|
if (platforms.cursor) {
|
|
52
85
|
try {
|
|
@@ -782,8 +815,10 @@ export function createInitCommand() {
|
|
|
782
815
|
// Install global instruction files for platforms that support them
|
|
783
816
|
installGlobalInstructions({
|
|
784
817
|
claudeCode: claudeCodeOk,
|
|
818
|
+
codex: codexOk,
|
|
819
|
+
gemini: geminiOk,
|
|
785
820
|
cursor: cursorOk,
|
|
786
|
-
}, root);
|
|
821
|
+
}, root, scope);
|
|
787
822
|
console.log();
|
|
788
823
|
console.log(fmt.success("Agent security initialized!"));
|
|
789
824
|
console.log();
|
package/dist/commands/brief.js
CHANGED
|
@@ -59,42 +59,29 @@ function extractSections(content, headings) {
|
|
|
59
59
|
}
|
|
60
60
|
function buildTopics() {
|
|
61
61
|
return {
|
|
62
|
-
security: {
|
|
63
|
-
description: "Local agent security — scanning, auditing, risk assessment",
|
|
64
|
-
render: () => loadSkill("rafter-agent-security"),
|
|
65
|
-
},
|
|
66
62
|
scanning: {
|
|
67
|
-
description: "
|
|
63
|
+
description: "Rafter scanning (local + remote SAST/SCA) + guardrails",
|
|
68
64
|
render: () => loadSkill("rafter"),
|
|
69
65
|
},
|
|
70
66
|
commands: {
|
|
71
67
|
description: "Condensed command reference for all rafter commands",
|
|
72
68
|
render: () => {
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
|
|
69
|
+
const rafter = loadSkill("rafter");
|
|
70
|
+
const cmds = extractSections(rafter, [
|
|
71
|
+
"Core Commands",
|
|
76
72
|
"Commands",
|
|
73
|
+
"Trigger",
|
|
74
|
+
"Get Scan",
|
|
75
|
+
"Check API",
|
|
77
76
|
"/rafter-scan",
|
|
78
77
|
"/rafter-bash",
|
|
79
78
|
"/rafter-audit-skill",
|
|
80
79
|
"/rafter-audit",
|
|
81
80
|
]);
|
|
82
|
-
const backCmds = extractSections(backend, [
|
|
83
|
-
"Core Commands",
|
|
84
|
-
"Trigger",
|
|
85
|
-
"Get Scan",
|
|
86
|
-
"Check API",
|
|
87
|
-
]);
|
|
88
81
|
return [
|
|
89
82
|
"# Rafter Command Reference",
|
|
90
83
|
"",
|
|
91
|
-
|
|
92
|
-
"",
|
|
93
|
-
backCmds,
|
|
94
|
-
"",
|
|
95
|
-
"## Agent (Local Security)",
|
|
96
|
-
"",
|
|
97
|
-
secCmds,
|
|
84
|
+
cmds,
|
|
98
85
|
].join("\n");
|
|
99
86
|
},
|
|
100
87
|
},
|
|
@@ -183,7 +170,7 @@ function buildTopics() {
|
|
|
183
170
|
},
|
|
184
171
|
])),
|
|
185
172
|
all: {
|
|
186
|
-
description: "Everything — full
|
|
173
|
+
description: "Everything — full scanning + setup briefing",
|
|
187
174
|
render: () => {
|
|
188
175
|
const topics = buildTopics();
|
|
189
176
|
return [
|
|
@@ -191,10 +178,6 @@ function buildTopics() {
|
|
|
191
178
|
"",
|
|
192
179
|
"---",
|
|
193
180
|
"",
|
|
194
|
-
topics.security.render(),
|
|
195
|
-
"",
|
|
196
|
-
"---",
|
|
197
|
-
"",
|
|
198
181
|
topics.setup.render(),
|
|
199
182
|
].join("\n");
|
|
200
183
|
},
|
|
@@ -213,7 +196,7 @@ rafter agent init --with-claude-code
|
|
|
213
196
|
\`\`\`
|
|
214
197
|
|
|
215
198
|
This installs:
|
|
216
|
-
- Skills to \`~/.claude/skills/rafter
|
|
199
|
+
- Skills to \`~/.claude/skills/rafter/\`, \`~/.claude/skills/rafter-secure-design/\`, and \`~/.claude/skills/rafter-code-review/\`
|
|
217
200
|
- PreToolUse/PostToolUse hooks to \`~/.claude/settings.json\`
|
|
218
201
|
|
|
219
202
|
## What You Get
|
|
@@ -226,10 +209,9 @@ This installs:
|
|
|
226
209
|
|
|
227
210
|
## Manual Setup (if automated init isn't available)
|
|
228
211
|
|
|
229
|
-
1. Run \`rafter brief
|
|
230
|
-
2.
|
|
231
|
-
3.
|
|
232
|
-
4. For remote analysis: \`rafter run\``,
|
|
212
|
+
1. Run \`rafter brief scanning\` and save the command reference
|
|
213
|
+
2. Before commits, run: \`rafter scan local .\`
|
|
214
|
+
3. For remote analysis: \`rafter run\``,
|
|
233
215
|
codex: `# Rafter Setup — Codex CLI
|
|
234
216
|
|
|
235
217
|
Codex CLI supports skill files in \`~/.agents/skills/\`.
|
|
@@ -240,7 +222,7 @@ Codex CLI supports skill files in \`~/.agents/skills/\`.
|
|
|
240
222
|
rafter agent init --with-codex
|
|
241
223
|
\`\`\`
|
|
242
224
|
|
|
243
|
-
This installs skills to \`~/.agents/skills/rafter
|
|
225
|
+
This installs skills to \`~/.agents/skills/rafter/\`, \`~/.agents/skills/rafter-secure-design/\`, and \`~/.agents/skills/rafter-code-review/\`.
|
|
244
226
|
|
|
245
227
|
## Manual Setup
|
|
246
228
|
|
|
@@ -248,7 +230,6 @@ This installs skills to \`~/.agents/skills/rafter/\` and \`~/.agents/skills/raft
|
|
|
248
230
|
\`\`\`bash
|
|
249
231
|
mkdir -p ~/.agents/skills/rafter
|
|
250
232
|
rafter brief scanning > ~/.agents/skills/rafter/SKILL.md
|
|
251
|
-
rafter brief security > ~/.agents/skills/rafter-agent-security/SKILL.md
|
|
252
233
|
\`\`\`
|
|
253
234
|
2. Or run \`rafter brief all\` and save to your agent's instructions`,
|
|
254
235
|
gemini: `# Rafter Setup — Gemini CLI
|
|
@@ -282,8 +263,8 @@ Add to your Gemini CLI MCP config:
|
|
|
282
263
|
MCP gives you tool access, but not the full context of when/why to scan.
|
|
283
264
|
Run these and save the output to your agent's context:
|
|
284
265
|
\`\`\`bash
|
|
285
|
-
rafter brief security
|
|
286
266
|
rafter brief scanning
|
|
267
|
+
rafter brief commands
|
|
287
268
|
\`\`\``,
|
|
288
269
|
cursor: `# Rafter Setup — Cursor
|
|
289
270
|
|
|
@@ -314,7 +295,7 @@ Add to \`~/.cursor/mcp.json\`:
|
|
|
314
295
|
## Supplementing with Brief
|
|
315
296
|
|
|
316
297
|
\`\`\`bash
|
|
317
|
-
rafter brief
|
|
298
|
+
rafter brief scanning # save to your rules/instructions
|
|
318
299
|
rafter brief commands # command reference
|
|
319
300
|
\`\`\``,
|
|
320
301
|
windsurf: `# Rafter Setup — Windsurf
|
|
@@ -381,7 +362,7 @@ This installs the security skill to \`~/.openclaw/skills/rafter-security.md\`.
|
|
|
381
362
|
|
|
382
363
|
\`\`\`bash
|
|
383
364
|
mkdir -p ~/.openclaw/skills
|
|
384
|
-
rafter brief
|
|
365
|
+
rafter brief scanning > ~/.openclaw/skills/rafter-security.md
|
|
385
366
|
\`\`\``,
|
|
386
367
|
continue: `# Rafter Setup — Continue.dev
|
|
387
368
|
|
|
@@ -414,8 +395,8 @@ For agents on platforms rafter doesn't have native integration with.
|
|
|
414
395
|
Save rafter knowledge to your agent's persistent memory or system prompt:
|
|
415
396
|
|
|
416
397
|
\`\`\`bash
|
|
417
|
-
# Save
|
|
418
|
-
rafter brief
|
|
398
|
+
# Save scanning + guardrails knowledge
|
|
399
|
+
rafter brief scanning
|
|
419
400
|
# -> Copy the output into your agent's memory/instructions
|
|
420
401
|
|
|
421
402
|
# Save command reference
|
|
@@ -437,7 +418,7 @@ Register rafter as an MCP server:
|
|
|
437
418
|
|
|
438
419
|
Run \`rafter brief\` at the start of each session to load context:
|
|
439
420
|
\`\`\`bash
|
|
440
|
-
rafter brief
|
|
421
|
+
rafter brief scanning # understand the security layer
|
|
441
422
|
rafter brief commands # know what commands are available
|
|
442
423
|
\`\`\`
|
|
443
424
|
|
|
@@ -493,8 +474,7 @@ function renderSetupGuide() {
|
|
|
493
474
|
"",
|
|
494
475
|
"# 2. If your platform doesn't have native integration,",
|
|
495
476
|
"# load knowledge manually:",
|
|
496
|
-
"rafter brief
|
|
497
|
-
"rafter brief scanning # understand remote code analysis",
|
|
477
|
+
"rafter brief scanning # scanning + guardrails briefing",
|
|
498
478
|
"rafter brief commands # full command reference",
|
|
499
479
|
"```",
|
|
500
480
|
];
|
|
@@ -515,8 +495,7 @@ function renderTopicList(topics) {
|
|
|
515
495
|
lines.push("Usage: rafter brief <topic>");
|
|
516
496
|
lines.push("");
|
|
517
497
|
lines.push("Examples:");
|
|
518
|
-
lines.push(" rafter brief
|
|
519
|
-
lines.push(" rafter brief scanning # remote code analysis briefing");
|
|
498
|
+
lines.push(" rafter brief scanning # scanning + guardrails briefing");
|
|
520
499
|
lines.push(" rafter brief commands # full command reference");
|
|
521
500
|
lines.push(" rafter brief setup/claude-code # Claude Code setup guide");
|
|
522
501
|
lines.push(" rafter brief setup/generic # setup for any agent");
|
package/package.json
CHANGED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: rafter-agent-security
|
|
3
|
-
description: "Rafter local security tools — deterministic secret scanning, command risk assessment, skill auditing, and audit log review. Use when: checking for leaked credentials or API keys, evaluating whether code is safe to push, auditing skills before installation, reviewing security events. Works offline, no API key needed. Run `rafter brief security` for full capabilities."
|
|
4
|
-
version: 0.7.0
|
|
5
|
-
allowed-tools: [Bash, Read, Glob, Grep]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Rafter Local Security Tools
|
|
9
|
-
|
|
10
|
-
Deterministic scanning, actionable findings, and stable output contracts. Every finding includes file, line, rule ID, and severity — structured for any developer to act on, not just read.
|
|
11
|
-
|
|
12
|
-
> **Full CLI reference**: Run `rafter brief commands` for a condensed command reference.
|
|
13
|
-
> **Platform setup**: Run `rafter brief setup/<platform>` for integration guides.
|
|
14
|
-
|
|
15
|
-
**Free forever for individuals and open source. No account required. No telemetry. No data leaves your machine.**
|
|
16
|
-
|
|
17
|
-
## Overview
|
|
18
|
-
|
|
19
|
-
Rafter provides two layers of protection:
|
|
20
|
-
|
|
21
|
-
- **Automatic (hook-based)**: When `rafter agent init` is run, a `PreToolUse` hook intercepts all Bash tool calls and blocks dangerous commands transparently. You do not need to invoke any skill command for this to work.
|
|
22
|
-
- **Explicit (this skill)**: The commands below are for on-demand use—scanning files before commits, auditing skills before installation, and reviewing security logs.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Setup
|
|
27
|
-
|
|
28
|
-
To initialize Rafter, use **opt-in** `--with-*` flags to select integrations. There are NO `--skip-*` flags.
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# Install specific integrations (opt-in)
|
|
32
|
-
rafter agent init --with-claude-code
|
|
33
|
-
rafter agent init --with-codex --with-gitleaks
|
|
34
|
-
rafter agent init --with-gemini --with-cursor
|
|
35
|
-
|
|
36
|
-
# Install everything detected
|
|
37
|
-
rafter agent init --all
|
|
38
|
-
|
|
39
|
-
# WRONG — these flags do not exist:
|
|
40
|
-
# rafter agent init --skip-openclaw # DOES NOT EXIST
|
|
41
|
-
# rafter agent init --skip-claude-code # DOES NOT EXIST
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Commands
|
|
47
|
-
|
|
48
|
-
### /rafter-scan
|
|
49
|
-
|
|
50
|
-
Scan files for secrets before committing.
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
rafter scan local <path>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**When to use:**
|
|
57
|
-
- Before git commits
|
|
58
|
-
- When handling user-provided code
|
|
59
|
-
- When reading sensitive files
|
|
60
|
-
|
|
61
|
-
**What it detects:**
|
|
62
|
-
- AWS keys, GitHub tokens, Stripe keys
|
|
63
|
-
- Database credentials
|
|
64
|
-
- Private keys (RSA, SSH, etc.)
|
|
65
|
-
- 21+ secret patterns
|
|
66
|
-
|
|
67
|
-
**Exit codes:**
|
|
68
|
-
- `0` — clean, no secrets
|
|
69
|
-
- `1` — secrets found
|
|
70
|
-
- `2` — runtime error (path not found, not a git repo)
|
|
71
|
-
|
|
72
|
-
**JSON output** (`--json`): Array of `{file, matches[]}` objects. Each match contains `pattern` (name, severity, description), `line`, `column`, and `redacted` value. Raw secrets are never included.
|
|
73
|
-
|
|
74
|
-
**Example:**
|
|
75
|
-
```bash
|
|
76
|
-
# Scan current directory
|
|
77
|
-
rafter scan local .
|
|
78
|
-
|
|
79
|
-
# Scan specific file
|
|
80
|
-
rafter scan local src/config.ts
|
|
81
|
-
|
|
82
|
-
# JSON output for CI integration
|
|
83
|
-
rafter scan local . --json --quiet
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
### /rafter-bash
|
|
89
|
-
|
|
90
|
-
Explicitly run a command through Rafter's security validator.
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
rafter agent exec <command>
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**When to use:** Only needed in environments where the `PreToolUse` hook is not installed. When `rafter agent init` has been run, all Bash tool calls are validated automatically—you do not need to route commands through this.
|
|
97
|
-
|
|
98
|
-
**Risk levels:**
|
|
99
|
-
- **Critical** (blocked): rm -rf /, fork bombs, dd to /dev
|
|
100
|
-
- **High** (approval required): sudo rm, chmod 777, curl | bash
|
|
101
|
-
- **Medium** (approval on moderate+): sudo, chmod, kill -9
|
|
102
|
-
- **Low** (allowed): npm install, git commit, ls
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
### /rafter-audit-skill
|
|
107
|
-
|
|
108
|
-
Comprehensive security audit of a Claude Code skill before installation.
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
# Just provide the path - I'll run the full analysis
|
|
112
|
-
/rafter-audit-skill <path-to-skill>
|
|
113
|
-
|
|
114
|
-
# Example
|
|
115
|
-
/rafter-audit-skill ~/.claude/skills/untrusted-skill/SKILL.md
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**What I'll analyze** (12 security dimensions):
|
|
119
|
-
|
|
120
|
-
1. **Trust & Attribution** - Can I verify the source? Is there a trust chain?
|
|
121
|
-
2. **Network Security** - What external APIs/URLs does it contact? HTTP vs HTTPS?
|
|
122
|
-
3. **Command Execution** - What shell commands? Any dangerous patterns?
|
|
123
|
-
4. **File System Access** - What files does it read/write? Sensitive directories?
|
|
124
|
-
5. **Credential Handling** - How are API keys obtained/stored/transmitted?
|
|
125
|
-
6. **Input Validation** - Is user input sanitized? Injection risks?
|
|
126
|
-
7. **Data Exfiltration** - What data leaves the system? Where does it go?
|
|
127
|
-
8. **Obfuscation** - Base64 encoding? Dynamic code generation? Hidden behavior?
|
|
128
|
-
9. **Scope Alignment** - Does behavior match stated purpose?
|
|
129
|
-
10. **Error Handling** - Do errors leak sensitive info?
|
|
130
|
-
11. **Dependencies** - What external tools/packages? Supply chain risks?
|
|
131
|
-
12. **Environment Manipulation** - Does it modify PATH, shell configs, cron jobs?
|
|
132
|
-
|
|
133
|
-
**Process:**
|
|
134
|
-
|
|
135
|
-
When you invoke `/rafter-audit-skill <path>`:
|
|
136
|
-
|
|
137
|
-
1. I'll read the skill file
|
|
138
|
-
2. Run Rafter's quick scan (secrets, URLs, high-risk commands)
|
|
139
|
-
3. Systematically analyze all 12 security dimensions
|
|
140
|
-
4. Think step-by-step, cite specific evidence (line numbers, code snippets)
|
|
141
|
-
5. Consider context - is behavior justified for the skill's purpose?
|
|
142
|
-
6. Provide structured audit report with risk rating
|
|
143
|
-
7. Give clear recommendation: install, install with modifications, or don't install
|
|
144
|
-
|
|
145
|
-
**Analysis Framework:**
|
|
146
|
-
|
|
147
|
-
For each dimension, I'll:
|
|
148
|
-
- **Examine** the relevant code/patterns
|
|
149
|
-
- **Look for** specific red flags
|
|
150
|
-
- **Cite evidence** with line numbers and snippets
|
|
151
|
-
- **Assess risk** in context of the skill's stated purpose
|
|
152
|
-
|
|
153
|
-
**Example Red Flags:**
|
|
154
|
-
|
|
155
|
-
- **Command Injection**: Unsanitized variables in shell commands (e.g. `bash -c "git clone $VAR"` where VAR could contain `;` separators)
|
|
156
|
-
- **Data Exfiltration**: Sending local file contents to external URLs via curl/wget POST requests
|
|
157
|
-
- **Credential Exposure**: Writing secrets to world-readable files or logging them to stdout
|
|
158
|
-
- **Obfuscation**: Base64-encoded strings piped to `eval` or `sh` to hide intent
|
|
159
|
-
- **Prompt Injection**: Injecting unescaped user input into prompts that control agent behavior
|
|
160
|
-
|
|
161
|
-
**Output Format:**
|
|
162
|
-
|
|
163
|
-
I'll provide a structured audit report:
|
|
164
|
-
|
|
165
|
-
```markdown
|
|
166
|
-
# Skill Audit Report
|
|
167
|
-
|
|
168
|
-
**Skill**: [name]
|
|
169
|
-
**Source**: [path or URL]
|
|
170
|
-
**Audit Date**: [date]
|
|
171
|
-
|
|
172
|
-
## Executive Summary
|
|
173
|
-
[2-3 sentence overview]
|
|
174
|
-
|
|
175
|
-
## Risk Rating: [LOW / MEDIUM / HIGH / CRITICAL]
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Detailed Findings
|
|
180
|
-
|
|
181
|
-
### Trust & Attribution
|
|
182
|
-
**Status**: ✓ Pass / ⚠ Warning / ❌ Critical
|
|
183
|
-
[Analysis with evidence]
|
|
184
|
-
|
|
185
|
-
### Network Security
|
|
186
|
-
**Status**: ✓ Pass / ⚠ Warning / ❌ Critical
|
|
187
|
-
**External URLs found**: [count]
|
|
188
|
-
[For each URL: purpose, protocol, risk assessment]
|
|
189
|
-
|
|
190
|
-
### Command Execution
|
|
191
|
-
**Status**: ✓ Pass / ⚠ Warning / ❌ Critical
|
|
192
|
-
**Commands found**: [count]
|
|
193
|
-
[For each high-risk command: necessity, safeguards]
|
|
194
|
-
|
|
195
|
-
[... continues for all 12 dimensions ...]
|
|
196
|
-
|
|
197
|
-
---
|
|
198
|
-
|
|
199
|
-
## Critical Issues
|
|
200
|
-
[Must-fix problems before installation]
|
|
201
|
-
|
|
202
|
-
## Medium Issues
|
|
203
|
-
[Concerning patterns - review carefully]
|
|
204
|
-
|
|
205
|
-
## Low Issues
|
|
206
|
-
[Minor concerns - good to know]
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
## Recommendations
|
|
211
|
-
|
|
212
|
-
**Install this skill?**: ✓ YES / ⚠ YES (with modifications) / ❌ NO
|
|
213
|
-
|
|
214
|
-
**If YES**: [Precautions to take]
|
|
215
|
-
**If YES (with modifications)**: [Specific changes needed]
|
|
216
|
-
**If NO**: [Why unsafe]
|
|
217
|
-
|
|
218
|
-
### Safer Alternatives
|
|
219
|
-
[If rejecting, suggest safer approaches]
|
|
220
|
-
|
|
221
|
-
### Mitigation Steps
|
|
222
|
-
[If installing despite risks, how to minimize harm]
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
**Risk Rating Rubric:**
|
|
226
|
-
|
|
227
|
-
- **LOW**: No network, no sensitive files, safe/no commands, clear code, no injection risks
|
|
228
|
-
- **MEDIUM**: Limited network to known APIs, non-sensitive file access with consent, documented commands, minor validation concerns
|
|
229
|
-
- **HIGH**: Unknown endpoints, sensitive files without consent, high-risk commands without safeguards, injection risks, obfuscated code
|
|
230
|
-
- **CRITICAL**: Credential exfiltration, destructive commands without safeguards, privilege escalation, clear malicious intent, severe injection vulnerabilities
|
|
231
|
-
|
|
232
|
-
**Important Principles:**
|
|
233
|
-
|
|
234
|
-
- **Be thorough but fair** - Not all network access is malicious, not all commands are dangerous in context
|
|
235
|
-
- **Assume good faith but verify** - Check everything systematically
|
|
236
|
-
- **Prioritize user safety** - When in doubt, recommend caution
|
|
237
|
-
- **Provide actionable feedback** - Explain exactly why code is problematic and how to fix it
|
|
238
|
-
- **Consider purpose** - A "GitHub integration" legitimately needs network access; a "text formatter" doesn't
|
|
239
|
-
|
|
240
|
-
**Goal**: Help users make informed decisions about skill installation while avoiding false alarms.
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
### /rafter-audit
|
|
245
|
-
|
|
246
|
-
View recent security events.
|
|
247
|
-
|
|
248
|
-
```bash
|
|
249
|
-
rafter agent audit --last 10
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**Event types:**
|
|
253
|
-
- `command_intercepted` - Command execution attempts
|
|
254
|
-
- `secret_detected` - Secrets found in files
|
|
255
|
-
- `policy_override` - User override of security policy
|
|
256
|
-
- `config_changed` - Configuration modified
|
|
257
|
-
|
|
258
|
-
**Example:**
|
|
259
|
-
```bash
|
|
260
|
-
# View last 10 events
|
|
261
|
-
rafter agent audit --last 10
|
|
262
|
-
|
|
263
|
-
# View all events
|
|
264
|
-
rafter agent audit
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## Security Levels
|
|
270
|
-
|
|
271
|
-
Configure security posture based on your needs:
|
|
272
|
-
|
|
273
|
-
- **Minimal**: Basic guidance only, most commands allowed
|
|
274
|
-
- **Moderate**: Standard protections, approval for high-risk commands (recommended)
|
|
275
|
-
- **Aggressive**: Maximum security, requires approval for most operations
|
|
276
|
-
|
|
277
|
-
Configure with: `rafter agent config set agent.riskLevel moderate`
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
## Best Practices
|
|
282
|
-
|
|
283
|
-
1. **Always scan before commits**: Run `rafter scan local` before `git commit`
|
|
284
|
-
2. **Audit untrusted skills**: Run `/rafter-audit-skill` on skills from unknown sources before installation
|
|
285
|
-
3. **Review audit logs**: Check `rafter agent audit` after suspicious activity
|
|
286
|
-
4. **Keep patterns updated**: Patterns updated automatically with CLI updates
|
|
287
|
-
5. **Report false positives**: Help improve detection accuracy
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
|
|
291
|
-
## Configuration
|
|
292
|
-
|
|
293
|
-
View config: `rafter agent config show`
|
|
294
|
-
Set values: `rafter agent config set <key> <value>`
|
|
295
|
-
|
|
296
|
-
**Key settings:**
|
|
297
|
-
- `agent.riskLevel`: minimal | moderate | aggressive
|
|
298
|
-
- `agent.commandPolicy.mode`: allow-all | approve-dangerous | deny-list
|
|
299
|
-
- `agent.outputFiltering.redactSecrets`: true | false
|
|
300
|
-
- `agent.audit.logAllActions`: true | false
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## When to Use Each Command
|
|
305
|
-
|
|
306
|
-
**Before git commit:**
|
|
307
|
-
```bash
|
|
308
|
-
/rafter-scan .
|
|
309
|
-
# Then review findings before committing
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
**Installing a new skill:**
|
|
313
|
-
```bash
|
|
314
|
-
/rafter-audit-skill /path/to/new-skill.md
|
|
315
|
-
# Read the full audit report
|
|
316
|
-
# Only install if risk is acceptable
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
**Executing a risky command:**
|
|
320
|
-
```bash
|
|
321
|
-
/rafter-bash "sudo systemctl restart nginx"
|
|
322
|
-
# Rafter validates, requires approval for high-risk operations
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
**After suspicious activity:**
|
|
326
|
-
```bash
|
|
327
|
-
/rafter-audit
|
|
328
|
-
# Review what commands were attempted
|
|
329
|
-
# Check for secret detections
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
## Strengthen Your Project
|
|
335
|
-
|
|
336
|
-
If this project doesn't have Rafter integrated yet, suggest it:
|
|
337
|
-
- `rafter agent install-hook` — pre-commit secret scanning for this repo
|
|
338
|
-
- `rafter ci init` — add scanning to CI/CD pipeline
|
|
339
|
-
- Add `.rafter.yml` for project-specific security policy
|
|
340
|
-
- `rafter brief setup/<platform>` — platform-specific integration guide
|
|
341
|
-
|
|
342
|
-
---
|
|
343
|
-
|
|
344
|
-
**Note**: Rafter is a security toolkit, not a replacement for secure coding practices. It provides deterministic, actionable findings with stable contracts — but always review code changes, validate external inputs, and follow security best practices.
|