juno-code 1.0.46 → 1.0.49

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.
Files changed (54) hide show
  1. package/README.md +44 -8
  2. package/dist/bin/cli.d.mts +17 -0
  3. package/dist/bin/cli.d.ts +17 -0
  4. package/dist/bin/cli.js +5601 -17505
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/bin/cli.mjs +5640 -17542
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/feedback-collector.d.mts +2 -0
  9. package/dist/bin/feedback-collector.d.ts +2 -0
  10. package/dist/bin/feedback-collector.js.map +1 -1
  11. package/dist/bin/feedback-collector.mjs.map +1 -1
  12. package/dist/index.d.mts +2107 -0
  13. package/dist/index.d.ts +2107 -0
  14. package/dist/index.js +3760 -14728
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +3761 -14536
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/templates/extensions/pi/juno-skill-preprocessor.ts +239 -0
  19. package/dist/templates/scripts/__pycache__/github.cpython-313.pyc +0 -0
  20. package/dist/templates/scripts/__pycache__/parallel_runner.cpython-313.pyc +0 -0
  21. package/dist/templates/scripts/__pycache__/slack_respond.cpython-313.pyc +0 -0
  22. package/dist/templates/scripts/kanban.sh +18 -4
  23. package/dist/templates/scripts/parallel_runner.sh +2242 -0
  24. package/dist/templates/services/README.md +61 -1
  25. package/dist/templates/services/__pycache__/claude.cpython-313.pyc +0 -0
  26. package/dist/templates/services/__pycache__/codex.cpython-313.pyc +0 -0
  27. package/dist/templates/services/__pycache__/pi.cpython-313.pyc +0 -0
  28. package/dist/templates/services/claude.py +132 -33
  29. package/dist/templates/services/codex.py +179 -66
  30. package/dist/templates/services/gemini.py +117 -27
  31. package/dist/templates/services/pi.py +1753 -0
  32. package/dist/templates/skills/claude/plan-kanban-tasks/SKILL.md +14 -7
  33. package/dist/templates/skills/claude/ralph-loop/SKILL.md +18 -22
  34. package/dist/templates/skills/claude/ralph-loop/references/first_check.md +15 -14
  35. package/dist/templates/skills/claude/ralph-loop/references/implement.md +17 -17
  36. package/dist/templates/skills/claude/ralph-loop/scripts/kanban.sh +18 -4
  37. package/dist/templates/skills/claude/understand-project/SKILL.md +14 -7
  38. package/dist/templates/skills/codex/ralph-loop/SKILL.md +18 -22
  39. package/dist/templates/skills/codex/ralph-loop/references/first_check.md +15 -14
  40. package/dist/templates/skills/codex/ralph-loop/references/implement.md +17 -17
  41. package/dist/templates/skills/codex/ralph-loop/scripts/kanban.sh +18 -4
  42. package/dist/templates/skills/pi/.gitkeep +0 -0
  43. package/dist/templates/skills/pi/plan-kanban-tasks/SKILL.md +32 -0
  44. package/dist/templates/skills/pi/ralph-loop/SKILL.md +39 -0
  45. package/dist/templates/skills/pi/ralph-loop/references/first_check.md +21 -0
  46. package/dist/templates/skills/pi/ralph-loop/references/implement.md +99 -0
  47. package/dist/templates/skills/pi/understand-project/SKILL.md +46 -0
  48. package/package.json +20 -42
  49. package/dist/templates/scripts/__pycache__/attachment_downloader.cpython-38.pyc +0 -0
  50. package/dist/templates/scripts/__pycache__/github.cpython-38.pyc +0 -0
  51. package/dist/templates/scripts/__pycache__/slack_fetch.cpython-38.pyc +0 -0
  52. package/dist/templates/scripts/__pycache__/slack_state.cpython-38.pyc +0 -0
  53. package/dist/templates/services/__pycache__/claude.cpython-38.pyc +0 -0
  54. package/dist/templates/services/__pycache__/codex.cpython-38.pyc +0 -0
