@fifine/aim-studio 0.0.2 → 0.0.3
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/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +123 -101
- package/dist/commands/init.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +91 -65
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/templates/aim/scripts/common/paths.py +3 -2
- package/dist/templates/aim/scripts/export.py +427 -0
- package/dist/templates/claude/commands/aim/export.md +89 -115
- package/dist/templates/claude/commands/aim/onboard.md +10 -8
- package/dist/templates/claude/commands/aim/start.md +104 -37
- package/dist/templates/claude/hooks/inject-subagent-context.py +6 -10
- package/dist/templates/claude/hooks/session-start.py +134 -24
- package/dist/templates/markdown/index.d.ts +5 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +6 -0
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/cli/directory-structure.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/error-handling.md.txt +91 -0
- package/dist/templates/markdown/spec/cli/index.md.txt +37 -0
- package/dist/templates/markdown/spec/cli/options-flags.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/output-formatting.md.txt +93 -0
- package/dist/utils/project-detector.d.ts +1 -1
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +20 -0
- package/dist/utils/project-detector.js.map +1 -1
- package/package.json +1 -1
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
- package/dist/templates/claude/commands/trellis/check-backend.md +0 -13
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/claude/commands/trellis/check-frontend.md +0 -13
- package/dist/templates/claude/commands/trellis/create-command.md +0 -154
- package/dist/templates/claude/commands/trellis/finish-work.md +0 -129
- package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/claude/commands/trellis/onboard.md +0 -358
- package/dist/templates/claude/commands/trellis/parallel.md +0 -193
- package/dist/templates/claude/commands/trellis/record-session.md +0 -62
- package/dist/templates/claude/commands/trellis/start.md +0 -280
- package/dist/templates/claude/commands/trellis/update-spec.md +0 -285
- package/dist/templates/trellis/gitignore.txt +0 -29
- package/dist/templates/trellis/index.d.ts +0 -49
- package/dist/templates/trellis/index.d.ts.map +0 -1
- package/dist/templates/trellis/index.js +0 -92
- package/dist/templates/trellis/index.js.map +0 -1
- package/dist/templates/trellis/scripts/__init__.py +0 -5
- package/dist/templates/trellis/scripts/add_session.py +0 -392
- package/dist/templates/trellis/scripts/common/__init__.py +0 -80
- package/dist/templates/trellis/scripts/common/cli_adapter.py +0 -435
- package/dist/templates/trellis/scripts/common/developer.py +0 -190
- package/dist/templates/trellis/scripts/common/git_context.py +0 -383
- package/dist/templates/trellis/scripts/common/paths.py +0 -347
- package/dist/templates/trellis/scripts/common/phase.py +0 -253
- package/dist/templates/trellis/scripts/common/registry.py +0 -366
- package/dist/templates/trellis/scripts/common/task_queue.py +0 -255
- package/dist/templates/trellis/scripts/common/task_utils.py +0 -178
- package/dist/templates/trellis/scripts/common/worktree.py +0 -219
- package/dist/templates/trellis/scripts/create_bootstrap.py +0 -290
- package/dist/templates/trellis/scripts/get_context.py +0 -16
- package/dist/templates/trellis/scripts/get_developer.py +0 -26
- package/dist/templates/trellis/scripts/init_developer.py +0 -51
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -403
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -329
- package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -233
- package/dist/templates/trellis/scripts/multi_agent/start.py +0 -461
- package/dist/templates/trellis/scripts/multi_agent/status.py +0 -817
- package/dist/templates/trellis/scripts/task.py +0 -1056
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
- package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +0 -416
- package/dist/templates/trellis/worktree.yaml +0 -47
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Git and Session Context utilities
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# ./.trellis/scripts/common/git-context.sh # Full context output
|
|
6
|
-
# ./.trellis/scripts/common/git-context.sh --json # JSON format
|
|
7
|
-
#
|
|
8
|
-
# Or source in other scripts:
|
|
9
|
-
# source "$(dirname "$0")/common/git-context.sh"
|
|
10
|
-
|
|
11
|
-
set -e
|
|
12
|
-
|
|
13
|
-
COMMON_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
-
source "$COMMON_DIR/paths.sh"
|
|
15
|
-
source "$COMMON_DIR/developer.sh"
|
|
16
|
-
|
|
17
|
-
# =============================================================================
|
|
18
|
-
# JSON Output
|
|
19
|
-
# =============================================================================
|
|
20
|
-
|
|
21
|
-
output_json() {
|
|
22
|
-
local repo_root=$(get_repo_root)
|
|
23
|
-
local developer=$(get_developer "$repo_root")
|
|
24
|
-
local tasks_dir=$(get_tasks_dir "$repo_root")
|
|
25
|
-
local journal_file=$(get_active_journal_file "$repo_root")
|
|
26
|
-
local journal_lines=0
|
|
27
|
-
local journal_relative=""
|
|
28
|
-
|
|
29
|
-
if [[ -n "$journal_file" ]]; then
|
|
30
|
-
journal_lines=$(count_lines "$journal_file")
|
|
31
|
-
journal_relative="$DIR_WORKFLOW/$DIR_WORKSPACE/$developer/$(basename "$journal_file")"
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
local branch=$(git branch --show-current 2>/dev/null || echo "unknown")
|
|
35
|
-
local git_status=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
|
|
36
|
-
local is_clean="true"
|
|
37
|
-
[[ "$git_status" != "0" ]] && is_clean="false"
|
|
38
|
-
|
|
39
|
-
# Build commits JSON
|
|
40
|
-
local commits_json="["
|
|
41
|
-
local first=true
|
|
42
|
-
while IFS= read -r line; do
|
|
43
|
-
local hash=$(echo "$line" | cut -d' ' -f1)
|
|
44
|
-
local msg=$(echo "$line" | cut -d' ' -f2-)
|
|
45
|
-
msg=$(echo "$msg" | sed 's/"/\\"/g')
|
|
46
|
-
if [[ "$first" == "true" ]]; then
|
|
47
|
-
first=false
|
|
48
|
-
else
|
|
49
|
-
commits_json+=","
|
|
50
|
-
fi
|
|
51
|
-
commits_json+="{\"hash\":\"$hash\",\"message\":\"$msg\"}"
|
|
52
|
-
done < <(git log --oneline -5 2>/dev/null || echo "")
|
|
53
|
-
commits_json+="]"
|
|
54
|
-
|
|
55
|
-
# Build tasks JSON
|
|
56
|
-
local tasks_json="["
|
|
57
|
-
first=true
|
|
58
|
-
if [[ -d "$tasks_dir" ]]; then
|
|
59
|
-
for d in "$tasks_dir"/*/; do
|
|
60
|
-
if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
|
|
61
|
-
local task_json="$d/$FILE_TASK_JSON"
|
|
62
|
-
if [[ -f "$task_json" ]]; then
|
|
63
|
-
local dir_name=$(basename "$d")
|
|
64
|
-
local name=$(jq -r '.name // .id // "unknown"' "$task_json" 2>/dev/null)
|
|
65
|
-
local status=$(jq -r '.status // "unknown"' "$task_json" 2>/dev/null)
|
|
66
|
-
if [[ "$first" == "true" ]]; then
|
|
67
|
-
first=false
|
|
68
|
-
else
|
|
69
|
-
tasks_json+=","
|
|
70
|
-
fi
|
|
71
|
-
tasks_json+="{\"dir\":\"$dir_name\",\"name\":\"$name\",\"status\":\"$status\"}"
|
|
72
|
-
fi
|
|
73
|
-
fi
|
|
74
|
-
done
|
|
75
|
-
fi
|
|
76
|
-
tasks_json+="]"
|
|
77
|
-
|
|
78
|
-
cat << EOF
|
|
79
|
-
{
|
|
80
|
-
"developer": "$developer",
|
|
81
|
-
"git": {
|
|
82
|
-
"branch": "$branch",
|
|
83
|
-
"isClean": $is_clean,
|
|
84
|
-
"uncommittedChanges": $git_status,
|
|
85
|
-
"recentCommits": $commits_json
|
|
86
|
-
},
|
|
87
|
-
"tasks": {
|
|
88
|
-
"active": $tasks_json,
|
|
89
|
-
"directory": "$DIR_WORKFLOW/$DIR_TASKS"
|
|
90
|
-
},
|
|
91
|
-
"journal": {
|
|
92
|
-
"file": "$journal_relative",
|
|
93
|
-
"lines": $journal_lines,
|
|
94
|
-
"nearLimit": $([ "$journal_lines" -gt 1800 ] && echo "true" || echo "false")
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
EOF
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
# =============================================================================
|
|
101
|
-
# Text Output
|
|
102
|
-
# =============================================================================
|
|
103
|
-
|
|
104
|
-
output_text() {
|
|
105
|
-
local repo_root=$(get_repo_root)
|
|
106
|
-
local developer=$(get_developer "$repo_root")
|
|
107
|
-
|
|
108
|
-
echo "========================================"
|
|
109
|
-
echo "SESSION CONTEXT"
|
|
110
|
-
echo "========================================"
|
|
111
|
-
echo ""
|
|
112
|
-
|
|
113
|
-
echo "## DEVELOPER"
|
|
114
|
-
if [[ -z "$developer" ]]; then
|
|
115
|
-
echo "ERROR: Not initialized. Run: ./$DIR_WORKFLOW/$DIR_SCRIPTS/init-developer.sh <name>"
|
|
116
|
-
exit 1
|
|
117
|
-
fi
|
|
118
|
-
echo "Name: $developer"
|
|
119
|
-
echo ""
|
|
120
|
-
|
|
121
|
-
echo "## GIT STATUS"
|
|
122
|
-
echo "Branch: $(git branch --show-current 2>/dev/null || echo 'unknown')"
|
|
123
|
-
local status_count=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
|
|
124
|
-
if [[ "$status_count" == "0" ]]; then
|
|
125
|
-
echo "Working directory: Clean"
|
|
126
|
-
else
|
|
127
|
-
echo "Working directory: $status_count uncommitted change(s)"
|
|
128
|
-
echo ""
|
|
129
|
-
echo "Changes:"
|
|
130
|
-
git status --short 2>/dev/null | head -10
|
|
131
|
-
fi
|
|
132
|
-
echo ""
|
|
133
|
-
|
|
134
|
-
echo "## RECENT COMMITS"
|
|
135
|
-
git log --oneline -5 2>/dev/null || echo "(no commits)"
|
|
136
|
-
echo ""
|
|
137
|
-
|
|
138
|
-
echo "## CURRENT TASK"
|
|
139
|
-
local current_task=$(get_current_task "$repo_root")
|
|
140
|
-
if [[ -n "$current_task" ]]; then
|
|
141
|
-
local current_task_dir="$repo_root/$current_task"
|
|
142
|
-
local task_json="$current_task_dir/$FILE_TASK_JSON"
|
|
143
|
-
echo "Path: $current_task"
|
|
144
|
-
|
|
145
|
-
if [[ -f "$task_json" ]]; then
|
|
146
|
-
if command -v jq &> /dev/null; then
|
|
147
|
-
local t_name=$(jq -r '.name // .id // "unknown"' "$task_json")
|
|
148
|
-
local t_status=$(jq -r '.status // "unknown"' "$task_json")
|
|
149
|
-
local t_created=$(jq -r '.createdAt // "unknown"' "$task_json")
|
|
150
|
-
local t_desc=$(jq -r '.description // ""' "$task_json")
|
|
151
|
-
echo "Name: $t_name"
|
|
152
|
-
echo "Status: $t_status"
|
|
153
|
-
echo "Created: $t_created"
|
|
154
|
-
if [[ -n "$t_desc" ]]; then
|
|
155
|
-
echo "Description: $t_desc"
|
|
156
|
-
fi
|
|
157
|
-
fi
|
|
158
|
-
fi
|
|
159
|
-
|
|
160
|
-
# Check for prd.md
|
|
161
|
-
if [[ -f "$current_task_dir/prd.md" ]]; then
|
|
162
|
-
echo ""
|
|
163
|
-
echo "[!] This task has prd.md - read it for task details"
|
|
164
|
-
fi
|
|
165
|
-
else
|
|
166
|
-
echo "(none)"
|
|
167
|
-
fi
|
|
168
|
-
echo ""
|
|
169
|
-
|
|
170
|
-
echo "## ACTIVE TASKS"
|
|
171
|
-
local tasks_dir=$(get_tasks_dir "$repo_root")
|
|
172
|
-
local task_count=0
|
|
173
|
-
if [[ -d "$tasks_dir" ]]; then
|
|
174
|
-
for d in "$tasks_dir"/*/; do
|
|
175
|
-
if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
|
|
176
|
-
local dir_name=$(basename "$d")
|
|
177
|
-
local t_json="$d/$FILE_TASK_JSON"
|
|
178
|
-
local status="unknown"
|
|
179
|
-
local assignee="-"
|
|
180
|
-
if [[ -f "$t_json" ]] && command -v jq &> /dev/null; then
|
|
181
|
-
status=$(jq -r '.status // "unknown"' "$t_json")
|
|
182
|
-
assignee=$(jq -r '.assignee // "-"' "$t_json")
|
|
183
|
-
fi
|
|
184
|
-
echo "- $dir_name/ ($status) @$assignee"
|
|
185
|
-
((task_count++)) || true
|
|
186
|
-
fi
|
|
187
|
-
done
|
|
188
|
-
fi
|
|
189
|
-
if [[ $task_count -eq 0 ]]; then
|
|
190
|
-
echo "(no active tasks)"
|
|
191
|
-
fi
|
|
192
|
-
echo "Total: $task_count active task(s)"
|
|
193
|
-
echo ""
|
|
194
|
-
|
|
195
|
-
echo "## MY TASKS (Assigned to me)"
|
|
196
|
-
local my_task_count=0
|
|
197
|
-
if [[ -d "$tasks_dir" ]]; then
|
|
198
|
-
for d in "$tasks_dir"/*/; do
|
|
199
|
-
if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
|
|
200
|
-
local t_json="$d/$FILE_TASK_JSON"
|
|
201
|
-
if [[ -f "$t_json" ]] && command -v jq &> /dev/null; then
|
|
202
|
-
local assignee=$(jq -r '.assignee // ""' "$t_json")
|
|
203
|
-
local status=$(jq -r '.status // "planning"' "$t_json")
|
|
204
|
-
if [[ "$assignee" == "$developer" ]] && [[ "$status" != "done" ]]; then
|
|
205
|
-
local title=$(jq -r '.title // .name // "unknown"' "$t_json")
|
|
206
|
-
local priority=$(jq -r '.priority // "P2"' "$t_json")
|
|
207
|
-
echo "- [$priority] $title ($status)"
|
|
208
|
-
((my_task_count++)) || true
|
|
209
|
-
fi
|
|
210
|
-
fi
|
|
211
|
-
fi
|
|
212
|
-
done
|
|
213
|
-
fi
|
|
214
|
-
if [[ $my_task_count -eq 0 ]]; then
|
|
215
|
-
echo "(no tasks assigned to you)"
|
|
216
|
-
fi
|
|
217
|
-
echo ""
|
|
218
|
-
|
|
219
|
-
echo "## JOURNAL FILE"
|
|
220
|
-
local journal_file=$(get_active_journal_file "$repo_root")
|
|
221
|
-
if [[ -n "$journal_file" ]]; then
|
|
222
|
-
local lines=$(count_lines "$journal_file")
|
|
223
|
-
local relative="$DIR_WORKFLOW/$DIR_WORKSPACE/$developer/$(basename "$journal_file")"
|
|
224
|
-
echo "Active file: $relative"
|
|
225
|
-
echo "Line count: $lines / 2000"
|
|
226
|
-
if [[ "$lines" -gt 1800 ]]; then
|
|
227
|
-
echo "[!] WARNING: Approaching 2000 line limit!"
|
|
228
|
-
fi
|
|
229
|
-
else
|
|
230
|
-
echo "No journal file found"
|
|
231
|
-
fi
|
|
232
|
-
echo ""
|
|
233
|
-
|
|
234
|
-
echo "## PATHS"
|
|
235
|
-
echo "Workspace: $DIR_WORKFLOW/$DIR_WORKSPACE/$developer/"
|
|
236
|
-
echo "Tasks: $DIR_WORKFLOW/$DIR_TASKS/"
|
|
237
|
-
echo "Spec: $DIR_WORKFLOW/$DIR_SPEC/"
|
|
238
|
-
echo ""
|
|
239
|
-
|
|
240
|
-
echo "========================================"
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
# =============================================================================
|
|
244
|
-
# Main Entry
|
|
245
|
-
# =============================================================================
|
|
246
|
-
|
|
247
|
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
248
|
-
case "${1:-}" in
|
|
249
|
-
--json|-j)
|
|
250
|
-
output_json
|
|
251
|
-
;;
|
|
252
|
-
--help|-h)
|
|
253
|
-
echo "Get Session Context for AI Agent"
|
|
254
|
-
echo ""
|
|
255
|
-
echo "Usage:"
|
|
256
|
-
echo " $0 Output context in text format"
|
|
257
|
-
echo " $0 --json Output context in JSON format"
|
|
258
|
-
;;
|
|
259
|
-
*)
|
|
260
|
-
output_text
|
|
261
|
-
;;
|
|
262
|
-
esac
|
|
263
|
-
fi
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Common path utilities for Trellis workflow
|
|
3
|
-
#
|
|
4
|
-
# Usage: source this file in other scripts
|
|
5
|
-
# source "$(dirname "$0")/common/paths.sh"
|
|
6
|
-
#
|
|
7
|
-
# Provides:
|
|
8
|
-
# get_repo_root - Get repository root directory
|
|
9
|
-
# get_developer - Get developer name
|
|
10
|
-
# get_workspace_dir - Get developer workspace directory
|
|
11
|
-
# get_tasks_dir - Get tasks directory
|
|
12
|
-
# get_active_journal_file - Get current journal file
|
|
13
|
-
|
|
14
|
-
# =============================================================================
|
|
15
|
-
# Path Constants (change here to rename directories)
|
|
16
|
-
# =============================================================================
|
|
17
|
-
|
|
18
|
-
# Directory names
|
|
19
|
-
DIR_WORKFLOW=".trellis"
|
|
20
|
-
DIR_WORKSPACE="workspace"
|
|
21
|
-
DIR_TASKS="tasks"
|
|
22
|
-
DIR_ARCHIVE="archive"
|
|
23
|
-
DIR_SPEC="spec"
|
|
24
|
-
DIR_SCRIPTS="scripts"
|
|
25
|
-
|
|
26
|
-
# File names
|
|
27
|
-
FILE_DEVELOPER=".developer"
|
|
28
|
-
FILE_CURRENT_TASK=".current-task"
|
|
29
|
-
FILE_TASK_JSON="task.json"
|
|
30
|
-
FILE_JOURNAL_PREFIX="journal-"
|
|
31
|
-
|
|
32
|
-
# =============================================================================
|
|
33
|
-
# Repository Root
|
|
34
|
-
# =============================================================================
|
|
35
|
-
|
|
36
|
-
get_repo_root() {
|
|
37
|
-
# Find the nearest directory containing .trellis/ folder
|
|
38
|
-
# This handles nested git repos correctly (e.g., test project inside another repo)
|
|
39
|
-
local current="$PWD"
|
|
40
|
-
|
|
41
|
-
while [[ "$current" != "/" ]]; do
|
|
42
|
-
if [[ -d "$current/$DIR_WORKFLOW" ]]; then
|
|
43
|
-
echo "$current"
|
|
44
|
-
return
|
|
45
|
-
fi
|
|
46
|
-
current=$(dirname "$current")
|
|
47
|
-
done
|
|
48
|
-
|
|
49
|
-
# Fallback to current directory if no .trellis/ found
|
|
50
|
-
echo "$PWD"
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
# =============================================================================
|
|
54
|
-
# Developer
|
|
55
|
-
# =============================================================================
|
|
56
|
-
|
|
57
|
-
get_developer() {
|
|
58
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
59
|
-
local dev_file="$repo_root/$DIR_WORKFLOW/$FILE_DEVELOPER"
|
|
60
|
-
|
|
61
|
-
if [[ -f "$dev_file" ]]; then
|
|
62
|
-
grep "^name=" "$dev_file" 2>/dev/null | cut -d'=' -f2
|
|
63
|
-
fi
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
check_developer() {
|
|
67
|
-
local developer=$(get_developer "$1")
|
|
68
|
-
[[ -n "$developer" ]]
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
# =============================================================================
|
|
72
|
-
# Tasks Directory
|
|
73
|
-
# =============================================================================
|
|
74
|
-
|
|
75
|
-
get_tasks_dir() {
|
|
76
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
77
|
-
echo "$repo_root/$DIR_WORKFLOW/$DIR_TASKS"
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
# =============================================================================
|
|
81
|
-
# Workspace Directory
|
|
82
|
-
# =============================================================================
|
|
83
|
-
|
|
84
|
-
get_workspace_dir() {
|
|
85
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
86
|
-
local developer=$(get_developer "$repo_root")
|
|
87
|
-
|
|
88
|
-
if [[ -n "$developer" ]]; then
|
|
89
|
-
echo "$repo_root/$DIR_WORKFLOW/$DIR_WORKSPACE/$developer"
|
|
90
|
-
fi
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
# =============================================================================
|
|
94
|
-
# Journal File
|
|
95
|
-
# =============================================================================
|
|
96
|
-
|
|
97
|
-
get_active_journal_file() {
|
|
98
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
99
|
-
local workspace_dir=$(get_workspace_dir "$repo_root")
|
|
100
|
-
|
|
101
|
-
if [[ -z "$workspace_dir" ]] || [[ ! -d "$workspace_dir" ]]; then
|
|
102
|
-
echo ""
|
|
103
|
-
return
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
local latest=""
|
|
107
|
-
local highest=0
|
|
108
|
-
for f in "$workspace_dir"/${FILE_JOURNAL_PREFIX}*.md; do
|
|
109
|
-
if [[ -f "$f" ]]; then
|
|
110
|
-
local num=$(basename "$f" | sed "s/${FILE_JOURNAL_PREFIX}//" | sed 's/\.md//')
|
|
111
|
-
if [[ "$num" =~ ^[0-9]+$ ]] && [[ "$num" -gt "$highest" ]]; then
|
|
112
|
-
highest=$num
|
|
113
|
-
latest="$f"
|
|
114
|
-
fi
|
|
115
|
-
fi
|
|
116
|
-
done
|
|
117
|
-
|
|
118
|
-
if [[ -n "$latest" ]]; then
|
|
119
|
-
echo "$latest"
|
|
120
|
-
fi
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
count_lines() {
|
|
124
|
-
local file="$1"
|
|
125
|
-
if [[ -f "$file" ]]; then
|
|
126
|
-
wc -l < "$file" | tr -d ' '
|
|
127
|
-
else
|
|
128
|
-
echo "0"
|
|
129
|
-
fi
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
# =============================================================================
|
|
133
|
-
# Current Task Management
|
|
134
|
-
# =============================================================================
|
|
135
|
-
|
|
136
|
-
# Get .current-task file path
|
|
137
|
-
_get_current_task_file() {
|
|
138
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
139
|
-
echo "$repo_root/$DIR_WORKFLOW/$FILE_CURRENT_TASK"
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
# Get current task directory path (relative to repo_root)
|
|
143
|
-
get_current_task() {
|
|
144
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
145
|
-
local current_file=$(_get_current_task_file "$repo_root")
|
|
146
|
-
|
|
147
|
-
if [[ -f "$current_file" ]]; then
|
|
148
|
-
cat "$current_file" 2>/dev/null
|
|
149
|
-
fi
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
# Get current task directory absolute path
|
|
153
|
-
get_current_task_abs() {
|
|
154
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
155
|
-
local relative=$(get_current_task "$repo_root")
|
|
156
|
-
|
|
157
|
-
if [[ -n "$relative" ]]; then
|
|
158
|
-
echo "$repo_root/$relative"
|
|
159
|
-
fi
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
# Set current task
|
|
163
|
-
# Args: $1 - task directory path (relative to repo_root)
|
|
164
|
-
set_current_task() {
|
|
165
|
-
local task_path="$1"
|
|
166
|
-
local repo_root="${2:-$(get_repo_root)}"
|
|
167
|
-
local current_file=$(_get_current_task_file "$repo_root")
|
|
168
|
-
|
|
169
|
-
if [[ -z "$task_path" ]]; then
|
|
170
|
-
echo "Error: task path is required" >&2
|
|
171
|
-
return 1
|
|
172
|
-
fi
|
|
173
|
-
|
|
174
|
-
# Verify task directory exists
|
|
175
|
-
local full_path="$repo_root/$task_path"
|
|
176
|
-
if [[ ! -d "$full_path" ]]; then
|
|
177
|
-
echo "Error: task directory not found: $task_path" >&2
|
|
178
|
-
return 1
|
|
179
|
-
fi
|
|
180
|
-
|
|
181
|
-
echo "$task_path" > "$current_file"
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
# Clear current task
|
|
185
|
-
clear_current_task() {
|
|
186
|
-
local repo_root="${1:-$(get_repo_root)}"
|
|
187
|
-
local current_file=$(_get_current_task_file "$repo_root")
|
|
188
|
-
|
|
189
|
-
if [[ -f "$current_file" ]]; then
|
|
190
|
-
rm -f "$current_file"
|
|
191
|
-
fi
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
# Check if has current task
|
|
195
|
-
has_current_task() {
|
|
196
|
-
local current=$(get_current_task "$1")
|
|
197
|
-
[[ -n "$current" ]]
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
# =============================================================================
|
|
201
|
-
# Task ID Generation
|
|
202
|
-
# =============================================================================
|
|
203
|
-
|
|
204
|
-
# Generate task ID based on date (MM-DD format)
|
|
205
|
-
# Returns: MM-DD (e.g., "01-21")
|
|
206
|
-
generate_task_date_prefix() {
|
|
207
|
-
date +%m-%d
|
|
208
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# =============================================================================
|
|
3
|
-
# Phase Management Utilities
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# Centralized phase tracking for multi-agent pipeline
|
|
6
|
-
#
|
|
7
|
-
# Usage:
|
|
8
|
-
# source common/phase.sh
|
|
9
|
-
#
|
|
10
|
-
# get_current_phase "$task_json" # Returns current phase number
|
|
11
|
-
# get_total_phases "$task_json" # Returns total phase count
|
|
12
|
-
# get_phase_action "$task_json" "$phase" # Returns action name for phase
|
|
13
|
-
# get_phase_info "$task_json" # Returns "N/M (action)" format
|
|
14
|
-
# set_phase "$task_json" "$phase" # Sets current_phase
|
|
15
|
-
# advance_phase "$task_json" # Advances to next phase
|
|
16
|
-
# get_phase_for_action "$task_json" "$action" # Returns phase number for action
|
|
17
|
-
# =============================================================================
|
|
18
|
-
|
|
19
|
-
# Get current phase number
|
|
20
|
-
get_current_phase() {
|
|
21
|
-
local task_json="$1"
|
|
22
|
-
if [ ! -f "$task_json" ]; then
|
|
23
|
-
echo "0"
|
|
24
|
-
return
|
|
25
|
-
fi
|
|
26
|
-
jq -r '.current_phase // 0' "$task_json"
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
# Get total number of phases
|
|
30
|
-
get_total_phases() {
|
|
31
|
-
local task_json="$1"
|
|
32
|
-
if [ ! -f "$task_json" ]; then
|
|
33
|
-
echo "0"
|
|
34
|
-
return
|
|
35
|
-
fi
|
|
36
|
-
jq -r '.next_action | length // 0' "$task_json"
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
# Get action name for a specific phase
|
|
40
|
-
get_phase_action() {
|
|
41
|
-
local task_json="$1"
|
|
42
|
-
local phase="$2"
|
|
43
|
-
if [ ! -f "$task_json" ]; then
|
|
44
|
-
echo "unknown"
|
|
45
|
-
return
|
|
46
|
-
fi
|
|
47
|
-
jq -r --argjson phase "$phase" '.next_action[] | select(.phase == $phase) | .action // "unknown"' "$task_json"
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
# Get formatted phase info: "N/M (action)"
|
|
51
|
-
get_phase_info() {
|
|
52
|
-
local task_json="$1"
|
|
53
|
-
if [ ! -f "$task_json" ]; then
|
|
54
|
-
echo "N/A"
|
|
55
|
-
return
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
local current_phase=$(get_current_phase "$task_json")
|
|
59
|
-
local total_phases=$(get_total_phases "$task_json")
|
|
60
|
-
local action_name=$(get_phase_action "$task_json" "$current_phase")
|
|
61
|
-
|
|
62
|
-
if [ "$current_phase" = "0" ] || [ "$current_phase" = "null" ]; then
|
|
63
|
-
echo "0/${total_phases} (pending)"
|
|
64
|
-
else
|
|
65
|
-
echo "${current_phase}/${total_phases} (${action_name})"
|
|
66
|
-
fi
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
# Set current phase to a specific value
|
|
70
|
-
set_phase() {
|
|
71
|
-
local task_json="$1"
|
|
72
|
-
local phase="$2"
|
|
73
|
-
|
|
74
|
-
if [ ! -f "$task_json" ]; then
|
|
75
|
-
echo "Error: task.json not found: $task_json" >&2
|
|
76
|
-
return 1
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
jq --argjson phase "$phase" '.current_phase = $phase' "$task_json" > "${task_json}.tmp"
|
|
80
|
-
mv "${task_json}.tmp" "$task_json"
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
# Advance to next phase
|
|
84
|
-
advance_phase() {
|
|
85
|
-
local task_json="$1"
|
|
86
|
-
|
|
87
|
-
if [ ! -f "$task_json" ]; then
|
|
88
|
-
echo "Error: task.json not found: $task_json" >&2
|
|
89
|
-
return 1
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
local current=$(get_current_phase "$task_json")
|
|
93
|
-
local total=$(get_total_phases "$task_json")
|
|
94
|
-
local next=$((current + 1))
|
|
95
|
-
|
|
96
|
-
if [ "$next" -gt "$total" ]; then
|
|
97
|
-
echo "Warning: Already at final phase" >&2
|
|
98
|
-
return 0
|
|
99
|
-
fi
|
|
100
|
-
|
|
101
|
-
set_phase "$task_json" "$next"
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
# Get phase number for a specific action name
|
|
105
|
-
get_phase_for_action() {
|
|
106
|
-
local task_json="$1"
|
|
107
|
-
local action="$2"
|
|
108
|
-
|
|
109
|
-
if [ ! -f "$task_json" ]; then
|
|
110
|
-
echo "0"
|
|
111
|
-
return
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
jq -r --arg action "$action" '.next_action[] | select(.action == $action) | .phase // 0' "$task_json"
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
# Map subagent type to action name
|
|
118
|
-
# Used by hooks to determine which action a subagent corresponds to
|
|
119
|
-
map_subagent_to_action() {
|
|
120
|
-
local subagent_type="$1"
|
|
121
|
-
|
|
122
|
-
case "$subagent_type" in
|
|
123
|
-
implement) echo "implement" ;;
|
|
124
|
-
check) echo "check" ;;
|
|
125
|
-
debug) echo "debug" ;;
|
|
126
|
-
research) echo "research" ;;
|
|
127
|
-
# finish uses check agent but is a different action
|
|
128
|
-
*) echo "$subagent_type" ;;
|
|
129
|
-
esac
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
# Check if a phase is completed (current_phase > phase)
|
|
133
|
-
is_phase_completed() {
|
|
134
|
-
local task_json="$1"
|
|
135
|
-
local phase="$2"
|
|
136
|
-
|
|
137
|
-
local current=$(get_current_phase "$task_json")
|
|
138
|
-
[ "$current" -gt "$phase" ]
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
# Check if we're at a specific action
|
|
142
|
-
is_current_action() {
|
|
143
|
-
local task_json="$1"
|
|
144
|
-
local action="$2"
|
|
145
|
-
|
|
146
|
-
local current=$(get_current_phase "$task_json")
|
|
147
|
-
local action_phase=$(get_phase_for_action "$task_json" "$action")
|
|
148
|
-
|
|
149
|
-
[ "$current" = "$action_phase" ]
|
|
150
|
-
}
|