cc-permissions 0.1.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.
Files changed (85) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +230 -0
  3. package/dist/analyze.d.ts +10 -0
  4. package/dist/analyze.d.ts.map +1 -0
  5. package/dist/analyze.js +213 -0
  6. package/dist/analyze.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +348 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/output.d.ts +83 -0
  16. package/dist/output.d.ts.map +1 -0
  17. package/dist/output.js +178 -0
  18. package/dist/output.js.map +1 -0
  19. package/dist/permissions.d.ts +32 -0
  20. package/dist/permissions.d.ts.map +1 -0
  21. package/dist/permissions.js +98 -0
  22. package/dist/permissions.js.map +1 -0
  23. package/dist/templates/cache.d.ts +71 -0
  24. package/dist/templates/cache.d.ts.map +1 -0
  25. package/dist/templates/cache.js +137 -0
  26. package/dist/templates/cache.js.map +1 -0
  27. package/dist/templates/dotnet.d.ts +3 -0
  28. package/dist/templates/dotnet.d.ts.map +1 -0
  29. package/dist/templates/dotnet.js +76 -0
  30. package/dist/templates/dotnet.js.map +1 -0
  31. package/dist/templates/general.d.ts +3 -0
  32. package/dist/templates/general.d.ts.map +1 -0
  33. package/dist/templates/general.js +59 -0
  34. package/dist/templates/general.js.map +1 -0
  35. package/dist/templates/index.d.ts +32 -0
  36. package/dist/templates/index.d.ts.map +1 -0
  37. package/dist/templates/index.js +54 -0
  38. package/dist/templates/index.js.map +1 -0
  39. package/dist/templates/loader.d.ts +19 -0
  40. package/dist/templates/loader.d.ts.map +1 -0
  41. package/dist/templates/loader.js +221 -0
  42. package/dist/templates/loader.js.map +1 -0
  43. package/dist/templates/python.d.ts +3 -0
  44. package/dist/templates/python.d.ts.map +1 -0
  45. package/dist/templates/python.js +110 -0
  46. package/dist/templates/python.js.map +1 -0
  47. package/dist/templates/remote.d.ts +45 -0
  48. package/dist/templates/remote.d.ts.map +1 -0
  49. package/dist/templates/remote.js +147 -0
  50. package/dist/templates/remote.js.map +1 -0
  51. package/dist/templates/web.d.ts +3 -0
  52. package/dist/templates/web.d.ts.map +1 -0
  53. package/dist/templates/web.js +101 -0
  54. package/dist/templates/web.js.map +1 -0
  55. package/dist/types.d.ts +44 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +8 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/version.d.ts +53 -0
  60. package/dist/version.d.ts.map +1 -0
  61. package/dist/version.js +118 -0
  62. package/dist/version.js.map +1 -0
  63. package/package.json +54 -0
  64. package/templates/android.jsonc +99 -0
  65. package/templates/aws.jsonc +113 -0
  66. package/templates/azure.jsonc +103 -0
  67. package/templates/database.jsonc +133 -0
  68. package/templates/docker.jsonc +115 -0
  69. package/templates/dotnet.jsonc +80 -0
  70. package/templates/flutter.jsonc +106 -0
  71. package/templates/gcp.jsonc +110 -0
  72. package/templates/git.jsonc +52 -0
  73. package/templates/github.jsonc +132 -0
  74. package/templates/go.jsonc +75 -0
  75. package/templates/ios.jsonc +98 -0
  76. package/templates/java.jsonc +93 -0
  77. package/templates/kubernetes.jsonc +114 -0
  78. package/templates/nodejs.jsonc +105 -0
  79. package/templates/php.jsonc +107 -0
  80. package/templates/python.jsonc +114 -0
  81. package/templates/ruby.jsonc +99 -0
  82. package/templates/rust.jsonc +97 -0
  83. package/templates/shell.jsonc +73 -0
  84. package/templates/template.schema.json +102 -0
  85. package/templates/terraform.jsonc +96 -0