@@ -0,0 +1,21 @@
1
+ ### Check once
2
+
3
+ Perform these check once, to make sure about the git logic. There is no need to keep running this on every execution.
4
+
5
+ **Detection & Creation Logic**:
6
+
7
+ - Check if the following command succeeds to determine if the repository is a git repo (create/verify .gitignore if so):
8
+
9
+ ```sh
10
+ git rev-parse --git-dir 2>/dev/null
11
+ ```
12
+
13
+ - Check if Dockerfile\* exists or Docker in plan.md → create/verify .dockerignore
14
+ - Check if .eslintrc* or eslint.config.* exists → create/verify .eslintignore
15
+ - Check if .prettierrc\* exists → create/verify .prettierignore
16
+ - Check if .npmrc or package.json exists → create/verify .npmignore (if publishing)
17
+ - Check if terraform files (\*.tf) exist → create/verify .terraformignore
18
+ - Check if .helmignore needed (helm charts present) → create/verify .helmignore
19
+
20
+ **If ignore file already exists**: Verify it contains essential patterns, append missing critical patterns only
21
+ **If ignore file missing**: Create with full pattern set for detected technology
@@ -0,0 +1,99 @@
1
+ ---
2
+ description: Study kanban.sh and Execute the implementation plan by processing and executing all tasks defined in ./juno_task/tasks.md, update ./juno_task/tasks.md with the tasks on kanban
3
+ ---
4
+
5
+ ## User Input
6
+
7
+ ```text
8
+ A.
9
+ **ALWAYS check remaing tasks and user feedbacks. Integrate it into the plan,
10
+ this is the primary mechanism for user input and for you to track your progress.
11
+ `./juno_task/scripts/kanban.sh list --limit 5`
12
+ return the most recent 5 Tasks and their status and potential agent response to them.
13
+
14
+ **Important** ./juno_task/scripts/kanban.sh has already installed in your enviroment and you can execute it in your bash.
15
+
16
+ A-1.
17
+ read @.juno_task/USER_FEEDBACK.md user feedback on your current execution will be writeen here. And will guide you. If user wants to talk to you while you are working , he will write into this file. first think you do is to read it file.
18
+
19
+ B.
20
+ Based on Items in **./juno_task/scripts/kanban.sh** reflect on @.juno_task/plan.md and keep it up-to-date.
21
+ 0g. Entities and their status in **./juno_task/scripts/kanban.sh** has higher priority and level of truth than other parts of the app.
22
+ If you see user report a bug that you earlier marked as resolved, you need to investigate the issue again.
23
+ ./juno_task/scripts/kanban.sh items has the higher level of truth. Always
24
+
25
+ 0e. Status in ./juno_task/scripts/kanban.sh could be backlog, todo, in_progress, done.
26
+ in_progress, todo, backlog. That is the priority of tasks in general sense, unless you find something with 10X magnitute of importance, or if you do it first it make other tasks easier or unnecessary.
27
+
28
+
29
+ 0f. After reviwing Feedback, if you find an open issue, you need to update previously handled issues status as well. If user reporting a bug, that earlier on reported on the feedback/plan or AGENTS.md as resolved. You should update it to reflect that the issue is not resolved.
30
+ `./juno_task/scripts/kanban.sh mark todo --ID {Task_ID}`
31
+
32
+ it would be ok to include past reasoning and root causing to the open issue, You should mention. <PREVIOUS_AGENT_ATTEMP> Tag and describe the approach already taken, so the agent knows
33
+ 1.the issue is still open,
34
+ 2. past approaches to resolve it, what it was, and know that it has failed.
35
+ `./juno_task/scripts/kanban.sh mark todo --ID {Task_ID} --response "<PREVIOUS_AGENT_ATTEMP>{what happend before ...}<PREVIOUS_AGENT_ATTEMP>" `
36
+
37
+ **Note** updating response will REPLACE response. So you need to include everything important from the past as well you can check the content of a task with
38
+ `./juno_task/scripts/kanban.sh get {TASK_ID}`
39
+
40
+
41
+
42
+ C. Using parallel subagents. You may use up to 500 parallel subagents for all operations but only 1 subagent for build/tests.
43
+
44
+ D. Choose the most important 1 things, ( Based on Open Issue and Also Tasks ), Think hard about what is the most important Task.
45
+
46
+ E. update status of most important task on ./juno_task/scripts/kanban.sh.
47
+ (if the task is not on ./juno_task/scripts/kanban.sh, create it ! Kanban is our source of truth)
48
+ `./juno_task/scripts/kanban.sh mark in_progress --ID {Task_ID}`
49
+
50
+
51
+ F. Implement the most important 1 thing following the outline.
52
+
53
+ ```
54
+
55
+ You **MUST** consider the user input before proceeding (if not empty).
56
+
57
+ ## Outline
58
+
59
+ . Execute implementation following the task plan:
60
+
61
+ - **Phase-by-phase execution**: Complete each phase before moving to the next
62
+ - **Respect dependencies**: Run sequential tasks in order, parallel tasks [P] can run together
63
+ - **Follow TDD approach**: Execute test tasks before their corresponding implementation tasks
64
+ - **File-based coordination**: Tasks affecting the same files must run sequentially
65
+ - **Validation checkpoints**: Verify each phase completion before proceeding
66
+
67
+ 7. Implementation execution rules:
68
+ - **Setup first**: Initialize project structure, dependencies, configuration
69
+ - **Tests before code**: If you need to write tests for contracts, entities, and integration scenarios
70
+ - **Core development**: Implement models, services, CLI commands, endpoints
71
+ - **Integration work**: Database connections, middleware, logging, external services
72
+ - **Polish and validation**: Unit tests, performance optimization, documentation
73
+
74
+ 8. Progress tracking and error handling:
75
+ - Report progress after each completed task
76
+ - Halt execution if any non-parallel task fails
77
+ - For parallel tasks [P], continue with successful tasks, report failed ones
78
+ - Provide clear error messages with context for debugging
79
+ - Suggest next steps if implementation cannot proceed
80
+ - **IMPORTANT** For completed tasks, make sure to mark the task off as [X] in the tasks file.
81
+ - **IMPORTANT** Keep ./juno_task/scripts/kanban.sh up-to-date
82
+ When the issue is resolved always update ./juno_task/scripts/kanban.sh
83
+ `./juno_task/scripts/kanban.sh --status {status} --ID {task_id} --response "{key actions you take, and how you did test it}"`
84
+
85
+ 9. Completion validation:
86
+ - Verify all required tasks are completed
87
+ - Check that implemented features match the original specification
88
+ - Validate that tests pass and coverage meets requirements
89
+ - Confirm the implementation follows the technical plan
90
+ - Report final status with summary of completed work
91
+ - When the issue is resolved always update ./juno_task/scripts/kanban.sh
92
+ `./juno_task/scripts/kanban.sh --mark done --ID {task_id} --response "{key actions you take, and how you did test it}"`
93
+
94
+ 10. Git
95
+
96
+ When the tests pass update ./juno_task/scripts/kanban.sh, then add changed code with "git add -A" via bash then do a "git commit" with a message that describes the changes you made to the code. After the commit do a "git push" to push the changes to the remote repository.
97
+ Use commit message as a backlog of what has achieved. So later on we would know exactly what we achieved in each commit.
98
+ Update the task in ./juno_task/scripts/kanban.sh with the commit hash so later on we could map each task to a specific git commit
99
+ `./juno_task/scripts/kanban.sh update {task_id} --commit {commit_hash}`
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: understand-project
3
+ description: Understand current project and create/update specs under @.juno_task/specs/* , it allows you understand dependencies. and prepare for implementation. Use when user explicitly ask you, or when asking for understand the project, first see how it works and then do [main task] with respect to [constraints]
4
+ argument-hint: [Main Task] [Constraints] [Ultimate Goal]
5
+ enable-shell-directives: true
6
+ ---
7
+
8
+ ## Main Task
9
+
10
+ !`jq -r '.mainTask' ./.juno_task/config.json`
11
+
12
+ $1
13
+
14
+ ### Task 1
15
+
16
+ Ultrathink !
17
+ First task is to study @.juno_task/plan.md (it may be incorrect) and is to use up to 500 subagents to study existing project
18
+ and study what is needed to achieve the main task.
19
+ From that create/update a @.juno_task/plan.md which is a bullet point list sorted in priority of the items which have yet to be implemeneted. Think extra hard.
20
+ Study @.juno_task/plan.md to determine starting point for research and keep it up to date with items considered complete/incomplete using subagents.
21
+
22
+ ### Task 2
23
+
24
+ Second Task is to understand the task, create a spec for process to follow, plan to execute, scripts to create, virtual enviroment that we need, things that we need to be aware of, how to test the scripts and follow progress.
25
+ Think hard and plan/create spec for every step of this task
26
+ and for each part create a seperate .md file under @.juno_task/specs/\*
27
+
28
+ ## ULTIMATE Goal
29
+
30
+ We want to achieve the main Task with respect to the Constraints section
31
+ Consider missing steps and plan. If the step is missing then author the specification at @.juno_task/specs/FILENAME.md (do NOT assume that it does not exist, search before creating). The naming of the module should be GenZ named and not conflict with another module name. If you create a new step then document the plan to implement in @.juno_task/plan.md
32
+
33
+ ### @.juno_task/specs/ file format.
34
+
35
+ - github flavored markdown
36
+ - GenZ module names and without conflict to another module name.
37
+ - Start with Priority in Codebase, Example: P0-core-module.md
38
+ - the goal is when we run `ls` command in the specs folder we could understand what are the cornerstone of the project with one glance.
39
+
40
+ ### Constraints
41
+
42
+ $2
43
+
44
+ ---
45
+
46
+ $ARGUMENTS
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juno-code",
3
- "version": "1.0.46",
3
+ "version": "1.0.49",
4
4
  "description": "Ralph Wiggum meet Kanban! Ralph style execution for [Claude Code, Codex, Gemini, Cursor]. One task per iteration, automatic progress tracking, and git commits. Set it and let it run.",
5
5
  "keywords": [
6
6
  "Ralph",
@@ -40,94 +40,72 @@
40
40
  ],
41
41
  "scripts": {
42
42
  "dev": "tsx src/bin/cli.ts",
43
- "build": "tsup && npm run build:copy-templates && npm run build:copy-services && npm run build:copy-skills && npm run build:copy-wrapper",
43
+ "build": "tsup && npm run build:copy-templates && npm run build:copy-services && npm run build:copy-skills && npm run build:copy-extensions && npm run build:copy-wrapper",
44
44
  "build:copy-templates": "node -e \"const fs = require('fs-extra'); const path = require('path'); fs.copySync('src/templates/scripts', 'dist/templates/scripts', { recursive: true }); fs.readdirSync('dist/templates/scripts').filter(f => f.endsWith('.sh')).forEach(f => fs.chmodSync(path.join('dist/templates/scripts', f), 0o755));\"",
45
- "build:copy-services": "node -e \"const fs = require('fs-extra'); const path = require('path'); const src = 'src/templates/services'; const dest = 'dist/templates/services'; fs.copySync(src, dest, { recursive: true }); const required = ['codex.py','claude.py','gemini.py']; const missing = required.filter(file => !fs.existsSync(path.join(dest, file))); if (missing.length) { throw new Error('Missing required service scripts in dist: ' + missing.join(', ')); } required.forEach(file => fs.chmodSync(path.join(dest, file), 0o755));\"",
46
- "build:copy-skills": "node -e \"const fs = require('fs-extra'); const src = 'src/templates/skills'; const dest = 'dist/templates/skills'; fs.copySync(src, dest, { recursive: true });\"",
45
+ "build:copy-services": "node -e \"const fs = require('fs-extra'); const path = require('path'); const src = 'src/templates/services'; const dest = 'dist/templates/services'; fs.copySync(src, dest, { recursive: true }); const required = ['codex.py','claude.py','gemini.py','pi.py']; const missing = required.filter(file => !fs.existsSync(path.join(dest, file))); if (missing.length) { throw new Error('Missing required service scripts in dist: ' + missing.join(', ')); } required.forEach(file => fs.chmodSync(path.join(dest, file), 0o755));\"",
46
+ "build:copy-skills": "node -e \"const fs = require('fs-extra'); const src = 'src/templates/skills'; const dest = 'dist/templates/skills'; fs.copySync(src, dest, { recursive: true, dereference: true });\"",
47
+ "build:copy-extensions": "node -e \"const fs = require('fs-extra'); const src = 'src/templates/extensions'; const dest = 'dist/templates/extensions'; if (fs.existsSync(src)) { fs.copySync(src, dest, { recursive: true }); }\"",
47
48
  "build:copy-wrapper": "node -e \"const fs = require('fs-extra'); fs.copySync('src/bin/juno-code.sh', 'dist/bin/juno-code.sh'); fs.chmodSync('dist/bin/juno-code.sh', 0o755);\"",
48
49
  "build:watch": "tsup --watch",
49
- "test": "vitest",
50
- "test:tui": "RUN_TUI=1 vitest -c ./vitest.tui.config.ts run",
51
- "test:tui:preserve": "PRESERVE_TMP=1 RUN_TUI=1 vitest -c ./vitest.tui.config.ts run",
52
- "test:feedback": "RUN_TUI=1 vitest -c ./vitest.tui.config.ts run src/cli/__tests__/feedback-command-tui-execution.test.ts",
50
+ "test": "vitest run -c ./vitest.fast.config.ts",
51
+ "test:full": "vitest run",
53
52
  "test:binary": "vitest run src/cli/__tests__/binary-execution-interactive.test.ts",
54
- "help:test:tui": "bash ./scripts/test-usage.sh tui",
55
53
  "help:test:binary": "bash ./scripts/test-usage.sh binary",
56
54
  "test:unit": "vitest run src/__tests__/unit",
57
55
  "test:integration": "vitest run src/__tests__/integration",
58
56
  "test:e2e": "vitest run src/__tests__/e2e",
59
- "test:coverage": "vitest run --coverage",
60
- "test:watch": "vitest",
61
- "lint": "eslint src --ext .ts,.tsx",
62
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
63
- "format": "prettier --write src/**/*.{ts,tsx,json,md}",
64
- "format:check": "prettier --check src/**/*.{ts,tsx,json,md}",
57
+ "test:coverage": "bash scripts/run-coverage.sh",
58
+ "test:coverage:ts": "vitest run --coverage",
59
+ "test:coverage:python": "python -m pytest test_pi_service/ test_codex_streaming/ test_claude_service/ test_slack_integration/ test_github_integration/ test_attachments/ --cov=src/templates/services --cov=src/templates/scripts --cov-report=lcov:coverage/python-lcov.info --cov-report=term-missing -q",
60
+ "test:watch": "vitest -c ./vitest.fast.config.ts",
61
+ "test:python": "python -m pytest test_pi_service/ test_codex_streaming/ test_claude_service/ test_slack_integration/ test_github_integration/ test_attachments/ -q",
62
+ "lint": "eslint src --ext .ts",
63
+ "lint:fix": "eslint src --ext .ts --fix",
64
+ "format": "prettier --write \"src/**/*.{ts,md}\"",
65
+ "format:check": "prettier --check \"src/**/*.{ts,md}\"",
65
66
  "typecheck": "tsc --noEmit",
