forge-workflow 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/status.md +1 -1
- package/.claude/settings.local.json +14 -0
- package/AGENTS.md +217 -0
- package/README.md +786 -131
- package/bin/forge.js +1846 -115
- package/docs/TOOLCHAIN.md +760 -0
- package/install.sh +1036 -62
- package/package.json +22 -9
package/install.sh
CHANGED
|
@@ -1,88 +1,1062 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Forge
|
|
2
|
+
# Forge v1.1.0 - Universal AI Agent Workflow Installer
|
|
3
3
|
# https://github.com/harshanandak/forge
|
|
4
|
+
#
|
|
5
|
+
# Interactive installer - select only the agents you use
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# ./install.sh # Interactive mode
|
|
9
|
+
# ./install.sh --quick # Auto-select all agents, use defaults
|
|
10
|
+
# ./install.sh --skip-external # Skip external services configuration
|
|
4
11
|
|
|
5
12
|
set -e
|
|
6
13
|
|
|
14
|
+
# ============================================
|
|
15
|
+
# PARSE CLI FLAGS
|
|
16
|
+
# ============================================
|
|
17
|
+
QUICK_MODE=false
|
|
18
|
+
SKIP_EXTERNAL=false
|
|
19
|
+
for arg in "$@"; do
|
|
20
|
+
case $arg in
|
|
21
|
+
--quick) QUICK_MODE=true ;;
|
|
22
|
+
--skip-external) SKIP_EXTERNAL=true ;;
|
|
23
|
+
--help|-h)
|
|
24
|
+
echo "Forge Installer"
|
|
25
|
+
echo ""
|
|
26
|
+
echo "Usage: ./install.sh [OPTIONS]"
|
|
27
|
+
echo ""
|
|
28
|
+
echo "Options:"
|
|
29
|
+
echo " --quick Auto-select all agents, use defaults for services"
|
|
30
|
+
echo " --skip-external Skip external services configuration"
|
|
31
|
+
echo " --help, -h Show this help message"
|
|
32
|
+
exit 0
|
|
33
|
+
;;
|
|
34
|
+
esac
|
|
35
|
+
done
|
|
36
|
+
|
|
37
|
+
# Cleanup on error
|
|
38
|
+
cleanup_on_error() {
|
|
39
|
+
echo -e "\n${RED}Installation failed. Partial files may remain.${NC}"
|
|
40
|
+
echo "Run 'rm -rf .claude .cursor .windsurf .kilocode .opencode .continue .github .agent .roo .env.local' to clean up."
|
|
41
|
+
}
|
|
42
|
+
trap cleanup_on_error ERR
|
|
43
|
+
|
|
7
44
|
REPO="harshanandak/forge"
|
|
8
45
|
BRANCH="main"
|
|
9
46
|
BASE_URL="https://raw.githubusercontent.com/$REPO/$BRANCH"
|
|
10
47
|
|
|
48
|
+
# Colors for output
|
|
49
|
+
RED='\033[0;31m'
|
|
50
|
+
GREEN='\033[0;32m'
|
|
51
|
+
YELLOW='\033[1;33m'
|
|
52
|
+
BLUE='\033[0;34m'
|
|
53
|
+
CYAN='\033[0;36m'
|
|
54
|
+
NC='\033[0m' # No Color
|
|
55
|
+
|
|
11
56
|
echo ""
|
|
12
|
-
echo "
|
|
13
|
-
echo "
|
|
14
|
-
echo "
|
|
15
|
-
echo "
|
|
16
|
-
echo "
|
|
57
|
+
echo -e "${CYAN} ███████╗ ██████╗ ██████╗ ██████╗ ███████╗${NC}"
|
|
58
|
+
echo -e "${CYAN} ██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝${NC}"
|
|
59
|
+
echo -e "${CYAN} █████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ${NC}"
|
|
60
|
+
echo -e "${CYAN} ██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ${NC}"
|
|
61
|
+
echo -e "${CYAN} ██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗${NC}"
|
|
62
|
+
echo -e "${CYAN} ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝${NC}"
|
|
63
|
+
echo -e "${GREEN} v1.1.0${NC}"
|
|
17
64
|
echo ""
|
|
18
|
-
echo "
|
|
65
|
+
echo -e "${GREEN} Universal AI Agent Workflow${NC}"
|
|
19
66
|
echo ""
|
|
20
67
|
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
mkdir -p .claude/skills/parallel-ai
|
|
26
|
-
mkdir -p .claude/skills/sonarcloud
|
|
27
|
-
mkdir -p .claude/scripts
|
|
28
|
-
mkdir -p docs/research
|
|
29
|
-
|
|
30
|
-
# Download commands
|
|
31
|
-
echo "Downloading workflow commands..."
|
|
32
|
-
for cmd in status research plan dev check ship review merge verify; do
|
|
33
|
-
curl -fsSL "$BASE_URL/.claude/commands/$cmd.md" -o ".claude/commands/$cmd.md"
|
|
34
|
-
echo " ✓ $cmd.md"
|
|
35
|
-
done
|
|
68
|
+
# ============================================
|
|
69
|
+
# PREREQUISITE VALIDATION
|
|
70
|
+
# ============================================
|
|
71
|
+
echo -e "${YELLOW}Checking prerequisites...${NC}"
|
|
36
72
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
echo " ✓ workflow.md"
|
|
73
|
+
PREREQ_WARNINGS=()
|
|
74
|
+
PREREQ_ERRORS=()
|
|
75
|
+
PKG_MANAGER="npm"
|
|
41
76
|
|
|
42
|
-
#
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
77
|
+
# Required: Git
|
|
78
|
+
if ! command -v git &> /dev/null; then
|
|
79
|
+
PREREQ_ERRORS+=("git - Install from https://git-scm.com")
|
|
80
|
+
else
|
|
81
|
+
echo -e " ${GREEN}✓${NC} git $(git --version | cut -d' ' -f3)"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Required: GitHub CLI
|
|
85
|
+
if ! command -v gh &> /dev/null; then
|
|
86
|
+
PREREQ_ERRORS+=("gh (GitHub CLI) - Install from https://cli.github.com")
|
|
87
|
+
else
|
|
88
|
+
echo -e " ${GREEN}✓${NC} gh $(gh --version | head -1 | cut -d' ' -f3)"
|
|
89
|
+
# Check if authenticated
|
|
90
|
+
if ! gh auth status &> /dev/null 2>&1; then
|
|
91
|
+
PREREQ_WARNINGS+=("GitHub CLI not authenticated. Run: gh auth login")
|
|
92
|
+
fi
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Required: Node.js 20+
|
|
96
|
+
if command -v node &> /dev/null; then
|
|
97
|
+
node_version=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
|
|
98
|
+
if [ "$node_version" -lt 20 ]; then
|
|
99
|
+
PREREQ_ERRORS+=("Node.js 20+ required (current: $(node -v))")
|
|
100
|
+
else
|
|
101
|
+
echo -e " ${GREEN}✓${NC} node $(node -v)"
|
|
102
|
+
fi
|
|
103
|
+
else
|
|
104
|
+
PREREQ_ERRORS+=("Node.js 20+ - Install from https://nodejs.org")
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Required: curl (for downloading files)
|
|
108
|
+
if ! command -v curl &> /dev/null; then
|
|
109
|
+
PREREQ_ERRORS+=("curl - Install from your package manager (apt install curl, brew install curl)")
|
|
110
|
+
else
|
|
111
|
+
echo -e " ${GREEN}✓${NC} curl $(curl --version | head -1 | cut -d' ' -f2)"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Detect package manager
|
|
115
|
+
if command -v bun &> /dev/null; then
|
|
116
|
+
PKG_MANAGER="bun"
|
|
117
|
+
echo -e " ${GREEN}✓${NC} bun $(bun --version) (detected as package manager)"
|
|
118
|
+
elif command -v pnpm &> /dev/null; then
|
|
119
|
+
PKG_MANAGER="pnpm"
|
|
120
|
+
echo -e " ${GREEN}✓${NC} pnpm $(pnpm --version) (detected as package manager)"
|
|
121
|
+
elif command -v yarn &> /dev/null; then
|
|
122
|
+
PKG_MANAGER="yarn"
|
|
123
|
+
echo -e " ${GREEN}✓${NC} yarn $(yarn --version) (detected as package manager)"
|
|
124
|
+
elif command -v npm &> /dev/null; then
|
|
125
|
+
PKG_MANAGER="npm"
|
|
126
|
+
echo -e " ${GREEN}✓${NC} npm $(npm --version) (detected as package manager)"
|
|
127
|
+
else
|
|
128
|
+
PREREQ_ERRORS+=("npm, yarn, pnpm, or bun - Install a package manager")
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
# Also detect from lock files if present
|
|
132
|
+
if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
|
|
133
|
+
PKG_MANAGER="bun"
|
|
134
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
135
|
+
PKG_MANAGER="pnpm"
|
|
136
|
+
elif [ -f "yarn.lock" ]; then
|
|
137
|
+
PKG_MANAGER="yarn"
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# Show errors
|
|
141
|
+
if [ ${#PREREQ_ERRORS[@]} -gt 0 ]; then
|
|
142
|
+
echo ""
|
|
143
|
+
echo -e "${RED}❌ Missing required tools:${NC}"
|
|
144
|
+
for err in "${PREREQ_ERRORS[@]}"; do
|
|
145
|
+
echo -e " ${RED}-${NC} $err"
|
|
146
|
+
done
|
|
147
|
+
echo ""
|
|
148
|
+
echo "Please install missing tools and try again."
|
|
149
|
+
exit 1
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# Show warnings
|
|
153
|
+
if [ ${#PREREQ_WARNINGS[@]} -gt 0 ]; then
|
|
154
|
+
echo ""
|
|
155
|
+
echo -e "${YELLOW}⚠️ Warnings:${NC}"
|
|
156
|
+
for warn in "${PREREQ_WARNINGS[@]}"; do
|
|
157
|
+
echo -e " ${YELLOW}-${NC} $warn"
|
|
158
|
+
done
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
echo ""
|
|
162
|
+
echo -e " ${GREEN}Package manager: $PKG_MANAGER${NC}"
|
|
163
|
+
echo ""
|
|
164
|
+
|
|
165
|
+
# ============================================
|
|
166
|
+
# DETECT EXISTING INSTALLATION
|
|
167
|
+
# ============================================
|
|
168
|
+
EXISTING_INSTALL=false
|
|
169
|
+
AGENTS_BACKUP_CREATED=false
|
|
170
|
+
if [ -f "AGENTS.md" ] && [ -d ".claude/commands" ]; then
|
|
171
|
+
EXISTING_INSTALL=true
|
|
172
|
+
echo -e "${YELLOW}Found existing Forge installation.${NC}"
|
|
173
|
+
echo ""
|
|
174
|
+
fi
|
|
48
175
|
|
|
49
|
-
|
|
50
|
-
|
|
176
|
+
# ============================================
|
|
177
|
+
# AGENT SELECTION
|
|
178
|
+
# ============================================
|
|
51
179
|
|
|
52
|
-
#
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
180
|
+
# Parse selection
|
|
181
|
+
INSTALL_CLAUDE=false
|
|
182
|
+
INSTALL_CURSOR=false
|
|
183
|
+
INSTALL_WINDSURF=false
|
|
184
|
+
INSTALL_KILOCODE=false
|
|
185
|
+
INSTALL_ANTIGRAVITY=false
|
|
186
|
+
INSTALL_COPILOT=false
|
|
187
|
+
INSTALL_CONTINUE=false
|
|
188
|
+
INSTALL_OPENCODE=false
|
|
189
|
+
INSTALL_CLINE=false
|
|
190
|
+
INSTALL_ROO=false
|
|
191
|
+
INSTALL_AIDER=false
|
|
192
|
+
|
|
193
|
+
# Track Context7 MCP auto-installation
|
|
194
|
+
CONTEXT7_INSTALLED_CLAUDE=false
|
|
195
|
+
CONTEXT7_INSTALLED_CONTINUE=false
|
|
196
|
+
|
|
197
|
+
if [ "$QUICK_MODE" = true ]; then
|
|
198
|
+
# Quick mode: auto-select all agents
|
|
199
|
+
echo -e "${YELLOW}Quick mode: Installing for all agents...${NC}"
|
|
200
|
+
INSTALL_CLAUDE=true
|
|
201
|
+
INSTALL_CURSOR=true
|
|
202
|
+
INSTALL_WINDSURF=true
|
|
203
|
+
INSTALL_KILOCODE=true
|
|
204
|
+
INSTALL_ANTIGRAVITY=true
|
|
205
|
+
INSTALL_COPILOT=true
|
|
206
|
+
INSTALL_CONTINUE=true
|
|
207
|
+
INSTALL_OPENCODE=true
|
|
208
|
+
INSTALL_CLINE=true
|
|
209
|
+
INSTALL_ROO=true
|
|
210
|
+
INSTALL_AIDER=true
|
|
211
|
+
else
|
|
212
|
+
# Interactive mode: prompt user for selection
|
|
213
|
+
echo -e "${YELLOW}Which AI coding agents do you use?${NC}"
|
|
214
|
+
echo -e "${BLUE}(Enter numbers separated by spaces, or 'all' for everything)${NC}"
|
|
215
|
+
echo ""
|
|
216
|
+
echo " 1) Claude Code - Anthropic's CLI agent"
|
|
217
|
+
echo " 2) Cursor - AI-first code editor"
|
|
218
|
+
echo " 3) Windsurf - Codeium's agentic IDE"
|
|
219
|
+
echo " 4) Kilo Code - VS Code extension"
|
|
220
|
+
echo " 5) Google Antigravity - Google's agent IDE"
|
|
221
|
+
echo " 6) GitHub Copilot - GitHub's AI assistant"
|
|
222
|
+
echo " 7) Continue - Open-source AI assistant"
|
|
223
|
+
echo " 8) OpenCode - Open-source agent"
|
|
224
|
+
echo " 9) Cline - VS Code agent extension"
|
|
225
|
+
echo " 10) Roo Code - Cline fork with modes"
|
|
226
|
+
echo " 11) Aider - Terminal-based agent"
|
|
227
|
+
echo ""
|
|
228
|
+
echo -e " ${GREEN}all) Install for all agents${NC}"
|
|
229
|
+
echo ""
|
|
230
|
+
|
|
231
|
+
read -p "Your selection (e.g., '1 2 3' or 'all'): " selection
|
|
232
|
+
|
|
233
|
+
if [[ "$selection" == "all" ]]; then
|
|
234
|
+
INSTALL_CLAUDE=true
|
|
235
|
+
INSTALL_CURSOR=true
|
|
236
|
+
INSTALL_WINDSURF=true
|
|
237
|
+
INSTALL_KILOCODE=true
|
|
238
|
+
INSTALL_ANTIGRAVITY=true
|
|
239
|
+
INSTALL_COPILOT=true
|
|
240
|
+
INSTALL_CONTINUE=true
|
|
241
|
+
INSTALL_OPENCODE=true
|
|
242
|
+
INSTALL_CLINE=true
|
|
243
|
+
INSTALL_ROO=true
|
|
244
|
+
INSTALL_AIDER=true
|
|
245
|
+
else
|
|
246
|
+
for num in $selection; do
|
|
247
|
+
case $num in
|
|
248
|
+
1) INSTALL_CLAUDE=true ;;
|
|
249
|
+
2) INSTALL_CURSOR=true ;;
|
|
250
|
+
3) INSTALL_WINDSURF=true ;;
|
|
251
|
+
4) INSTALL_KILOCODE=true ;;
|
|
252
|
+
5) INSTALL_ANTIGRAVITY=true ;;
|
|
253
|
+
6) INSTALL_COPILOT=true ;;
|
|
254
|
+
7) INSTALL_CONTINUE=true ;;
|
|
255
|
+
8) INSTALL_OPENCODE=true ;;
|
|
256
|
+
9) INSTALL_CLINE=true ;;
|
|
257
|
+
10) INSTALL_ROO=true ;;
|
|
258
|
+
11) INSTALL_AIDER=true ;;
|
|
259
|
+
esac
|
|
260
|
+
done
|
|
261
|
+
fi
|
|
262
|
+
fi
|
|
263
|
+
|
|
264
|
+
echo ""
|
|
265
|
+
echo -e "${BLUE}Installing Forge workflow...${NC}"
|
|
266
|
+
echo ""
|
|
267
|
+
|
|
268
|
+
# ============================================
|
|
269
|
+
# ALWAYS CREATE: Core directories and AGENTS.md
|
|
270
|
+
# ============================================
|
|
271
|
+
echo "Creating core directories..."
|
|
272
|
+
mkdir -p docs/planning docs/research
|
|
273
|
+
|
|
274
|
+
# Backup existing AGENTS.md before overwriting
|
|
275
|
+
if [ -f "AGENTS.md" ]; then
|
|
276
|
+
cp AGENTS.md AGENTS.md.backup
|
|
277
|
+
AGENTS_BACKUP_CREATED=true
|
|
278
|
+
echo -e " ${YELLOW}Backed up: AGENTS.md -> AGENTS.md.backup${NC}"
|
|
279
|
+
fi
|
|
280
|
+
|
|
281
|
+
# Download universal AGENTS.md
|
|
282
|
+
echo "Downloading AGENTS.md (universal standard)..."
|
|
283
|
+
curl -fsSL "$BASE_URL/AGENTS.md" -o "AGENTS.md"
|
|
284
|
+
echo -e " ${GREEN}Created: AGENTS.md${NC}"
|
|
57
285
|
|
|
58
286
|
# Download documentation
|
|
59
287
|
echo "Downloading documentation..."
|
|
60
|
-
curl -fsSL "$BASE_URL/docs/WORKFLOW.md" -o "docs/WORKFLOW.md"
|
|
61
|
-
|
|
288
|
+
curl -fsSL "$BASE_URL/docs/WORKFLOW.md" -o "docs/WORKFLOW.md" 2>/dev/null || true
|
|
289
|
+
curl -fsSL "$BASE_URL/docs/research/TEMPLATE.md" -o "docs/research/TEMPLATE.md" 2>/dev/null || true
|
|
290
|
+
|
|
291
|
+
# Create PROGRESS.md if not exists
|
|
292
|
+
if [ ! -f "docs/planning/PROGRESS.md" ]; then
|
|
293
|
+
cat > docs/planning/PROGRESS.md << 'EOF'
|
|
294
|
+
# Project Progress
|
|
295
|
+
|
|
296
|
+
## Current Focus
|
|
297
|
+
<!-- What you're working on -->
|
|
298
|
+
|
|
299
|
+
## Completed
|
|
300
|
+
<!-- Completed features -->
|
|
301
|
+
|
|
302
|
+
## Upcoming
|
|
303
|
+
<!-- Next priorities -->
|
|
304
|
+
EOF
|
|
305
|
+
echo -e " ${GREEN}Created: docs/planning/PROGRESS.md${NC}"
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
# ============================================
|
|
309
|
+
# HELPER FUNCTIONS
|
|
310
|
+
# ============================================
|
|
311
|
+
|
|
312
|
+
# Function to strip YAML frontmatter
|
|
313
|
+
strip_frontmatter() {
|
|
314
|
+
sed '1{/^---$/!q};1,/^---$/d;1,/^---$/d' "$1"
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# Function to create symlink or copy (with proper error handling)
|
|
318
|
+
create_link() {
|
|
319
|
+
local source="$1"
|
|
320
|
+
local target="$2"
|
|
321
|
+
local target_dir
|
|
322
|
+
target_dir=$(dirname "$target")
|
|
323
|
+
|
|
324
|
+
# Create target directory if needed
|
|
325
|
+
if [ ! -d "$target_dir" ]; then
|
|
326
|
+
mkdir -p "$target_dir" 2>/dev/null || true
|
|
327
|
+
fi
|
|
328
|
+
|
|
329
|
+
# Remove existing file/link
|
|
330
|
+
rm -f "$target" 2>/dev/null || true
|
|
331
|
+
|
|
332
|
+
# Try symlink first, fallback to copy
|
|
333
|
+
if ln -s "$source" "$target" 2>/dev/null; then
|
|
334
|
+
echo -e " ${GREEN}Linked: $target -> $source${NC}"
|
|
335
|
+
elif cp "$source" "$target" 2>/dev/null; then
|
|
336
|
+
echo -e " ${YELLOW}⚠ Copied (symlinks not supported): $target${NC}"
|
|
337
|
+
else
|
|
338
|
+
echo -e " ${RED}Failed: Could not link or copy $target${NC}"
|
|
339
|
+
fi
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
# Universal SKILL.md content
|
|
343
|
+
SKILL_CONTENT='---
|
|
344
|
+
name: forge-workflow
|
|
345
|
+
description: 9-stage TDD-first workflow for feature development. Use when building features, fixing bugs, or shipping PRs.
|
|
346
|
+
category: Development Workflow
|
|
347
|
+
tags: [tdd, workflow, pr, git, testing]
|
|
348
|
+
tools: [Bash, Read, Write, Edit, Grep, Glob]
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
# Forge Workflow Skill
|
|
352
|
+
|
|
353
|
+
A TDD-first workflow for AI coding agents. Ship features with confidence.
|
|
354
|
+
|
|
355
|
+
## When to Use
|
|
356
|
+
|
|
357
|
+
Automatically invoke this skill when the user wants to:
|
|
358
|
+
- Build a new feature
|
|
359
|
+
- Fix a bug
|
|
360
|
+
- Create a pull request
|
|
361
|
+
- Run the development workflow
|
|
362
|
+
|
|
363
|
+
## 9 Stages
|
|
364
|
+
|
|
365
|
+
| Stage | Command | Description |
|
|
366
|
+
|-------|---------|-------------|
|
|
367
|
+
| 1 | `/status` | Check current context, active work, recent completions |
|
|
368
|
+
| 2 | `/research` | Deep research with web search, document to docs/research/ |
|
|
369
|
+
| 3 | `/plan` | Create implementation plan, branch, OpenSpec if strategic |
|
|
370
|
+
| 4 | `/dev` | TDD development (RED-GREEN-REFACTOR cycles) |
|
|
371
|
+
| 5 | `/check` | Validation (type/lint/security/tests) |
|
|
372
|
+
| 6 | `/ship` | Create PR with full documentation |
|
|
373
|
+
| 7 | `/review` | Address ALL PR feedback |
|
|
374
|
+
| 8 | `/merge` | Update docs, merge PR, cleanup |
|
|
375
|
+
| 9 | `/verify` | Final documentation verification |
|
|
376
|
+
|
|
377
|
+
## Workflow Flow
|
|
378
|
+
|
|
379
|
+
```
|
|
380
|
+
/status -> /research -> /plan -> /dev -> /check -> /ship -> /review -> /merge -> /verify
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Core Principles
|
|
384
|
+
|
|
385
|
+
- **TDD-First**: Write tests BEFORE implementation (RED-GREEN-REFACTOR)
|
|
386
|
+
- **Research-First**: Understand before building, document decisions
|
|
387
|
+
- **Security Built-In**: OWASP Top 10 analysis for every feature
|
|
388
|
+
- **Documentation Progressive**: Update at each stage, verify at end
|
|
389
|
+
'
|
|
390
|
+
|
|
391
|
+
# ============================================
|
|
392
|
+
# CLAUDE CODE
|
|
393
|
+
# ============================================
|
|
394
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
395
|
+
echo ""
|
|
396
|
+
echo -e "${CYAN}Setting up Claude Code...${NC}"
|
|
397
|
+
|
|
398
|
+
mkdir -p .claude/commands .claude/rules .claude/skills/forge-workflow .claude/scripts
|
|
399
|
+
|
|
400
|
+
# Download commands
|
|
401
|
+
for cmd in status research plan dev check ship review merge verify; do
|
|
402
|
+
curl -fsSL "$BASE_URL/.claude/commands/$cmd.md" -o ".claude/commands/$cmd.md" 2>/dev/null || true
|
|
403
|
+
done
|
|
404
|
+
echo -e " ${GREEN}Downloaded: 9 workflow commands${NC}"
|
|
405
|
+
|
|
406
|
+
# Download rules
|
|
407
|
+
curl -fsSL "$BASE_URL/.claude/rules/workflow.md" -o ".claude/rules/workflow.md" 2>/dev/null || true
|
|
408
|
+
echo -e " ${GREEN}Downloaded: workflow rules${NC}"
|
|
409
|
+
|
|
410
|
+
# Download scripts
|
|
411
|
+
curl -fsSL "$BASE_URL/.claude/scripts/load-env.sh" -o ".claude/scripts/load-env.sh" 2>/dev/null || true
|
|
412
|
+
chmod +x .claude/scripts/load-env.sh 2>/dev/null || true
|
|
413
|
+
|
|
414
|
+
# Create SKILL.md
|
|
415
|
+
echo "$SKILL_CONTENT" > .claude/skills/forge-workflow/SKILL.md
|
|
416
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
417
|
+
|
|
418
|
+
# Create .mcp.json with Context7 MCP (auto-install for Claude Code)
|
|
419
|
+
if [ ! -f ".mcp.json" ]; then
|
|
420
|
+
cat > .mcp.json << 'MCP_EOF'
|
|
421
|
+
{
|
|
422
|
+
"mcpServers": {
|
|
423
|
+
"context7": {
|
|
424
|
+
"command": "npx",
|
|
425
|
+
"args": ["-y", "@upstash/context7-mcp@latest"]
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
MCP_EOF
|
|
430
|
+
echo -e " ${GREEN}Created: .mcp.json with Context7 MCP${NC}"
|
|
431
|
+
CONTEXT7_INSTALLED_CLAUDE=true
|
|
432
|
+
else
|
|
433
|
+
echo -e " ${YELLOW}Skipped: .mcp.json already exists${NC}"
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
# Link CLAUDE.md -> AGENTS.md
|
|
437
|
+
create_link "AGENTS.md" "CLAUDE.md"
|
|
438
|
+
fi
|
|
439
|
+
|
|
440
|
+
# ============================================
|
|
441
|
+
# CURSOR
|
|
442
|
+
# ============================================
|
|
443
|
+
if [ "$INSTALL_CURSOR" = true ]; then
|
|
444
|
+
echo ""
|
|
445
|
+
echo -e "${CYAN}Setting up Cursor...${NC}"
|
|
446
|
+
|
|
447
|
+
mkdir -p .cursor/rules .cursor/skills/forge-workflow
|
|
448
|
+
|
|
449
|
+
# Create workflow.mdc rule
|
|
450
|
+
cat > .cursor/rules/forge-workflow.mdc << 'MDC_EOF'
|
|
451
|
+
---
|
|
452
|
+
description: Forge 9-Stage TDD Workflow
|
|
453
|
+
alwaysApply: true
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
# Forge Workflow Commands
|
|
457
|
+
|
|
458
|
+
Use these commands via `/command-name`:
|
|
459
|
+
|
|
460
|
+
1. `/status` - Check current context, active work, recent completions
|
|
461
|
+
2. `/research` - Deep research with web search, document to docs/research/
|
|
462
|
+
3. `/plan` - Create implementation plan, branch, tracking
|
|
463
|
+
4. `/dev` - TDD development (RED-GREEN-REFACTOR cycles)
|
|
464
|
+
5. `/check` - Validation (type/lint/security/tests)
|
|
465
|
+
6. `/ship` - Create PR with full documentation
|
|
466
|
+
7. `/review` - Address ALL PR feedback
|
|
467
|
+
8. `/merge` - Update docs, merge PR, cleanup
|
|
468
|
+
9. `/verify` - Final documentation verification
|
|
469
|
+
|
|
470
|
+
See AGENTS.md for full workflow details.
|
|
471
|
+
MDC_EOF
|
|
472
|
+
echo -e " ${GREEN}Created: .cursor/rules/forge-workflow.mdc${NC}"
|
|
473
|
+
|
|
474
|
+
# Create SKILL.md
|
|
475
|
+
echo "$SKILL_CONTENT" > .cursor/skills/forge-workflow/SKILL.md
|
|
476
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
477
|
+
|
|
478
|
+
# Link .cursorrules -> AGENTS.md
|
|
479
|
+
create_link "AGENTS.md" ".cursorrules"
|
|
480
|
+
fi
|
|
481
|
+
|
|
482
|
+
# ============================================
|
|
483
|
+
# WINDSURF
|
|
484
|
+
# ============================================
|
|
485
|
+
if [ "$INSTALL_WINDSURF" = true ]; then
|
|
486
|
+
echo ""
|
|
487
|
+
echo -e "${CYAN}Setting up Windsurf...${NC}"
|
|
488
|
+
|
|
489
|
+
mkdir -p .windsurf/workflows .windsurf/rules .windsurf/skills/forge-workflow
|
|
490
|
+
|
|
491
|
+
# Convert commands (strip YAML frontmatter)
|
|
492
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
493
|
+
for cmd in .claude/commands/*.md; do
|
|
494
|
+
[ -f "$cmd" ] || continue
|
|
495
|
+
filename=$(basename "$cmd")
|
|
496
|
+
strip_frontmatter "$cmd" > ".windsurf/workflows/$filename" 2>/dev/null || cp "$cmd" ".windsurf/workflows/$filename"
|
|
497
|
+
done
|
|
498
|
+
echo -e " ${GREEN}Converted: 9 workflow commands${NC}"
|
|
62
499
|
|
|
63
|
-
|
|
64
|
-
|
|
500
|
+
# Copy rules
|
|
501
|
+
cp .claude/rules/workflow.md .windsurf/rules/workflow.md 2>/dev/null || true
|
|
502
|
+
fi
|
|
65
503
|
|
|
504
|
+
# Create SKILL.md
|
|
505
|
+
echo "$SKILL_CONTENT" > .windsurf/skills/forge-workflow/SKILL.md
|
|
506
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
507
|
+
|
|
508
|
+
# Link .windsurfrules -> AGENTS.md
|
|
509
|
+
create_link "AGENTS.md" ".windsurfrules"
|
|
510
|
+
fi
|
|
511
|
+
|
|
512
|
+
# ============================================
|
|
513
|
+
# KILO CODE
|
|
514
|
+
# ============================================
|
|
515
|
+
if [ "$INSTALL_KILOCODE" = true ]; then
|
|
516
|
+
echo ""
|
|
517
|
+
echo -e "${CYAN}Setting up Kilo Code...${NC}"
|
|
518
|
+
|
|
519
|
+
mkdir -p .kilocode/workflows .kilocode/rules .kilocode/skills/forge-workflow
|
|
520
|
+
|
|
521
|
+
# Convert commands (strip YAML frontmatter)
|
|
522
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
523
|
+
for cmd in .claude/commands/*.md; do
|
|
524
|
+
[ -f "$cmd" ] || continue
|
|
525
|
+
filename=$(basename "$cmd")
|
|
526
|
+
strip_frontmatter "$cmd" > ".kilocode/workflows/$filename" 2>/dev/null || cp "$cmd" ".kilocode/workflows/$filename"
|
|
527
|
+
done
|
|
528
|
+
echo -e " ${GREEN}Converted: 9 workflow commands${NC}"
|
|
529
|
+
|
|
530
|
+
# Copy rules
|
|
531
|
+
cp .claude/rules/workflow.md .kilocode/rules/workflow.md 2>/dev/null || true
|
|
532
|
+
fi
|
|
533
|
+
|
|
534
|
+
# Create SKILL.md
|
|
535
|
+
echo "$SKILL_CONTENT" > .kilocode/skills/forge-workflow/SKILL.md
|
|
536
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
537
|
+
fi
|
|
538
|
+
|
|
539
|
+
# ============================================
|
|
540
|
+
# GOOGLE ANTIGRAVITY
|
|
541
|
+
# ============================================
|
|
542
|
+
if [ "$INSTALL_ANTIGRAVITY" = true ]; then
|
|
543
|
+
echo ""
|
|
544
|
+
echo -e "${CYAN}Setting up Google Antigravity...${NC}"
|
|
545
|
+
|
|
546
|
+
mkdir -p .agent/workflows .agent/rules .agent/skills/forge-workflow
|
|
547
|
+
|
|
548
|
+
# Convert commands (strip YAML frontmatter)
|
|
549
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
550
|
+
for cmd in .claude/commands/*.md; do
|
|
551
|
+
[ -f "$cmd" ] || continue
|
|
552
|
+
filename=$(basename "$cmd")
|
|
553
|
+
strip_frontmatter "$cmd" > ".agent/workflows/$filename" 2>/dev/null || cp "$cmd" ".agent/workflows/$filename"
|
|
554
|
+
done
|
|
555
|
+
echo -e " ${GREEN}Converted: 9 workflow commands${NC}"
|
|
556
|
+
|
|
557
|
+
# Copy rules
|
|
558
|
+
cp .claude/rules/workflow.md .agent/rules/workflow.md 2>/dev/null || true
|
|
559
|
+
fi
|
|
560
|
+
|
|
561
|
+
# Create SKILL.md
|
|
562
|
+
echo "$SKILL_CONTENT" > .agent/skills/forge-workflow/SKILL.md
|
|
563
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
564
|
+
|
|
565
|
+
# Link GEMINI.md -> AGENTS.md
|
|
566
|
+
create_link "AGENTS.md" "GEMINI.md"
|
|
567
|
+
fi
|
|
568
|
+
|
|
569
|
+
# ============================================
|
|
570
|
+
# GITHUB COPILOT
|
|
571
|
+
# ============================================
|
|
572
|
+
if [ "$INSTALL_COPILOT" = true ]; then
|
|
573
|
+
echo ""
|
|
574
|
+
echo -e "${CYAN}Setting up GitHub Copilot...${NC}"
|
|
575
|
+
|
|
576
|
+
mkdir -p .github/prompts .github/instructions
|
|
577
|
+
|
|
578
|
+
# Convert commands to .prompt.md
|
|
579
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
580
|
+
for cmd in .claude/commands/*.md; do
|
|
581
|
+
[ -f "$cmd" ] || continue
|
|
582
|
+
basename_noext=$(basename "$cmd" .md)
|
|
583
|
+
filename="${basename_noext}.prompt.md"
|
|
584
|
+
strip_frontmatter "$cmd" > ".github/prompts/$filename" 2>/dev/null || cp "$cmd" ".github/prompts/$filename"
|
|
585
|
+
done
|
|
586
|
+
echo -e " ${GREEN}Converted: 9 workflow prompts${NC}"
|
|
587
|
+
fi
|
|
588
|
+
|
|
589
|
+
# Link copilot-instructions.md -> AGENTS.md
|
|
590
|
+
create_link "AGENTS.md" ".github/copilot-instructions.md"
|
|
591
|
+
fi
|
|
592
|
+
|
|
593
|
+
# ============================================
|
|
594
|
+
# CONTINUE
|
|
595
|
+
# ============================================
|
|
596
|
+
if [ "$INSTALL_CONTINUE" = true ]; then
|
|
597
|
+
echo ""
|
|
598
|
+
echo -e "${CYAN}Setting up Continue...${NC}"
|
|
599
|
+
|
|
600
|
+
mkdir -p .continue/prompts .continue/skills/forge-workflow
|
|
601
|
+
|
|
602
|
+
# Convert commands to .prompt with invokable: true
|
|
603
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
604
|
+
for cmd in .claude/commands/*.md; do
|
|
605
|
+
[ -f "$cmd" ] || continue
|
|
606
|
+
basename_noext=$(basename "$cmd" .md)
|
|
607
|
+
filename="${basename_noext}.prompt"
|
|
608
|
+
{
|
|
609
|
+
echo "---"
|
|
610
|
+
echo "name: $basename_noext"
|
|
611
|
+
echo "description: Forge workflow command - $basename_noext"
|
|
612
|
+
echo "invokable: true"
|
|
613
|
+
echo "---"
|
|
614
|
+
echo ""
|
|
615
|
+
strip_frontmatter "$cmd" 2>/dev/null || cat "$cmd"
|
|
616
|
+
} > ".continue/prompts/$filename"
|
|
617
|
+
done
|
|
618
|
+
echo -e " ${GREEN}Converted: 9 workflow prompts${NC}"
|
|
619
|
+
fi
|
|
620
|
+
|
|
621
|
+
# Create SKILL.md
|
|
622
|
+
echo "$SKILL_CONTENT" > .continue/skills/forge-workflow/SKILL.md
|
|
623
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
624
|
+
|
|
625
|
+
# Create config.yaml with Context7 MCP (auto-install for Continue)
|
|
626
|
+
if [ ! -f ".continue/config.yaml" ]; then
|
|
627
|
+
cat > .continue/config.yaml << 'CONTINUE_EOF'
|
|
628
|
+
# Continue Configuration
|
|
629
|
+
# https://docs.continue.dev/customize/deep-dives/configuration
|
|
630
|
+
|
|
631
|
+
name: Forge Workflow
|
|
632
|
+
version: "1.0"
|
|
633
|
+
|
|
634
|
+
# MCP Servers for enhanced capabilities
|
|
635
|
+
mcpServers:
|
|
636
|
+
- name: context7
|
|
637
|
+
command: npx
|
|
638
|
+
args:
|
|
639
|
+
- "-y"
|
|
640
|
+
- "@upstash/context7-mcp@latest"
|
|
641
|
+
|
|
642
|
+
# Rules loaded from .continuerules
|
|
643
|
+
CONTINUE_EOF
|
|
644
|
+
echo -e " ${GREEN}Created: config.yaml with Context7 MCP${NC}"
|
|
645
|
+
CONTEXT7_INSTALLED_CONTINUE=true
|
|
646
|
+
else
|
|
647
|
+
echo -e " ${YELLOW}Skipped: config.yaml already exists${NC}"
|
|
648
|
+
fi
|
|
649
|
+
fi
|
|
650
|
+
|
|
651
|
+
# ============================================
|
|
652
|
+
# OPENCODE
|
|
653
|
+
# ============================================
|
|
654
|
+
if [ "$INSTALL_OPENCODE" = true ]; then
|
|
655
|
+
echo ""
|
|
656
|
+
echo -e "${CYAN}Setting up OpenCode...${NC}"
|
|
657
|
+
|
|
658
|
+
mkdir -p .opencode/commands .opencode/skills/forge-workflow
|
|
659
|
+
|
|
660
|
+
# Copy commands as-is (same YAML format)
|
|
661
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
662
|
+
cp .claude/commands/*.md .opencode/commands/ 2>/dev/null || true
|
|
663
|
+
echo -e " ${GREEN}Copied: 9 workflow commands${NC}"
|
|
664
|
+
fi
|
|
665
|
+
|
|
666
|
+
# Create SKILL.md
|
|
667
|
+
echo "$SKILL_CONTENT" > .opencode/skills/forge-workflow/SKILL.md
|
|
668
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
669
|
+
fi
|
|
670
|
+
|
|
671
|
+
# ============================================
|
|
672
|
+
# CLINE
|
|
673
|
+
# ============================================
|
|
674
|
+
if [ "$INSTALL_CLINE" = true ]; then
|
|
675
|
+
echo ""
|
|
676
|
+
echo -e "${CYAN}Setting up Cline...${NC}"
|
|
677
|
+
|
|
678
|
+
mkdir -p .cline/skills/forge-workflow
|
|
679
|
+
|
|
680
|
+
# Create SKILL.md
|
|
681
|
+
echo "$SKILL_CONTENT" > .cline/skills/forge-workflow/SKILL.md
|
|
682
|
+
echo -e " ${GREEN}Created: forge-workflow skill${NC}"
|
|
683
|
+
|
|
684
|
+
# Link .clinerules -> AGENTS.md
|
|
685
|
+
create_link "AGENTS.md" ".clinerules"
|
|
686
|
+
fi
|
|
687
|
+
|
|
688
|
+
# ============================================
|
|
689
|
+
# ROO CODE
|
|
690
|
+
# ============================================
|
|
691
|
+
if [ "$INSTALL_ROO" = true ]; then
|
|
692
|
+
echo ""
|
|
693
|
+
echo -e "${CYAN}Setting up Roo Code...${NC}"
|
|
694
|
+
|
|
695
|
+
mkdir -p .roo/commands
|
|
696
|
+
|
|
697
|
+
# Convert commands (strip YAML frontmatter)
|
|
698
|
+
if [ "$INSTALL_CLAUDE" = true ]; then
|
|
699
|
+
for cmd in .claude/commands/*.md; do
|
|
700
|
+
[ -f "$cmd" ] || continue
|
|
701
|
+
filename=$(basename "$cmd")
|
|
702
|
+
strip_frontmatter "$cmd" > ".roo/commands/$filename" 2>/dev/null || cp "$cmd" ".roo/commands/$filename"
|
|
703
|
+
done
|
|
704
|
+
echo -e " ${GREEN}Converted: 9 workflow commands${NC}"
|
|
705
|
+
fi
|
|
706
|
+
|
|
707
|
+
# Link .clinerules -> AGENTS.md (Roo uses same as Cline)
|
|
708
|
+
if [ ! -f ".clinerules" ]; then
|
|
709
|
+
create_link "AGENTS.md" ".clinerules"
|
|
710
|
+
fi
|
|
711
|
+
fi
|
|
712
|
+
|
|
713
|
+
# ============================================
|
|
714
|
+
# AIDER
|
|
715
|
+
# ============================================
|
|
716
|
+
if [ "$INSTALL_AIDER" = true ]; then
|
|
717
|
+
echo ""
|
|
718
|
+
echo -e "${CYAN}Setting up Aider...${NC}"
|
|
719
|
+
|
|
720
|
+
# Aider uses AGENTS.md via config
|
|
721
|
+
# Create .aider.conf.yml if not exists
|
|
722
|
+
if [ ! -f ".aider.conf.yml" ]; then
|
|
723
|
+
cat > .aider.conf.yml << 'EOF'
|
|
724
|
+
# Aider configuration
|
|
725
|
+
# Read AGENTS.md for workflow instructions
|
|
726
|
+
read:
|
|
727
|
+
- AGENTS.md
|
|
728
|
+
- docs/WORKFLOW.md
|
|
729
|
+
EOF
|
|
730
|
+
echo -e " ${GREEN}Created: .aider.conf.yml${NC}"
|
|
731
|
+
else
|
|
732
|
+
echo -e " ${YELLOW}Skipped: .aider.conf.yml already exists${NC}"
|
|
733
|
+
echo -e " ${YELLOW}Add 'read: [AGENTS.md]' to your config manually${NC}"
|
|
734
|
+
fi
|
|
735
|
+
fi
|
|
736
|
+
|
|
737
|
+
# ============================================
|
|
738
|
+
# EXTERNAL SERVICES CONFIGURATION
|
|
739
|
+
# ============================================
|
|
740
|
+
|
|
741
|
+
# Skip external services if flag is set
|
|
742
|
+
if [ "$SKIP_EXTERNAL" = true ]; then
|
|
743
|
+
echo ""
|
|
744
|
+
echo -e "${YELLOW}Skipping external services configuration (--skip-external)${NC}"
|
|
745
|
+
echo "You can configure them later by editing .env.local"
|
|
746
|
+
configure_services="n"
|
|
747
|
+
elif [ "$QUICK_MODE" = true ]; then
|
|
748
|
+
# Quick mode: use defaults without prompting
|
|
749
|
+
echo ""
|
|
750
|
+
echo -e "${YELLOW}Quick mode: Using default service configuration...${NC}"
|
|
751
|
+
configure_services="y"
|
|
752
|
+
else
|
|
753
|
+
echo ""
|
|
754
|
+
echo -e "${YELLOW}=============================================="
|
|
755
|
+
echo -e " EXTERNAL SERVICES (Optional)"
|
|
756
|
+
echo -e "==============================================${NC}"
|
|
757
|
+
echo ""
|
|
758
|
+
echo "Would you like to configure external services?"
|
|
759
|
+
echo "(You can also add them later to .env.local)"
|
|
760
|
+
echo ""
|
|
761
|
+
read -p "Configure external services? (y/n): " configure_services
|
|
762
|
+
fi
|
|
763
|
+
|
|
764
|
+
if [[ "$configure_services" == "y" || "$configure_services" == "Y" || "$configure_services" == "yes" ]]; then
|
|
765
|
+
|
|
766
|
+
# Initialize .env.local with header if new
|
|
767
|
+
if [ ! -f ".env.local" ]; then
|
|
768
|
+
cat > .env.local << 'ENV_HEADER'
|
|
769
|
+
# Forge Workflow Configuration
|
|
770
|
+
# Generated by install.sh
|
|
771
|
+
|
|
772
|
+
ENV_HEADER
|
|
773
|
+
fi
|
|
774
|
+
|
|
775
|
+
# ============================================
|
|
776
|
+
# CODE REVIEW TOOL SELECTION
|
|
777
|
+
# ============================================
|
|
778
|
+
if [ "$QUICK_MODE" = true ]; then
|
|
779
|
+
# Quick mode: use default (option 1)
|
|
780
|
+
code_review_choice=1
|
|
781
|
+
else
|
|
782
|
+
echo ""
|
|
783
|
+
echo -e "${CYAN}Code Review Tool${NC}"
|
|
784
|
+
echo "Select your code review integration:"
|
|
785
|
+
echo ""
|
|
786
|
+
echo -e " ${GREEN}1)${NC} GitHub Code Quality (FREE, built-in) ${GREEN}[RECOMMENDED]${NC}"
|
|
787
|
+
echo " Zero setup - uses GitHub's built-in code quality features"
|
|
788
|
+
echo ""
|
|
789
|
+
echo -e " ${GREEN}2)${NC} CodeRabbit (FREE for open source)"
|
|
790
|
+
echo " AI-powered reviews - install GitHub App at https://coderabbit.ai"
|
|
791
|
+
echo ""
|
|
792
|
+
echo " 3) Greptile (Paid - \$99+/mo)"
|
|
793
|
+
echo " Enterprise code review - https://greptile.com"
|
|
794
|
+
echo ""
|
|
795
|
+
echo " 4) Skip code review integration"
|
|
796
|
+
echo ""
|
|
797
|
+
read -p "Select [1]: " code_review_choice
|
|
798
|
+
code_review_choice=${code_review_choice:-1}
|
|
799
|
+
fi
|
|
800
|
+
|
|
801
|
+
case $code_review_choice in
|
|
802
|
+
1)
|
|
803
|
+
echo "CODE_REVIEW_TOOL=github-code-quality" >> .env.local
|
|
804
|
+
echo -e " ${GREEN}✓${NC} Using GitHub Code Quality (FREE)"
|
|
805
|
+
;;
|
|
806
|
+
2)
|
|
807
|
+
echo "CODE_REVIEW_TOOL=coderabbit" >> .env.local
|
|
808
|
+
echo "# CodeRabbit: Install GitHub App at https://coderabbit.ai" >> .env.local
|
|
809
|
+
echo -e " ${GREEN}✓${NC} Using CodeRabbit - Install the GitHub App to activate"
|
|
810
|
+
echo -e " ${BLUE}https://coderabbit.ai${NC}"
|
|
811
|
+
;;
|
|
812
|
+
3)
|
|
813
|
+
echo ""
|
|
814
|
+
read -s -p " Enter Greptile API key: " greptile_key
|
|
815
|
+
echo ""
|
|
816
|
+
if [ -n "$greptile_key" ]; then
|
|
817
|
+
echo "CODE_REVIEW_TOOL=greptile" >> .env.local
|
|
818
|
+
echo "GREPTILE_API_KEY=$greptile_key" >> .env.local
|
|
819
|
+
echo -e " ${GREEN}✓${NC} Greptile configured"
|
|
820
|
+
else
|
|
821
|
+
echo "CODE_REVIEW_TOOL=none" >> .env.local
|
|
822
|
+
echo -e " ${YELLOW}Skipped${NC} - No API key provided"
|
|
823
|
+
fi
|
|
824
|
+
;;
|
|
825
|
+
4|*)
|
|
826
|
+
echo "CODE_REVIEW_TOOL=none" >> .env.local
|
|
827
|
+
echo -e " ${YELLOW}Skipped${NC} code review integration"
|
|
828
|
+
;;
|
|
829
|
+
esac
|
|
830
|
+
|
|
831
|
+
# ============================================
|
|
832
|
+
# CODE QUALITY TOOL SELECTION
|
|
833
|
+
# ============================================
|
|
834
|
+
if [ "$QUICK_MODE" = true ]; then
|
|
835
|
+
# Quick mode: use default (option 1)
|
|
836
|
+
code_quality_choice=1
|
|
837
|
+
else
|
|
838
|
+
echo ""
|
|
839
|
+
echo -e "${CYAN}Code Quality Tool${NC}"
|
|
840
|
+
echo "Select your code quality/security scanner:"
|
|
841
|
+
echo ""
|
|
842
|
+
echo -e " ${GREEN}1)${NC} ESLint only (FREE, built-in) ${GREEN}[RECOMMENDED]${NC}"
|
|
843
|
+
echo " No external server required - uses project's linting"
|
|
844
|
+
echo ""
|
|
845
|
+
echo " 2) SonarCloud (50k LoC free, cloud-hosted)"
|
|
846
|
+
echo " Get token: https://sonarcloud.io/account/security"
|
|
847
|
+
echo ""
|
|
848
|
+
echo " 3) SonarQube Community (FREE, self-hosted, unlimited LoC)"
|
|
849
|
+
echo " Run: docker run -d --name sonarqube -p 9000:9000 sonarqube:community"
|
|
850
|
+
echo ""
|
|
851
|
+
echo " 4) Skip code quality integration"
|
|
852
|
+
echo ""
|
|
853
|
+
read -p "Select [1]: " code_quality_choice
|
|
854
|
+
code_quality_choice=${code_quality_choice:-1}
|
|
855
|
+
fi
|
|
856
|
+
|
|
857
|
+
case $code_quality_choice in
|
|
858
|
+
1)
|
|
859
|
+
echo "CODE_QUALITY_TOOL=eslint" >> .env.local
|
|
860
|
+
echo -e " ${GREEN}✓${NC} Using ESLint (built-in)"
|
|
861
|
+
;;
|
|
862
|
+
2)
|
|
863
|
+
echo ""
|
|
864
|
+
read -s -p " Enter SonarCloud token: " sonar_token
|
|
865
|
+
echo ""
|
|
866
|
+
read -p " Enter SonarCloud organization: " sonar_org
|
|
867
|
+
read -p " Enter SonarCloud project key: " sonar_project
|
|
868
|
+
if [ -n "$sonar_token" ]; then
|
|
869
|
+
echo "CODE_QUALITY_TOOL=sonarcloud" >> .env.local
|
|
870
|
+
echo "SONAR_TOKEN=$sonar_token" >> .env.local
|
|
871
|
+
[ -n "$sonar_org" ] && echo "SONAR_ORGANIZATION=$sonar_org" >> .env.local
|
|
872
|
+
[ -n "$sonar_project" ] && echo "SONAR_PROJECT_KEY=$sonar_project" >> .env.local
|
|
873
|
+
echo -e " ${GREEN}✓${NC} SonarCloud configured"
|
|
874
|
+
else
|
|
875
|
+
echo "CODE_QUALITY_TOOL=eslint" >> .env.local
|
|
876
|
+
echo -e " ${YELLOW}Falling back to ESLint${NC}"
|
|
877
|
+
fi
|
|
878
|
+
;;
|
|
879
|
+
3)
|
|
880
|
+
echo ""
|
|
881
|
+
echo -e " ${BLUE}SonarQube Self-Hosted Setup:${NC}"
|
|
882
|
+
echo " docker run -d --name sonarqube -p 9000:9000 sonarqube:community"
|
|
883
|
+
echo " Access: http://localhost:9000 (admin/admin)"
|
|
884
|
+
echo ""
|
|
885
|
+
read -p " Enter SonarQube URL [http://localhost:9000]: " sonarqube_url
|
|
886
|
+
sonarqube_url=${sonarqube_url:-http://localhost:9000}
|
|
887
|
+
read -s -p " Enter SonarQube token (optional): " sonarqube_token
|
|
888
|
+
echo ""
|
|
889
|
+
|
|
890
|
+
echo "CODE_QUALITY_TOOL=sonarqube" >> .env.local
|
|
891
|
+
echo "SONARQUBE_URL=$sonarqube_url" >> .env.local
|
|
892
|
+
[ -n "$sonarqube_token" ] && echo "SONARQUBE_TOKEN=$sonarqube_token" >> .env.local
|
|
893
|
+
echo "# SonarQube: docker run -d --name sonarqube -p 9000:9000 sonarqube:community" >> .env.local
|
|
894
|
+
echo -e " ${GREEN}✓${NC} SonarQube self-hosted configured"
|
|
895
|
+
;;
|
|
896
|
+
4|*)
|
|
897
|
+
echo "CODE_QUALITY_TOOL=none" >> .env.local
|
|
898
|
+
echo -e " ${YELLOW}Skipped${NC} code quality integration"
|
|
899
|
+
;;
|
|
900
|
+
esac
|
|
901
|
+
|
|
902
|
+
# ============================================
|
|
903
|
+
# RESEARCH TOOL SELECTION
|
|
904
|
+
# ============================================
|
|
905
|
+
if [ "$QUICK_MODE" = true ]; then
|
|
906
|
+
# Quick mode: use default (option 1)
|
|
907
|
+
research_choice=1
|
|
908
|
+
else
|
|
909
|
+
echo ""
|
|
910
|
+
echo -e "${CYAN}Research Tool${NC}"
|
|
911
|
+
echo "Select your research tool for /research stage:"
|
|
912
|
+
echo ""
|
|
913
|
+
echo -e " ${GREEN}1)${NC} Manual research only ${GREEN}[DEFAULT]${NC}"
|
|
914
|
+
echo " Use web browser and codebase exploration"
|
|
915
|
+
echo ""
|
|
916
|
+
echo " 2) Parallel AI (comprehensive web research)"
|
|
917
|
+
echo " Get key: https://platform.parallel.ai"
|
|
918
|
+
echo ""
|
|
919
|
+
read -p "Select [1]: " research_choice
|
|
920
|
+
research_choice=${research_choice:-1}
|
|
921
|
+
fi
|
|
922
|
+
|
|
923
|
+
case $research_choice in
|
|
924
|
+
2)
|
|
925
|
+
echo ""
|
|
926
|
+
read -s -p " Enter Parallel AI API key: " parallel_key
|
|
927
|
+
echo ""
|
|
928
|
+
if [ -n "$parallel_key" ]; then
|
|
929
|
+
echo "PARALLEL_API_KEY=$parallel_key" >> .env.local
|
|
930
|
+
echo -e " ${GREEN}✓${NC} Parallel AI configured"
|
|
931
|
+
else
|
|
932
|
+
echo -e " ${YELLOW}Skipped${NC} - No API key provided"
|
|
933
|
+
fi
|
|
934
|
+
;;
|
|
935
|
+
1|*)
|
|
936
|
+
echo -e " ${GREEN}✓${NC} Using manual research"
|
|
937
|
+
;;
|
|
938
|
+
esac
|
|
939
|
+
|
|
940
|
+
# ============================================
|
|
941
|
+
# CONTEXT7 MCP - Library Documentation
|
|
942
|
+
# ============================================
|
|
943
|
+
echo ""
|
|
944
|
+
echo -e "${CYAN}Context7 MCP - Library Documentation${NC}"
|
|
945
|
+
echo "Provides up-to-date library docs for AI coding agents."
|
|
946
|
+
echo ""
|
|
947
|
+
|
|
948
|
+
# Show what was auto-installed
|
|
949
|
+
if [ "$CONTEXT7_INSTALLED_CLAUDE" = true ]; then
|
|
950
|
+
echo -e " ${GREEN}✓${NC} Auto-installed for Claude Code (.mcp.json)"
|
|
951
|
+
fi
|
|
952
|
+
if [ "$CONTEXT7_INSTALLED_CONTINUE" = true ]; then
|
|
953
|
+
echo -e " ${GREEN}✓${NC} Auto-installed for Continue (.continue/config.yaml)"
|
|
954
|
+
fi
|
|
955
|
+
|
|
956
|
+
# Check for agents that need manual setup
|
|
957
|
+
NEEDS_MANUAL_MCP=false
|
|
958
|
+
if [ "$INSTALL_CURSOR" = true ]; then
|
|
959
|
+
echo -e " ${YELLOW}!${NC} Cursor: Configure via Cursor Settings > MCP"
|
|
960
|
+
NEEDS_MANUAL_MCP=true
|
|
961
|
+
fi
|
|
962
|
+
if [ "$INSTALL_WINDSURF" = true ]; then
|
|
963
|
+
echo -e " ${YELLOW}!${NC} Windsurf: Install via Plugin Store"
|
|
964
|
+
NEEDS_MANUAL_MCP=true
|
|
965
|
+
fi
|
|
966
|
+
if [ "$INSTALL_CLINE" = true ]; then
|
|
967
|
+
echo -e " ${YELLOW}!${NC} Cline: Install via MCP Marketplace"
|
|
968
|
+
NEEDS_MANUAL_MCP=true
|
|
969
|
+
fi
|
|
970
|
+
|
|
971
|
+
if [ "$NEEDS_MANUAL_MCP" = true ]; then
|
|
972
|
+
echo ""
|
|
973
|
+
echo " Package: @upstash/context7-mcp@latest"
|
|
974
|
+
echo " Docs: https://github.com/upstash/context7-mcp"
|
|
975
|
+
fi
|
|
976
|
+
|
|
977
|
+
# ============================================
|
|
978
|
+
# Save package manager preference
|
|
979
|
+
# ============================================
|
|
980
|
+
echo "" >> .env.local
|
|
981
|
+
echo "# Package Manager (auto-detected)" >> .env.local
|
|
982
|
+
echo "PKG_MANAGER=$PKG_MANAGER" >> .env.local
|
|
983
|
+
|
|
984
|
+
# Add .env.local to .gitignore if not present
|
|
985
|
+
if [ -f ".gitignore" ]; then
|
|
986
|
+
if ! grep -q "\.env\.local" .gitignore; then
|
|
987
|
+
echo "" >> .gitignore
|
|
988
|
+
echo "# Local environment variables" >> .gitignore
|
|
989
|
+
echo ".env.local" >> .gitignore
|
|
990
|
+
fi
|
|
991
|
+
else
|
|
992
|
+
echo "# Local environment variables" > .gitignore
|
|
993
|
+
echo ".env.local" >> .gitignore
|
|
994
|
+
fi
|
|
995
|
+
|
|
996
|
+
echo ""
|
|
997
|
+
echo -e " ${GREEN}Configuration saved to .env.local${NC}"
|
|
998
|
+
echo -e " ${GREEN}Added .env.local to .gitignore${NC}"
|
|
999
|
+
|
|
1000
|
+
else
|
|
1001
|
+
echo ""
|
|
1002
|
+
echo "Skipping external services. You can configure them later by editing .env.local"
|
|
1003
|
+
fi
|
|
1004
|
+
|
|
1005
|
+
# ============================================
|
|
1006
|
+
# SUCCESS MESSAGE
|
|
1007
|
+
# ============================================
|
|
1008
|
+
echo ""
|
|
1009
|
+
echo -e "${GREEN}=============================================="
|
|
1010
|
+
echo -e " Forge v1.1.0 Setup Complete!"
|
|
1011
|
+
echo -e "==============================================${NC}"
|
|
1012
|
+
echo ""
|
|
1013
|
+
|
|
1014
|
+
# Show backup notification if created
|
|
1015
|
+
if [ "$AGENTS_BACKUP_CREATED" = true ]; then
|
|
1016
|
+
echo -e "${YELLOW}Note: Previous AGENTS.md backed up to AGENTS.md.backup${NC}"
|
|
1017
|
+
echo ""
|
|
1018
|
+
fi
|
|
1019
|
+
|
|
1020
|
+
# Show existing installation upgrade notice
|
|
1021
|
+
if [ "$EXISTING_INSTALL" = true ]; then
|
|
1022
|
+
echo -e "${GREEN}Existing installation upgraded successfully.${NC}"
|
|
1023
|
+
echo ""
|
|
1024
|
+
fi
|
|
1025
|
+
|
|
1026
|
+
# Show what was installed
|
|
1027
|
+
echo "Installed for:"
|
|
1028
|
+
[ "$INSTALL_CLAUDE" = true ] && echo -e " ${GREEN}*${NC} Claude Code (.claude/commands/)"
|
|
1029
|
+
[ "$INSTALL_CURSOR" = true ] && echo -e " ${GREEN}*${NC} Cursor (.cursor/rules/)"
|
|
1030
|
+
[ "$INSTALL_WINDSURF" = true ] && echo -e " ${GREEN}*${NC} Windsurf (.windsurf/workflows/)"
|
|
1031
|
+
[ "$INSTALL_KILOCODE" = true ] && echo -e " ${GREEN}*${NC} Kilo Code (.kilocode/workflows/)"
|
|
1032
|
+
[ "$INSTALL_ANTIGRAVITY" = true ] && echo -e " ${GREEN}*${NC} Google Antigravity (.agent/workflows/)"
|
|
1033
|
+
[ "$INSTALL_COPILOT" = true ] && echo -e " ${GREEN}*${NC} GitHub Copilot (.github/prompts/)"
|
|
1034
|
+
[ "$INSTALL_CONTINUE" = true ] && echo -e " ${GREEN}*${NC} Continue (.continue/prompts/)"
|
|
1035
|
+
[ "$INSTALL_OPENCODE" = true ] && echo -e " ${GREEN}*${NC} OpenCode (.opencode/commands/)"
|
|
1036
|
+
[ "$INSTALL_CLINE" = true ] && echo -e " ${GREEN}*${NC} Cline (.clinerules)"
|
|
1037
|
+
[ "$INSTALL_ROO" = true ] && echo -e " ${GREEN}*${NC} Roo Code (.roo/commands/)"
|
|
1038
|
+
[ "$INSTALL_AIDER" = true ] && echo -e " ${GREEN}*${NC} Aider (.aider.conf.yml)"
|
|
1039
|
+
|
|
1040
|
+
echo ""
|
|
1041
|
+
echo -e "${CYAN}=============================================="
|
|
1042
|
+
echo -e " GET STARTED"
|
|
1043
|
+
echo -e "==============================================${NC}"
|
|
1044
|
+
echo ""
|
|
1045
|
+
echo " /status - Check current context"
|
|
1046
|
+
echo " /research - Start researching a feature"
|
|
1047
|
+
echo " /plan - Create implementation plan"
|
|
1048
|
+
echo " /dev - Start TDD development"
|
|
1049
|
+
echo " /check - Run validation"
|
|
1050
|
+
echo " /ship - Create pull request"
|
|
1051
|
+
echo " /review - Address PR feedback"
|
|
1052
|
+
echo " /merge - Merge and cleanup"
|
|
1053
|
+
echo " /verify - Final documentation check"
|
|
66
1054
|
echo ""
|
|
67
|
-
echo "
|
|
1055
|
+
echo " Full guide: docs/WORKFLOW.md"
|
|
68
1056
|
echo ""
|
|
69
|
-
echo "
|
|
70
|
-
echo "
|
|
71
|
-
echo "
|
|
72
|
-
echo "│ /status - Check current context │"
|
|
73
|
-
echo "│ /research - Start researching a feature │"
|
|
74
|
-
echo "│ /plan - Create implementation plan │"
|
|
75
|
-
echo "│ /dev - Start TDD development │"
|
|
76
|
-
echo "│ /check - Run validation │"
|
|
77
|
-
echo "│ /ship - Create pull request │"
|
|
78
|
-
echo "│ /review - Address PR feedback │"
|
|
79
|
-
echo "│ /merge - Merge and cleanup │"
|
|
80
|
-
echo "│ /verify - Final documentation check │"
|
|
81
|
-
echo "├─────────────────────────────────────────────────────────┤"
|
|
82
|
-
echo "│ Full guide: docs/WORKFLOW.md │"
|
|
83
|
-
echo "│ Research template: docs/research/TEMPLATE.md │"
|
|
84
|
-
echo "└─────────────────────────────────────────────────────────┘"
|
|
1057
|
+
echo "Optional tools:"
|
|
1058
|
+
echo " - Beads: $PKG_MANAGER install -g @beads/bd && bd init"
|
|
1059
|
+
echo " - OpenSpec: $PKG_MANAGER install -g @fission-ai/openspec"
|
|
85
1060
|
echo ""
|
|
86
|
-
echo "
|
|
87
|
-
echo " See: https://github.com/beads-ai/beads-cli"
|
|
1061
|
+
echo -e "${CYAN}Package manager detected: $PKG_MANAGER${NC}"
|
|
88
1062
|
echo ""
|