Commit Graph

274 Commits

Author SHA1 Message Date
shokollm
b16a97514e fix(session): remove incorrect worktree removal in ensure_session
When worktree exists but session is missing, ensure_session was
incorrectly removing the worktree before recreating. This caused
issues when cmd_continue called ensure_worktree first (creating the
worktree) then ensure_session (which wrongly removed it).

The fix removes the block that removes worktree when session is missing.
If worktree exists, just create the session without touching the worktree.

Fixes #229
2026-04-07 23:39:18 +00:00
b09fe8eabc Merge pull request 'refactor(session): make cmd_continue idempotent with ensure_* functions' (#230) from fix/issue-168 into main v0.2.29 2026-04-08 00:32:16 +02:00
shokollm
d240000088 refactor(session): make cmd_continue idempotent with ensure_* functions
- Add ensure_worktree() - creates worktree if missing, returns status
- Add ensure_session() - creates session if missing, handles inconsistent states
- Add fork_agent() - extracted agent forking logic
- Refactor cmd_continue() to use ensure_* functions (idempotent)
- Make cmd_start() a thin wrapper calling cmd_continue()
- Simplify daemon to always call cmd_continue (no existence check)

This makes cmd_continue truly idempotent - it will:
- Continue existing session if it exists
- Create session and worktree if they don't exist
- Clean and recreate if state is inconsistent

Closes #168
2026-04-07 22:25:53 +00:00
05683ea4c6 Merge pull request 'fix: accumulate message words in cmd_continue for loop' (#227) from fix/issue-225-cmd-continue-message-truncation into main v0.2.28 2026-04-07 15:57:40 +02:00
shokollm
2800e140ac fix: accumulate message words instead of overwriting in cmd_continue
The for loop was overwriting message each iteration, causing only
the last word to survive. Changed to accumulate all words with
proper spacing.

Fixes #225
2026-04-07 13:55:47 +00:00
shokollm
ab06046273 Merge pull request #222 v0.2.27 2026-04-07 12:47:22 +00:00
a18948df98 Merge pull request 'enhancement: enhance PM context with delegation tools and response modes' (#221) from fix/issue-220-pm-context-enhancement into main 2026-04-07 14:25:50 +02:00
shokollm
be301c599d enhancement: enhance PM context with delegation tools and response modes
Add clear distinction between Task Mode (delegate) and Conversation Mode
(answer directly).

- Add kugetsu start tool with params and when to use
- Add kugetsu continue tool with params and when to use
- Add guidance on how to choose between start vs continue
- Add examples for conversation mode responses
- Improve few-shot examples with mode identification

Fixes #220
v0.2.26
2026-04-07 12:24:27 +00:00
34a0943202 Merge pull request 'fix: remove race condition in cmd_delegate msg file deletion' (#211) from fix/issue-210-msg-file-race-condition into main 2026-04-07 11:54:23 +02:00
shokollm
4464e5d91f fix: remove race condition in cmd_delegate msg file deletion
cmd_delegate deletes the message file immediately after spawning the
background nohup process, causing a race condition where opencode run
may not have read the file yet.

Error: File not found: msg-ses_xxx.txt

Fix by removing rm -f "$msg_file", consistent with cmd_start and
cmd_continue which write to $worktree_path/.kugetsu-msg.txt and never
delete it. Orphaned msg files in $LOGS_DIR/ are harmless.

Fixes #210
v0.2.25
2026-04-07 09:51:46 +00:00
c71f43b581 Merge pull request 'fix: add missing set_debug_mode to kugetsu-session.sh' (#208) from fix/issue-207-queue-daemon-set-debug-mode into main 2026-04-07 10:39:41 +02:00
shokollm
66c8624d66 fix: move set_debug_mode to kugetsu-config.sh
The queue daemon crashes with 'set_debug_mode: command not found'
because cmd_continue() calls set_debug_mode(), but that function
was only defined in the main kugetsu script.

Instead of duplicating the function, move it to kugetsu-config.sh
which is always sourced before kugetsu-session.sh in all contexts.

Fixes #207
v0.2.24
2026-04-07 08:31:17 +00:00
1b5de5d553 Merge pull request 'feat: add merge capability with approval confirmation' (#205) from fix/pr-merge-with-approval into main 2026-04-07 08:12:31 +02:00
shokollm
19ade67a99 feat: add merge capability with approval confirmation to cmd_continue prompt 2026-04-07 06:04:34 +00:00
efcec4e122 feat: add pre-commit configuration for linting and commit message enforcement (#117) 2026-04-07 08:02:56 +02:00
shokollm
930d0e53b5 docs: add pre-commit hooks section to CONTRIBUTING.md (#117) 2026-04-07 04:35:14 +00:00
e0aac3c05f feat: add PR review/comment workflow to cmd_continue prompt (#204) 2026-04-07 06:28:15 +02:00
a211b56303 fix: move msg file to .kugetsu/ and add tea PR creation instructions (#201) 2026-04-07 05:48:41 +02:00
shokollm
e86a309059 feat: add pre-commit configuration for linting and commit message enforcement (#117) 2026-04-07 03:37:28 +00:00
2beb3adb14 fix: remove unnecessary rm of msg file to avoid race condition (#200) v0.2.20 v0.2.21 v0.2.22 v0.2.23 2026-04-07 05:29:07 +02:00
bfd6778f8b fix: move msg file inside worktree to avoid external_directory permission error (#198) 2026-04-07 05:14:45 +02:00
aafdebb6c6 fix: suppress opencode fork stdout and strip ANSI codes from logs (#197) 2026-04-07 04:58:15 +02:00
e666f4dffb Merge pull request 'fix: use temp file for message to avoid shell parsing issues' (#196) from fix/issue-message-encoding into main 2026-04-07 04:27:50 +02:00
shokollm
a130a79bd7 fix: use temp file for message to avoid shell parsing issues
The message passed to opencode run contains newlines and special
characters (parentheses, etc.) which break shell parsing when passed
directly in double quotes.

Fix by writing message to temp file and using '@msg_file' syntax
to pass to opencode run. This handles any characters in the message.
v0.2.16
2026-04-07 01:55:34 +00:00
shokollm
798bee0f79 feat: add centralized logging handler with structured log format
- Add log() function with info|warn|error|debug levels
- Log format: timestamp level component message
- Sensitive values (tokens, passwords, secrets) are masked automatically
- Fix mask_sensitive_vars to handle empty input gracefully

Implements: shoko/kugetsu#118
2026-04-07 01:48:52 +00:00
478f7ceeba Merge pull request 'fix: improve worktree/session handling in cmd_start and cmd_continue' (#195) from fix/issue-daemon-worktree-session-handling into main 2026-04-07 03:41:27 +02:00
shokollm
9d0bcef465 fix: improve worktree/session handling in cmd_start, cmd_continue, and cmd_init
cmd_continue:
- If worktree is missing but session exists, remove stale session and call cmd_start automatically
- This allows automatic recovery without user intervention

cmd_start:
- Check BOTH worktree AND session existence
- If only worktree exists (not session): remove worktree, recreate both
- If only session exists (not worktree): remove session, recreate both
- If both exist: tell user to use continue

cmd_init --force:
- Now destroys ALL sessions, worktrees, and logs for a clean slate
- Destroys base, pm-agent, all forked sessions, all worktrees, all logs

Daemon:
- Fixed wrong path in check_task_completion ($HOME/.kugetsu-worktrees -> $WORKTREES_DIR)
v0.2.15
2026-04-07 01:40:20 +00:00
bb2add2e1a Merge pull request 'fix: properly quote base and pm_agent in write_index calls' (#194) from fix/issue-write-index-quoting into main 2026-04-07 02:50:32 +02:00
shokollm
6a8fa563dd fix: properly quote base and pm_agent in write_index calls
When base or pm_agent are not null, they need to be quoted with escaped quotes ("") in write_index calls.
This fixes 'write_index would create malformed JSON' error during init.
v0.2.14
2026-04-07 00:48:06 +00:00
8729321922 Merge pull request 'fix: use ${GITEA_TOKEN:-} to handle unset token' (#193) from fix/issue-cmd-destroy-unbound-var into main 2026-04-07 02:41:17 +02:00
shokollm
998f7a4f44 refactor: remove duplicate functions from kugetsu, use kugetsu-index.sh exclusively
- Remove duplicate write_index, get_base_session_id, get_pm_agent_session_id,
  get_session_for_issue, set_base_in_index, set_pm_agent_in_index,
  add_issue_to_index, remove_issue_from_index from kugetsu
- These functions are already defined in kugetsu-index.sh which is sourced earlier
- The kugetsu versions were shadowing the kugetsu-index.sh ones unnecessarily
- This removes code duplication and ensures consistent behavior
v0.2.13
2026-04-07 00:39:45 +00:00
shokollm
b595411a07 test: add test suite for create_session function
Tests run sequentially to avoid memory exhaustion with too many opencode sessions:
- JSON session list parsing
- Session ID format validation
- create_session returns valid session ID
- create_session creates NEW session (different from base)
- create_session creates different sessions on multiple calls
- create_session accepts optional base session parameter
- Created session visible in opencode session list
2026-04-07 00:24:03 +00:00
shokollm
08b633400d refactor: add create_session() and use --session instead of --continue
- Add create_session() function that forks from base session using JSON session detection
- cmd_delegate: fork new session from base instead of using pm_agent
- cmd_start: use create_session() instead of broken before/after detection
- cmd_continue: use --session instead of --continue (no need to continue existing session)
- Remove pm_agent check from cmd_start (no longer needed)
2026-04-07 00:13:06 +00:00
shokollm
860bf9295f fix: use ${GITEA_TOKEN:-} to handle unset token and initialize env during init
With set -u, expanding $GITEA_TOKEN fails if not set.
Changed to ${GITEA_TOKEN:-} to provide empty default.

Also initializes $ENV_DIR/default.env during kugetsu init
so users are aware of the env file structure.
2026-04-06 09:45:15 +00:00
cf8b003d2f Merge pull request 'fix: cmd_destroy unbound variable $2' (#192) from fix/issue-cmd-destroy-unbound-var into main 2026-04-06 11:30:04 +02:00
shokollm
fd79bfa3ea fix: cmd_destroy unbound variable $2
With set -u, using $2 without default causes error when called without arguments.
2026-04-06 09:24:47 +00:00
119c9b8fd9 Merge pull request 'fix: daemon worktree path and agent forking issues' (#191) from fix/issue-daemon-worktree-path-fix into main 2026-04-06 11:19:52 +02:00
shokollm
7f7f8b1085 fix: multiple issues with queue daemon and agent forking
1. daemon: use $WORKTREES_DIR instead of $HOME/.kugetsu-worktrees
   - Worktrees are created in ~/.kugetsu/worktrees but daemon was checking ~/.kugetsu-worktrees
   - This caused cmd_start to be called when cmd_continue should have been

2. load_agent_env: add fallback to pm-agent.env
   - When dev.env and default.env don't exist, fallback to pm-agent.env
   - Ensures GITEA_TOKEN is available

3. Remove '&& disown' pattern that causes 'no such job' errors
   - nohup already makes process immune to SIGHUP
   - disown was causing errors because job context was lost
v0.2.12
2026-04-06 09:14:37 +00:00
1a523a805a Merge pull request 'fix: syntax error in cmd_continue line 372 (issue #189)' (#190) from fix/issue-syntax-error-372 into main 2026-04-06 10:46:09 +02:00
shokollm
6aa84a35b9 fix: syntax error in cmd_continue line 372 (issue #189)
Wrap nohup command in subshell to fix '&& disown' syntax error
v0.2.11
2026-04-06 08:44:29 +00:00
6e2841bbda Merge pull request 'fix: cmd_start and cmd_continue now fork dev agent to work on task (issue #187)' (#188) from fix/issue-187-start-forks-agent into main 2026-04-06 10:13:42 +02:00
shokollm
99d09c7dda fix: cmd_start and cmd_continue now fork dev agent to work on task (issue #187)
- Added build_dev_agent_message() function to generate default workflow prompt
- cmd_start now forks the agent after creating session (fire-and-forget)
- cmd_continue now uses default message when empty and forks agent (fire-and-forget)
- Both commands log output to $LOGS_DIR/dev-$session_id.log
v0.2.10
2026-04-06 08:05:42 +00:00
383f538438 Merge pull request 'fix: worktree created in wrong directory (issue #185)' (#186) from fix/issue-185-worktree-wrong-directory into main 2026-04-06 07:33:02 +02:00
shokollm
28b343f817 fix: worktree created in wrong directory (issue #185)
cmd_start was calling create_worktree without passing $WORKTREES_DIR,
causing worktrees to be created in $PWD (daemon's working directory)
instead of ~/.kugetsu-worktrees/
2026-04-06 05:18:31 +00:00
3a2095861f Merge pull request 'fix: destroy --base -y fails with 'target is required' (issue #183)' (#184) from fix/issue-183-destroy-base-requires-target into main 2026-04-06 06:16:30 +02:00
shokollm
836fde07fc fix: destroy --base -y fails with 'target is required' (issue #183)
Removed erroneous code that set target="" when target="--base".
This caused the early exit at 'if [ -z "$target" ]' to trigger
before reaching the actual --base handling at line 517.
2026-04-06 04:14:03 +00:00
4f2a04e0b4 Merge pull request 'fix: get_repo_url() strips user/org from path (issue #181)' (#182) from fix/issue-181-get-repo-url-strips-user-org into main 2026-04-06 06:07:46 +02:00
shokollm
c8bb0b36f4 fix: get_repo_url() strips user/org from path (issue #181)
The sed pattern 's/.*\///' on line 44 was removing everything up to the
LAST slash, but for issue refs like 'git.fbrns.co/shoko/kugetsu#158' it
should remove the instance prefix only (up to the FIRST slash).

Before: git.fbrns.co/shoko/kugetsu#158 -> kugetsu (WRONG)
After:  git.fbrns.co/shoko/kugetsu#158 -> shoko/kugetsu (CORRECT)

Also adds comprehensive test suite for git URL parsing functions:
- get_repo_url(), issue_ref_to_worktree_name(), issue_ref_to_branch_name()
- extract_issue_ref_from_message(), validate_issue_ref()
- issue_ref_to_filename(), filename_to_issue_ref()
v0.2.9
2026-04-06 04:00:18 +00:00
937b7c69de Merge pull request 'fix: remove doubled .kugetsu-worktrees path segment in issue_ref_to_worktree_path' (#180) from fix/issue-179-worktree-path-doubled into main v0.2.8 2026-04-06 05:27:16 +02:00
shokollm
2051266809 fix: remove doubled .kugetsu-worktrees path segment in issue_ref_to_worktree_path
Fixes #179 - cmd_start fails due to incorrect worktree path being created
with .kugetsu-worktrees/.kugetsu-worktrees/ instead of just the worktree name.
2026-04-06 03:23:23 +00:00