forge-workflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/check.md +145 -0
- package/.claude/commands/dev.md +184 -0
- package/.claude/commands/merge.md +170 -0
- package/.claude/commands/plan.md +141 -0
- package/.claude/commands/research.md +125 -0
- package/.claude/commands/review.md +393 -0
- package/.claude/commands/ship.md +120 -0
- package/.claude/commands/sonarcloud.md +156 -0
- package/.claude/commands/status.md +76 -0
- package/.claude/commands/verify.md +185 -0
- package/.claude/rules/workflow.md +98 -0
- package/.claude/scripts/load-env.sh +32 -0
- package/.claude/skills/parallel-ai/README.md +135 -0
- package/.claude/skills/parallel-ai/SKILL.md +94 -0
- package/.claude/skills/parallel-ai/api-reference.md +141 -0
- package/.claude/skills/parallel-ai/quick-reference.md +100 -0
- package/.claude/skills/parallel-ai/research-workflows.md +77 -0
- package/.claude/skills/sonarcloud/SKILL.md +154 -0
- package/.claude/skills/sonarcloud/reference.md +466 -0
- package/README.md +205 -0
- package/bin/forge.js +140 -0
- package/docs/WORKFLOW.md +251 -0
- package/docs/research/TEMPLATE.md +292 -0
- package/install.sh +88 -0
- package/package.json +36 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
# SonarCloud API Reference
|
|
2
|
+
|
|
3
|
+
Complete parameter and response documentation for all endpoints.
|
|
4
|
+
|
|
5
|
+
## Issues (`/api/issues/search`)
|
|
6
|
+
|
|
7
|
+
### Parameters
|
|
8
|
+
|
|
9
|
+
| Parameter | Description | Values |
|
|
10
|
+
| --------- | ----------- | ------ |
|
|
11
|
+
| `organization` | Org key | Required |
|
|
12
|
+
| `componentKeys` | Project key(s) | Comma-separated |
|
|
13
|
+
| `types` | Issue types | `BUG`, `VULNERABILITY`, `CODE_SMELL`, `SECURITY_HOTSPOT` |
|
|
14
|
+
| `severities` | Severity | `BLOCKER`, `CRITICAL`, `MAJOR`, `MINOR`, `INFO` |
|
|
15
|
+
| `statuses` | Status | `OPEN`, `CONFIRMED`, `REOPENED`, `RESOLVED`, `CLOSED` |
|
|
16
|
+
| `resolutions` | Resolution | `FALSE-POSITIVE`, `WONTFIX`, `FIXED`, `REMOVED` |
|
|
17
|
+
| `resolved` | Filter | `true`, `false` |
|
|
18
|
+
| `branch` | Branch name | String |
|
|
19
|
+
| `pullRequest` | PR number | String |
|
|
20
|
+
| `createdAfter` | Date filter | `YYYY-MM-DD` |
|
|
21
|
+
| `createdBefore` | Date filter | `YYYY-MM-DD` |
|
|
22
|
+
| `languages` | Languages | `java`, `typescript`, `python`, etc. |
|
|
23
|
+
| `rules` | Rule keys | Comma-separated |
|
|
24
|
+
| `tags` | Issue tags | Comma-separated |
|
|
25
|
+
| `assignees` | Assigned users | Comma-separated |
|
|
26
|
+
| `authors` | Code authors | Comma-separated |
|
|
27
|
+
| `scopes` | Scope | `MAIN`, `TEST` |
|
|
28
|
+
| `inNewCodePeriod` | New code only | `true`, `false` |
|
|
29
|
+
| `facets` | Aggregations | `severities`, `types`, `rules`, `tags` |
|
|
30
|
+
| `p` | Page number | Integer (1-based) |
|
|
31
|
+
| `ps` | Page size | Integer (max 500) |
|
|
32
|
+
| `s` | Sort field | `CREATION_DATE`, `UPDATE_DATE`, `SEVERITY` |
|
|
33
|
+
| `asc` | Sort order | `true`, `false` |
|
|
34
|
+
|
|
35
|
+
### Response
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"total": 150,
|
|
40
|
+
"paging": { "pageIndex": 1, "pageSize": 100, "total": 150 },
|
|
41
|
+
"issues": [{
|
|
42
|
+
"key": "AYx...",
|
|
43
|
+
"rule": "typescript:S1234",
|
|
44
|
+
"severity": "MAJOR",
|
|
45
|
+
"component": "my-project:src/file.ts",
|
|
46
|
+
"line": 42,
|
|
47
|
+
"message": "Remove this unused variable.",
|
|
48
|
+
"type": "CODE_SMELL",
|
|
49
|
+
"status": "OPEN",
|
|
50
|
+
"effort": "5min",
|
|
51
|
+
"tags": ["unused"],
|
|
52
|
+
"creationDate": "2024-01-15T10:30:00+0000"
|
|
53
|
+
}],
|
|
54
|
+
"facets": [{ "property": "severities", "values": [{ "val": "MAJOR", "count": 50 }] }]
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Metrics (`/api/measures/component`)
|
|
61
|
+
|
|
62
|
+
### Parameters
|
|
63
|
+
|
|
64
|
+
| Parameter | Description |
|
|
65
|
+
| --------- | ----------- |
|
|
66
|
+
| `component` | Project key (required) |
|
|
67
|
+
| `metricKeys` | Metrics (comma-separated) |
|
|
68
|
+
| `branch` | Branch name |
|
|
69
|
+
| `pullRequest` | PR number |
|
|
70
|
+
| `additionalFields` | `metrics`, `periods` |
|
|
71
|
+
|
|
72
|
+
### All Metric Keys
|
|
73
|
+
|
|
74
|
+
| Category | Keys |
|
|
75
|
+
| -------- | ---- |
|
|
76
|
+
| Size | `ncloc`, `lines`, `statements`, `functions`, `classes`, `files` |
|
|
77
|
+
| Complexity | `complexity`, `cognitive_complexity` |
|
|
78
|
+
| Coverage | `coverage`, `line_coverage`, `branch_coverage`, `tests`, `test_success_density`, `uncovered_lines`, `uncovered_conditions` |
|
|
79
|
+
| Duplication | `duplicated_lines`, `duplicated_lines_density`, `duplicated_blocks`, `duplicated_files` |
|
|
80
|
+
| Issues | `bugs`, `vulnerabilities`, `code_smells`, `security_hotspots` |
|
|
81
|
+
| Ratings | `sqale_rating`, `reliability_rating`, `security_rating`, `security_review_rating` (1=A to 5=E) |
|
|
82
|
+
| Debt | `sqale_index` (minutes), `sqale_debt_ratio` (%) |
|
|
83
|
+
| Quality Gate | `alert_status`, `quality_gate_details` |
|
|
84
|
+
| New Code | `new_bugs`, `new_vulnerabilities`, `new_code_smells`, `new_coverage`, `new_duplicated_lines_density` |
|
|
85
|
+
|
|
86
|
+
### Response
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"component": {
|
|
91
|
+
"key": "my-project",
|
|
92
|
+
"name": "My Project",
|
|
93
|
+
"measures": [
|
|
94
|
+
{ "metric": "bugs", "value": "12" },
|
|
95
|
+
{ "metric": "coverage", "value": "78.5" },
|
|
96
|
+
{ "metric": "sqale_rating", "value": "2.0" }
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Quality Gate (`/api/qualitygates/project_status`)
|
|
105
|
+
|
|
106
|
+
### Parameters
|
|
107
|
+
|
|
108
|
+
| Parameter | Description |
|
|
109
|
+
| --------- | ----------- |
|
|
110
|
+
| `projectKey` | Project key (required) |
|
|
111
|
+
| `branch` | Branch name |
|
|
112
|
+
| `pullRequest` | PR number |
|
|
113
|
+
|
|
114
|
+
### Response
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"projectStatus": {
|
|
119
|
+
"status": "ERROR",
|
|
120
|
+
"conditions": [{
|
|
121
|
+
"status": "ERROR",
|
|
122
|
+
"metricKey": "new_coverage",
|
|
123
|
+
"comparator": "LT",
|
|
124
|
+
"errorThreshold": "80",
|
|
125
|
+
"actualValue": "65.3"
|
|
126
|
+
}],
|
|
127
|
+
"ignoredConditions": false
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Security Hotspots (`/api/hotspots/search`)
|
|
135
|
+
|
|
136
|
+
### Parameters
|
|
137
|
+
|
|
138
|
+
| Parameter | Description | Values |
|
|
139
|
+
| --------- | ----------- | ------ |
|
|
140
|
+
| `projectKey` | Project key | Required |
|
|
141
|
+
| `branch` | Branch name | String |
|
|
142
|
+
| `pullRequest` | PR number | String |
|
|
143
|
+
| `status` | Status | `TO_REVIEW`, `REVIEWED` |
|
|
144
|
+
| `resolution` | Resolution | `FIXED`, `SAFE`, `ACKNOWLEDGED` |
|
|
145
|
+
| `inNewCodePeriod` | New code | `true`, `false` |
|
|
146
|
+
| `p` / `ps` | Pagination | Integer |
|
|
147
|
+
|
|
148
|
+
### Response
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"paging": { "total": 5 },
|
|
153
|
+
"hotspots": [{
|
|
154
|
+
"key": "...",
|
|
155
|
+
"component": "my-project:src/auth.ts",
|
|
156
|
+
"securityCategory": "sql-injection",
|
|
157
|
+
"vulnerabilityProbability": "HIGH",
|
|
158
|
+
"status": "TO_REVIEW",
|
|
159
|
+
"message": "Make sure this SQL query is safe.",
|
|
160
|
+
"line": 42
|
|
161
|
+
}]
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Projects (`/api/projects/search`)
|
|
168
|
+
|
|
169
|
+
### Parameters
|
|
170
|
+
|
|
171
|
+
| Parameter | Description |
|
|
172
|
+
| --------- | ----------- |
|
|
173
|
+
| `organization` | Org key |
|
|
174
|
+
| `q` | Search query |
|
|
175
|
+
| `qualifiers` | `TRK` (project), `APP` |
|
|
176
|
+
| `p` / `ps` | Pagination |
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Analysis History (`/api/project_analyses/search`)
|
|
181
|
+
|
|
182
|
+
### Parameters
|
|
183
|
+
|
|
184
|
+
| Parameter | Description |
|
|
185
|
+
| --------- | ----------- |
|
|
186
|
+
| `project` | Project key |
|
|
187
|
+
| `branch` | Branch name |
|
|
188
|
+
| `from` / `to` | Date range |
|
|
189
|
+
| `p` / `ps` | Pagination |
|
|
190
|
+
|
|
191
|
+
### Response
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"analyses": [{
|
|
196
|
+
"key": "AYx...",
|
|
197
|
+
"date": "2024-01-15T10:30:00+0000",
|
|
198
|
+
"projectVersion": "1.2.0",
|
|
199
|
+
"revision": "abc123def",
|
|
200
|
+
"events": [{ "category": "VERSION", "name": "1.2.0" }]
|
|
201
|
+
}]
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Metrics History (`/api/measures/search_history`)
|
|
208
|
+
|
|
209
|
+
### Parameters
|
|
210
|
+
|
|
211
|
+
| Parameter | Description |
|
|
212
|
+
| --------- | ----------- |
|
|
213
|
+
| `component` | Project key |
|
|
214
|
+
| `metrics` | Metric keys |
|
|
215
|
+
| `from` / `to` | Date range (`YYYY-MM-DD`) |
|
|
216
|
+
| `branch` | Branch name |
|
|
217
|
+
| `p` / `ps` | Pagination |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Component Tree (`/api/components/tree`)
|
|
222
|
+
|
|
223
|
+
### Parameters
|
|
224
|
+
|
|
225
|
+
| Parameter | Description |
|
|
226
|
+
| --------- | ----------- |
|
|
227
|
+
| `component` | Project key |
|
|
228
|
+
| `branch` | Branch name |
|
|
229
|
+
| `qualifiers` | `FIL` (file), `DIR`, `UTS` (test) |
|
|
230
|
+
| `metricKeys` | Metrics per component |
|
|
231
|
+
| `strategy` | `children`, `leaves`, `all` |
|
|
232
|
+
| `q` | Search query |
|
|
233
|
+
| `s` / `asc` | Sort field / ascending |
|
|
234
|
+
| `metricSort` | Metric to sort by |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Duplications (`/api/duplications/show`)
|
|
239
|
+
|
|
240
|
+
Get detailed duplicate code blocks for a specific file.
|
|
241
|
+
|
|
242
|
+
### Parameters
|
|
243
|
+
|
|
244
|
+
| Parameter | Description |
|
|
245
|
+
| --------- | ----------- |
|
|
246
|
+
| `key` | File key (required) - format: `project-key:path/to/file.ts` |
|
|
247
|
+
| `branch` | Branch name |
|
|
248
|
+
| `pullRequest` | PR number |
|
|
249
|
+
|
|
250
|
+
### Response
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"duplications": [
|
|
255
|
+
{
|
|
256
|
+
"blocks": [
|
|
257
|
+
{
|
|
258
|
+
"from": 1,
|
|
259
|
+
"size": 20,
|
|
260
|
+
"_ref": "1"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"from": 50,
|
|
264
|
+
"size": 20,
|
|
265
|
+
"_ref": "2"
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
}
|
|
269
|
+
],
|
|
270
|
+
"files": {
|
|
271
|
+
"1": {
|
|
272
|
+
"key": "my-project:src/utils/helpers.ts",
|
|
273
|
+
"name": "helpers.ts",
|
|
274
|
+
"projectName": "My Project"
|
|
275
|
+
},
|
|
276
|
+
"2": {
|
|
277
|
+
"key": "my-project:src/utils/common.ts",
|
|
278
|
+
"name": "common.ts",
|
|
279
|
+
"projectName": "My Project"
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Workflow: Find All Duplicates
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# 1. Get files with most duplication
|
|
289
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
290
|
+
"https://sonarcloud.io/api/components/tree?component=$PROJECT&qualifiers=FIL&metricKeys=duplicated_lines_density&s=metric&metricSort=duplicated_lines_density&asc=false&ps=20"
|
|
291
|
+
|
|
292
|
+
# 2. For each file, get duplicate blocks
|
|
293
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
294
|
+
"https://sonarcloud.io/api/duplications/show?key=my-project:src/file.ts"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Rules (`/api/rules/search`)
|
|
300
|
+
|
|
301
|
+
### Parameters
|
|
302
|
+
|
|
303
|
+
| Parameter | Description |
|
|
304
|
+
| --------- | ----------- |
|
|
305
|
+
| `languages` | Filter by language |
|
|
306
|
+
| `severities` | Filter by severity |
|
|
307
|
+
| `types` | Filter by type |
|
|
308
|
+
| `tags` | Filter by tags |
|
|
309
|
+
| `q` | Search query |
|
|
310
|
+
| `p` / `ps` | Pagination |
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Sources (`/api/sources/*`)
|
|
315
|
+
|
|
316
|
+
### Raw Source Code (`/api/sources/raw`)
|
|
317
|
+
|
|
318
|
+
| Parameter | Description |
|
|
319
|
+
| --------- | ----------- |
|
|
320
|
+
| `key` | File key (required) - format: `project:path/to/file.ts` |
|
|
321
|
+
| `branch` | Branch name |
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
325
|
+
"https://sonarcloud.io/api/sources/raw?key=my-project:src/utils/helpers.ts"
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### SCM Blame (`/api/sources/scm`)
|
|
329
|
+
|
|
330
|
+
| Parameter | Description |
|
|
331
|
+
| --------- | ----------- |
|
|
332
|
+
| `key` | File key (required) |
|
|
333
|
+
| `from` | Start line |
|
|
334
|
+
| `to` | End line |
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
338
|
+
"https://sonarcloud.io/api/sources/scm?key=my-project:src/utils/helpers.ts"
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Response**: Returns author, date, and revision for each line.
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Compute Engine (`/api/ce/activity`)
|
|
346
|
+
|
|
347
|
+
Get background task status (analysis jobs).
|
|
348
|
+
|
|
349
|
+
| Parameter | Description |
|
|
350
|
+
| --------- | ----------- |
|
|
351
|
+
| `component` | Project key |
|
|
352
|
+
| `status` | `SUCCESS`, `FAILED`, `CANCELED`, `PENDING`, `IN_PROGRESS` |
|
|
353
|
+
| `type` | Task type (e.g., `REPORT`) |
|
|
354
|
+
| `minSubmittedAt` | Filter by submission date |
|
|
355
|
+
| `maxExecutedAt` | Filter by execution date |
|
|
356
|
+
| `p` / `ps` | Pagination |
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
360
|
+
"https://sonarcloud.io/api/ce/activity?component=my-project&status=FAILED"
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Quality Profiles (`/api/qualityprofiles/search`)
|
|
366
|
+
|
|
367
|
+
| Parameter | Description |
|
|
368
|
+
| --------- | ----------- |
|
|
369
|
+
| `language` | Filter by language |
|
|
370
|
+
| `project` | Project key |
|
|
371
|
+
| `qualityProfile` | Profile name |
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
375
|
+
"https://sonarcloud.io/api/qualityprofiles/search?language=ts"
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Languages (`/api/languages/list`)
|
|
381
|
+
|
|
382
|
+
List all supported languages.
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
386
|
+
"https://sonarcloud.io/api/languages/list"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**Response**: `{ "languages": [{ "key": "ts", "name": "TypeScript" }, ...] }`
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Branches (`/api/project_branches/list`)
|
|
394
|
+
|
|
395
|
+
| Parameter | Description |
|
|
396
|
+
| --------- | ----------- |
|
|
397
|
+
| `project` | Project key (required) |
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
401
|
+
"https://sonarcloud.io/api/project_branches/list?project=my-project"
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**Response**: `{ "branches": [{ "name": "main", "isMain": true, "type": "LONG", "status": { "qualityGateStatus": "OK" } }] }`
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Badges (`/api/project_badges/*`)
|
|
409
|
+
|
|
410
|
+
### Measure Badge (`/api/project_badges/measure`)
|
|
411
|
+
|
|
412
|
+
| Parameter | Description |
|
|
413
|
+
| --------- | ----------- |
|
|
414
|
+
| `project` | Project key |
|
|
415
|
+
| `metric` | `bugs`, `coverage`, `code_smells`, `vulnerabilities`, etc. |
|
|
416
|
+
| `branch` | Branch name |
|
|
417
|
+
|
|
418
|
+
Returns SVG badge image.
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
curl "https://sonarcloud.io/api/project_badges/measure?project=my-project&metric=coverage"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Quality Gate Badge (`/api/project_badges/quality_gate`)
|
|
425
|
+
|
|
426
|
+
| Parameter | Description |
|
|
427
|
+
| --------- | ----------- |
|
|
428
|
+
| `project` | Project key |
|
|
429
|
+
| `branch` | Branch name |
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
curl "https://sonarcloud.io/api/project_badges/quality_gate?project=my-project"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Pagination Example
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
PAGE=1
|
|
441
|
+
while true; do
|
|
442
|
+
R=$(curl -s -H "Authorization: Bearer $TOKEN" \
|
|
443
|
+
"https://sonarcloud.io/api/issues/search?organization=$ORG&componentKeys=$PROJECT&p=$PAGE&ps=500")
|
|
444
|
+
echo $R | jq '.issues[]'
|
|
445
|
+
[ $((PAGE * 500)) -ge $(echo $R | jq '.total') ] && break
|
|
446
|
+
PAGE=$((PAGE + 1))
|
|
447
|
+
done
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Error Codes
|
|
453
|
+
|
|
454
|
+
| Code | Meaning | Fix |
|
|
455
|
+
| ---- | ------- | --- |
|
|
456
|
+
| 401 | Invalid token | Check `SONARCLOUD_TOKEN` |
|
|
457
|
+
| 403 | No permission | Verify project access |
|
|
458
|
+
| 404 | Not found | Check project/org key |
|
|
459
|
+
| 400 | Bad request | Check parameter values |
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## References
|
|
464
|
+
|
|
465
|
+
- [SonarCloud Web API](https://sonarcloud.io/web_api)
|
|
466
|
+
- [SonarCloud Docs](https://docs.sonarsource.com/sonarcloud/)
|
package/README.md
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Forge
|
|
2
|
+
|
|
3
|
+
A 9-stage TDD-first workflow for Claude Code. Ship features with confidence using test-driven development, research-first planning, and comprehensive documentation.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
/status → /research → /plan → /dev → /check → /ship → /review → /merge → /verify
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Option 1: npm (Recommended)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install forge-workflow
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Option 2: bun
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
bun add forge-workflow
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Option 3: curl (No package manager)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
curl -fsSL https://raw.githubusercontent.com/harshanandak/forge/main/install.sh | bash
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Option 4: GitHub Template (New projects)
|
|
30
|
+
|
|
31
|
+
1. Click "Use this template" on GitHub
|
|
32
|
+
2. Clone your new repo
|
|
33
|
+
3. Start with `/status`
|
|
34
|
+
|
|
35
|
+
## The 9 Stages
|
|
36
|
+
|
|
37
|
+
| Stage | Command | What It Does |
|
|
38
|
+
|-------|---------|--------------|
|
|
39
|
+
| 1 | `/status` | Check current context, active work, recent completions |
|
|
40
|
+
| 2 | `/research` | Deep research with web search, document findings |
|
|
41
|
+
| 3 | `/plan` | Create implementation plan, branch, tracking |
|
|
42
|
+
| 4 | `/dev` | TDD development (RED-GREEN-REFACTOR cycles) |
|
|
43
|
+
| 5 | `/check` | Validation (type/lint/security/tests) |
|
|
44
|
+
| 6 | `/ship` | Create PR with full documentation |
|
|
45
|
+
| 7 | `/review` | Address ALL PR feedback |
|
|
46
|
+
| 8 | `/merge` | Update docs, merge, cleanup |
|
|
47
|
+
| 9 | `/verify` | Final documentation verification |
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 1. Check what's happening
|
|
53
|
+
/status
|
|
54
|
+
|
|
55
|
+
# 2. Research your feature
|
|
56
|
+
/research user-authentication
|
|
57
|
+
|
|
58
|
+
# 3. Plan the implementation
|
|
59
|
+
/plan user-authentication
|
|
60
|
+
|
|
61
|
+
# 4. Develop with TDD
|
|
62
|
+
/dev
|
|
63
|
+
|
|
64
|
+
# 5. Validate everything
|
|
65
|
+
/check
|
|
66
|
+
|
|
67
|
+
# 6. Ship it
|
|
68
|
+
/ship
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Core Principles
|
|
72
|
+
|
|
73
|
+
### TDD-First
|
|
74
|
+
- Write tests BEFORE implementation
|
|
75
|
+
- RED: Write failing test
|
|
76
|
+
- GREEN: Make it pass
|
|
77
|
+
- REFACTOR: Clean up
|
|
78
|
+
- Commit after each GREEN cycle
|
|
79
|
+
|
|
80
|
+
### Research-First
|
|
81
|
+
- Understand before building
|
|
82
|
+
- Document decisions with evidence
|
|
83
|
+
- Use web research for best practices
|
|
84
|
+
- Create `docs/research/<feature>.md`
|
|
85
|
+
|
|
86
|
+
### Security Built-In
|
|
87
|
+
- OWASP Top 10 analysis for every feature
|
|
88
|
+
- Security tests as part of TDD
|
|
89
|
+
- Automated scans + manual review
|
|
90
|
+
|
|
91
|
+
### Documentation Progressive
|
|
92
|
+
- Update docs at each relevant stage
|
|
93
|
+
- Verify completeness with `/verify`
|
|
94
|
+
- Never accumulate doc debt
|
|
95
|
+
|
|
96
|
+
## Directory Structure
|
|
97
|
+
|
|
98
|
+
After installation:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
your-project/
|
|
102
|
+
├── .claude/
|
|
103
|
+
│ ├── commands/ # 9 workflow commands
|
|
104
|
+
│ │ ├── status.md
|
|
105
|
+
│ │ ├── research.md
|
|
106
|
+
│ │ ├── plan.md
|
|
107
|
+
│ │ ├── dev.md
|
|
108
|
+
│ │ ├── check.md
|
|
109
|
+
│ │ ├── ship.md
|
|
110
|
+
│ │ ├── review.md
|
|
111
|
+
│ │ ├── merge.md
|
|
112
|
+
│ │ └── verify.md
|
|
113
|
+
│ ├── rules/
|
|
114
|
+
│ │ └── workflow.md # Workflow rules
|
|
115
|
+
│ ├── skills/
|
|
116
|
+
│ │ ├── parallel-ai/ # Web research skill
|
|
117
|
+
│ │ └── sonarcloud/ # Code quality skill
|
|
118
|
+
│ └── scripts/
|
|
119
|
+
│ └── load-env.sh
|
|
120
|
+
└── docs/
|
|
121
|
+
├── research/
|
|
122
|
+
│ └── TEMPLATE.md # Research doc template
|
|
123
|
+
└── WORKFLOW.md # Complete guide
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Configuration
|
|
127
|
+
|
|
128
|
+
Customize commands for your tech stack in your project's `CLAUDE.md`:
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
## Build Commands
|
|
132
|
+
- Type check: `npm run typecheck`
|
|
133
|
+
- Lint: `npm run lint`
|
|
134
|
+
- Test: `npm run test`
|
|
135
|
+
- Security: `npm audit`
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Optional: Beads Issue Tracking
|
|
139
|
+
|
|
140
|
+
Forge integrates with [Beads](https://github.com/beads-ai/beads-cli) for persistent issue tracking across sessions:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Install Beads (optional)
|
|
144
|
+
npm install -g beads-cli
|
|
145
|
+
|
|
146
|
+
# Initialize in your project
|
|
147
|
+
bd init
|
|
148
|
+
|
|
149
|
+
# Create issues
|
|
150
|
+
bd create "Add user authentication"
|
|
151
|
+
|
|
152
|
+
# Track progress
|
|
153
|
+
bd update <id> --status in_progress
|
|
154
|
+
bd close <id>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Workflow Visualization
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
┌─────────┐
|
|
161
|
+
│ /status │ → Check current stage & context
|
|
162
|
+
└────┬────┘
|
|
163
|
+
│
|
|
164
|
+
┌────▼──────┐
|
|
165
|
+
│ /research │ → Deep research, save to docs/research/
|
|
166
|
+
└────┬──────┘
|
|
167
|
+
│
|
|
168
|
+
┌────▼────┐
|
|
169
|
+
│ /plan │ → Create plan, branch, tracking
|
|
170
|
+
└────┬────┘
|
|
171
|
+
│
|
|
172
|
+
┌────▼───┐
|
|
173
|
+
│ /dev │ → TDD implementation (RED-GREEN-REFACTOR)
|
|
174
|
+
└────┬───┘
|
|
175
|
+
│
|
|
176
|
+
┌────▼────┐
|
|
177
|
+
│ /check │ → Validation (type/lint/tests/security)
|
|
178
|
+
└────┬────┘
|
|
179
|
+
│
|
|
180
|
+
┌────▼────┐
|
|
181
|
+
│ /ship │ → Create PR with full documentation
|
|
182
|
+
└────┬────┘
|
|
183
|
+
│
|
|
184
|
+
┌────▼─────┐
|
|
185
|
+
│ /review │ → Address ALL PR issues
|
|
186
|
+
└────┬─────┘
|
|
187
|
+
│
|
|
188
|
+
┌────▼─────┐
|
|
189
|
+
│ /merge │ → Update docs, merge PR, cleanup
|
|
190
|
+
└────┬─────┘
|
|
191
|
+
│
|
|
192
|
+
┌────▼──────┐
|
|
193
|
+
│ /verify │ → Final documentation check
|
|
194
|
+
└───────────┘
|
|
195
|
+
│
|
|
196
|
+
✓ Complete
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
MIT
|
|
202
|
+
|
|
203
|
+
## Contributing
|
|
204
|
+
|
|
205
|
+
Contributions welcome! Please read the workflow guide at `docs/WORKFLOW.md` before submitting PRs.
|