ccjk 9.10.1 → 9.11.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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, unlinkSync, mkdirSync, copyFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
3
|
import { mkdir, writeFile as writeFile$1, rename, unlink } from 'node:fs/promises';
|
|
4
4
|
import { dirname, join } from 'pathe';
|
|
5
5
|
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { SETTINGS_FILE } from './constants.mjs';
|
|
2
|
+
import { exists } from './fs-operations.mjs';
|
|
3
|
+
import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
|
|
4
|
+
import 'node:os';
|
|
5
|
+
import 'pathe';
|
|
6
|
+
import './index.mjs';
|
|
7
|
+
import 'node:fs';
|
|
8
|
+
import 'node:process';
|
|
9
|
+
import 'node:url';
|
|
10
|
+
import 'i18next';
|
|
11
|
+
import 'i18next-fs-backend';
|
|
12
|
+
import 'node:crypto';
|
|
13
|
+
import 'node:fs/promises';
|
|
14
|
+
import 'dayjs';
|
|
15
|
+
|
|
16
|
+
const DEFAULT_SETTINGS_V2 = {
|
|
17
|
+
// Response language - empty means use system default
|
|
18
|
+
language: "",
|
|
19
|
+
// Plans directory - undefined means use default location
|
|
20
|
+
plansDirectory: void 0,
|
|
21
|
+
// Show turn duration - default false for cleaner output
|
|
22
|
+
showTurnDuration: false,
|
|
23
|
+
// Respect gitignore - default true for safety
|
|
24
|
+
respectGitignore: true,
|
|
25
|
+
// Auto-enable MCP servers after 5 uses
|
|
26
|
+
auto: {
|
|
27
|
+
mcp: 0
|
|
28
|
+
},
|
|
29
|
+
// Default agent - empty means use Claude's default
|
|
30
|
+
agent: "",
|
|
31
|
+
// Thinking configuration
|
|
32
|
+
thinking: {
|
|
33
|
+
enabled: false,
|
|
34
|
+
budgetTokens: 10240
|
|
35
|
+
},
|
|
36
|
+
// File suggestion using git
|
|
37
|
+
fileSuggestion: {
|
|
38
|
+
command: "git"
|
|
39
|
+
},
|
|
40
|
+
// Security defaults
|
|
41
|
+
allowUnsandboxedCommands: false,
|
|
42
|
+
disallowedTools: [],
|
|
43
|
+
// Attribution - empty means no custom attribution
|
|
44
|
+
attribution: "",
|
|
45
|
+
// Index configuration for context management
|
|
46
|
+
index: {
|
|
47
|
+
maxFiles: 1e4,
|
|
48
|
+
maxFileSize: 2097152
|
|
49
|
+
// 2MB
|
|
50
|
+
},
|
|
51
|
+
// Browser automation - default false for security
|
|
52
|
+
allowBrowser: false
|
|
53
|
+
};
|
|
54
|
+
function validateConfig(config) {
|
|
55
|
+
const errors = [];
|
|
56
|
+
if (config.model && !["opus", "sonnet", "sonnet[1m]", "custom", "default"].includes(config.model)) {
|
|
57
|
+
errors.push(`Invalid model: ${config.model}`);
|
|
58
|
+
}
|
|
59
|
+
if (config.thinking?.budgetTokens !== void 0) {
|
|
60
|
+
if (typeof config.thinking.budgetTokens !== "number" || config.thinking.budgetTokens < 0) {
|
|
61
|
+
errors.push("thinking.budgetTokens must be a positive number");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (config.auto?.mcp !== void 0) {
|
|
65
|
+
if (typeof config.auto.mcp !== "number" || config.auto.mcp < 0) {
|
|
66
|
+
errors.push("auto.mcp must be a positive number");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (config.index?.maxFiles !== void 0) {
|
|
70
|
+
if (typeof config.index.maxFiles !== "number" || config.index.maxFiles < 0) {
|
|
71
|
+
errors.push("index.maxFiles must be a positive number");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (config.index?.maxFileSize !== void 0) {
|
|
75
|
+
if (typeof config.index.maxFileSize !== "number" || config.index.maxFileSize < 0) {
|
|
76
|
+
errors.push("index.maxFileSize must be a positive number");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (config.disallowedTools && !Array.isArray(config.disallowedTools)) {
|
|
80
|
+
errors.push("disallowedTools must be an array");
|
|
81
|
+
}
|
|
82
|
+
return errors;
|
|
83
|
+
}
|
|
84
|
+
function migrateConfig(legacy) {
|
|
85
|
+
const migrated = { ...legacy };
|
|
86
|
+
if (migrated.permissions && !migrated.permissions.deny) {
|
|
87
|
+
migrated.permissions.deny = [];
|
|
88
|
+
}
|
|
89
|
+
if (migrated.language === void 0) {
|
|
90
|
+
migrated.language = DEFAULT_SETTINGS_V2.language;
|
|
91
|
+
}
|
|
92
|
+
if (migrated.plansDirectory === void 0) {
|
|
93
|
+
migrated.plansDirectory = DEFAULT_SETTINGS_V2.plansDirectory;
|
|
94
|
+
}
|
|
95
|
+
if (migrated.showTurnDuration === void 0) {
|
|
96
|
+
migrated.showTurnDuration = DEFAULT_SETTINGS_V2.showTurnDuration;
|
|
97
|
+
}
|
|
98
|
+
if (migrated.respectGitignore === void 0) {
|
|
99
|
+
migrated.respectGitignore = DEFAULT_SETTINGS_V2.respectGitignore;
|
|
100
|
+
}
|
|
101
|
+
if (migrated.auto === void 0) {
|
|
102
|
+
migrated.auto = { ...DEFAULT_SETTINGS_V2.auto };
|
|
103
|
+
}
|
|
104
|
+
if (migrated.agent === void 0) {
|
|
105
|
+
migrated.agent = DEFAULT_SETTINGS_V2.agent;
|
|
106
|
+
}
|
|
107
|
+
if (migrated.thinking === void 0) {
|
|
108
|
+
migrated.thinking = { ...DEFAULT_SETTINGS_V2.thinking };
|
|
109
|
+
}
|
|
110
|
+
if (migrated.fileSuggestion === void 0) {
|
|
111
|
+
migrated.fileSuggestion = { ...DEFAULT_SETTINGS_V2.fileSuggestion };
|
|
112
|
+
}
|
|
113
|
+
if (migrated.allowUnsandboxedCommands === void 0) {
|
|
114
|
+
migrated.allowUnsandboxedCommands = DEFAULT_SETTINGS_V2.allowUnsandboxedCommands;
|
|
115
|
+
}
|
|
116
|
+
if (migrated.disallowedTools === void 0) {
|
|
117
|
+
migrated.disallowedTools = [...DEFAULT_SETTINGS_V2.disallowedTools || []];
|
|
118
|
+
}
|
|
119
|
+
if (migrated.attribution === void 0) {
|
|
120
|
+
migrated.attribution = DEFAULT_SETTINGS_V2.attribution;
|
|
121
|
+
}
|
|
122
|
+
if (migrated.index === void 0) {
|
|
123
|
+
migrated.index = { ...DEFAULT_SETTINGS_V2.index };
|
|
124
|
+
}
|
|
125
|
+
if (migrated.allowBrowser === void 0) {
|
|
126
|
+
migrated.allowBrowser = DEFAULT_SETTINGS_V2.allowBrowser;
|
|
127
|
+
}
|
|
128
|
+
const FILE_TOOL_PERMISSIONS = ["Read(*)", "Write(*)", "Edit(*)", "NotebookEdit(*)"];
|
|
129
|
+
if (migrated.permissions?.allow) {
|
|
130
|
+
const missing = FILE_TOOL_PERMISSIONS.filter((p) => !migrated.permissions.allow.includes(p));
|
|
131
|
+
if (missing.length > 0) {
|
|
132
|
+
migrated.permissions.allow = [...migrated.permissions.allow, ...missing];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return migrated;
|
|
136
|
+
}
|
|
137
|
+
function saveConfigWithMigration(config) {
|
|
138
|
+
const validationErrors = validateConfig(config);
|
|
139
|
+
if (validationErrors.length > 0) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
validationErrors
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
writeJsonConfig(SETTINGS_FILE, config);
|
|
147
|
+
return {
|
|
148
|
+
success: true,
|
|
149
|
+
validationErrors: []
|
|
150
|
+
};
|
|
151
|
+
} catch (error) {
|
|
152
|
+
validationErrors.push(`Failed to save config: ${error}`);
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
validationErrors
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function runMigration() {
|
|
160
|
+
if (!exists(SETTINGS_FILE)) {
|
|
161
|
+
return { success: false, wasMigrated: false, validationErrors: ["No configuration file found"] };
|
|
162
|
+
}
|
|
163
|
+
const config = readJsonConfig(SETTINGS_FILE);
|
|
164
|
+
if (!config) {
|
|
165
|
+
return { success: false, wasMigrated: false, validationErrors: ["Failed to parse settings"] };
|
|
166
|
+
}
|
|
167
|
+
const migrated = migrateConfig(config);
|
|
168
|
+
if (JSON.stringify(config) === JSON.stringify(migrated)) {
|
|
169
|
+
return { success: true, wasMigrated: false, validationErrors: [] };
|
|
170
|
+
}
|
|
171
|
+
const result = saveConfigWithMigration(migrated);
|
|
172
|
+
return {
|
|
173
|
+
success: result.success,
|
|
174
|
+
wasMigrated: true,
|
|
175
|
+
validationErrors: result.validationErrors
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export { DEFAULT_SETTINGS_V2, migrateConfig, runMigration, saveConfigWithMigration, validateConfig };
|
package/dist/chunks/package.mjs
CHANGED
|
@@ -416,6 +416,14 @@ class ZcfUninstaller {
|
|
|
416
416
|
warnings: []
|
|
417
417
|
};
|
|
418
418
|
try {
|
|
419
|
+
const backupPath = await this.createBackupBeforeUninstall();
|
|
420
|
+
if (backupPath) {
|
|
421
|
+
console.log(ansis.green(`
|
|
422
|
+
\u2714 ${i18n.t("uninstall:backupCreated", { path: backupPath })}`));
|
|
423
|
+
console.log(ansis.cyan(` ${i18n.t("uninstall:backupLocation")}: ${backupPath}`));
|
|
424
|
+
console.log(ansis.gray(` ${i18n.t("uninstall:backupRestoreHint")}`));
|
|
425
|
+
console.log();
|
|
426
|
+
}
|
|
419
427
|
const directoriesToRemove = [
|
|
420
428
|
{ path: join(homedir(), ".claude"), name: "~/.claude/" },
|
|
421
429
|
{ path: join(homedir(), ".claude.json"), name: "~/.claude.json" },
|
|
@@ -539,6 +547,38 @@ class ZcfUninstaller {
|
|
|
539
547
|
};
|
|
540
548
|
}
|
|
541
549
|
}
|
|
550
|
+
/**
|
|
551
|
+
* Create backup before complete uninstall
|
|
552
|
+
* Saves important files to ~/.ccjk/uninstall_backups/ to prevent loss
|
|
553
|
+
*/
|
|
554
|
+
async createBackupBeforeUninstall() {
|
|
555
|
+
try {
|
|
556
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, -5);
|
|
557
|
+
const backupDir = join(homedir(), ".ccjk", "uninstall_backups", `backup_${timestamp}`);
|
|
558
|
+
await promises.mkdir(backupDir, { recursive: true });
|
|
559
|
+
const filesToBackup = [
|
|
560
|
+
{ src: join(homedir(), ".claude", "settings.json"), name: "settings.json" },
|
|
561
|
+
{ src: join(homedir(), ".claude", "claude.json"), name: "claude.json" },
|
|
562
|
+
{ src: join(homedir(), ".claude", "CLAUDE.md"), name: "CLAUDE.md" },
|
|
563
|
+
{ src: join(homedir(), ".claude", "keybindings.json"), name: "keybindings.json" }
|
|
564
|
+
];
|
|
565
|
+
let backedUpCount = 0;
|
|
566
|
+
for (const file of filesToBackup) {
|
|
567
|
+
if (await pathExists(file.src)) {
|
|
568
|
+
try {
|
|
569
|
+
await promises.copyFile(file.src, join(backupDir, file.name));
|
|
570
|
+
backedUpCount++;
|
|
571
|
+
} catch (error) {
|
|
572
|
+
console.warn(`Failed to backup ${file.name}: ${error.message}`);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return backedUpCount > 0 ? backupDir : null;
|
|
577
|
+
} catch (error) {
|
|
578
|
+
console.error(`Failed to create backup: ${error.message}`);
|
|
579
|
+
return null;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
542
582
|
}
|
|
543
583
|
|
|
544
584
|
async function uninstall(options = {}) {
|
package/dist/cli.mjs
CHANGED
|
@@ -1621,6 +1621,11 @@ function customizeHelpLazy(_sections, version) {
|
|
|
1621
1621
|
async function runLazyCli() {
|
|
1622
1622
|
const spinner = await showStartupSpinner();
|
|
1623
1623
|
try {
|
|
1624
|
+
try {
|
|
1625
|
+
const { runMigration } = await import('./chunks/migrator.mjs');
|
|
1626
|
+
runMigration();
|
|
1627
|
+
} catch {
|
|
1628
|
+
}
|
|
1624
1629
|
bootstrapCloudServices();
|
|
1625
1630
|
const handled = await tryQuickProviderLaunch();
|
|
1626
1631
|
if (handled) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccjk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.11.0",
|
|
5
5
|
"packageManager": "pnpm@10.17.1",
|
|
6
6
|
"description": "CCJK v9.0.0 - Revolutionary AI Development Platform with Enterprise Security, Streaming Cloud Sync, CRDT Conflict Resolution, and Unified V3 Architecture",
|
|
7
7
|
"author": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "CCJK settings template — auto-migrated on upgrade",
|
|
4
4
|
|
|
5
5
|
"model": "default",
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"respectGitignore": true,
|
|
19
19
|
|
|
20
20
|
"auto": {
|
|
21
|
-
"mcp":
|
|
21
|
+
"mcp": 0
|
|
22
22
|
},
|
|
23
23
|
|
|
24
24
|
"agent": "",
|
|
@@ -81,7 +81,11 @@
|
|
|
81
81
|
"Bash(touch *)",
|
|
82
82
|
"Bash(cp *)",
|
|
83
83
|
"Bash(mv *)",
|
|
84
|
-
"Bash(chmod *)"
|
|
84
|
+
"Bash(chmod *)",
|
|
85
|
+
"Read(*)",
|
|
86
|
+
"Edit(*)",
|
|
87
|
+
"Write(*)",
|
|
88
|
+
"NotebookEdit(*)"
|
|
85
89
|
]
|
|
86
90
|
},
|
|
87
91
|
|