ccperm 1.9.1 → 1.9.2
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/dist/explain.js +103 -88
- package/dist/interactive.js +6 -6
- package/package.json +1 -1
package/dist/explain.js
CHANGED
|
@@ -1,112 +1,127 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Pattern-based permission explainer
|
|
3
|
+
// Input is the "label" from categorize(), not the raw permission string
|
|
3
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
5
|
+
exports.explainBash = explainBash;
|
|
6
|
+
exports.explainWebFetch = explainWebFetch;
|
|
7
|
+
exports.explainMcp = explainMcp;
|
|
8
|
+
exports.explainTool = explainTool;
|
|
9
|
+
exports.explain = explain;
|
|
5
10
|
const BASH_COMMANDS = {
|
|
6
11
|
// [description, risk: green/yellow/red]
|
|
7
|
-
'git': ['Git version control
|
|
8
|
-
'npm': ['
|
|
9
|
-
'npx': ['Run npm packages
|
|
12
|
+
'git': ['Git version control', 'green'],
|
|
13
|
+
'npm': ['Package manager (can run scripts)', 'yellow'],
|
|
14
|
+
'npx': ['Run npm packages', 'yellow'],
|
|
10
15
|
'node': ['Run Node.js scripts', 'yellow'],
|
|
11
|
-
'bun': ['Bun runtime
|
|
12
|
-
'deno': ['Deno runtime
|
|
16
|
+
'bun': ['Bun runtime', 'yellow'],
|
|
17
|
+
'deno': ['Deno runtime', 'yellow'],
|
|
13
18
|
'python': ['Run Python scripts', 'yellow'],
|
|
14
19
|
'python3': ['Run Python scripts', 'yellow'],
|
|
15
|
-
'pip': ['Python package manager
|
|
16
|
-
'pip3': ['Python package manager
|
|
17
|
-
'docker': ['
|
|
18
|
-
'docker-compose': ['
|
|
19
|
-
'curl': ['HTTP requests
|
|
20
|
-
'wget': ['Download files
|
|
20
|
+
'pip': ['Python package manager', 'yellow'],
|
|
21
|
+
'pip3': ['Python package manager', 'yellow'],
|
|
22
|
+
'docker': ['Container management', 'yellow'],
|
|
23
|
+
'docker-compose': ['Multi-container management', 'yellow'],
|
|
24
|
+
'curl': ['HTTP requests', 'yellow'],
|
|
25
|
+
'wget': ['Download files', 'yellow'],
|
|
21
26
|
'ssh': ['Remote shell access', 'red'],
|
|
22
|
-
'scp': ['Remote file copy
|
|
23
|
-
'rsync': ['File
|
|
24
|
-
'rm': ['Delete files
|
|
25
|
-
'chmod': ['Change
|
|
26
|
-
'chown': ['Change
|
|
27
|
+
'scp': ['Remote file copy', 'red'],
|
|
28
|
+
'rsync': ['File sync (local/remote)', 'yellow'],
|
|
29
|
+
'rm': ['Delete files', 'red'],
|
|
30
|
+
'chmod': ['Change permissions', 'yellow'],
|
|
31
|
+
'chown': ['Change ownership', 'red'],
|
|
27
32
|
'kill': ['Terminate processes', 'yellow'],
|
|
28
|
-
'sudo': ['
|
|
29
|
-
'apt': ['System
|
|
30
|
-
'apt-get': ['System
|
|
31
|
-
'brew': ['Homebrew
|
|
32
|
-
'make': ['Build automation
|
|
33
|
-
'cargo': ['Rust
|
|
34
|
-
'go': ['Go build
|
|
35
|
-
'mvn': ['Maven
|
|
36
|
-
'gradle': ['Gradle build
|
|
37
|
-
'yarn': ['
|
|
38
|
-
'pnpm': ['
|
|
33
|
+
'sudo': ['Superuser access', 'red'],
|
|
34
|
+
'apt': ['System packages (Debian)', 'red'],
|
|
35
|
+
'apt-get': ['System packages (Debian)', 'red'],
|
|
36
|
+
'brew': ['Homebrew packages', 'yellow'],
|
|
37
|
+
'make': ['Build automation', 'yellow'],
|
|
38
|
+
'cargo': ['Rust build tool', 'yellow'],
|
|
39
|
+
'go': ['Go build tool', 'yellow'],
|
|
40
|
+
'mvn': ['Maven build', 'yellow'],
|
|
41
|
+
'gradle': ['Gradle build', 'yellow'],
|
|
42
|
+
'yarn': ['Package manager', 'yellow'],
|
|
43
|
+
'pnpm': ['Package manager', 'yellow'],
|
|
39
44
|
'tsc': ['TypeScript compiler', 'green'],
|
|
40
|
-
'eslint': ['
|
|
41
|
-
'prettier': ['
|
|
42
|
-
'jest': ['
|
|
43
|
-
'vitest': ['
|
|
44
|
-
'cat': ['Read
|
|
45
|
-
'ls': ['List
|
|
46
|
-
'find': ['Search
|
|
47
|
-
'grep': ['Search text
|
|
48
|
-
'sed': ['Stream editor
|
|
49
|
-
'awk': ['Text processing
|
|
50
|
-
'wc': ['Count lines/words
|
|
51
|
-
'head': ['
|
|
52
|
-
'tail': ['
|
|
45
|
+
'eslint': ['Linter', 'green'],
|
|
46
|
+
'prettier': ['Formatter', 'green'],
|
|
47
|
+
'jest': ['Test runner', 'green'],
|
|
48
|
+
'vitest': ['Test runner', 'green'],
|
|
49
|
+
'cat': ['Read files', 'green'],
|
|
50
|
+
'ls': ['List directories', 'green'],
|
|
51
|
+
'find': ['Search files', 'green'],
|
|
52
|
+
'grep': ['Search text', 'green'],
|
|
53
|
+
'sed': ['Stream editor', 'yellow'],
|
|
54
|
+
'awk': ['Text processing', 'green'],
|
|
55
|
+
'wc': ['Count lines/words', 'green'],
|
|
56
|
+
'head': ['First lines of file', 'green'],
|
|
57
|
+
'tail': ['Last lines of file', 'green'],
|
|
53
58
|
'mkdir': ['Create directories', 'green'],
|
|
54
59
|
'cp': ['Copy files', 'green'],
|
|
55
60
|
'mv': ['Move/rename files', 'yellow'],
|
|
56
61
|
'echo': ['Print text', 'green'],
|
|
57
|
-
'env': ['
|
|
58
|
-
'which': ['Locate
|
|
59
|
-
'gh': ['GitHub CLI
|
|
60
|
-
'heroku': ['Heroku
|
|
61
|
-
'vercel': ['Vercel
|
|
62
|
-
'aws': ['AWS CLI
|
|
62
|
+
'env': ['Environment variables', 'green'],
|
|
63
|
+
'which': ['Locate command', 'green'],
|
|
64
|
+
'gh': ['GitHub CLI', 'yellow'],
|
|
65
|
+
'heroku': ['Heroku CLI', 'yellow'],
|
|
66
|
+
'vercel': ['Vercel CLI', 'yellow'],
|
|
67
|
+
'aws': ['AWS CLI', 'red'],
|
|
63
68
|
'gcloud': ['Google Cloud CLI', 'red'],
|
|
64
69
|
'az': ['Azure CLI', 'red'],
|
|
65
|
-
'kubectl': ['Kubernetes
|
|
70
|
+
'kubectl': ['Kubernetes CLI', 'red'],
|
|
66
71
|
'terraform': ['Infrastructure as Code', 'red'],
|
|
72
|
+
'dd': ['Low-level disk copy', 'red'],
|
|
73
|
+
'jq': ['JSON processor', 'green'],
|
|
74
|
+
'bunx': ['Run bun packages', 'yellow'],
|
|
75
|
+
'claude': ['Claude Code CLI', 'green'],
|
|
76
|
+
'defaults': ['macOS defaults', 'yellow'],
|
|
67
77
|
};
|
|
68
78
|
const TOOL_DESCRIPTIONS = {
|
|
69
|
-
'Read': 'Read file contents
|
|
70
|
-
'Write': 'Create
|
|
71
|
-
'Edit': 'Modify existing files
|
|
72
|
-
'Glob': 'Search
|
|
73
|
-
'Grep': 'Search file contents
|
|
74
|
-
'WebSearch': '
|
|
79
|
+
'Read': ['Read file contents', 'green'],
|
|
80
|
+
'Write': ['Create/overwrite files', 'yellow'],
|
|
81
|
+
'Edit': ['Modify existing files', 'yellow'],
|
|
82
|
+
'Glob': ['Search files by pattern', 'green'],
|
|
83
|
+
'Grep': ['Search file contents', 'green'],
|
|
84
|
+
'WebSearch': ['Web search', 'green'],
|
|
75
85
|
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const parts = perm.split('__');
|
|
102
|
-
const server = parts[1] || 'unknown';
|
|
103
|
-
const tool = parts.slice(2).join('__') || 'unknown';
|
|
104
|
-
return { description: `MCP: ${server} → ${tool}`, risk: 'yellow', detail: `Server: ${server}, Tool: ${tool}` };
|
|
105
|
-
}
|
|
106
|
-
// Standard tools
|
|
107
|
-
const toolName = perm.match(/^(Read|Write|Edit|Glob|Grep|WebSearch)/)?.[1];
|
|
86
|
+
// Extract first command word from a bash label like "git branch:*" or "npm run build"
|
|
87
|
+
function extractCmd(label) {
|
|
88
|
+
// Remove :* or * suffix patterns
|
|
89
|
+
const clean = label.replace(/[:]\*.*$/, '').replace(/\s\*.*$/, '');
|
|
90
|
+
// Get first word
|
|
91
|
+
return clean.split(/[\s(]/)[0];
|
|
92
|
+
}
|
|
93
|
+
function explainBash(label) {
|
|
94
|
+
const cmd = extractCmd(label);
|
|
95
|
+
const entry = BASH_COMMANDS[cmd];
|
|
96
|
+
if (entry)
|
|
97
|
+
return { description: entry[0], risk: entry[1] };
|
|
98
|
+
return { description: '', risk: 'yellow' };
|
|
99
|
+
}
|
|
100
|
+
function explainWebFetch(label) {
|
|
101
|
+
return { description: label, risk: 'yellow' };
|
|
102
|
+
}
|
|
103
|
+
function explainMcp(label) {
|
|
104
|
+
const parts = label.replace(/^mcp__?/, '').split('__');
|
|
105
|
+
const server = parts[0] || '';
|
|
106
|
+
const tool = parts.slice(1).join(' ') || '';
|
|
107
|
+
return { description: tool ? `${server}: ${tool}` : server, risk: 'yellow' };
|
|
108
|
+
}
|
|
109
|
+
function explainTool(label) {
|
|
110
|
+
const toolName = label.match(/^(Read|Write|Edit|Glob|Grep|WebSearch)/)?.[1];
|
|
108
111
|
if (toolName && TOOL_DESCRIPTIONS[toolName]) {
|
|
109
|
-
|
|
112
|
+
const entry = TOOL_DESCRIPTIONS[toolName];
|
|
113
|
+
return { description: entry[0], risk: entry[1] };
|
|
110
114
|
}
|
|
111
|
-
return { description:
|
|
115
|
+
return { description: '', risk: 'yellow' };
|
|
116
|
+
}
|
|
117
|
+
function explain(category, label) {
|
|
118
|
+
if (category === 'Bash')
|
|
119
|
+
return explainBash(label);
|
|
120
|
+
if (category === 'WebFetch')
|
|
121
|
+
return explainWebFetch(label);
|
|
122
|
+
if (category === 'MCP')
|
|
123
|
+
return explainMcp(label);
|
|
124
|
+
if (category === 'Tools')
|
|
125
|
+
return explainTool(label);
|
|
126
|
+
return { description: '', risk: 'yellow' };
|
|
112
127
|
}
|
package/dist/interactive.js
CHANGED
|
@@ -185,16 +185,16 @@ function renderDetail(state, withPerms, results) {
|
|
|
185
185
|
if (isOpen) {
|
|
186
186
|
for (const item of group.items) {
|
|
187
187
|
if (state.showInfo) {
|
|
188
|
-
const info = (0, explain_js_1.
|
|
188
|
+
const info = (0, explain_js_1.explain)(group.category, item.name);
|
|
189
189
|
const riskColor = info.risk === 'red' ? colors_js_1.RED : info.risk === 'yellow' ? colors_js_1.YELLOW : colors_js_1.GREEN;
|
|
190
190
|
const dot = `${riskColor}●${colors_js_1.NC}`;
|
|
191
|
-
const
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
navRows.push({ text: `
|
|
191
|
+
const desc = info.description ? ` ${colors_js_1.DIM}${info.description}${colors_js_1.NC}` : '';
|
|
192
|
+
const maxLen = w - 8 - (info.description ? info.description.length + 2 : 0);
|
|
193
|
+
const name = item.name.length > maxLen ? item.name.slice(0, Math.max(8, maxLen) - 1) + '…' : item.name;
|
|
194
|
+
navRows.push({ text: ` ${dot} ${name}${desc}`, perm: item.name });
|
|
195
195
|
}
|
|
196
196
|
else {
|
|
197
|
-
const maxLen = w -
|
|
197
|
+
const maxLen = w - 8;
|
|
198
198
|
const name = item.name.length > maxLen ? item.name.slice(0, maxLen - 1) + '…' : item.name;
|
|
199
199
|
navRows.push({ text: ` ${colors_js_1.DIM}${name}${colors_js_1.NC}`, perm: item.name });
|
|
200
200
|
}
|