wiggum-cli 0.1.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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/bin/ralph.js +8 -0
  4. package/dist/ai/enhancer.d.ts +100 -0
  5. package/dist/ai/enhancer.d.ts.map +1 -0
  6. package/dist/ai/enhancer.js +233 -0
  7. package/dist/ai/enhancer.js.map +1 -0
  8. package/dist/ai/index.d.ts +8 -0
  9. package/dist/ai/index.d.ts.map +1 -0
  10. package/dist/ai/index.js +11 -0
  11. package/dist/ai/index.js.map +1 -0
  12. package/dist/ai/prompts.d.ts +26 -0
  13. package/dist/ai/prompts.d.ts.map +1 -0
  14. package/dist/ai/prompts.js +201 -0
  15. package/dist/ai/prompts.js.map +1 -0
  16. package/dist/ai/providers.d.ts +35 -0
  17. package/dist/ai/providers.d.ts.map +1 -0
  18. package/dist/ai/providers.js +104 -0
  19. package/dist/ai/providers.js.map +1 -0
  20. package/dist/cli.d.ts +6 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +196 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands/init.d.ts +16 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +124 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/monitor.d.ts +17 -0
  29. package/dist/commands/monitor.d.ts.map +1 -0
  30. package/dist/commands/monitor.js +342 -0
  31. package/dist/commands/monitor.js.map +1 -0
  32. package/dist/commands/new.d.ts +19 -0
  33. package/dist/commands/new.d.ts.map +1 -0
  34. package/dist/commands/new.js +272 -0
  35. package/dist/commands/new.js.map +1 -0
  36. package/dist/commands/run.d.ts +16 -0
  37. package/dist/commands/run.d.ts.map +1 -0
  38. package/dist/commands/run.js +175 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/generator/config.d.ts +59 -0
  41. package/dist/generator/config.d.ts.map +1 -0
  42. package/dist/generator/config.js +68 -0
  43. package/dist/generator/config.js.map +1 -0
  44. package/dist/generator/index.d.ts +64 -0
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +147 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/templates.d.ts +70 -0
  49. package/dist/generator/templates.d.ts.map +1 -0
  50. package/dist/generator/templates.js +296 -0
  51. package/dist/generator/templates.js.map +1 -0
  52. package/dist/generator/writer.d.ts +93 -0
  53. package/dist/generator/writer.d.ts.map +1 -0
  54. package/dist/generator/writer.js +213 -0
  55. package/dist/generator/writer.js.map +1 -0
  56. package/dist/index.d.ts +12 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +17 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/scanner/detectors/core/framework.d.ts +11 -0
  61. package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
  62. package/dist/scanner/detectors/core/framework.js +275 -0
  63. package/dist/scanner/detectors/core/framework.js.map +1 -0
  64. package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
  65. package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
  66. package/dist/scanner/detectors/core/packageManager.js +74 -0
  67. package/dist/scanner/detectors/core/packageManager.js.map +1 -0
  68. package/dist/scanner/detectors/core/styling.d.ts +12 -0
  69. package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
  70. package/dist/scanner/detectors/core/styling.js +230 -0
  71. package/dist/scanner/detectors/core/styling.js.map +1 -0
  72. package/dist/scanner/detectors/core/testing.d.ts +12 -0
  73. package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
  74. package/dist/scanner/detectors/core/testing.js +190 -0
  75. package/dist/scanner/detectors/core/testing.js.map +1 -0
  76. package/dist/scanner/detectors/data/api.d.ts +12 -0
  77. package/dist/scanner/detectors/data/api.d.ts.map +1 -0
  78. package/dist/scanner/detectors/data/api.js +261 -0
  79. package/dist/scanner/detectors/data/api.js.map +1 -0
  80. package/dist/scanner/detectors/data/database.d.ts +12 -0
  81. package/dist/scanner/detectors/data/database.d.ts.map +1 -0
  82. package/dist/scanner/detectors/data/database.js +213 -0
  83. package/dist/scanner/detectors/data/database.js.map +1 -0
  84. package/dist/scanner/detectors/data/orm.d.ts +12 -0
  85. package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
  86. package/dist/scanner/detectors/data/orm.js +160 -0
  87. package/dist/scanner/detectors/data/orm.js.map +1 -0
  88. package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
  89. package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
  90. package/dist/scanner/detectors/frontend/formHandling.js +211 -0
  91. package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
  92. package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
  93. package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
  94. package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
  95. package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
  96. package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
  97. package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
  98. package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
  99. package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
  100. package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
  101. package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
  102. package/dist/scanner/detectors/infra/deployment.js +301 -0
  103. package/dist/scanner/detectors/infra/deployment.js.map +1 -0
  104. package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
  105. package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
  106. package/dist/scanner/detectors/infra/monorepo.js +219 -0
  107. package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
  108. package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
  109. package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
  110. package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
  111. package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
  112. package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
  113. package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
  114. package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
  115. package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
  116. package/dist/scanner/detectors/services/analytics.d.ts +12 -0
  117. package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
  118. package/dist/scanner/detectors/services/analytics.js +236 -0
  119. package/dist/scanner/detectors/services/analytics.js.map +1 -0
  120. package/dist/scanner/detectors/services/auth.d.ts +12 -0
  121. package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
  122. package/dist/scanner/detectors/services/auth.js +217 -0
  123. package/dist/scanner/detectors/services/auth.js.map +1 -0
  124. package/dist/scanner/detectors/services/email.d.ts +12 -0
  125. package/dist/scanner/detectors/services/email.d.ts.map +1 -0
  126. package/dist/scanner/detectors/services/email.js +211 -0
  127. package/dist/scanner/detectors/services/email.js.map +1 -0
  128. package/dist/scanner/detectors/services/payments.d.ts +12 -0
  129. package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
  130. package/dist/scanner/detectors/services/payments.js +185 -0
  131. package/dist/scanner/detectors/services/payments.js.map +1 -0
  132. package/dist/scanner/detectors/utils.d.ts +160 -0
  133. package/dist/scanner/detectors/utils.d.ts.map +1 -0
  134. package/dist/scanner/detectors/utils.js +222 -0
  135. package/dist/scanner/detectors/utils.js.map +1 -0
  136. package/dist/scanner/index.d.ts +42 -0
  137. package/dist/scanner/index.d.ts.map +1 -0
  138. package/dist/scanner/index.js +282 -0
  139. package/dist/scanner/index.js.map +1 -0
  140. package/dist/scanner/registry.d.ts +43 -0
  141. package/dist/scanner/registry.d.ts.map +1 -0
  142. package/dist/scanner/registry.js +243 -0
  143. package/dist/scanner/registry.js.map +1 -0
  144. package/dist/scanner/types.d.ts +112 -0
  145. package/dist/scanner/types.d.ts.map +1 -0
  146. package/dist/scanner/types.js +6 -0
  147. package/dist/scanner/types.js.map +1 -0
  148. package/dist/templates/config/ralph.config.js.tmpl +38 -0
  149. package/dist/templates/guides/AGENTS.md.tmpl +100 -0
  150. package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
  151. package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
  152. package/dist/templates/guides/SECURITY.md.tmpl +100 -0
  153. package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
  154. package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  155. package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  156. package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
  157. package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  158. package/dist/templates/root/.gitignore.tmpl +5 -0
  159. package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
  160. package/dist/templates/root/README.md.tmpl +61 -0
  161. package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
  162. package/dist/templates/scripts/loop.sh.tmpl +59 -0
  163. package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  164. package/dist/templates/specs/README.md.tmpl +57 -0
  165. package/dist/templates/specs/_example.md.tmpl +71 -0
  166. package/dist/utils/config.d.ts +95 -0
  167. package/dist/utils/config.d.ts.map +1 -0
  168. package/dist/utils/config.js +148 -0
  169. package/dist/utils/config.js.map +1 -0
  170. package/dist/utils/header.d.ts +5 -0
  171. package/dist/utils/header.d.ts.map +1 -0
  172. package/dist/utils/header.js +15 -0
  173. package/dist/utils/header.js.map +1 -0
  174. package/dist/utils/logger.d.ts +11 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +24 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +44 -0
  179. package/src/ai/enhancer.ts +350 -0
  180. package/src/ai/index.ts +38 -0
  181. package/src/ai/prompts.ts +217 -0
  182. package/src/ai/providers.ts +136 -0
  183. package/src/cli.ts +255 -0
  184. package/src/commands/init.ts +149 -0
  185. package/src/commands/monitor.ts +412 -0
  186. package/src/commands/new.ts +312 -0
  187. package/src/commands/run.ts +214 -0
  188. package/src/generator/config.ts +116 -0
  189. package/src/generator/index.ts +227 -0
  190. package/src/generator/templates.ts +412 -0
  191. package/src/generator/writer.ts +293 -0
  192. package/src/index.ts +41 -0
  193. package/src/scanner/detectors/core/framework.ts +332 -0
  194. package/src/scanner/detectors/core/packageManager.ts +91 -0
  195. package/src/scanner/detectors/core/styling.ts +261 -0
  196. package/src/scanner/detectors/core/testing.ts +221 -0
  197. package/src/scanner/detectors/data/api.ts +303 -0
  198. package/src/scanner/detectors/data/database.ts +245 -0
  199. package/src/scanner/detectors/data/orm.ts +180 -0
  200. package/src/scanner/detectors/frontend/formHandling.ts +244 -0
  201. package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
  202. package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
  203. package/src/scanner/detectors/infra/deployment.ts +343 -0
  204. package/src/scanner/detectors/infra/monorepo.ts +251 -0
  205. package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
  206. package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
  207. package/src/scanner/detectors/services/analytics.ts +273 -0
  208. package/src/scanner/detectors/services/auth.ts +254 -0
  209. package/src/scanner/detectors/services/email.ts +244 -0
  210. package/src/scanner/detectors/services/payments.ts +213 -0
  211. package/src/scanner/detectors/utils.ts +251 -0
  212. package/src/scanner/index.ts +354 -0
  213. package/src/scanner/registry.ts +301 -0
  214. package/src/scanner/types.ts +152 -0
  215. package/src/templates/config/ralph.config.js.tmpl +38 -0
  216. package/src/templates/guides/AGENTS.md.tmpl +100 -0
  217. package/src/templates/guides/FRONTEND.md.tmpl +523 -0
  218. package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
  219. package/src/templates/guides/SECURITY.md.tmpl +100 -0
  220. package/src/templates/prompts/PROMPT.md.tmpl +77 -0
  221. package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  222. package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  223. package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
  224. package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  225. package/src/templates/root/.gitignore.tmpl +5 -0
  226. package/src/templates/root/LEARNINGS.md.tmpl +24 -0
  227. package/src/templates/root/README.md.tmpl +61 -0
  228. package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
  229. package/src/templates/scripts/loop.sh.tmpl +59 -0
  230. package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  231. package/src/templates/specs/README.md.tmpl +57 -0
  232. package/src/templates/specs/_example.md.tmpl +71 -0
  233. package/src/utils/config.ts +221 -0
  234. package/src/utils/header.ts +15 -0
  235. package/src/utils/logger.ts +28 -0
  236. package/tsconfig.json +19 -0
