juno-code 1.0.49 → 1.0.51
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/README.md +508 -202
- package/dist/bin/cli.d.mts +1 -1
- package/dist/bin/cli.d.ts +1 -1
- package/dist/bin/cli.js +3332 -1421
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/cli.mjs +3316 -1405
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/feedback-collector.js.map +1 -1
- package/dist/bin/feedback-collector.mjs.map +1 -1
- package/dist/index.d.mts +56 -19
- package/dist/index.d.ts +56 -19
- package/dist/index.js +240 -36
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +240 -36
- package/dist/index.mjs.map +1 -1
- package/dist/templates/scripts/install_requirements.sh +55 -5
- package/dist/templates/scripts/kanban.sh +11 -0
- package/dist/templates/services/README.md +23 -4
- package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
- package/dist/templates/services/pi.py +1933 -262
- package/dist/templates/skills/claude/kanban-workflow/SKILL.md +138 -0
- package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +1 -1
- package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +11 -0
- package/dist/templates/skills/claude/understand-project/SKILL.md +1 -1
- package/dist/templates/skills/codex/kanban-workflow/SKILL.md +139 -0
- package/dist/templates/skills/codex/plan-kanban-tasks/SKILL.md +32 -0
- package/dist/templates/skills/codex/ralph-loop/scripts/kanban.sh +11 -0
- package/dist/templates/skills/codex/understand-project/SKILL.md +46 -0
- package/dist/templates/skills/pi/kanban-workflow/SKILL.md +139 -0
- package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +1 -1
- package/dist/templates/skills/pi/ralph-loop/SKILL.md +4 -0
- package/dist/templates/skills/pi/understand-project/SKILL.md +1 -1
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/feedback-collector.ts"],"names":["EOL","spawn"],"mappings":"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","file":"feedback-collector.js","sourcesContent":["/**\n * Concurrent Feedback Collector\n *\n * Minimal multi-submit feedback collector that runs concurrently with ongoing processes.\n * - Type/paste feedback (multiline)\n * - Press Enter on a BLANK line to SUBMIT that block\n * - The feedback block is sent to feedback command via stdin for each submission\n * - Multiple blocks allowed; exit with EOF (Ctrl-D / Ctrl-Z then Enter) or Ctrl-C\n * - Progress logs go to stderr; UI/instructions to stdout\n * - NO TTY/Raw mode - simple line-based stdin for AI agent compatibility\n *\n * Usage:\n * juno-collect-feedback <command> [arg1 arg2 ...]\n * Example:\n * juno-collect-feedback node dist/bin/cli.mjs feedback\n * juno-collect-feedback juno-code feedback\n *\n * OR run standalone:\n * node dist/bin/feedback-collector.mjs\n */\n\nimport { spawn } from 'node:child_process';\nimport { EOL } from 'node:os';\n\n// Enable UTF-8 encoding for stdin\nprocess.stdin.setEncoding('utf8');\n\n// --- Parse command to run per submission ---\nconst [, , ...argv] = process.argv;\nconst cmd = argv.length > 0 ? argv[0] : 'node';\nconst cmdArgs = argv.length > 0 ? argv.slice(1) : ['dist/bin/cli.mjs', 'feedback'];\n\n// --- Progress ticker (simulates concurrent progress) ---\nlet tick = 0;\nconst start = Date.now();\nconst logTimer = setInterval(() => {\n tick += 1;\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n process.stderr.write(`[progress] step=${tick} elapsed=${elapsed}s${EOL}`);\n}, 1200);\n\n// --- UI header ---\nfunction printHeader(): void {\n process.stdout.write(\n [\n '',\n '📝 Concurrent Feedback Collector',\n ' Type or paste your feedback. Submit by pressing Enter on an EMPTY line.',\n ' (EOF ends the session: Ctrl-D on macOS/Linux; Ctrl-Z then Enter on Windows.)',\n '',\n ].join(EOL) + EOL,\n );\n}\nprintHeader();\n\n// --- Submission queue to keep commands sequential ---\nlet pending = Promise.resolve();\nlet submissionCount = 0;\n\n/**\n * Run feedback command with the collected input\n */\nfunction runCommandWithInput(input: string): Promise<number> {\n submissionCount += 1;\n const n = submissionCount;\n process.stderr.write(`${EOL}[submit ${n}] launching \"${cmd}\" ${cmdArgs.join(' ')}${EOL}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd as string, cmdArgs, { stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Pipe child's output to stderr (treat as logs)\n child.stdout?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stdout: ${d}`));\n child.stderr?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stderr: ${d}`));\n\n child.on('close', (code: number | null) => {\n process.stderr.write(`[submit ${n}] exit code ${code ?? 0}${EOL}`);\n resolve(code ?? 0);\n });\n\n child.on('error', (err: Error) => {\n process.stderr.write(`[submit ${n}] error: ${err.message}${EOL}`);\n resolve(1);\n });\n\n // Write the feedback block to child stdin\n if (child.stdin) {\n child.stdin.write(input);\n if (!input.endsWith(EOL)) {\n child.stdin.write(EOL);\n }\n child.stdin.end();\n }\n });\n}\n\n/**\n * Enqueue submission to ensure strict sequential order\n */\nfunction enqueueSubmission(input: string): Promise<void> {\n // Ensure strict order by chaining onto `pending`\n pending = pending.then(() => runCommandWithInput(input).then(() => {}));\n return pending;\n}\n\n// --- Input handling: multiline buffer; blank line => submit ---\nlet carry = '';\nlet buffer = ''; // current feedback block\nlet lastLineWasBlank = false;\n\n/**\n * Submit the current buffer if it has content\n */\nfunction submitBufferIfAny(): void {\n const content = buffer.trimEnd();\n buffer = ''; // \"clean stdin\" buffer for the next round\n\n if (content.length === 0) {\n return;\n }\n\n process.stdout.write(EOL + '===== SUBMITTING FEEDBACK BLOCK =====' + EOL);\n process.stdout.write(content + EOL);\n process.stdout.write('===== END BLOCK =====' + EOL);\n\n enqueueSubmission(content)\n .then(() => {\n // After the command finishes (still sequential), re-prompt\n process.stdout.write(EOL + '✅ Submission processed. You can type another block.' + EOL);\n })\n .catch((err) => {\n process.stderr.write(`Error submitting feedback: ${err}${EOL}`);\n });\n}\n\n// Handle stdin data events\nprocess.stdin.on('data', (chunk: string) => {\n carry += chunk;\n\n // Split into complete lines, keep the last partial in carry\n const parts = carry.split(/\\r?\\n/);\n carry = parts.pop() ?? '';\n\n for (const line of parts) {\n const isBlank = line.trim().length === 0;\n\n if (isBlank && !lastLineWasBlank) {\n // A single blank line means \"submit this block\"\n submitBufferIfAny();\n lastLineWasBlank = true;\n continue;\n }\n\n if (!isBlank) {\n // Any non-blank line is part of the current block\n buffer += line + EOL;\n lastLineWasBlank = false;\n } else {\n // Consecutive blank lines: ignore (prevent accidental multiple submits)\n lastLineWasBlank = true;\n }\n }\n});\n\n// Handle stdin end event (EOF)\nprocess.stdin.on('end', async () => {\n // If there is remaining partial data, treat as part of the last block\n if (carry.length) {\n buffer += carry;\n }\n\n submitBufferIfAny();\n await pending; // wait for in-flight submissions\n\n clearInterval(logTimer);\n process.stderr.write(`${EOL}[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle SIGINT (Ctrl+C)\nprocess.on('SIGINT', async () => {\n process.stderr.write(`${EOL}[progress] SIGINT received. Finalizing…${EOL}`);\n\n submitBufferIfAny();\n await pending;\n\n clearInterval(logTimer);\n process.stderr.write(`[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (err) => {\n process.stderr.write(`${EOL}[error] Uncaught exception: ${err.message}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n process.stderr.write(`${EOL}[error] Unhandled rejection: ${reason}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/feedback-collector.ts"],"names":["EOL","spawn"],"mappings":"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","file":"feedback-collector.js","sourcesContent":["/**\n * Concurrent Feedback Collector\n *\n * Minimal multi-submit feedback collector that runs concurrently with ongoing processes.\n * - Type/paste feedback (multiline)\n * - Press Enter on a BLANK line to SUBMIT that block\n * - The feedback block is sent to feedback command via stdin for each submission\n * - Multiple blocks allowed; exit with EOF (Ctrl-D / Ctrl-Z then Enter) or Ctrl-C\n * - Progress logs go to stderr; UI/instructions to stdout\n * - NO TTY/Raw mode - simple line-based stdin for AI agent compatibility\n *\n * Usage:\n * feedback-juno-code <command> [arg1 arg2 ...]\n * Example:\n * feedback-juno-code node dist/bin/cli.mjs feedback\n * feedback-juno-code juno-code feedback\n *\n * OR run standalone:\n * node dist/bin/feedback-collector.mjs\n */\n\nimport { spawn } from 'node:child_process';\nimport { EOL } from 'node:os';\n\n// Enable UTF-8 encoding for stdin\nprocess.stdin.setEncoding('utf8');\n\n// --- Parse command to run per submission ---\nconst [, , ...argv] = process.argv;\nconst cmd = argv.length > 0 ? argv[0] : 'node';\nconst cmdArgs = argv.length > 0 ? argv.slice(1) : ['dist/bin/cli.mjs', 'feedback'];\n\n// --- Progress ticker (simulates concurrent progress) ---\nlet tick = 0;\nconst start = Date.now();\nconst logTimer = setInterval(() => {\n tick += 1;\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n process.stderr.write(`[progress] step=${tick} elapsed=${elapsed}s${EOL}`);\n}, 1200);\n\n// --- UI header ---\nfunction printHeader(): void {\n process.stdout.write(\n [\n '',\n '📝 Concurrent Feedback Collector',\n ' Type or paste your feedback. Submit by pressing Enter on an EMPTY line.',\n ' (EOF ends the session: Ctrl-D on macOS/Linux; Ctrl-Z then Enter on Windows.)',\n '',\n ].join(EOL) + EOL,\n );\n}\nprintHeader();\n\n// --- Submission queue to keep commands sequential ---\nlet pending = Promise.resolve();\nlet submissionCount = 0;\n\n/**\n * Run feedback command with the collected input\n */\nfunction runCommandWithInput(input: string): Promise<number> {\n submissionCount += 1;\n const n = submissionCount;\n process.stderr.write(`${EOL}[submit ${n}] launching \"${cmd}\" ${cmdArgs.join(' ')}${EOL}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd as string, cmdArgs, { stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Pipe child's output to stderr (treat as logs)\n child.stdout?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stdout: ${d}`));\n child.stderr?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stderr: ${d}`));\n\n child.on('close', (code: number | null) => {\n process.stderr.write(`[submit ${n}] exit code ${code ?? 0}${EOL}`);\n resolve(code ?? 0);\n });\n\n child.on('error', (err: Error) => {\n process.stderr.write(`[submit ${n}] error: ${err.message}${EOL}`);\n resolve(1);\n });\n\n // Write the feedback block to child stdin\n if (child.stdin) {\n child.stdin.write(input);\n if (!input.endsWith(EOL)) {\n child.stdin.write(EOL);\n }\n child.stdin.end();\n }\n });\n}\n\n/**\n * Enqueue submission to ensure strict sequential order\n */\nfunction enqueueSubmission(input: string): Promise<void> {\n // Ensure strict order by chaining onto `pending`\n pending = pending.then(() => runCommandWithInput(input).then(() => {}));\n return pending;\n}\n\n// --- Input handling: multiline buffer; blank line => submit ---\nlet carry = '';\nlet buffer = ''; // current feedback block\nlet lastLineWasBlank = false;\n\n/**\n * Submit the current buffer if it has content\n */\nfunction submitBufferIfAny(): void {\n const content = buffer.trimEnd();\n buffer = ''; // \"clean stdin\" buffer for the next round\n\n if (content.length === 0) {\n return;\n }\n\n process.stdout.write(EOL + '===== SUBMITTING FEEDBACK BLOCK =====' + EOL);\n process.stdout.write(content + EOL);\n process.stdout.write('===== END BLOCK =====' + EOL);\n\n enqueueSubmission(content)\n .then(() => {\n // After the command finishes (still sequential), re-prompt\n process.stdout.write(EOL + '✅ Submission processed. You can type another block.' + EOL);\n })\n .catch((err) => {\n process.stderr.write(`Error submitting feedback: ${err}${EOL}`);\n });\n}\n\n// Handle stdin data events\nprocess.stdin.on('data', (chunk: string) => {\n carry += chunk;\n\n // Split into complete lines, keep the last partial in carry\n const parts = carry.split(/\\r?\\n/);\n carry = parts.pop() ?? '';\n\n for (const line of parts) {\n const isBlank = line.trim().length === 0;\n\n if (isBlank && !lastLineWasBlank) {\n // A single blank line means \"submit this block\"\n submitBufferIfAny();\n lastLineWasBlank = true;\n continue;\n }\n\n if (!isBlank) {\n // Any non-blank line is part of the current block\n buffer += line + EOL;\n lastLineWasBlank = false;\n } else {\n // Consecutive blank lines: ignore (prevent accidental multiple submits)\n lastLineWasBlank = true;\n }\n }\n});\n\n// Handle stdin end event (EOF)\nprocess.stdin.on('end', async () => {\n // If there is remaining partial data, treat as part of the last block\n if (carry.length) {\n buffer += carry;\n }\n\n submitBufferIfAny();\n await pending; // wait for in-flight submissions\n\n clearInterval(logTimer);\n process.stderr.write(`${EOL}[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle SIGINT (Ctrl+C)\nprocess.on('SIGINT', async () => {\n process.stderr.write(`${EOL}[progress] SIGINT received. Finalizing…${EOL}`);\n\n submitBufferIfAny();\n await pending;\n\n clearInterval(logTimer);\n process.stderr.write(`[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (err) => {\n process.stderr.write(`${EOL}[error] Uncaught exception: ${err.message}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n process.stderr.write(`${EOL}[error] Unhandled rejection: ${reason}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/feedback-collector.ts"],"names":[],"mappings":"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","file":"feedback-collector.mjs","sourcesContent":["/**\n * Concurrent Feedback Collector\n *\n * Minimal multi-submit feedback collector that runs concurrently with ongoing processes.\n * - Type/paste feedback (multiline)\n * - Press Enter on a BLANK line to SUBMIT that block\n * - The feedback block is sent to feedback command via stdin for each submission\n * - Multiple blocks allowed; exit with EOF (Ctrl-D / Ctrl-Z then Enter) or Ctrl-C\n * - Progress logs go to stderr; UI/instructions to stdout\n * - NO TTY/Raw mode - simple line-based stdin for AI agent compatibility\n *\n * Usage:\n * juno-collect-feedback <command> [arg1 arg2 ...]\n * Example:\n * juno-collect-feedback node dist/bin/cli.mjs feedback\n * juno-collect-feedback juno-code feedback\n *\n * OR run standalone:\n * node dist/bin/feedback-collector.mjs\n */\n\nimport { spawn } from 'node:child_process';\nimport { EOL } from 'node:os';\n\n// Enable UTF-8 encoding for stdin\nprocess.stdin.setEncoding('utf8');\n\n// --- Parse command to run per submission ---\nconst [, , ...argv] = process.argv;\nconst cmd = argv.length > 0 ? argv[0] : 'node';\nconst cmdArgs = argv.length > 0 ? argv.slice(1) : ['dist/bin/cli.mjs', 'feedback'];\n\n// --- Progress ticker (simulates concurrent progress) ---\nlet tick = 0;\nconst start = Date.now();\nconst logTimer = setInterval(() => {\n tick += 1;\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n process.stderr.write(`[progress] step=${tick} elapsed=${elapsed}s${EOL}`);\n}, 1200);\n\n// --- UI header ---\nfunction printHeader(): void {\n process.stdout.write(\n [\n '',\n '📝 Concurrent Feedback Collector',\n ' Type or paste your feedback. Submit by pressing Enter on an EMPTY line.',\n ' (EOF ends the session: Ctrl-D on macOS/Linux; Ctrl-Z then Enter on Windows.)',\n '',\n ].join(EOL) + EOL,\n );\n}\nprintHeader();\n\n// --- Submission queue to keep commands sequential ---\nlet pending = Promise.resolve();\nlet submissionCount = 0;\n\n/**\n * Run feedback command with the collected input\n */\nfunction runCommandWithInput(input: string): Promise<number> {\n submissionCount += 1;\n const n = submissionCount;\n process.stderr.write(`${EOL}[submit ${n}] launching \"${cmd}\" ${cmdArgs.join(' ')}${EOL}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd as string, cmdArgs, { stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Pipe child's output to stderr (treat as logs)\n child.stdout?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stdout: ${d}`));\n child.stderr?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stderr: ${d}`));\n\n child.on('close', (code: number | null) => {\n process.stderr.write(`[submit ${n}] exit code ${code ?? 0}${EOL}`);\n resolve(code ?? 0);\n });\n\n child.on('error', (err: Error) => {\n process.stderr.write(`[submit ${n}] error: ${err.message}${EOL}`);\n resolve(1);\n });\n\n // Write the feedback block to child stdin\n if (child.stdin) {\n child.stdin.write(input);\n if (!input.endsWith(EOL)) {\n child.stdin.write(EOL);\n }\n child.stdin.end();\n }\n });\n}\n\n/**\n * Enqueue submission to ensure strict sequential order\n */\nfunction enqueueSubmission(input: string): Promise<void> {\n // Ensure strict order by chaining onto `pending`\n pending = pending.then(() => runCommandWithInput(input).then(() => {}));\n return pending;\n}\n\n// --- Input handling: multiline buffer; blank line => submit ---\nlet carry = '';\nlet buffer = ''; // current feedback block\nlet lastLineWasBlank = false;\n\n/**\n * Submit the current buffer if it has content\n */\nfunction submitBufferIfAny(): void {\n const content = buffer.trimEnd();\n buffer = ''; // \"clean stdin\" buffer for the next round\n\n if (content.length === 0) {\n return;\n }\n\n process.stdout.write(EOL + '===== SUBMITTING FEEDBACK BLOCK =====' + EOL);\n process.stdout.write(content + EOL);\n process.stdout.write('===== END BLOCK =====' + EOL);\n\n enqueueSubmission(content)\n .then(() => {\n // After the command finishes (still sequential), re-prompt\n process.stdout.write(EOL + '✅ Submission processed. You can type another block.' + EOL);\n })\n .catch((err) => {\n process.stderr.write(`Error submitting feedback: ${err}${EOL}`);\n });\n}\n\n// Handle stdin data events\nprocess.stdin.on('data', (chunk: string) => {\n carry += chunk;\n\n // Split into complete lines, keep the last partial in carry\n const parts = carry.split(/\\r?\\n/);\n carry = parts.pop() ?? '';\n\n for (const line of parts) {\n const isBlank = line.trim().length === 0;\n\n if (isBlank && !lastLineWasBlank) {\n // A single blank line means \"submit this block\"\n submitBufferIfAny();\n lastLineWasBlank = true;\n continue;\n }\n\n if (!isBlank) {\n // Any non-blank line is part of the current block\n buffer += line + EOL;\n lastLineWasBlank = false;\n } else {\n // Consecutive blank lines: ignore (prevent accidental multiple submits)\n lastLineWasBlank = true;\n }\n }\n});\n\n// Handle stdin end event (EOF)\nprocess.stdin.on('end', async () => {\n // If there is remaining partial data, treat as part of the last block\n if (carry.length) {\n buffer += carry;\n }\n\n submitBufferIfAny();\n await pending; // wait for in-flight submissions\n\n clearInterval(logTimer);\n process.stderr.write(`${EOL}[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle SIGINT (Ctrl+C)\nprocess.on('SIGINT', async () => {\n process.stderr.write(`${EOL}[progress] SIGINT received. Finalizing…${EOL}`);\n\n submitBufferIfAny();\n await pending;\n\n clearInterval(logTimer);\n process.stderr.write(`[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (err) => {\n process.stderr.write(`${EOL}[error] Uncaught exception: ${err.message}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n process.stderr.write(`${EOL}[error] Unhandled rejection: ${reason}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/feedback-collector.ts"],"names":[],"mappings":"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","file":"feedback-collector.mjs","sourcesContent":["/**\n * Concurrent Feedback Collector\n *\n * Minimal multi-submit feedback collector that runs concurrently with ongoing processes.\n * - Type/paste feedback (multiline)\n * - Press Enter on a BLANK line to SUBMIT that block\n * - The feedback block is sent to feedback command via stdin for each submission\n * - Multiple blocks allowed; exit with EOF (Ctrl-D / Ctrl-Z then Enter) or Ctrl-C\n * - Progress logs go to stderr; UI/instructions to stdout\n * - NO TTY/Raw mode - simple line-based stdin for AI agent compatibility\n *\n * Usage:\n * feedback-juno-code <command> [arg1 arg2 ...]\n * Example:\n * feedback-juno-code node dist/bin/cli.mjs feedback\n * feedback-juno-code juno-code feedback\n *\n * OR run standalone:\n * node dist/bin/feedback-collector.mjs\n */\n\nimport { spawn } from 'node:child_process';\nimport { EOL } from 'node:os';\n\n// Enable UTF-8 encoding for stdin\nprocess.stdin.setEncoding('utf8');\n\n// --- Parse command to run per submission ---\nconst [, , ...argv] = process.argv;\nconst cmd = argv.length > 0 ? argv[0] : 'node';\nconst cmdArgs = argv.length > 0 ? argv.slice(1) : ['dist/bin/cli.mjs', 'feedback'];\n\n// --- Progress ticker (simulates concurrent progress) ---\nlet tick = 0;\nconst start = Date.now();\nconst logTimer = setInterval(() => {\n tick += 1;\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n process.stderr.write(`[progress] step=${tick} elapsed=${elapsed}s${EOL}`);\n}, 1200);\n\n// --- UI header ---\nfunction printHeader(): void {\n process.stdout.write(\n [\n '',\n '📝 Concurrent Feedback Collector',\n ' Type or paste your feedback. Submit by pressing Enter on an EMPTY line.',\n ' (EOF ends the session: Ctrl-D on macOS/Linux; Ctrl-Z then Enter on Windows.)',\n '',\n ].join(EOL) + EOL,\n );\n}\nprintHeader();\n\n// --- Submission queue to keep commands sequential ---\nlet pending = Promise.resolve();\nlet submissionCount = 0;\n\n/**\n * Run feedback command with the collected input\n */\nfunction runCommandWithInput(input: string): Promise<number> {\n submissionCount += 1;\n const n = submissionCount;\n process.stderr.write(`${EOL}[submit ${n}] launching \"${cmd}\" ${cmdArgs.join(' ')}${EOL}`);\n\n return new Promise((resolve) => {\n const child = spawn(cmd as string, cmdArgs, { stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Pipe child's output to stderr (treat as logs)\n child.stdout?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stdout: ${d}`));\n child.stderr?.on('data', (d: Buffer) => process.stderr.write(`[submit ${n}] stderr: ${d}`));\n\n child.on('close', (code: number | null) => {\n process.stderr.write(`[submit ${n}] exit code ${code ?? 0}${EOL}`);\n resolve(code ?? 0);\n });\n\n child.on('error', (err: Error) => {\n process.stderr.write(`[submit ${n}] error: ${err.message}${EOL}`);\n resolve(1);\n });\n\n // Write the feedback block to child stdin\n if (child.stdin) {\n child.stdin.write(input);\n if (!input.endsWith(EOL)) {\n child.stdin.write(EOL);\n }\n child.stdin.end();\n }\n });\n}\n\n/**\n * Enqueue submission to ensure strict sequential order\n */\nfunction enqueueSubmission(input: string): Promise<void> {\n // Ensure strict order by chaining onto `pending`\n pending = pending.then(() => runCommandWithInput(input).then(() => {}));\n return pending;\n}\n\n// --- Input handling: multiline buffer; blank line => submit ---\nlet carry = '';\nlet buffer = ''; // current feedback block\nlet lastLineWasBlank = false;\n\n/**\n * Submit the current buffer if it has content\n */\nfunction submitBufferIfAny(): void {\n const content = buffer.trimEnd();\n buffer = ''; // \"clean stdin\" buffer for the next round\n\n if (content.length === 0) {\n return;\n }\n\n process.stdout.write(EOL + '===== SUBMITTING FEEDBACK BLOCK =====' + EOL);\n process.stdout.write(content + EOL);\n process.stdout.write('===== END BLOCK =====' + EOL);\n\n enqueueSubmission(content)\n .then(() => {\n // After the command finishes (still sequential), re-prompt\n process.stdout.write(EOL + '✅ Submission processed. You can type another block.' + EOL);\n })\n .catch((err) => {\n process.stderr.write(`Error submitting feedback: ${err}${EOL}`);\n });\n}\n\n// Handle stdin data events\nprocess.stdin.on('data', (chunk: string) => {\n carry += chunk;\n\n // Split into complete lines, keep the last partial in carry\n const parts = carry.split(/\\r?\\n/);\n carry = parts.pop() ?? '';\n\n for (const line of parts) {\n const isBlank = line.trim().length === 0;\n\n if (isBlank && !lastLineWasBlank) {\n // A single blank line means \"submit this block\"\n submitBufferIfAny();\n lastLineWasBlank = true;\n continue;\n }\n\n if (!isBlank) {\n // Any non-blank line is part of the current block\n buffer += line + EOL;\n lastLineWasBlank = false;\n } else {\n // Consecutive blank lines: ignore (prevent accidental multiple submits)\n lastLineWasBlank = true;\n }\n }\n});\n\n// Handle stdin end event (EOF)\nprocess.stdin.on('end', async () => {\n // If there is remaining partial data, treat as part of the last block\n if (carry.length) {\n buffer += carry;\n }\n\n submitBufferIfAny();\n await pending; // wait for in-flight submissions\n\n clearInterval(logTimer);\n process.stderr.write(`${EOL}[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle SIGINT (Ctrl+C)\nprocess.on('SIGINT', async () => {\n process.stderr.write(`${EOL}[progress] SIGINT received. Finalizing…${EOL}`);\n\n submitBufferIfAny();\n await pending;\n\n clearInterval(logTimer);\n process.stderr.write(`[progress] done. submissions=${submissionCount}${EOL}`);\n process.exit(0);\n});\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (err) => {\n process.stderr.write(`${EOL}[error] Uncaught exception: ${err.message}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n process.stderr.write(`${EOL}[error] Unhandled rejection: ${reason}${EOL}`);\n clearInterval(logTimer);\n process.exit(1);\n});\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -19,11 +19,14 @@ interface JunoTaskConfig {
|
|
|
19
19
|
defaultSubagent: SubagentType;
|
|
20
20
|
defaultMaxIterations: number;
|
|
21
21
|
defaultModel?: string;
|
|
22
|
+
/** Optional per-subagent default model overrides */
|
|
23
|
+
defaultModels?: Partial<Record<SubagentType, string>>;
|
|
22
24
|
defaultBackend: BackendType;
|
|
23
25
|
mainTask?: string;
|
|
24
26
|
logLevel: LogLevel;
|
|
25
27
|
logFile?: string;
|
|
26
|
-
|
|
28
|
+
/** Verbosity level: 0=quiet, 1=normal+helping texts (default), 2=debug+hooks */
|
|
29
|
+
verbose: number;
|
|
27
30
|
quiet: boolean;
|
|
28
31
|
mcpTimeout: number;
|
|
29
32
|
mcpRetries: number;
|
|
@@ -35,6 +38,10 @@ interface JunoTaskConfig {
|
|
|
35
38
|
headlessMode: boolean;
|
|
36
39
|
workingDirectory: string;
|
|
37
40
|
sessionDirectory: string;
|
|
41
|
+
/** Path to project env file loaded on startup (relative to workingDirectory or absolute) */
|
|
42
|
+
envFilePath?: string;
|
|
43
|
+
/** Tracks whether the configured env file has been initialized from .env.juno */
|
|
44
|
+
envFileCopied?: boolean;
|
|
38
45
|
hooks?: Hooks;
|
|
39
46
|
skipHooks?: boolean;
|
|
40
47
|
}
|
|
@@ -86,10 +93,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
86
93
|
defaultBackend: z.ZodEnum<["shell"]>;
|
|
87
94
|
defaultMaxIterations: z.ZodNumber;
|
|
88
95
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
96
|
+
defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
|
|
89
97
|
mainTask: z.ZodOptional<z.ZodString>;
|
|
90
98
|
logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
|
|
91
99
|
logFile: z.ZodOptional<z.ZodString>;
|
|
92
|
-
verbose: z.
|
|
100
|
+
verbose: z.ZodEffects<z.ZodNumber, number, unknown>;
|
|
93
101
|
quiet: z.ZodBoolean;
|
|
94
102
|
mcpTimeout: z.ZodNumber;
|
|
95
103
|
mcpRetries: z.ZodNumber;
|
|
@@ -101,6 +109,8 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
101
109
|
headlessMode: z.ZodBoolean;
|
|
102
110
|
workingDirectory: z.ZodString;
|
|
103
111
|
sessionDirectory: z.ZodString;
|
|
112
|
+
envFilePath: z.ZodOptional<z.ZodString>;
|
|
113
|
+
envFileCopied: z.ZodOptional<z.ZodBoolean>;
|
|
104
114
|
hooks: z.ZodOptional<z.ZodRecord<z.ZodEnum<["START_RUN", "START_ITERATION", "END_ITERATION", "END_RUN", "ON_STALE"]>, z.ZodObject<{
|
|
105
115
|
commands: z.ZodArray<z.ZodString, "many">;
|
|
106
116
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -111,12 +121,14 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
111
121
|
skipHooks: z.ZodOptional<z.ZodBoolean>;
|
|
112
122
|
}, "strict", z.ZodTypeAny, {
|
|
113
123
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
114
|
-
defaultBackend?: "shell";
|
|
115
|
-
defaultMaxIterations?: number;
|
|
116
124
|
defaultModel?: string;
|
|
125
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
126
|
+
defaultMaxIterations?: number;
|
|
127
|
+
defaultBackend?: "shell";
|
|
128
|
+
mainTask?: string;
|
|
117
129
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
118
130
|
logFile?: string;
|
|
119
|
-
verbose?:
|
|
131
|
+
verbose?: number;
|
|
120
132
|
quiet?: boolean;
|
|
121
133
|
mcpTimeout?: number;
|
|
122
134
|
mcpRetries?: number;
|
|
@@ -128,19 +140,22 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
128
140
|
headlessMode?: boolean;
|
|
129
141
|
workingDirectory?: string;
|
|
130
142
|
sessionDirectory?: string;
|
|
131
|
-
|
|
143
|
+
envFilePath?: string;
|
|
144
|
+
envFileCopied?: boolean;
|
|
132
145
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
133
146
|
commands?: string[];
|
|
134
147
|
}>>;
|
|
135
148
|
skipHooks?: boolean;
|
|
136
149
|
}, {
|
|
137
150
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
138
|
-
defaultBackend?: "shell";
|
|
139
|
-
defaultMaxIterations?: number;
|
|
140
151
|
defaultModel?: string;
|
|
152
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
153
|
+
defaultMaxIterations?: number;
|
|
154
|
+
defaultBackend?: "shell";
|
|
155
|
+
mainTask?: string;
|
|
141
156
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
142
157
|
logFile?: string;
|
|
143
|
-
verbose?:
|
|
158
|
+
verbose?: unknown;
|
|
144
159
|
quiet?: boolean;
|
|
145
160
|
mcpTimeout?: number;
|
|
146
161
|
mcpRetries?: number;
|
|
@@ -152,7 +167,8 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
152
167
|
headlessMode?: boolean;
|
|
153
168
|
workingDirectory?: string;
|
|
154
169
|
sessionDirectory?: string;
|
|
155
|
-
|
|
170
|
+
envFilePath?: string;
|
|
171
|
+
envFileCopied?: boolean;
|
|
156
172
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
157
173
|
commands?: string[];
|
|
158
174
|
}>>;
|
|
@@ -719,6 +735,10 @@ interface ExecutionRequest {
|
|
|
719
735
|
readonly resume?: string;
|
|
720
736
|
/** Continue the most recent conversation (forwarded to shell backend) */
|
|
721
737
|
readonly continueConversation?: boolean;
|
|
738
|
+
/** Extended thinking level (forwarded to shell backend --thinking flag) */
|
|
739
|
+
readonly thinking?: string;
|
|
740
|
+
/** Run Pi subagent in interactive live mode (forwarded to shell backend --live flag) */
|
|
741
|
+
readonly live?: boolean;
|
|
722
742
|
}
|
|
723
743
|
/**
|
|
724
744
|
* Execution result interface for completed executions
|
|
@@ -1019,6 +1039,12 @@ declare class ExecutionEngine extends EventEmitter {
|
|
|
1019
1039
|
* Setup progress tracking for the engine
|
|
1020
1040
|
*/
|
|
1021
1041
|
private setupProgressTracking;
|
|
1042
|
+
/**
|
|
1043
|
+
* Display hook execution output to stderr at verbose level 2 (debug+hooks).
|
|
1044
|
+
* At level 2: shows hook name, command stdout/stderr output.
|
|
1045
|
+
* At level 0-1: output is suppressed (hooks still execute).
|
|
1046
|
+
*/
|
|
1047
|
+
private displayHookOutput;
|
|
1022
1048
|
/**
|
|
1023
1049
|
* Initialize backend for execution request.
|
|
1024
1050
|
* Directly creates and configures a ShellBackend (no factory indirection).
|
|
@@ -1168,6 +1194,8 @@ declare function createExecutionRequest(options: {
|
|
|
1168
1194
|
mcpServerName?: string;
|
|
1169
1195
|
resume?: string;
|
|
1170
1196
|
continueConversation?: boolean;
|
|
1197
|
+
thinking?: string;
|
|
1198
|
+
live?: boolean;
|
|
1171
1199
|
}): ExecutionRequest;
|
|
1172
1200
|
|
|
1173
1201
|
/** Session metadata */
|
|
@@ -2006,10 +2034,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2006
2034
|
defaultBackend: z.ZodEnum<["shell"]>;
|
|
2007
2035
|
defaultMaxIterations: z.ZodNumber;
|
|
2008
2036
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
2037
|
+
defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
|
|
2009
2038
|
mainTask: z.ZodOptional<z.ZodString>;
|
|
2010
2039
|
logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
|
|
2011
2040
|
logFile: z.ZodOptional<z.ZodString>;
|
|
2012
|
-
verbose: z.
|
|
2041
|
+
verbose: z.ZodEffects<z.ZodNumber, number, unknown>;
|
|
2013
2042
|
quiet: z.ZodBoolean;
|
|
2014
2043
|
mcpTimeout: z.ZodNumber;
|
|
2015
2044
|
mcpRetries: z.ZodNumber;
|
|
@@ -2021,6 +2050,8 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2021
2050
|
headlessMode: z.ZodBoolean;
|
|
2022
2051
|
workingDirectory: z.ZodString;
|
|
2023
2052
|
sessionDirectory: z.ZodString;
|
|
2053
|
+
envFilePath: z.ZodOptional<z.ZodString>;
|
|
2054
|
+
envFileCopied: z.ZodOptional<z.ZodBoolean>;
|
|
2024
2055
|
hooks: z.ZodOptional<z.ZodRecord<z.ZodEnum<["START_RUN", "START_ITERATION", "END_ITERATION", "END_RUN", "ON_STALE"]>, z.ZodObject<{
|
|
2025
2056
|
commands: z.ZodArray<z.ZodString, "many">;
|
|
2026
2057
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -2031,12 +2062,14 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2031
2062
|
skipHooks: z.ZodOptional<z.ZodBoolean>;
|
|
2032
2063
|
}, "strict", z.ZodTypeAny, {
|
|
2033
2064
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
2034
|
-
defaultBackend?: "shell";
|
|
2035
|
-
defaultMaxIterations?: number;
|
|
2036
2065
|
defaultModel?: string;
|
|
2066
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
2067
|
+
defaultMaxIterations?: number;
|
|
2068
|
+
defaultBackend?: "shell";
|
|
2069
|
+
mainTask?: string;
|
|
2037
2070
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
2038
2071
|
logFile?: string;
|
|
2039
|
-
verbose?:
|
|
2072
|
+
verbose?: number;
|
|
2040
2073
|
quiet?: boolean;
|
|
2041
2074
|
mcpTimeout?: number;
|
|
2042
2075
|
mcpRetries?: number;
|
|
@@ -2048,19 +2081,22 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2048
2081
|
headlessMode?: boolean;
|
|
2049
2082
|
workingDirectory?: string;
|
|
2050
2083
|
sessionDirectory?: string;
|
|
2051
|
-
|
|
2084
|
+
envFilePath?: string;
|
|
2085
|
+
envFileCopied?: boolean;
|
|
2052
2086
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
2053
2087
|
commands?: string[];
|
|
2054
2088
|
}>>;
|
|
2055
2089
|
skipHooks?: boolean;
|
|
2056
2090
|
}, {
|
|
2057
2091
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
2058
|
-
defaultBackend?: "shell";
|
|
2059
|
-
defaultMaxIterations?: number;
|
|
2060
2092
|
defaultModel?: string;
|
|
2093
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
2094
|
+
defaultMaxIterations?: number;
|
|
2095
|
+
defaultBackend?: "shell";
|
|
2096
|
+
mainTask?: string;
|
|
2061
2097
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
2062
2098
|
logFile?: string;
|
|
2063
|
-
verbose?:
|
|
2099
|
+
verbose?: unknown;
|
|
2064
2100
|
quiet?: boolean;
|
|
2065
2101
|
mcpTimeout?: number;
|
|
2066
2102
|
mcpRetries?: number;
|
|
@@ -2072,7 +2108,8 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2072
2108
|
headlessMode?: boolean;
|
|
2073
2109
|
workingDirectory?: string;
|
|
2074
2110
|
sessionDirectory?: string;
|
|
2075
|
-
|
|
2111
|
+
envFilePath?: string;
|
|
2112
|
+
envFileCopied?: boolean;
|
|
2076
2113
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
2077
2114
|
commands?: string[];
|
|
2078
2115
|
}>>;
|
package/dist/index.d.ts
CHANGED
|
@@ -19,11 +19,14 @@ interface JunoTaskConfig {
|
|
|
19
19
|
defaultSubagent: SubagentType;
|
|
20
20
|
defaultMaxIterations: number;
|
|
21
21
|
defaultModel?: string;
|
|
22
|
+
/** Optional per-subagent default model overrides */
|
|
23
|
+
defaultModels?: Partial<Record<SubagentType, string>>;
|
|
22
24
|
defaultBackend: BackendType;
|
|
23
25
|
mainTask?: string;
|
|
24
26
|
logLevel: LogLevel;
|
|
25
27
|
logFile?: string;
|
|
26
|
-
|
|
28
|
+
/** Verbosity level: 0=quiet, 1=normal+helping texts (default), 2=debug+hooks */
|
|
29
|
+
verbose: number;
|
|
27
30
|
quiet: boolean;
|
|
28
31
|
mcpTimeout: number;
|
|
29
32
|
mcpRetries: number;
|
|
@@ -35,6 +38,10 @@ interface JunoTaskConfig {
|
|
|
35
38
|
headlessMode: boolean;
|
|
36
39
|
workingDirectory: string;
|
|
37
40
|
sessionDirectory: string;
|
|
41
|
+
/** Path to project env file loaded on startup (relative to workingDirectory or absolute) */
|
|
42
|
+
envFilePath?: string;
|
|
43
|
+
/** Tracks whether the configured env file has been initialized from .env.juno */
|
|
44
|
+
envFileCopied?: boolean;
|
|
38
45
|
hooks?: Hooks;
|
|
39
46
|
skipHooks?: boolean;
|
|
40
47
|
}
|
|
@@ -86,10 +93,11 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
86
93
|
defaultBackend: z.ZodEnum<["shell"]>;
|
|
87
94
|
defaultMaxIterations: z.ZodNumber;
|
|
88
95
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
96
|
+
defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
|
|
89
97
|
mainTask: z.ZodOptional<z.ZodString>;
|
|
90
98
|
logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
|
|
91
99
|
logFile: z.ZodOptional<z.ZodString>;
|
|
92
|
-
verbose: z.
|
|
100
|
+
verbose: z.ZodEffects<z.ZodNumber, number, unknown>;
|
|
93
101
|
quiet: z.ZodBoolean;
|
|
94
102
|
mcpTimeout: z.ZodNumber;
|
|
95
103
|
mcpRetries: z.ZodNumber;
|
|
@@ -101,6 +109,8 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
101
109
|
headlessMode: z.ZodBoolean;
|
|
102
110
|
workingDirectory: z.ZodString;
|
|
103
111
|
sessionDirectory: z.ZodString;
|
|
112
|
+
envFilePath: z.ZodOptional<z.ZodString>;
|
|
113
|
+
envFileCopied: z.ZodOptional<z.ZodBoolean>;
|
|
104
114
|
hooks: z.ZodOptional<z.ZodRecord<z.ZodEnum<["START_RUN", "START_ITERATION", "END_ITERATION", "END_RUN", "ON_STALE"]>, z.ZodObject<{
|
|
105
115
|
commands: z.ZodArray<z.ZodString, "many">;
|
|
106
116
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -111,12 +121,14 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
111
121
|
skipHooks: z.ZodOptional<z.ZodBoolean>;
|
|
112
122
|
}, "strict", z.ZodTypeAny, {
|
|
113
123
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
114
|
-
defaultBackend?: "shell";
|
|
115
|
-
defaultMaxIterations?: number;
|
|
116
124
|
defaultModel?: string;
|
|
125
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
126
|
+
defaultMaxIterations?: number;
|
|
127
|
+
defaultBackend?: "shell";
|
|
128
|
+
mainTask?: string;
|
|
117
129
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
118
130
|
logFile?: string;
|
|
119
|
-
verbose?:
|
|
131
|
+
verbose?: number;
|
|
120
132
|
quiet?: boolean;
|
|
121
133
|
mcpTimeout?: number;
|
|
122
134
|
mcpRetries?: number;
|
|
@@ -128,19 +140,22 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
128
140
|
headlessMode?: boolean;
|
|
129
141
|
workingDirectory?: string;
|
|
130
142
|
sessionDirectory?: string;
|
|
131
|
-
|
|
143
|
+
envFilePath?: string;
|
|
144
|
+
envFileCopied?: boolean;
|
|
132
145
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
133
146
|
commands?: string[];
|
|
134
147
|
}>>;
|
|
135
148
|
skipHooks?: boolean;
|
|
136
149
|
}, {
|
|
137
150
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
138
|
-
defaultBackend?: "shell";
|
|
139
|
-
defaultMaxIterations?: number;
|
|
140
151
|
defaultModel?: string;
|
|
152
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
153
|
+
defaultMaxIterations?: number;
|
|
154
|
+
defaultBackend?: "shell";
|
|
155
|
+
mainTask?: string;
|
|
141
156
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
142
157
|
logFile?: string;
|
|
143
|
-
verbose?:
|
|
158
|
+
verbose?: unknown;
|
|
144
159
|
quiet?: boolean;
|
|
145
160
|
mcpTimeout?: number;
|
|
146
161
|
mcpRetries?: number;
|
|
@@ -152,7 +167,8 @@ declare const JunoTaskConfigSchema: z.ZodObject<{
|
|
|
152
167
|
headlessMode?: boolean;
|
|
153
168
|
workingDirectory?: string;
|
|
154
169
|
sessionDirectory?: string;
|
|
155
|
-
|
|
170
|
+
envFilePath?: string;
|
|
171
|
+
envFileCopied?: boolean;
|
|
156
172
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
157
173
|
commands?: string[];
|
|
158
174
|
}>>;
|
|
@@ -719,6 +735,10 @@ interface ExecutionRequest {
|
|
|
719
735
|
readonly resume?: string;
|
|
720
736
|
/** Continue the most recent conversation (forwarded to shell backend) */
|
|
721
737
|
readonly continueConversation?: boolean;
|
|
738
|
+
/** Extended thinking level (forwarded to shell backend --thinking flag) */
|
|
739
|
+
readonly thinking?: string;
|
|
740
|
+
/** Run Pi subagent in interactive live mode (forwarded to shell backend --live flag) */
|
|
741
|
+
readonly live?: boolean;
|
|
722
742
|
}
|
|
723
743
|
/**
|
|
724
744
|
* Execution result interface for completed executions
|
|
@@ -1019,6 +1039,12 @@ declare class ExecutionEngine extends EventEmitter {
|
|
|
1019
1039
|
* Setup progress tracking for the engine
|
|
1020
1040
|
*/
|
|
1021
1041
|
private setupProgressTracking;
|
|
1042
|
+
/**
|
|
1043
|
+
* Display hook execution output to stderr at verbose level 2 (debug+hooks).
|
|
1044
|
+
* At level 2: shows hook name, command stdout/stderr output.
|
|
1045
|
+
* At level 0-1: output is suppressed (hooks still execute).
|
|
1046
|
+
*/
|
|
1047
|
+
private displayHookOutput;
|
|
1022
1048
|
/**
|
|
1023
1049
|
* Initialize backend for execution request.
|
|
1024
1050
|
* Directly creates and configures a ShellBackend (no factory indirection).
|
|
@@ -1168,6 +1194,8 @@ declare function createExecutionRequest(options: {
|
|
|
1168
1194
|
mcpServerName?: string;
|
|
1169
1195
|
resume?: string;
|
|
1170
1196
|
continueConversation?: boolean;
|
|
1197
|
+
thinking?: string;
|
|
1198
|
+
live?: boolean;
|
|
1171
1199
|
}): ExecutionRequest;
|
|
1172
1200
|
|
|
1173
1201
|
/** Session metadata */
|
|
@@ -2006,10 +2034,11 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2006
2034
|
defaultBackend: z.ZodEnum<["shell"]>;
|
|
2007
2035
|
defaultMaxIterations: z.ZodNumber;
|
|
2008
2036
|
defaultModel: z.ZodOptional<z.ZodString>;
|
|
2037
|
+
defaultModels: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "cursor", "codex", "gemini", "pi"]>, z.ZodString>>;
|
|
2009
2038
|
mainTask: z.ZodOptional<z.ZodString>;
|
|
2010
2039
|
logLevel: z.ZodEnum<["error", "warn", "info", "debug", "trace"]>;
|
|
2011
2040
|
logFile: z.ZodOptional<z.ZodString>;
|
|
2012
|
-
verbose: z.
|
|
2041
|
+
verbose: z.ZodEffects<z.ZodNumber, number, unknown>;
|
|
2013
2042
|
quiet: z.ZodBoolean;
|
|
2014
2043
|
mcpTimeout: z.ZodNumber;
|
|
2015
2044
|
mcpRetries: z.ZodNumber;
|
|
@@ -2021,6 +2050,8 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2021
2050
|
headlessMode: z.ZodBoolean;
|
|
2022
2051
|
workingDirectory: z.ZodString;
|
|
2023
2052
|
sessionDirectory: z.ZodString;
|
|
2053
|
+
envFilePath: z.ZodOptional<z.ZodString>;
|
|
2054
|
+
envFileCopied: z.ZodOptional<z.ZodBoolean>;
|
|
2024
2055
|
hooks: z.ZodOptional<z.ZodRecord<z.ZodEnum<["START_RUN", "START_ITERATION", "END_ITERATION", "END_RUN", "ON_STALE"]>, z.ZodObject<{
|
|
2025
2056
|
commands: z.ZodArray<z.ZodString, "many">;
|
|
2026
2057
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -2031,12 +2062,14 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2031
2062
|
skipHooks: z.ZodOptional<z.ZodBoolean>;
|
|
2032
2063
|
}, "strict", z.ZodTypeAny, {
|
|
2033
2064
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
2034
|
-
defaultBackend?: "shell";
|
|
2035
|
-
defaultMaxIterations?: number;
|
|
2036
2065
|
defaultModel?: string;
|
|
2066
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
2067
|
+
defaultMaxIterations?: number;
|
|
2068
|
+
defaultBackend?: "shell";
|
|
2069
|
+
mainTask?: string;
|
|
2037
2070
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
2038
2071
|
logFile?: string;
|
|
2039
|
-
verbose?:
|
|
2072
|
+
verbose?: number;
|
|
2040
2073
|
quiet?: boolean;
|
|
2041
2074
|
mcpTimeout?: number;
|
|
2042
2075
|
mcpRetries?: number;
|
|
@@ -2048,19 +2081,22 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2048
2081
|
headlessMode?: boolean;
|
|
2049
2082
|
workingDirectory?: string;
|
|
2050
2083
|
sessionDirectory?: string;
|
|
2051
|
-
|
|
2084
|
+
envFilePath?: string;
|
|
2085
|
+
envFileCopied?: boolean;
|
|
2052
2086
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
2053
2087
|
commands?: string[];
|
|
2054
2088
|
}>>;
|
|
2055
2089
|
skipHooks?: boolean;
|
|
2056
2090
|
}, {
|
|
2057
2091
|
defaultSubagent?: "claude" | "cursor" | "codex" | "gemini" | "pi";
|
|
2058
|
-
defaultBackend?: "shell";
|
|
2059
|
-
defaultMaxIterations?: number;
|
|
2060
2092
|
defaultModel?: string;
|
|
2093
|
+
defaultModels?: Partial<Record<"claude" | "cursor" | "codex" | "gemini" | "pi", string>>;
|
|
2094
|
+
defaultMaxIterations?: number;
|
|
2095
|
+
defaultBackend?: "shell";
|
|
2096
|
+
mainTask?: string;
|
|
2061
2097
|
logLevel?: "error" | "warn" | "info" | "debug" | "trace";
|
|
2062
2098
|
logFile?: string;
|
|
2063
|
-
verbose?:
|
|
2099
|
+
verbose?: unknown;
|
|
2064
2100
|
quiet?: boolean;
|
|
2065
2101
|
mcpTimeout?: number;
|
|
2066
2102
|
mcpRetries?: number;
|
|
@@ -2072,7 +2108,8 @@ declare const ConfigValidationSchema: z.ZodObject<{
|
|
|
2072
2108
|
headlessMode?: boolean;
|
|
2073
2109
|
workingDirectory?: string;
|
|
2074
2110
|
sessionDirectory?: string;
|
|
2075
|
-
|
|
2111
|
+
envFilePath?: string;
|
|
2112
|
+
envFileCopied?: boolean;
|
|
2076
2113
|
hooks?: Partial<Record<"START_RUN" | "START_ITERATION" | "END_ITERATION" | "END_RUN" | "ON_STALE", {
|
|
2077
2114
|
commands?: string[];
|
|
2078
2115
|
}>>;
|