jfl 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +16 -0
  2. package/dist/commands/agent.d.ts +7 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/agent.js +170 -0
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/context-hub.d.ts.map +1 -1
  7. package/dist/commands/context-hub.js +274 -27
  8. package/dist/commands/context-hub.js.map +1 -1
  9. package/dist/commands/digest.d.ts.map +1 -1
  10. package/dist/commands/digest.js +45 -0
  11. package/dist/commands/digest.js.map +1 -1
  12. package/dist/commands/doctor.d.ts +7 -0
  13. package/dist/commands/doctor.d.ts.map +1 -0
  14. package/dist/commands/doctor.js +236 -0
  15. package/dist/commands/doctor.js.map +1 -0
  16. package/dist/commands/eval.d.ts +6 -0
  17. package/dist/commands/eval.d.ts.map +1 -0
  18. package/dist/commands/eval.js +236 -0
  19. package/dist/commands/eval.js.map +1 -0
  20. package/dist/commands/hooks.d.ts +2 -0
  21. package/dist/commands/hooks.d.ts.map +1 -1
  22. package/dist/commands/hooks.js +1 -0
  23. package/dist/commands/hooks.js.map +1 -1
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +230 -145
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/portfolio.d.ts +6 -0
  28. package/dist/commands/portfolio.d.ts.map +1 -0
  29. package/dist/commands/portfolio.js +296 -0
  30. package/dist/commands/portfolio.js.map +1 -0
  31. package/dist/commands/scope.d.ts +1 -0
  32. package/dist/commands/scope.d.ts.map +1 -1
  33. package/dist/commands/scope.js +189 -2
  34. package/dist/commands/scope.js.map +1 -1
  35. package/dist/commands/update.d.ts.map +1 -1
  36. package/dist/commands/update.js +6 -0
  37. package/dist/commands/update.js.map +1 -1
  38. package/dist/commands/voice.js.map +1 -1
  39. package/dist/dashboard/components.d.ts +1 -1
  40. package/dist/dashboard/components.d.ts.map +1 -1
  41. package/dist/dashboard/components.js +418 -6
  42. package/dist/dashboard/components.js.map +1 -1
  43. package/dist/dashboard/index.d.ts.map +1 -1
  44. package/dist/dashboard/index.js +32 -5
  45. package/dist/dashboard/index.js.map +1 -1
  46. package/dist/dashboard/pages.d.ts +1 -1
  47. package/dist/dashboard/pages.d.ts.map +1 -1
  48. package/dist/dashboard/pages.js +961 -123
  49. package/dist/dashboard/pages.js.map +1 -1
  50. package/dist/dashboard/styles.d.ts +1 -1
  51. package/dist/dashboard/styles.d.ts.map +1 -1
  52. package/dist/dashboard/styles.js +701 -88
  53. package/dist/dashboard/styles.js.map +1 -1
  54. package/dist/index.js +88 -45
  55. package/dist/index.js.map +1 -1
  56. package/dist/lib/agent-manifest.d.ts +35 -0
  57. package/dist/lib/agent-manifest.d.ts.map +1 -0
  58. package/dist/lib/agent-manifest.js +75 -0
  59. package/dist/lib/agent-manifest.js.map +1 -0
  60. package/dist/lib/eval-store.d.ts +15 -0
  61. package/dist/lib/eval-store.d.ts.map +1 -0
  62. package/dist/lib/eval-store.js +179 -0
  63. package/dist/lib/eval-store.js.map +1 -0
  64. package/dist/lib/flow-engine.d.ts +12 -0
  65. package/dist/lib/flow-engine.d.ts.map +1 -1
  66. package/dist/lib/flow-engine.js +181 -4
  67. package/dist/lib/flow-engine.js.map +1 -1
  68. package/dist/lib/kuva.d.ts +45 -0
  69. package/dist/lib/kuva.d.ts.map +1 -0
  70. package/dist/lib/kuva.js +131 -0
  71. package/dist/lib/kuva.js.map +1 -0
  72. package/dist/lib/service-gtm.d.ts +10 -1
  73. package/dist/lib/service-gtm.d.ts.map +1 -1
  74. package/dist/lib/service-gtm.js +35 -2
  75. package/dist/lib/service-gtm.js.map +1 -1
  76. package/dist/lib/trajectory-loader.d.ts +82 -0
  77. package/dist/lib/trajectory-loader.d.ts.map +1 -0
  78. package/dist/lib/trajectory-loader.js +406 -0
  79. package/dist/lib/trajectory-loader.js.map +1 -0
  80. package/dist/mcp/context-hub-mcp.js +60 -0
  81. package/dist/mcp/context-hub-mcp.js.map +1 -1
  82. package/dist/types/eval.d.ts +18 -0
  83. package/dist/types/eval.d.ts.map +1 -0
  84. package/dist/types/eval.js +5 -0
  85. package/dist/types/eval.js.map +1 -0
  86. package/dist/types/flows.d.ts +7 -0
  87. package/dist/types/flows.d.ts.map +1 -1
  88. package/dist/types/journal.d.ts +133 -0
  89. package/dist/types/journal.d.ts.map +1 -0
  90. package/dist/types/journal.js +59 -0
  91. package/dist/types/journal.js.map +1 -0
  92. package/dist/types/map.d.ts +1 -1
  93. package/dist/types/map.d.ts.map +1 -1
  94. package/dist/types/map.js.map +1 -1
  95. package/dist/ui/service-dashboard.js.map +1 -1
  96. package/dist/utils/wallet.js.map +1 -1
  97. package/package.json +1 -1
  98. package/scripts/migrate-to-branch-sessions.sh +201 -0
  99. package/scripts/session/fix-tracked-logs.sh +97 -0
  100. package/scripts/session/session-cleanup.sh +28 -10
  101. package/scripts/session/session-end.sh +0 -10
  102. package/scripts/session/session-init.sh +0 -16
  103. package/template/THEORY.md +26 -0
  104. package/template/scripts/session/session-cleanup.sh +28 -10
  105. package/template/scripts/session/session-sync.sh +10 -0
