Commit Graph

304 Commits

Author SHA1 Message Date
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
80a3228be9 Merge pull request 'fix(kugetsu-session): extract_issue_ref_from_message fix URL parsing' (#178) from fix/issue-176-extract-issue-ref into main v0.2.7 2026-04-06 04:54:11 +02:00
shokollm
d68a63af41 fix(kugetsu-session): extract_issue_ref_from_message fix URL parsing
Fix issue where full URLs like #158
were incorrectly parsed to 'shoko/kugetsu/issues#158' instead of
'git.fbrns.co/shoko/kugetsu#158'.

The regex now correctly extracts instance, owner, repo, and number
using bash regex capture groups instead of fragile sed/cut pipeline.
2026-04-06 02:51:51 +00:00
56310755b8 Merge pull request 'fix: queue daemon crashes on every task (issue #174)' (#175) from fix/issue-174-queue-daemon-crashes into main v0.2.6 2026-04-06 04:16:12 +02:00
shokollm
fb33be3a64 fix: queue daemon crashes on every task - 3 bugs
Fix 3 bugs from issue #174 that caused silent failure loop:

1. kugetsu-log.sh: Fix json.loads with newlines
   - Previously, notifications JSON was embedded in a single-quoted Python
     string literal, but newlines in the JSON broke the Python parser.
   - Fix: Pass JSON via stdin to Python instead of embedding in string.

2. kugetsu-queue-daemon.sh: Create logs directory during init
   - The logs/ directory ($LOGS_DIR) was never created during kugetsu init.
   - Fix: Add mkdir -p for LOGS_DIR, WORKTREES_DIR, QUEUE_DIR, and
     QUEUE_ITEMS_DIR to ensure_dirs() and ensure_queue_dirs().

3. kugetsu: Fix parse_issue_ref_from_message URL parsing
   - The function used buggy grep/sed to parse URLs like
     #158
   - Fix: Use bash regex (=~) for reliable URL parsing with proper
     capture groups.

Additional improvements:
   - ensure_dirs() now creates all necessary directories instead of just
     SESSIONS_DIR
   - ensure_queue_dirs() now also creates QUEUE_DIR and LOGS_DIR
   - parse_issue_ref_from_message uses consistent bash regex approach
     for all URL patterns
2026-04-06 02:14:27 +00:00
1b19c9a92c Merge pull request 'fix: init script captures wrong session IDs when old sessions exist' (#173) from fix/issue-172-init-script-wrong-session-ids into main v0.2.5 2026-04-06 03:09:30 +02:00
shokollm
85a4239383 fix: init script captures wrong session IDs when old sessions exist
The init script used 'tail -1' to find newly created sessions, which
fails when old sessions exist because it picks an existing session
instead of the newly created one.

The fix captures session IDs before and after creating new sessions,
then diffs to identify newly created sessions.

Fixes #172
2026-04-06 01:08:09 +00:00
shokollm
91b51f62c0 docs: update changelog for v0.2.4 v0.2.4 2026-04-06 00:49:00 +00:00
7234837284 Merge pull request 'fix(kugetsu): remove duplicate update_queue_item_state to use fixed version from kugetsu-index.sh' (#171) from fix/issue-170-duplicate-update-queue into main 2026-04-06 02:42:24 +02:00
shokollm
59f6a4883e fix(kugetsu): remove duplicate update_queue_item_state to use fixed version from kugetsu-index.sh
The main kugetsu script had its own update_queue_item_state() definition
with broken os.system() calls that overwrote the fixed version in kugetsu-index.sh.

Now kugetsu will use the fixed version from kugetsu-index.sh (which sources
kugetsu-log.sh) since that module is sourced first.

Fixes #170
2026-04-06 00:40:55 +00:00
9667c3e800 Merge pull request 'fix(kugetsu-index): call kugetsu_add_notification from bash instead of os.system()' (#169) from fix/issue-167-notification-bash into main 2026-04-06 02:35:36 +02:00
shokollm
796e1fe454 fix(kugetsu-index): call kugetsu_add_notification from bash instead of os.system()
os.system() spawns a new subprocess that cannot access bash functions.
Now calling kugetsu_add_notification directly from bash after Python updates JSON.

Fixes #167
2026-04-06 00:33:35 +00:00
84c59a3b64 Merge pull request 'fix(kugetsu): queue daemon improvements - locking, error handling, cmd_delegate enqueue' (#164) from fix/issue-156-queue-fixes into main 2026-04-06 02:06:36 +02:00
shokollm
dc9d4d7327 Merge origin/main into fix/issue-156-queue-fixes 2026-04-06 00:02:47 +00:00
shokollm
bdcb7a476c fix(queue-daemon): add locking, proper state updates, and error handling
- Add acquire_lock/release_lock to prevent daemon vs manual conflicts
- Check cmd_start/cmd_continue success before updating state to 'notified'
- Set state to 'error' if command fails
- Track actual session_id from session file after cmd_start completes
- Release lock when task completes (success or error)
- Use load_agent_env 'pm-agent' for GITEA_TOKEN

Fixes critical race conditions and failure handling in queue processing
2026-04-06 00:01:41 +00:00
77cf817568 Merge pull request 'fix(kugetsu): return proper JSON array from get_pending_tasks()' (#163) from fix/issue-155-queue-list-json into main 2026-04-06 01:45:09 +02:00
shokollm
0f6a30f01c fix(kugetsu): return proper JSON array from get_pending_tasks() 2026-04-05 23:43:52 +00:00
77b0963fa4 Merge pull request 'fix(queue-daemon): source pm-agent.env for GITEA_TOKEN instead of default.env' (#162) from fix/issue-160-gitea-token-from-pm-agent into main 2026-04-06 01:42:04 +02:00
shokollm
f39e39156a fix(queue-daemon): source pm-agent.env for GITEA_TOKEN instead of default.env 2026-04-05 23:38:07 +00:00
shokollm
5a0a54898b fix(kugetsu): kugetsu-session.sh needs to source required modules
When daemon sources kugetsu-session.sh to call cmd_start/cmd_continue,
it needs access to functions from kugetsu-config.sh, kugetsu-index.sh,
kugetsu-worktree.sh, and kugetsu-log.sh. Add sourcing at top of
kugetsu-session.sh.
2026-04-05 22:20:49 +00:00
shokollm
b1028a6556 fix(kugetsu): move queue functions to kugetsu-index.sh for daemon access
The daemon (kugetsu-queue-daemon.sh) sources kugetsu-index.sh but not the main kugetsu script.
Move update_queue_item_state and kugetsu_add_notification to kugetsu-index.sh
so the daemon can use these functions when processing tasks.
2026-04-05 22:17:59 +00:00