@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.
Files changed (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/bin/aim.js +3 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +89 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/commands/init.d.ts +13 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +513 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/update.d.ts +27 -0
  13. package/dist/commands/update.d.ts.map +1 -0
  14. package/dist/commands/update.js +1275 -0
  15. package/dist/commands/update.js.map +1 -0
  16. package/dist/configurators/claude.d.ts +32 -0
  17. package/dist/configurators/claude.d.ts.map +1 -0
  18. package/dist/configurators/claude.js +98 -0
  19. package/dist/configurators/claude.js.map +1 -0
  20. package/dist/configurators/index.d.ts +51 -0
  21. package/dist/configurators/index.d.ts.map +1 -0
  22. package/dist/configurators/index.js +113 -0
  23. package/dist/configurators/index.js.map +1 -0
  24. package/dist/configurators/shared.d.ts +12 -0
  25. package/dist/configurators/shared.d.ts.map +1 -0
  26. package/dist/configurators/shared.js +21 -0
  27. package/dist/configurators/shared.js.map +1 -0
  28. package/dist/configurators/workflow.d.ts +28 -0
  29. package/dist/configurators/workflow.d.ts.map +1 -0
  30. package/dist/configurators/workflow.js +147 -0
  31. package/dist/configurators/workflow.js.map +1 -0
  32. package/dist/constants/paths.d.ts +68 -0
  33. package/dist/constants/paths.d.ts.map +1 -0
  34. package/dist/constants/paths.js +77 -0
  35. package/dist/constants/paths.js.map +1 -0
  36. package/dist/constants/version.d.ts +9 -0
  37. package/dist/constants/version.d.ts.map +1 -0
  38. package/dist/constants/version.js +15 -0
  39. package/dist/constants/version.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +9 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/migrations/index.d.ts +54 -0
  45. package/dist/migrations/index.d.ts.map +1 -0
  46. package/dist/migrations/index.js +160 -0
  47. package/dist/migrations/index.js.map +1 -0
  48. package/dist/migrations/manifests/0.0.1.json +9 -0
  49. package/dist/migrations/manifests/0.1.9.json +30 -0
  50. package/dist/migrations/manifests/0.2.0.json +49 -0
  51. package/dist/migrations/manifests/0.2.12.json +9 -0
  52. package/dist/migrations/manifests/0.2.13.json +9 -0
  53. package/dist/migrations/manifests/0.2.14.json +175 -0
  54. package/dist/migrations/manifests/0.2.15.json +33 -0
  55. package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
  56. package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
  57. package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
  58. package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
  59. package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
  60. package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
  61. package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
  62. package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
  63. package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
  64. package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
  65. package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
  66. package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
  67. package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
  68. package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
  69. package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
  70. package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
  71. package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
  72. package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
  73. package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
  74. package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
  75. package/dist/templates/CLAUDE.md +71 -0
  76. package/dist/templates/aim/gitignore.txt +29 -0
  77. package/dist/templates/aim/index.d.ts +49 -0
  78. package/dist/templates/aim/index.d.ts.map +1 -0
  79. package/dist/templates/aim/index.js +92 -0
  80. package/dist/templates/aim/index.js.map +1 -0
  81. package/dist/templates/aim/scripts/__init__.py +5 -0
  82. package/dist/templates/aim/scripts/add_session.py +392 -0
  83. package/dist/templates/aim/scripts/common/__init__.py +80 -0
  84. package/dist/templates/aim/scripts/common/cli_adapter.py +435 -0
  85. package/dist/templates/aim/scripts/common/developer.py +190 -0
  86. package/dist/templates/aim/scripts/common/git_context.py +383 -0
  87. package/dist/templates/aim/scripts/common/paths.py +347 -0
  88. package/dist/templates/aim/scripts/common/phase.py +253 -0
  89. package/dist/templates/aim/scripts/common/registry.py +366 -0
  90. package/dist/templates/aim/scripts/common/task_queue.py +255 -0
  91. package/dist/templates/aim/scripts/common/task_utils.py +178 -0
  92. package/dist/templates/aim/scripts/common/worktree.py +219 -0
  93. package/dist/templates/aim/scripts/create_bootstrap.py +290 -0
  94. package/dist/templates/aim/scripts/get_context.py +16 -0
  95. package/dist/templates/aim/scripts/get_developer.py +26 -0
  96. package/dist/templates/aim/scripts/init_developer.py +51 -0
  97. package/dist/templates/aim/scripts/multi_agent/__init__.py +5 -0
  98. package/dist/templates/aim/scripts/multi_agent/cleanup.py +403 -0
  99. package/dist/templates/aim/scripts/multi_agent/create_pr.py +329 -0
  100. package/dist/templates/aim/scripts/multi_agent/plan.py +233 -0
  101. package/dist/templates/aim/scripts/multi_agent/start.py +461 -0
  102. package/dist/templates/aim/scripts/multi_agent/status.py +817 -0
  103. package/dist/templates/aim/scripts/task.py +1068 -0
  104. package/dist/templates/aim/scripts-shell-archive/add-session.sh +384 -0
  105. package/dist/templates/aim/scripts-shell-archive/common/developer.sh +129 -0
  106. package/dist/templates/aim/scripts-shell-archive/common/git-context.sh +263 -0
  107. package/dist/templates/aim/scripts-shell-archive/common/paths.sh +208 -0
  108. package/dist/templates/aim/scripts-shell-archive/common/phase.sh +150 -0
  109. package/dist/templates/aim/scripts-shell-archive/common/registry.sh +247 -0
  110. package/dist/templates/aim/scripts-shell-archive/common/task-queue.sh +142 -0
  111. package/dist/templates/aim/scripts-shell-archive/common/task-utils.sh +151 -0
  112. package/dist/templates/aim/scripts-shell-archive/common/worktree.sh +128 -0
  113. package/dist/templates/aim/scripts-shell-archive/create-bootstrap.sh +299 -0
  114. package/dist/templates/aim/scripts-shell-archive/get-context.sh +7 -0
  115. package/dist/templates/aim/scripts-shell-archive/get-developer.sh +15 -0
  116. package/dist/templates/aim/scripts-shell-archive/init-developer.sh +34 -0
  117. package/dist/templates/aim/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
  118. package/dist/templates/aim/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
  119. package/dist/templates/aim/scripts-shell-archive/multi-agent/plan.sh +207 -0
  120. package/dist/templates/aim/scripts-shell-archive/multi-agent/start.sh +317 -0
  121. package/dist/templates/aim/scripts-shell-archive/multi-agent/status.sh +828 -0
  122. package/dist/templates/aim/scripts-shell-archive/task.sh +1204 -0
  123. package/dist/templates/aim/tasks/.gitkeep +0 -0
  124. package/dist/templates/aim/workflow.md +258 -0
  125. package/dist/templates/aim/worktree.yaml +47 -0
  126. package/dist/templates/claude/agents/check.md +122 -0
  127. package/dist/templates/claude/agents/debug.md +106 -0
  128. package/dist/templates/claude/agents/dispatch.md +230 -0
  129. package/dist/templates/claude/agents/implement.md +96 -0
  130. package/dist/templates/claude/agents/plan.md +396 -0
  131. package/dist/templates/claude/agents/research.md +120 -0
  132. package/dist/templates/claude/agents/story.md +53 -0
  133. package/dist/templates/claude/commands/aim/before-backend-dev.md +13 -0
  134. package/dist/templates/claude/commands/aim/before-frontend-dev.md +13 -0
  135. package/dist/templates/claude/commands/aim/break-loop.md +153 -0
  136. package/dist/templates/claude/commands/aim/check-backend.md +13 -0
  137. package/dist/templates/claude/commands/aim/check-cross-layer.md +153 -0
  138. package/dist/templates/claude/commands/aim/check-frontend.md +13 -0
  139. package/dist/templates/claude/commands/aim/check-story.md +59 -0
  140. package/dist/templates/claude/commands/aim/create-command.md +154 -0
  141. package/dist/templates/claude/commands/aim/export.md +187 -0
  142. package/dist/templates/claude/commands/aim/finish-work.md +104 -0
  143. package/dist/templates/claude/commands/aim/integrate-skill.md +219 -0
  144. package/dist/templates/claude/commands/aim/onboard.md +358 -0
  145. package/dist/templates/claude/commands/aim/parallel.md +217 -0
  146. package/dist/templates/claude/commands/aim/portrait.md +170 -0
  147. package/dist/templates/claude/commands/aim/record-session.md +92 -0
  148. package/dist/templates/claude/commands/aim/start.md +112 -0
  149. package/dist/templates/claude/commands/aim/story.md +140 -0
  150. package/dist/templates/claude/commands/aim/update-spec.md +285 -0
  151. package/dist/templates/claude/commands/aim/visualize.md +182 -0
  152. package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
  153. package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
  154. package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
  155. package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
  156. package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
  157. package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
  158. package/dist/templates/claude/commands/trellis/create-command.md +154 -0
  159. package/dist/templates/claude/commands/trellis/finish-work.md +129 -0
  160. package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
  161. package/dist/templates/claude/commands/trellis/onboard.md +358 -0
  162. package/dist/templates/claude/commands/trellis/parallel.md +193 -0
  163. package/dist/templates/claude/commands/trellis/record-session.md +62 -0
  164. package/dist/templates/claude/commands/trellis/start.md +280 -0
  165. package/dist/templates/claude/commands/trellis/update-spec.md +285 -0
  166. package/dist/templates/claude/hooks/inject-subagent-context.py +772 -0
  167. package/dist/templates/claude/hooks/ralph-loop.py +388 -0
  168. package/dist/templates/claude/hooks/session-start.py +142 -0
  169. package/dist/templates/claude/index.d.ts +54 -0
  170. package/dist/templates/claude/index.d.ts.map +1 -0
  171. package/dist/templates/claude/index.js +85 -0
  172. package/dist/templates/claude/index.js.map +1 -0
  173. package/dist/templates/claude/settings.json +41 -0
  174. package/dist/templates/extract.d.ts +68 -0
  175. package/dist/templates/extract.d.ts.map +1 -0
  176. package/dist/templates/extract.js +128 -0
  177. package/dist/templates/extract.js.map +1 -0
  178. package/dist/templates/markdown/agents.md +25 -0
  179. package/dist/templates/markdown/gitignore.txt +12 -0
  180. package/dist/templates/markdown/index.d.ts +32 -0
  181. package/dist/templates/markdown/index.d.ts.map +1 -0
  182. package/dist/templates/markdown/index.js +58 -0
  183. package/dist/templates/markdown/index.js.map +1 -0
  184. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  185. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  186. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  187. package/dist/templates/markdown/spec/backend/index.md +40 -0
  188. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  189. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  190. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  191. package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
  192. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  193. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  194. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  195. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  196. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  197. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  198. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  199. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
  200. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
  201. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
  202. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
  203. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
  204. package/dist/templates/markdown/spec/guides/index.md.txt +89 -0
  205. package/dist/templates/markdown/spec/story/character.md.txt +95 -0
  206. package/dist/templates/markdown/spec/story/index.md.txt +31 -0
  207. package/dist/templates/markdown/spec/story/script.md.txt +313 -0
  208. package/dist/templates/markdown/spec/story/world.md.txt +92 -0
  209. package/dist/templates/markdown/workspace-index.md +123 -0
  210. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  211. package/dist/templates/trellis/gitignore.txt +29 -0
  212. package/dist/templates/trellis/index.d.ts +49 -0
  213. package/dist/templates/trellis/index.d.ts.map +1 -0
  214. package/dist/templates/trellis/index.js +92 -0
  215. package/dist/templates/trellis/index.js.map +1 -0
  216. package/dist/templates/trellis/scripts/__init__.py +5 -0
  217. package/dist/templates/trellis/scripts/add_session.py +392 -0
  218. package/dist/templates/trellis/scripts/common/__init__.py +80 -0
  219. package/dist/templates/trellis/scripts/common/cli_adapter.py +435 -0
  220. package/dist/templates/trellis/scripts/common/developer.py +190 -0
  221. package/dist/templates/trellis/scripts/common/git_context.py +383 -0
  222. package/dist/templates/trellis/scripts/common/paths.py +347 -0
  223. package/dist/templates/trellis/scripts/common/phase.py +253 -0
  224. package/dist/templates/trellis/scripts/common/registry.py +366 -0
  225. package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
  226. package/dist/templates/trellis/scripts/common/task_utils.py +178 -0
  227. package/dist/templates/trellis/scripts/common/worktree.py +219 -0
  228. package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
  229. package/dist/templates/trellis/scripts/get_context.py +16 -0
  230. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  231. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  232. package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
  233. package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
  234. package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
  235. package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
  236. package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
  237. package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
  238. package/dist/templates/trellis/scripts/task.py +1056 -0
  239. package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
  240. package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
  241. package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
  242. package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
  243. package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
  244. package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
  245. package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
  246. package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
  247. package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
  248. package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
  249. package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
  250. package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
  251. package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
  252. package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
  253. package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
  254. package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
  255. package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
  256. package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
  257. package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
  258. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  259. package/dist/templates/trellis/workflow.md +416 -0
  260. package/dist/templates/trellis/worktree.yaml +47 -0
  261. package/dist/types/ai-tools.d.ts +48 -0
  262. package/dist/types/ai-tools.d.ts.map +1 -0
  263. package/dist/types/ai-tools.js +32 -0
  264. package/dist/types/ai-tools.js.map +1 -0
  265. package/dist/types/migration.d.ts +86 -0
  266. package/dist/types/migration.d.ts.map +1 -0
  267. package/dist/types/migration.js +8 -0
  268. package/dist/types/migration.js.map +1 -0
  269. package/dist/utils/compare-versions.d.ts +12 -0
  270. package/dist/utils/compare-versions.d.ts.map +1 -0
  271. package/dist/utils/compare-versions.js +76 -0
  272. package/dist/utils/compare-versions.js.map +1 -0
  273. package/dist/utils/file-writer.d.ts +23 -0
  274. package/dist/utils/file-writer.d.ts.map +1 -0
  275. package/dist/utils/file-writer.js +140 -0
  276. package/dist/utils/file-writer.js.map +1 -0
  277. package/dist/utils/project-detector.d.ts +16 -0
  278. package/dist/utils/project-detector.d.ts.map +1 -0
  279. package/dist/utils/project-detector.js +188 -0
  280. package/dist/utils/project-detector.js.map +1 -0
  281. package/dist/utils/template-fetcher.d.ts +51 -0
  282. package/dist/utils/template-fetcher.d.ts.map +1 -0
  283. package/dist/utils/template-fetcher.js +174 -0
  284. package/dist/utils/template-fetcher.js.map +1 -0
  285. package/dist/utils/template-hash.d.ts +78 -0
  286. package/dist/utils/template-hash.d.ts.map +1 -0
  287. package/dist/utils/template-hash.js +239 -0
  288. package/dist/utils/template-hash.js.map +1 -0
  289. 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
+ }