wogiflow 1.0.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 (221) hide show
  1. package/.workflow/agents/reviewer.md +81 -0
  2. package/.workflow/agents/security.md +94 -0
  3. package/.workflow/agents/story-writer.md +58 -0
  4. package/.workflow/bridges/base-bridge.js +395 -0
  5. package/.workflow/bridges/claude-bridge.js +434 -0
  6. package/.workflow/bridges/index.js +130 -0
  7. package/.workflow/lib/assumption-detector.js +481 -0
  8. package/.workflow/lib/config-substitution.js +371 -0
  9. package/.workflow/lib/failure-categories.js +478 -0
  10. package/.workflow/state/app-map.md.template +15 -0
  11. package/.workflow/state/architecture.md.template +24 -0
  12. package/.workflow/state/component-index.json.template +5 -0
  13. package/.workflow/state/decisions.md.template +15 -0
  14. package/.workflow/state/feedback-patterns.md.template +9 -0
  15. package/.workflow/state/knowledge-sync.json.template +6 -0
  16. package/.workflow/state/progress.md.template +14 -0
  17. package/.workflow/state/ready.json.template +7 -0
  18. package/.workflow/state/request-log.md.template +14 -0
  19. package/.workflow/state/session-state.json.template +11 -0
  20. package/.workflow/state/stack.md.template +33 -0
  21. package/.workflow/state/testing.md.template +36 -0
  22. package/.workflow/templates/claude-md.hbs +257 -0
  23. package/.workflow/templates/correction-report.md +67 -0
  24. package/.workflow/templates/gemini-md.hbs +52 -0
  25. package/README.md +1802 -0
  26. package/bin/flow +205 -0
  27. package/lib/index.js +33 -0
  28. package/lib/installer.js +467 -0
  29. package/lib/release-channel.js +269 -0
  30. package/lib/skill-registry.js +526 -0
  31. package/lib/upgrader.js +401 -0
  32. package/lib/utils.js +305 -0
  33. package/package.json +64 -0
  34. package/scripts/flow +985 -0
  35. package/scripts/flow-adaptive-learning.js +1259 -0
  36. package/scripts/flow-aggregate.js +488 -0
  37. package/scripts/flow-archive +133 -0
  38. package/scripts/flow-auto-context.js +1015 -0
  39. package/scripts/flow-auto-learn.js +615 -0
  40. package/scripts/flow-bridge.js +223 -0
  41. package/scripts/flow-browser-suggest.js +316 -0
  42. package/scripts/flow-bug.js +247 -0
  43. package/scripts/flow-cascade.js +711 -0
  44. package/scripts/flow-changelog +85 -0
  45. package/scripts/flow-checkpoint.js +483 -0
  46. package/scripts/flow-cli.js +403 -0
  47. package/scripts/flow-code-intelligence.js +760 -0
  48. package/scripts/flow-complexity.js +502 -0
  49. package/scripts/flow-config-set.js +152 -0
  50. package/scripts/flow-constants.js +157 -0
  51. package/scripts/flow-context +152 -0
  52. package/scripts/flow-context-init.js +482 -0
  53. package/scripts/flow-context-monitor.js +384 -0
  54. package/scripts/flow-context-scoring.js +886 -0
  55. package/scripts/flow-correct.js +458 -0
  56. package/scripts/flow-damage-control.js +985 -0
  57. package/scripts/flow-deps +101 -0
  58. package/scripts/flow-diff.js +700 -0
  59. package/scripts/flow-done +151 -0
  60. package/scripts/flow-done.js +489 -0
  61. package/scripts/flow-durable-session.js +1541 -0
  62. package/scripts/flow-entropy-monitor.js +345 -0
  63. package/scripts/flow-export-profile +349 -0
  64. package/scripts/flow-export-scanner.js +1046 -0
  65. package/scripts/flow-figma-confirm.js +400 -0
  66. package/scripts/flow-figma-extract.js +496 -0
  67. package/scripts/flow-figma-generate.js +683 -0
  68. package/scripts/flow-figma-index.js +909 -0
  69. package/scripts/flow-figma-match.js +617 -0
  70. package/scripts/flow-figma-mcp-server.js +518 -0
  71. package/scripts/flow-figma-pipeline.js +414 -0
  72. package/scripts/flow-file-ops.js +301 -0
  73. package/scripts/flow-gate-confidence.js +825 -0
  74. package/scripts/flow-guided-edit.js +659 -0
  75. package/scripts/flow-health +185 -0
  76. package/scripts/flow-health.js +413 -0
  77. package/scripts/flow-hooks.js +556 -0
  78. package/scripts/flow-http-client.js +249 -0
  79. package/scripts/flow-hybrid-detect.js +167 -0
  80. package/scripts/flow-hybrid-interactive.js +591 -0
  81. package/scripts/flow-hybrid-test.js +152 -0
  82. package/scripts/flow-import-profile +439 -0
  83. package/scripts/flow-init +253 -0
  84. package/scripts/flow-instruction-richness.js +827 -0
  85. package/scripts/flow-jira-integration.js +579 -0
  86. package/scripts/flow-knowledge-router.js +522 -0
  87. package/scripts/flow-knowledge-sync.js +589 -0
  88. package/scripts/flow-linear-integration.js +631 -0
  89. package/scripts/flow-links.js +774 -0
  90. package/scripts/flow-log-manager.js +559 -0
  91. package/scripts/flow-loop-enforcer.js +1246 -0
  92. package/scripts/flow-loop-retry-learning.js +630 -0
  93. package/scripts/flow-lsp.js +923 -0
  94. package/scripts/flow-map-index +348 -0
  95. package/scripts/flow-map-sync +201 -0
  96. package/scripts/flow-memory-blocks.js +668 -0
  97. package/scripts/flow-memory-compactor.js +350 -0
  98. package/scripts/flow-memory-db.js +1110 -0
  99. package/scripts/flow-memory-sync.js +484 -0
  100. package/scripts/flow-metrics.js +353 -0
  101. package/scripts/flow-migrate-ids.js +370 -0
  102. package/scripts/flow-model-adapter.js +802 -0
  103. package/scripts/flow-model-router.js +884 -0
  104. package/scripts/flow-models.js +1231 -0
  105. package/scripts/flow-morning.js +517 -0
  106. package/scripts/flow-multi-approach.js +660 -0
  107. package/scripts/flow-new-feature +86 -0
  108. package/scripts/flow-onboard +1042 -0
  109. package/scripts/flow-orchestrate-llm.js +459 -0
  110. package/scripts/flow-orchestrate.js +3592 -0
  111. package/scripts/flow-output.js +123 -0
  112. package/scripts/flow-parallel-detector.js +399 -0
  113. package/scripts/flow-parallel-dispatch.js +987 -0
  114. package/scripts/flow-parallel.js +428 -0
  115. package/scripts/flow-pattern-enforcer.js +600 -0
  116. package/scripts/flow-prd-manager.js +282 -0
  117. package/scripts/flow-progress.js +323 -0
  118. package/scripts/flow-project-analyzer.js +975 -0
  119. package/scripts/flow-prompt-composer.js +487 -0
  120. package/scripts/flow-providers.js +1381 -0
  121. package/scripts/flow-queue.js +308 -0
  122. package/scripts/flow-ready +82 -0
  123. package/scripts/flow-ready.js +189 -0
  124. package/scripts/flow-regression.js +396 -0
  125. package/scripts/flow-response-parser.js +450 -0
  126. package/scripts/flow-resume.js +284 -0
  127. package/scripts/flow-rules-sync.js +439 -0
  128. package/scripts/flow-run-trace.js +718 -0
  129. package/scripts/flow-safety.js +587 -0
  130. package/scripts/flow-search +104 -0
  131. package/scripts/flow-security.js +481 -0
  132. package/scripts/flow-session-end +106 -0
  133. package/scripts/flow-session-end.js +437 -0
  134. package/scripts/flow-session-state.js +671 -0
  135. package/scripts/flow-setup-hooks +216 -0
  136. package/scripts/flow-setup-hooks.js +377 -0
  137. package/scripts/flow-skill-create.js +329 -0
  138. package/scripts/flow-skill-creator.js +572 -0
  139. package/scripts/flow-skill-generator.js +1046 -0
  140. package/scripts/flow-skill-learn.js +880 -0
  141. package/scripts/flow-skill-matcher.js +578 -0
  142. package/scripts/flow-spec-generator.js +820 -0
  143. package/scripts/flow-stack-wizard.js +895 -0
  144. package/scripts/flow-standup +162 -0
  145. package/scripts/flow-start +74 -0
  146. package/scripts/flow-start.js +235 -0
  147. package/scripts/flow-status +110 -0
  148. package/scripts/flow-status.js +301 -0
  149. package/scripts/flow-step-browser.js +83 -0
  150. package/scripts/flow-step-changelog.js +217 -0
  151. package/scripts/flow-step-comments.js +306 -0
  152. package/scripts/flow-step-complexity.js +234 -0
  153. package/scripts/flow-step-coverage.js +218 -0
  154. package/scripts/flow-step-knowledge.js +193 -0
  155. package/scripts/flow-step-pr-tests.js +364 -0
  156. package/scripts/flow-step-regression.js +89 -0
  157. package/scripts/flow-step-review.js +516 -0
  158. package/scripts/flow-step-security.js +162 -0
  159. package/scripts/flow-step-silent-failures.js +290 -0
  160. package/scripts/flow-step-simplifier.js +346 -0
  161. package/scripts/flow-story +105 -0
  162. package/scripts/flow-story.js +500 -0
  163. package/scripts/flow-suspend.js +252 -0
  164. package/scripts/flow-sync-daemon.js +654 -0
  165. package/scripts/flow-task-analyzer.js +606 -0
  166. package/scripts/flow-team-dashboard.js +748 -0
  167. package/scripts/flow-team-sync.js +752 -0
  168. package/scripts/flow-team.js +977 -0
  169. package/scripts/flow-tech-options.js +528 -0
  170. package/scripts/flow-templates.js +812 -0
  171. package/scripts/flow-tiered-learning.js +728 -0
  172. package/scripts/flow-trace +204 -0
  173. package/scripts/flow-transcript-chunking.js +1106 -0
  174. package/scripts/flow-transcript-digest.js +7918 -0
  175. package/scripts/flow-transcript-language.js +465 -0
  176. package/scripts/flow-transcript-parsing.js +1085 -0
  177. package/scripts/flow-transcript-stories.js +2194 -0
  178. package/scripts/flow-update-map +224 -0
  179. package/scripts/flow-utils.js +2242 -0
  180. package/scripts/flow-verification.js +644 -0
  181. package/scripts/flow-verify.js +1177 -0
  182. package/scripts/flow-voice-input.js +638 -0
  183. package/scripts/flow-watch +168 -0
  184. package/scripts/flow-workflow-steps.js +521 -0
  185. package/scripts/flow-workflow.js +1029 -0
  186. package/scripts/flow-worktree.js +489 -0
  187. package/scripts/hooks/adapters/base-adapter.js +102 -0
  188. package/scripts/hooks/adapters/claude-code.js +359 -0
  189. package/scripts/hooks/adapters/index.js +79 -0
  190. package/scripts/hooks/core/component-check.js +341 -0
  191. package/scripts/hooks/core/index.js +35 -0
  192. package/scripts/hooks/core/loop-check.js +241 -0
  193. package/scripts/hooks/core/session-context.js +294 -0
  194. package/scripts/hooks/core/task-gate.js +177 -0
  195. package/scripts/hooks/core/validation.js +230 -0
  196. package/scripts/hooks/entry/claude-code/post-tool-use.js +65 -0
  197. package/scripts/hooks/entry/claude-code/pre-tool-use.js +89 -0
  198. package/scripts/hooks/entry/claude-code/session-end.js +87 -0
  199. package/scripts/hooks/entry/claude-code/session-start.js +46 -0
  200. package/scripts/hooks/entry/claude-code/stop.js +43 -0
  201. package/scripts/postinstall.js +139 -0
  202. package/templates/browser-test-flow.json +56 -0
  203. package/templates/bug-report.md +43 -0
  204. package/templates/component-detail.md +42 -0
  205. package/templates/component.stories.tsx +49 -0
  206. package/templates/context/constraints.md +83 -0
  207. package/templates/context/conventions.md +177 -0
  208. package/templates/context/stack.md +60 -0
  209. package/templates/correction-report.md +90 -0
  210. package/templates/feature-proposal.md +35 -0
  211. package/templates/hybrid/_base.md +254 -0
  212. package/templates/hybrid/_patterns.md +45 -0
  213. package/templates/hybrid/create-component.md +127 -0
  214. package/templates/hybrid/create-file.md +56 -0
  215. package/templates/hybrid/create-hook.md +145 -0
  216. package/templates/hybrid/create-service.md +70 -0
  217. package/templates/hybrid/fix-bug.md +33 -0
  218. package/templates/hybrid/modify-file.md +55 -0
  219. package/templates/story.md +68 -0
  220. package/templates/task.json +56 -0
  221. package/templates/trace.md +69 -0