66
67
  "clean": "rimraf dist",
67
68
  "prepack": "npm run clean && npm run build",
68
69
  "cli": "tsx src/bin/cli.ts",
69
70
  "completion:install": "tsx src/bin/cli.ts --install-completion",
70
- "docs:api": "typedoc src/index.ts",
71
- "release": "semantic-release",
71
+ "build:exp": "npm run build && bash scripts/install-exp.sh install",
72
+ "uninstall:exp": "bash scripts/install-exp.sh uninstall",
72
73
  "deploy": "bash scripts/publish-all.sh patch",
73
74
  "deploy:minor": "bash scripts/publish-all.sh minor",
74
75
  "deploy:major": "bash scripts/publish-all.sh major",
75
76
  "deploy:dry-run": "bash scripts/publish-all.sh patch --dry-run"
76
77
  },
77
78
  "dependencies": {
78
- "@modelcontextprotocol/sdk": "^1.20.0",
79
79
  "chalk": "^5.3.0",
80
80
  "cli-table3": "^0.6.5",
81
81
  "commander": "^11.1.0",
82
82
  "execa": "^8.0.1",
83
- "fast-glob": "^3.3.2",
84
- "file-type": "^18.7.0",
85
83
  "fs-extra": "^11.1.1",
86
- "fuse.js": "^6.6.2",
87
84
  "glob": "^10.4.5",
88
- "handlebars": "^4.7.8",
89
- "ink": "^4.4.1",
90
- "js-yaml": "^4.1.0",
91
- "juno-code": "file:develop_package",
92
- "react": "^18.2.0",
85
+ "js-yaml": "^4.1.1",
93
86
  "semver": "^7.5.4",
87
+ "strip-ansi": "^7.1.2",
94
88
  "supports-color": "^9.4.0",
95
89
  "uuid": "^9.0.1",
96
90
  "which": "^4.0.0",
97
91
  "zod": "^3.22.4"
98
92
  },
