claude-settings-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/bin/ccc.mjs +2 -0
  4. package/dist/commands/backup.d.ts +3 -0
  5. package/dist/commands/backup.d.ts.map +1 -0
  6. package/dist/commands/backup.js +55 -0
  7. package/dist/commands/backup.js.map +1 -0
  8. package/dist/commands/config.d.ts +3 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +135 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/io.d.ts +4 -0
  13. package/dist/commands/io.d.ts.map +1 -0
  14. package/dist/commands/io.js +69 -0
  15. package/dist/commands/io.js.map +1 -0
  16. package/dist/commands/plugin.d.ts +3 -0
  17. package/dist/commands/plugin.d.ts.map +1 -0
  18. package/dist/commands/plugin.js +77 -0
  19. package/dist/commands/plugin.js.map +1 -0
  20. package/dist/commands/preset.d.ts +3 -0
  21. package/dist/commands/preset.d.ts.map +1 -0
  22. package/dist/commands/preset.js +118 -0
  23. package/dist/commands/preset.js.map +1 -0
  24. package/dist/commands/project.d.ts +3 -0
  25. package/dist/commands/project.d.ts.map +1 -0
  26. package/dist/commands/project.js +61 -0
  27. package/dist/commands/project.js.map +1 -0
  28. package/dist/core/diff.d.ts +3 -0
  29. package/dist/core/diff.d.ts.map +1 -0
  30. package/dist/core/diff.js +45 -0
  31. package/dist/core/diff.js.map +1 -0
  32. package/dist/core/paths.d.ts +12 -0
  33. package/dist/core/paths.d.ts.map +1 -0
  34. package/dist/core/paths.js +34 -0
  35. package/dist/core/paths.js.map +1 -0
  36. package/dist/core/reader.d.ts +13 -0
  37. package/dist/core/reader.d.ts.map +1 -0
  38. package/dist/core/reader.js +65 -0
  39. package/dist/core/reader.js.map +1 -0
  40. package/dist/core/switcher.d.ts +12 -0
  41. package/dist/core/switcher.d.ts.map +1 -0
  42. package/dist/core/switcher.js +37 -0
  43. package/dist/core/switcher.js.map +1 -0
  44. package/dist/core/writer.d.ts +11 -0
  45. package/dist/core/writer.d.ts.map +1 -0
  46. package/dist/core/writer.js +34 -0
  47. package/dist/core/writer.js.map +1 -0
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +67 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/schema/plugins.d.ts +70 -0
  53. package/dist/schema/plugins.d.ts.map +1 -0
  54. package/dist/schema/plugins.js +15 -0
  55. package/dist/schema/plugins.js.map +1 -0
  56. package/dist/schema/project.d.ts +37 -0
  57. package/dist/schema/project.d.ts.map +1 -0
  58. package/dist/schema/project.js +16 -0
  59. package/dist/schema/project.js.map +1 -0
  60. package/dist/schema/settings.d.ts +37 -0
  61. package/dist/schema/settings.d.ts.map +1 -0
  62. package/dist/schema/settings.js +30 -0
  63. package/dist/schema/settings.js.map +1 -0
  64. package/dist/types/index.d.ts +37 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +2 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/utils/backup.d.ts +6 -0
  69. package/dist/utils/backup.d.ts.map +1 -0
  70. package/dist/utils/backup.js +34 -0
  71. package/dist/utils/backup.js.map +1 -0
  72. package/dist/utils/errors.d.ts +18 -0
  73. package/dist/utils/errors.d.ts.map +1 -0
  74. package/dist/utils/errors.js +42 -0
  75. package/dist/utils/errors.js.map +1 -0
  76. package/dist/utils/logger.d.ts +7 -0
  77. package/dist/utils/logger.d.ts.map +1 -0
  78. package/dist/utils/logger.js +18 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/safe-json.d.ts +3 -0
  81. package/dist/utils/safe-json.d.ts.map +1 -0
  82. package/dist/utils/safe-json.js +25 -0
  83. package/dist/utils/safe-json.js.map +1 -0
  84. package/package.json +52 -0
