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
@@ -0,0 +1,32 @@
1
+ import type { Permission, TemplateDefinition, ClaudeCodePermissions } from "./types.js";
2
+ import { PermissionLevel } from "./types.js";
3
+ export declare const BANNED_PATTERNS: Permission[];
4
+ /**
5
+ * Get all permissions for a template at a given level.
6
+ * Levels stack: standard includes restrictive, permissive includes standard.
7
+ */
8
+ export declare function getPermissionsForLevel(template: TemplateDefinition, level: PermissionLevel): Permission[];
9
+ /**
10
+ * Combine permissions from multiple templates at a given level.
11
+ * Deduplicates by command string.
12
+ */
13
+ export declare function combineTemplatePermissions(templates: TemplateDefinition[], level: PermissionLevel): Permission[];
14
+ /**
15
+ * Format a command as a Claude Code Bash permission.
16
+ * Claude Code requires format: "Bash(command:*)" for allow/deny patterns.
17
+ */
18
+ export declare function formatBashPermission(command: string): string;
19
+ /**
20
+ * Generate Claude Code permissions format from template permissions.
21
+ */
22
+ export declare function generateClaudeCodePermissions(permissions: Permission[]): ClaudeCodePermissions;
23
+ /**
24
+ * Parse a permission level string to enum.
25
+ * Supports prefix matching (e.g., "r" or "res" for "restrictive").
26
+ */
27
+ export declare function parseLevel(levelStr: string): PermissionLevel | null;
28
+ /**
29
+ * Get a human-readable description of a permission level.
30
+ */
31
+ export declare function describeLevels(): string;
32
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7C,eAAO,MAAM,eAAe,EAAE,UAAU,EAgBvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,eAAe,GACrB,UAAU,EAAE,CAiBd;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,eAAe,GACrB,UAAU,EAAE,CAcd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,UAAU,EAAE,GACxB,qBAAqB,CAKvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAenE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC"}
@@ -0,0 +1,98 @@
1
+ import { PermissionLevel } from "./types.js";
2
+ // Always banned patterns - dangerous operations that should never be allowed
3
+ // These are stored as raw commands; formatting happens at output time
4
+ export const BANNED_PATTERNS = [
5
+ { command: "rm -rf", description: "Recursive force delete" },
6
+ { command: "sudo", description: "Privilege escalation" },
7
+ { command: "chmod 777", description: "World-writable permissions" },
8
+ { command: "curl * | bash", description: "Remote code execution" },
9
+ { command: "curl *|bash", description: "Remote code execution (no spaces)" },
10
+ { command: "wget * | sh", description: "Remote code execution" },
11
+ { command: "wget *|sh", description: "Remote code execution (no spaces)" },
12
+ { command: "curl * | sh", description: "Remote code execution" },
13
+ { command: "curl *|sh", description: "Remote code execution (no spaces)" },
14
+ { command: "wget * | bash", description: "Remote code execution" },
15
+ { command: "wget *|bash", description: "Remote code execution (no spaces)" },
16
+ { command: "dd", description: "Low-level disk operations" },
17
+ { command: "mkfs", description: "Filesystem creation" },
18
+ { command: "format", description: "Disk formatting" },
19
+ { command: "* > /dev/*", description: "Writing to device files" },
20
+ ];
21
+ /**
22
+ * Get all permissions for a template at a given level.
23
+ * Levels stack: standard includes restrictive, permissive includes standard.
24
+ */
25
+ export function getPermissionsForLevel(template, level) {
26
+ const permissions = [];
27
+ // Always include restrictive
28
+ permissions.push(...template.levels.restrictive);
29
+ // Include standard if level is standard or permissive
30
+ if (level === PermissionLevel.Standard || level === PermissionLevel.Permissive) {
31
+ permissions.push(...template.levels.standard);
32
+ }
33
+ // Include permissive only if level is permissive
34
+ if (level === PermissionLevel.Permissive) {
35
+ permissions.push(...template.levels.permissive);
36
+ }
37
+ return permissions;
38
+ }
39
+ /**
40
+ * Combine permissions from multiple templates at a given level.
41
+ * Deduplicates by command string.
42
+ */
43
+ export function combineTemplatePermissions(templates, level) {
44
+ const permissionMap = new Map();
45
+ for (const template of templates) {
46
+ const perms = getPermissionsForLevel(template, level);
47
+ for (const perm of perms) {
48
+ // If we already have this command, keep the one with a description
49
+ if (!permissionMap.has(perm.command) || perm.description) {
50
+ permissionMap.set(perm.command, perm);
51
+ }
52
+ }
53
+ }
54
+ return Array.from(permissionMap.values());
55
+ }
56
+ /**
57
+ * Format a command as a Claude Code Bash permission.
58
+ * Claude Code requires format: "Bash(command:*)" for allow/deny patterns.
59
+ */
60
+ export function formatBashPermission(command) {
61
+ return `Bash(${command}:*)`;
62
+ }
63
+ /**
64
+ * Generate Claude Code permissions format from template permissions.
65
+ */
66
+ export function generateClaudeCodePermissions(permissions) {
67
+ return {
68
+ allow: permissions.map((p) => formatBashPermission(p.command)),
69
+ deny: BANNED_PATTERNS.map((p) => formatBashPermission(p.command)),
70
+ };
71
+ }
72
+ /**
73
+ * Parse a permission level string to enum.
74
+ * Supports prefix matching (e.g., "r" or "res" for "restrictive").
75
+ */
76
+ export function parseLevel(levelStr) {
77
+ const normalized = levelStr.toLowerCase().trim();
78
+ const levels = [
79
+ ["restrictive", PermissionLevel.Restrictive],
80
+ ["standard", PermissionLevel.Standard],
81
+ ["permissive", PermissionLevel.Permissive],
82
+ ];
83
+ const matches = levels.filter(([name]) => name.startsWith(normalized));
84
+ if (matches.length === 1) {
85
+ return matches[0][1];
86
+ }
87
+ return null;
88
+ }
89
+ /**
90
+ * Get a human-readable description of a permission level.
91
+ */
92
+ export function describeLevels() {
93
+ return `Permission Levels:
94
+ restrictive Read-only operations (git status, npm list, etc.)
95
+ standard Dev workflow (+ git commit/push, npm run/build/test)
96
+ permissive Few guardrails (+ npm install, most commands except banned)`;
97
+ }
98
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export interface TemplateCategory {
2
+ name: string;
3
+ templates: string[];
4
+ }
5
+ export interface CacheMeta {
6
+ lastUpdated: string;
7
+ version: string;
8
+ etag?: string;
9
+ templates: string[];
10
+ categories?: TemplateCategory[];
11
+ }
12
+ /**
13
+ * Ensure the cache directory exists.
14
+ */
15
+ export declare function ensureCacheDir(): void;
16
+ /**
17
+ * Check if the cache exists and has templates.
18
+ */
19
+ export declare function cacheExists(): boolean;
20
+ /**
21
+ * Get the cache metadata.
22
+ */
23
+ export declare function getCacheMeta(): CacheMeta | null;
24
+ /**
25
+ * Save cache metadata.
26
+ */
27
+ export declare function saveCacheMeta(meta: CacheMeta): void;
28
+ /**
29
+ * Get the path to the cache templates directory.
30
+ */
31
+ export declare function getCacheTemplatesDir(): string;
32
+ /**
33
+ * Save a template to the cache.
34
+ */
35
+ export declare function cacheTemplate(name: string, content: string): void;
36
+ /**
37
+ * Read a template from the cache.
38
+ */
39
+ export declare function readCachedTemplate(name: string): string | null;
40
+ /**
41
+ * List all cached template files.
42
+ */
43
+ export declare function listCachedTemplateFiles(): string[];
44
+ /**
45
+ * Clear the template cache.
46
+ */
47
+ export declare function clearCache(): {
48
+ cleared: boolean;
49
+ message: string;
50
+ };
51
+ /**
52
+ * Get cache information for display.
53
+ */
54
+ export declare function getCacheInfo(): {
55
+ exists: boolean;
56
+ path: string;
57
+ templateCount: number;
58
+ lastUpdated: string | null;
59
+ version: string | null;
60
+ };
61
+ /**
62
+ * Check if the cache is stale (older than the given max age in milliseconds).
63
+ * Default max age is 24 hours.
64
+ */
65
+ export declare function isCacheStale(maxAgeMs?: number): boolean;
66
+ /**
67
+ * Get categories from the cache metadata.
68
+ * Returns null if no categories are available.
69
+ */
70
+ export declare function getCategories(): TemplateCategory[] | null;
71
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/templates/cache.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAMrC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAGnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAKlD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAclE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAWA;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,MAA4B,GAAG,OAAO,CAS5E;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,gBAAgB,EAAE,GAAG,IAAI,CAGzD"}
@@ -0,0 +1,137 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ // Cache location: ~/.cc-permissions/templates/
5
+ const CACHE_BASE_DIR = join(homedir(), ".cc-permissions");
6
+ const CACHE_TEMPLATES_DIR = join(CACHE_BASE_DIR, "templates");
7
+ const CACHE_META_FILE = join(CACHE_BASE_DIR, "cache-meta.json");
8
+ /**
9
+ * Ensure the cache directory exists.
10
+ */
11
+ export function ensureCacheDir() {
12
+ if (!existsSync(CACHE_BASE_DIR)) {
13
+ mkdirSync(CACHE_BASE_DIR, { recursive: true });
14
+ }
15
+ if (!existsSync(CACHE_TEMPLATES_DIR)) {
16
+ mkdirSync(CACHE_TEMPLATES_DIR, { recursive: true });
17
+ }
18
+ }
19
+ /**
20
+ * Check if the cache exists and has templates.
21
+ */
22
+ export function cacheExists() {
23
+ if (!existsSync(CACHE_TEMPLATES_DIR)) {
24
+ return false;
25
+ }
26
+ const files = readdirSync(CACHE_TEMPLATES_DIR).filter((f) => f.endsWith(".jsonc"));
27
+ return files.length > 0;
28
+ }
29
+ /**
30
+ * Get the cache metadata.
31
+ */
32
+ export function getCacheMeta() {
33
+ if (!existsSync(CACHE_META_FILE)) {
34
+ return null;
35
+ }
36
+ try {
37
+ const content = readFileSync(CACHE_META_FILE, "utf-8");
38
+ return JSON.parse(content);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Save cache metadata.
46
+ */
47
+ export function saveCacheMeta(meta) {
48
+ ensureCacheDir();
49
+ writeFileSync(CACHE_META_FILE, JSON.stringify(meta, null, 2));
50
+ }
51
+ /**
52
+ * Get the path to the cache templates directory.
53
+ */
54
+ export function getCacheTemplatesDir() {
55
+ return CACHE_TEMPLATES_DIR;
56
+ }
57
+ /**
58
+ * Save a template to the cache.
59
+ */
60
+ export function cacheTemplate(name, content) {
61
+ ensureCacheDir();
62
+ const filepath = join(CACHE_TEMPLATES_DIR, `${name}.jsonc`);
63
+ writeFileSync(filepath, content);
64
+ }
65
+ /**
66
+ * Read a template from the cache.
67
+ */
68
+ export function readCachedTemplate(name) {
69
+ const filepath = join(CACHE_TEMPLATES_DIR, `${name}.jsonc`);
70
+ if (!existsSync(filepath)) {
71
+ return null;
72
+ }
73
+ return readFileSync(filepath, "utf-8");
74
+ }
75
+ /**
76
+ * List all cached template files.
77
+ */
78
+ export function listCachedTemplateFiles() {
79
+ if (!existsSync(CACHE_TEMPLATES_DIR)) {
80
+ return [];
81
+ }
82
+ return readdirSync(CACHE_TEMPLATES_DIR).filter((f) => f.endsWith(".jsonc"));
83
+ }
84
+ /**
85
+ * Clear the template cache.
86
+ */
87
+ export function clearCache() {
88
+ if (!existsSync(CACHE_BASE_DIR)) {
89
+ return { cleared: false, message: "Cache directory does not exist." };
90
+ }
91
+ try {
92
+ rmSync(CACHE_BASE_DIR, { recursive: true, force: true });
93
+ return { cleared: true, message: "Cache cleared successfully." };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ cleared: false,
98
+ message: `Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`,
99
+ };
100
+ }
101
+ }
102
+ /**
103
+ * Get cache information for display.
104
+ */
105
+ export function getCacheInfo() {
106
+ const meta = getCacheMeta();
107
+ const files = listCachedTemplateFiles();
108
+ return {
109
+ exists: cacheExists(),
110
+ path: CACHE_BASE_DIR,
111
+ templateCount: files.length,
112
+ lastUpdated: meta?.lastUpdated ?? null,
113
+ version: meta?.version ?? null,
114
+ };
115
+ }
116
+ /**
117
+ * Check if the cache is stale (older than the given max age in milliseconds).
118
+ * Default max age is 24 hours.
119
+ */
120
+ export function isCacheStale(maxAgeMs = 24 * 60 * 60 * 1000) {
121
+ const meta = getCacheMeta();
122
+ if (!meta?.lastUpdated) {
123
+ return true;
124
+ }
125
+ const lastUpdated = new Date(meta.lastUpdated).getTime();
126
+ const now = Date.now();
127
+ return now - lastUpdated > maxAgeMs;
128
+ }
129
+ /**
130
+ * Get categories from the cache metadata.
131
+ * Returns null if no categories are available.
132
+ */
133
+ export function getCategories() {
134
+ const meta = getCacheMeta();
135
+ return meta?.categories ?? null;
136
+ }
137
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/templates/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TemplateDefinition } from "../types.js";
2
+ export declare const dotnetTemplate: TemplateDefinition;
3
+ //# sourceMappingURL=dotnet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotnet.d.ts","sourceRoot":"","sources":["../../src/templates/dotnet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,cAAc,EAAE,kBA0E5B,CAAC"}
@@ -0,0 +1,76 @@
1
+ export const dotnetTemplate = {
2
+ name: "dotnet",
3
+ description: "dotnet CLI, NuGet, MSBuild",
4
+ levels: {
5
+ restrictive: [
6
+ // dotnet info/version
7
+ { command: "dotnet --version", description: "Check .NET version" },
8
+ { command: "dotnet --info", description: "Display .NET information" },
9
+ { command: "dotnet --list-sdks", description: "List installed SDKs" },
10
+ { command: "dotnet --list-runtimes", description: "List installed runtimes" },
11
+ { command: "dotnet help", description: "Get .NET help" },
12
+ // Project info
13
+ { command: "dotnet list", description: "List project references" },
14
+ { command: "dotnet list package", description: "List NuGet packages" },
15
+ { command: "dotnet list reference", description: "List project references" },
16
+ // NuGet info
17
+ { command: "dotnet nuget list source", description: "List NuGet sources" },
18
+ { command: "nuget list", description: "List NuGet packages" },
19
+ { command: "nuget sources list", description: "List NuGet sources" },
20
+ // MSBuild info
21
+ { command: "dotnet msbuild -version", description: "Check MSBuild version" },
22
+ { command: "msbuild -version", description: "Check MSBuild version (direct)" },
23
+ ],
24
+ standard: [
25
+ // Build/Run
26
+ { command: "dotnet build", description: "Build the project" },
27
+ { command: "dotnet run", description: "Run the project" },
28
+ { command: "dotnet watch", description: "Watch and rebuild" },
29
+ { command: "dotnet clean", description: "Clean build output" },
30
+ { command: "dotnet publish", description: "Publish the project" },
31
+ // Testing
32
+ { command: "dotnet test", description: "Run tests" },
33
+ // Code quality
34
+ { command: "dotnet format", description: "Format code" },
35
+ // MSBuild
36
+ { command: "dotnet msbuild", description: "Run MSBuild" },
37
+ { command: "msbuild", description: "Run MSBuild (direct)" },
38
+ // EF Core migrations (read/generate)
39
+ { command: "dotnet ef migrations", description: "EF Core migrations" },
40
+ { command: "dotnet ef dbcontext", description: "EF Core DbContext commands" },
41
+ // User secrets (dev only)
42
+ { command: "dotnet user-secrets", description: "Manage user secrets" },
43
+ // Pack (create NuGet package)
44
+ { command: "dotnet pack", description: "Create NuGet package" },
45
+ ],
46
+ permissive: [
47
+ // Package management
48
+ { command: "dotnet add package", description: "Add NuGet package" },
49
+ { command: "dotnet add reference", description: "Add project reference" },
50
+ { command: "dotnet remove package", description: "Remove NuGet package" },
51
+ { command: "dotnet remove reference", description: "Remove project reference" },
52
+ // Restore (downloads packages)
53
+ { command: "dotnet restore", description: "Restore NuGet packages" },
54
+ // Project creation
55
+ { command: "dotnet new", description: "Create new project/file" },
56
+ { command: "dotnet sln", description: "Solution file operations" },
57
+ // Tool management
58
+ { command: "dotnet tool install", description: "Install .NET tool" },
59
+ { command: "dotnet tool uninstall", description: "Uninstall .NET tool" },
60
+ { command: "dotnet tool update", description: "Update .NET tool" },
61
+ { command: "dotnet tool restore", description: "Restore .NET tools" },
62
+ // NuGet publish
63
+ { command: "dotnet nuget push", description: "Push NuGet package" },
64
+ { command: "dotnet nuget delete", description: "Delete NuGet package" },
65
+ { command: "dotnet nuget add source", description: "Add NuGet source" },
66
+ { command: "dotnet nuget remove source", description: "Remove NuGet source" },
67
+ // EF Core database operations
68
+ { command: "dotnet ef database", description: "EF Core database operations" },
69
+ // Workload management
70
+ { command: "dotnet workload install", description: "Install workload" },
71
+ { command: "dotnet workload update", description: "Update workloads" },
72
+ { command: "dotnet workload uninstall", description: "Uninstall workload" },
73
+ ],
74
+ },
75
+ };
76
+ //# sourceMappingURL=dotnet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../src/templates/dotnet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TemplateDefinition } from "../types.js";
2
+ export declare const generalTemplate: TemplateDefinition;
3
+ //# sourceMappingURL=general.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../src/templates/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,EAAE,kBAyD7B,CAAC"}
@@ -0,0 +1,59 @@
1
+ export const generalTemplate = {
2
+ name: "general",
3
+ description: "Git and common CLI tools (ls, cat, grep, find, etc.)",
4
+ levels: {
5
+ restrictive: [
6
+ // Git read-only
7
+ { command: "git status", description: "Check working tree status" },
8
+ { command: "git log", description: "View commit history" },
9
+ { command: "git diff", description: "View changes" },
10
+ { command: "git branch", description: "List branches" },
11
+ { command: "git remote -v", description: "List remotes" },
12
+ { command: "git show", description: "Show commit details" },
13
+ { command: "git blame", description: "Show line-by-line authorship" },
14
+ // File system read-only
15
+ { command: "ls", description: "List directory contents" },
16
+ { command: "cat", description: "View file contents" },
17
+ { command: "head", description: "View file beginning" },
18
+ { command: "tail", description: "View file end" },
19
+ { command: "grep", description: "Search file contents" },
20
+ { command: "find", description: "Find files" },
21
+ { command: "wc", description: "Count lines/words/chars" },
22
+ { command: "tree", description: "Display directory tree" },
23
+ { command: "pwd", description: "Print working directory" },
24
+ { command: "which", description: "Locate a command" },
25
+ { command: "echo", description: "Print text" },
26
+ { command: "env", description: "View environment variables" },
27
+ { command: "printenv", description: "Print environment variables" },
28
+ ],
29
+ standard: [
30
+ // Git write operations
31
+ { command: "git add", description: "Stage changes" },
32
+ { command: "git commit", description: "Create commits" },
33
+ { command: "git push", description: "Push to remote" },
34
+ { command: "git pull", description: "Pull from remote" },
35
+ { command: "git fetch", description: "Fetch from remote" },
36
+ { command: "git checkout", description: "Switch branches or restore files" },
37
+ { command: "git switch", description: "Switch branches" },
38
+ { command: "git merge", description: "Merge branches" },
39
+ { command: "git stash", description: "Stash changes" },
40
+ { command: "git tag", description: "Create tags" },
41
+ // File write operations
42
+ { command: "mkdir", description: "Create directories" },
43
+ { command: "touch", description: "Create empty files" },
44
+ { command: "cp", description: "Copy files" },
45
+ { command: "mv", description: "Move/rename files" },
46
+ ],
47
+ permissive: [
48
+ // Git advanced operations
49
+ { command: "git rebase", description: "Rebase branches" },
50
+ { command: "git reset", description: "Reset changes" },
51
+ { command: "git cherry-pick", description: "Cherry-pick commits" },
52
+ { command: "git revert", description: "Revert commits" },
53
+ { command: "git clean", description: "Clean untracked files" },
54
+ // File deletion (non-recursive)
55
+ { command: "rm", description: "Remove files (use with caution)" },
56
+ ],
57
+ },
58
+ };
59
+ //# sourceMappingURL=general.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general.js","sourceRoot":"","sources":["../../src/templates/general.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { TemplateDefinition, TemplateRegistry } from "../types.js";
2
+ import { isInitialized, resetLoader, getTemplatesDir } from "./loader.js";
3
+ export { isInitialized, resetLoader, getTemplatesDir };
4
+ /**
5
+ * Get all loaded templates.
6
+ */
7
+ export declare function templates(): TemplateRegistry;
8
+ /**
9
+ * Get a template by name.
10
+ */
11
+ export declare function getTemplate(name: string): TemplateDefinition | undefined;
12
+ /**
13
+ * Get multiple templates by name.
14
+ * Returns templates that were found and an array of names that weren't found.
15
+ */
16
+ export declare function getTemplates(names: string[]): {
17
+ found: TemplateDefinition[];
18
+ notFound: string[];
19
+ };
20
+ /**
21
+ * List all available template names.
22
+ */
23
+ export declare function listTemplateNames(): string[];
24
+ /**
25
+ * List all templates with descriptions and categories.
26
+ */
27
+ export declare function listTemplates(): Array<{
28
+ name: string;
29
+ description: string;
30
+ category?: string;
31
+ }>;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAEL,aAAa,EACb,WAAW,EACX,eAAe,EAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAEvD;;GAEG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAGxE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAC7C,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAeA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAG5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/F"}
@@ -0,0 +1,54 @@
1
+ import { getTemplates as getLoadedTemplates, isInitialized, resetLoader, getTemplatesDir, } from "./loader.js";
2
+ // Re-export from loader
3
+ export { isInitialized, resetLoader, getTemplatesDir };
4
+ /**
5
+ * Get all loaded templates.
6
+ */
7
+ export function templates() {
8
+ return getLoadedTemplates();
9
+ }
10
+ /**
11
+ * Get a template by name.
12
+ */
13
+ export function getTemplate(name) {
14
+ const registry = getLoadedTemplates();
15
+ return registry[name.toLowerCase()];
16
+ }
17
+ /**
18
+ * Get multiple templates by name.
19
+ * Returns templates that were found and an array of names that weren't found.
20
+ */
21
+ export function getTemplates(names) {
22
+ const registry = getLoadedTemplates();
23
+ const found = [];
24
+ const notFound = [];
25
+ for (const name of names) {
26
+ const template = registry[name.toLowerCase()];
27
+ if (template) {
28
+ found.push(template);
29
+ }
30
+ else {
31
+ notFound.push(name);
32
+ }
33
+ }
34
+ return { found, notFound };
35
+ }
36
+ /**
37
+ * List all available template names.
38
+ */
39
+ export function listTemplateNames() {
40
+ const registry = getLoadedTemplates();
41
+ return Object.keys(registry);
42
+ }
43
+ /**
44
+ * List all templates with descriptions and categories.
45
+ */
46
+ export function listTemplates() {
47
+ const registry = getLoadedTemplates();
48
+ return Object.entries(registry).map(([name, template]) => ({
49
+ name,
50
+ description: template.description,
51
+ category: template.category,
52
+ }));
53
+ }
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAe;IAI1C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI;QACJ,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { TemplateRegistry } from "../types.js";
2
+ /**
3
+ * Get the loaded templates registry.
4
+ * Loads templates on first access (lazy initialization).
5
+ */
6
+ export declare function getTemplates(): TemplateRegistry;
7
+ /**
8
+ * Check if templates have been loaded.
9
+ */
10
+ export declare function isInitialized(): boolean;
11
+ /**
12
+ * Reset the loader state (useful for testing).
13
+ */
14
+ export declare function resetLoader(): void;
15
+ /**
16
+ * Get the templates directory path.
17
+ */
18
+ export declare function getTemplatesDir(): string;
19
+ //# sourceMappingURL=loader.d.ts.map