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.js +60 -15
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +60 -15
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/index.mjs.map +1 -1
- package/dist/templates/services/claude.py +12 -1
- package/package.json +1 -1
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
|
|
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:
|
|
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
|
-
|
|
16235
|
-
|
|
16236
|
-
|
|
16237
|
-
|
|
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
|
-
|
|
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
|
|
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');
|