@@ -155,12 +155,21 @@ if [ $MERGE_STATUS -eq 0 ]; then
155
155
  # Push to origin
156
156
  git push origin "$WORKING_BRANCH" 2>/dev/null || echo "⚠ Push failed - run manually: git push origin $WORKING_BRANCH"
157
157
 
158
- # Remove worktree if it exists
159
- WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | awk '{print $1}' | head -1)
158
+ # Remove worktree if it exists (NEVER remove the main repo)
159
+ MAIN_TOPLEVEL=$(git rev-parse --show-toplevel 2>/dev/null)
160
+ WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | grep -v "(bare)" | awk '{print $1}' | head -1)
160
161
  if [ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ]; then
161
- echo "Removing worktree at $WORKTREE_PATH..."
162
- rm -rf "$WORKTREE_PATH" 2>/dev/null || true
163
- git worktree prune 2>/dev/null || true
162
+ WORKTREE_REAL=$(cd "$WORKTREE_PATH" && pwd -P)
163
+ MAIN_REAL=$(cd "$MAIN_TOPLEVEL" && pwd -P)
164
+ if [ "$WORKTREE_REAL" = "$MAIN_REAL" ]; then
165
+ echo "⚠ SAFETY: refusing to rm -rf main repo at $WORKTREE_PATH"
166
+ elif [ "$WORKTREE_REAL" = "$HOME" ] || [ "$WORKTREE_REAL" = "/" ]; then
167
+ echo "⚠ SAFETY: refusing to rm -rf protected path $WORKTREE_PATH"
168
+ else
169
+ echo "Removing worktree at $WORKTREE_PATH..."
170
+ git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
171
+ git worktree prune 2>/dev/null || true
172
+ fi
164
173
  fi
165
174
 
166
175
  # Delete the branch
@@ -227,12 +236,21 @@ else
227
236
  # Push to origin
228
237
  git push origin "$WORKING_BRANCH" 2>/dev/null || echo "⚠ Push failed - run manually: git push origin $WORKING_BRANCH"
229
238
 
230
- # Remove worktree
231
- WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | awk '{print $1}' | head -1)
239
+ # Remove worktree if it exists (NEVER remove the main repo)
240
+ MAIN_TOPLEVEL=$(git rev-parse --show-toplevel 2>/dev/null)
241
+ WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | grep -v "(bare)" | awk '{print $1}' | head -1)
232
242
  if [ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ]; then
