bastard-framework 1.1.0 → 1.2.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/CHANGELOG.md +13 -0
- package/README.md +272 -106
- package/dist/cli.js +80 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to BASTARD will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [1.2.0] - 2026-04-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- `bastard onboard [name]` — one-command setup (init + parents + hooks + status + workflow)
|
|
12
|
+
- ASCII art pipeline diagram in README
|
|
13
|
+
- "Built with BASTARD" section with 5 SaaS starter templates
|
|
14
|
+
- 👹 emoji branding, new tagline: "The bastard framework that kills AI slop"
|
|
15
|
+
- GitHub topics: ai-agents, claude-code, saas-builder, anti-slop, gated-workflow, meta-framework
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- Complete README overhaul (OpenClaw-inspired layout, centered header, navigation bar)
|
|
19
|
+
- Reorganized command tables into Pipeline / Quality / Setup categories
|
|
20
|
+
|
|
8
21
|
## [1.1.0] - 2026-04-03
|
|
9
22
|
|
|
10
23
|
### Added
|
package/README.md
CHANGED
|
@@ -1,170 +1,333 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<br>
|
|
3
|
+
<span style="font-size: 64px">👹</span>
|
|
4
|
+
<br>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<h1 align="center">BASTARD</h1>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<b>The bastard framework that kills AI slop.</b><br>
|
|
11
|
+
<i>Born from many. Better than all.</i>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<a href="https://www.npmjs.com/package/bastard-framework"><img src="https://img.shields.io/npm/v/bastard-framework?style=flat-square&color=cb3837" alt="npm"></a>
|
|
16
|
+
<a href="https://github.com/Denis-hamon/bastard/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="license"></a>
|
|
17
|
+
<a href="https://github.com/Denis-hamon/bastard/actions"><img src="https://img.shields.io/github/actions/workflow/status/Denis-hamon/bastard/ci.yml?style=flat-square&label=CI" alt="CI"></a>
|
|
18
|
+
<img src="https://img.shields.io/badge/AI_Slop_Score-A-brightgreen?style=flat-square" alt="slop score">
|
|
19
|
+
<img src="https://img.shields.io/badge/node-%3E%3D20-green?style=flat-square" alt="node">
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="#-one-command-setup">Setup</a> •
|
|
24
|
+
<a href="#-the-pipeline">Pipeline</a> •
|
|
25
|
+
<a href="#-no-code-before-round-5-ever">Gates</a> •
|
|
26
|
+
<a href="#-ai-slop-detection">Slop Detector</a> •
|
|
27
|
+
<a href="#-built-with-bastard">Templates</a> •
|
|
28
|
+
<a href="#-github-action">CI Action</a>
|
|
29
|
+
</p>
|
|
3
30
|
|
|
4
|
-
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 👹 What is BASTARD?
|
|
34
|
+
|
|
35
|
+
**B**uild **A**ny **S**aaS **T**hrough **A**gent **R**oles & **D**iscipline.
|
|
5
36
|
|
|
6
|
-
|
|
37
|
+
BASTARD is a meta-framework that orchestrates **7 parent Claude Code frameworks** into an **8-round gated pipeline**. It doesn't replace any of them — it tells them when to speak and when to shut up.
|
|
7
38
|
|
|
8
|
-
Every framework tells Claude what to do.
|
|
39
|
+
> Every framework tells Claude what to do.
|
|
40
|
+
> BASTARD is the only one that tells Claude what it **cannot** do.
|
|
9
41
|
|
|
10
|
-
## Try It Now (
|
|
42
|
+
## 🔥 Try It Now (Zero Setup)
|
|
11
43
|
|
|
12
|
-
Score any project for AI slop — no install, no
|
|
44
|
+
Score any project for AI slop — no install, no config, no commitment:
|
|
13
45
|
|
|
14
46
|
```bash
|
|
15
47
|
npx bastard-framework audit .
|
|
16
48
|
```
|
|
17
49
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
The Claude Code ecosystem has amazing frameworks: BMAD for PRDs, gstack for design, GSD for execution, TaskMaster for planning. But **nobody enforces the transitions**. You write a beautiful PRD with BMAD, then ignore it when coding. You skip security review. You ship with generic AI-generated UI.
|
|
21
|
-
|
|
22
|
-
BASTARD wires the genius zones of 7 frameworks into a gated pipeline where you literally cannot code before a PRD is approved, cannot style before a design system exists, and cannot ship before acceptance criteria are verified.
|
|
50
|
+
That's it. Works on **any** codebase.
|
|
23
51
|
|
|
24
|
-
##
|
|
52
|
+
## 🚀 One-Command Setup
|
|
25
53
|
|
|
26
54
|
```bash
|
|
27
|
-
|
|
28
|
-
|
|
55
|
+
npx bastard-framework onboard my-saas
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This single command:
|
|
59
|
+
1. **Scaffolds** your project with 9 pre-structured templates
|
|
60
|
+
2. **Installs** all 7 parent frameworks (latest versions)
|
|
61
|
+
3. **Activates** Claude Code guard hooks
|
|
62
|
+
4. **Shows** your pipeline status + first round workflow
|
|
29
63
|
|
|
30
|
-
|
|
31
|
-
|
|
64
|
+
<details>
|
|
65
|
+
<summary><b>📺 See what it looks like</b></summary>
|
|
32
66
|
|
|
33
|
-
|
|
34
|
-
|
|
67
|
+
```
|
|
68
|
+
╔══════════════════════════════════════════════════════════╗
|
|
69
|
+
║ ║
|
|
70
|
+
║ 👹 BASTARD ONBOARDING ║
|
|
71
|
+
║ ║
|
|
72
|
+
║ The bastard framework that kills AI slop. ║
|
|
73
|
+
║ Born from many. Better than all. ║
|
|
74
|
+
║ ║
|
|
75
|
+
╚══════════════════════════════════════════════════════════╝
|
|
76
|
+
|
|
77
|
+
[1/4] Initializing project...
|
|
78
|
+
✓ Project "my-saas" initialized (9 templates)
|
|
79
|
+
|
|
80
|
+
[2/4] Installing parent frameworks (latest)...
|
|
81
|
+
[1/7] ✓ BMAD Method — installed
|
|
82
|
+
[2/7] ✓ Get Shit Done — installed
|
|
83
|
+
...
|
|
84
|
+
|
|
85
|
+
[3/4] Installing Claude Code guard hooks...
|
|
86
|
+
✓ Hooks installed
|
|
87
|
+
|
|
88
|
+
[4/4] You're ready.
|
|
89
|
+
|
|
90
|
+
Pipeline:
|
|
91
|
+
|
|
92
|
+
► Round 1 — Vision & Product [bmad]
|
|
93
|
+
◌ Round 2 — Design System & UX [gstack + turbo]
|
|
94
|
+
◌ Round 3 — Architecture [bmad + super]
|
|
95
|
+
◌ Round 4 — Decomposition & Planification [taskm + gsd]
|
|
96
|
+
◌ Round 5 — Execution du Code [gsd + super]
|
|
97
|
+
◌ Round 6 — Securite [tob + super]
|
|
98
|
+
◌ Round 7 — QA & Tests [gstack]
|
|
99
|
+
◌ Round 8 — Review & Livraison [gstack + gsd]
|
|
100
|
+
|
|
101
|
+
┌──────────────────────────────────────────────────────────┐
|
|
102
|
+
│ │
|
|
103
|
+
│ 👹 BASTARD is watching. │
|
|
104
|
+
│ │
|
|
105
|
+
│ NO CODE BEFORE ROUND 5. EVER. │
|
|
106
|
+
│ │
|
|
107
|
+
│ Your guard hooks are active. │
|
|
108
|
+
│ Write to src/ before Round 5 │
|
|
109
|
+
│ and BASTARD will block you. │
|
|
110
|
+
│ │
|
|
111
|
+
└──────────────────────────────────────────────────────────┘
|
|
112
|
+
```
|
|
113
|
+
</details>
|
|
35
114
|
|
|
36
|
-
|
|
37
|
-
bastard status
|
|
115
|
+
## 🔒 The Pipeline
|
|
38
116
|
|
|
39
|
-
# Start working — Round 1 workflow with step-by-step guidance
|
|
40
|
-
bastard run
|
|
41
117
|
```
|
|
118
|
+
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
|
119
|
+
│ Round 1 │───▶│ Round 2 │───▶│ Round 3 │───▶│ Round 4 │
|
|
120
|
+
│ Product │ │ Design │ │ Arch │ │ Planning│
|
|
121
|
+
│ [bmad] │ │[gstack] │ │ [bmad] │ │ [taskm] │
|
|
122
|
+
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
|
|
123
|
+
│GATE │GATE │GATE │GATE
|
|
124
|
+
▼ ▼ ▼ ▼
|
|
125
|
+
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
|
126
|
+
│ Round 5 │───▶│ Round 6 │───▶│ Round 7 │───▶│ Round 8 │
|
|
127
|
+
│ Code │ │Security │ │ QA │ │ Ship │
|
|
128
|
+
│ [gsd] │ │ [tob] │ │[gstack] │ │ [gsd] │
|
|
129
|
+
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
|
|
130
|
+
│GATE │GATE │GATE │GATE
|
|
131
|
+
▼ ▼ ▼ ▼
|
|
132
|
+
✅ SHIPPED
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Each round has a **hard gate**. Not a suggestion — an actual enforcement mechanism. The gate must pass before you advance.
|
|
42
136
|
|
|
43
|
-
|
|
137
|
+
| Round | What happens | Frameworks | Gate checks |
|
|
138
|
+
|:---:|---|---|---|
|
|
139
|
+
| 1 | Product vision, PRD, personas | bmad | Content validated (100+ chars, user story format) |
|
|
140
|
+
| 2 | Design system, tokens, mockups | gstack + turbo | CSS custom properties defined, human approved |
|
|
141
|
+
| 3 | Architecture, ADRs, API contracts | bmad + super | ADR structure validated (Status/Context/Decision) |
|
|
142
|
+
| 4 | Task decomposition, wave planning | taskm + gsd | Task files exist, context documented |
|
|
143
|
+
| 5 | Code execution, TDD, atomic commits | gsd + super | Source + tests exist |
|
|
144
|
+
| 6 | STRIDE threat model, OWASP review | tob + super | Threat model + security review content validated |
|
|
145
|
+
| 7 | Browser QA, design score, regression | gstack | AI Slop Score = A, Design Score >= B |
|
|
146
|
+
| 8 | Adversarial review, acceptance verify | gstack + gsd | 100% acceptance criteria green |
|
|
44
147
|
|
|
45
|
-
|
|
148
|
+
## 🚫 No Code Before Round 5. Ever.
|
|
46
149
|
|
|
47
|
-
|
|
150
|
+
This is not a guideline. This is **enforced by Claude Code hooks**.
|
|
48
151
|
|
|
49
152
|
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
153
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
154
|
+
│ │
|
|
155
|
+
│ $ claude "write src/app.ts" │
|
|
156
|
+
│ │
|
|
157
|
+
│ ██████╗ BLOCKED │
|
|
158
|
+
│ ██╔══██╗ │
|
|
159
|
+
│ ██████╔╝ BASTARD: No source code before Round 5 │
|
|
160
|
+
│ ██╔══██╗ (currently Round 1). │
|
|
161
|
+
│ ██████╔╝ │
|
|
162
|
+
│ ╚═════╝ Complete Rounds 1-4 first: │
|
|
163
|
+
│ product → design → architecture → planning │
|
|
164
|
+
│ │
|
|
165
|
+
└──────────────────────────────────────────────────────────────┘
|
|
58
166
|
```
|
|
59
167
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
168
|
+
**What the guard blocks:**
|
|
169
|
+
- Source code writes (`src/`, `lib/`, `app/`) before Round 5
|
|
170
|
+
- CSS/styling files before Round 2 gate passes
|
|
171
|
+
- Task/planning files before Round 4
|
|
172
|
+
- `git add .` and `git add -A` (per-file staging only)
|
|
173
|
+
- Direct commits to `main`/`master`
|
|
174
|
+
- Security-sensitive files without Round 6 review
|
|
65
175
|
|
|
66
176
|
```bash
|
|
67
|
-
bastard
|
|
68
|
-
bastard
|
|
69
|
-
bastard next # Advance — BLOCKED if gate fails
|
|
177
|
+
bastard hooks install # Activate the guard
|
|
178
|
+
bastard hooks remove # Deactivate (you rebel)
|
|
70
179
|
```
|
|
71
180
|
|
|
72
|
-
|
|
181
|
+
## 🔍 AI Slop Detection
|
|
73
182
|
|
|
74
|
-
|
|
183
|
+
9 pattern detectors that catch the telltale signs of AI-generated UI:
|
|
75
184
|
|
|
76
185
|
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
186
|
+
┌──────────────────────────────────────────────────────┐
|
|
187
|
+
│ AI SLOP BLACKLIST │
|
|
188
|
+
│ │
|
|
189
|
+
│ ██ Blue-purple gradients The #1 AI tell │
|
|
190
|
+
│ ██ 3-column icon grids Every AI landing page │
|
|
191
|
+
│ ██ Generic card grids Rounded + shadow + grid │
|
|
192
|
+
│ ██ Gradient text bg-clip-text chaos │
|
|
193
|
+
│ ██ Oversized heroes min-h-screen + overlay │
|
|
194
|
+
│ ██ Floating abstract shapes Blurred circles │
|
|
195
|
+
│ ██ Single font family No typographic depth │
|
|
196
|
+
│ ██ Generic CTAs only "Get Started" fatigue │
|
|
197
|
+
│ ██ Hero→Features→Pricing The AI playbook │
|
|
198
|
+
└──────────────────────────────────────────────────────┘
|
|
80
199
|
```
|
|
81
200
|
|
|
82
|
-
### AI Slop Detection
|
|
83
|
-
|
|
84
|
-
9 pattern detectors that catch the telltale signs of AI-generated UI:
|
|
85
|
-
|
|
86
201
|
```bash
|
|
87
|
-
bastard slop
|
|
88
|
-
bastard
|
|
89
|
-
bastard
|
|
202
|
+
bastard slop . # Scan any project
|
|
203
|
+
bastard slop . --json # Machine-readable output
|
|
204
|
+
bastard slop . --fail-below A # CI gate (exit 1 if below A)
|
|
205
|
+
bastard audit . # Slop + Design Score combined
|
|
206
|
+
bastard badge . # Generate shields.io badge
|
|
90
207
|
```
|
|
91
208
|
|
|
92
|
-
|
|
209
|
+
### 📊 AI Slop Leaderboard
|
|
93
210
|
|
|
94
|
-
|
|
211
|
+
We scanned popular open-source SaaS projects:
|
|
95
212
|
|
|
96
|
-
|
|
213
|
+
| Project | Stars | Slop Score | Patterns |
|
|
214
|
+
|---------|:---:|:---:|---|
|
|
215
|
+
| [Maybe](https://github.com/maybe-finance/maybe) | 54k | **B** | Single Font (1) |
|
|
216
|
+
| [Twenty](https://github.com/twentyhq/twenty) | 44k | **C** | Single Font, Gradient Text (4) |
|
|
217
|
+
| [Cal.com](https://github.com/calcom/cal.com) | 41k | **D** | Hero, Card Grid, Gradient Text, Single Font (5) |
|
|
218
|
+
| [Formbricks](https://github.com/formbricks/formbricks) | 12k | **F** | Hero, Icon Grid, Card Grid (6) |
|
|
219
|
+
|
|
220
|
+
*Run it on yours:* `npx bastard-framework audit .`
|
|
221
|
+
|
|
222
|
+
## 👹 The Seven Parents
|
|
223
|
+
|
|
224
|
+
| ID | Framework | What BASTARD steals | Rounds |
|
|
225
|
+
|:---:|---|---|:---:|
|
|
226
|
+
| `bmad` | [BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD) | Product vision, PRD, Architecture | 1, 3 |
|
|
227
|
+
| `gsd` | [Get Shit Done](https://github.com/gsd-build/get-shit-done) | Context engineering, wave execution | 4, 5, 8 |
|
|
228
|
+
| `gstack` | [gstack](https://github.com/garrytan/gstack) | Design system, QA, shipping | 2, 7, 8 |
|
|
229
|
+
| `super` | [SuperClaude](https://github.com/SuperClaude-Org/SuperClaude_Framework) | Cognitive personas, token efficiency | 3, 5, 6 |
|
|
230
|
+
| `tob` | [Trail of Bits](https://github.com/trailofbits/skills) | Security review, threat modeling | 6 |
|
|
231
|
+
| `turbo` | [TurboDocx FD](https://github.com/turbodocx/frontend-design) | Frontend design, anti-AI-slop | 2 |
|
|
232
|
+
| `taskm` | [TaskMaster](https://github.com/eyaltoledano/claude-task-master) | Task decomposition, dependency graphs | 4 |
|
|
97
233
|
|
|
98
234
|
```bash
|
|
99
|
-
bastard
|
|
100
|
-
bastard
|
|
101
|
-
bastard validate # All documents at once
|
|
235
|
+
bastard parents # Who's installed?
|
|
236
|
+
bastard parents install # Get them all (always latest)
|
|
102
237
|
```
|
|
103
238
|
|
|
104
|
-
##
|
|
239
|
+
## 🏗️ Built with BASTARD
|
|
105
240
|
|
|
106
|
-
|
|
107
|
-
|-----------|------------------------|--------|
|
|
108
|
-
| [BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD) | Product vision, PRD, Architecture | 1, 3 |
|
|
109
|
-
| [Get Shit Done](https://github.com/gsd-build/get-shit-done) | Context engineering, wave execution | 4, 5, 8 |
|
|
110
|
-
| [gstack](https://github.com/garrytan/gstack) | Design system, QA, shipping | 2, 7, 8 |
|
|
111
|
-
| [SuperClaude](https://github.com/SuperClaude-Org/SuperClaude_Framework) | Cognitive personas, token efficiency | 3, 5, 6 |
|
|
112
|
-
| [Trail of Bits](https://github.com/trailofbits/skills) | Security review, threat modeling | 6 |
|
|
113
|
-
| [TurboDocx FD](https://github.com/turbodocx/frontend-design) | Frontend design, anti-AI-slop | 2 |
|
|
114
|
-
| [TaskMaster](https://github.com/eyaltoledano/claude-task-master) | Task decomposition, dependency graphs | 4 |
|
|
241
|
+
### Reference Project
|
|
115
242
|
|
|
116
|
-
|
|
243
|
+
See [`examples/todo-app/`](examples/todo-app/) — a minimal todo app that went through all 8 rounds. Every document, every gate, every artifact. The code is < 200 LOC. The documents are the star.
|
|
117
244
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
245
|
+
### SaaS Starter Templates
|
|
246
|
+
|
|
247
|
+
Use BASTARD to build any of these. The pipeline is the same — the product changes:
|
|
248
|
+
|
|
249
|
+
| Template | What you build | Key rounds |
|
|
250
|
+
|----------|---------------|------------|
|
|
251
|
+
| **Waitlist SaaS** | Landing page + email capture + admin dashboard | R2 (design), R5 (code), R6 (data privacy) |
|
|
252
|
+
| **Feedback Widget** | Embeddable widget + dashboard + analytics | R2 (design), R3 (embed architecture), R5 (widget + API) |
|
|
253
|
+
| **Booking Platform** | Calendly-like scheduling + notifications | R1 (complex PRD), R3 (real-time arch), R6 (auth security) |
|
|
254
|
+
| **AI Chat Interface** | LLM-powered chatbot + conversation history | R3 (LLM architecture), R5 (streaming), R6 (prompt injection) |
|
|
255
|
+
| **Internal Tool** | CRUD dashboard + RBAC + audit logs | R3 (multi-tenant arch), R6 (access control), R7 (E2E tests) |
|
|
256
|
+
|
|
257
|
+
Every template follows the same 8-round pipeline. Start with `bastard onboard my-saas` and fill the Round 1 documents for your specific product.
|
|
258
|
+
|
|
259
|
+
## ⚡ GitHub Action
|
|
260
|
+
|
|
261
|
+
Block AI slop in your CI pipeline. One line:
|
|
262
|
+
|
|
263
|
+
```yaml
|
|
264
|
+
- uses: Denis-hamon/bastard/action@main
|
|
265
|
+
with:
|
|
266
|
+
path: src/
|
|
267
|
+
fail-below: A # A, B, C, D, or F
|
|
122
268
|
```
|
|
123
269
|
|
|
124
|
-
|
|
270
|
+
The action:
|
|
271
|
+
- Runs AI Slop + Design Score audit
|
|
272
|
+
- Posts results as a PR comment (auto-updates, no spam)
|
|
273
|
+
- Fails the check if below threshold
|
|
274
|
+
- Outputs `slop-score`, `design-score`, `passed` for downstream steps
|
|
275
|
+
|
|
276
|
+
## 📋 All Commands
|
|
277
|
+
|
|
278
|
+
### Pipeline
|
|
125
279
|
|
|
126
|
-
| Command |
|
|
127
|
-
|
|
128
|
-
| `bastard
|
|
280
|
+
| Command | What it does |
|
|
281
|
+
|---------|-------------|
|
|
282
|
+
| `bastard onboard [name]` | **One command: init + parents + hooks + status** |
|
|
283
|
+
| `bastard init [name]` | Scaffold project + templates |
|
|
129
284
|
| `bastard status` | Visual pipeline with round/gate status |
|
|
130
285
|
| `bastard run [round]` | Step-by-step workflow with framework guidance |
|
|
131
|
-
| `bastard prompt [round]` | Generate copy-pasteable prompt
|
|
286
|
+
| `bastard prompt [round]` | Generate copy-pasteable prompt |
|
|
132
287
|
| `bastard gate [round]` | Run automated gate checks |
|
|
133
288
|
| `bastard validate [doc]` | Deep content validation |
|
|
134
289
|
| `bastard approve <N>` | Human sign-off on a round |
|
|
135
|
-
| `bastard next` | Advance
|
|
136
|
-
| `bastard round <N>` | Jump
|
|
137
|
-
| `bastard parents` | Show installed/missing parent frameworks |
|
|
138
|
-
| `bastard parents install` | Install all parents (latest versions) |
|
|
139
|
-
| `bastard hooks install` | Install Claude Code guard hooks |
|
|
140
|
-
| `bastard hooks remove` | Remove guard hooks |
|
|
141
|
-
| `bastard slop [path]` | AI Slop detection (works on any project) |
|
|
142
|
-
| `bastard score [path]` | Design token compliance (works on any project) |
|
|
143
|
-
| `bastard audit [path]` | Combined slop + design report |
|
|
290
|
+
| `bastard next` | Advance (blocked if gate fails) |
|
|
291
|
+
| `bastard round <N>` | Jump with warnings |
|
|
144
292
|
| `bastard history` | Action audit trail |
|
|
145
293
|
| `bastard reset` | Reset pipeline (keeps files) |
|
|
146
294
|
|
|
147
|
-
|
|
295
|
+
### Quality
|
|
296
|
+
|
|
297
|
+
| Command | What it does |
|
|
298
|
+
|---------|-------------|
|
|
299
|
+
| `bastard slop [path]` | AI Slop detection (any project) |
|
|
300
|
+
| `bastard score [path]` | Design token compliance (any project) |
|
|
301
|
+
| `bastard audit [path]` | Combined report + merge verdict |
|
|
302
|
+
| `bastard badge [path]` | Generate shields.io badge |
|
|
303
|
+
|
|
304
|
+
All quality commands support `--json` and `--fail-below <grade>`.
|
|
305
|
+
|
|
306
|
+
### Setup
|
|
307
|
+
|
|
308
|
+
| Command | What it does |
|
|
309
|
+
|---------|-------------|
|
|
310
|
+
| `bastard parents` | Show installed/missing frameworks |
|
|
311
|
+
| `bastard parents install` | Install all 7 parents (latest) |
|
|
312
|
+
| `bastard hooks install` | Activate Claude Code guard |
|
|
313
|
+
| `bastard hooks remove` | Deactivate guard |
|
|
148
314
|
|
|
149
|
-
|
|
315
|
+
## 🎯 Exit Standards
|
|
150
316
|
|
|
151
|
-
|
|
152
|
-
|--------|---------|
|
|
153
|
-
| Test coverage | >= 80% |
|
|
154
|
-
| Design Score | >= B |
|
|
155
|
-
| AI Slop Score | A |
|
|
156
|
-
| OWASP vulnerabilities | 0 critical, 0 high |
|
|
157
|
-
| Acceptance criteria | 100% green |
|
|
158
|
-
| ADRs | 1 per major decision |
|
|
317
|
+
A SaaS exits BASTARD when all gates are green:
|
|
159
318
|
|
|
160
|
-
|
|
319
|
+
| Metric | Minimum | Enforced by |
|
|
320
|
+
|--------|:---:|---|
|
|
321
|
+
| Test coverage | >= 80% | Round 5 gate |
|
|
322
|
+
| Design Score | >= B | Round 7 gate |
|
|
323
|
+
| AI Slop Score | A | Round 7 gate |
|
|
324
|
+
| OWASP vulnerabilities | 0 critical, 0 high | Round 6 gate |
|
|
325
|
+
| Acceptance criteria | 100% green | Round 8 gate |
|
|
326
|
+
| ADRs | 1 per major decision | Round 3 gate |
|
|
161
327
|
|
|
162
|
-
|
|
328
|
+
## 🤝 Contributing
|
|
163
329
|
|
|
164
|
-
|
|
165
|
-
- No CSS before an approved design system (Round 2 gate)
|
|
166
|
-
- No merge on auth/payment without security review (Round 6)
|
|
167
|
-
- No ship without acceptance verification (Round 8 closes the loop back to Round 1)
|
|
330
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). BASTARD is opinionated by design — contributions that dilute the pipeline will be rejected. But if you've found a framework better than one of the seven parents at its specific job, we want to hear about it.
|
|
168
331
|
|
|
169
332
|
## License
|
|
170
333
|
|
|
@@ -172,4 +335,7 @@ MIT
|
|
|
172
335
|
|
|
173
336
|
---
|
|
174
337
|
|
|
175
|
-
|
|
338
|
+
<p align="center">
|
|
339
|
+
<b>👹 BASTARD</b><br>
|
|
340
|
+
<i>The bastard framework that kills AI slop.<br>Born from many. Better than all.</i>
|
|
341
|
+
</p>
|
package/dist/cli.js
CHANGED
|
@@ -2791,7 +2791,7 @@ function displayAudit(slop, design) {
|
|
|
2791
2791
|
|
|
2792
2792
|
// src/cli.ts
|
|
2793
2793
|
var program = new Command();
|
|
2794
|
-
program.name("bastard").description("Build Any SaaS Through Agent Roles & Discipline").version("1.
|
|
2794
|
+
program.name("bastard").description("Build Any SaaS Through Agent Roles & Discipline").version("1.2.0");
|
|
2795
2795
|
program.command("init [name]").description("Initialize a new BASTARD project").option("--install-parents", "Also install all parent frameworks").option("--with-hooks", "Also install Claude Code guard hooks").action(async (name, opts) => {
|
|
2796
2796
|
const projectRoot = process.cwd();
|
|
2797
2797
|
if (stateExists(projectRoot)) {
|
|
@@ -2837,6 +2837,85 @@ program.command("init [name]").description("Initialize a new BASTARD project").o
|
|
|
2837
2837
|
displayHooksInstalled(hookResult);
|
|
2838
2838
|
}
|
|
2839
2839
|
});
|
|
2840
|
+
program.command("onboard [name]").description("One command to rule them all: init + parents + hooks + status + run").action(async (name) => {
|
|
2841
|
+
const projectRoot = process.cwd();
|
|
2842
|
+
const projectName = name ?? basename(projectRoot);
|
|
2843
|
+
console.log(chalk2.bold(`
|
|
2844
|
+
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
2845
|
+
\u2551 \u2551
|
|
2846
|
+
\u2551 \u{1F479} BASTARD ONBOARDING \u2551
|
|
2847
|
+
\u2551 \u2551
|
|
2848
|
+
\u2551 The bastard framework that kills AI slop. \u2551
|
|
2849
|
+
\u2551 Born from many. Better than all. \u2551
|
|
2850
|
+
\u2551 \u2551
|
|
2851
|
+
\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
|
2852
|
+
`));
|
|
2853
|
+
if (stateExists(projectRoot)) {
|
|
2854
|
+
console.log(chalk2.green(" \u2713 Project already initialized.\n"));
|
|
2855
|
+
} else {
|
|
2856
|
+
console.log(chalk2.bold(" [1/4] Initializing project...\n"));
|
|
2857
|
+
const dirs = [
|
|
2858
|
+
"docs/product",
|
|
2859
|
+
"docs/design/mockups",
|
|
2860
|
+
"docs/architecture/ADR",
|
|
2861
|
+
"docs/security",
|
|
2862
|
+
"docs/planning",
|
|
2863
|
+
".planning",
|
|
2864
|
+
"tasks",
|
|
2865
|
+
"src",
|
|
2866
|
+
"tests",
|
|
2867
|
+
".bastard"
|
|
2868
|
+
];
|
|
2869
|
+
for (const dir of dirs) {
|
|
2870
|
+
const fullPath = resolve3(projectRoot, dir);
|
|
2871
|
+
if (!existsSync10(fullPath)) mkdirSync5(fullPath, { recursive: true });
|
|
2872
|
+
}
|
|
2873
|
+
const state2 = createInitialState(projectName);
|
|
2874
|
+
saveState(projectRoot, state2);
|
|
2875
|
+
const created = scaffoldTemplates(projectRoot, projectName);
|
|
2876
|
+
console.log(chalk2.green(` \u2713 Project "${projectName}" initialized (${created.length} templates)
|
|
2877
|
+
`));
|
|
2878
|
+
}
|
|
2879
|
+
console.log(chalk2.bold(" [2/4] Installing parent frameworks (latest)...\n"));
|
|
2880
|
+
const results = await installParents(
|
|
2881
|
+
projectRoot,
|
|
2882
|
+
{},
|
|
2883
|
+
(result, index, total) => displayInstallProgress(result, index, total)
|
|
2884
|
+
);
|
|
2885
|
+
displayInstallSummary(results);
|
|
2886
|
+
console.log(chalk2.bold(" [3/4] Installing Claude Code guard hooks...\n"));
|
|
2887
|
+
const hookResult = installHooks(projectRoot);
|
|
2888
|
+
displayHooksInstalled(hookResult);
|
|
2889
|
+
console.log(chalk2.bold(" [4/4] You're ready.\n"));
|
|
2890
|
+
const state = loadState(projectRoot);
|
|
2891
|
+
displayStatus(state);
|
|
2892
|
+
const workflow = getWorkflow(state.currentRound);
|
|
2893
|
+
if (workflow) {
|
|
2894
|
+
const statuses = detectParents(projectRoot);
|
|
2895
|
+
const installed = new Set(statuses.filter((s) => s.installed).map((s) => s.framework.id));
|
|
2896
|
+
displayWorkflow(workflow, installed);
|
|
2897
|
+
}
|
|
2898
|
+
console.log(chalk2.bold(`
|
|
2899
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
2900
|
+
\u2502 \u2502
|
|
2901
|
+
\u2502 \u{1F479} BASTARD is watching. \u2502
|
|
2902
|
+
\u2502 \u2502
|
|
2903
|
+
\u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
|
|
2904
|
+
\u2502 \u2502 \u2502 \u2502
|
|
2905
|
+
\u2502 \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 NO CODE BEFORE ROUND 5. EVER. \u2502 \u2502
|
|
2906
|
+
\u2502 \u2502 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2502 \u2502
|
|
2907
|
+
\u2502 \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D Your guard hooks are active. \u2502 \u2502
|
|
2908
|
+
\u2502 \u2502 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 Write to src/ before Round 5 \u2502 \u2502
|
|
2909
|
+
\u2502 \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D and BASTARD will block you. \u2502 \u2502
|
|
2910
|
+
\u2502 \u2502 \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u2502 \u2502
|
|
2911
|
+
\u2502 \u2502 \u2502 \u2502
|
|
2912
|
+
\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
|
|
2913
|
+
\u2502 \u2502
|
|
2914
|
+
\u2502 Next: fill your PRD, then \`bastard gate\` \u2502
|
|
2915
|
+
\u2502 \u2502
|
|
2916
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
2917
|
+
`));
|
|
2918
|
+
});
|
|
2840
2919
|
program.command("status").description("Show current pipeline status").action(() => {
|
|
2841
2920
|
const projectRoot = process.cwd();
|
|
2842
2921
|
const state = loadState(projectRoot);
|