ccjk 14.1.1 → 14.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.
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from 'node:fs';
3
3
  import process__default from 'node:process';
4
4
  import { SETTINGS_FILE } from './constants.mjs';
5
5
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
6
- import { r as runHealthCheck } from '../shared/ccjk.xkKNsC02.mjs';
6
+ import { r as runHealthCheck } from '../shared/ccjk.D6wx-rxT.mjs';
7
7
  import '../shared/ccjk.BAGoDD49.mjs';
8
8
  import 'node:os';
9
9
  import './index2.mjs';
@@ -82,7 +82,11 @@ class CloudSetupOrchestrator {
82
82
  duration: Date.now() - this.startTime
83
83
  };
84
84
  }
85
- const templates = await this.downloadTemplates(recommendations, options);
85
+ const templates = recommendations.source === "cloud" ? await this.downloadTemplates(recommendations, options) : {
86
+ requestId: "local-templates-skipped",
87
+ templates: {},
88
+ notFound: []
89
+ };
86
90
  const result = await this.executeInstallation(recommendations, templates, options);
87
91
  if (options.submitTelemetry !== false) {
88
92
  this.uploadTelemetry(result).catch(() => {
@@ -194,6 +198,7 @@ class CloudSetupOrchestrator {
194
198
  const data = response.data;
195
199
  const fingerprint = this.generateProjectFingerprint(analysis);
196
200
  const recommendations = {
201
+ source: "cloud",
197
202
  skills: data.recommendations.filter((r) => r.category === "skill"),
198
203
  mcpServices: data.recommendations.filter((r) => r.category === "mcp"),
199
204
  agents: data.recommendations.filter((r) => r.category === "agent"),
@@ -333,6 +338,7 @@ class CloudSetupOrchestrator {
333
338
  }
334
339
  const fingerprint = this.generateProjectFingerprint(analysis);
335
340
  return {
341
+ source: "local",
336
342
  skills: recommendations.filter((r) => r.category === "skill"),
337
343
  mcpServices: recommendations.filter((r) => r.category === "mcp"),
338
344
  agents: recommendations.filter((r) => r.category === "agent"),
@@ -505,8 +511,17 @@ class CloudSetupOrchestrator {
505
511
  }
506
512
  return templates;
507
513
  } catch (error) {
508
- this.logger.error("Failed to download templates:", error);
509
- throw error;
514
+ this.logger.warn("Failed to download templates, continuing without templates:", error);
515
+ return {
516
+ requestId: "template-download-failed",
517
+ templates: {},
518
+ notFound: [
519
+ ...recommendations.skills.map((r) => r.id),
520
+ ...recommendations.mcpServices.map((r) => r.id),
521
+ ...recommendations.agents.map((r) => r.id),
522
+ ...recommendations.hooks.map((r) => r.id)
523
+ ]
524
+ };
510
525
  }
511
526
  }
512
527
  /**
@@ -760,9 +775,10 @@ class CloudSetupOrchestrator {
760
775
  * Generate cloud insights report
761
776
  */
762
777
  async generateReport(result, recommendations, options) {
778
+ const reportExtension = options.reportFormat === "json" ? "json" : options.reportFormat === "html" ? "html" : "md";
763
779
  const reportPath = join(
764
780
  process.cwd(),
765
- `ccjk-setup-report-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}.${options.reportFormat || "md"}`
781
+ `ccjk-setup-report-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}.${reportExtension}`
766
782
  );
767
783
  let content = "";
768
784
  if (options.reportFormat === "json") {
@@ -1,4 +1,4 @@
1
- export { r as runHealthCheck } from '../shared/ccjk.xkKNsC02.mjs';
1
+ export { r as runHealthCheck } from '../shared/ccjk.D6wx-rxT.mjs';
2
2
  import 'node:fs';
3
3
  import './constants.mjs';
4
4
  import 'node:os';
@@ -1520,7 +1520,12 @@ async function init(options = {}) {
1520
1520
  apiKey: profile.apiKey,
1521
1521
  baseUrl: profile.baseUrl,
1522
1522
  model: profile.primaryModel,
1523
- fastModel: profile.defaultHaikuModel
1523
+ fastModel: profile.defaultHaikuModel,
1524
+ authType: profile.authType,
1525
+ primaryModel: profile.primaryModel,
1526
+ defaultHaikuModel: profile.defaultHaikuModel,
1527
+ defaultSonnetModel: profile.defaultSonnetModel,
1528
+ defaultOpusModel: profile.defaultOpusModel
1524
1529
  }
1525
1530
  ], profile.id || profile.name);
1526
1531
  } catch (error) {
@@ -1,3 +1,3 @@
1
- const version = "14.1.1";
1
+ const version = "14.1.2";
2
2
 
3
3
  export { version };
@@ -3,7 +3,7 @@ import { homedir } from 'node:os';
3
3
  import a from './index5.mjs';
4
4
  import { MetricsDisplay } from './metrics-display.mjs';
5
5
  import { getContextPersistence } from './persistence.mjs';
6
- import { r as runHealthCheck } from '../shared/ccjk.xkKNsC02.mjs';
6
+ import { r as runHealthCheck } from '../shared/ccjk.D6wx-rxT.mjs';
7
7
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
8
8
  import '../shared/ccjk.BAGoDD49.mjs';
9
9
  import 'better-sqlite3';
@@ -6,7 +6,7 @@ import { g as getRuntimeCapabilityDescriptor } from '../shared/ccjk.BO45TPXJ.mjs
6
6
  import { s as scanProject, r as resolveCodeType } from './code-type-resolver.mjs';
7
7
  import { MetricsDisplay } from './metrics-display.mjs';
8
8
  import { getContextPersistence } from './persistence.mjs';
9
- import { r as runHealthCheck } from '../shared/ccjk.xkKNsC02.mjs';
9
+ import { r as runHealthCheck } from '../shared/ccjk.D6wx-rxT.mjs';
10
10
  import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
11
11
  import '../shared/ccjk.BAGoDD49.mjs';
12
12
  import 'node:child_process';
@@ -237,9 +237,21 @@ function renderHooksSection(recommended, installed) {
237
237
  }
238
238
  return lines;
239
239
  }
240
- function renderClaudeCodeSection(defaults) {
240
+ function getRuntimeSectionTitle(codeTool) {
241
+ switch (codeTool) {
242
+ case "myclaude":
243
+ return "myclaude";
244
+ case "codex":
245
+ return "Codex";
246
+ case "claude-code":
247
+ return "Claude Code";
248
+ default:
249
+ return "Claude Runtime";
250
+ }
251
+ }
252
+ function renderClaudeCodeSection(defaults, codeTool) {
241
253
  const lines = [];
242
- lines.push(heading("Claude Code"));
254
+ lines.push(heading(getRuntimeSectionTitle(codeTool)));
243
255
  const version = defaults?.claudeCodeVersion;
244
256
  lines.push(` ${label("Version:".padEnd(14))} ${version ? val(version) : a.gray("not detected")}`);
245
257
  if (defaults?.nativeFeatures) {
@@ -259,26 +271,44 @@ function renderClaudeCodeSection(defaults) {
259
271
  }
260
272
  try {
261
273
  const settingsPath = join(homedir(), ".claude", "settings.json");
274
+ const myclaudePath = join(homedir(), ".claude.json");
262
275
  if (existsSync(settingsPath)) {
263
276
  const data = JSON.parse(readFileSync(settingsPath, "utf-8"));
264
277
  const env = data.env || {};
265
278
  const haiku = env.ANTHROPIC_DEFAULT_HAIKU_MODEL;
266
279
  const sonnet = env.ANTHROPIC_DEFAULT_SONNET_MODEL;
267
280
  const opus = env.ANTHROPIC_DEFAULT_OPUS_MODEL;
281
+ const primary = data.model || env.ANTHROPIC_MODEL;
268
282
  const hasAdaptive = Boolean(haiku || sonnet || opus);
283
+ if (existsSync(myclaudePath)) {
284
+ try {
285
+ const myclaudeData = JSON.parse(readFileSync(myclaudePath, "utf-8"));
286
+ const activeId = myclaudeData.myclaudeActiveProviderProfileId;
287
+ const activeProfile = Array.isArray(myclaudeData.myclaudeProviderProfiles) ? myclaudeData.myclaudeProviderProfiles.find((profile) => String(profile?.id) === String(activeId)) : null;
288
+ if (activeId) {
289
+ lines.push(` ${label("Provider:".padEnd(14))} ${val(`myclaude/${activeId}`)}`);
290
+ }
291
+ if (activeProfile?.baseUrl) {
292
+ lines.push(` ${label("API Base:".padEnd(14))} ${val(activeProfile.baseUrl)}`);
293
+ }
294
+ } catch {
295
+ }
296
+ }
269
297
  if (data.model && hasAdaptive) {
270
298
  lines.push(` ${label("Model:".padEnd(14))} ${a.red(data.model)} ${a.red("(overrides adaptive routing!)")}`);
271
299
  lines.push(` ${label("".padEnd(14))} ${a.yellow("Run: ccjk boost --fix-model")}`);
272
300
  } else if (hasAdaptive) {
273
301
  lines.push(` ${label("Routing:".padEnd(14))} ${a.green("adaptive")}`);
302
+ if (primary)
303
+ lines.push(` ${label(" Primary:".padEnd(14))} ${val(primary)}`);
274
304
  if (haiku)
275
305
  lines.push(` ${label(" Quick:".padEnd(14))} ${val(haiku)}`);
276
306
  if (sonnet)
277
307
  lines.push(` ${label(" Standard:".padEnd(14))} ${val(sonnet)}`);
278
308
  if (opus)
279
309
  lines.push(` ${label(" Complex:".padEnd(14))} ${val(opus)}`);
280
- } else if (data.model) {
281
- lines.push(` ${label("Model:".padEnd(14))} ${val(data.model)}`);
310
+ } else if (primary) {
311
+ lines.push(` ${label("Model:".padEnd(14))} ${val(primary)}`);
282
312
  }
283
313
  }
284
314
  } catch {
@@ -319,6 +349,11 @@ function renderHealthSection(report, compact) {
319
349
  const icon = STATUS_ICONS[r.status];
320
350
  const scoreText = a.gray(`${r.score}/${r.weight}`);
321
351
  lines.push(` ${icon} ${r.name.padEnd(18)} ${scoreText.padEnd(10)} ${a.gray(r.message)}`);
352
+ if (r.details?.length) {
353
+ for (const detail of r.details) {
354
+ lines.push(` ${a.gray(detail)}`);
355
+ }
356
+ }
322
357
  }
323
358
  }
324
359
  if (report.recommendations.length > 0) {
@@ -393,11 +428,11 @@ async function statusCommand(options = {}) {
393
428
  if (defaults) {
394
429
  sections.push(renderMcpSection(defaults.mcpServices, installed.mcpServers));
395
430
  sections.push(renderHooksSection(defaults.recommendedHooks, installed.hooks));
396
- sections.push(renderClaudeCodeSection(defaults));
431
+ sections.push(renderClaudeCodeSection(defaults, codeTool));
397
432
  } else {
398
433
  sections.push(renderMcpSection([], installed.mcpServers));
399
434
  sections.push(renderHooksSection([], installed.hooks));
400
- sections.push(renderClaudeCodeSection(null));
435
+ sections.push(renderClaudeCodeSection(null, codeTool));
401
436
  }
402
437
  sections.push(renderHealthSection(health, options.compact || false));
403
438
  try {
@@ -416,9 +451,12 @@ async function statusCommand(options = {}) {
416
451
  }
417
452
  console.log();
418
453
  const fixable = health.results.filter((r) => r.status !== "pass" && r.command);
419
- if (fixable.length > 0 && !options.json) {
454
+ if (fixable.length > 0 && !options.json && options.fix) {
420
455
  const { autoFix } = await import('./auto-fixer.mjs');
421
- await autoFix(fixable);
456
+ await autoFix(fixable, {
457
+ autoApprove: options.yes,
458
+ dryRun: options.dryRun
459
+ });
422
460
  }
423
461
  } catch (error) {
424
462
  console.error(a.red("Error running status command:"), error);
package/dist/cli.mjs CHANGED
@@ -1724,14 +1724,20 @@ ${ansis.yellow("By Status:")}`);
1724
1724
  tier: "core",
1725
1725
  options: [
1726
1726
  { flags: "--json", description: "Output as JSON" },
1727
- { flags: "--compact", description: "Compact output" }
1727
+ { flags: "--compact", description: "Compact output" },
1728
+ { flags: "--fix", description: "Run fixable recommendations" },
1729
+ { flags: "--yes, -y", description: "Auto-confirm fixes" },
1730
+ { flags: "--dry-run", description: "Preview fix commands without executing" }
1728
1731
  ],
1729
1732
  loader: async () => {
1730
1733
  const { statusCommand } = await import('./chunks/status.mjs');
1731
1734
  return async (options) => {
1732
1735
  await statusCommand({
1733
1736
  json: options.json,
1734
- compact: options.compact
1737
+ compact: options.compact,
1738
+ fix: options.fix,
1739
+ yes: options.yes,
1740
+ dryRun: options.dryRun
1735
1741
  });
1736
1742
  };
1737
1743
  }
@@ -161,6 +161,27 @@ const mcpCheck = {
161
161
  }
162
162
  };
163
163
 
164
+ function collectModelDetails(settings) {
165
+ const env = settings?.env || {};
166
+ const details = [];
167
+ const primaryModel = settings?.model && settings.model !== "default" ? settings.model : env.ANTHROPIC_MODEL;
168
+ const haikuModel = env.ANTHROPIC_DEFAULT_HAIKU_MODEL || env.ANTHROPIC_SMALL_FAST_MODEL;
169
+ const sonnetModel = env.ANTHROPIC_DEFAULT_SONNET_MODEL;
170
+ const opusModel = env.ANTHROPIC_DEFAULT_OPUS_MODEL;
171
+ if (primaryModel) {
172
+ details.push(` primary: ${primaryModel}`);
173
+ }
174
+ if (haikuModel) {
175
+ details.push(` haiku: ${haikuModel}`);
176
+ }
177
+ if (sonnetModel) {
178
+ details.push(` sonnet: ${sonnetModel}`);
179
+ }
180
+ if (opusModel) {
181
+ details.push(` opus: ${opusModel}`);
182
+ }
183
+ return details;
184
+ }
164
185
  const modelCheck = {
165
186
  name: "Default Model",
166
187
  weight: 5,
@@ -177,8 +198,9 @@ const modelCheck = {
177
198
  };
178
199
  }
179
200
  const settings = JSON.parse(readFileSync(SETTINGS_FILE, "utf-8"));
180
- const hasModel = settings.model || settings.defaultModel || settings.preferredModel;
201
+ const hasModel = settings.model || settings.defaultModel || settings.preferredModel || settings.env?.ANTHROPIC_MODEL || settings.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL || settings.env?.ANTHROPIC_SMALL_FAST_MODEL || settings.env?.ANTHROPIC_DEFAULT_SONNET_MODEL || settings.env?.ANTHROPIC_DEFAULT_OPUS_MODEL;
181
202
  const hasApiKey = settings.apiKey || settings.env?.ANTHROPIC_API_KEY || process__default.env.ANTHROPIC_API_KEY;
203
+ const details = collectModelDetails(settings);
182
204
  if (!hasApiKey) {
183
205
  return {
184
206
  name: this.name,
@@ -188,7 +210,7 @@ const modelCheck = {
188
210
  message: "No API key configured (using default)",
189
211
  fix: "Configure API for direct access",
190
212
  command: "ccjk menu",
191
- details: [" Using Claude Code default API"]
213
+ details: details.length > 0 ? details : [" Using Claude Code default API"]
192
214
  };
193
215
  }
194
216
  return {
@@ -196,7 +218,8 @@ const modelCheck = {
196
218
  status: "pass",
197
219
  score: hasModel ? 100 : 70,
198
220
  weight: this.weight,
199
- message: hasModel ? `Model: ${hasModel}` : "API configured (default model)"
221
+ message: hasModel ? `Model configured` : "API configured (default model)",
222
+ details
200
223
  };
201
224
  } catch {
202
225
  return { name: this.name, status: "fail", score: 0, weight: this.weight, message: "Failed to read model config" };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ccjk",
3
3
  "type": "module",
4
- "version": "14.1.1",
4
+ "version": "14.1.2",
5
5
  "packageManager": "pnpm@10.17.1",
6
6
  "description": "Production-ready AI dev environment for Claude Code, Codex, and modern coding workflows with 30-second onboarding, persistent memory, Agent Teams, remote control, and capability discovery.",
7
7
  "author": {
@@ -83,10 +83,12 @@
83
83
  },
84
84
  "scripts": {
85
85
  "dev": "tsx ./src/cli.ts",
86
- "build": "unbuild",
86
+ "build": "pnpm build:release:deps && pnpm build:root",
87
+ "build:root": "unbuild",
87
88
  "build:release:deps": "pnpm --filter @ccjk/wire build && pnpm --filter @ccjk/evolution build",
88
89
  "start": "node bin/ccjk.mjs",
89
- "typecheck": "tsc --noEmit",
90
+ "typecheck": "pnpm build:release:deps && pnpm typecheck:root",
91
+ "typecheck:root": "tsc --noEmit",
90
92
  "release:verify": "node scripts/release-verify.mjs",
91
93
  "release:verify:full": "node scripts/release-verify.mjs --with-tests",
92
94
  "prepublishOnly": "node scripts/validate-prepublish.mjs && pnpm contract:check && pnpm build",