99
93
  "devDependencies": {
100
- "@faker-js/faker": "^8.3.1",
101
94
  "@testing-library/jest-dom": "^6.1.5",
102
- "@testing-library/react": "^14.1.2",
103
- "@testing-library/user-event": "^14.5.1",
104
95
  "@types/fs-extra": "^11.0.4",
105
96
  "@types/js-yaml": "^4.0.9",
106
97
  "@types/node": "^20.10.0",
107
- "@types/react": "^18.2.45",
108
98
  "@types/semver": "^7.5.6",
109
- "@types/tmp": "^0.2.6",
110
99
  "@types/uuid": "^9.0.7",
111
100
  "@typescript-eslint/eslint-plugin": "^6.14.0",
112
101
  "@typescript-eslint/parser": "^6.14.0",
113
102
  "@vitest/coverage-v8": "^1.0.4",
114
103
  "eslint": "^8.55.0",
115
104
  "eslint-config-prettier": "^9.1.0",
116
- "eslint-plugin-react": "^7.33.2",
117
- "eslint-plugin-react-hooks": "^4.6.0",
118
- "happy-dom": "^12.10.3",
119
- "ink-testing-library": "^3.0.0",
120
- "memfs": "^4.6.0",
121
- "msw": "^2.0.11",
122
- "node-pty": "^1.0.0",
123
105
  "prettier": "^3.1.1",
124
106
  "rimraf": "^5.0.5",
125
- "semantic-release": "^22.0.12",
126
- "strip-ansi": "^7.1.2",
127
- "tmp": "^0.2.1",
128
107
  "tsup": "^8.0.1",
129
108
  "tsx": "^4.6.2",
130
- "typedoc": "^0.25.4",
131
109
  "typescript": "^5.3.3",
132
110
  "vitest": "^1.0.4"
133
111
  },