juno-code 1.0.43 → 1.0.45

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 CHANGED
@@ -13639,12 +13639,16 @@ var init_script_installer = __esm({
13639
13639
  * Required scripts include both standalone scripts and their dependencies.
13640
13640
  * kanban.sh depends on install_requirements.sh for Python venv setup.
13641
13641
  * Slack integration scripts allow fetching tasks from Slack and responding.
13642
+ * Hook scripts are stored in the hooks/ subdirectory.
13642
13643
  */
13643
13644
  static REQUIRED_SCRIPTS = [
13644
13645
  "run_until_completion.sh",
13645
13646
  "kanban.sh",
13646
13647
  "install_requirements.sh",
13647
13648
  // Required by kanban.sh for Python venv creation
13649
+ // Shared utilities
13650
+ "attachment_downloader.py",
13651
+ // File attachment downloading utility (used by Slack/GitHub)
13648
13652
  // Slack integration scripts
13649
13653
  "slack_state.py",
13650
13654
  // State management for Slack integration
@@ -13657,8 +13661,11 @@ var init_script_installer = __esm({
13657
13661
  "slack_respond.sh",
13658
13662
  // Wrapper script for Slack respond
13659
13663
  // GitHub integration script (single-file architecture)
13660
- "github.py"
13664
+ "github.py",
13661
13665
  // Unified GitHub integration (fetch, respond, sync)
13666
+ // Claude Code hooks (stored in hooks/ subdirectory)
13667
+ "hooks/session_counter.sh"
13668
+ // Session message counter hook for warning about long sessions
13662
13669
  ];
13663
13670
  /**
13664
13671
  * Get the templates scripts directory from the package
@@ -13715,6 +13722,10 @@ var init_script_installer = __esm({
13715
13722
  const destDir = path3__namespace.join(projectDir, ".juno_task", "scripts");
13716
13723
  await fs3__default.default.ensureDir(destDir);
13717
13724
  const destPath = path3__namespace.join(destDir, scriptName);
13725
+ const destParentDir = path3__namespace.dirname(destPath);
13726
+ if (destParentDir !== destDir) {
13727
+ await fs3__default.default.ensureDir(destParentDir);
13728
+ }
13718
13729
  await fs3__default.default.copy(sourcePath, destPath, { overwrite: true });
13719
13730
  if (scriptName.endsWith(".sh") || scriptName.endsWith(".py")) {
13720
13731
  await fs3__default.default.chmod(destPath, 493);
@@ -14890,8 +14901,7 @@ After completing the proccess an implementer agent would start the job and go th
14890
14901
  category: "core" /* CORE */,
14891
14902
  content: `0a. study @.juno_task/implement.md.
14892
14903
 
14893
- 0b. When you discover a syntax, logic, UI, User Flow Error or bug. Immediately update tasks.md with your findings using a {{SUBAGENT}} subagent. When the issue is resolved, update tasks.md and remove the item using a {{SUBAGENT}} subagent.
14894
-
14904
+ 0b. When you discover a syntax, logic, UI, User Flow Error or bug. Immediately update Kanban with your findings using a {{SUBAGENT}} subagent. When the issue is resolved, update Kanban.
14895
14905
 
14896
14906
  999. Important: When authoring documentation capture the why tests and the backing implementation is important.
14897
14907
 
@@ -14981,7 +14991,7 @@ Tasks , USER_FEEDBACK and @{{AGENT_DOC_FILE}} should repesent truth. User Open I
14981
14991
  description: "Implementation steps and current task breakdown",
14982
14992
  category: "workflow" /* WORKFLOW */,
14983
14993
  content: `---
14984
- description: Execute the implementation plan by processing and executing all tasks defined in tasks.md
14994
+ description: Execute the implementation plan by processing and executing all tasks defined in Kanban
14985
14995
  ---
14986
14996
 
14987
14997
  ## User Input
@@ -15040,7 +15050,7 @@ You **MUST** consider the user input before proceeding (if not empty).
15040
15050
  1. Run \`./.juno_task/scripts/kanban.sh list\` from repo root and check current project status.
15041
15051
 
15042
15052
  2. Load and analyze the implementation context:
15043
- - **REQUIRED**: Read tasks.md for the complete task list and execution plan
15053
+ - **REQUIRED**: Read Kanban for the complete task list and execution plan
15044
15054
  - **REQUIRED**: Read plan.md for tech stack, architecture, and file structure
15045
15055
  - **IF EXISTS**: Read data-model.md for entities and relationships
15046
15056
  - **IF EXISTS**: Read contracts/ for API specifications and test requirements
@@ -15080,7 +15090,7 @@ You **MUST** consider the user input before proceeding (if not empty).
15080
15090
  - **Prettier**: \`node_modules/\`, \`dist/\`, \`build/\`, \`coverage/\`, \`package-lock.json\`, \`yarn.lock\`, \`pnpm-lock.yaml\`
15081
15091
  - **Terraform**: \`.terraform/\`, \`*.tfstate*\`, \`*.tfvars\`, \`.terraform.lock.hcl\`
15082
15092
 
15083
- 5. Parse tasks.md structure and extract:
15093
+ 5. Parse Kanban structure and extract:
15084
15094
  - **Task phases**: Setup, Tests, Core, Integration, Polish
15085
15095
  - **Task dependencies**: Sequential vs parallel execution rules
15086
15096
  - **Task details**: ID, description, file paths, parallel markers [P]
@@ -15129,7 +15139,7 @@ You **MUST** consider the user input before proceeding (if not empty).
15129
15139
 
15130
15140
 
15131
15141
 
15132
- Note: This command assumes a complete task breakdown exists in tasks.md. If tasks are incomplete or missing, suggest running \`/tasks\` first to regenerate the task list.
15142
+ Note: This command assumes a complete task breakdown exists in Kanban. If tasks are incomplete or missing, suggest running \`/tasks\` first to regenerate the task list.
15133
15143
 
15134
15144
 
15135
15145
  ---
@@ -15216,6 +15226,8 @@ Items that have been resolved will be moved here.`,
15216
15226
  When a task on kanban, has related_tasks key, you need to get the task to understand the complete picture of tasks related to the current current task, you can get all the context through
15217
15227
  \`./.juno_task/scripts/kanban.sh get {TASK_ID}\`
15218
15228
 
15229
+ When creating a task, relevant to another task, you can add the following format anywhere in the body of the task : \`[task_id]{Ref_TASK_ID}[/task_id]\` , using ref task id, help kanban organize dependecies between tasks better.
15230
+
15219
15231
  Important: You need to get maximum 3 tasks done in one go.
15220
15232
 
15221
15233
  ## Agent-Specific Instructions
@@ -15349,6 +15361,9 @@ When a task on kanban, has related_tasks key, you need to get the task to unders
15349
15361
  \`./.juno_task/scripts/kanban.sh get {TASK_ID}\`
15350
15362
 
15351
15363
 
15364
+ When creating a task, relevant to another task, you can add the following format anywhere in the body of the task : \`[task_id]{Ref_TASK_ID}[/task_id]\` , using ref task id, help kanban organize dependecies between tasks better.
15365
+
15366
+ Important: You need to get maximum 3 tasks done in one go.
15352
15367
 
15353
15368
  ## Build & Test Commands
15354
15369
 
@@ -16583,142 +16598,16 @@ This project uses AI-assisted development with juno-code to achieve: ${variables
16583
16598
  - Security best practices
16584
16599
  `;
16585
16600
  await fs3__default.default.writeFile(path3__namespace.join(specsDir, "architecture.md"), architectureContent);
16586
- const claudeContent = `# Claude Development Session Learnings
16587
-
16588
- ## Project Overview
16589
-
16590
- This project was initialized on ${variables.CURRENT_DATE} using juno-code.
16591
-
16592
- **Main Task**: ${variables.TASK}
16593
- **Preferred Subagent**: ${variables.EDITOR}
16594
- **Project Root**: ${targetDirectory}
16595
-
16596
- ## Development Environment
16597
-
16598
- ### Build System
16599
- - Use \`npm run build\` to build the project
16600
- - Test with \`npm test\` for unit tests
16601
- - Use \`npm run test:binary\` for CLI testing
16602
-
16603
- ### Key Commands
16604
- - \`juno-code start\` - Begin task execution
16605
- - \`juno-code -s ${variables.EDITOR}\` - Quick execution with preferred subagent
16606
- - \`juno-code feedback\` - Provide feedback on the process
16607
-
16608
- ## Project Structure
16609
-
16610
- \`\`\`
16611
- .
16612
- \u251C\u2500\u2500 .juno_task/
16613
- \u2502 \u251C\u2500\u2500 prompt.md # Main task definition with AI instructions
16614
- \u2502 \u251C\u2500\u2500 init.md # Initial task breakdown and constraints
16615
- \u2502 \u251C\u2500\u2500 plan.md # Dynamic planning and priority tracking
16616
- \u2502 \u251C\u2500\u2500 implement.md # Implementation guide and current tasks
16617
- \u2502 \u251C\u2500\u2500 USER_FEEDBACK.md # User feedback and issue tracking
16618
- \u2502 \u251C\u2500\u2500 scripts/ # Utility scripts for project maintenance
16619
- \u2502 \u2502 \u2514\u2500\u2500 clean_logs_folder.sh # Archive old log files
16620
- \u2502 \u2514\u2500\u2500 specs/ # Project specifications
16621
- \u2502 \u251C\u2500\u2500 README.md # Specs overview
16622
- \u2502 \u251C\u2500\u2500 requirements.md # Functional requirements
16623
- \u2502 \u2514\u2500\u2500 architecture.md # System architecture
16624
- \u251C\u2500\u2500 CLAUDE.md # This file - session documentation
16625
- \u2514\u2500\u2500 README.md # Project overview
16626
- \`\`\`
16627
-
16628
- ## AI Workflow
16629
-
16630
- The project uses a sophisticated AI workflow with:
16631
-
16632
- 1. **Task Analysis**: Study existing codebase and requirements
16633
- 2. **Specification Creation**: Detailed specs for each component
16634
- 3. **Implementation**: AI-assisted development with parallel subagents
16635
- 4. **Testing**: Automated testing and validation
16636
- 5. **Documentation**: Continuous documentation updates
16637
- 6. **Version Control**: Automated Git workflow management
16638
-
16639
- ## Important Notes
16640
-
16641
- - Always check USER_FEEDBACK.md first for user input
16642
- - Keep plan.md up to date with current priorities
16643
- - Use up to 500 parallel subagents for analysis
16644
- - Use only 1 subagent for build/test operations
16645
- - Focus on full implementations, not placeholders
16646
- - Maintain comprehensive documentation
16647
-
16648
- ## Session Progress
16649
-
16650
- This file will be updated as development progresses to track:
16651
- - Key decisions and their rationale
16652
- - Important learnings and discoveries
16653
- - Build/test optimization techniques
16654
- - Solutions to complex problems
16655
- - Performance improvements and optimizations
16656
- `;
16657
- await fs3__default.default.writeFile(path3__namespace.join(targetDirectory, "CLAUDE.md"), claudeContent);
16658
- const agentsContent = `# AI Agent Selection and Performance
16659
-
16660
- ## Available Agents
16661
-
16662
- ### ${variables.EDITOR.toUpperCase()} \u2705 SELECTED
16663
- **Status**: Primary agent for this project
16664
- **Usage**: Main development and task execution
16665
- **Strengths**: ${this.getAgentStrengths(variables.EDITOR)}
16666
- **Best For**: ${this.getAgentBestFor(variables.EDITOR)}
16667
-
16668
- ### CLAUDE \u2B55 Available
16669
- **Status**: Available as secondary agent
16670
- **Usage**: Complex reasoning, analysis, documentation
16671
- **Strengths**: Analytical thinking, detailed explanations
16672
- **Best For**: Code analysis, architectural decisions, documentation
16673
-
16674
- ### CURSOR \u2B55 Available
16675
- **Status**: Available as secondary agent
16676
- **Usage**: Code generation, debugging, optimization
16677
- **Strengths**: Code-centric development, debugging
16678
- **Best For**: Feature implementation, bug fixes, code optimization
16679
-
16680
- ### CODEX \u2B55 Available
16681
- **Status**: Available as secondary agent
16682
- **Usage**: General development, problem solving
16683
- **Strengths**: Versatile development capabilities
16684
- **Best For**: General purpose development tasks
16685
-
16686
- ### GEMINI \u2B55 Available
16687
- **Status**: Available as secondary agent
16688
- **Usage**: Creative solutions, alternative approaches
16689
- **Strengths**: Creative problem solving, diverse perspectives
16690
- **Best For**: Brainstorming, alternative implementations, creative solutions
16691
-
16692
- ## Agent Selection Strategy
16693
-
16694
- ### Primary Agent Selection
16695
- - **${variables.EDITOR}** chosen as primary agent for this project
16696
- - Based on task requirements and project needs
16697
- - Can be changed by updating project configuration
16698
-
16699
- ### Secondary Agent Usage
16700
- - Use parallel agents for analysis and research
16701
- - Specialized agents for specific task types
16702
- - Load balancing for complex operations
16703
-
16704
- ## Performance Tracking
16705
-
16706
- Track agent performance for:
16707
- - Task completion time
16708
- - Code quality
16709
- - Accuracy of implementation
16710
- - Documentation quality
16711
- - Problem-solving effectiveness
16712
-
16713
- ## Optimization Tips
16714
-
16715
- 1. **Right Agent for Right Task**: Choose agents based on their strengths
16716
- 2. **Parallel Processing**: Use multiple agents for analysis phases
16717
- 3. **Quality Validation**: Review and validate agent output
16718
- 4. **Feedback Loop**: Provide feedback to improve agent performance
16719
- 5. **Performance Monitoring**: Track and optimize agent usage
16720
- `;
16721
- await fs3__default.default.writeFile(path3__namespace.join(targetDirectory, "AGENTS.md"), agentsContent);
16601
+ const claudeTemplate = templateEngine.getBuiltInTemplate("CLAUDE.md");
16602
+ if (claudeTemplate) {
16603
+ const claudeContent = await templateEngine.render(claudeTemplate, templateContext);
16604
+ await fs3__default.default.writeFile(path3__namespace.join(targetDirectory, "CLAUDE.md"), claudeContent);
16605
+ }
16606
+ const agentsTemplate = templateEngine.getBuiltInTemplate("AGENTS.md");
16607
+ if (agentsTemplate) {
16608
+ const agentsContent = await templateEngine.render(agentsTemplate, templateContext);
16609
+ await fs3__default.default.writeFile(path3__namespace.join(targetDirectory, "AGENTS.md"), agentsContent);
16610
+ }
16722
16611
  const readmeContent = `# ${variables.PROJECT_NAME}
16723
16612
 
16724
16613
  ${variables.DESCRIPTION}
@@ -16824,24 +16713,6 @@ ${variables.EDITOR ? `using ${variables.EDITOR} as primary AI subagent` : ""}
16824
16713
  console.log(chalk15__default.default.green.bold("\n\u2705 Project initialization complete!"));
16825
16714
  this.printNextSteps(targetDirectory, variables.EDITOR);
16826
16715
  }
16827
- getAgentStrengths(agent) {
16828
- const strengths = {
16829
- claude: "Analytical thinking, detailed explanations, architectural decisions",
16830
- cursor: "Code-centric development, debugging, optimization",
16831
- codex: "Versatile development capabilities, general purpose tasks",
16832
- gemini: "Creative problem solving, diverse perspectives"
16833
- };
16834
- return strengths[agent] || "General AI assistance";
16835
- }
16836
- getAgentBestFor(agent) {
16837
- const bestFor = {
16838
- claude: "Code analysis, architectural decisions, documentation",
16839
- cursor: "Feature implementation, bug fixes, code optimization",
16840
- codex: "General purpose development tasks",
16841
- gemini: "Brainstorming, alternative implementations, creative solutions"
16842
- };
16843
- return bestFor[agent] || "General development tasks";
16844
- }
16845
16716
  async createConfigFile(junoTaskDir, targetDirectory) {
16846
16717
  const configContent = {
16847
16718
  // Core settings
@@ -24903,7 +24774,7 @@ function handleCLIError(error, verbose = false) {
24903
24774
  process.exit(EXIT_CODES.UNEXPECTED_ERROR);
24904
24775
  }
24905
24776
  function setupGlobalOptions(program) {
24906
- program.option("-v, --verbose", "Enable verbose output with detailed progress").option("-q, --quiet", "Disable rich formatting, use plain text").option("-c, --config <path>", "Configuration file path (.json, .toml, pyproject.toml)").option("-l, --log-file <path>", "Log file path (auto-generated if not specified)").option("--no-color", "Disable colored output").option("--log-level <level>", "Log level for output (error, warn, info, debug, trace)", "info").option("-s, --subagent <name>", "Subagent to use (claude, cursor, codex, gemini)").option("-b, --backend <type>", "Backend to use (mcp, shell) - default: shell").option("-m, --model <name>", "Model to use (subagent-specific)").option("--agents <config>", "Agents configuration (forwarded to shell backend, ignored for MCP)").option("--tools <tools...>", 'Specify the list of available tools from the built-in set (only works with --print mode). Use "" to disable all tools, "default" to use all tools, or specify tool names (e.g. "Bash,Edit,Read"). Passed to shell backend, ignored for MCP.').option("--allowed-tools <tools...>", 'Permission-based filtering of specific tool instances (e.g. "Bash(git:*) Edit"). Default when not specified: Task, Bash, Glob, Grep, ExitPlanMode, Read, Edit, Write, NotebookEdit, WebFetch, TodoWrite, WebSearch, BashOutput, KillShell, Skill, SlashCommand, EnterPlanMode. Passed to shell backend, ignored for MCP.').option("--disallowed-tools <tools...>", "Disallowed tools for Claude (passed to shell backend, ignored for MCP). By default, no tools are disallowed").option("--append-allowed-tools <tools...>", "Append tools to the default allowed-tools list (mutually exclusive with --allowed-tools). Passed to shell backend, ignored for MCP.").option("--mcp-timeout <number>", "MCP server timeout in milliseconds", parseInt).option("--enable-feedback", "Enable interactive feedback mode (F+Enter to enter, Q+Enter to submit)").option("-r, --resume <sessionId>", "Resume a conversation by session ID (shell backend only)").option("--continue", "Continue the most recent conversation (shell backend only)").option("--til-completion", "Run juno-code in a loop until all kanban tasks are complete (aliases: --until-completion, --run-until-completion, --till-complete)").option("--until-completion", "Alias for --til-completion").addOption(new commander.Option("--run-until-completion", "Alias for --til-completion").hideHelp()).addOption(new commander.Option("--till-complete", "Alias for --til-completion").hideHelp()).option("--pre-run-hook <hooks...>", "Execute named hooks from .juno_task/config.json before each iteration (only with --til-completion)").option("--force-update", "Force update scripts, services, and Python dependencies (bypasses 24-hour cache)").option("--on-hourly-limit <behavior>", 'Behavior when Claude hourly quota limit is reached: "wait" to sleep until reset, "raise" to exit immediately (default: raise)');
24777
+ program.option("-v, --verbose", "Enable verbose output with detailed progress").option("-q, --quiet", "Disable rich formatting, use plain text").option("-c, --config <path>", "Configuration file path (.json, .toml, pyproject.toml)").option("-l, --log-file <path>", "Log file path (auto-generated if not specified)").option("--no-color", "Disable colored output").option("--log-level <level>", "Log level for output (error, warn, info, debug, trace)", "info").option("-s, --subagent <name>", "Subagent to use (claude, cursor, codex, gemini)").option("-b, --backend <type>", "Backend to use (mcp, shell) - default: shell").option("-m, --model <name>", "Model to use (subagent-specific)").option("--agents <config>", "Agents configuration (forwarded to shell backend, ignored for MCP)").option("--tools <tools...>", 'Specify the list of available tools from the built-in set (only works with --print mode). Use "" to disable all tools, "default" to use all tools, or specify tool names (e.g. "Bash,Edit,Read"). Passed to shell backend, ignored for MCP.').option("--allowed-tools <tools...>", 'Permission-based filtering of specific tool instances (e.g. "Bash(git:*) Edit"). Default when not specified: Task, Bash, Glob, Grep, ExitPlanMode, Read, Edit, Write, NotebookEdit, WebFetch, TodoWrite, WebSearch, BashOutput, KillShell, Skill, SlashCommand, EnterPlanMode. Passed to shell backend, ignored for MCP.').option("--disallowed-tools <tools...>", "Disallowed tools for Claude (passed to shell backend, ignored for MCP). By default, no tools are disallowed").option("--append-allowed-tools <tools...>", "Append tools to the default allowed-tools list (mutually exclusive with --allowed-tools). Passed to shell backend, ignored for MCP.").option("--mcp-timeout <number>", "MCP server timeout in milliseconds", parseInt).option("--enable-feedback", "Enable interactive feedback mode (F+Enter to enter, Q+Enter to submit)").option("-r, --resume <sessionId>", "Resume a conversation by session ID (shell backend only)").option("--continue", "Continue the most recent conversation (shell backend only)").option("--til-completion", "Run juno-code in a loop until all kanban tasks are complete (aliases: --until-completion, --run-until-completion, --till-complete)").option("--until-completion", "Alias for --til-completion").addOption(new commander.Option("--run-until-completion", "Alias for --til-completion").hideHelp()).addOption(new commander.Option("--till-complete", "Alias for --til-completion").hideHelp()).option("--pre-run-hook <hooks...>", "Execute named hooks from .juno_task/config.json before each iteration (only with --til-completion)").option("--stale-threshold <n>", "Number of stale iterations before exiting (default: 3). Set to 0 to disable. (only with --til-completion)", parseInt).option("--no-stale-check", "Disable stale iteration detection (alias for --stale-threshold 0). (only with --til-completion)").option("--force-update", "Force update scripts, services, and Python dependencies (bypasses 24-hour cache)").option("--on-hourly-limit <behavior>", 'Behavior when Claude hourly quota limit is reached: "wait" to sleep until reset, "raise" to exit immediately (default: raise)');
24907
24778
  program.exitOverride((err) => {
24908
24779
  if (err.code === "commander.helpDisplayed") {
24909
24780
  process.exit(0);