233
- echo "Removing worktree at $WORKTREE_PATH..."
234
- rm -rf "$WORKTREE_PATH" 2>/dev/null || true
235
- git worktree prune 2>/dev/null || true
243
+ WORKTREE_REAL=$(cd "$WORKTREE_PATH" && pwd -P)
244
+ MAIN_REAL=$(cd "$MAIN_TOPLEVEL" && pwd -P)
245
+ if [ "$WORKTREE_REAL" = "$MAIN_REAL" ]; then
246
+ echo "⚠ SAFETY: refusing to rm -rf main repo at $WORKTREE_PATH"
247
+ elif [ "$WORKTREE_REAL" = "$HOME" ] || [ "$WORKTREE_REAL" = "/" ]; then
248
+ echo "⚠ SAFETY: refusing to rm -rf protected path $WORKTREE_PATH"
249
+ else
250
+ echo "Removing worktree at $WORKTREE_PATH..."
251
+ git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
252
+ git worktree prune 2>/dev/null || true
253
+ fi
236
254
  fi
237
255
 
238
256
  # Delete the branch
@@ -20,8 +20,6 @@ YELLOW='\033[1;33m'
20
20
  BLUE='\033[0;34m'
21
21
  NC='\033[0m'
22
22
 
23
- END_START_TIME=$(date +%s)
24
-
25
23
  FORCE=false
26
24
  while [[ $# -gt 0 ]]; do
27
25
  case $1 in
@@ -190,14 +188,6 @@ else
190
188
  # Clean up session file
191
189
  rm -f "$SESSION_FILE"
192
190
 
193
- # Track session end telemetry (fire-and-forget)
194
- END_DURATION=$(( $(date +%s) - END_START_TIME ))
195
- jfl telemetry track \
196
- --category session \
197
- --event "hook:session_end" \
198
- --duration "${END_DURATION}000" \
199
- --success true 2>/dev/null &
200
-
201
191
  echo ""
202
192
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
203
193
  echo -e " ${GREEN}Session ended successfully!${NC}"
@@ -15,7 +15,6 @@ set -e
15
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  REPO_DIR="${JFL_REPO_DIR:-$(pwd)}"
17
17
  WORKTREES_DIR="$REPO_DIR/worktrees"
18
- INIT_START_TIME=$(date +%s)
19
18
 
20
19
  cd "$REPO_DIR" || exit 1
21
20
 
@@ -158,10 +157,6 @@ if [[ -d "$WORKTREES_DIR" ]]; then
158
157
  done
159
158
  echo ""
160
159
  echo -e "${GREEN}✓${NC} All changes saved. Continuing..."
161
- jfl telemetry track \
162
- --category session \
163
- --event "hook:crash_recovery" \
164
- --success true 2>/dev/null &
165
160
  ;;
166
161
  2)
167
162
  echo ""
@@ -353,14 +348,3 @@ if [[ "$use_worktree" != "true" ]]; then
353
348
  echo -e "${GREEN}✓${NC} Session ready on branch: $session_name"
354
349
  echo ""
355
350
  fi
356
-
357
- # ==============================================================================
358
- # Step 4: Track session init telemetry (fire-and-forget)
359
- # ==============================================================================
360
-
361
- INIT_DURATION=$(( $(date +%s) - INIT_START_TIME ))
362
- jfl telemetry track \
363
- --category session \
364
- --event "hook:session_init" \
365
- --duration "${INIT_DURATION}000" \
366
- --success true 2>/dev/null &
@@ -0,0 +1,26 @@
1
+ # Theory — {agent-name}
2
+
3
+ ## Current Hypothesis
4
+
5
+ {What do you believe is true about your approach? Why should it work? What's the core insight?}
6
+
7
+ ## Approach
8
+
9
+ {How are you executing on the hypothesis? What's the method?}
10
+
11
+ ## Predictions (specific, falsifiable)
12
+
13
+ | # | Prediction | Metric | Target | By |
14
+ |---|-----------|--------|--------|-----|
15
+ | P1 | {specific claim} | {metric name} | {threshold} | {version or date} |
16
+ | P2 | {specific claim} | {metric name} | {threshold} | {version or date} |
17
+
18
+ ## Evidence
19
+
20
+ | Date | Prediction | Actual | Delta | Verdict |
21
+ |------|-----------|--------|-------|---------|
22
+ | | | | | |
23
+
24
+ ## Revisions
25
+
26
+ {When evidence contradicts predictions, document what changed and why.}
@@ -155,12 +155,21 @@ if [ $MERGE_STATUS -eq 0 ]; then
155
155
  # Push to origin
156
156
  git push origin "$WORKING_BRANCH" 2>/dev/null || echo "⚠ Push failed - run manually: git push origin $WORKING_BRANCH"
157
157
 
158
- # Remove worktree if it exists
159
- WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | awk '{print $1}' | head -1)
158
+ # Remove worktree if it exists (NEVER remove the main repo)
159
+ MAIN_TOPLEVEL=$(git rev-parse --show-toplevel 2>/dev/null)
160
+ WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | grep -v "(bare)" | awk '{print $1}' | head -1)
160
161
  if [ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ]; then
161
- echo "Removing worktree at $WORKTREE_PATH..."
162
- rm -rf "$WORKTREE_PATH" 2>/dev/null || true
163
- git worktree prune 2>/dev/null || true
162
+ WORKTREE_REAL=$(cd "$WORKTREE_PATH" && pwd -P)
163
+ MAIN_REAL=$(cd "$MAIN_TOPLEVEL" && pwd -P)
164
+ if [ "$WORKTREE_REAL" = "$MAIN_REAL" ]; then
165
+ echo "⚠ SAFETY: refusing to rm -rf main repo at $WORKTREE_PATH"
166
+ elif [ "$WORKTREE_REAL" = "$HOME" ] || [ "$WORKTREE_REAL" = "/" ]; then
167
+ echo "⚠ SAFETY: refusing to rm -rf protected path $WORKTREE_PATH"
168
+ else
169
+ echo "Removing worktree at $WORKTREE_PATH..."
170
+ git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
171
+ git worktree prune 2>/dev/null || true
172
+ fi
164
173
  fi
165
174
 
166
175
  # Delete the branch
@@ -227,12 +236,21 @@ else
227
236
  # Push to origin
228
237
  git push origin "$WORKING_BRANCH" 2>/dev/null || echo "⚠ Push failed - run manually: git push origin $WORKING_BRANCH"
229
238
 
230
- # Remove worktree
231
- WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | awk '{print $1}' | head -1)
239
+ # Remove worktree if it exists (NEVER remove the main repo)
240
+ MAIN_TOPLEVEL=$(git rev-parse --show-toplevel 2>/dev/null)
241
+ WORKTREE_PATH=$(git worktree list | grep "$BRANCH" | grep -v "(bare)" | awk '{print $1}' | head -1)
232
242
  if [ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ]; then
