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.
- package/.workflow/agents/reviewer.md +81 -0
- package/.workflow/agents/security.md +94 -0
- package/.workflow/agents/story-writer.md +58 -0
- package/.workflow/bridges/base-bridge.js +395 -0
- package/.workflow/bridges/claude-bridge.js +434 -0
- package/.workflow/bridges/index.js +130 -0
- package/.workflow/lib/assumption-detector.js +481 -0
- package/.workflow/lib/config-substitution.js +371 -0
- package/.workflow/lib/failure-categories.js +478 -0
- package/.workflow/state/app-map.md.template +15 -0
- package/.workflow/state/architecture.md.template +24 -0
- package/.workflow/state/component-index.json.template +5 -0
- package/.workflow/state/decisions.md.template +15 -0
- package/.workflow/state/feedback-patterns.md.template +9 -0
- package/.workflow/state/knowledge-sync.json.template +6 -0
- package/.workflow/state/progress.md.template +14 -0
- package/.workflow/state/ready.json.template +7 -0
- package/.workflow/state/request-log.md.template +14 -0
- package/.workflow/state/session-state.json.template +11 -0
- package/.workflow/state/stack.md.template +33 -0
- package/.workflow/state/testing.md.template +36 -0
- package/.workflow/templates/claude-md.hbs +257 -0
- package/.workflow/templates/correction-report.md +67 -0
- package/.workflow/templates/gemini-md.hbs +52 -0
- package/README.md +1802 -0
- package/bin/flow +205 -0
- package/lib/index.js +33 -0
- package/lib/installer.js +467 -0
- package/lib/release-channel.js +269 -0
- package/lib/skill-registry.js +526 -0
- package/lib/upgrader.js +401 -0
- package/lib/utils.js +305 -0
- package/package.json +64 -0
- package/scripts/flow +985 -0
- package/scripts/flow-adaptive-learning.js +1259 -0
- package/scripts/flow-aggregate.js +488 -0
- package/scripts/flow-archive +133 -0
- package/scripts/flow-auto-context.js +1015 -0
- package/scripts/flow-auto-learn.js +615 -0
- package/scripts/flow-bridge.js +223 -0
- package/scripts/flow-browser-suggest.js +316 -0
- package/scripts/flow-bug.js +247 -0
- package/scripts/flow-cascade.js +711 -0
- package/scripts/flow-changelog +85 -0
- package/scripts/flow-checkpoint.js +483 -0
- package/scripts/flow-cli.js +403 -0
- package/scripts/flow-code-intelligence.js +760 -0
- package/scripts/flow-complexity.js +502 -0
- package/scripts/flow-config-set.js +152 -0
- package/scripts/flow-constants.js +157 -0
- package/scripts/flow-context +152 -0
- package/scripts/flow-context-init.js +482 -0
- package/scripts/flow-context-monitor.js +384 -0
- package/scripts/flow-context-scoring.js +886 -0
- package/scripts/flow-correct.js +458 -0
- package/scripts/flow-damage-control.js +985 -0
- package/scripts/flow-deps +101 -0
- package/scripts/flow-diff.js +700 -0
- package/scripts/flow-done +151 -0
- package/scripts/flow-done.js +489 -0
- package/scripts/flow-durable-session.js +1541 -0
- package/scripts/flow-entropy-monitor.js +345 -0
- package/scripts/flow-export-profile +349 -0
- package/scripts/flow-export-scanner.js +1046 -0
- package/scripts/flow-figma-confirm.js +400 -0
- package/scripts/flow-figma-extract.js +496 -0
- package/scripts/flow-figma-generate.js +683 -0
- package/scripts/flow-figma-index.js +909 -0
- package/scripts/flow-figma-match.js +617 -0
- package/scripts/flow-figma-mcp-server.js +518 -0
- package/scripts/flow-figma-pipeline.js +414 -0
- package/scripts/flow-file-ops.js +301 -0
- package/scripts/flow-gate-confidence.js +825 -0
- package/scripts/flow-guided-edit.js +659 -0
- package/scripts/flow-health +185 -0
- package/scripts/flow-health.js +413 -0
- package/scripts/flow-hooks.js +556 -0
- package/scripts/flow-http-client.js +249 -0
- package/scripts/flow-hybrid-detect.js +167 -0
- package/scripts/flow-hybrid-interactive.js +591 -0
- package/scripts/flow-hybrid-test.js +152 -0
- package/scripts/flow-import-profile +439 -0
- package/scripts/flow-init +253 -0
- package/scripts/flow-instruction-richness.js +827 -0
- package/scripts/flow-jira-integration.js +579 -0
- package/scripts/flow-knowledge-router.js +522 -0
- package/scripts/flow-knowledge-sync.js +589 -0
- package/scripts/flow-linear-integration.js +631 -0
- package/scripts/flow-links.js +774 -0
- package/scripts/flow-log-manager.js +559 -0
- package/scripts/flow-loop-enforcer.js +1246 -0
- package/scripts/flow-loop-retry-learning.js +630 -0
- package/scripts/flow-lsp.js +923 -0
- package/scripts/flow-map-index +348 -0
- package/scripts/flow-map-sync +201 -0
- package/scripts/flow-memory-blocks.js +668 -0
- package/scripts/flow-memory-compactor.js +350 -0
- package/scripts/flow-memory-db.js +1110 -0
- package/scripts/flow-memory-sync.js +484 -0
- package/scripts/flow-metrics.js +353 -0
- package/scripts/flow-migrate-ids.js +370 -0
- package/scripts/flow-model-adapter.js +802 -0
- package/scripts/flow-model-router.js +884 -0
- package/scripts/flow-models.js +1231 -0
- package/scripts/flow-morning.js +517 -0
- package/scripts/flow-multi-approach.js +660 -0
- package/scripts/flow-new-feature +86 -0
- package/scripts/flow-onboard +1042 -0
- package/scripts/flow-orchestrate-llm.js +459 -0
- package/scripts/flow-orchestrate.js +3592 -0
- package/scripts/flow-output.js +123 -0
- package/scripts/flow-parallel-detector.js +399 -0
- package/scripts/flow-parallel-dispatch.js +987 -0
- package/scripts/flow-parallel.js +428 -0
- package/scripts/flow-pattern-enforcer.js +600 -0
- package/scripts/flow-prd-manager.js +282 -0
- package/scripts/flow-progress.js +323 -0
- package/scripts/flow-project-analyzer.js +975 -0
- package/scripts/flow-prompt-composer.js +487 -0
- package/scripts/flow-providers.js +1381 -0
- package/scripts/flow-queue.js +308 -0
- package/scripts/flow-ready +82 -0
- package/scripts/flow-ready.js +189 -0
- package/scripts/flow-regression.js +396 -0
- package/scripts/flow-response-parser.js +450 -0
- package/scripts/flow-resume.js +284 -0
- package/scripts/flow-rules-sync.js +439 -0
- package/scripts/flow-run-trace.js +718 -0
- package/scripts/flow-safety.js +587 -0
- package/scripts/flow-search +104 -0
- package/scripts/flow-security.js +481 -0
- package/scripts/flow-session-end +106 -0
- package/scripts/flow-session-end.js +437 -0
- package/scripts/flow-session-state.js +671 -0
- package/scripts/flow-setup-hooks +216 -0
- package/scripts/flow-setup-hooks.js +377 -0
- package/scripts/flow-skill-create.js +329 -0
- package/scripts/flow-skill-creator.js +572 -0
- package/scripts/flow-skill-generator.js +1046 -0
- package/scripts/flow-skill-learn.js +880 -0
- package/scripts/flow-skill-matcher.js +578 -0
- package/scripts/flow-spec-generator.js +820 -0
- package/scripts/flow-stack-wizard.js +895 -0
- package/scripts/flow-standup +162 -0
- package/scripts/flow-start +74 -0
- package/scripts/flow-start.js +235 -0
- package/scripts/flow-status +110 -0
- package/scripts/flow-status.js +301 -0
- package/scripts/flow-step-browser.js +83 -0
- package/scripts/flow-step-changelog.js +217 -0
- package/scripts/flow-step-comments.js +306 -0
- package/scripts/flow-step-complexity.js +234 -0
- package/scripts/flow-step-coverage.js +218 -0
- package/scripts/flow-step-knowledge.js +193 -0
- package/scripts/flow-step-pr-tests.js +364 -0
- package/scripts/flow-step-regression.js +89 -0
- package/scripts/flow-step-review.js +516 -0
- package/scripts/flow-step-security.js +162 -0
- package/scripts/flow-step-silent-failures.js +290 -0
- package/scripts/flow-step-simplifier.js +346 -0
- package/scripts/flow-story +105 -0
- package/scripts/flow-story.js +500 -0
- package/scripts/flow-suspend.js +252 -0
- package/scripts/flow-sync-daemon.js +654 -0
- package/scripts/flow-task-analyzer.js +606 -0
- package/scripts/flow-team-dashboard.js +748 -0
- package/scripts/flow-team-sync.js +752 -0
- package/scripts/flow-team.js +977 -0
- package/scripts/flow-tech-options.js +528 -0
- package/scripts/flow-templates.js +812 -0
- package/scripts/flow-tiered-learning.js +728 -0
- package/scripts/flow-trace +204 -0
- package/scripts/flow-transcript-chunking.js +1106 -0
- package/scripts/flow-transcript-digest.js +7918 -0
- package/scripts/flow-transcript-language.js +465 -0
- package/scripts/flow-transcript-parsing.js +1085 -0
- package/scripts/flow-transcript-stories.js +2194 -0
- package/scripts/flow-update-map +224 -0
- package/scripts/flow-utils.js +2242 -0
- package/scripts/flow-verification.js +644 -0
- package/scripts/flow-verify.js +1177 -0
- package/scripts/flow-voice-input.js +638 -0
- package/scripts/flow-watch +168 -0
- package/scripts/flow-workflow-steps.js +521 -0
- package/scripts/flow-workflow.js +1029 -0
- package/scripts/flow-worktree.js +489 -0
- package/scripts/hooks/adapters/base-adapter.js +102 -0
- package/scripts/hooks/adapters/claude-code.js +359 -0
- package/scripts/hooks/adapters/index.js +79 -0
- package/scripts/hooks/core/component-check.js +341 -0
- package/scripts/hooks/core/index.js +35 -0
- package/scripts/hooks/core/loop-check.js +241 -0
- package/scripts/hooks/core/session-context.js +294 -0
- package/scripts/hooks/core/task-gate.js +177 -0
- package/scripts/hooks/core/validation.js +230 -0
- package/scripts/hooks/entry/claude-code/post-tool-use.js +65 -0
- package/scripts/hooks/entry/claude-code/pre-tool-use.js +89 -0
- package/scripts/hooks/entry/claude-code/session-end.js +87 -0
- package/scripts/hooks/entry/claude-code/session-start.js +46 -0
- package/scripts/hooks/entry/claude-code/stop.js +43 -0
- package/scripts/postinstall.js +139 -0
- package/templates/browser-test-flow.json +56 -0
- package/templates/bug-report.md +43 -0
- package/templates/component-detail.md +42 -0
- package/templates/component.stories.tsx +49 -0
- package/templates/context/constraints.md +83 -0
- package/templates/context/conventions.md +177 -0
- package/templates/context/stack.md +60 -0
- package/templates/correction-report.md +90 -0
- package/templates/feature-proposal.md +35 -0
- package/templates/hybrid/_base.md +254 -0
- package/templates/hybrid/_patterns.md +45 -0
- package/templates/hybrid/create-component.md +127 -0
- package/templates/hybrid/create-file.md +56 -0
- package/templates/hybrid/create-hook.md +145 -0
- package/templates/hybrid/create-service.md +70 -0
- package/templates/hybrid/fix-bug.md +33 -0
- package/templates/hybrid/modify-file.md +55 -0
- package/templates/story.md +68 -0
- package/templates/task.json +56 -0
- 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 "$@"
|