ccjk 12.0.0 → 12.0.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.
- package/dist/chunks/agent-teams.mjs +17 -18
- package/dist/chunks/agent.mjs +105 -102
- package/dist/chunks/agents.mjs +87 -77
- package/dist/chunks/api-cli.mjs +41 -27
- package/dist/chunks/api-providers.mjs +2 -4
- package/dist/chunks/api.mjs +22 -11
- package/dist/chunks/auto-bootstrap.mjs +3 -5
- package/dist/chunks/auto-init.mjs +3 -4
- package/dist/chunks/auto-updater.mjs +103 -91
- package/dist/chunks/banner.mjs +41 -42
- package/dist/chunks/boost.mjs +30 -31
- package/dist/chunks/ccjk-agents.mjs +6 -9
- package/dist/chunks/ccjk-all.mjs +703 -85
- package/dist/chunks/ccjk-config.mjs +6 -6
- package/dist/chunks/ccjk-hooks.mjs +20 -9
- package/dist/chunks/ccjk-mcp.mjs +64 -52
- package/dist/chunks/ccjk-setup.mjs +35 -25
- package/dist/chunks/ccjk-skills.mjs +51 -41
- package/dist/chunks/ccr.mjs +42 -32
- package/dist/chunks/ccu.mjs +16 -12
- package/dist/chunks/check-updates.mjs +30 -19
- package/dist/chunks/claude-code-config-manager.mjs +25 -10
- package/dist/chunks/claude-code-incremental-manager.mjs +65 -51
- package/dist/chunks/claude-config.mjs +2 -2
- package/dist/chunks/claude-wrapper.mjs +9 -6
- package/dist/chunks/cleanup-migration.mjs +1 -1
- package/dist/chunks/cli-hook.mjs +10 -3
- package/dist/chunks/cloud-sync.mjs +1 -1
- package/dist/chunks/codex-config-switch.mjs +58 -45
- package/dist/chunks/codex-provider-manager.mjs +29 -16
- package/dist/chunks/codex-uninstaller.mjs +5 -6
- package/dist/chunks/codex.mjs +89 -89
- package/dist/chunks/commands.mjs +28 -29
- package/dist/chunks/commands2.mjs +4 -3
- package/dist/chunks/commit.mjs +42 -23
- package/dist/chunks/completion.mjs +46 -47
- package/dist/chunks/config-consolidator.mjs +12 -13
- package/dist/chunks/config-switch.mjs +66 -53
- package/dist/chunks/config.mjs +10 -10
- package/dist/chunks/config2.mjs +53 -42
- package/dist/chunks/config3.mjs +107 -93
- package/dist/chunks/constants.mjs +2 -4
- package/dist/chunks/context-loader.mjs +5 -4
- package/dist/chunks/context.mjs +77 -76
- package/dist/chunks/convoy-manager.mjs +4 -4
- package/dist/chunks/dashboard.mjs +28 -29
- package/dist/chunks/doctor.mjs +68 -54
- package/dist/chunks/evolution.mjs +37 -38
- package/dist/chunks/features.mjs +103 -92
- package/dist/chunks/fs-operations.mjs +1 -1
- package/dist/chunks/health-alerts.mjs +1 -1
- package/dist/chunks/health-check.mjs +1 -1
- package/dist/chunks/help.mjs +117 -116
- package/dist/chunks/hook-installer.mjs +3 -2
- package/dist/chunks/index.mjs +20 -6
- package/dist/chunks/index10.mjs +1171 -0
- package/dist/chunks/index11.mjs +1008 -0
- package/dist/chunks/index12.mjs +193 -0
- package/dist/chunks/index13.mjs +218 -0
- package/dist/chunks/index14.mjs +663 -0
- package/dist/chunks/index2.mjs +19 -10
- package/dist/chunks/index3.mjs +19079 -164
- package/dist/chunks/index4.mjs +8 -1171
- package/dist/chunks/index5.mjs +7479 -884
- package/dist/chunks/index6.mjs +160 -184
- package/dist/chunks/index7.mjs +3573 -653
- package/dist/chunks/index8.mjs +19 -0
- package/dist/chunks/index9.mjs +616 -0
- package/dist/chunks/init.mjs +173 -173
- package/dist/chunks/installer.mjs +92 -82
- package/dist/chunks/installer2.mjs +3 -2
- package/dist/chunks/interview.mjs +118 -107
- package/dist/chunks/json-config.mjs +3 -2
- package/dist/chunks/linux.mjs +3863 -0
- package/dist/chunks/macos.mjs +69 -0
- package/dist/chunks/main.mjs +635 -0
- package/dist/chunks/marketplace.mjs +69 -66
- package/dist/chunks/mcp-cli.mjs +61 -48
- package/dist/chunks/mcp.mjs +140 -127
- package/dist/chunks/menu.mjs +85 -85
- package/dist/chunks/metrics-display.mjs +41 -40
- package/dist/chunks/migrator.mjs +4 -5
- package/dist/chunks/monitor.mjs +95 -95
- package/dist/chunks/notification.mjs +151 -141
- package/dist/chunks/onboarding.mjs +26 -15
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/paradigm.mjs +24 -23
- package/dist/chunks/permission-manager.mjs +10 -11
- package/dist/chunks/permissions.mjs +72 -57
- package/dist/chunks/persistence-manager.mjs +97 -84
- package/dist/chunks/persistence.mjs +1 -1
- package/dist/chunks/platform.mjs +29 -29
- package/dist/chunks/plugin.mjs +104 -105
- package/dist/chunks/prompts.mjs +36 -25
- package/dist/chunks/providers.mjs +68 -69
- package/dist/chunks/quick-actions.mjs +71 -72
- package/dist/chunks/quick-provider.mjs +56 -40
- package/dist/chunks/quick-setup.mjs +71 -60
- package/dist/chunks/remote.mjs +21 -12
- package/dist/chunks/session.mjs +116 -103
- package/dist/chunks/sessions.mjs +29 -28
- package/dist/chunks/silent-updater.mjs +8 -10
- package/dist/chunks/simple-config.mjs +13 -10
- package/dist/chunks/skill.mjs +8560 -103
- package/dist/chunks/skills-sync.mjs +5212 -79
- package/dist/chunks/skills.mjs +105 -94
- package/dist/chunks/slash-commands.mjs +36 -37
- package/dist/chunks/smart-defaults.mjs +7 -3
- package/dist/chunks/smart-guide.mjs +1 -1
- package/dist/chunks/startup.mjs +2 -4
- package/dist/chunks/stats.mjs +41 -42
- package/dist/chunks/status.mjs +49 -50
- package/dist/chunks/team.mjs +24 -12
- package/dist/chunks/thinking.mjs +74 -63
- package/dist/chunks/trace.mjs +20 -19
- package/dist/chunks/uninstall.mjs +69 -56
- package/dist/chunks/update.mjs +39 -28
- package/dist/chunks/upgrade-manager.mjs +24 -18
- package/dist/chunks/version-checker.mjs +45 -41
- package/dist/chunks/vim.mjs +81 -69
- package/dist/chunks/windows.mjs +14 -0
- package/dist/chunks/workflows.mjs +15 -15
- package/dist/chunks/wsl.mjs +129 -0
- package/dist/chunks/zero-config.mjs +45 -34
- package/dist/cli.mjs +20 -20
- package/dist/index.mjs +41 -31
- package/dist/shared/ccjk.BAGoDD49.mjs +36 -0
- package/dist/shared/ccjk.BBtCGd_g.mjs +899 -0
- package/dist/shared/{ccjk.CGcy7cNM.mjs → ccjk.BDKUdmLk.mjs} +1 -1
- package/dist/shared/{ccjk.DtMBiwVG.mjs → ccjk.BFxsJM0k.mjs} +1 -1
- package/dist/shared/{ccjk.j4uut26D.mjs → ccjk.BIxuVL3_.mjs} +5 -5
- package/dist/shared/ccjk.BRZ9ww8S.mjs +142 -0
- package/dist/shared/{ccjk.CN0edl87.mjs → ccjk.BSYWk9ML.mjs} +1 -1
- package/dist/shared/{ccjk.Dk1HDseQ.mjs → ccjk.BnpWvs9V.mjs} +75 -75
- package/dist/shared/ccjk.BoApaI4j.mjs +28 -0
- package/dist/shared/{ccjk.DKojSRzw.mjs → ccjk.BrPUmTqm.mjs} +1 -1
- package/dist/shared/{ccjk.C10pepYx.mjs → ccjk.BxSmJ8B7.mjs} +1 -1
- package/dist/shared/ccjk.Bx_rmYfN.mjs +69 -0
- package/dist/shared/ccjk.COweQ1RR.mjs +5 -0
- package/dist/shared/{ccjk.BN90X6oc.mjs → ccjk.CePkJq2S.mjs} +17 -17
- package/dist/shared/{ccjk.Bvoex4TZ.mjs → ccjk.CfKKcvWy.mjs} +1 -1
- package/dist/shared/ccjk.Cjgrln_h.mjs +297 -0
- package/dist/shared/ccjk.CxpGa6MC.mjs +2724 -0
- package/dist/shared/{ccjk.DfwJOEok.mjs → ccjk.D5MFQT7w.mjs} +1 -1
- package/dist/shared/{ccjk.cChAaGgT.mjs → ccjk.DG_o24cZ.mjs} +6 -6
- package/dist/shared/{ccjk.bhFAMRyc.mjs → ccjk.DLLw-h4Y.mjs} +32 -32
- package/dist/shared/ccjk.DOwtZMk8.mjs +4019 -0
- package/dist/shared/{ccjk.BsXQugfY.mjs → ccjk.DTdjs-qK.mjs} +13 -13
- package/dist/shared/{ccjk.Bdhyg3X-.mjs → ccjk.DsYaCCx4.mjs} +1 -1
- package/dist/shared/ccjk.KfSWcGlE.mjs +38 -0
- package/dist/shared/ccjk.RyizuzOI.mjs +21 -0
- package/dist/shared/{ccjk.h7_W-wTs.mjs → ccjk.SPoXMvZD.mjs} +1 -1
- package/dist/shared/ccjk.T_cX87dY.mjs +15 -0
- package/dist/shared/{ccjk.CrB6OYHv.mjs → ccjk._dESH4Rk.mjs} +2 -2
- package/dist/shared/ccjk.bQ7Dh1g4.mjs +249 -0
- package/dist/shared/{ccjk.CBhIZiPz.mjs → ccjk.hoqrwWdN.mjs} +1 -1
- package/dist/shared/{ccjk.BNwRnWYx.mjs → ccjk.s7OCVzdd.mjs} +1230 -33
- package/dist/shared/{ccjk.BOIUTf5z.mjs → ccjk.waa2ikKJ.mjs} +8 -9
- package/package.json +31 -30
- package/dist/shared/ccjk.DHbrGcgg.mjs +0 -13
- package/dist/shared/ccjk.DntgA8fQ.mjs +0 -42
|
@@ -2,15 +2,26 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { writeFile, mkdir, readFile } from 'node:fs/promises';
|
|
3
3
|
import { resolve, dirname, join } from 'node:path';
|
|
4
4
|
import process__default from 'node:process';
|
|
5
|
-
import
|
|
6
|
-
import inquirer from '
|
|
7
|
-
import { i18n } from './
|
|
8
|
-
import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.
|
|
5
|
+
import a from './index2.mjs';
|
|
6
|
+
import { i as inquirer } from './index3.mjs';
|
|
7
|
+
import { i18n } from './index5.mjs';
|
|
8
|
+
import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.BIxuVL3_.mjs';
|
|
9
9
|
import { randomUUID } from 'node:crypto';
|
|
10
|
+
import '../shared/ccjk.BAGoDD49.mjs';
|
|
11
|
+
import 'node:readline';
|
|
12
|
+
import 'stream';
|
|
13
|
+
import 'node:tty';
|
|
14
|
+
import 'node:async_hooks';
|
|
15
|
+
import '../shared/ccjk.Cjgrln_h.mjs';
|
|
16
|
+
import 'node:util';
|
|
17
|
+
import 'tty';
|
|
18
|
+
import 'fs';
|
|
19
|
+
import 'child_process';
|
|
20
|
+
import 'node:os';
|
|
21
|
+
import 'buffer';
|
|
22
|
+
import 'string_decoder';
|
|
10
23
|
import 'node:url';
|
|
11
|
-
import '
|
|
12
|
-
import 'i18next-fs-backend';
|
|
13
|
-
import 'pathe';
|
|
24
|
+
import '../shared/ccjk.bQ7Dh1g4.mjs';
|
|
14
25
|
|
|
15
26
|
const projectFoundationQuestions = [
|
|
16
27
|
{
|
|
@@ -2309,14 +2320,14 @@ function createSpecGenerator(language = "en") {
|
|
|
2309
2320
|
function displayInterviewBanner(compact = false) {
|
|
2310
2321
|
console.log("");
|
|
2311
2322
|
if (compact) {
|
|
2312
|
-
console.log(
|
|
2313
|
-
console.log(
|
|
2323
|
+
console.log(a.green.bold(" \u{1F3A4} Interview-Driven Development"));
|
|
2324
|
+
console.log(a.gray(' "Interview first. Spec second. Code last."'));
|
|
2314
2325
|
} else {
|
|
2315
|
-
console.log(
|
|
2316
|
-
console.log(
|
|
2317
|
-
console.log(
|
|
2318
|
-
console.log(
|
|
2319
|
-
console.log(
|
|
2326
|
+
console.log(a.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
|
|
2327
|
+
console.log(a.green("\u2551") + a.bold.white(" \u{1F3A4} Interview-Driven Development (IDD) ") + a.green("\u2551"));
|
|
2328
|
+
console.log(a.green("\u2551") + a.gray(' "Interview first. Spec second. Code last." ') + a.green("\u2551"));
|
|
2329
|
+
console.log(a.green("\u2551") + a.gray(" Based on Thariq (@trq212) workflow from Anthropic ") + a.green("\u2551"));
|
|
2330
|
+
console.log(a.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
|
|
2320
2331
|
}
|
|
2321
2332
|
console.log("");
|
|
2322
2333
|
}
|
|
@@ -2349,22 +2360,22 @@ function displayProgressBar(session) {
|
|
|
2349
2360
|
const barWidth = 30;
|
|
2350
2361
|
const filled = Math.round(percentage / 100 * barWidth);
|
|
2351
2362
|
const empty = barWidth - filled;
|
|
2352
|
-
const bar =
|
|
2363
|
+
const bar = a.green("\u2588".repeat(filled)) + a.gray("\u2591".repeat(empty));
|
|
2353
2364
|
console.log("");
|
|
2354
|
-
console.log(
|
|
2365
|
+
console.log(a.gray(` Progress: [${bar}] ${percentage}%`));
|
|
2355
2366
|
}
|
|
2356
2367
|
function displayCategoryBreadcrumb(session) {
|
|
2357
2368
|
const breadcrumb = session.progress.map((p) => {
|
|
2358
2369
|
const category = getCategoryById(p.categoryId);
|
|
2359
2370
|
const icon = category?.icon || "\u{1F4CC}";
|
|
2360
2371
|
if (p.isComplete) {
|
|
2361
|
-
return
|
|
2372
|
+
return a.green(`${icon} ${p.name} \u2713`);
|
|
2362
2373
|
}
|
|
2363
2374
|
if (p.isCurrent) {
|
|
2364
|
-
return
|
|
2375
|
+
return a.green.bold(`${icon} ${p.name} \u25C0`);
|
|
2365
2376
|
}
|
|
2366
|
-
return
|
|
2367
|
-
}).join(
|
|
2377
|
+
return a.gray(`${icon} ${p.name}`);
|
|
2378
|
+
}).join(a.gray(" \u2192 "));
|
|
2368
2379
|
console.log("");
|
|
2369
2380
|
console.log(` ${breadcrumb}`);
|
|
2370
2381
|
}
|
|
@@ -2372,26 +2383,26 @@ function displayQuestion(display, lang) {
|
|
|
2372
2383
|
const questionText = display.question.question[lang];
|
|
2373
2384
|
const headerText = display.question.header[lang];
|
|
2374
2385
|
console.log("");
|
|
2375
|
-
console.log(
|
|
2386
|
+
console.log(a.gray("\u2500".repeat(65)));
|
|
2376
2387
|
console.log("");
|
|
2377
|
-
console.log(
|
|
2388
|
+
console.log(a.green.bold(` Q${display.questionNumber}`) + a.gray(` of ~${display.estimatedTotal}`) + a.gray(` \u2502 `) + a.yellow(headerText));
|
|
2378
2389
|
console.log("");
|
|
2379
|
-
console.log(
|
|
2390
|
+
console.log(a.white.bold(` ${questionText}`));
|
|
2380
2391
|
console.log("");
|
|
2381
2392
|
}
|
|
2382
2393
|
async function askQuestion(display, lang) {
|
|
2383
2394
|
displayQuestion(display, lang);
|
|
2384
2395
|
const choices = display.options.map((opt, index) => {
|
|
2385
|
-
const label = opt.isRecommended ? `${opt.label} ${
|
|
2396
|
+
const label = opt.isRecommended ? `${opt.label} ${a.green("(Recommended)")}` : opt.label;
|
|
2386
2397
|
return {
|
|
2387
|
-
name: `${
|
|
2388
|
-
${
|
|
2398
|
+
name: `${a.green(`${index + 1}.`)} ${label}
|
|
2399
|
+
${a.gray(opt.description)}`,
|
|
2389
2400
|
value: opt.value,
|
|
2390
2401
|
short: opt.label
|
|
2391
2402
|
};
|
|
2392
2403
|
});
|
|
2393
2404
|
choices.push({
|
|
2394
|
-
name: `${
|
|
2405
|
+
name: `${a.green(`${choices.length + 1}.`)} ${a.italic("Type something else...")}`,
|
|
2395
2406
|
value: "__custom__",
|
|
2396
2407
|
short: "Custom"
|
|
2397
2408
|
});
|
|
@@ -2400,7 +2411,7 @@ async function askQuestion(display, lang) {
|
|
|
2400
2411
|
const { selected } = await inquirer.prompt({
|
|
2401
2412
|
type: "checkbox",
|
|
2402
2413
|
name: "selected",
|
|
2403
|
-
message:
|
|
2414
|
+
message: a.gray("Select all that apply (space to select, enter to confirm):"),
|
|
2404
2415
|
choices: choices.map((c) => ({
|
|
2405
2416
|
name: c.name,
|
|
2406
2417
|
value: c.value,
|
|
@@ -2412,7 +2423,7 @@ async function askQuestion(display, lang) {
|
|
|
2412
2423
|
const { customValue } = await inquirer.prompt({
|
|
2413
2424
|
type: "input",
|
|
2414
2425
|
name: "customValue",
|
|
2415
|
-
message:
|
|
2426
|
+
message: a.gray("Enter your custom answer:")
|
|
2416
2427
|
});
|
|
2417
2428
|
const filtered = selected.filter((s) => s !== "__custom__");
|
|
2418
2429
|
return { values: filtered, customInput: customValue };
|
|
@@ -2422,7 +2433,7 @@ async function askQuestion(display, lang) {
|
|
|
2422
2433
|
const { selected } = await inquirer.prompt({
|
|
2423
2434
|
type: "list",
|
|
2424
2435
|
name: "selected",
|
|
2425
|
-
message:
|
|
2436
|
+
message: a.gray("Select one:"),
|
|
2426
2437
|
choices,
|
|
2427
2438
|
pageSize: 10
|
|
2428
2439
|
});
|
|
@@ -2430,7 +2441,7 @@ async function askQuestion(display, lang) {
|
|
|
2430
2441
|
const { customValue } = await inquirer.prompt({
|
|
2431
2442
|
type: "input",
|
|
2432
2443
|
name: "customValue",
|
|
2433
|
-
message:
|
|
2444
|
+
message: a.gray("Enter your custom answer:")
|
|
2434
2445
|
});
|
|
2435
2446
|
return { values: [], customInput: customValue };
|
|
2436
2447
|
}
|
|
@@ -2442,12 +2453,12 @@ async function askQuestion(display, lang) {
|
|
|
2442
2453
|
}
|
|
2443
2454
|
async function selectTemplate(lang) {
|
|
2444
2455
|
console.log("");
|
|
2445
|
-
console.log(
|
|
2456
|
+
console.log(a.green.bold(" \u{1F4CB} Select Interview Template"));
|
|
2446
2457
|
console.log("");
|
|
2447
2458
|
const choices = INTERVIEW_TEMPLATES.map((template, index) => ({
|
|
2448
|
-
name: `${
|
|
2449
|
-
${
|
|
2450
|
-
${
|
|
2459
|
+
name: `${a.green(`${index + 1}.`)} ${a.bold(template.name[lang])}
|
|
2460
|
+
${a.gray(template.description[lang])}
|
|
2461
|
+
${a.gray(`~${template.estimatedQuestions} questions, ${template.defaultDepth} depth`)}`,
|
|
2451
2462
|
value: template.id,
|
|
2452
2463
|
short: template.name[lang]
|
|
2453
2464
|
}));
|
|
@@ -2455,7 +2466,7 @@ async function selectTemplate(lang) {
|
|
|
2455
2466
|
const { templateId } = await inquirer.prompt({
|
|
2456
2467
|
type: "list",
|
|
2457
2468
|
name: "templateId",
|
|
2458
|
-
message:
|
|
2469
|
+
message: a.gray("Choose a template:"),
|
|
2459
2470
|
choices,
|
|
2460
2471
|
pageSize: 10
|
|
2461
2472
|
});
|
|
@@ -2467,32 +2478,32 @@ async function selectTemplate(lang) {
|
|
|
2467
2478
|
async function quickStartConfig(_lang) {
|
|
2468
2479
|
const detectedType = await detectProjectType();
|
|
2469
2480
|
const detectedTemplate = getTemplateById(detectedType);
|
|
2470
|
-
console.log(
|
|
2481
|
+
console.log(a.gray(` Detected project type: ${a.white(detectedType)}`));
|
|
2471
2482
|
console.log("");
|
|
2472
|
-
console.log(
|
|
2483
|
+
console.log(a.green.bold(" How would you like to proceed?"));
|
|
2473
2484
|
console.log("");
|
|
2474
2485
|
const quickChoices = [
|
|
2475
2486
|
{
|
|
2476
|
-
name: `${
|
|
2477
|
-
${
|
|
2487
|
+
name: `${a.green("1.")} ${a.green("\u26A1 Quick Start")} ${a.gray("(Recommended)")}
|
|
2488
|
+
${a.gray(`Use ${detectedType} template, ~${detectedTemplate?.estimatedQuestions || 25} questions \u2192 SPEC.md`)}`,
|
|
2478
2489
|
value: "quick-start",
|
|
2479
2490
|
short: "Quick Start"
|
|
2480
2491
|
},
|
|
2481
2492
|
{
|
|
2482
|
-
name: `${
|
|
2483
|
-
${
|
|
2493
|
+
name: `${a.green("2.")} ${a.yellow("\u{1F52C} Deep Dive")}
|
|
2494
|
+
${a.gray("40+ comprehensive questions for complex features")}`,
|
|
2484
2495
|
value: "deep",
|
|
2485
2496
|
short: "Deep Dive"
|
|
2486
2497
|
},
|
|
2487
2498
|
{
|
|
2488
|
-
name: `${
|
|
2489
|
-
${
|
|
2499
|
+
name: `${a.green("3.")} ${a.green("\u2699\uFE0F Custom Setup")}
|
|
2500
|
+
${a.gray("Choose template, depth, and output file")}`,
|
|
2490
2501
|
value: "custom",
|
|
2491
2502
|
short: "Custom"
|
|
2492
2503
|
},
|
|
2493
2504
|
{
|
|
2494
|
-
name: `${
|
|
2495
|
-
${
|
|
2505
|
+
name: `${a.green("4.")} ${a.magenta("\u{1F4A8} Express Mode")}
|
|
2506
|
+
${a.gray("~10 essential questions only")}`,
|
|
2496
2507
|
value: "express",
|
|
2497
2508
|
short: "Express"
|
|
2498
2509
|
}
|
|
@@ -2501,7 +2512,7 @@ async function quickStartConfig(_lang) {
|
|
|
2501
2512
|
const { mode } = await inquirer.prompt({
|
|
2502
2513
|
type: "list",
|
|
2503
2514
|
name: "mode",
|
|
2504
|
-
message:
|
|
2515
|
+
message: a.gray("Select mode (press number or use arrows):"),
|
|
2505
2516
|
choices: quickChoices,
|
|
2506
2517
|
pageSize: 8
|
|
2507
2518
|
});
|
|
@@ -2538,7 +2549,7 @@ async function getSpecFilePath(defaultPath) {
|
|
|
2538
2549
|
const { specFile } = await inquirer.prompt({
|
|
2539
2550
|
type: "input",
|
|
2540
2551
|
name: "specFile",
|
|
2541
|
-
message:
|
|
2552
|
+
message: a.gray("Spec file path (where to save the specification):"),
|
|
2542
2553
|
default: defaultPath,
|
|
2543
2554
|
validate: (value) => {
|
|
2544
2555
|
if (!value.trim()) {
|
|
@@ -2560,42 +2571,42 @@ function displayCompletionSummary(session, specFile) {
|
|
|
2560
2571
|
(session.lastActivityAt.getTime() - session.startedAt.getTime()) / 1e3 / 60
|
|
2561
2572
|
);
|
|
2562
2573
|
console.log("");
|
|
2563
|
-
console.log(
|
|
2574
|
+
console.log(a.green("\u2550".repeat(65)));
|
|
2564
2575
|
console.log("");
|
|
2565
|
-
console.log(
|
|
2576
|
+
console.log(a.green.bold(" \u2713 Interview Complete!"));
|
|
2566
2577
|
console.log("");
|
|
2567
|
-
console.log(` ${
|
|
2568
|
-
console.log(` ${
|
|
2569
|
-
console.log(` ${
|
|
2578
|
+
console.log(` ${a.gray("Questions answered:")} ${a.white(String(session.questionsAsked))}`);
|
|
2579
|
+
console.log(` ${a.gray("Duration:")} ${a.white(`${duration} minutes`)}`);
|
|
2580
|
+
console.log(` ${a.gray("Spec file:")} ${a.green(specFile)}`);
|
|
2570
2581
|
console.log("");
|
|
2571
|
-
console.log(
|
|
2582
|
+
console.log(a.gray(" Category Summary:"));
|
|
2572
2583
|
for (const progress of session.progress) {
|
|
2573
2584
|
const category = getCategoryById(progress.categoryId);
|
|
2574
2585
|
const icon = category?.icon || "\u{1F4CC}";
|
|
2575
|
-
const status = progress.isComplete ?
|
|
2586
|
+
const status = progress.isComplete ? a.green("\u2713") : a.yellow("\u25CB");
|
|
2576
2587
|
console.log(` ${status} ${icon} ${progress.name}: ${progress.answered}/${progress.total}`);
|
|
2577
2588
|
}
|
|
2578
2589
|
console.log("");
|
|
2579
|
-
console.log(
|
|
2590
|
+
console.log(a.green("\u2550".repeat(65)));
|
|
2580
2591
|
console.log("");
|
|
2581
|
-
console.log(
|
|
2582
|
-
console.log(
|
|
2583
|
-
console.log(
|
|
2584
|
-
console.log(
|
|
2592
|
+
console.log(a.green(" Next steps:"));
|
|
2593
|
+
console.log(a.gray(` 1. Review the spec: ${a.white(`cat ${specFile}`)}`));
|
|
2594
|
+
console.log(a.gray(` 2. Start planning: ${a.white("/plan")}`));
|
|
2595
|
+
console.log(a.gray(` 3. Begin coding: ${a.white("Use the spec as context")}`));
|
|
2585
2596
|
console.log("");
|
|
2586
2597
|
}
|
|
2587
2598
|
function listTemplates(lang) {
|
|
2588
2599
|
console.log("");
|
|
2589
|
-
console.log(
|
|
2600
|
+
console.log(a.green.bold(" Available Interview Templates:"));
|
|
2590
2601
|
console.log("");
|
|
2591
2602
|
for (const template of INTERVIEW_TEMPLATES) {
|
|
2592
|
-
console.log(
|
|
2593
|
-
console.log(` ${
|
|
2594
|
-
console.log(` ${
|
|
2595
|
-
console.log(` ${
|
|
2603
|
+
console.log(a.green(` ${template.id}`));
|
|
2604
|
+
console.log(` ${a.white(template.name[lang])}`);
|
|
2605
|
+
console.log(` ${a.gray(template.description[lang])}`);
|
|
2606
|
+
console.log(` ${a.gray(`~${template.estimatedQuestions} questions, ${template.defaultDepth} depth`)}`);
|
|
2596
2607
|
console.log("");
|
|
2597
2608
|
}
|
|
2598
|
-
console.log(
|
|
2609
|
+
console.log(a.gray(" Usage: ccjk interview --template <template-id> [SPEC.md]"));
|
|
2599
2610
|
console.log("");
|
|
2600
2611
|
}
|
|
2601
2612
|
async function interview(options = {}) {
|
|
@@ -2619,13 +2630,13 @@ async function interview(options = {}) {
|
|
|
2619
2630
|
} else {
|
|
2620
2631
|
const selectedTemplate = await selectTemplate(lang);
|
|
2621
2632
|
if (!selectedTemplate) {
|
|
2622
|
-
console.log(
|
|
2633
|
+
console.log(a.yellow("\n Interview cancelled.\n"));
|
|
2623
2634
|
return;
|
|
2624
2635
|
}
|
|
2625
2636
|
templateId = selectedTemplate;
|
|
2626
2637
|
const template2 = getTemplateById(templateId);
|
|
2627
2638
|
if (!template2) {
|
|
2628
|
-
console.log(
|
|
2639
|
+
console.log(a.red(`
|
|
2629
2640
|
Template not found: ${templateId}
|
|
2630
2641
|
`));
|
|
2631
2642
|
return;
|
|
@@ -2633,20 +2644,20 @@ async function interview(options = {}) {
|
|
|
2633
2644
|
const { selectedDepth } = await inquirer.prompt({
|
|
2634
2645
|
type: "list",
|
|
2635
2646
|
name: "selectedDepth",
|
|
2636
|
-
message:
|
|
2647
|
+
message: a.gray("Interview depth:"),
|
|
2637
2648
|
choices: [
|
|
2638
2649
|
{
|
|
2639
|
-
name: `${
|
|
2650
|
+
name: `${a.green("1.")} \u26A1 Quick (~10 questions)`,
|
|
2640
2651
|
value: "quick",
|
|
2641
2652
|
short: "Quick"
|
|
2642
2653
|
},
|
|
2643
2654
|
{
|
|
2644
|
-
name: `${
|
|
2655
|
+
name: `${a.green("2.")} \u{1F4CA} Standard (~25 questions) ${template2.defaultDepth === "standard" ? a.green("(Recommended)") : ""}`,
|
|
2645
2656
|
value: "standard",
|
|
2646
2657
|
short: "Standard"
|
|
2647
2658
|
},
|
|
2648
2659
|
{
|
|
2649
|
-
name: `${
|
|
2660
|
+
name: `${a.green("3.")} \u{1F52C} Deep (~40+ questions) ${template2.defaultDepth === "deep" ? a.green("(Recommended)") : ""}`,
|
|
2650
2661
|
value: "deep",
|
|
2651
2662
|
short: "Deep"
|
|
2652
2663
|
}
|
|
@@ -2657,7 +2668,7 @@ async function interview(options = {}) {
|
|
|
2657
2668
|
depth = selectedDepth;
|
|
2658
2669
|
const selectedSpecFile = await getSpecFilePath("SPEC.md");
|
|
2659
2670
|
if (!selectedSpecFile) {
|
|
2660
|
-
console.log(
|
|
2671
|
+
console.log(a.yellow("\n Interview cancelled.\n"));
|
|
2661
2672
|
return;
|
|
2662
2673
|
}
|
|
2663
2674
|
specFile = selectedSpecFile;
|
|
@@ -2669,23 +2680,23 @@ async function interview(options = {}) {
|
|
|
2669
2680
|
}
|
|
2670
2681
|
const template = getTemplateById(templateId);
|
|
2671
2682
|
if (!template) {
|
|
2672
|
-
console.log(
|
|
2683
|
+
console.log(a.red(`
|
|
2673
2684
|
Template not found: ${templateId}
|
|
2674
2685
|
`));
|
|
2675
|
-
console.log(
|
|
2676
|
-
INTERVIEW_TEMPLATES.forEach((t) => console.log(
|
|
2686
|
+
console.log(a.gray(" Available templates:"));
|
|
2687
|
+
INTERVIEW_TEMPLATES.forEach((t) => console.log(a.gray(` - ${t.id}`)));
|
|
2677
2688
|
return;
|
|
2678
2689
|
}
|
|
2679
2690
|
const absoluteSpecFile = resolve(process__default.cwd(), specFile);
|
|
2680
2691
|
console.log("");
|
|
2681
|
-
console.log(
|
|
2682
|
-
console.log(` ${
|
|
2683
|
-
console.log(` ${
|
|
2684
|
-
console.log(` ${
|
|
2685
|
-
console.log(
|
|
2692
|
+
console.log(a.gray("\u2500".repeat(50)));
|
|
2693
|
+
console.log(` ${a.gray("Template:")} ${a.white(template.name[lang])}`);
|
|
2694
|
+
console.log(` ${a.gray("Depth:")} ${a.white(depth)} ${a.gray(`(~${depth === "quick" ? 10 : depth === "standard" ? 25 : 40}+ questions)`)}`);
|
|
2695
|
+
console.log(` ${a.gray("Output:")} ${a.green(specFile)}`);
|
|
2696
|
+
console.log(a.gray("\u2500".repeat(50)));
|
|
2686
2697
|
console.log("");
|
|
2687
|
-
console.log(
|
|
2688
|
-
console.log(
|
|
2698
|
+
console.log(a.green(" Starting interview..."));
|
|
2699
|
+
console.log(a.gray(" Press Ctrl+C to pause | Enter to select | Type for custom"));
|
|
2689
2700
|
console.log("");
|
|
2690
2701
|
const engine = createInterviewEngine(lang);
|
|
2691
2702
|
const session = await engine.startInterview(absoluteSpecFile, {
|
|
@@ -2703,7 +2714,7 @@ async function interview(options = {}) {
|
|
|
2703
2714
|
const answer = await askQuestion(questionDisplay, lang);
|
|
2704
2715
|
if (answer === null) {
|
|
2705
2716
|
console.log("");
|
|
2706
|
-
console.log(
|
|
2717
|
+
console.log(a.yellow(" Interview paused."));
|
|
2707
2718
|
try {
|
|
2708
2719
|
const { saveProgress } = await inquirer.prompt({
|
|
2709
2720
|
type: "confirm",
|
|
@@ -2717,8 +2728,8 @@ async function interview(options = {}) {
|
|
|
2717
2728
|
if (sessionJson) {
|
|
2718
2729
|
const sessionFile = absoluteSpecFile.replace(".md", ".session.json");
|
|
2719
2730
|
await writeFile(sessionFile, sessionJson, "utf-8");
|
|
2720
|
-
console.log(
|
|
2721
|
-
console.log(
|
|
2731
|
+
console.log(a.gray(` Session saved to: ${sessionFile}`));
|
|
2732
|
+
console.log(a.gray(` Resume with: ccjk interview --resume`));
|
|
2722
2733
|
}
|
|
2723
2734
|
}
|
|
2724
2735
|
} catch {
|
|
@@ -2735,7 +2746,7 @@ async function interview(options = {}) {
|
|
|
2735
2746
|
questionDisplay = await engine.getNextQuestion(session.id);
|
|
2736
2747
|
}
|
|
2737
2748
|
console.log("");
|
|
2738
|
-
console.log(
|
|
2749
|
+
console.log(a.green(" Generating specification..."));
|
|
2739
2750
|
const specGenerator = createSpecGenerator(lang);
|
|
2740
2751
|
const spec = await specGenerator.generateSpec(session);
|
|
2741
2752
|
const specDir = dirname(absoluteSpecFile);
|
|
@@ -2779,18 +2790,18 @@ async function resumeInterview(sessionFile, options = {}) {
|
|
|
2779
2790
|
}
|
|
2780
2791
|
}
|
|
2781
2792
|
if (sessions.length === 0) {
|
|
2782
|
-
console.log(
|
|
2783
|
-
console.log(
|
|
2793
|
+
console.log(a.yellow("\n No saved sessions found.\n"));
|
|
2794
|
+
console.log(a.gray(" Start a new interview with: ccjk interview"));
|
|
2784
2795
|
return;
|
|
2785
2796
|
}
|
|
2786
2797
|
sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
2787
2798
|
const { selectedSession } = await inquirer.prompt({
|
|
2788
2799
|
type: "list",
|
|
2789
2800
|
name: "selectedSession",
|
|
2790
|
-
message:
|
|
2801
|
+
message: a.gray("Select a session to resume:"),
|
|
2791
2802
|
choices: sessions.map((s, i) => ({
|
|
2792
|
-
name: `${
|
|
2793
|
-
${
|
|
2803
|
+
name: `${a.green(`${i + 1}.`)} ${a.white(s.name)}
|
|
2804
|
+
${a.gray(`Modified: ${s.modified.toLocaleString()}`)}`,
|
|
2794
2805
|
value: s.path,
|
|
2795
2806
|
short: s.name
|
|
2796
2807
|
})),
|
|
@@ -2799,7 +2810,7 @@ async function resumeInterview(sessionFile, options = {}) {
|
|
|
2799
2810
|
targetSessionFile = selectedSession;
|
|
2800
2811
|
}
|
|
2801
2812
|
if (!existsSync(targetSessionFile)) {
|
|
2802
|
-
console.log(
|
|
2813
|
+
console.log(a.red(`
|
|
2803
2814
|
Session file not found: ${targetSessionFile}
|
|
2804
2815
|
`));
|
|
2805
2816
|
return;
|
|
@@ -2808,17 +2819,17 @@ async function resumeInterview(sessionFile, options = {}) {
|
|
|
2808
2819
|
const engine = createInterviewEngine(lang);
|
|
2809
2820
|
const session = engine.importSession(sessionJson);
|
|
2810
2821
|
if (!session) {
|
|
2811
|
-
console.log(
|
|
2822
|
+
console.log(a.red("\n Failed to load session file.\n"));
|
|
2812
2823
|
return;
|
|
2813
2824
|
}
|
|
2814
2825
|
displayInterviewBanner();
|
|
2815
|
-
console.log(
|
|
2816
|
-
console.log(
|
|
2817
|
-
console.log(
|
|
2826
|
+
console.log(a.green(" Resuming interview session..."));
|
|
2827
|
+
console.log(a.gray(` Session ID: ${session.id}`));
|
|
2828
|
+
console.log(a.gray(` Progress: ${session.questionsAsked} questions answered`));
|
|
2818
2829
|
console.log("");
|
|
2819
2830
|
const resumed = await engine.resumeInterview(session.id);
|
|
2820
2831
|
if (!resumed) {
|
|
2821
|
-
console.log(
|
|
2832
|
+
console.log(a.red("\n Failed to resume session.\n"));
|
|
2822
2833
|
return;
|
|
2823
2834
|
}
|
|
2824
2835
|
let questionDisplay = await engine.getNextQuestion(session.id);
|
|
@@ -2828,12 +2839,12 @@ async function resumeInterview(sessionFile, options = {}) {
|
|
|
2828
2839
|
const answer = await askQuestion(questionDisplay, lang);
|
|
2829
2840
|
if (answer === null) {
|
|
2830
2841
|
console.log("");
|
|
2831
|
-
console.log(
|
|
2842
|
+
console.log(a.yellow(" Interview paused."));
|
|
2832
2843
|
await engine.pauseInterview(session.id);
|
|
2833
2844
|
const updatedSessionJson = engine.exportSession(session.id);
|
|
2834
2845
|
if (updatedSessionJson) {
|
|
2835
2846
|
await writeFile(targetSessionFile, updatedSessionJson, "utf-8");
|
|
2836
|
-
console.log(
|
|
2847
|
+
console.log(a.gray(` Progress saved to: ${targetSessionFile}`));
|
|
2837
2848
|
}
|
|
2838
2849
|
return;
|
|
2839
2850
|
}
|
|
@@ -2847,7 +2858,7 @@ async function resumeInterview(sessionFile, options = {}) {
|
|
|
2847
2858
|
questionDisplay = await engine.getNextQuestion(session.id);
|
|
2848
2859
|
}
|
|
2849
2860
|
console.log("");
|
|
2850
|
-
console.log(
|
|
2861
|
+
console.log(a.green(" Generating specification..."));
|
|
2851
2862
|
const specGenerator = createSpecGenerator(lang);
|
|
2852
2863
|
const spec = await specGenerator.generateSpec(session);
|
|
2853
2864
|
await specGenerator.writeSpecToFile(spec, session.specFile);
|
|
@@ -2881,7 +2892,7 @@ async function listInterviewSessions() {
|
|
|
2881
2892
|
const { readdir, stat } = await import('node:fs/promises');
|
|
2882
2893
|
const { homedir } = await import('node:os');
|
|
2883
2894
|
console.log("");
|
|
2884
|
-
console.log(
|
|
2895
|
+
console.log(a.green.bold(" Saved Interview Sessions:"));
|
|
2885
2896
|
console.log("");
|
|
2886
2897
|
const searchDirs = [
|
|
2887
2898
|
process__default.cwd(),
|
|
@@ -2896,9 +2907,9 @@ async function listInterviewSessions() {
|
|
|
2896
2907
|
const filePath = join(dir, file);
|
|
2897
2908
|
const fileStats = await stat(filePath);
|
|
2898
2909
|
const modified = fileStats.mtime.toLocaleString();
|
|
2899
|
-
console.log(` ${
|
|
2900
|
-
console.log(` ${
|
|
2901
|
-
console.log(` ${
|
|
2910
|
+
console.log(` ${a.green("\u2022")} ${a.white(file)}`);
|
|
2911
|
+
console.log(` ${a.gray("Path:")} ${filePath}`);
|
|
2912
|
+
console.log(` ${a.gray("Modified:")} ${modified}`);
|
|
2902
2913
|
console.log("");
|
|
2903
2914
|
foundAny = true;
|
|
2904
2915
|
}
|
|
@@ -2906,9 +2917,9 @@ async function listInterviewSessions() {
|
|
|
2906
2917
|
}
|
|
2907
2918
|
}
|
|
2908
2919
|
if (!foundAny) {
|
|
2909
|
-
console.log(
|
|
2920
|
+
console.log(a.gray(" No saved sessions found."));
|
|
2910
2921
|
console.log("");
|
|
2911
|
-
console.log(
|
|
2922
|
+
console.log(a.gray(" Start a new interview with: ccjk interview"));
|
|
2912
2923
|
}
|
|
2913
2924
|
console.log("");
|
|
2914
2925
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import dayjs from '
|
|
2
|
-
import { join } from 'pathe';
|
|
1
|
+
import { d as dayjs } from '../shared/ccjk.RyizuzOI.mjs';
|
|
3
2
|
import { exists, readFile, writeFileAtomic, writeFile, ensureDir, copyFile } from './fs-operations.mjs';
|
|
3
|
+
import { j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
|
|
4
|
+
import '../shared/ccjk.BAGoDD49.mjs';
|
|
4
5
|
import 'node:crypto';
|
|
5
6
|
import 'node:fs';
|
|
6
7
|
import 'node:fs/promises';
|