233
- echo "Removing worktree at $WORKTREE_PATH..."
234
- rm -rf "$WORKTREE_PATH" 2>/dev/null || true
235
- git worktree prune 2>/dev/null || true
243
+ WORKTREE_REAL=$(cd "$WORKTREE_PATH" && pwd -P)
244
+ MAIN_REAL=$(cd "$MAIN_TOPLEVEL" && pwd -P)
245
+ if [ "$WORKTREE_REAL" = "$MAIN_REAL" ]; then
246
+ echo "⚠ SAFETY: refusing to rm -rf main repo at $WORKTREE_PATH"
247
+ elif [ "$WORKTREE_REAL" = "$HOME" ] || [ "$WORKTREE_REAL" = "/" ]; then
248
+ echo "⚠ SAFETY: refusing to rm -rf protected path $WORKTREE_PATH"
249
+ else
250
+ echo "Removing worktree at $WORKTREE_PATH..."
251
+ git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
252
+ git worktree prune 2>/dev/null || true
253
+ fi
236
254
  fi
237
255
 
238
256
  # Delete the branch
@@ -154,6 +154,16 @@ echo "--- Syncing submodules ---"
154
154
  cd "$GTM_ROOT"
155
155
  git submodule update --init --recursive 2>/dev/null || true
156
156
 
157
+ # Ensure jfl CLI and template files are up to date (at most once per 24h)
158
+ echo ""
159
+ echo "--- Checking jfl version ---"
160
+ cd "$GTM_ROOT"
161
+ if command -v jfl &>/dev/null; then
162
+ jfl update --auto 2>/dev/null && echo -e "${GREEN}jfl is up to date${NC}" || echo -e "${YELLOW}WARNING: jfl update check failed (offline?)${NC}"
163
+ else
164
+ echo -e "${YELLOW}WARNING: jfl not found in PATH${NC}"
165
+ fi
166
+
157
167
  # Final status
158
168
  echo ""
159
169
  echo "========================================"