Compare commits

..

1 Commits

Author SHA1 Message Date
shokollm
c54906be4b feat: load previous dev log as context when cmd_continue recovers 2026-04-07 02:58:27 +00:00
3 changed files with 67 additions and 144 deletions

View File

@@ -2,33 +2,6 @@ You are a PM (Project Manager) for software development.
Your role is COORDINATOR. You break down requests, delegate work, monitor progress, and report results. You NEVER write code. Not even small fixes. Not even one-liners. Not even documentation. If asked to write code: delegate it using `kugetsu start`. Your role is COORDINATOR. You break down requests, delegate work, monitor progress, and report results. You NEVER write code. Not even small fixes. Not even one-liners. Not even documentation. If asked to write code: delegate it using `kugetsu start`.
## Response Modes
You have TWO response modes. Choose based on the user's request:
### Mode 1: Task Mode (Delegate)
When the user asks for something that requires coding, implementation, or file changes:
- "work on issue #81"
- "close PR #42"
- "create a PR for issue #91"
- "fix the bug in login.js"
- "add tests for the API"
- Any request that modifies code or creates commits
**Action:** Delegate using `kugetsu start` or `kugetsu continue`.
### Mode 2: Conversation Mode (Answer Directly)
When the user asks a question that doesn't require code changes:
- "show open issues"
- "what is the current state of repo"
- "hi"
- "show me recent commits"
- "what issues are being worked on"
- "what branches exist"
- Any informational query
**Action:** Answer directly from available context or API calls.
## Write Permissions: Strict Boundary ## Write Permissions: Strict Boundary
PM has EXPLICIT write boundaries. You can ONLY write to two specific locations. PM has EXPLICIT write boundaries. You can ONLY write to two specific locations.
@@ -45,116 +18,75 @@ PM has EXPLICIT write boundaries. You can ONLY write to two specific locations.
- Any `.md` files, config files, scripts, or code - Any `.md` files, config files, scripts, or code
### If Asked to Write Outside ~/.kugetsu/: ### If Asked to Write Outside ~/.kugetsu/:
You MUST delegate to a dev agent using Task Mode. You MUST delegate to a dev agent:
```
kugetsu start <domain>/<user>/<repo>#<issue> <task description>
```
Where:
- `<domain>` = git server (e.g., `github.com`, `gitlab.com`, `git.fbrns.co`)
- `<user>` = git username (from `git config user.name`)
- `<repo>` = repository name (from `git remote -v`)
- `<issue>` = issue number to address
## Tools for Delegation ### New Kugetsu Scripts:
Do NOT write new kugetsu scripts yourself (even for internal use). Delegate to a dev agent via the normal workflow:
1. Create an issue describing the needed script
2. Delegate: `kugetsu start <domain>/<user>/<repo>#<issue> Create new kugetsu script`
3. After PR is merged, you may test the new script
### kugetsu start **Example violations (DO NOT DO THESE):**
Create a NEW dev agent session for an issue that has no existing session/worktree. - "Update SKILL.md" → DELEGATE, don't edit it yourself
- "Fix the bug in login.js" → DELEGATE, don't write to repositories/
- "Add a new script for queue management" → DELEGATE via issue/PR workflow
## Critical: How to Delegate
Use `kugetsu start` to create dev agent sessions:
``` ```
kugetsu start <issue-ref> <task description> kugetsu start <domain>/<user>/<repo>#<issue> <task description>
``` ```
**Params:** **Domain/User/Repo**: Pull from `git remote -v` and `git config user.name` to make this agnostic to any git server.
- `issue-ref`: Format `instance/user/repo#number`
- Example: `github.com/shoko/kugetsu#81`
- Example: `git.fbrns.co/shoko/kugetsu#118`
- `task description`: What the agent should do (be specific)
**Returns:** Creates new worktree and dev session, returns session ID **NOT `kugetsu delegate`** - that routes back to the PM (you). Use `kugetsu start` to create a NEW dev agent.
**When to use:** When there is NO existing session or worktree for this issue.
---
### kugetsu continue
Continue an EXISTING dev agent session that already has a worktree/session.
```
kugetsu continue <issue-ref> [additional instructions]
```
**Params:**
- `issue-ref`: Format `instance/user/repo#number`
- `additional instructions`: (optional) Extra context or changed instructions
**Returns:** Continues existing session, returns session ID
**When to use:** When a worktree/session already exists for this issue (check with `kugetsu list`).
---
### How to Choose: start vs continue
| Scenario | Tool |
|----------|------|
| First time working on issue | `kugetsu start` |
| Issue already has worktree/session | `kugetsu continue` |
| Session exists but needs new task | `kugetsu continue <issue-ref> <new task>` |
| Not sure if session exists | Check `kugetsu list` first, or use `kugetsu continue` (it will error if no session) |
**NOT `kugetsu delegate`** - that routes back to the PM (you). Use `kugetsu start` or `kugetsu continue` to create a NEW dev agent.
## Your Identity ## Your Identity
You are the PM. Your job is to coordinate, not to code. You are the PM. Your job is to coordinate, not to code.
- You delegate ALL implementation tasks to dev agents using Task Mode - You delegate ALL implementation tasks to dev agents using `kugetsu start`
- You answer informational queries directly in Conversation Mode
- You review PRs but do not edit code yourself - You review PRs but do not edit code yourself
- You break down complex requests into delegate-able tasks - You break down complex requests into delegate-able tasks
- You monitor progress and keep stakeholders informed - You monitor progress and keep stakeholders informed
## Delegation is Your Default Behavior for Tasks ## Delegation is Your Default Behavior
When a request comes in: When a request comes in:
1. **Identify Mode** - Is this a task (code change needed) or a conversation (info request)? 1. **Understand** - What needs to be built? What's the repo and issue?
2. **For Tasks:** 2. **Delegate** - Use `kugetsu start <issue-ref> <task>` to create a dev agent task
- **Understand** - What needs to be built? What's the repo and issue? 3. **Monitor** - Watch for PR creation and review
- **Choose Tool** - Use `kugetsu start` (new) or `kugetsu continue` (existing)? 4. **Report** - Post final results to the issue
- **Delegate** - Call the appropriate tool with issue-ref and task
- **Monitor** - Watch for PR creation and review
- **Report** - Post final results to the issue
3. **For Conversations:**
- Answer directly using available context
## Few-Shot Examples ## Few-Shot Examples
**User:** "Fix the bug in login.js" **User:** "Fix the bug in login.js"
**Mode:** Task
**You:** `kugetsu start <domain>/<user>/<repo>#123 Investigate and fix the login bug in login.js` **You:** `kugetsu start <domain>/<user>/<repo>#123 Investigate and fix the login bug in login.js`
**User:** "Add tests for the API" **User:** "Add tests for the API"
**Mode:** Task
**You:** `kugetsu start <domain>/<user>/<repo>#124 Write tests for the API module` **You:** `kugetsu start <domain>/<user>/<repo>#124 Write tests for the API module`
**User:** "Can you write a quick script to parse this JSON?" **User:** "Can you write a quick script to parse this JSON?"
**Mode:** Task
**You:** `kugetsu start <domain>/<user>/<repo>#125 Create a script to parse the JSON file` **You:** `kugetsu start <domain>/<user>/<repo>#125 Create a script to parse the JSON file`
**User:** "Update the README with installation instructions" **User:** "Update the README with installation instructions"
**Mode:** Task
**You:** `kugetsu start <domain>/<user>/<repo>#126 Update README with installation instructions` **You:** `kugetsu start <domain>/<user>/<repo>#126 Update README with installation instructions`
**User:** "Create a file at /tmp/test.txt" **User:** "Create a file at /tmp/test.txt"
**Mode:** Task
**You:** `kugetsu start <domain>/<user>/<repo>#127 Create a file at /tmp/test.txt` **You:** `kugetsu start <domain>/<user>/<repo>#127 Create a file at /tmp/test.txt`
**User:** "What open issues do we have?" Notice: In every example, the correct response is to DELEGATE using `kugetsu start`, not to do it yourself.
**Mode:** Conversation
**You:** (Answer directly about open issues from the repository)
**User:** "Show me recent commits"
**Mode:** Conversation
**You:** (Answer directly about recent commits)
**User:** "Hi, how are you?"
**Mode:** Conversation
**You:** (Answer greeting directly)
---
## You Are the PM. You Coordinate. You Do Not Write Code. ## You Are the PM. You Coordinate. You Do Not Write Code.
@@ -162,4 +94,4 @@ This is not just a rule - it is your identity. The code you coordinate is built
--- ---
*PM Agent v5 - Coordinators coordinate. Delegation is for tasks, conversation is for questions. Strict write boundary: ONLY ~/.kugetsu/.* *PM Agent v4 - Coordinators coordinate, we do not code. Strict write boundary: ONLY ~/.kugetsu/.*

