@fifine/aim-studio 0.0.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 +159 -0
- package/bin/aim.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +513 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1275 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/configurators/claude.d.ts +32 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +98 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/index.d.ts +51 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +113 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/shared.d.ts +12 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +21 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/workflow.d.ts +28 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +147 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +68 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +77 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +54 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +160 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.0.1.json +9 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/templates/CLAUDE.md +71 -0
- package/dist/templates/aim/gitignore.txt +29 -0
- package/dist/templates/aim/index.d.ts +49 -0
- package/dist/templates/aim/index.d.ts.map +1 -0
- package/dist/templates/aim/index.js +92 -0
- package/dist/templates/aim/index.js.map +1 -0
- package/dist/templates/aim/scripts/__init__.py +5 -0
- package/dist/templates/aim/scripts/add_session.py +392 -0
- package/dist/templates/aim/scripts/common/__init__.py +80 -0
- package/dist/templates/aim/scripts/common/cli_adapter.py +435 -0
- package/dist/templates/aim/scripts/common/developer.py +190 -0
- package/dist/templates/aim/scripts/common/git_context.py +383 -0
- package/dist/templates/aim/scripts/common/paths.py +347 -0
- package/dist/templates/aim/scripts/common/phase.py +253 -0
- package/dist/templates/aim/scripts/common/registry.py +366 -0
- package/dist/templates/aim/scripts/common/task_queue.py +255 -0
- package/dist/templates/aim/scripts/common/task_utils.py +178 -0
- package/dist/templates/aim/scripts/common/worktree.py +219 -0
- package/dist/templates/aim/scripts/create_bootstrap.py +290 -0
- package/dist/templates/aim/scripts/get_context.py +16 -0
- package/dist/templates/aim/scripts/get_developer.py +26 -0
- package/dist/templates/aim/scripts/init_developer.py +51 -0
- package/dist/templates/aim/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/aim/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/aim/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/aim/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/aim/scripts/multi_agent/start.py +461 -0
- package/dist/templates/aim/scripts/multi_agent/status.py +817 -0
- package/dist/templates/aim/scripts/task.py +1068 -0
- package/dist/templates/aim/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/aim/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/aim/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/aim/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/aim/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/aim/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/aim/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/aim/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/aim/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/aim/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/aim/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/aim/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/aim/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/aim/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/aim/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/aim/tasks/.gitkeep +0 -0
- package/dist/templates/aim/workflow.md +258 -0
- package/dist/templates/aim/worktree.yaml +47 -0
- package/dist/templates/claude/agents/check.md +122 -0
- package/dist/templates/claude/agents/debug.md +106 -0
- package/dist/templates/claude/agents/dispatch.md +230 -0
- package/dist/templates/claude/agents/implement.md +96 -0
- package/dist/templates/claude/agents/plan.md +396 -0
- package/dist/templates/claude/agents/research.md +120 -0
- package/dist/templates/claude/agents/story.md +53 -0
- package/dist/templates/claude/commands/aim/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/aim/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/aim/break-loop.md +153 -0
- package/dist/templates/claude/commands/aim/check-backend.md +13 -0
- package/dist/templates/claude/commands/aim/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/aim/check-frontend.md +13 -0
- package/dist/templates/claude/commands/aim/check-story.md +59 -0
- package/dist/templates/claude/commands/aim/create-command.md +154 -0
- package/dist/templates/claude/commands/aim/export.md +187 -0
- package/dist/templates/claude/commands/aim/finish-work.md +104 -0
- package/dist/templates/claude/commands/aim/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/aim/onboard.md +358 -0
- package/dist/templates/claude/commands/aim/parallel.md +217 -0
- package/dist/templates/claude/commands/aim/portrait.md +170 -0
- package/dist/templates/claude/commands/aim/record-session.md +92 -0
- package/dist/templates/claude/commands/aim/start.md +112 -0
- package/dist/templates/claude/commands/aim/story.md +140 -0
- package/dist/templates/claude/commands/aim/update-spec.md +285 -0
- package/dist/templates/claude/commands/aim/visualize.md +182 -0
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
- package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/claude/commands/trellis/create-command.md +154 -0
- package/dist/templates/claude/commands/trellis/finish-work.md +129 -0
- package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/trellis/onboard.md +358 -0
- package/dist/templates/claude/commands/trellis/parallel.md +193 -0
- package/dist/templates/claude/commands/trellis/record-session.md +62 -0
- package/dist/templates/claude/commands/trellis/start.md +280 -0
- package/dist/templates/claude/commands/trellis/update-spec.md +285 -0
- package/dist/templates/claude/hooks/inject-subagent-context.py +772 -0
- package/dist/templates/claude/hooks/ralph-loop.py +388 -0
- package/dist/templates/claude/hooks/session-start.py +142 -0
- package/dist/templates/claude/index.d.ts +54 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +85 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +41 -0
- package/dist/templates/extract.d.ts +68 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +128 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/markdown/agents.md +25 -0
- package/dist/templates/markdown/gitignore.txt +12 -0
- package/dist/templates/markdown/index.d.ts +32 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +58 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md +40 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +89 -0
- package/dist/templates/markdown/spec/story/character.md.txt +95 -0
- package/dist/templates/markdown/spec/story/index.md.txt +31 -0
- package/dist/templates/markdown/spec/story/script.md.txt +313 -0
- package/dist/templates/markdown/spec/story/world.md.txt +92 -0
- package/dist/templates/markdown/workspace-index.md +123 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/trellis/gitignore.txt +29 -0
- package/dist/templates/trellis/index.d.ts +49 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +92 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +392 -0
- package/dist/templates/trellis/scripts/common/__init__.py +80 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +435 -0
- package/dist/templates/trellis/scripts/common/developer.py +190 -0
- package/dist/templates/trellis/scripts/common/git_context.py +383 -0
- package/dist/templates/trellis/scripts/common/paths.py +347 -0
- package/dist/templates/trellis/scripts/common/phase.py +253 -0
- package/dist/templates/trellis/scripts/common/registry.py +366 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +178 -0
- package/dist/templates/trellis/scripts/common/worktree.py +219 -0
- package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
- package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
- package/dist/templates/trellis/scripts/task.py +1056 -0
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +416 -0
- package/dist/templates/trellis/worktree.yaml +47 -0
- package/dist/types/ai-tools.d.ts +48 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +32 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +86 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +76 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/file-writer.d.ts +23 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +140 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/project-detector.d.ts +16 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +188 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +51 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +174 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +78 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +239 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,263 @@
|
|
|
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
|
|
@@ -0,0 +1,208 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
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
|
+
}
|