@@ -0,0 +1,1042 @@
1
+ #!/bin/bash
2
+
3
+ # Wogi Flow - Project Onboarding
4
+ # Analyzes existing projects and sets up workflow with context
5
+
6
+ set -e
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ PROJECT_ROOT="$(pwd)"
10
+ WORKFLOW_DIR=".workflow"
11
+
12
+ # Colors
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ CYAN='\033[0;36m'
16
+ RED='\033[0;31m'
17
+ BOLD='\033[1m'
18
+ DIM='\033[2m'
19
+ NC='\033[0m'
20
+
21
+ # Collected data
22
+ PROJECT_NAME=""
23
+ PROJECT_DESCRIPTION=""
24
+ DETECTED_FRAMEWORK=""
25
+ DETECTED_LANGUAGE=""
26
+ DETECTED_COMPONENTS=()
27
+ PRD_CONTENT=""
28
+ ADDITIONAL_DOCS=""
29
+
30
+ print_header() {
31
+ clear
32
+ echo -e "${CYAN}"
33
+ echo "╔═══════════════════════════════════════════════════════════════╗"
34
+ echo "║ ║"
35
+ echo "║ 🔍 Wogi Flow - Project Onboarding 🔍 ║"
36
+ echo "║ ║"
37
+ echo "║ Analyze existing project & set up workflow ║"
38
+ echo "║ ║"
39
+ echo "╚═══════════════════════════════════════════════════════════════╝"
40
+ echo -e "${NC}"
41
+ echo ""
42
+ }
43
+
44
+ # ============================================================
45
+ # DETECTION FUNCTIONS
46
+ # ============================================================
47
+
48
+ detect_package_manager() {
49
+ if [ -f "package-lock.json" ]; then
50
+ echo "npm"
51
+ elif [ -f "yarn.lock" ]; then
52
+ echo "yarn"
53
+ elif [ -f "pnpm-lock.yaml" ]; then
54
+ echo "pnpm"
55
+ elif [ -f "requirements.txt" ] || [ -f "Pipfile" ]; then
56
+ echo "pip"
57
+ elif [ -f "go.mod" ]; then
58
+ echo "go"
59
+ elif [ -f "Cargo.toml" ]; then
60
+ echo "cargo"
61
+ else
62
+ echo "unknown"
63
+ fi
64
+ }
65
+
66
+ detect_framework() {
67
+ local framework="unknown"
68
+
69
+ # Check package.json for JS/TS frameworks
70
+ if [ -f "package.json" ]; then
71
+ if grep -q '"next"' package.json 2>/dev/null; then
72
+ framework="Next.js"
73
+ elif grep -q '"@nestjs/core"' package.json 2>/dev/null; then
74
+ framework="NestJS"
75
+ elif grep -q '"react"' package.json 2>/dev/null; then
76
+ if grep -q '"react-native"' package.json 2>/dev/null; then
77
+ framework="React Native"
78
+ else
79
+ framework="React"
80
+ fi
81
+ elif grep -q '"vue"' package.json 2>/dev/null; then
82
+ framework="Vue"
83
+ elif grep -q '"@angular/core"' package.json 2>/dev/null; then
84
+ framework="Angular"
85
+ elif grep -q '"express"' package.json 2>/dev/null; then
86
+ framework="Express"
87
+ elif grep -q '"fastify"' package.json 2>/dev/null; then
88
+ framework="Fastify"
89
+ fi
90
+ fi
91
+
92
+ # Check for Python frameworks
93
+ if [ -f "requirements.txt" ]; then
94
+ if grep -qi "fastapi" requirements.txt 2>/dev/null; then
95
+ framework="FastAPI"
96
+ elif grep -qi "django" requirements.txt 2>/dev/null; then
97
+ framework="Django"
98
+ elif grep -qi "flask" requirements.txt 2>/dev/null; then
99
+ framework="Flask"
100
+ fi
101
+ fi
102
+
103
+ # Check for specific files
104
+ if [ -f "next.config.js" ] || [ -f "next.config.mjs" ]; then
105
+ framework="Next.js"
106
+ elif [ -f "nest-cli.json" ]; then
107
+ framework="NestJS"
108
+ elif [ -f "angular.json" ]; then
109
+ framework="Angular"
110
+ elif [ -f "nuxt.config.js" ] || [ -f "nuxt.config.ts" ]; then
111
+ framework="Nuxt"
112
+ fi
113
+
114
+ echo "$framework"
115
+ }
116
+
117
+ detect_language() {
118
+ if [ -f "tsconfig.json" ]; then
119
+ echo "TypeScript"
120
+ elif [ -f "package.json" ]; then
121
+ echo "JavaScript"
122
+ elif [ -f "requirements.txt" ] || [ -f "setup.py" ] || [ -f "pyproject.toml" ]; then
123
+ echo "Python"
124
+ elif [ -f "go.mod" ]; then
125
+ echo "Go"
126
+ elif [ -f "Cargo.toml" ]; then
127
+ echo "Rust"
128
+ elif [ -f "pom.xml" ] || [ -f "build.gradle" ]; then
129
+ echo "Java"
130
+ else
131
+ echo "unknown"
132
+ fi
133
+ }
134
+
135
+ detect_database() {
136
+ local db=""
137
+
138
+ if [ -f "package.json" ]; then
139
+ if grep -q '"typeorm"' package.json 2>/dev/null; then
140
+ db="TypeORM"
141
+ elif grep -q '"prisma"' package.json 2>/dev/null; then
142
+ db="Prisma"
143
+ elif grep -q '"mongoose"' package.json 2>/dev/null; then
144
+ db="MongoDB (Mongoose)"
145
+ elif grep -q '"sequelize"' package.json 2>/dev/null; then
146
+ db="Sequelize"
147
+ elif grep -q '"knex"' package.json 2>/dev/null; then
148
+ db="Knex"
149
+ fi
150
+ fi
151
+
152
+ if [ -f "docker-compose.yml" ] || [ -f "docker-compose.yaml" ]; then
153
+ if grep -q "postgres" docker-compose.yml 2>/dev/null; then
154
+ db="${db:+$db + }PostgreSQL"
155
+ elif grep -q "mysql" docker-compose.yml 2>/dev/null; then
156
+ db="${db:+$db + }MySQL"
157
+ elif grep -q "mongo" docker-compose.yml 2>/dev/null; then
158
+ db="${db:+$db + }MongoDB"
159
+ elif grep -q "redis" docker-compose.yml 2>/dev/null; then
160
+ db="${db:+$db + }Redis"
161
+ fi
162
+ fi
163
+
164
+ echo "${db:-unknown}"
165
+ }
166
+
167
+ scan_components() {
168
+ echo -e "${CYAN}Scanning for components...${NC}"
169
+
170
+ local components=()
171
+
172
+ # React/Vue components
173
+ if [ -d "src/components" ]; then
174
+ while IFS= read -r -d '' file; do
175
+ local name=$(basename "$file" | sed 's/\.\(tsx\|jsx\|vue\|ts\|js\)$//')
176
+ if [[ "$name" != "index" ]]; then
177
+ components+=("$name|$file|component")
178
+ fi
179
+ done < <(find src/components -type f \( -name "*.tsx" -o -name "*.jsx" -o -name "*.vue" \) -print0 2>/dev/null)
180
+ fi
181
+
182
+ # Pages/Routes
183
+ if [ -d "src/pages" ] || [ -d "pages" ] || [ -d "app" ]; then
184
+ local pages_dir=""
185
+ [ -d "src/pages" ] && pages_dir="src/pages"
186
+ [ -d "pages" ] && pages_dir="pages"
187
+ [ -d "app" ] && pages_dir="app"
188
+
189
+ if [ -n "$pages_dir" ]; then
190
+ while IFS= read -r -d '' file; do
191
+ local name=$(basename "$file" | sed 's/\.\(tsx\|jsx\|vue\|ts\|js\)$//')
192
+ if [[ "$name" != "index" && "$name" != "_app" && "$name" != "_document" && "$name" != "layout" ]]; then
193
+ components+=("$name|$file|page")
194
+ fi
195
+ done < <(find "$pages_dir" -type f \( -name "*.tsx" -o -name "*.jsx" -o -name "*.vue" \) -print0 2>/dev/null)
196
+ fi
197
+ fi
198
+
199
+ # NestJS modules
200
+ if [ -d "src" ]; then
201
+ while IFS= read -r -d '' file; do
202
+ local name=$(basename "$(dirname "$file")")
203
+ components+=("$name|$file|module")
204
+ done < <(find src -name "*.module.ts" -print0 2>/dev/null)
205
+ fi
206
+
207
+ # Store globally
208
+ DETECTED_COMPONENTS=("${components[@]}")
209
+
210
+ echo -e "${GREEN}✓${NC} Found ${#components[@]} components/modules"
211
+ }
212
+
213
+ scan_api_routes() {
214
+ echo -e "${CYAN}Scanning for API routes...${NC}"
215
+
216
+ local routes=()
217
+
218
+ # Next.js API routes
219
+ if [ -d "pages/api" ] || [ -d "src/pages/api" ] || [ -d "app/api" ]; then
220
+ local api_dir=""
221
+ [ -d "pages/api" ] && api_dir="pages/api"
222
+ [ -d "src/pages/api" ] && api_dir="src/pages/api"
223
+ [ -d "app/api" ] && api_dir="app/api"
224
+
225
+ if [ -n "$api_dir" ]; then
226
+ routes=($(find "$api_dir" -type f \( -name "*.ts" -o -name "*.js" \) 2>/dev/null | head -20))
227
+ fi
228
+ fi
229
+
230
+ # NestJS controllers
231
+ if [ -d "src" ]; then
232
+ routes+=($(find src -name "*.controller.ts" 2>/dev/null | head -20))
233
+ fi
234
+
235
+ # Express routes
236
+ if [ -d "routes" ] || [ -d "src/routes" ]; then
237
+ local routes_dir=""
238
+ [ -d "routes" ] && routes_dir="routes"
239
+ [ -d "src/routes" ] && routes_dir="src/routes"
240
+
241
+ if [ -n "$routes_dir" ]; then
242
+ routes+=($(find "$routes_dir" -type f \( -name "*.ts" -o -name "*.js" \) 2>/dev/null | head -20))
243
+ fi
244
+ fi
245
+
246
+ echo -e "${GREEN}✓${NC} Found ${#routes[@]} API routes/controllers"
247
+ }
248
+
249
+ count_lines_of_code() {
250
+ local total=0
251
+
252
+ if command -v cloc &> /dev/null; then
253
+ total=$(cloc . --quiet --csv 2>/dev/null | tail -1 | cut -d',' -f5)
254
+ else
255
+ # Fallback: count manually
256
+ total=$(find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \) \
257
+ -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*" -not -path "*/build/*" \
258
+ -exec cat {} \; 2>/dev/null | wc -l)
259
+ fi
260
+
261
+ echo "$total"
262
+ }
263
+
264
+ # ============================================================
265
+ # INTERVIEW FUNCTIONS
266
+ # ============================================================
267
+
268
+ ask_project_basics() {
269
+ echo -e "${BOLD}1. Project Basics${NC}"
270
+ echo ""
271
+
272
+ # Try to detect name
273
+ local default_name=""
274
+ if [ -f "package.json" ]; then
275
+ default_name=$(python3 -c "import json; print(json.load(open('package.json')).get('name', ''))" 2>/dev/null || echo "")
276
+ fi
277
+ [ -z "$default_name" ] && default_name=$(basename "$(pwd)")
278
+
279
+ read -p " Project name [$default_name]: " PROJECT_NAME
280
+ PROJECT_NAME="${PROJECT_NAME:-$default_name}"
281
+
282
+ echo ""
283
+ echo " Brief description (1-2 sentences):"
284
+ read -p " > " PROJECT_DESCRIPTION
285
+ echo ""
286
+ }
287
+
288
+ ask_for_prd() {
289
+ echo -e "${BOLD}2. Project Documentation${NC}"
290
+ echo ""
291
+ echo " Do you have any of these documents?"
292
+ echo " - PRD (Product Requirements Document)"
293
+ echo " - README with project overview"
294
+ echo " - Technical spec"
295
+ echo " - Architecture doc"
296
+ echo ""
297
+
298
+ # Check for common doc files
299
+ local found_docs=()
300
+ [ -f "PRD.md" ] && found_docs+=("PRD.md")
301
+ [ -f "prd.md" ] && found_docs+=("prd.md")
302
+ [ -f "docs/PRD.md" ] && found_docs+=("docs/PRD.md")
303
+ [ -f "README.md" ] && found_docs+=("README.md")
304
+ [ -f "ARCHITECTURE.md" ] && found_docs+=("ARCHITECTURE.md")
305
+ [ -f "docs/architecture.md" ] && found_docs+=("docs/architecture.md")
306
+ [ -f "TECHNICAL.md" ] && found_docs+=("TECHNICAL.md")
307
+ [ -f "docs/technical-spec.md" ] && found_docs+=("docs/technical-spec.md")
308
+
309
+ if [ ${#found_docs[@]} -gt 0 ]; then
310
+ echo -e " ${GREEN}Found these docs:${NC}"
311
+ for doc in "${found_docs[@]}"; do
312
+ echo " - $doc"
313
+ done
314
+ echo ""
315
+ read -p " Should I read these? (y/n) [y]: " read_docs
316
+ if [[ "${read_docs:-y}" =~ ^[Yy]$ ]]; then
317
+ for doc in "${found_docs[@]}"; do
318
+ echo -e " ${DIM}Reading $doc...${NC}"
319
+ PRD_CONTENT+="
320
+ --- $doc ---
321
+ $(head -500 "$doc" 2>/dev/null)
322
+ "
323
+ done
324
+ echo -e " ${GREEN}✓${NC} Documents loaded"
325
+ fi
326
+ fi
327
+
328
+ echo ""
329
+ read -p " Path to additional doc (or press Enter to skip): " additional_doc
330
+ if [ -n "$additional_doc" ] && [ -f "$additional_doc" ]; then
331
+ ADDITIONAL_DOCS=$(head -500 "$additional_doc" 2>/dev/null)
332
+ echo -e " ${GREEN}✓${NC} Loaded $additional_doc"
333
+ fi
334
+
335
+ echo ""
336
+ echo " Want to paste PRD/description directly? (y/n) [n]:"
337
+ read -p " " paste_prd
338
+ if [[ "$paste_prd" =~ ^[Yy]$ ]]; then
339
+ echo " Paste your content (end with a line containing just 'END'):"
340
+ local pasted=""
341
+ while IFS= read -r line; do
342
+ [[ "$line" == "END" ]] && break
343
+ pasted+="$line"$'\n'
344
+ done
345
+ PRD_CONTENT+="
346
+ --- Pasted Content ---
347
+ $pasted
348
+ "
349
+ echo -e " ${GREEN}✓${NC} Content captured"
350
+ fi
351
+ echo ""
352
+ }
353
+
354
+ ask_current_state() {
355
+ echo -e "${BOLD}3. Current State${NC}"
356
+ echo ""
357
+
358
+ echo " What's the current state of the project?"
359
+ echo " (a) New/early development"
360
+ echo " (b) MVP / working prototype"
361
+ echo " (c) Production with active users"
362
+ echo " (d) Maintenance mode"
363
+ echo ""
364
+ read -p " Choice [b]: " state_choice
365
+
366
+ case "$state_choice" in
367
+ a) PROJECT_STATE="early" ;;
368
+ c) PROJECT_STATE="production" ;;
369
+ d) PROJECT_STATE="maintenance" ;;
370
+ *) PROJECT_STATE="mvp" ;;
371
+ esac
372
+
373
+ echo ""
374
+ echo " What are you trying to accomplish with AI assistance?"
375
+ echo " (Select all that apply, comma-separated)"
376
+ echo " 1. Add new features"
377
+ echo " 2. Fix bugs"
378
+ echo " 3. Refactor/improve code quality"
379
+ echo " 4. Add tests"
380
+ echo " 5. Documentation"
381
+ echo " 6. Performance optimization"
382
+ echo " 7. Security improvements"
383
+ echo ""
384
+ read -p " Choices [1,2]: " goals_input
385
+ GOALS="${goals_input:-1,2}"
386
+ echo ""
387
+ }
388
+
389
+ ask_known_issues() {
390
+ echo -e "${BOLD}4. Known Issues & Tech Debt${NC}"
391
+ echo ""
392
+ echo " Any known issues, bugs, or tech debt? (one per line, 'done' to finish)"
393
+ echo ""
394
+
395
+ KNOWN_ISSUES=""
396
+ while true; do
397
+ read -p " - " issue
398
+ [[ "$issue" == "done" || -z "$issue" ]] && break
399
+ KNOWN_ISSUES+="- $issue"$'\n'
400
+ done
401
+ echo ""
402
+ }
403
+
404
+ ask_coding_preferences() {
405
+ echo -e "${BOLD}5. Coding Preferences${NC}"
406
+ echo ""
407
+
408
+ echo " Any specific coding patterns or conventions?"
409
+ echo " (e.g., 'use functional components', 'services should be thin')"
410
+ echo " (one per line, 'done' to finish)"
411
+ echo ""
412
+
413
+ CODING_PATTERNS=""
414
+ while true; do
415
+ read -p " - " pattern
416
+ [[ "$pattern" == "done" || -z "$pattern" ]] && break
417
+ CODING_PATTERNS+="- $pattern"$'\n'
418
+ done
419
+ echo ""
420
+ }
421
+
422
+ # ============================================================
423
+ # GENERATION FUNCTIONS
424
+ # ============================================================
425
+
426
+ generate_project_spec() {
427
+ echo -e "${CYAN}Generating project specification...${NC}"
428
+
429
+ cat > "$WORKFLOW_DIR/specs/project.md" << EOF
430
+ # Project Specification: $PROJECT_NAME
431
+
432
+ ## Overview
433
+
434
+ $PROJECT_DESCRIPTION
435
+
436
+ ## Tech Stack
437
+
438
+ | Component | Technology |
439
+ |-----------|------------|
440
+ | Language | $DETECTED_LANGUAGE |
441
+ | Framework | $DETECTED_FRAMEWORK |
442
+ | Database | $(detect_database) |
443
+ | Package Manager | $(detect_package_manager) |
444
+
445
+ ## Project State
446
+
447
+ - **Current Phase**: $PROJECT_STATE
448
+ - **Lines of Code**: ~$(count_lines_of_code)
449
+ - **Components/Modules**: ${#DETECTED_COMPONENTS[@]}
450
+
451
+ ## Goals
452
+
453
+ $(echo "$GOALS" | tr ',' '\n' | while read g; do
454
+ case "$g" in
455
+ 1) echo "- Add new features" ;;
456
+ 2) echo "- Fix bugs" ;;
457
+ 3) echo "- Refactor/improve code quality" ;;
458
+ 4) echo "- Add tests" ;;
459
+ 5) echo "- Documentation" ;;
460
+ 6) echo "- Performance optimization" ;;
461
+ 7) echo "- Security improvements" ;;
462
+ esac
463
+ done)
464
+
465
+ ## Known Issues / Tech Debt
466
+
467
+ $KNOWN_ISSUES
468
+
469
+ ## Coding Conventions
470
+
471
+ $CODING_PATTERNS
472
+
473
+ ---
474
+
475
+ ## Source Documents
476
+
477
+ ${PRD_CONTENT:+PRD and documentation have been loaded. See below for key excerpts.}
478
+
479
+ ${PRD_CONTENT:-No PRD or documentation provided.}
480
+
481
+ ${ADDITIONAL_DOCS:+
482
+ ### Additional Documentation
483
+
484
+ $ADDITIONAL_DOCS
485
+ }
486
+ EOF
487
+
488
+ echo -e "${GREEN}✓${NC} Created project.md"
489
+ }
490
+
491
+ # ============================================================
492
+ # KNOWLEDGE FILE GENERATION (Phase 0.4)
493
+ # ============================================================
494
+
495
+ detect_test_framework() {
496
+ local test_framework="unknown"
497
+ local test_command=""
498
+
499
+ if [ -f "package.json" ]; then
500
+ if grep -q '"jest"' package.json 2>/dev/null || grep -q '"@jest/core"' package.json 2>/dev/null; then
501
+ test_framework="Jest"
502
+ test_command="npm test"
503
+ elif grep -q '"vitest"' package.json 2>/dev/null; then
504
+ test_framework="Vitest"
505
+ test_command="npm test"
506
+ elif grep -q '"mocha"' package.json 2>/dev/null; then
507
+ test_framework="Mocha"
508
+ test_command="npm test"
509
+ fi
510
+
511
+ if grep -q '"@playwright/test"' package.json 2>/dev/null; then
512
+ test_framework="$test_framework + Playwright"
513
+ elif grep -q '"cypress"' package.json 2>/dev/null; then
514
+ test_framework="$test_framework + Cypress"
515
+ fi
516
+ fi
517
+
518
+ if [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; then
519
+ if grep -qi "pytest" requirements.txt 2>/dev/null || grep -qi "pytest" pyproject.toml 2>/dev/null; then
520
+ test_framework="pytest"
521
+ test_command="pytest"
522
+ fi
523
+ fi
524
+
525
+ echo "$test_framework|$test_command"
526
+ }
527
+
528
+ detect_architecture_pattern() {
529
+ local pattern="unknown"
530
+
531
+ if [ -d "src/modules" ] || [ -d "src/features" ]; then
532
+ pattern="Modular / Feature-based"
533
+ elif [ -d "src/domain" ] && [ -d "src/infrastructure" ]; then
534
+ pattern="Clean Architecture / DDD"
535
+ elif [ -d "src/controllers" ] && [ -d "src/services" ] && [ -d "src/models" ]; then
536
+ pattern="MVC / Layered"
537
+ elif [ -d "services" ] && [ -d "shared" ]; then
538
+ pattern="Microservices / Monorepo"
539
+ elif [ -d "src/components" ] && [ -d "src/pages" ]; then
540
+ pattern="Component-based (Frontend)"
541
+ elif [ -d "src" ] || [ -d "lib" ]; then
542
+ pattern="Standard"
543
+ fi
544
+
545
+ echo "$pattern"
546
+ }
547
+
548
+ generate_stack_md() {
549
+ echo -e "${CYAN}Generating stack.md...${NC}"
550
+
551
+ local pkg_manager=$(detect_package_manager)
552
+ local db=$(detect_database)
553
+ local test_info=$(detect_test_framework)
554
+ local test_framework=$(echo "$test_info" | cut -d'|' -f1)
555
+ local test_command=$(echo "$test_info" | cut -d'|' -f2)
556
+ local node_version=$(node --version 2>/dev/null || echo "unknown")
557
+
558
+ cat > "$WORKFLOW_DIR/state/stack.md" << EOF
559
+ # Tech Stack
560
+
561
+ > Auto-generated during onboarding. Keep synced with project changes.
562
+
563
+ ## Core Technologies
564
+
565
+ | Category | Technology | Version |
566
+ |----------|------------|---------|
567
+ | Language | $DETECTED_LANGUAGE | - |
568
+ | Framework | $DETECTED_FRAMEWORK | - |
569
+ | Runtime | Node.js | $node_version |
570
+ | Package Manager | $pkg_manager | - |
571
+ | Database | $db | - |
572
+
573
+ ## Testing
574
+
575
+ | Type | Framework | Command |
576
+ |------|-----------|---------|
577
+ | Unit | $test_framework | \`$test_command\` |
578
+
579
+ ## Build Commands
580
+
581
+ | Action | Command |
582
+ |--------|---------|
583
+ | Build | \`npm run build\` |
584
+ | Dev | \`npm run dev\` |
585
+ | Lint | \`npm run lint\` |
586
+ | Type Check | \`npm run typecheck\` |
587
+
588
+ ---
589
+
590
+ *Last updated: $(date -Iseconds)*
591
+ EOF
592
+
593
+ echo -e "${GREEN}✓${NC} Created stack.md"
594
+ }
595
+
596
+ generate_architecture_md() {
597
+ echo -e "${CYAN}Generating architecture.md...${NC}"
598
+
599
+ local arch_pattern=$(detect_architecture_pattern)
600
+
601
+ cat > "$WORKFLOW_DIR/state/architecture.md" << EOF
602
+ # Architecture Overview
603
+
604
+ > Auto-generated during onboarding. Update when architecture changes.
605
+
606
+ ## Pattern
607
+
608
+ **$arch_pattern**
609
+
610
+ ## Folder Structure
611
+
612
+ \`\`\`
613
+ $(basename "$(pwd)")/
614
+ $(ls -1d */ 2>/dev/null | head -10 | while read dir; do echo "├── $dir"; done)
615
+ \`\`\`
616
+
617
+ ## Design Patterns
618
+
619
+ $(case "$DETECTED_FRAMEWORK" in
620
+ "NestJS")
621
+ echo "- **Dependency Injection** - Constructor-based DI"
622
+ echo "- **Repository Pattern** - Data access abstraction"
623
+ echo "- **DTO Pattern** - Data transfer objects"
624
+ ;;
625
+ "React"|"Next.js")
626
+ echo "- **Component Composition** - Building UIs from components"
627
+ echo "- **Hooks Pattern** - State and side effects"
628
+ ;;
629
+ *)
630
+ echo "- *Add patterns as they are identified*"
631
+ ;;
632
+ esac)
633
+
634
+ ## Data Flow
635
+
636
+ \`\`\`
637
+ $(case "$DETECTED_FRAMEWORK" in
638
+ "NestJS")
639
+ echo "Request → Controller → Service → Repository → Database"
640
+ ;;
641
+ "React"|"Next.js")
642
+ echo "User Action → Component → State → Re-render"
643
+ ;;
644
+ *)
645
+ echo "Client → API → Business Logic → Data Layer"
646
+ ;;
647
+ esac)
648
+ \`\`\`
649
+
650
+ ---
651
+
652
+ *Last updated: $(date -Iseconds)*
653
+ EOF
654
+
655
+ echo -e "${GREEN}✓${NC} Created architecture.md"
656
+ }
657
+
658
+ generate_testing_md() {
659
+ echo -e "${CYAN}Generating testing.md...${NC}"
660
+
661
+ local test_info=$(detect_test_framework)
662
+ local test_framework=$(echo "$test_info" | cut -d'|' -f1)
663
+ local test_command=$(echo "$test_info" | cut -d'|' -f2)
664
+ local test_count=$(find . -name "*.test.*" -o -name "*.spec.*" 2>/dev/null | wc -l | tr -d ' ')
665
+
666
+ cat > "$WORKFLOW_DIR/state/testing.md" << EOF
667
+ # Testing Guide
668
+
669
+ > Auto-generated during onboarding. Update when test setup changes.
670
+
671
+ ## Test Framework
672
+
673
+ | Setting | Value |
674
+ |---------|-------|
675
+ | Framework | $test_framework |
676
+ | Test Count | ~$test_count files |
677
+
678
+ ## Commands
679
+
680
+ | Action | Command |
681
+ |--------|---------|
682
+ | Run all | \`$test_command\` |
683
+ | Watch | \`npm run test:watch\` |
684
+ | Coverage | \`npm run coverage\` |
685
+
686
+ ## Conventions
687
+
688
+ $(case "$DETECTED_FRAMEWORK" in
689
+ "NestJS")
690
+ echo "- Unit tests: \`*.spec.ts\` next to source"
691
+ echo "- E2E tests: \`test/\` directory"
692
+ ;;
693
+ "React"|"Next.js")
694
+ echo "- Tests in \`__tests__/\` or \`*.test.tsx\`"
695
+ echo "- Use React Testing Library"
696
+ ;;
697
+ *)
698
+ echo "- Follow project conventions"
699
+ ;;
700
+ esac)
701
+
702
+ ---
703
+
704
+ *Last updated: $(date -Iseconds)*
705
+ EOF
706
+
707
+ echo -e "${GREEN}✓${NC} Created testing.md"
708
+ }
709
+
710
+ generate_app_map() {
711
+ echo -e "${CYAN}Generating app map...${NC}"
712
+
713
+ cat > "$WORKFLOW_DIR/state/app-map.md" << 'EOF'
714
+ # App Map - Component Registry
715
+
716
+ > Auto-generated during project onboarding. Review and update as needed.
717
+
718
+ EOF
719
+
720
+ # Add pages/screens
721
+ echo "## Screens / Pages" >> "$WORKFLOW_DIR/state/app-map.md"
722
+ echo "" >> "$WORKFLOW_DIR/state/app-map.md"
723
+ echo "| Screen | Route | Description |" >> "$WORKFLOW_DIR/state/app-map.md"
724
+ echo "|--------|-------|-------------|" >> "$WORKFLOW_DIR/state/app-map.md"
725
+
726
+ local has_pages=false
727
+ for comp in "${DETECTED_COMPONENTS[@]}"; do
728
+ IFS='|' read -r name path type <<< "$comp"
729
+ if [[ "$type" == "page" ]]; then
730
+ local route=$(echo "$path" | sed 's|.*pages/||' | sed 's|\.tsx$||' | sed 's|\.jsx$||' | sed 's|/index$||')
731
+ echo "| $name | /$route | - |" >> "$WORKFLOW_DIR/state/app-map.md"
732
+ has_pages=true
733
+ fi
734
+ done
735
+
736
+ if [ "$has_pages" = false ]; then
737
+ echo "| - | - | - |" >> "$WORKFLOW_DIR/state/app-map.md"
738
+ fi
739
+
740
+ # Add components
741
+ echo "" >> "$WORKFLOW_DIR/state/app-map.md"
742
+ echo "## Components" >> "$WORKFLOW_DIR/state/app-map.md"
743
+ echo "" >> "$WORKFLOW_DIR/state/app-map.md"
744
+ echo "| Component | Path | Type |" >> "$WORKFLOW_DIR/state/app-map.md"
745
+ echo "|-----------|------|------|" >> "$WORKFLOW_DIR/state/app-map.md"
746
+
747
+ local has_components=false
748
+ for comp in "${DETECTED_COMPONENTS[@]}"; do
749
+ IFS='|' read -r name path type <<< "$comp"
750
+ if [[ "$type" == "component" ]]; then
751
+ echo "| $name | $path | UI |" >> "$WORKFLOW_DIR/state/app-map.md"
752
+ has_components=true
753
+ fi
754
+ done
755
+
756
+ if [ "$has_components" = false ]; then
757
+ echo "| - | - | - |" >> "$WORKFLOW_DIR/state/app-map.md"
758
+ fi
759
+
760
+ # Add modules (NestJS)
761
+ echo "" >> "$WORKFLOW_DIR/state/app-map.md"
762
+ echo "## Modules / Services" >> "$WORKFLOW_DIR/state/app-map.md"
763
+ echo "" >> "$WORKFLOW_DIR/state/app-map.md"
764
+ echo "| Module | Path | Description |" >> "$WORKFLOW_DIR/state/app-map.md"
765
+ echo "|--------|------|-------------|" >> "$WORKFLOW_DIR/state/app-map.md"
766
+
767
+ local has_modules=false
768
+ for comp in "${DETECTED_COMPONENTS[@]}"; do
769
+ IFS='|' read -r name path type <<< "$comp"
770
+ if [[ "$type" == "module" ]]; then
771
+ echo "| $name | $path | - |" >> "$WORKFLOW_DIR/state/app-map.md"
772
+ has_modules=true
773
+ fi
774
+ done
775
+
776
+ if [ "$has_modules" = false ]; then
777
+ echo "| - | - | - |" >> "$WORKFLOW_DIR/state/app-map.md"
778
+ fi
779
+
780
+ echo -e "${GREEN}✓${NC} Created app-map.md with ${#DETECTED_COMPONENTS[@]} entries"
781
+ }
782
+
783
+ generate_decisions() {
784
+ echo -e "${CYAN}Generating decisions.md...${NC}"
785
+
786
+ cat > "$WORKFLOW_DIR/state/decisions.md" << EOF
787
+ # Project Decisions
788
+
789
+ > Coding patterns, architectural decisions, and conventions for $PROJECT_NAME.
790
+
791
+ ## Tech Stack
792
+
793
+ - **Language**: $DETECTED_LANGUAGE
794
+ - **Framework**: $DETECTED_FRAMEWORK
795
+ - **Database**: $(detect_database)
796
+
797
+ ## Conventions
798
+
799
+ $CODING_PATTERNS
800
+
801
+ ## Patterns
802
+
803
+ <!-- Add patterns discovered during development -->
804
+
805
+ ## Architecture Notes
806
+
807
+ <!-- Add architectural decisions here -->
808
+
809
+ EOF
810
+
811
+ echo -e "${GREEN}✓${NC} Created decisions.md"
812
+ }
813
+
814
+ generate_initial_tasks() {
815
+ echo -e "${CYAN}Generating initial tasks...${NC}"
816
+
817
+ # Parse known issues into tasks
818
+ if [ -n "$KNOWN_ISSUES" ]; then
819
+ local task_num=1
820
+ mkdir -p "$WORKFLOW_DIR/changes/onboarding"
821
+
822
+ cat > "$WORKFLOW_DIR/changes/onboarding/tasks.json" << EOF
823
+ {
824
+ "feature": "onboarding-tasks",
825
+ "created": "$(date -Iseconds)",
826
+ "tasks": [
827
+ EOF
828
+
829
+ local first=true
830
+ while IFS= read -r issue; do
831
+ if [ -n "$issue" ] && [[ "$issue" != "- " ]]; then
832
+ local title=$(echo "$issue" | sed 's/^- //')
833
+
834
+ [ "$first" = false ] && echo "," >> "$WORKFLOW_DIR/changes/onboarding/tasks.json"
835
+ first=false
836
+
837
+ cat >> "$WORKFLOW_DIR/changes/onboarding/tasks.json" << EOF
838
+ {
839
+ "id": "TASK-$(printf '%03d' $task_num)",
840
+ "title": "$title",
841
+ "type": "bugfix",
842
+ "status": "pending",
843
+ "priority": "medium",
844
+ "phase": null,
845
+ "dependencies": [],
846
+ "testSteps": [],
847
+ "implemented": false,
848
+ "tested": false,
849
+ "commitHash": null
850
+ }
851
+ EOF
852
+ ((task_num++))
853
+ fi
854
+ done <<< "$KNOWN_ISSUES"
855
+
856
+ echo "
857
+ ]
858
+ }" >> "$WORKFLOW_DIR/changes/onboarding/tasks.json"
859
+
860
+ echo -e "${GREEN}✓${NC} Created $((task_num-1)) initial tasks from known issues"
861
+ fi
862
+ }
863
+
864
+ suggest_skills() {
865
+ echo -e "${CYAN}Suggesting skills...${NC}"
866
+
867
+ local suggested=""
868
+
869
+ case "$DETECTED_FRAMEWORK" in
870
+ "NestJS")
871
+ suggested="nestjs"
872
+ ;;
873
+ "React"|"Next.js"|"React Native")
874
+ suggested="react"
875
+ ;;
876
+ "FastAPI"|"Django"|"Flask")
877
+ suggested="python"
878
+ ;;
879
+ esac
880
+
881
+ if [ -n "$suggested" ]; then
882
+ echo -e "${GREEN}✓${NC} Recommended skill: $suggested"
883
+
884
+ # Update config
885
+ python3 << EOF
886
+ import json
887
+ try:
888
+ with open('$WORKFLOW_DIR/config.json', 'r') as f:
889
+ config = json.load(f)
890
+
891
+ if '$suggested' not in config.get('skills', {}).get('installed', []):
892
+ config.setdefault('skills', {}).setdefault('installed', []).append('$suggested')
893
+
894
+ with open('$WORKFLOW_DIR/config.json', 'w') as f:
895
+ json.dump(config, f, indent=2)
896
+ except Exception as e:
897
+ print(f"Note: Could not update config: {e}")
898
+ EOF
899
+ fi
900
+ }
901
+
902
+ # ============================================================
903
+ # MAIN
904
+ # ============================================================
905
+
906
+ print_summary() {
907
+ echo ""
908
+ echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}"
909
+ echo -e "${GREEN}║ ✅ Project Onboarding Complete! ║${NC}"
910
+ echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}"
911
+ echo ""
912
+ echo -e "${BOLD}Project: $PROJECT_NAME${NC}"
913
+ echo ""
914
+ echo "Detected:"
915
+ echo " • Language: $DETECTED_LANGUAGE"
916
+ echo " • Framework: $DETECTED_FRAMEWORK"
917
+ echo " • Database: $(detect_database)"
918
+ echo " • Components: ${#DETECTED_COMPONENTS[@]}"
919
+ echo ""
920
+ echo "Generated:"
921
+ echo " • .workflow/specs/project.md - Project specification"
922
+ echo " • .workflow/state/stack.md - Tech stack details"
923
+ echo " • .workflow/state/architecture.md - Architecture overview"
924
+ echo " • .workflow/state/testing.md - Testing guide"
925
+ echo " • .workflow/state/app-map.md - Component registry"
926
+ echo " • .workflow/state/decisions.md - Coding patterns"
927
+ [ -n "$KNOWN_ISSUES" ] && echo " • .workflow/changes/onboarding/ - Initial tasks"
928
+ echo ""
929
+ echo -e "${BOLD}Next steps:${NC}"
930
+ echo ""
931
+ echo " 1. Review generated files and fill in details"
932
+ echo " 2. Run /wogi-health to verify setup"
933
+ echo " 3. Run /wogi-ready to see tasks"
934
+ echo " 4. Start working: /wogi-start TASK-001"
935
+ echo ""
936
+ echo -e "${YELLOW}Tip:${NC} The AI now has context about your project!"
937
+ echo " Ask it to analyze code, suggest improvements, or create new features."
938
+ echo ""
939
+ }
940
+
941
+ main() {
942
+ print_header
943
+
944
+ # Check if already onboarded
945
+ if [ -f "$WORKFLOW_DIR/specs/project.md" ] && grep -q "Tech Stack" "$WORKFLOW_DIR/specs/project.md" 2>/dev/null; then
946
+ echo -e "${YELLOW}⚠ This project appears to be already onboarded.${NC}"
947
+ echo ""
948
+ read -p "Re-run onboarding? (y/n): " rerun
949
+ if [[ ! "$rerun" =~ ^[Yy]$ ]]; then
950
+ echo "Onboarding cancelled."
951
+ exit 0
952
+ fi
953
+ echo ""
954
+ fi
955
+
956
+ # Ensure workflow exists
957
+ if [ ! -d "$WORKFLOW_DIR" ]; then
958
+ echo -e "${YELLOW}Workflow not initialized. Running install first...${NC}"
959
+ "$SCRIPT_DIR/flow-install" --quick "$(basename "$(pwd)")"
960
+ echo ""
961
+ fi
962
+
963
+ # Detection phase
964
+ echo -e "${BOLD}━━━ Analyzing Project ━━━${NC}"
965
+ echo ""
966
+
967
+ DETECTED_LANGUAGE=$(detect_language)
968
+ DETECTED_FRAMEWORK=$(detect_framework)
969
+
970
+ echo -e " Language: ${GREEN}$DETECTED_LANGUAGE${NC}"
971
+ echo -e " Framework: ${GREEN}$DETECTED_FRAMEWORK${NC}"
972
+ echo -e " Database: ${GREEN}$(detect_database)${NC}"
973
+ echo ""
974
+
975
+ scan_components
976
+ scan_api_routes
977
+
978
+ echo ""
979
+ echo -e "${BOLD}━━━ Project Interview ━━━${NC}"
980
+ echo ""
981
+
982
+ ask_project_basics
983
+ ask_for_prd
984
+ ask_current_state
985
+ ask_known_issues
986
+ ask_coding_preferences
987
+
988
+ echo -e "${BOLD}━━━ Generating Workflow Files ━━━${NC}"
989
+ echo ""
990
+
991
+ generate_project_spec
992
+ generate_stack_md
993
+ generate_architecture_md
994
+ generate_testing_md
995
+ generate_app_map
996
+ generate_decisions
997
+ generate_initial_tasks
998
+ suggest_skills
999
+
1000
+ # Run project analyzer for hybrid mode
1001
+ echo ""
1002
+ echo -e "${CYAN}Analyzing project for hybrid mode...${NC}"
1003
+ if [ -f "$SCRIPT_DIR/flow-project-analyzer.js" ]; then
1004
+ node "$SCRIPT_DIR/flow-project-analyzer.js" "$PROJECT_ROOT" 2>/dev/null
1005
+ echo -e "${GREEN}✓${NC} Hybrid mode context configured"
1006
+ fi
1007
+
1008
+ # Update config with project name
1009
+ python3 << EOF
1010
+ import json
1011
+ try:
1012
+ with open('$WORKFLOW_DIR/config.json', 'r') as f:
1013
+ config = json.load(f)
1014
+ config['projectName'] = '$PROJECT_NAME'
1015
+ with open('$WORKFLOW_DIR/config.json', 'w') as f:
1016
+ json.dump(config, f, indent=2)
1017
+ except:
1018
+ pass
1019
+ EOF
1020
+
1021
+ print_summary
1022
+ }
1023
+
1024
+ # Handle --help
1025
+ if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
1026
+ echo "Wogi Flow - Project Onboarding"
1027
+ echo ""
1028
+ echo "Analyzes an existing project and sets up the workflow with full context."
1029
+ echo ""
1030
+ echo "Usage: flow onboard"
1031
+ echo ""
1032
+ echo "This will:"
1033
+ echo " 1. Detect your tech stack (language, framework, database)"
1034
+ echo " 2. Scan for components, pages, modules"
1035
+ echo " 3. Ask about your project (PRD, goals, issues)"
1036
+ echo " 4. Generate project.md, app-map.md, decisions.md"
1037
+ echo " 5. Create initial tasks from known issues"
1038
+ echo " 6. Suggest relevant skills to install"
1039
+ exit 0
1040
+ fi
1041
+
1042
+ main "$@"