jfl 0.1.0 → 0.2.0
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/README.md +443 -145
- package/clawdbot-plugin/clawdbot.plugin.json +20 -0
- package/clawdbot-plugin/index.js +555 -0
- package/clawdbot-plugin/index.ts +582 -0
- package/clawdbot-skill/SKILL.md +33 -336
- package/clawdbot-skill/index.ts +491 -321
- package/clawdbot-skill/skill.json +4 -13
- package/dist/commands/clawdbot.d.ts +11 -0
- package/dist/commands/clawdbot.d.ts.map +1 -0
- package/dist/commands/clawdbot.js +215 -0
- package/dist/commands/clawdbot.js.map +1 -0
- package/dist/commands/context-hub.d.ts +5 -0
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +394 -28
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/gtm-process-update.d.ts +10 -0
- package/dist/commands/gtm-process-update.d.ts.map +1 -0
- package/dist/commands/gtm-process-update.js +101 -0
- package/dist/commands/gtm-process-update.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +278 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +32 -33
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/memory.d.ts +38 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +229 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate-services.d.ts +8 -0
- package/dist/commands/migrate-services.d.ts.map +1 -0
- package/dist/commands/migrate-services.js +182 -0
- package/dist/commands/migrate-services.js.map +1 -0
- package/dist/commands/onboard.d.ts +24 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +663 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/openclaw.d.ts +56 -0
- package/dist/commands/openclaw.d.ts.map +1 -0
- package/dist/commands/openclaw.js +700 -0
- package/dist/commands/openclaw.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +14 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +270 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/profile.d.ts +46 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +498 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/repair.d.ts.map +1 -1
- package/dist/commands/repair.js +37 -0
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/service-agent.d.ts +16 -0
- package/dist/commands/service-agent.d.ts.map +1 -0
- package/dist/commands/service-agent.js +375 -0
- package/dist/commands/service-agent.js.map +1 -0
- package/dist/commands/service-manager.d.ts +12 -0
- package/dist/commands/service-manager.d.ts.map +1 -0
- package/dist/commands/service-manager.js +967 -0
- package/dist/commands/service-manager.js.map +1 -0
- package/dist/commands/service-validate.d.ts +12 -0
- package/dist/commands/service-validate.d.ts.map +1 -0
- package/dist/commands/service-validate.js +611 -0
- package/dist/commands/service-validate.js.map +1 -0
- package/dist/commands/services-create.d.ts +15 -0
- package/dist/commands/services-create.d.ts.map +1 -0
- package/dist/commands/services-create.js +1452 -0
- package/dist/commands/services-create.js.map +1 -0
- package/dist/commands/services-scan.d.ts +13 -0
- package/dist/commands/services-scan.d.ts.map +1 -0
- package/dist/commands/services-scan.js +251 -0
- package/dist/commands/services-scan.js.map +1 -0
- package/dist/commands/services-sync-agents.d.ts +23 -0
- package/dist/commands/services-sync-agents.d.ts.map +1 -0
- package/dist/commands/services-sync-agents.js +207 -0
- package/dist/commands/services-sync-agents.js.map +1 -0
- package/dist/commands/services.d.ts +19 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +742 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/session.d.ts +5 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +68 -586
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +75 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-settings.d.ts +37 -0
- package/dist/commands/validate-settings.d.ts.map +1 -0
- package/dist/commands/validate-settings.js +197 -0
- package/dist/commands/validate-settings.js.map +1 -0
- package/dist/commands/voice.d.ts +0 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +16 -15
- package/dist/commands/voice.js.map +1 -1
- package/dist/index.js +395 -141
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts +26 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +331 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/memory-db.d.ts +102 -0
- package/dist/lib/memory-db.d.ts.map +1 -0
- package/dist/lib/memory-db.js +313 -0
- package/dist/lib/memory-db.js.map +1 -0
- package/dist/lib/memory-indexer.d.ts +47 -0
- package/dist/lib/memory-indexer.d.ts.map +1 -0
- package/dist/lib/memory-indexer.js +215 -0
- package/dist/lib/memory-indexer.js.map +1 -0
- package/dist/lib/memory-search.d.ts +41 -0
- package/dist/lib/memory-search.d.ts.map +1 -0
- package/dist/lib/memory-search.js +246 -0
- package/dist/lib/memory-search.js.map +1 -0
- package/dist/lib/openclaw-registry.d.ts +48 -0
- package/dist/lib/openclaw-registry.d.ts.map +1 -0
- package/dist/lib/openclaw-registry.js +181 -0
- package/dist/lib/openclaw-registry.js.map +1 -0
- package/dist/lib/openclaw-sdk.d.ts +107 -0
- package/dist/lib/openclaw-sdk.d.ts.map +1 -0
- package/dist/lib/openclaw-sdk.js +208 -0
- package/dist/lib/openclaw-sdk.js.map +1 -0
- package/dist/lib/peer-agent-generator.d.ts +44 -0
- package/dist/lib/peer-agent-generator.d.ts.map +1 -0
- package/dist/lib/peer-agent-generator.js +286 -0
- package/dist/lib/peer-agent-generator.js.map +1 -0
- package/dist/lib/service-dependencies.d.ts +44 -0
- package/dist/lib/service-dependencies.d.ts.map +1 -0
- package/dist/lib/service-dependencies.js +314 -0
- package/dist/lib/service-dependencies.js.map +1 -0
- package/dist/lib/service-detector.d.ts +61 -0
- package/dist/lib/service-detector.d.ts.map +1 -0
- package/dist/lib/service-detector.js +521 -0
- package/dist/lib/service-detector.js.map +1 -0
- package/dist/lib/service-gtm.d.ts +157 -0
- package/dist/lib/service-gtm.d.ts.map +1 -0
- package/dist/lib/service-gtm.js +786 -0
- package/dist/lib/service-gtm.js.map +1 -0
- package/dist/lib/service-mcp-base.d.ts +103 -0
- package/dist/lib/service-mcp-base.d.ts.map +1 -0
- package/dist/lib/service-mcp-base.js +263 -0
- package/dist/lib/service-mcp-base.js.map +1 -0
- package/dist/lib/service-utils.d.ts +103 -0
- package/dist/lib/service-utils.d.ts.map +1 -0
- package/dist/lib/service-utils.js +368 -0
- package/dist/lib/service-utils.js.map +1 -0
- package/dist/lib/skill-generator.d.ts +21 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +253 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/stratus-client.d.ts +100 -0
- package/dist/lib/stratus-client.d.ts.map +1 -0
- package/dist/lib/stratus-client.js +255 -0
- package/dist/lib/stratus-client.js.map +1 -0
- package/dist/mcp/context-hub-mcp.js +135 -53
- package/dist/mcp/context-hub-mcp.js.map +1 -1
- package/dist/mcp/service-mcp-server.d.ts +12 -0
- package/dist/mcp/service-mcp-server.d.ts.map +1 -0
- package/dist/mcp/service-mcp-server.js +434 -0
- package/dist/mcp/service-mcp-server.js.map +1 -0
- package/dist/mcp/service-peer-mcp.d.ts +36 -0
- package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
- package/dist/mcp/service-peer-mcp.js +220 -0
- package/dist/mcp/service-peer-mcp.js.map +1 -0
- package/dist/mcp/service-registry-mcp.d.ts +13 -0
- package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
- package/dist/mcp/service-registry-mcp.js +330 -0
- package/dist/mcp/service-registry-mcp.js.map +1 -0
- package/dist/ui/banner.js +1 -1
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/context-hub-logs.d.ts +10 -0
- package/dist/ui/context-hub-logs.d.ts.map +1 -0
- package/dist/ui/context-hub-logs.js +175 -0
- package/dist/ui/context-hub-logs.js.map +1 -0
- package/dist/ui/service-dashboard.d.ts +11 -0
- package/dist/ui/service-dashboard.d.ts.map +1 -0
- package/dist/ui/service-dashboard.js +357 -0
- package/dist/ui/service-dashboard.js.map +1 -0
- package/dist/ui/services-manager.d.ts +11 -0
- package/dist/ui/services-manager.d.ts.map +1 -0
- package/dist/ui/services-manager.js +507 -0
- package/dist/ui/services-manager.js.map +1 -0
- package/dist/utils/auth-guard.d.ts.map +1 -1
- package/dist/utils/auth-guard.js +8 -9
- package/dist/utils/auth-guard.js.map +1 -1
- package/dist/utils/claude-md-generator.d.ts +10 -0
- package/dist/utils/claude-md-generator.d.ts.map +1 -0
- package/dist/utils/claude-md-generator.js +215 -0
- package/dist/utils/claude-md-generator.js.map +1 -0
- package/dist/utils/ensure-context-hub.d.ts +20 -0
- package/dist/utils/ensure-context-hub.d.ts.map +1 -0
- package/dist/utils/ensure-context-hub.js +65 -0
- package/dist/utils/ensure-context-hub.js.map +1 -0
- package/dist/utils/ensure-project.d.ts.map +1 -1
- package/dist/utils/ensure-project.js +3 -4
- package/dist/utils/ensure-project.js.map +1 -1
- package/dist/utils/jfl-config.d.ts +19 -0
- package/dist/utils/jfl-config.d.ts.map +1 -0
- package/dist/utils/jfl-config.js +112 -0
- package/dist/utils/jfl-config.js.map +1 -0
- package/dist/utils/jfl-migration.d.ts +29 -0
- package/dist/utils/jfl-migration.d.ts.map +1 -0
- package/dist/utils/jfl-migration.js +142 -0
- package/dist/utils/jfl-migration.js.map +1 -0
- package/dist/utils/jfl-paths.d.ts +55 -0
- package/dist/utils/jfl-paths.d.ts.map +1 -0
- package/dist/utils/jfl-paths.js +120 -0
- package/dist/utils/jfl-paths.js.map +1 -0
- package/dist/utils/settings-validator.d.ts +73 -0
- package/dist/utils/settings-validator.d.ts.map +1 -0
- package/dist/utils/settings-validator.js +222 -0
- package/dist/utils/settings-validator.js.map +1 -0
- package/package.json +19 -3
- package/scripts/commit-gtm.sh +56 -0
- package/scripts/commit-product.sh +68 -0
- package/scripts/context-query.sh +45 -0
- package/scripts/session/auto-commit.sh +297 -0
- package/scripts/session/jfl-doctor.sh +707 -0
- package/scripts/session/session-cleanup.sh +268 -0
- package/scripts/session/session-end.sh +198 -0
- package/scripts/session/session-init.sh +350 -0
- package/scripts/session/session-init.sh.backup +292 -0
- package/scripts/session/session-sync.sh +167 -0
- package/scripts/session/test-context-preservation.sh +160 -0
- package/scripts/session/test-critical-infrastructure.sh +293 -0
- package/scripts/session/test-experience-level.sh +336 -0
- package/scripts/session/test-session-cleanup.sh +268 -0
- package/scripts/session/test-session-sync.sh +320 -0
- package/scripts/voice-start.sh +36 -8
- package/scripts/where-am-i.sh +78 -0
- package/template/.claude/service-settings.json +32 -0
- package/template/.claude/settings.json +14 -1
- package/template/.claude/skills/end/SKILL.md +1780 -0
- package/template/.jfl/config.json +2 -1
- package/template/CLAUDE.md +1039 -134
- package/template/CLAUDE.md.bak +1187 -0
- package/template/scripts/commit-gtm.sh +56 -0
- package/template/scripts/commit-product.sh +68 -0
- package/template/scripts/migrate-to-branch-sessions.sh +201 -0
- package/template/scripts/session/auto-commit.sh +58 -6
- package/template/scripts/session/jfl-doctor.sh +137 -17
- package/template/scripts/session/session-cleanup.sh +268 -0
- package/template/scripts/session/session-end.sh +4 -0
- package/template/scripts/session/session-init.sh +253 -66
- package/template/scripts/session/test-critical-infrastructure.sh +293 -0
- package/template/scripts/session/test-experience-level.sh +336 -0
- package/template/scripts/session/test-session-cleanup.sh +268 -0
- package/template/scripts/session/test-session-sync.sh +320 -0
- package/template/scripts/where-am-i.sh +78 -0
- package/template/templates/service-agent/.claude/settings.json +32 -0
- package/template/templates/service-agent/CLAUDE.md +334 -0
- package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
- package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
- package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
- package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
- package/dist/commands/session-mgmt.d.ts +0 -33
- package/dist/commands/session-mgmt.d.ts.map +0 -1
- package/dist/commands/session-mgmt.js +0 -404
- package/dist/commands/session-mgmt.js.map +0 -1
- package/template/scripts/session/auto-merge.sh +0 -325
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
# Auto-merge script for worktree sessions
|
|
4
|
-
# Periodically tries to merge session branch → main
|
|
5
|
-
#
|
|
6
|
-
# Usage:
|
|
7
|
-
# ./scripts/auto-merge.sh start SESSION_NAME # Start merging for a session
|
|
8
|
-
# ./scripts/auto-merge.sh stop SESSION_NAME # Stop merging
|
|
9
|
-
# ./scripts/auto-merge.sh status SESSION_NAME # Check merge status
|
|
10
|
-
# ./scripts/auto-merge.sh once SESSION_NAME # Try merge once
|
|
11
|
-
|
|
12
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
-
REPO_DIR="$(pwd)"
|
|
14
|
-
LOG_FILE="$REPO_DIR/.auto-merge.log"
|
|
15
|
-
INTERVAL=900 # 15 minutes
|
|
16
|
-
MAX_CONSECUTIVE_FAILURES=3
|
|
17
|
-
|
|
18
|
-
SESSION_NAME="${2:-}"
|
|
19
|
-
WORKTREE_DIR="$REPO_DIR/worktrees/$SESSION_NAME"
|
|
20
|
-
PID_FILE="$WORKTREE_DIR/.auto-merge.pid"
|
|
21
|
-
CONFLICT_FILE="$WORKTREE_DIR/.merge-conflict"
|
|
22
|
-
STATUS_FILE="$WORKTREE_DIR/.last-merge-status"
|
|
23
|
-
FAILURE_COUNT_FILE="$WORKTREE_DIR/.merge-failure-count"
|
|
24
|
-
|
|
25
|
-
cd "$REPO_DIR" || exit 1
|
|
26
|
-
|
|
27
|
-
validate_session() {
|
|
28
|
-
if [[ -z "$SESSION_NAME" ]]; then
|
|
29
|
-
echo "Error: SESSION_NAME required"
|
|
30
|
-
echo "Usage: $0 {start|stop|status|once} SESSION_NAME"
|
|
31
|
-
exit 1
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
if [[ ! -d "$WORKTREE_DIR" ]]; then
|
|
35
|
-
echo "Error: Worktree not found: $WORKTREE_DIR"
|
|
36
|
-
exit 1
|
|
37
|
-
fi
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
do_merge() {
|
|
41
|
-
local session="$1"
|
|
42
|
-
local timestamp="[$(date '+%Y-%m-%d %H:%M:%S')]"
|
|
43
|
-
|
|
44
|
-
# Check if conflict marker exists (user hasn't resolved yet)
|
|
45
|
-
if [[ -f "$CONFLICT_FILE" ]]; then
|
|
46
|
-
echo "$timestamp Skipping merge - unresolved conflict exists" >> "$LOG_FILE"
|
|
47
|
-
return 1
|
|
48
|
-
fi
|
|
49
|
-
|
|
50
|
-
# Save current branch
|
|
51
|
-
local current_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
52
|
-
|
|
53
|
-
# Switch to main
|
|
54
|
-
if ! git checkout main --quiet 2>> "$LOG_FILE"; then
|
|
55
|
-
echo "$timestamp ✗ Failed to checkout main" >> "$LOG_FILE"
|
|
56
|
-
return 1
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
# Pull latest main
|
|
60
|
-
if ! git pull --rebase --quiet 2>> "$LOG_FILE"; then
|
|
61
|
-
echo "$timestamp ✗ Failed to pull main" >> "$LOG_FILE"
|
|
62
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
63
|
-
return 1
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# Try to merge the session branch
|
|
67
|
-
if git merge "$session" --no-edit 2>&1 | tee /tmp/merge-output-$$.txt; then
|
|
68
|
-
# Check if it was already up to date
|
|
69
|
-
if grep -q "Already up to date" /tmp/merge-output-$$.txt; then
|
|
70
|
-
echo "$timestamp No changes to merge from $session" >> "$LOG_FILE"
|
|
71
|
-
rm /tmp/merge-output-$$.txt
|
|
72
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
73
|
-
echo "up-to-date" > "$STATUS_FILE"
|
|
74
|
-
# Reset failure count
|
|
75
|
-
echo "0" > "$FAILURE_COUNT_FILE"
|
|
76
|
-
return 0
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# Merge succeeded! Push to remote
|
|
80
|
-
if git push 2>> "$LOG_FILE"; then
|
|
81
|
-
echo "$timestamp ✓ Merged $session → main and pushed" >> "$LOG_FILE"
|
|
82
|
-
echo "merged" > "$STATUS_FILE"
|
|
83
|
-
date '+%s' >> "$STATUS_FILE" # Timestamp
|
|
84
|
-
# Reset failure count
|
|
85
|
-
echo "0" > "$FAILURE_COUNT_FILE"
|
|
86
|
-
rm /tmp/merge-output-$$.txt
|
|
87
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
88
|
-
return 0
|
|
89
|
-
else
|
|
90
|
-
echo "$timestamp ✓ Merged $session → main but push failed (offline?)" >> "$LOG_FILE"
|
|
91
|
-
echo "merged-unpushed" > "$STATUS_FILE"
|
|
92
|
-
rm /tmp/merge-output-$$.txt
|
|
93
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
94
|
-
return 0
|
|
95
|
-
fi
|
|
96
|
-
else
|
|
97
|
-
# Merge conflict! Try auto-resolution for template files
|
|
98
|
-
echo "$timestamp Merge conflict detected, attempting auto-resolution..." >> "$LOG_FILE"
|
|
99
|
-
|
|
100
|
-
# Get list of conflicting files
|
|
101
|
-
local conflicting=$(git diff --name-only --diff-filter=U 2>/dev/null)
|
|
102
|
-
local can_auto_resolve=true
|
|
103
|
-
local non_template_conflicts=""
|
|
104
|
-
|
|
105
|
-
# Check if all conflicts are in template files (safe to take session version)
|
|
106
|
-
# Template files: CLAUDE.md, .claude/, .mcp.json, scripts/, templates/
|
|
107
|
-
for file in $conflicting; do
|
|
108
|
-
case "$file" in
|
|
109
|
-
CLAUDE.md|.mcp.json)
|
|
110
|
-
# Template file - take session version
|
|
111
|
-
git checkout --theirs "$file" 2>/dev/null
|
|
112
|
-
git add "$file" 2>/dev/null
|
|
113
|
-
echo "$timestamp Auto-resolved $file (took session version)" >> "$LOG_FILE"
|
|
114
|
-
;;
|
|
115
|
-
.claude/*|scripts/*|templates/*)
|
|
116
|
-
# Template directory - take session version
|
|
117
|
-
git checkout --theirs "$file" 2>/dev/null
|
|
118
|
-
git add "$file" 2>/dev/null
|
|
119
|
-
echo "$timestamp Auto-resolved $file (took session version)" >> "$LOG_FILE"
|
|
120
|
-
;;
|
|
121
|
-
.jfl/journal/*)
|
|
122
|
-
# Journal files - take session version (they're per-session anyway)
|
|
123
|
-
git checkout --theirs "$file" 2>/dev/null
|
|
124
|
-
git add "$file" 2>/dev/null
|
|
125
|
-
echo "$timestamp Auto-resolved $file (took session version)" >> "$LOG_FILE"
|
|
126
|
-
;;
|
|
127
|
-
knowledge/*|content/*|suggestions/*)
|
|
128
|
-
# User content - cannot auto-resolve, needs manual review
|
|
129
|
-
can_auto_resolve=false
|
|
130
|
-
non_template_conflicts="$non_template_conflicts $file"
|
|
131
|
-
;;
|
|
132
|
-
*)
|
|
133
|
-
# Unknown file type - be conservative, don't auto-resolve
|
|
134
|
-
can_auto_resolve=false
|
|
135
|
-
non_template_conflicts="$non_template_conflicts $file"
|
|
136
|
-
;;
|
|
137
|
-
esac
|
|
138
|
-
done
|
|
139
|
-
|
|
140
|
-
if $can_auto_resolve; then
|
|
141
|
-
# All conflicts were auto-resolved, complete the merge
|
|
142
|
-
if git commit --no-edit 2>> "$LOG_FILE"; then
|
|
143
|
-
echo "$timestamp ✓ Auto-resolved all conflicts and merged" >> "$LOG_FILE"
|
|
144
|
-
|
|
145
|
-
if git push 2>> "$LOG_FILE"; then
|
|
146
|
-
echo "$timestamp ✓ Pushed auto-resolved merge" >> "$LOG_FILE"
|
|
147
|
-
echo "auto-resolved" > "$STATUS_FILE"
|
|
148
|
-
date '+%s' >> "$STATUS_FILE"
|
|
149
|
-
echo "0" > "$FAILURE_COUNT_FILE"
|
|
150
|
-
rm /tmp/merge-output-$$.txt 2>/dev/null
|
|
151
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
152
|
-
return 0
|
|
153
|
-
else
|
|
154
|
-
echo "$timestamp ✓ Auto-resolved but push failed" >> "$LOG_FILE"
|
|
155
|
-
echo "auto-resolved-unpushed" > "$STATUS_FILE"
|
|
156
|
-
rm /tmp/merge-output-$$.txt 2>/dev/null
|
|
157
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
158
|
-
return 0
|
|
159
|
-
fi
|
|
160
|
-
fi
|
|
161
|
-
fi
|
|
162
|
-
|
|
163
|
-
# Could not auto-resolve all conflicts - abort and mark for manual resolution
|
|
164
|
-
git merge --abort 2>/dev/null
|
|
165
|
-
|
|
166
|
-
# Increment failure count
|
|
167
|
-
local failures=0
|
|
168
|
-
if [[ -f "$FAILURE_COUNT_FILE" ]]; then
|
|
169
|
-
failures=$(cat "$FAILURE_COUNT_FILE")
|
|
170
|
-
fi
|
|
171
|
-
failures=$((failures + 1))
|
|
172
|
-
echo "$failures" > "$FAILURE_COUNT_FILE"
|
|
173
|
-
|
|
174
|
-
echo "$timestamp ✗ CONFLICT: $session vs main (attempt $failures)" >> "$LOG_FILE"
|
|
175
|
-
echo "$timestamp Non-auto-resolvable conflicts:$non_template_conflicts" >> "$LOG_FILE"
|
|
176
|
-
|
|
177
|
-
# Get list of conflicting files (for display)
|
|
178
|
-
local conflicting_files=$(echo "$non_template_conflicts" | tr ' ' '\n' | grep -v '^$' | head -10)
|
|
179
|
-
|
|
180
|
-
# Create conflict marker file
|
|
181
|
-
cat > "$CONFLICT_FILE" <<EOF
|
|
182
|
-
MERGE CONFLICT DETECTED
|
|
183
|
-
|
|
184
|
-
Session: $session
|
|
185
|
-
Target: main
|
|
186
|
-
Time: $(date '+%Y-%m-%d %H:%M:%S')
|
|
187
|
-
Consecutive failures: $failures
|
|
188
|
-
|
|
189
|
-
Conflicting files (or files that differ):
|
|
190
|
-
$conflicting_files
|
|
191
|
-
|
|
192
|
-
What to do:
|
|
193
|
-
1. Resolve conflicts manually in your worktree
|
|
194
|
-
2. Commit the resolution to branch: $session
|
|
195
|
-
3. Delete this file when ready to retry merge: rm $CONFLICT_FILE
|
|
196
|
-
|
|
197
|
-
Or ask Claude to help resolve the conflict.
|
|
198
|
-
EOF
|
|
199
|
-
|
|
200
|
-
# Check if we've hit max failures
|
|
201
|
-
if [[ $failures -ge $MAX_CONSECUTIVE_FAILURES ]]; then
|
|
202
|
-
echo "" >> "$CONFLICT_FILE"
|
|
203
|
-
echo "⚠️ WARNING: $failures consecutive merge failures." >> "$CONFLICT_FILE"
|
|
204
|
-
echo "Auto-merge is pausing. Resolve the conflict to resume." >> "$CONFLICT_FILE"
|
|
205
|
-
fi
|
|
206
|
-
|
|
207
|
-
rm /tmp/merge-output-$$.txt 2>/dev/null
|
|
208
|
-
git checkout "$current_branch" --quiet 2>/dev/null
|
|
209
|
-
return 1
|
|
210
|
-
fi
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
start_daemon() {
|
|
214
|
-
validate_session
|
|
215
|
-
|
|
216
|
-
if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
|
|
217
|
-
echo "Auto-merge already running for $SESSION_NAME (PID: $(cat "$PID_FILE"))"
|
|
218
|
-
return 1
|
|
219
|
-
fi
|
|
220
|
-
|
|
221
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting auto-merge for $SESSION_NAME..." >> "$LOG_FILE"
|
|
222
|
-
|
|
223
|
-
# Initialize failure count
|
|
224
|
-
echo "0" > "$FAILURE_COUNT_FILE"
|
|
225
|
-
|
|
226
|
-
# Run in background
|
|
227
|
-
# Close inherited file descriptors so parent doesn't wait for us
|
|
228
|
-
(
|
|
229
|
-
exec </dev/null >/dev/null 2>&1
|
|
230
|
-
while true; do
|
|
231
|
-
# Check if conflict exists and max failures reached
|
|
232
|
-
if [[ -f "$FAILURE_COUNT_FILE" ]]; then
|
|
233
|
-
failures=$(cat "$FAILURE_COUNT_FILE")
|
|
234
|
-
if [[ $failures -ge $MAX_CONSECUTIVE_FAILURES ]] && [[ -f "$CONFLICT_FILE" ]]; then
|
|
235
|
-
# Pause until conflict is resolved
|
|
236
|
-
sleep $INTERVAL
|
|
237
|
-
continue
|
|
238
|
-
fi
|
|
239
|
-
fi
|
|
240
|
-
|
|
241
|
-
do_merge "$SESSION_NAME"
|
|
242
|
-
sleep $INTERVAL
|
|
243
|
-
done
|
|
244
|
-
) &
|
|
245
|
-
|
|
246
|
-
echo $! > "$PID_FILE"
|
|
247
|
-
echo "Auto-merge started for $SESSION_NAME (PID: $!)"
|
|
248
|
-
echo "Interval: ${INTERVAL}s (15 minutes)"
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
stop_daemon() {
|
|
252
|
-
validate_session
|
|
253
|
-
|
|
254
|
-
if [[ -f "$PID_FILE" ]]; then
|
|
255
|
-
local pid=$(cat "$PID_FILE")
|
|
256
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
257
|
-
kill "$pid"
|
|
258
|
-
rm "$PID_FILE"
|
|
259
|
-
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stopped auto-merge for $SESSION_NAME" >> "$LOG_FILE"
|
|
260
|
-
echo "Auto-merge stopped for $SESSION_NAME"
|
|
261
|
-
else
|
|
262
|
-
rm "$PID_FILE"
|
|
263
|
-
echo "Process not running (cleaned up stale PID file)"
|
|
264
|
-
fi
|
|
265
|
-
else
|
|
266
|
-
echo "Auto-merge not running for $SESSION_NAME"
|
|
267
|
-
fi
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
status_daemon() {
|
|
271
|
-
validate_session
|
|
272
|
-
|
|
273
|
-
echo "Session: $SESSION_NAME"
|
|
274
|
-
echo ""
|
|
275
|
-
|
|
276
|
-
if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
|
|
277
|
-
echo "Auto-merge: RUNNING (PID: $(cat "$PID_FILE"))"
|
|
278
|
-
else
|
|
279
|
-
echo "Auto-merge: NOT RUNNING"
|
|
280
|
-
fi
|
|
281
|
-
|
|
282
|
-
if [[ -f "$CONFLICT_FILE" ]]; then
|
|
283
|
-
echo "Status: CONFLICT (resolve manually)"
|
|
284
|
-
echo ""
|
|
285
|
-
cat "$CONFLICT_FILE"
|
|
286
|
-
elif [[ -f "$STATUS_FILE" ]]; then
|
|
287
|
-
local status=$(head -1 "$STATUS_FILE")
|
|
288
|
-
echo "Last merge: $status"
|
|
289
|
-
if [[ -f "$STATUS_FILE" ]] && [[ $(wc -l < "$STATUS_FILE") -gt 1 ]]; then
|
|
290
|
-
local timestamp=$(tail -1 "$STATUS_FILE")
|
|
291
|
-
local time_ago=$(($(date +%s) - timestamp))
|
|
292
|
-
echo "Time ago: ${time_ago}s"
|
|
293
|
-
fi
|
|
294
|
-
else
|
|
295
|
-
echo "Status: No merge attempts yet"
|
|
296
|
-
fi
|
|
297
|
-
|
|
298
|
-
if [[ -f "$FAILURE_COUNT_FILE" ]]; then
|
|
299
|
-
local failures=$(cat "$FAILURE_COUNT_FILE")
|
|
300
|
-
if [[ $failures -gt 0 ]]; then
|
|
301
|
-
echo "Consecutive failures: $failures"
|
|
302
|
-
fi
|
|
303
|
-
fi
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
case "${1:-}" in
|
|
307
|
-
start)
|
|
308
|
-
start_daemon
|
|
309
|
-
;;
|
|
310
|
-
stop)
|
|
311
|
-
stop_daemon
|
|
312
|
-
;;
|
|
313
|
-
status)
|
|
314
|
-
status_daemon
|
|
315
|
-
;;
|
|
316
|
-
once)
|
|
317
|
-
validate_session
|
|
318
|
-
do_merge "$SESSION_NAME"
|
|
319
|
-
echo "Single merge attempt complete"
|
|
320
|
-
;;
|
|
321
|
-
*)
|
|
322
|
-
echo "Usage: $0 {start|stop|status|once} SESSION_NAME"
|
|
323
|
-
exit 1
|
|
324
|
-
;;
|
|
325
|
-
esac
|