claude-cook 1.10.1
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/LICENSE +21 -0
- package/README.md +607 -0
- package/agents/gsd-codebase-mapper.md +738 -0
- package/agents/gsd-debugger.md +1203 -0
- package/agents/gsd-executor.md +784 -0
- package/agents/gsd-integration-checker.md +423 -0
- package/agents/gsd-phase-researcher.md +641 -0
- package/agents/gsd-plan-checker.md +745 -0
- package/agents/gsd-planner.md +1386 -0
- package/agents/gsd-pm.md +331 -0
- package/agents/gsd-project-researcher.md +865 -0
- package/agents/gsd-research-synthesizer.md +256 -0
- package/agents/gsd-roadmapper.md +605 -0
- package/agents/gsd-verifier.md +778 -0
- package/bin/install.js +1477 -0
- package/commands/gsd/add-phase.md +207 -0
- package/commands/gsd/add-todo.md +193 -0
- package/commands/gsd/audit-milestone.md +277 -0
- package/commands/gsd/check-todos.md +228 -0
- package/commands/gsd/complete-milestone.md +136 -0
- package/commands/gsd/debug.md +169 -0
- package/commands/gsd/discuss-phase.md +86 -0
- package/commands/gsd/execute-phase.md +339 -0
- package/commands/gsd/help.md +545 -0
- package/commands/gsd/insert-phase.md +227 -0
- package/commands/gsd/join-discord.md +18 -0
- package/commands/gsd/list-phase-assumptions.md +50 -0
- package/commands/gsd/map-codebase.md +71 -0
- package/commands/gsd/new-milestone.md +721 -0
- package/commands/gsd/new-project.md +1008 -0
- package/commands/gsd/pause-work.md +134 -0
- package/commands/gsd/plan-milestone-gaps.md +295 -0
- package/commands/gsd/plan-phase.md +525 -0
- package/commands/gsd/pm-check.md +115 -0
- package/commands/gsd/pm-replan.md +102 -0
- package/commands/gsd/pm-start.md +218 -0
- package/commands/gsd/pm-status.md +116 -0
- package/commands/gsd/pm-stop.md +72 -0
- package/commands/gsd/progress.md +415 -0
- package/commands/gsd/quick.md +309 -0
- package/commands/gsd/remove-phase.md +349 -0
- package/commands/gsd/research-phase.md +200 -0
- package/commands/gsd/resume-work.md +40 -0
- package/commands/gsd/set-profile.md +106 -0
- package/commands/gsd/settings.md +151 -0
- package/commands/gsd/update.md +172 -0
- package/commands/gsd/verify-work.md +219 -0
- package/get-shit-done/references/checkpoints.md +1078 -0
- package/get-shit-done/references/continuation-format.md +249 -0
- package/get-shit-done/references/git-integration.md +254 -0
- package/get-shit-done/references/model-profiles.md +73 -0
- package/get-shit-done/references/planning-config.md +189 -0
- package/get-shit-done/references/questioning.md +141 -0
- package/get-shit-done/references/tdd.md +263 -0
- package/get-shit-done/references/ui-brand.md +172 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/references/vibe-kanban.md +142 -0
- package/get-shit-done/templates/DEBUG.md +159 -0
- package/get-shit-done/templates/UAT.md +247 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +35 -0
- package/get-shit-done/templates/context.md +283 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +567 -0
- package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/get-shit-done/templates/pm-config.md +55 -0
- package/get-shit-done/templates/pm-log.md +27 -0
- package/get-shit-done/templates/project.md +184 -0
- package/get-shit-done/templates/requirements.md +231 -0
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/get-shit-done/templates/research-project/STACK.md +120 -0
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/get-shit-done/templates/research.md +529 -0
- package/get-shit-done/templates/roadmap.md +202 -0
- package/get-shit-done/templates/state.md +205 -0
- package/get-shit-done/templates/summary.md +246 -0
- package/get-shit-done/templates/ticket-map.md +28 -0
- package/get-shit-done/templates/user-setup.md +311 -0
- package/get-shit-done/templates/verification-report.md +322 -0
- package/get-shit-done/workflows/complete-milestone.md +903 -0
- package/get-shit-done/workflows/diagnose-issues.md +231 -0
- package/get-shit-done/workflows/discovery-phase.md +289 -0
- package/get-shit-done/workflows/discuss-phase.md +433 -0
- package/get-shit-done/workflows/execute-phase.md +671 -0
- package/get-shit-done/workflows/execute-plan.md +1844 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/map-codebase.md +322 -0
- package/get-shit-done/workflows/pm-check.md +210 -0
- package/get-shit-done/workflows/pm-dispatch.md +104 -0
- package/get-shit-done/workflows/pm-replan.md +203 -0
- package/get-shit-done/workflows/pm-sync.md +130 -0
- package/get-shit-done/workflows/resume-project.md +307 -0
- package/get-shit-done/workflows/transition.md +556 -0
- package/get-shit-done/workflows/verify-phase.md +628 -0
- package/get-shit-done/workflows/verify-work.md +596 -0
- package/hooks/dist/gsd-check-update.js +61 -0
- package/hooks/dist/gsd-statusline.js +87 -0
- package/package.json +47 -0
- package/scripts/build-hooks.js +42 -0
- package/scripts/pm-loop.sh +155 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Claude Code Statusline - GSD Edition
|
|
3
|
+
// Shows: model | current task | directory | context usage
|
|
4
|
+
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const os = require('os');
|
|
8
|
+
|
|
9
|
+
// Read JSON from stdin
|
|
10
|
+
let input = '';
|
|
11
|
+
process.stdin.setEncoding('utf8');
|
|
12
|
+
process.stdin.on('data', chunk => input += chunk);
|
|
13
|
+
process.stdin.on('end', () => {
|
|
14
|
+
try {
|
|
15
|
+
const data = JSON.parse(input);
|
|
16
|
+
const model = data.model?.display_name || 'Claude';
|
|
17
|
+
const dir = data.workspace?.current_dir || process.cwd();
|
|
18
|
+
const session = data.session_id || '';
|
|
19
|
+
const remaining = data.context_window?.remaining_percentage;
|
|
20
|
+
|
|
21
|
+
// Context window display (shows USED percentage scaled to 80% limit)
|
|
22
|
+
// Claude Code enforces an 80% context limit, so we scale to show 100% at that point
|
|
23
|
+
let ctx = '';
|
|
24
|
+
if (remaining != null) {
|
|
25
|
+
const rem = Math.round(remaining);
|
|
26
|
+
const rawUsed = Math.max(0, Math.min(100, 100 - rem));
|
|
27
|
+
// Scale: 80% real usage = 100% displayed
|
|
28
|
+
const used = Math.min(100, Math.round((rawUsed / 80) * 100));
|
|
29
|
+
|
|
30
|
+
// Build progress bar (10 segments)
|
|
31
|
+
const filled = Math.floor(used / 10);
|
|
32
|
+
const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
|
|
33
|
+
|
|
34
|
+
// Color based on scaled usage (thresholds adjusted for new scale)
|
|
35
|
+
if (used < 63) { // ~50% real
|
|
36
|
+
ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
|
|
37
|
+
} else if (used < 81) { // ~65% real
|
|
38
|
+
ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
|
|
39
|
+
} else if (used < 95) { // ~76% real
|
|
40
|
+
ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
|
|
41
|
+
} else {
|
|
42
|
+
ctx = ` \x1b[5;31m💀 ${bar} ${used}%\x1b[0m`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Current task from todos
|
|
47
|
+
let task = '';
|
|
48
|
+
const homeDir = os.homedir();
|
|
49
|
+
const todosDir = path.join(homeDir, '.claude', 'todos');
|
|
50
|
+
if (session && fs.existsSync(todosDir)) {
|
|
51
|
+
const files = fs.readdirSync(todosDir)
|
|
52
|
+
.filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
|
|
53
|
+
.map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
|
|
54
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
55
|
+
|
|
56
|
+
if (files.length > 0) {
|
|
57
|
+
try {
|
|
58
|
+
const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
|
|
59
|
+
const inProgress = todos.find(t => t.status === 'in_progress');
|
|
60
|
+
if (inProgress) task = inProgress.activeForm || '';
|
|
61
|
+
} catch (e) {}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// GSD update available?
|
|
66
|
+
let gsdUpdate = '';
|
|
67
|
+
const cacheFile = path.join(homeDir, '.claude', 'cache', 'gsd-update-check.json');
|
|
68
|
+
if (fs.existsSync(cacheFile)) {
|
|
69
|
+
try {
|
|
70
|
+
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
71
|
+
if (cache.update_available) {
|
|
72
|
+
gsdUpdate = '\x1b[33m⬆ /gsd:update\x1b[0m │ ';
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Output
|
|
78
|
+
const dirname = path.basename(dir);
|
|
79
|
+
if (task) {
|
|
80
|
+
process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ \x1b[1m${task}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
81
|
+
} else {
|
|
82
|
+
process.stdout.write(`${gsdUpdate}\x1b[2m${model}\x1b[0m │ \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
83
|
+
}
|
|
84
|
+
} catch (e) {
|
|
85
|
+
// Silent fail - don't break statusline on parse errors
|
|
86
|
+
}
|
|
87
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-cook",
|
|
3
|
+
"version": "1.10.1",
|
|
4
|
+
"description": "A meta-prompting, context engineering and spec-driven development system for Claude Code, OpenCode and Gemini by TÂCHES.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"claude-cook": "bin/install.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"commands",
|
|
11
|
+
"get-shit-done",
|
|
12
|
+
"agents",
|
|
13
|
+
"hooks/dist",
|
|
14
|
+
"scripts"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"claude",
|
|
18
|
+
"claude-code",
|
|
19
|
+
"ai",
|
|
20
|
+
"meta-prompting",
|
|
21
|
+
"context-engineering",
|
|
22
|
+
"spec-driven-development",
|
|
23
|
+
"gemini",
|
|
24
|
+
"gemini-cli"
|
|
25
|
+
],
|
|
26
|
+
"author": "TÂCHES",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/glittercowboy/get-shit-done.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/glittercowboy/get-shit-done",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/glittercowboy/get-shit-done/issues"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=16.7.0"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"esbuild": "^0.24.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build:hooks": "node scripts/build-hooks.js",
|
|
45
|
+
"prepublishOnly": "npm run build:hooks"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Copy GSD hooks to dist for installation.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const HOOKS_DIR = path.join(__dirname, '..', 'hooks');
|
|
10
|
+
const DIST_DIR = path.join(HOOKS_DIR, 'dist');
|
|
11
|
+
|
|
12
|
+
// Hooks to copy (pure Node.js, no bundling needed)
|
|
13
|
+
const HOOKS_TO_COPY = [
|
|
14
|
+
'gsd-check-update.js',
|
|
15
|
+
'gsd-statusline.js'
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
function build() {
|
|
19
|
+
// Ensure dist directory exists
|
|
20
|
+
if (!fs.existsSync(DIST_DIR)) {
|
|
21
|
+
fs.mkdirSync(DIST_DIR, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Copy hooks to dist
|
|
25
|
+
for (const hook of HOOKS_TO_COPY) {
|
|
26
|
+
const src = path.join(HOOKS_DIR, hook);
|
|
27
|
+
const dest = path.join(DIST_DIR, hook);
|
|
28
|
+
|
|
29
|
+
if (!fs.existsSync(src)) {
|
|
30
|
+
console.warn(`Warning: ${hook} not found, skipping`);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
console.log(`Copying ${hook}...`);
|
|
35
|
+
fs.copyFileSync(src, dest);
|
|
36
|
+
console.log(` → ${dest}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log('\nBuild complete.');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
build();
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# pm-loop.sh — Autonomous PM monitor loop
|
|
3
|
+
#
|
|
4
|
+
# Runs an infinite loop that invokes claude CLI with /gsd:pm-check on each cycle.
|
|
5
|
+
# Each invocation is a fresh 200k context — no context rot.
|
|
6
|
+
# State persists via .planning/ files (TICKET-MAP.md, STATE.md, PM-LOG.md).
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# ./scripts/pm-loop.sh [--phase=N] [--interval=60]
|
|
10
|
+
# PM_PHASE=1 PM_POLL_INTERVAL=30 ./scripts/pm-loop.sh
|
|
11
|
+
#
|
|
12
|
+
# Stop:
|
|
13
|
+
# touch .planning/.pm-stop
|
|
14
|
+
# OR run /gsd:pm-stop
|
|
15
|
+
#
|
|
16
|
+
# Background:
|
|
17
|
+
# nohup ./scripts/pm-loop.sh --phase=1 > /dev/null 2>&1 &
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
# ─── Parse arguments ──────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
PHASE="${PM_PHASE:-}"
|
|
24
|
+
INTERVAL="${PM_POLL_INTERVAL:-60}"
|
|
25
|
+
|
|
26
|
+
for arg in "$@"; do
|
|
27
|
+
case $arg in
|
|
28
|
+
--phase=*)
|
|
29
|
+
PHASE="${arg#*=}"
|
|
30
|
+
;;
|
|
31
|
+
--interval=*)
|
|
32
|
+
INTERVAL="${arg#*=}"
|
|
33
|
+
;;
|
|
34
|
+
--help|-h)
|
|
35
|
+
echo "Usage: pm-loop.sh [--phase=N] [--interval=60]"
|
|
36
|
+
echo ""
|
|
37
|
+
echo "Environment variables:"
|
|
38
|
+
echo " PM_PHASE Phase number to monitor"
|
|
39
|
+
echo " PM_POLL_INTERVAL Seconds between poll cycles (default: 60)"
|
|
40
|
+
echo ""
|
|
41
|
+
echo "Stop: touch .planning/.pm-stop"
|
|
42
|
+
exit 0
|
|
43
|
+
;;
|
|
44
|
+
*)
|
|
45
|
+
echo "Unknown argument: $arg"
|
|
46
|
+
echo "Use --help for usage."
|
|
47
|
+
exit 1
|
|
48
|
+
;;
|
|
49
|
+
esac
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# ─── Validate ─────────────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
if [ ! -d ".planning" ]; then
|
|
55
|
+
echo "ERROR: No .planning/ directory found."
|
|
56
|
+
echo "Run /gsd:new-project first, then /gsd:pm-start"
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if ! command -v claude &> /dev/null; then
|
|
61
|
+
echo "ERROR: claude CLI not found in PATH."
|
|
62
|
+
echo "Install: https://docs.anthropic.com/en/docs/claude-code"
|
|
63
|
+
exit 1
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# ─── Configuration ────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
STOP_FILE=".planning/.pm-stop"
|
|
69
|
+
PID_FILE=".planning/.pm-loop-pid"
|
|
70
|
+
LOG_FILE=".planning/PM-LOG.md"
|
|
71
|
+
CYCLE=0
|
|
72
|
+
|
|
73
|
+
# Clean any stale stop signal
|
|
74
|
+
rm -f "$STOP_FILE"
|
|
75
|
+
|
|
76
|
+
# Record PID for /pm:stop
|
|
77
|
+
echo $$ > "$PID_FILE"
|
|
78
|
+
|
|
79
|
+
# ─── Init log ─────────────────────────────────────────────────────
|
|
80
|
+
|
|
81
|
+
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
|
82
|
+
|
|
83
|
+
if [ ! -f "$LOG_FILE" ]; then
|
|
84
|
+
cat > "$LOG_FILE" << EOF
|
|
85
|
+
# PM Decision Log
|
|
86
|
+
|
|
87
|
+
Started: $TIMESTAMP
|
|
88
|
+
Mode: autonomous
|
|
89
|
+
Poll interval: ${INTERVAL}s
|
|
90
|
+
Phase: ${PHASE:-auto}
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
EOF
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
echo "" >> "$LOG_FILE"
|
|
98
|
+
echo "## [$TIMESTAMP] INIT" >> "$LOG_FILE"
|
|
99
|
+
echo "" >> "$LOG_FILE"
|
|
100
|
+
echo "- PM loop started (PID: $$)" >> "$LOG_FILE"
|
|
101
|
+
echo "- Phase: ${PHASE:-auto-detect}" >> "$LOG_FILE"
|
|
102
|
+
echo "- Interval: ${INTERVAL}s" >> "$LOG_FILE"
|
|
103
|
+
|
|
104
|
+
# ─── Main loop ────────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
107
|
+
echo " PM Loop — Phase: ${PHASE:-auto} | Interval: ${INTERVAL}s"
|
|
108
|
+
echo " PID: $$ | Stop: touch $STOP_FILE"
|
|
109
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
110
|
+
echo ""
|
|
111
|
+
|
|
112
|
+
while true; do
|
|
113
|
+
# ── Check stop signal ──
|
|
114
|
+
if [ -f "$STOP_FILE" ]; then
|
|
115
|
+
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
|
116
|
+
echo "[$TIMESTAMP] Stop signal received. Exiting."
|
|
117
|
+
echo "" >> "$LOG_FILE"
|
|
118
|
+
echo "## [$TIMESTAMP] STOP" >> "$LOG_FILE"
|
|
119
|
+
echo "" >> "$LOG_FILE"
|
|
120
|
+
echo "- PM loop stopped by stop file" >> "$LOG_FILE"
|
|
121
|
+
echo "- Completed $CYCLE cycles" >> "$LOG_FILE"
|
|
122
|
+
rm -f "$STOP_FILE" "$PID_FILE"
|
|
123
|
+
exit 0
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
# ── Run one check cycle ──
|
|
127
|
+
CYCLE=$((CYCLE + 1))
|
|
128
|
+
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
|
|
129
|
+
echo "[$TIMESTAMP] Cycle #$CYCLE — polling..."
|
|
130
|
+
|
|
131
|
+
# Fresh Claude invocation each cycle = no context rot
|
|
132
|
+
if [ -n "$PHASE" ]; then
|
|
133
|
+
claude --print --dangerously-skip-permissions --command "/gsd:pm-check $PHASE" 2>&1 || {
|
|
134
|
+
echo "[$TIMESTAMP] WARNING: claude exited with error (cycle #$CYCLE)"
|
|
135
|
+
echo "" >> "$LOG_FILE"
|
|
136
|
+
echo "## [$TIMESTAMP] ERROR" >> "$LOG_FILE"
|
|
137
|
+
echo "" >> "$LOG_FILE"
|
|
138
|
+
echo "- Claude exited with error on cycle #$CYCLE" >> "$LOG_FILE"
|
|
139
|
+
}
|
|
140
|
+
else
|
|
141
|
+
claude --print --dangerously-skip-permissions --command "/gsd:pm-check" 2>&1 || {
|
|
142
|
+
echo "[$TIMESTAMP] WARNING: claude exited with error (cycle #$CYCLE)"
|
|
143
|
+
echo "" >> "$LOG_FILE"
|
|
144
|
+
echo "## [$TIMESTAMP] ERROR" >> "$LOG_FILE"
|
|
145
|
+
echo "" >> "$LOG_FILE"
|
|
146
|
+
echo "- Claude exited with error on cycle #$CYCLE" >> "$LOG_FILE"
|
|
147
|
+
}
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
echo ""
|
|
151
|
+
|
|
152
|
+
# ── Sleep until next cycle ──
|
|
153
|
+
echo "[$TIMESTAMP] Next check in ${INTERVAL}s..."
|
|
154
|
+
sleep "$INTERVAL"
|
|
155
|
+
done
|