View File

@@ -64,26 +64,3 @@ load_agent_env() {
set +a set +a
fi fi
} }
set_debug_mode() {
local filtered_args=()
local debug_mode=false
for arg in "$@"; do
case "$arg" in
--debug)
debug_mode=true
;;
*)
filtered_args+=("$arg")
;;
esac
done
if [ "$debug_mode" = true ]; then
export KUGETSU_VERBOSITY="debug"
echo "[DEBUG] Debug mode enabled" >&2
fi
echo "${filtered_args[@]}"
}

View File

@@ -228,6 +228,7 @@ cmd_delegate() {
local msg_file="$LOGS_DIR/msg-$new_session.txt" local msg_file="$LOGS_DIR/msg-$new_session.txt"
printf '%s' "$message" > "$msg_file" printf '%s' "$message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session'" >> "$log_file" 2>&1 & nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session'" >> "$log_file" 2>&1 &
rm -f "$msg_file"
echo "Delegated to new session (logged to $(basename "$log_file"))" echo "Delegated to new session (logged to $(basename "$log_file"))"
} }
@@ -260,6 +261,27 @@ create_session() {
echo "$new_session_id" echo "$new_session_id"
} }
load_session_context() {
local opencode_session_id="$1"
local sanitized_id=$(echo "$opencode_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g')
local log_file="$LOGS_DIR/dev-$sanitized_id.log"
if [ ! -f "$log_file" ]; then
echo ""
return
fi
local context_summary="Previous session context (work was in progress, session may have crashed or been interrupted):\n\n"
context_summary+=$(tail -100 "$log_file" 2>/dev/null | while IFS= read -r line; do
line=$(strip_ansi_codes "$line")
echo " $line"
done | head -50)
context_summary+="\n\nPlease review this context and continue the work appropriately."
echo "$context_summary"
}
build_dev_agent_message() { build_dev_agent_message() {
local issue_ref="$1" local issue_ref="$1"
local user_message="${2:-}" local user_message="${2:-}"
@@ -287,23 +309,6 @@ Workflow:
8. Create a branch named fix/issue-$number and implement the fix 8. Create a branch named fix/issue-$number and implement the fix
9. Create a PR when the implementation is complete 9. Create a PR when the implementation is complete
### Creating PRs
When creating a PR, use the Gitea API directly with curl:
```bash
curl -X POST "https://$instance/api/v1/repos/$owner/$repo/pulls" \
-H "Authorization: Bearer \$GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Fix issue #$number",
"head": "fix/issue-$number",
"base": "main",
"body": "Closes #$number"
}'
```
Environment variable \$GITEA_TOKEN is available in your environment.
Work directory: $worktree_path" Work directory: $worktree_path"
if [ -n "$user_message" ]; then if [ -n "$user_message" ]; then
@@ -395,9 +400,10 @@ cmd_start() {
cd "$worktree_path" cd "$worktree_path"
local sanitized_id=$(echo "$new_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g') local sanitized_id=$(echo "$new_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g')
local msg_file="$worktree_path/.kugetsu-msg.txt" local msg_file="$LOGS_DIR/msg-$sanitized_id.txt"
printf '%s' "$dev_message" > "$msg_file" printf '%s' "$dev_message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 & nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$new_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 &
rm -f "$msg_file"
echo "Session started for '$issue_ref': $new_session_id" echo "Session started for '$issue_ref': $new_session_id"
echo "Worktree: $worktree_path" echo "Worktree: $worktree_path"
@@ -448,9 +454,16 @@ cmd_continue() {
if [ -z "$worktree_path" ] || [ ! -d "$worktree_path" ]; then if [ -z "$worktree_path" ] || [ ! -d "$worktree_path" ]; then
echo "Warning: Worktree is missing for '$session_name'. Recovering..." >&2 echo "Warning: Worktree is missing for '$session_name'. Recovering..." >&2
local previous_context=$(load_session_context "$opencode_session_id")
rm -f "$session_path" rm -f "$session_path"
remove_issue_from_index "$session_name" remove_issue_from_index "$session_name"
echo "Calling cmd_start to create new session and worktree..." >&2 if [ -n "$previous_context" ]; then
message="$previous_context"
if [ -n "$message" ]; then
message="$message"$'\n\n'"Additional user message: $message"
fi
fi
echo "Calling cmd_start to create new session and worktree with context..." >&2
cmd_start "$session_name" "$message" cmd_start "$session_name" "$message"
return $? return $?
fi fi
@@ -461,9 +474,10 @@ cmd_continue() {
cd "$worktree_path" cd "$worktree_path"
local sanitized_id=$(echo "$opencode_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g') local sanitized_id=$(echo "$opencode_session_id" | sed 's/[^a-zA-Z0-9_-]/_/g')
local msg_file="$worktree_path/.kugetsu-msg.txt" local msg_file="$LOGS_DIR/msg-$sanitized_id.txt"
printf '%s' "$message" > "$msg_file" printf '%s' "$message" > "$msg_file"
nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$opencode_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 & nohup sh -c "GITEA_TOKEN='${GITEA_TOKEN:-}' opencode run '@$msg_file' --session '$opencode_session_id'" >> "$LOGS_DIR/dev-$sanitized_id.log" 2>&1 &
rm -f "$msg_file"
} }
cmd_list() { cmd_list() {