@@ -0,0 +1,59 @@
1
+ #!/bin/bash
2
+ # loop.sh - Simple Ralph iteration loop
3
+ # Generated by ralph-cli for {{projectName}}
4
+ # Usage: ./loop.sh [prompt-file] [max-iterations]
5
+
6
+ set -e
7
+
8
+ # Get script directory
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+
11
+ # Load config from ralph.config.js if available
12
+ if [ -f "$SCRIPT_DIR/../ralph.config.js" ]; then
13
+ PROMPTS_DIR=$(node -e "console.log(require('$SCRIPT_DIR/../ralph.config.js').paths?.prompts || '.ralph/prompts')" 2>/dev/null || echo ".ralph/prompts")
14
+ DEFAULT_MODEL=$(node -e "console.log(require('$SCRIPT_DIR/../ralph.config.js').loop?.defaultModel || 'sonnet')" 2>/dev/null || echo "sonnet")
15
+ elif [ -f "$SCRIPT_DIR/../../ralph.config.js" ]; then
16
+ PROMPTS_DIR=$(node -e "console.log(require('$SCRIPT_DIR/../../ralph.config.js').paths?.prompts || '.ralph/prompts')" 2>/dev/null || echo ".ralph/prompts")
17
+ DEFAULT_MODEL=$(node -e "console.log(require('$SCRIPT_DIR/../../ralph.config.js').loop?.defaultModel || 'sonnet')" 2>/dev/null || echo "sonnet")
18
+ else
19
+ PROMPTS_DIR=".ralph/prompts"
20
+ DEFAULT_MODEL="sonnet"
21
+ fi
22
+
23
+ # Navigate to project root
24
+ cd "$SCRIPT_DIR/../.."
25
+
26
+ PROMPT_FILE="${1:-$PROMPTS_DIR/PROMPT.md}"
27
+ MAX_ITERATIONS="${2:-0}"
28
+ MODEL="${3:-$DEFAULT_MODEL}"
29
+ ITERATION=0
30
+
31
+ echo "Starting Ralph loop"
32
+ echo " Prompt: $PROMPT_FILE"
33
+ echo " Model: $MODEL"
34
+ echo " Max iterations: $MAX_ITERATIONS (0 = infinite)"
35
+ echo "Press Ctrl+C to stop"
36
+ echo ""
37
+
38
+ # Check if prompt file exists
39
+ if [ ! -f "$PROMPT_FILE" ]; then
40
+ echo "ERROR: Prompt file not found: $PROMPT_FILE"
41
+ exit 1
42
+ fi
43
+
44
+ while true; do
45
+ if [ $MAX_ITERATIONS -gt 0 ] && [ $ITERATION -ge $MAX_ITERATIONS ]; then
46
+ echo "Reached max iterations: $MAX_ITERATIONS"
47
+ break
48
+ fi
49
+
50
+ ITERATION=$((ITERATION + 1))
51
+ echo "======================== ITERATION $ITERATION ========================"
52
+
53
+ cat "$PROMPT_FILE" | claude -p --dangerously-skip-permissions --model "$MODEL"
54
+
55
+ echo ""
56
+ sleep 2
57
+ done
58
+
59
+ echo "Loop completed after $ITERATION iterations"
@@ -0,0 +1,244 @@
1
+ #!/bin/bash
2
+ # ralph-monitor.sh - Dashboard to monitor loop progress
3
+ # Generated by ralph-cli for {{projectName}}
4
+ # Usage: ./ralph-monitor.sh <feature-name>
5
+
6
+ FEATURE="${1:?Usage: ./ralph-monitor.sh <feature-name>}"
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+
9
+ # Load config from ralph.config.js if available
10
+ if [ -f "$SCRIPT_DIR/../ralph.config.js" ]; then
11
+ SPEC_DIR=$(node -e "console.log(require('$SCRIPT_DIR/../ralph.config.js').paths?.specs || '.ralph/specs')" 2>/dev/null || echo ".ralph/specs")
12
+ elif [ -f "$SCRIPT_DIR/../../ralph.config.js" ]; then
13
+ SPEC_DIR=$(node -e "console.log(require('$SCRIPT_DIR/../../ralph.config.js').paths?.specs || '.ralph/specs')" 2>/dev/null || echo ".ralph/specs")
14
+ else
15
+ SPEC_DIR=".ralph/specs"
16
+ fi
17
+
18
+ # Navigate to project root
19
+ cd "$SCRIPT_DIR/../.."
20
+
21
+ PLAN_FILE="$SPEC_DIR/${FEATURE}-implementation-plan.md"
22
+ SPEC_FILE="$SPEC_DIR/${FEATURE}.md"
23
+ APP_DIR="$(pwd)"
24
+ STATUS_FILE="/tmp/ralph-loop-${FEATURE}.status"
25
+ TOKENS_FILE="/tmp/ralph-loop-${FEATURE}.tokens"
26
+
27
+ # Colors
28
+ RED='\033[0;31m'
29
+ GREEN='\033[0;32m'
30
+ YELLOW='\033[0;33m'
31
+ BLUE='\033[0;34m'
32
+ MAGENTA='\033[0;35m'
33
+ CYAN='\033[0;36m'
34
+ BOLD='\033[1m'
35
+ DIM='\033[2m'
36
+ NC='\033[0m'
37
+
38
+ # Terminal width
39
+ TERM_WIDTH=$(tput cols 2>/dev/null || echo 80)
40
+
41
+ # Truncate text
42
+ truncate() {
43
+ local text="$1"
44
+ local max="$2"
45
+ if [ ${#text} -gt $max ]; then
46
+ echo "${text:0:$((max-3))}..."
47
+ else
48
+ echo "$text"
49
+ fi
50
+ }
51
+
52
+ # Clean task text
53
+ clean_task() {
54
+ echo "$1" | sed 's/- \[\[complexity:.*\]\]//g' | sed 's/\[complexity:.*\]//g' | sed 's/ */ /g'
55
+ }
56
+
57
+ # Progress bar
58
+ progress_bar() {
59
+ local percent=$1
60
+ local width=15
61
+ local filled=$((percent * width / 100))
62
+ local empty=$((width - filled))
63
+ printf "${GREEN}"
64
+ for ((i=0; i<filled; i++)); do printf "\xe2\x96\x88"; done
65
+ printf "${DIM}"
66
+ for ((i=0; i<empty; i++)); do printf "\xe2\x96\x91"; done
67
+ printf "${NC}"
68
+ }
69
+
70
+ # Detect current phase
71
+ detect_phase() {
72
+ if pgrep -f "PROMPT_feature.md" > /dev/null 2>&1; then
73
+ echo "Planning"
74
+ elif pgrep -f "PROMPT_e2e.md" > /dev/null 2>&1; then
75
+ echo "E2E Testing"
76
+ elif pgrep -f "PROMPT_verify.md" > /dev/null 2>&1; then
77
+ echo "Verification"
78
+ elif pgrep -f "PROMPT_review.md" > /dev/null 2>&1; then
79
+ echo "PR Review"
80
+ elif pgrep -f "PROMPT.md" > /dev/null 2>&1; then
81
+ echo "Implementation"
82
+ elif pgrep -f "feature-loop.sh.*$FEATURE" > /dev/null 2>&1; then
83
+ echo "Running"
84
+ else
85
+ echo "Idle"
86
+ fi
87
+ }
88
+
89
+ # Get iteration info
90
+ get_iteration_info() {
91
+ if [ -f "$STATUS_FILE" ]; then
92
+ cat "$STATUS_FILE"
93
+ return
94
+ fi
95
+ if pgrep -f "feature-loop.sh.*${FEATURE}" > /dev/null 2>&1; then
96
+ echo "-1|50|0"
97
+ else
98
+ echo "0|50|0"
99
+ fi
100
+ }
101
+
102
+ # Get token info
103
+ get_token_info() {
104
+ if [ -f "$TOKENS_FILE" ]; then
105
+ cat "$TOKENS_FILE"
106
+ else
107
+ echo "0|0"
108
+ fi
109
+ }
110
+
111
+ # Format number
112
+ format_number() {
113
+ local num=$1
114
+ if [ $num -ge 1000000 ]; then
115
+ printf "%.1fM" $(echo "scale=1; $num/1000000" | bc)
116
+ elif [ $num -ge 1000 ]; then
117
+ printf "%.1fK" $(echo "scale=1; $num/1000" | bc)
118
+ else
119
+ printf "%d" $num
120
+ fi
121
+ }
122
+
123
+ # Main loop
124
+ while true; do
125
+ clear
126
+
127
+ TIMESTAMP=$(date '+%H:%M:%S')
128
+ ITER_INFO=$(get_iteration_info)
129
+ ITER_CURRENT=$(echo "$ITER_INFO" | cut -d'|' -f1)
130
+ ITER_MAX=$(echo "$ITER_INFO" | cut -d'|' -f2)
131
+ [[ "$ITER_CURRENT" =~ ^-?[0-9]+$ ]] || ITER_CURRENT=0
132
+ [[ "$ITER_MAX" =~ ^[0-9]+$ ]] || ITER_MAX=50
133
+
134
+ echo -e "${BOLD}================================================================${NC}"
135
+ printf "${BOLD} ${CYAN}RALPH MONITOR${NC}: %-30s ${DIM}%s${NC}\n" "$FEATURE" "$TIMESTAMP"
136
+ echo -e "${BOLD}================================================================${NC}"
137
+
138
+ # Check if plan exists
139
+ if [ ! -f "$PLAN_FILE" ]; then
140
+ echo ""
141
+ echo -e " ${YELLOW}Waiting for implementation plan...${NC}"
142
+ echo -e " ${DIM}$PLAN_FILE${NC}"
143
+ echo ""
144
+ sleep 10
145
+ continue
146
+ fi
147
+
148
+ # Count tasks
149
+ DONE_IMPL=$(grep "^- \[x\]" "$PLAN_FILE" 2>/dev/null | grep -v "E2E:" | wc -l | tr -d '[:space:]')
150
+ TODO_IMPL=$(grep "^- \[ \]" "$PLAN_FILE" 2>/dev/null | grep -v "E2E:" | wc -l | tr -d '[:space:]')
151
+ DONE_E2E=$(grep "^- \[x\].*E2E:" "$PLAN_FILE" 2>/dev/null | wc -l | tr -d '[:space:]')
152
+ TODO_E2E=$(grep "^- \[ \].*E2E:" "$PLAN_FILE" 2>/dev/null | wc -l | tr -d '[:space:]')
153
+ [[ "$DONE_IMPL" =~ ^[0-9]+$ ]] || DONE_IMPL=0
154
+ [[ "$TODO_IMPL" =~ ^[0-9]+$ ]] || TODO_IMPL=0
155
+ [[ "$DONE_E2E" =~ ^[0-9]+$ ]] || DONE_E2E=0
156
+ [[ "$TODO_E2E" =~ ^[0-9]+$ ]] || TODO_E2E=0
157
+
158
+ TOTAL_IMPL=$((DONE_IMPL + TODO_IMPL))
159
+ TOTAL_E2E=$((DONE_E2E + TODO_E2E))
160
+ DONE_ALL=$((DONE_IMPL + DONE_E2E))
161
+ TOTAL_ALL=$((TOTAL_IMPL + TOTAL_E2E))
162
+
163
+ [ $TOTAL_IMPL -gt 0 ] && PERCENT_IMPL=$((DONE_IMPL * 100 / TOTAL_IMPL)) || PERCENT_IMPL=0
164
+ [ $TOTAL_ALL -gt 0 ] && PERCENT_ALL=$((DONE_ALL * 100 / TOTAL_ALL)) || PERCENT_ALL=0
165
+
166
+ PHASE=$(detect_phase)
167
+ BRANCH=$(git branch --show-current 2>/dev/null || echo "-")
168
+
169
+ case "$PHASE" in
170
+ "Planning") PHASE_COLOR="${BLUE}" ;;
171
+ "Implementation") PHASE_COLOR="${YELLOW}" ;;
172
+ "E2E Testing") PHASE_COLOR="${CYAN}" ;;
173
+ "Verification") PHASE_COLOR="${MAGENTA}" ;;
174
+ "PR Review") PHASE_COLOR="${GREEN}" ;;
175
+ "Idle") PHASE_COLOR="${DIM}" ;;
176
+ *) PHASE_COLOR="${NC}" ;;
177
+ esac
178
+
179
+ TOKEN_INFO=$(get_token_info)
180
+ TOKEN_INPUT=$(echo "$TOKEN_INFO" | cut -d'|' -f1)
181
+ TOKEN_OUTPUT=$(echo "$TOKEN_INFO" | cut -d'|' -f2)
182
+ [[ "$TOKEN_INPUT" =~ ^[0-9]+$ ]] || TOKEN_INPUT=0
183
+ [[ "$TOKEN_OUTPUT" =~ ^[0-9]+$ ]] || TOKEN_OUTPUT=0
184
+ TOKEN_TOTAL=$((TOKEN_INPUT + TOKEN_OUTPUT))
185
+
186
+ if [ "$ITER_CURRENT" = "-1" ]; then
187
+ ITER_DISPLAY="?"
188
+ else
189
+ ITER_DISPLAY="$ITER_CURRENT"
190
+ fi
191
+
192
+ # Status
193
+ echo ""
194
+ printf " Phase: ${PHASE_COLOR}${BOLD}%-14s${NC}" "$PHASE"
195
+ printf " Iter: ${BOLD}%s${NC}/${DIM}%d${NC}" "$ITER_DISPLAY" "$ITER_MAX"
196
+ printf " Branch: ${CYAN}%s${NC}\n" "$BRANCH"
197
+ printf " Tokens: ${MAGENTA}$(format_number $TOKEN_TOTAL)${NC} ${DIM}(in:$(format_number $TOKEN_INPUT) out:$(format_number $TOKEN_OUTPUT))${NC}\n"
198
+
199
+ echo -e "${DIM} ----------------------------------------------------------------${NC}"
200
+
201
+ # Progress
202
+ echo ""
203
+ printf " ${BOLD}Implementation:${NC} $(progress_bar $PERCENT_IMPL) ${BOLD}%3d%%${NC} " "$PERCENT_IMPL"
204
+ printf "${GREEN}Done: %d${NC} / ${YELLOW}Todo: %d${NC}\n" "$DONE_IMPL" "$TODO_IMPL"
205
+
206
+ if [ $TOTAL_E2E -gt 0 ]; then
207
+ [ $TOTAL_E2E -gt 0 ] && PERCENT_E2E=$((DONE_E2E * 100 / TOTAL_E2E)) || PERCENT_E2E=0
208
+ printf " ${BOLD}E2E Tests: ${NC} $(progress_bar $PERCENT_E2E) ${BOLD}%3d%%${NC} " "$PERCENT_E2E"
209
+ printf "${GREEN}Done: %d${NC} / ${YELLOW}Todo: %d${NC}\n" "$DONE_E2E" "$TODO_E2E"
210
+ fi
211
+
212
+ printf " ${DIM}--------------------------------------------${NC}\n"
213
+ printf " ${BOLD}Overall: ${NC} $(progress_bar $PERCENT_ALL) ${BOLD}%3d%%${NC} " "$PERCENT_ALL"
214
+ printf "${GREEN}Done: %d${NC} / Total: %d\n" "$DONE_ALL" "$TOTAL_ALL"
215
+
216
+ # Current task
217
+ CURRENT_TASK=$(grep "^- \[ \]" "$PLAN_FILE" 2>/dev/null | grep -v "E2E:" | head -1 | sed 's/^- \[ \] //')
218
+ CURRENT_TASK=$(clean_task "$CURRENT_TASK")
219
+ if [ -n "$CURRENT_TASK" ]; then
220
+ echo ""
221
+ echo -e " ${BOLD}NOW WORKING ON${NC}"
222
+ CURRENT_TASK=$(truncate "$CURRENT_TASK" $((TERM_WIDTH - 8)))
223
+ echo -e " ${YELLOW}>${NC} ${BOLD}$CURRENT_TASK${NC}"
224
+ fi
225
+
226
+ # Recent commits
227
+ echo ""
228
+ echo -e " ${BOLD}RECENT COMMITS${NC}"
229
+ COMMITS=$(git log --oneline -3 2>/dev/null)
230
+ if [ -n "$COMMITS" ]; then
231
+ while IFS= read -r commit; do
232
+ commit=$(truncate "$commit" $((TERM_WIDTH - 8)))
233
+ echo -e " ${DIM}$commit${NC}"
234
+ done <<< "$COMMITS"
235
+ else
236
+ echo -e " ${DIM}No commits yet${NC}"
237
+ fi
238
+
239
+ echo ""
240
+ echo -e "${DIM} ----------------------------------------------------------------${NC}"
241
+ echo -e " ${DIM}Refreshing every 10s - Press Ctrl+C to exit${NC}"
242
+
243
+ sleep 10
244
+ done
@@ -0,0 +1,57 @@
1
+ # Specifications
2
+
3
+ This folder contains feature specifications and their implementation plans.
4
+
5
+ ## Structure
6
+
7
+ Each feature has:
8
+ - `<feature>.md` - Specification document
9
+ - `<feature>-implementation-plan.md` - Implementation tasks
10
+
11
+ ## Spec Template
12
+
13
+ ```markdown
14
+ <!--
15
+ Copyright (c) 2025 {{projectName}}. All rights reserved.
16
+ SPDX-License-Identifier: Proprietary
17
+ -->
18
+
19
+ # Feature Name Specification
20
+
21
+ **Status:** Planned | In Progress | Completed
22
+ **Version:** 1.0
23
+ **Last Updated:** YYYY-MM-DD
24
+
25
+ ## Purpose
26
+ [One paragraph explaining why this feature exists]
27
+
28
+ ## User Stories
29
+ - As a [user], I want [action] so that [benefit]
30
+
31
+ ## Requirements
32
+ - [ ] Requirement 1
33
+ - [ ] Requirement 2
34
+
35
+ ## Technical Notes
36
+ - Uses: [existing patterns/components]
37
+ - Location: [where code should live]
38
+
39
+ ## Visual Requirements
40
+ (For UI features - delete if backend-only)
41
+ - **Layout:** [Grid/Stack/Sidebar, responsive behavior]
42
+ - **Components:** [shadcn components to use]
43
+ - **Chart Types:** [If applicable]
44
+ - **States:** [Empty, loading, error handling]
45
+ - **Mobile:** [What changes on small screens]
46
+ - **Reference:** [Similar page in app or shadcn docs]
47
+
48
+ ## Acceptance Criteria
49
+ - [ ] Criteria 1
50
+ - [ ] Criteria 2
51
+ ```
52
+
53
+ ## Active Specs
54
+
55
+ | Spec | Status | Last Updated | Implementation Plan |
56
+ |------|--------|--------------|---------------------|
57
+ | (Your specs will appear here) | Planned | YYYY-MM-DD | - |
@@ -0,0 +1,71 @@
1
+ # Example Feature Specification
2
+
3
+ **Status:** Planned
4
+ **Version:** 1.0
5
+ **Last Updated:** YYYY-MM-DD
6
+
7
+ ## Purpose
8
+
9
+ This is an example specification to demonstrate the format. Replace this with your actual feature description explaining why this feature exists and what problem it solves.
10
+
11
+ ## User Stories
12
+
13
+ - As a user, I want [action] so that [benefit]
14
+ - As an admin, I want [action] so that [benefit]
15
+
16
+ ## Requirements
17
+
18
+ ### Functional Requirements
19
+ - [ ] Requirement 1 - Description of what the system must do
20
+ - [ ] Requirement 2 - Another functional requirement
21
+
22
+ ### Non-Functional Requirements
23
+ - [ ] Performance: [target metrics]
24
+ - [ ] Security: [security considerations]
25
+ - [ ] Accessibility: [WCAG level]
26
+
27
+ ## Technical Notes
28
+
29
+ - **Uses:** Existing patterns or components to leverage
30
+ - **Location:** Where the code should live (e.g., `{{appDir}}/app/dashboard/`)
31
+ - **Dependencies:** External libraries or APIs needed
32
+ - **Database:** Schema changes required (if any)
33
+
34
+ ## Visual Requirements
35
+
36
+ (For UI features - delete this section if backend-only)
37
+
38
+ - **Layout:** Describe the layout structure and responsive behavior
39
+ - **Components:** List the UI components needed (Button, Card, Table, etc.)
40
+ - **Chart Types:** If applicable, specify chart types needed
41
+ - **States:**
42
+ - Empty: What to show when there's no data
43
+ - Loading: Skeleton or spinner pattern
44
+ - Error: How to display errors
45
+ - **Mobile:** How the layout adapts on small screens
46
+ - **Reference:** Link to similar pages in the app or design references
47
+
48
+ ## API Endpoints
49
+
50
+ (If applicable)
51
+
52
+ | Method | Endpoint | Description |
53
+ |--------|----------|-------------|
54
+ | GET | `/api/example` | Fetch example data |
55
+ | POST | `/api/example` | Create new example |
56
+
57
+ ## Acceptance Criteria
58
+
59
+ - [ ] Criteria 1 - Specific, testable condition
60
+ - [ ] Criteria 2 - Another acceptance criterion
61
+ - [ ] Criteria 3 - E2E testable scenario
62
+
63
+ ## Out of Scope
64
+
65
+ - Feature X (planned for future iteration)
66
+ - Integration Y (separate spec)
67
+
68
+ ## Open Questions
69
+
70
+ - [ ] Question 1 - Decision needed
71
+ - [ ] Question 2 - Clarification required
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Configuration Utilities
3
+ * Load and parse ralph.config.js files
4
+ */
5
+ /**
6
+ * Stack configuration in ralph.config.js
7
+ */
8
+ export interface StackConfig {
9
+ framework: {
10
+ name: string;
11
+ version?: string;
12
+ variant?: string;
13
+ };
14
+ packageManager: string;
15
+ testing: {
16
+ unit: string;
17
+ e2e: string;
18
+ };
19
+ styling: string;
20
+ }
21
+ /**
22
+ * Commands configuration in ralph.config.js
23
+ */
24
+ export interface CommandsConfig {
25
+ dev: string;
26
+ build: string;
27
+ test: string;
28
+ lint: string;
29
+ typecheck: string;
30
+ }
31
+ /**
32
+ * Paths configuration in ralph.config.js
33
+ */
34
+ export interface PathsConfig {
35
+ root: string;
36
+ prompts: string;
37
+ guides: string;
38
+ specs: string;
39
+ scripts: string;
40
+ learnings: string;
41
+ agents: string;
42
+ }
43
+ /**
44
+ * Loop configuration in ralph.config.js
45
+ */
46
+ export interface LoopConfig {
47
+ maxIterations: number;
48
+ maxE2eAttempts: number;
49
+ defaultModel: string;
50
+ planningModel: string;
51
+ }
52
+ /**
53
+ * Full ralph.config.js structure
54
+ */
55
+ export interface RalphConfig {
56
+ name: string;
57
+ stack: StackConfig;
58
+ commands: CommandsConfig;
59
+ paths: PathsConfig;
60
+ loop: LoopConfig;
61
+ }
62
+ /**
63
+ * Default configuration values
64
+ */
65
+ export declare const DEFAULT_CONFIG: RalphConfig;
66
+ /**
67
+ * Load ralph.config.js from a project directory
68
+ * Returns null if config file doesn't exist
69
+ */
70
+ export declare function loadConfig(projectRoot: string): Promise<RalphConfig | null>;
71
+ /**
72
+ * Load config with defaults merged in
73
+ */
74
+ export declare function loadConfigWithDefaults(projectRoot: string): Promise<RalphConfig>;
75
+ /**
76
+ * Check if a ralph config exists in the project
77
+ */
78
+ export declare function hasConfig(projectRoot: string): boolean;
79
+ /**
80
+ * Get the ralph root directory from config or default
81
+ */
82
+ export declare function getRalphRoot(projectRoot: string): Promise<string>;
83
+ /**
84
+ * Get the specs directory from config or default
85
+ */
86
+ export declare function getSpecsDir(projectRoot: string): Promise<string>;
87
+ /**
88
+ * Get the scripts directory from config or default
89
+ */
90
+ export declare function getScriptsDir(projectRoot: string): Promise<string>;
91
+ /**
92
+ * Get loop settings with defaults
93
+ */
94
+ export declare function getLoopSettings(projectRoot: string): Promise<LoopConfig>;
95
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,WAqC5B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAiBjF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCtF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9E"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Configuration Utilities
3
+ * Load and parse ralph.config.js files
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { logger } from './logger.js';
9
+ /**
10
+ * Default configuration values
11
+ */
12
+ export const DEFAULT_CONFIG = {
13
+ name: 'project',
14
+ stack: {
15
+ framework: {
16
+ name: 'unknown',
17
+ version: undefined,
18
+ variant: undefined,
19
+ },
20
+ packageManager: 'npm',
21
+ testing: {
22
+ unit: 'none',
23
+ e2e: 'none',
24
+ },
25
+ styling: 'css',
26
+ },
27
+ commands: {
28
+ dev: 'npm run dev',
29
+ build: 'npm run build',
30
+ test: 'npm test',
31
+ lint: 'npm run lint',
32
+ typecheck: 'npm run typecheck',
33
+ },
34
+ paths: {
35
+ root: '.ralph',
36
+ prompts: '.ralph/prompts',
37
+ guides: '.ralph/guides',
38
+ specs: '.ralph/specs',
39
+ scripts: '.ralph/scripts',
40
+ learnings: '.ralph/LEARNINGS.md',
41
+ agents: '.ralph/AGENTS.md',
42
+ },
43
+ loop: {
44
+ maxIterations: 10,
45
+ maxE2eAttempts: 5,
46
+ defaultModel: 'sonnet',
47
+ planningModel: 'opus',
48
+ },
49
+ };
50
+ /**
51
+ * Load ralph.config.js from a project directory
52
+ * Returns null if config file doesn't exist
53
+ */
54
+ export async function loadConfig(projectRoot) {
55
+ const configPath = join(projectRoot, 'ralph.config.js');
56
+ if (!existsSync(configPath)) {
57
+ return null;
58
+ }
59
+ try {
60
+ // Use dynamic import for ESM compatibility
61
+ // Add timestamp to bust module cache for fresh config
62
+ const configUrl = pathToFileURL(configPath).href + `?t=${Date.now()}`;
63
+ const configModule = await import(configUrl);
64
+ return (configModule.default || configModule);
65
+ }
66
+ catch (error) {
67
+ logger.error(`Failed to load config from ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Load config with defaults merged in
73
+ */
74
+ export async function loadConfigWithDefaults(projectRoot) {
75
+ const config = await loadConfig(projectRoot);
76
+ if (!config) {
77
+ return DEFAULT_CONFIG;
78
+ }
79
+ // Deep merge with defaults
80
+ return {
81
+ name: config.name || DEFAULT_CONFIG.name,
82
+ stack: {
83
+ ...DEFAULT_CONFIG.stack,
84
+ ...config.stack,
85
+ framework: {
86
+ ...DEFAULT_CONFIG.stack.framework,
87
+ ...config.stack?.framework,
88
+ },
89
+ testing: {
90
+ ...DEFAULT_CONFIG.stack.testing,
91
+ ...config.stack?.testing,
92
+ },
93
+ },
94
+ commands: {
95
+ ...DEFAULT_CONFIG.commands,
96
+ ...config.commands,
97
+ },
98
+ paths: {
99
+ ...DEFAULT_CONFIG.paths,
100
+ ...config.paths,
101
+ },
102
+ loop: {
103
+ ...DEFAULT_CONFIG.loop,
104
+ ...config.loop,
105
+ },
106
+ };
107
+ }
108
+ /**
109
+ * Check if a ralph config exists in the project
110
+ */
111
+ export function hasConfig(projectRoot) {
112
+ const configPath = join(projectRoot, 'ralph.config.js');
113
+ return existsSync(configPath);
114
+ }
115
+ /**
116
+ * Get the ralph root directory from config or default
117
+ */
118
+ export async function getRalphRoot(projectRoot) {
119
+ const config = await loadConfig(projectRoot);
120
+ return config?.paths?.root || '.ralph';
121
+ }
122
+ /**
123
+ * Get the specs directory from config or default
124
+ */
125
+ export async function getSpecsDir(projectRoot) {
126
+ const config = await loadConfig(projectRoot);
127
+ return config?.paths?.specs || '.ralph/specs';
128
+ }
129
+ /**
130
+ * Get the scripts directory from config or default
131
+ */
132
+ export async function getScriptsDir(projectRoot) {
133
+ const config = await loadConfig(projectRoot);
134
+ return config?.paths?.scripts || '.ralph/scripts';
135
+ }
136
+ /**
137
+ * Get loop settings with defaults
138
+ */
139
+ export async function getLoopSettings(projectRoot) {
140
+ const config = await loadConfig(projectRoot);
141
+ return {
142
+ maxIterations: config?.loop?.maxIterations || DEFAULT_CONFIG.loop.maxIterations,
143
+ maxE2eAttempts: config?.loop?.maxE2eAttempts || DEFAULT_CONFIG.loop.maxE2eAttempts,
144
+ defaultModel: config?.loop?.defaultModel || DEFAULT_CONFIG.loop.defaultModel,
145
+ planningModel: config?.loop?.planningModel || DEFAULT_CONFIG.loop.planningModel,
146
+ };
147
+ }
148
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}