@@ -0,0 +1,70 @@
1
+ import { z } from 'zod';
2
+ export declare const PluginEntrySchema: z.ZodObject<{
3
+ scope: z.ZodString;
4
+ installPath: z.ZodString;
5
+ version: z.ZodString;
6
+ installedAt: z.ZodString;
7
+ lastUpdated: z.ZodString;
8
+ gitCommitSha: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ scope: string;
11
+ installPath: string;
12
+ version: string;
13
+ installedAt: string;
14
+ lastUpdated: string;
15
+ gitCommitSha: string;
16
+ }, {
17
+ scope: string;
18
+ installPath: string;
19
+ version: string;
20
+ installedAt: string;
21
+ lastUpdated: string;
22
+ gitCommitSha: string;
23
+ }>;
24
+ export declare const InstalledPluginsSchema: z.ZodObject<{
25
+ version: z.ZodNumber;
26
+ plugins: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
27
+ scope: z.ZodString;
28
+ installPath: z.ZodString;
29
+ version: z.ZodString;
30
+ installedAt: z.ZodString;
31
+ lastUpdated: z.ZodString;
32
+ gitCommitSha: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ scope: string;
35
+ installPath: string;
36
+ version: string;
37
+ installedAt: string;
38
+ lastUpdated: string;
39
+ gitCommitSha: string;
40
+ }, {
41
+ scope: string;
42
+ installPath: string;
43
+ version: string;
44
+ installedAt: string;
45
+ lastUpdated: string;
46
+ gitCommitSha: string;
47
+ }>, "many">>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ plugins: Record<string, {
50
+ scope: string;
51
+ installPath: string;
52
+ version: string;
53
+ installedAt: string;
54
+ lastUpdated: string;
55
+ gitCommitSha: string;
56
+ }[]>;
57
+ version: number;
58
+ }, {
59
+ plugins: Record<string, {
60
+ scope: string;
61
+ installPath: string;
62
+ version: string;
63
+ installedAt: string;
64
+ lastUpdated: string;
65
+ gitCommitSha: string;
66
+ }[]>;
67
+ version: number;
68
+ }>;
69
+ export declare const BlocklistSchema: z.ZodRecord<z.ZodString, z.ZodString>;
70
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/schema/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAO5B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGjC,CAAC;AAEH,eAAO,MAAM,eAAe,uCAAmC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export const PluginEntrySchema = z.object({
3
+ scope: z.string(),
4
+ installPath: z.string(),
5
+ version: z.string(),
6
+ installedAt: z.string(),
7
+ lastUpdated: z.string(),
8
+ gitCommitSha: z.string(),
9
+ });
10
+ export const InstalledPluginsSchema = z.object({
11
+ version: z.number(),
12
+ plugins: z.record(z.string(), z.array(PluginEntrySchema)),
13
+ });
14
+ export const BlocklistSchema = z.record(z.string(), z.string());
15
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/schema/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export declare const ProjectConfigSchema: z.ZodObject<{
3
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
4
+ ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
5
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6
+ permissions: z.ZodOptional<z.ZodObject<{
7
+ defaultMode: z.ZodOptional<z.ZodEnum<["default", "bypassPermissions", "acceptEdits"]>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
10
+ }, {
11
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
12
+ }>>;
13
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
14
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
+ ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
+ permissions: z.ZodOptional<z.ZodObject<{
18
+ defaultMode: z.ZodOptional<z.ZodEnum<["default", "bypassPermissions", "acceptEdits"]>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
21
+ }, {
22
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
23
+ }>>;
24
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
25
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
26
+ ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
28
+ permissions: z.ZodOptional<z.ZodObject<{
29
+ defaultMode: z.ZodOptional<z.ZodEnum<["default", "bypassPermissions", "acceptEdits"]>>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
32
+ }, {
33
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
34
+ }>>;
35
+ }, z.ZodTypeAny, "passthrough">>;
36
+ export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
37
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/schema/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAahB,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export const ProjectConfigSchema = z
3
+ .object({
4
+ allowedTools: z.array(z.string()).optional(),
5
+ ignorePatterns: z.array(z.string()).optional(),
6
+ mcpServers: z.record(z.string(), z.unknown()).optional(),
7
+ permissions: z
8
+ .object({
9
+ defaultMode: z
10
+ .enum(['default', 'bypassPermissions', 'acceptEdits'])
11
+ .optional(),
12
+ })
13
+ .optional(),
14
+ })
15
+ .passthrough();
16
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/schema/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxD,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,WAAW,EAAE,CAAC;aACX,IAAI,CAAC,CAAC,SAAS,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;aACrD,QAAQ,EAAE;KACd,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export declare const SENSITIVE_KEYS: string[];
3
+ export declare const SettingsSchema: z.ZodObject<{
4
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
5
+ permissions: z.ZodOptional<z.ZodObject<{
6
+ defaultMode: z.ZodOptional<z.ZodEnum<["default", "bypassPermissions", "acceptEdits"]>>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
9
+ }, {
10
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
11
+ }>>;
12
+ enabledPlugins: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
13
+ language: z.ZodOptional<z.ZodString>;
14
+ alwaysThinkingEnabled: z.ZodOptional<z.ZodBoolean>;
15
+ skipDangerousModePermissionPrompt: z.ZodOptional<z.ZodBoolean>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ env: Record<string, string>;
18
+ permissions?: {
19
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
20
+ } | undefined;
21
+ enabledPlugins?: Record<string, boolean> | undefined;
22
+ language?: string | undefined;
23
+ alwaysThinkingEnabled?: boolean | undefined;
24
+ skipDangerousModePermissionPrompt?: boolean | undefined;
25
+ }, {
26
+ env?: Record<string, string> | undefined;
27
+ permissions?: {
28
+ defaultMode?: "default" | "bypassPermissions" | "acceptEdits" | undefined;
29
+ } | undefined;
30
+ enabledPlugins?: Record<string, boolean> | undefined;
31
+ language?: string | undefined;
32
+ alwaysThinkingEnabled?: boolean | undefined;
33
+ skipDangerousModePermissionPrompt?: boolean | undefined;
34
+ }>;
35
+ export type Settings = z.infer<typeof SettingsSchema>;
36
+ export declare function maskValue(key: string, value: string): string;
37
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/schema/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc,UAK1B,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAazB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM5D"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ export const SENSITIVE_KEYS = [
3
+ 'ANTHROPIC_AUTH_TOKEN',
4
+ 'ANTHROPIC_API_KEY',
5
+ 'API_KEY',
6
+ 'SECRET',
7
+ ];
8
+ export const SettingsSchema = z.object({
9
+ env: z.record(z.string(), z.string()).default({}),
10
+ permissions: z
11
+ .object({
12
+ defaultMode: z
13
+ .enum(['default', 'bypassPermissions', 'acceptEdits'])
14
+ .optional(),
15
+ })
16
+ .optional(),
17
+ enabledPlugins: z.record(z.string(), z.boolean()).optional(),
18
+ language: z.string().optional(),
19
+ alwaysThinkingEnabled: z.boolean().optional(),
20
+ skipDangerousModePermissionPrompt: z.boolean().optional(),
21
+ });
22
+ export function maskValue(key, value) {
23
+ if (SENSITIVE_KEYS.some((k) => key.toUpperCase().includes(k))) {
24
+ if (value.length <= 8)
25
+ return '****';
26
+ return value.slice(0, 4) + '****';
27
+ }
28
+ return value;
29
+ }
30
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/schema/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,sBAAsB;IACtB,mBAAmB;IACnB,SAAS;IACT,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,WAAW,EAAE,CAAC;aACX,IAAI,CAAC,CAAC,SAAS,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;aACrD,QAAQ,EAAE;KACd,CAAC;SACD,QAAQ,EAAE;IACb,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7C,iCAAiC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC1D,CAAC,CAAC;AAIH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface Settings {
2
+ env: Record<string, string>;
3
+ permissions?: {
4
+ defaultMode?: 'default' | 'bypassPermissions' | 'acceptEdits';
5
+ };
6
+ enabledPlugins?: Record<string, boolean>;
7
+ language?: string;
8
+ alwaysThinkingEnabled?: boolean;
9
+ skipDangerousModePermissionPrompt?: boolean;
10
+ [key: string]: unknown;
11
+ }
12
+ export interface InstalledPlugins {
13
+ version: number;
14
+ plugins: Record<string, PluginEntry[]>;
15
+ }
16
+ export interface PluginEntry {
17
+ scope: string;
18
+ installPath: string;
19
+ version: string;
20
+ installedAt: string;
21
+ lastUpdated: string;
22
+ gitCommitSha: string;
23
+ }
24
+ export interface Blocklist {
25
+ [pluginId: string]: string;
26
+ }
27
+ export interface ExportData {
28
+ version: string;
29
+ exportedAt: string;
30
+ settings: Settings;
31
+ presets: Record<string, Settings>;
32
+ plugins?: {
33
+ installed: InstalledPlugins;
34
+ blocklist: Blocklist;
35
+ };
36
+ }
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC;KAC/D,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,gBAAgB,CAAC;QAC5B,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export declare class BackupManager {
2
+ static createBackup(filePath: string): Promise<string | null>;
3
+ static listBackups(): string[];
4
+ static restoreBackup(backupName: string, targetPath: string): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAa;WACX,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAenE,MAAM,CAAC,WAAW,IAAI,MAAM,EAAE;WAQjB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOlF"}
@@ -0,0 +1,34 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import { BACKUPS_DIR } from '../core/paths.js';
4
+ export class BackupManager {
5
+ static async createBackup(filePath) {
6
+ if (!(await fs.pathExists(filePath)))
7
+ return null;
8
+ await fs.ensureDir(BACKUPS_DIR);
9
+ const timestamp = new Date()
10
+ .toISOString()
11
+ .replace(/[:.]/g, '-')
12
+ .slice(0, 19);
13
+ const basename = path.basename(filePath, '.json');
14
+ const backupPath = path.join(BACKUPS_DIR, `${basename}_${timestamp}.json`);
15
+ await fs.copy(filePath, backupPath);
16
+ return backupPath;
17
+ }
18
+ static listBackups() {
19
+ try {
20
+ return fs.readdirSync(BACKUPS_DIR).filter((f) => f.endsWith('.json')).sort().reverse();
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ static async restoreBackup(backupName, targetPath) {
27
+ const backupPath = path.join(BACKUPS_DIR, backupName);
28
+ if (!(await fs.pathExists(backupPath))) {
29
+ throw new Error(`Backup "${backupName}" not found`);
30
+ }
31
+ await fs.copy(backupPath, targetPath);
32
+ }
33
+ }
34
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,aAAa;IACxB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAgB;QACxC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;aACzB,WAAW,EAAE;aACb,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,IAAI,SAAS,OAAO,CAAC,CAAC;QAE3E,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACzF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,UAAkB,EAAE,UAAkB;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,aAAa,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export declare class CccError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
5
+ export declare class PresetNotFoundError extends CccError {
6
+ constructor(name: string);
7
+ }
8
+ export declare class InvalidConfigError extends CccError {
9
+ constructor(filePath: string, message: string);
10
+ }
11
+ export declare class ConfigReadError extends CccError {
12
+ constructor(filePath: string, cause?: Error);
13
+ }
14
+ export declare class ConfigWriteError extends CccError {
15
+ constructor(filePath: string, cause?: Error);
16
+ }
17
+ export declare function handleError(err: unknown): never;
18
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,IAAI,EAAE,MAAM;CAMzB;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAG9C;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM5C;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;gBAChC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM5C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAS/C"}
@@ -0,0 +1,42 @@
1
+ import chalk from 'chalk';
2
+ export class CccError extends Error {
3
+ code;
4
+ constructor(message, code) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = 'CccError';
8
+ }
9
+ }
10
+ export class PresetNotFoundError extends CccError {
11
+ constructor(name) {
12
+ super(`Preset "${name}" not found. Run "ccc preset list" to see available presets.`, 'PRESET_NOT_FOUND');
13
+ }
14
+ }
15
+ export class InvalidConfigError extends CccError {
16
+ constructor(filePath, message) {
17
+ super(`Invalid config in ${filePath}:\n${message}`, 'INVALID_CONFIG');
18
+ }
19
+ }
20
+ export class ConfigReadError extends CccError {
21
+ constructor(filePath, cause) {
22
+ super(`Failed to read ${filePath}: ${cause?.message ?? 'unknown error'}`, 'CONFIG_READ_ERROR');
23
+ }
24
+ }
25
+ export class ConfigWriteError extends CccError {
26
+ constructor(filePath, cause) {
27
+ super(`Failed to write ${filePath}: ${cause?.message ?? 'unknown error'}`, 'CONFIG_WRITE_ERROR');
28
+ }
29
+ }
30
+ export function handleError(err) {
31
+ if (err instanceof CccError) {
32
+ console.error(chalk.red(`Error: ${err.message}`));
33
+ }
34
+ else if (err instanceof Error) {
35
+ console.error(chalk.red(`Error: ${err.message}`));
36
+ }
37
+ else {
38
+ console.error(chalk.red(`Unknown error: ${String(err)}`));
39
+ }
40
+ process.exit(1);
41
+ }
42
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IAFlB,YACE,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,IAAY;QACtB,KAAK,CACH,WAAW,IAAI,8DAA8D,EAC7E,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,QAAgB,EAAE,OAAe;QAC3C,KAAK,CAAC,qBAAqB,QAAQ,MAAM,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACxE,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,QAAgB,EAAE,KAAa;QACzC,KAAK,CACH,kBAAkB,QAAQ,KAAK,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAClE,mBAAmB,CACpB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAC5C,YAAY,QAAgB,EAAE,KAAa;QACzC,KAAK,CACH,mBAAmB,QAAQ,KAAK,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EACnE,oBAAoB,CACrB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Ora } from 'ora';
2
+ export declare function spinner(text: string): Ora;
3
+ export declare function success(message: string): void;
4
+ export declare function info(message: string): void;
5
+ export declare function warn(message: string): void;
6
+ export declare function error(message: string): void;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C"}
@@ -0,0 +1,18 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ export function spinner(text) {
4
+ return ora(text).start();
5
+ }
6
+ export function success(message) {
7
+ console.log(chalk.green(`✓ ${message}`));
8
+ }
9
+ export function info(message) {
10
+ console.log(chalk.blue(`ℹ ${message}`));
11
+ }
12
+ export function warn(message) {
13
+ console.log(chalk.yellow(`⚠ ${message}`));
14
+ }
15
+ export function error(message) {
16
+ console.error(chalk.red(`✗ ${message}`));
17
+ }
18
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function readJsonSafe<T = unknown>(filePath: string): Promise<T>;
2
+ export declare function readJsonSafeSync<T = unknown>(filePath: string): T;
3
+ //# sourceMappingURL=safe-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-json.d.ts","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAS5E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CASjE"}
@@ -0,0 +1,25 @@
1
+ import fs from 'fs-extra';
2
+ import { ConfigReadError } from './errors.js';
3
+ export async function readJsonSafe(filePath) {
4
+ try {
5
+ return (await fs.readJson(filePath));
6
+ }
7
+ catch (err) {
8
+ if (err.code === 'ENOENT') {
9
+ throw new ConfigReadError(filePath, new Error('File not found'));
10
+ }
11
+ throw new ConfigReadError(filePath, err);
12
+ }
13
+ }
14
+ export function readJsonSafeSync(filePath) {
15
+ try {
16
+ return fs.readJsonSync(filePath);
17
+ }
18
+ catch (err) {
19
+ if (err.code === 'ENOENT') {
20
+ throw new ConfigReadError(filePath, new Error('File not found'));
21
+ }
22
+ throw new ConfigReadError(filePath, err);
23
+ }
24
+ }
25
+ //# sourceMappingURL=safe-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-json.js","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAc,QAAgB;IAC9D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,GAAY,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAc,QAAgB;IAC5D,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAM,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,GAAY,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "claude-settings-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to manage Claude Code configuration presets",
5
+ "type": "module",
6
+ "bin": {
7
+ "ccc": "bin/ccc.mjs"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "dist/"
12
+ ],
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.build.json",
17
+ "dev": "tsx src/index.ts",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "lint": "eslint src/",
21
+ "format": "prettier --write src/",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "claude",
26
+ "claude-code",
27
+ "config",
28
+ "cli",
29
+ "preset"
30
+ ],
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "dependencies": {
36
+ "chalk": "^5.3.0",
37
+ "commander": "^12.0.0",
38
+ "fs-extra": "^11.2.0",
39
+ "inquirer": "^9.0.0",
40
+ "ora": "^8.0.0",
41
+ "zod": "^3.22.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/fs-extra": "^11.0.0",
45
+ "@types/inquirer": "^9.0.9",
46
+ "@types/node": "^20.0.0",
47
+ "prettier": "^3.2.0",
48
+ "tsx": "^4.7.0",
49
+ "typescript": "^5.4.0",
50
+ "vitest": "^1.6.0"
51
+ }
52
+ }