juno-code 1.0.27 → 1.0.29

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/bin/cli.mjs CHANGED
@@ -3526,6 +3526,9 @@ function createExecutionRequest(options) {
3526
3526
  if (options.model !== void 0) {
3527
3527
  result.model = options.model;
3528
3528
  }
3529
+ if (options.agents !== void 0) {
3530
+ result.agents = options.agents;
3531
+ }
3529
3532
  if (options.mcpServerName !== void 0) {
3530
3533
  result.mcpServerName = options.mcpServerName;
3531
3534
  }
@@ -3974,6 +3977,7 @@ var init_engine = __esm({
3974
3977
  instruction: context.request.instruction,
3975
3978
  project_path: context.request.workingDirectory,
3976
3979
  ...context.request.model !== void 0 && { model: context.request.model },
3980
+ ...context.request.agents !== void 0 && { agents: context.request.agents },
3977
3981
  iteration: iterationNumber
3978
3982
  },
3979
3983
  timeout: context.request.timeoutMs || this.engineConfig.config.mcpTimeout,
@@ -7136,10 +7140,14 @@ var init_shell_backend = __esm({
7136
7140
  if (isPython && request.arguments?.model) {
7137
7141
  args.push("-m", request.arguments.model);
7138
7142
  }
7143
+ if (isPython && request.arguments?.agents) {
7144
+ args.push("--agents", request.arguments.agents);
7145
+ }
7139
7146
  if (this.config.debug) {
7140
7147
  engineLogger.debug(`Executing script: ${command} ${args.join(" ")}`);
7141
7148
  engineLogger.debug(`Working directory: ${this.config.workingDirectory}`);
7142
7149
  engineLogger.debug(`Environment variables: ${Object.keys(env2).filter((k) => k.startsWith("JUNO_")).join(", ")}`);
7150
+ engineLogger.debug(`Request arguments: ${JSON.stringify(request.arguments)}`);
7143
7151
  }
7144
7152
  const child = spawn(command, args, {
7145
7153
  env: env2,
@@ -12537,13 +12545,17 @@ async function mainCommandHandler(args, options, command) {
12537
12545
  if (options.verbose) {
12538
12546
  console.error(chalk15.gray(` Backend: ${getBackendDisplayName(selectedBackend)}`));
12539
12547
  }
12548
+ if (options.agents && selectedBackend !== "shell") {
12549
+ console.error(chalk15.yellow("\n\u26A0\uFE0F Note: --agents flag is only supported with shell backend and will be ignored"));
12550
+ }
12540
12551
  const executionRequest = createExecutionRequest({
12541
12552
  instruction,
12542
12553
  subagent: options.subagent,
12543
12554
  backend: selectedBackend,
12544
12555
  workingDirectory: config.workingDirectory,
12545
12556
  maxIterations: options.maxIterations || config.defaultMaxIterations,
12546
- model: options.model || config.defaultModel
12557
+ model: options.model || config.defaultModel,
12558
+ agents: options.agents
12547
12559
  });
12548
12560
  const coordinator = new MainExecutionCoordinator(config, options.verbose, options.enableFeedback || false);
12549
12561
  const result = await coordinator.execute(executionRequest);
@@ -12636,6 +12648,11 @@ function createMainCommand() {
12636
12648
  description: "Model to use (optional, subagent-specific)",
12637
12649
  env: "JUNO_CODE_MODEL"
12638
12650
  }),
12651
+ createOption({
12652
+ flags: "--agents <config>",
12653
+ description: "Agents configuration (forwarded to shell backend, ignored for MCP)",
12654
+ env: "JUNO_CODE_AGENTS"
12655
+ }),
12639
12656
  createOption({
12640
12657
  flags: "-I, --interactive",
12641
12658
  description: "Interactive mode for typing/pasting prompts",
@@ -16214,12 +16231,13 @@ async function initCommandHandler(args, options, command) {
16214
16231
  }
16215
16232
  }
16216
16233
  function configureInitCommand(program) {
16217
- program.command("init").description("Initialize new juno-code project with simple setup").argument("[directory]", "Target directory (default: current directory)").option("-f, --force", "Force overwrite existing files").option("-t, --task <description>", "Main task description").option("-g, --git-url <url>", "Git repository URL").option("-i, --interactive", "Launch simple interactive setup").action(async (directory, options, command) => {
16234
+ program.command("init").description("Initialize new juno-code project - supports both interactive and inline modes").argument("[description]", "Task description for inline mode (optional - triggers inline mode if provided)").option("-s, --subagent <name>", "AI subagent to use (claude, codex, gemini, cursor)").option("-g, --git-repo <url>", "Git repository URL").option("-d, --directory <path>", "Target directory (default: current directory)").option("-f, --force", "Force overwrite existing files").option("-i, --interactive", "Force interactive mode (even if description is provided)").option("--git-url <url>", "Git repository URL (alias for --git-repo)").option("-t, --task <description>", "Task description (alias for positional description)").action(async (description, options, command) => {
16235
+ const taskDescription = description || options.task;
16218
16236
  const initOptions = {
16219
- directory,
16237
+ directory: options.directory,
16220
16238
  force: options.force,
16221
- task: options.task,
16222
- gitUrl: options.gitUrl,
16239
+ task: taskDescription,
16240
+ gitUrl: options.gitRepo || options.gitUrl,
16223
16241
  subagent: options.subagent,
16224
16242
  interactive: options.interactive,
16225
16243
  // Global options
@@ -16231,12 +16249,35 @@ function configureInitCommand(program) {
16231
16249
  };
16232
16250
  await initCommandHandler([], initOptions, command);
16233
16251
  }).addHelpText("after", `
16234
- Examples:
16235
- $ juno-code init # Initialize in current directory
16236
- $ juno-code init my-project # Initialize in ./my-project
16237
- $ juno-code init --interactive # Use simple interactive setup
16252
+ Modes:
16253
+ Interactive Mode (default):
16254
+ $ juno-code init # Opens interactive TUI
16255
+ $ juno-code init --interactive # Force interactive mode
16256
+
16257
+ Inline Mode (for automation):
16258
+ $ juno-code init "Build a REST API" # Minimal inline mode
16259
+ $ juno-code init "Build a REST API" --subagent claude --git-repo https://github.com/owner/repo
16260
+ $ juno-code init "Build a REST API" --subagent codex --directory ./my-project
16238
16261
 
16239
- Simplified Interactive Flow:
16262
+ Examples:
16263
+ # Interactive mode (default)
16264
+ $ juno-code init # Initialize in current directory with TUI
16265
+ $ juno-code init --directory my-project # Initialize in ./my-project with TUI
16266
+
16267
+ # Inline mode (automation-friendly)
16268
+ $ juno-code init "Create a TypeScript library" # Quick init with inline description
16269
+ $ juno-code init "Build web app" --subagent claude # Specify AI subagent
16270
+ $ juno-code init "API server" --git-repo https://github.com/me/repo
16271
+
16272
+ Arguments & Options:
16273
+ [description] Task description (optional - triggers inline mode)
16274
+ -s, --subagent <name> AI subagent: claude, codex, gemini, cursor (default: claude)
16275
+ -g, --git-repo <url> Git repository URL
16276
+ -d, --directory <path> Target directory (default: current directory)
16277
+ -f, --force Force overwrite existing files
16278
+ -i, --interactive Force interactive mode
16279
+
16280
+ Interactive Flow:
16240
16281
  1. Project Root \u2192 Specify target directory
16241
16282
  2. Main Task \u2192 Multi-line description (no character limits)
16242
16283
  3. Subagent Selection \u2192 Choose from Claude, Codex, Gemini, Cursor
@@ -16244,10 +16285,10 @@ Simplified Interactive Flow:
16244
16285
  5. Save \u2192 Handle existing files with override/cancel options
16245
16286
 
16246
16287
  Notes:
16288
+ - All inline mode arguments are optional
16289
+ - Defaults: directory=cwd, subagent=claude, no git repo
16247
16290
  - No prompt cost calculation or token counting
16248
16291
  - No character limits on task descriptions
16249
- - Simple file structure with basic templates
16250
- - Focus on quick project setup without complexity
16251
16292
  `);
16252
16293
  }
16253
16294
 
@@ -16313,6 +16354,7 @@ async function startCommandHandler(args, options, command) {
16313
16354
  backend: options.backend,
16314
16355
  maxIterations: options.maxIterations,
16315
16356
  model: options.model,
16357
+ agents: options.agents,
16316
16358
  directory: options.directory,
16317
16359
  verbose: options.verbose,
16318
16360
  quiet: options.quiet,
@@ -16347,7 +16389,7 @@ async function startCommandHandler(args, options, command) {
16347
16389
  }
16348
16390
  }
16349
16391
  function configureStartCommand(program) {
16350
- program.command("start").description("Start execution using .juno_task/init.md as prompt").option("-s, --subagent <name>", "Subagent to use (claude, cursor, codex, gemini)").option("-b, --backend <type>", "Backend to use (mcp, shell)").option("-i, --max-iterations <number>", "Maximum number of iterations", parseInt).option("-m, --model <name>", "Model to use for execution").option("-d, --directory <path>", "Project directory (default: current)").option("--enable-feedback", "Enable concurrent feedback collection during execution").option("--show-metrics", "Display performance metrics summary after execution").option("--show-dashboard", "Show interactive performance dashboard after execution").option("--show-trends", "Display performance trends from historical data").option("--save-metrics [file]", "Save performance metrics to file (default: .juno_task/metrics.json)").option("--metrics-file <path>", "Specify custom path for metrics file").option("--dry-run", "Validate configuration and exit without executing").action(async (options, command) => {
16392
+ program.command("start").description("Start execution using .juno_task/init.md as prompt").option("-s, --subagent <name>", "Subagent to use (claude, cursor, codex, gemini)").option("-b, --backend <type>", "Backend to use (mcp, shell)").option("-i, --max-iterations <number>", "Maximum number of iterations", parseInt).option("-m, --model <name>", "Model to use for execution").option("--agents <config>", "Agents configuration (forwarded to shell backend, ignored for MCP)").option("-d, --directory <path>", "Project directory (default: current)").option("--enable-feedback", "Enable concurrent feedback collection during execution").option("--show-metrics", "Display performance metrics summary after execution").option("--show-dashboard", "Show interactive performance dashboard after execution").option("--show-trends", "Display performance trends from historical data").option("--save-metrics [file]", "Save performance metrics to file (default: .juno_task/metrics.json)").option("--metrics-file <path>", "Specify custom path for metrics file").option("--dry-run", "Validate configuration and exit without executing").action(async (options, command) => {
16351
16393
  const allOptions2 = command.optsWithGlobals ? command.optsWithGlobals() : { ...command.opts(), ...options };
16352
16394
  if (allOptions2.saveMetrics === true) {
16353
16395
  allOptions2.saveMetrics = true;
@@ -23608,10 +23650,13 @@ function setupGlobalOptions(program) {
23608
23650
  });
23609
23651
  }
23610
23652
  function setupMainCommand(program) {
23611
- program.option("-p, --prompt <text>", "Prompt input (file path or inline text)").option("-w, --cwd <path>", "Working directory").option("-i, --max-iterations <number>", "Maximum iterations (-1 for unlimited)", parseInt).option("-m, --model <name>", "Model to use (subagent-specific)").option("-b, --backend <type>", "Backend to use (mcp, shell)").option("-I, --interactive", "Interactive mode for typing prompts").option("-ip, --interactive-prompt", "Launch TUI prompt editor").action(async (options, command) => {
23653
+ program.option("-p, --prompt <text>", "Prompt input (file path or inline text)").option("-w, --cwd <path>", "Working directory").option("-i, --max-iterations <number>", "Maximum iterations (-1 for unlimited)", parseInt).option("-m, --model <name>", "Model to use (subagent-specific)").option("--agents <agents>", "Agents configuration (forwarded to claude.py when using shell backend)").option("-b, --backend <type>", "Backend to use (mcp, shell)").option("-I, --interactive", "Interactive mode for typing prompts").option("-ip, --interactive-prompt", "Launch TUI prompt editor").action(async (options, command) => {
23612
23654
  try {
23613
23655
  const globalOptions = program.opts();
23614
- const allOptions2 = { ...options, ...globalOptions };
23656
+ const definedGlobalOptions = Object.fromEntries(
23657
+ Object.entries(globalOptions).filter(([_, v]) => v !== void 0)
23658
+ );
23659
+ const allOptions2 = { ...definedGlobalOptions, ...options };
23615
23660
  if (!globalOptions.subagent && !options.prompt && !options.interactive && !options.interactivePrompt) {
23616
23661
  const fs21 = await import('fs-extra');
23617
23662
  const path23 = await import('path');