package/dist/cli.js ADDED
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { parseLevel, describeLevels } from "./permissions.js";
4
+ import { getTemplates, listTemplates, } from "./templates/index.js";
5
+ import { formatFullOutput, applyPermissions, formatApplyResult, parseScope } from "./output.js";
6
+ import { analyzeDirectory, formatAnalysisResult } from "./analyze.js";
7
+ import { formatVersionInfo, readPackageJson } from "./version.js";
8
+ function showHelp() {
9
+ console.log(`
10
+ cc-permissions - Generate permission configs for Claude Code
11
+
12
+ Usage:
13
+ cc-permissions [options] Analyze current directory
14
+ cc-permissions <command> [options] Run a specific command
15
+
16
+ Commands:
17
+ analyze [path] Analyze project and recommend templates
18
+ template <names> Generate permissions from specific templates
19
+ list List available templates
20
+
21
+ Global Options:
22
+ -h, --help Show this help message
23
+ -v, --version Show version number
24
+ -l, --level Permission level: restrictive, standard, permissive
25
+ -a, --apply Apply permissions to settings file
26
+ -s, --scope Settings scope: project, user, local (default: project)
27
+ -o, --output Custom output file path (overrides --scope)
28
+
29
+ Scopes:
30
+ project .claude/settings.json (in target directory)
31
+ user, global ~/.claude/settings.json (user's home directory)
32
+ local .claude/settings.local.json (gitignored, for personal prefs)
33
+
34
+ Run "cc-permissions <command> --help" for command-specific options.
35
+
36
+ Examples:
37
+ cc-permissions Analyze current directory
38
+ cc-permissions --apply Analyze and apply permissions
39
+ cc-permissions --apply -l permissive Analyze and apply with custom level
40
+ cc-permissions --apply --scope user Apply to user-level settings
41
+ cc-permissions analyze ./my-project Analyze a specific path
42
+ cc-permissions template nodejs,python Manually select templates
43
+ cc-permissions list List all templates
44
+ `);
45
+ }
46
+ function showTemplateHelp() {
47
+ console.log(`
48
+ Usage: cc-permissions template <names> [options]
49
+
50
+ Generate permission configurations from one or more templates.
51
+
52
+ Arguments:
53
+ names Comma-separated template names (e.g., "nodejs" or "nodejs,python")
54
+
55
+ Options:
56
+ -l, --level Permission level: restrictive, standard, permissive (default: standard)
57
+ -f, --format Output format: json, summary, both (default: json)
58
+ -a, --apply Apply permissions to settings file (creates .bak backup)
59
+ -s, --scope Settings scope: project, user, local (default: project)
60
+ -o, --output Custom output file path (overrides --scope)
61
+
62
+ ${describeLevels()}
63
+
64
+ Run "cc-permissions list" to see available templates.
65
+
66
+ Examples:
67
+ cc-permissions template shell --level restrictive
68
+ cc-permissions template nodejs --level standard
69
+ cc-permissions template nodejs,python --level permissive --format summary
70
+ cc-permissions template nodejs --apply
71
+ cc-permissions template nodejs --apply --scope user
72
+ `);
73
+ }
74
+ function handleTemplate(args) {
75
+ const { values, positionals } = parseArgs({
76
+ args,
77
+ options: {
78
+ level: { type: "string", short: "l", default: "standard" },
79
+ format: { type: "string", short: "f", default: "json" },
80
+ apply: { type: "boolean", short: "a" },
81
+ scope: { type: "string", short: "s", default: "project" },
82
+ output: { type: "string", short: "o" },
83
+ help: { type: "boolean", short: "h" },
84
+ },
85
+ allowPositionals: true,
86
+ });
87
+ if (values.help || positionals.length === 0) {
88
+ showTemplateHelp();
89
+ process.exit(0);
90
+ }
91
+ // Parse template names (comma-separated)
92
+ const templateNames = positionals[0].split(",").map((n) => n.trim().toLowerCase());
93
+ // Validate and get templates
94
+ const { found, notFound } = getTemplates(templateNames);
95
+ if (notFound.length > 0) {
96
+ console.error(`Unknown template(s): ${notFound.join(", ")}`);
97
+ console.error(`Available templates: ${listTemplates().map((t) => t.name).join(", ")}`);
98
+ process.exit(1);
99
+ }
100
+ // Parse level
101
+ const level = parseLevel(values.level);
102
+ if (!level) {
103
+ console.error(`Invalid level: ${values.level}`);
104
+ console.error(`Valid levels: restrictive, standard, permissive`);
105
+ process.exit(1);
106
+ }
107
+ // Handle --apply flag
108
+ if (values.apply) {
109
+ // Parse scope
110
+ const scope = parseScope(values.scope);
111
+ if (!scope) {
112
+ console.error(`Invalid scope: ${values.scope}`);
113
+ console.error(`Valid scopes: project, user, global, local`);
114
+ process.exit(1);
115
+ }
116
+ const result = applyPermissions(found, level, {
117
+ scope,
118
+ outputPath: values.output,
119
+ });
120
+ console.log(formatApplyResult(result));
121
+ return;
122
+ }
123
+ // Parse format
124
+ const format = values.format;
125
+ if (!["json", "summary", "both"].includes(format)) {
126
+ console.error(`Invalid format: ${format}`);
127
+ console.error(`Valid formats: json, summary, both`);
128
+ process.exit(1);
129
+ }
130
+ // Generate output
131
+ const output = formatFullOutput(found, level, format);
132
+ console.log(output);
133
+ }
134
+ function showAnalyzeHelp() {
135
+ console.log(`
136
+ Usage: cc-permissions analyze [path] [options]
137
+
138
+ Analyze a project directory and recommend templates.
139
+
140
+ Arguments:
141
+ path Path to analyze (default: current directory)
142
+
143
+ Options:
144
+ -l, --level Permission level: restrictive, standard, permissive
145
+ (default: auto-detected based on project complexity)
146
+ -a, --apply Apply permissions to settings file
147
+ -s, --scope Settings scope: project, user, local (default: project)
148
+ -o, --output Custom output file path (overrides --scope)
149
+ -h, --help Show this help
150
+
151
+ ${describeLevels()}
152
+
153
+ Examples:
154
+ cc-permissions analyze
155
+ cc-permissions analyze ./my-project
156
+ cc-permissions analyze --apply
157
+ cc-permissions analyze --apply --scope user
158
+ cc-permissions analyze -l permissive --apply
159
+ `);
160
+ }
161
+ function handleAnalyze(args) {
162
+ const { values, positionals } = parseArgs({
163
+ args,
164
+ options: {
165
+ help: { type: "boolean", short: "h" },
166
+ level: { type: "string", short: "l" },
167
+ apply: { type: "boolean", short: "a" },
168
+ scope: { type: "string", short: "s", default: "project" },
169
+ output: { type: "string", short: "o" },
170
+ },
171
+ allowPositionals: true,
172
+ });
173
+ if (values.help) {
174
+ showAnalyzeHelp();
175
+ process.exit(0);
176
+ }
177
+ const targetPath = positionals[0] || ".";
178
+ const result = analyzeDirectory(targetPath);
179
+ // Handle --apply flag
180
+ if (values.apply) {
181
+ // Use provided level or the suggested level from analysis
182
+ let level = result.suggestedLevel;
183
+ if (values.level) {
184
+ const parsedLevel = parseLevel(values.level);
185
+ if (!parsedLevel) {
186
+ console.error(`Invalid level: ${values.level}`);
187
+ console.error(`Valid levels: restrictive, standard, permissive`);
188
+ process.exit(1);
189
+ }
190
+ level = parsedLevel;
191
+ }
192
+ // Get the templates
193
+ const { found, notFound } = getTemplates(result.recommendedTemplates);
194
+ if (notFound.length > 0) {
195
+ console.error(`Unknown template(s): ${notFound.join(", ")}`);
196
+ process.exit(1);
197
+ }
198
+ // Parse scope
199
+ const scope = parseScope(values.scope);
200
+ if (!scope) {
201
+ console.error(`Invalid scope: ${values.scope}`);
202
+ console.error(`Valid scopes: project, user, global, local`);
203
+ process.exit(1);
204
+ }
205
+ // Apply the permissions
206
+ const applyResult = applyPermissions(found, level, {
207
+ scope,
208
+ outputPath: values.output,
209
+ });
210
+ // Show analysis summary then apply result
211
+ console.log(`Detected templates: ${result.recommendedTemplates.join(", ")}`);
212
+ console.log(`Applied level: ${level}`);
213
+ console.log(formatApplyResult(applyResult));
214
+ return;
215
+ }
216
+ // Standard output: show analysis result
217
+ console.log(formatAnalysisResult(result));
218
+ }
219
+ function showListHelp() {
220
+ console.log(`
221
+ Usage: cc-permissions list
222
+
223
+ List all available templates grouped by category.
224
+
225
+ Options:
226
+ -h, --help Show this help
227
+
228
+ Examples:
229
+ cc-permissions list
230
+ `);
231
+ }
232
+ function handleList(args) {
233
+ const { values } = parseArgs({
234
+ args,
235
+ options: {
236
+ help: { type: "boolean", short: "h" },
237
+ },
238
+ allowPositionals: true,
239
+ });
240
+ if (values.help) {
241
+ showListHelp();
242
+ process.exit(0);
243
+ }
244
+ const allTemplates = listTemplates();
245
+ // Fixed category order
246
+ const categoryOrder = [
247
+ "General",
248
+ "Version Control",
249
+ "Languages & Runtimes",
250
+ "Cloud Providers",
251
+ "Container & Infrastructure",
252
+ "Mobile Development",
253
+ "Utilities",
254
+ "Other",
255
+ ];
256
+ // Group templates by category
257
+ const grouped = new Map();
258
+ for (const template of allTemplates) {
259
+ const category = template.category || "Other";
260
+ if (!grouped.has(category)) {
261
+ grouped.set(category, []);
262
+ }
263
+ grouped.get(category).push({ name: template.name, description: template.description });
264
+ }
265
+ // Sort templates within each category alphabetically
266
+ for (const templates of grouped.values()) {
267
+ templates.sort((a, b) => a.name.localeCompare(b.name));
268
+ }
269
+ console.log("Available Templates:\n");
270
+ // Output in fixed category order
271
+ for (const category of categoryOrder) {
272
+ const templates = grouped.get(category);
273
+ if (!templates || templates.length === 0)
274
+ continue;
275
+ console.log(`${category}:`);
276
+ for (const template of templates) {
277
+ console.log(` ${template.name.padEnd(12)} ${template.description}`);
278
+ }
279
+ console.log();
280
+ }
281
+ console.log(`Use "cc-permissions template <name> --level <level>" to generate permissions.`);
282
+ }
283
+ // Main CLI entry point
284
+ function main() {
285
+ const { values, positionals } = parseArgs({
286
+ options: {
287
+ help: { type: "boolean", short: "h" },
288
+ version: { type: "boolean", short: "v" },
289
+ level: { type: "string", short: "l" },
290
+ apply: { type: "boolean", short: "a" },
291
+ scope: { type: "string", short: "s" },
292
+ output: { type: "string", short: "o" },
293
+ },
294
+ allowPositionals: true,
295
+ strict: false, // Allow unknown options to pass through to subcommands
296
+ });
297
+ if (values.version) {
298
+ const pkg = readPackageJson();
299
+ console.log(formatVersionInfo(pkg.version, pkg.name));
300
+ process.exit(0);
301
+ }
302
+ // Check if first positional is a command
303
+ const command = positionals[0];
304
+ // Show help if -h flag with no command
305
+ if (values.help && !command) {
306
+ showHelp();
307
+ process.exit(0);
308
+ }
309
+ // No arguments: run analyze on current directory
310
+ // Pass through relevant flags
311
+ if (!command) {
312
+ const analyzeArgs = [];
313
+ if (values.level) {
314
+ analyzeArgs.push("--level", values.level);
315
+ }
316
+ if (values.apply) {
317
+ analyzeArgs.push("--apply");
318
+ }
319
+ if (values.scope) {
320
+ analyzeArgs.push("--scope", values.scope);
321
+ }
322
+ if (values.output) {
323
+ analyzeArgs.push("--output", values.output);
324
+ }
325
+ handleAnalyze(analyzeArgs);
326
+ return;
327
+ }
328
+ // Command was specified - route to appropriate handler
329
+ const subArgs = process.argv.slice(process.argv.indexOf(command) + 1);
330
+ switch (command) {
331
+ case "template":
332
+ handleTemplate(subArgs);
333
+ break;
334
+ case "analyze":
335
+ handleAnalyze(subArgs);
336
+ break;
337
+ case "list":
338
+ handleList(subArgs);
339
+ break;
340
+ default:
341
+ console.error(`Unknown command: ${command}`);
342
+ console.error('Run "cc-permissions --help" for usage information.');
343
+ process.exit(1);
344
+ }
345
+ }
346
+ // Run main
347
+ main();
348
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const VERSION = "0.1.0";
2
+ export * from "./types.js";
3
+ export { BANNED_PATTERNS, getPermissionsForLevel, combineTemplatePermissions, generateClaudeCodePermissions, parseLevel, describeLevels, } from "./permissions.js";
4
+ export { templates, getTemplate, getTemplates, listTemplateNames, listTemplates, isInitialized, resetLoader, getTemplatesDir, } from "./templates/index.js";
5
+ export { generateSettings, formatSettingsJson, formatPermissionsSummary, formatCommand, formatFullOutput, applyPermissions, formatApplyResult, } from "./output.js";
6
+ export { analyzeDirectory, formatAnalysisResult, } from "./analyze.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ // cc-permission-generator
2
+ // Main module exports
3
+ export const VERSION = "0.1.0";
4
+ // Types
5
+ export * from "./types.js";
6
+ // Core permission logic
7
+ export { BANNED_PATTERNS, getPermissionsForLevel, combineTemplatePermissions, generateClaudeCodePermissions, parseLevel, describeLevels, } from "./permissions.js";
8
+ // Templates
9
+ export { templates, getTemplate, getTemplates, listTemplateNames, listTemplates, isInitialized, resetLoader, getTemplatesDir, } from "./templates/index.js";
10
+ // Output generation
11
+ export { generateSettings, formatSettingsJson, formatPermissionsSummary, formatCommand, formatFullOutput, applyPermissions, formatApplyResult, } from "./output.js";
12
+ // Analysis
13
+ export { analyzeDirectory, formatAnalysisResult, } from "./analyze.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,sBAAsB;AAEtB,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,wBAAwB;AACxB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,YAAY;AACZ,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { TemplateDefinition } from "./types.js";
2
+ import { PermissionLevel } from "./types.js";
3
+ /**
4
+ * Format for Claude Code settings.json permissions section
5
+ */
6
+ export interface ClaudeCodeSettings {
7
+ permissions: {
8
+ allow: string[];
9
+ deny: string[];
10
+ };
11
+ }
12
+ /**
13
+ * Generate Claude Code settings format from templates and level.
14
+ */
15
+ export declare function generateSettings(templates: TemplateDefinition[], level: PermissionLevel): ClaudeCodeSettings;
16
+ /**
17
+ * Format settings as JSON string for output.
18
+ */
19
+ export declare function formatSettingsJson(settings: ClaudeCodeSettings): string;
20
+ /**
21
+ * Format permissions as a human-readable summary.
22
+ */
23
+ export declare function formatPermissionsSummary(templates: TemplateDefinition[], level: PermissionLevel): string;
24
+ /**
25
+ * Generate the command to use these permissions.
26
+ */
27
+ export declare function formatCommand(templateNames: string[], level: PermissionLevel): string;
28
+ /**
29
+ * Full output with both JSON and summary.
30
+ */
31
+ export declare function formatFullOutput(templates: TemplateDefinition[], level: PermissionLevel, outputFormat?: "json" | "summary" | "both"): string;
32
+ /**
33
+ * Scope for where to apply permissions.
34
+ */
35
+ export type ApplyScope = "project" | "user" | "global" | "local";
36
+ /**
37
+ * Resolve scope to a settings file path.
38
+ *
39
+ * @param scope - The scope (project, user/global, local)
40
+ * @param baseDir - Base directory for project/local scope (defaults to cwd)
41
+ * @returns Absolute path to the settings file
42
+ */
43
+ export declare function resolveSettingsPath(scope: ApplyScope, baseDir?: string): string;
44
+ /**
45
+ * Parse and validate scope string.
46
+ * Supports prefix matching (e.g., "u" for "user", "l" for "local").
47
+ */
48
+ export declare function parseScope(value: string): ApplyScope | null;
49
+ /**
50
+ * Result of applying permissions to settings file.
51
+ */
52
+ export interface ApplyResult {
53
+ settingsPath: string;
54
+ backupPath: string | null;
55
+ created: boolean;
56
+ merged: boolean;
57
+ }
58
+ /**
59
+ * Options for applying permissions.
60
+ */
61
+ export interface ApplyOptions {
62
+ /** Base directory for relative scope paths (defaults to cwd) */
63
+ baseDir?: string;
64
+ /** Scope: project, user/global, local */
65
+ scope?: ApplyScope;
66
+ /** Custom output path (overrides scope) */
67
+ outputPath?: string;
68
+ }
69
+ /**
70
+ * Apply permissions to a settings file, merging with existing settings.
71
+ * Creates a .bak backup if the file already exists.
72
+ *
73
+ * @param templates - Templates to apply
74
+ * @param level - Permission level
75
+ * @param options - Apply options (baseDir, scope, outputPath)
76
+ * @returns Result with paths and status
77
+ */
78
+ export declare function applyPermissions(templates: TemplateDefinition[], level: PermissionLevel, options?: ApplyOptions): ApplyResult;
79
+ /**
80
+ * Format the apply result for display.
81
+ */
82
+ export declare function formatApplyResult(result: ApplyResult): string;
83
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,eAAe,GACrB,kBAAkB,CAOpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,eAAe,GACrB,MAAM,CA2BR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,EAAE,eAAe,GACrB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,eAAe,EACtB,YAAY,GAAE,MAAM,GAAG,SAAS,GAAG,MAAe,GACjD,MAAM,CAgBR;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,CAW9F;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAa3D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,YAAiB,GACzB,WAAW,CAuDb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAa7D"}
package/dist/output.js ADDED
@@ -0,0 +1,178 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { BANNED_PATTERNS, combineTemplatePermissions, generateClaudeCodePermissions, } from "./permissions.js";
5
+ /**
6
+ * Generate Claude Code settings format from templates and level.
7
+ */
8
+ export function generateSettings(templates, level) {
9
+ const permissions = combineTemplatePermissions(templates, level);
10
+ const ccPermissions = generateClaudeCodePermissions(permissions);
11
+ return {
12
+ permissions: ccPermissions,
13
+ };
14
+ }
15
+ /**
16
+ * Format settings as JSON string for output.
17
+ */
18
+ export function formatSettingsJson(settings) {
19
+ return JSON.stringify(settings, null, 2);
20
+ }
21
+ /**
22
+ * Format permissions as a human-readable summary.
23
+ */
24
+ export function formatPermissionsSummary(templates, level) {
25
+ const permissions = combineTemplatePermissions(templates, level);
26
+ const templateNames = templates.map((t) => t.name).join(", ");
27
+ const lines = [
28
+ `Permission Summary`,
29
+ `==================`,
30
+ `Templates: ${templateNames}`,
31
+ `Level: ${level}`,
32
+ ``,
33
+ `Allowed Commands (${permissions.length}):`,
34
+ ];
35
+ // Group permissions by template for better readability
36
+ for (const perm of permissions) {
37
+ const desc = perm.description ? ` - ${perm.description}` : "";
38
+ lines.push(` ${perm.command}${desc}`);
39
+ }
40
+ lines.push(``);
41
+ lines.push(`Denied Patterns (${BANNED_PATTERNS.length}):`);
42
+ for (const banned of BANNED_PATTERNS) {
43
+ const desc = banned.description ? ` - ${banned.description}` : "";
44
+ lines.push(` ${banned.command}${desc}`);
45
+ }
46
+ return lines.join("\n");
47
+ }
48
+ /**
49
+ * Generate the command to use these permissions.
50
+ */
51
+ export function formatCommand(templateNames, level) {
52
+ const templates = templateNames.join(",");
53
+ return `cc-permissions template ${templates} --level ${level}`;
54
+ }
55
+ /**
56
+ * Full output with both JSON and summary.
57
+ */
58
+ export function formatFullOutput(templates, level, outputFormat = "json") {
59
+ if (outputFormat === "json") {
60
+ const settings = generateSettings(templates, level);
61
+ return formatSettingsJson(settings);
62
+ }
63
+ if (outputFormat === "summary") {
64
+ return formatPermissionsSummary(templates, level);
65
+ }
66
+ // Both
67
+ const settings = generateSettings(templates, level);
68
+ const summary = formatPermissionsSummary(templates, level);
69
+ const json = formatSettingsJson(settings);
70
+ return `${summary}\n\n---\n\nJSON Output:\n${json}`;
71
+ }
72
+ /**
73
+ * Resolve scope to a settings file path.
74
+ *
75
+ * @param scope - The scope (project, user/global, local)
76
+ * @param baseDir - Base directory for project/local scope (defaults to cwd)
77
+ * @returns Absolute path to the settings file
78
+ */
79
+ export function resolveSettingsPath(scope, baseDir = process.cwd()) {
80
+ switch (scope) {
81
+ case "user":
82
+ case "global":
83
+ return join(homedir(), ".claude", "settings.json");
84
+ case "local":
85
+ return join(baseDir, ".claude", "settings.local.json");
86
+ case "project":
87
+ default:
88
+ return join(baseDir, ".claude", "settings.json");
89
+ }
90
+ }
91
+ /**
92
+ * Parse and validate scope string.
93
+ * Supports prefix matching (e.g., "u" for "user", "l" for "local").
94
+ */
95
+ export function parseScope(value) {
96
+ const normalized = value.toLowerCase().trim();
97
+ const scopes = ["project", "user", "global", "local"];
98
+ const matches = scopes.filter((s) => s.startsWith(normalized));
99
+ if (matches.length === 1) {
100
+ return matches[0];
101
+ }
102
+ // Special case: "g" is unambiguous (only "global" starts with g)
103
+ // but "u" matches "user" only, "l" matches "local" only, "p" matches "project" only
104
+ return null;
105
+ }
106
+ /**
107
+ * Apply permissions to a settings file, merging with existing settings.
108
+ * Creates a .bak backup if the file already exists.
109
+ *
110
+ * @param templates - Templates to apply
111
+ * @param level - Permission level
112
+ * @param options - Apply options (baseDir, scope, outputPath)
113
+ * @returns Result with paths and status
114
+ */
115
+ export function applyPermissions(templates, level, options = {}) {
116
+ const { baseDir = process.cwd(), scope = "project", outputPath } = options;
117
+ // Determine settings path: custom path overrides scope
118
+ const settingsPath = outputPath || resolveSettingsPath(scope, baseDir);
119
+ const settingsDir = dirname(settingsPath);
120
+ const backupPath = settingsPath + ".bak";
121
+ // Generate new permissions
122
+ const newSettings = generateSettings(templates, level);
123
+ let existingSettings = {};
124
+ let created = true;
125
+ let merged = false;
126
+ let backupCreated = null;
127
+ // Ensure parent directory exists
128
+ if (!existsSync(settingsDir)) {
129
+ mkdirSync(settingsDir, { recursive: true });
130
+ }
131
+ // Read existing settings if they exist
132
+ if (existsSync(settingsPath)) {
133
+ created = false;
134
+ // Create backup
135
+ const existingContent = readFileSync(settingsPath, "utf-8");
136
+ writeFileSync(backupPath, existingContent, "utf-8");
137
+ backupCreated = backupPath;
138
+ // Parse existing settings
139
+ try {
140
+ existingSettings = JSON.parse(existingContent);
141
+ merged = true;
142
+ }
143
+ catch {
144
+ // If existing file is invalid JSON, we'll overwrite it
145
+ existingSettings = {};
146
+ }
147
+ }
148
+ // Merge: new permissions replace existing, but preserve other settings
149
+ const mergedSettings = {
150
+ ...existingSettings,
151
+ permissions: newSettings.permissions,
152
+ };
153
+ // Write merged settings
154
+ writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 2) + "\n", "utf-8");
155
+ return {
156
+ settingsPath,
157
+ backupPath: backupCreated,
158
+ created,
159
+ merged,
160
+ };
161
+ }
162
+ /**
163
+ * Format the apply result for display.
164
+ */
165
+ export function formatApplyResult(result) {
166
+ const lines = [];
167
+ if (result.created) {
168
+ lines.push(`Created: ${result.settingsPath}`);
169
+ }
170
+ else if (result.merged) {
171
+ lines.push(`Updated: ${result.settingsPath}`);
172
+ if (result.backupPath) {
173
+ lines.push(`Backup: ${result.backupPath}`);
174
+ }
175
+ }
176
+ return lines.join("\n");
177
+ }
178
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}