forge-workflow 0.0.4 → 0.0.6

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