beth-copilot 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/README.md +224 -0
- package/bin/cli.js +223 -0
- package/package.json +36 -0
- package/templates/.github/agents/beth.agent.md +279 -0
- package/templates/.github/agents/developer.agent.md +493 -0
- package/templates/.github/agents/frontend-engineer.agent.md +556 -0
- package/templates/.github/agents/product-manager.agent.md +253 -0
- package/templates/.github/agents/researcher.agent.md +319 -0
- package/templates/.github/agents/security-reviewer.agent.md +452 -0
- package/templates/.github/agents/tester.agent.md +477 -0
- package/templates/.github/agents/ux-designer.agent.md +374 -0
- package/templates/.github/copilot-instructions.md +191 -0
- package/templates/.github/skills/framer-components/SKILL.md +564 -0
- package/templates/.github/skills/prd/SKILL.md +244 -0
- package/templates/.github/skills/security-analysis/SKILL.md +799 -0
- package/templates/.github/skills/shadcn-ui/SKILL.md +562 -0
- package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +2516 -0
- package/templates/.github/skills/vercel-react-best-practices/SKILL.md +125 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +49 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +36 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +57 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/templates/.github/skills/web-design-guidelines/SKILL.md +39 -0
- package/templates/AGENTS.md +70 -0
- package/templates/Backlog.md +80 -0
- package/templates/mcp.json.example +9 -0
package/README.md
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Beth
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="assets/yellowstone-beth.png" alt="Beth" width="600">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
She doesn't do excuses. She doesn't do hand-holding. She does results—and she'll have your entire project shipping while everyone else is still scheduling their kickoff meeting. Think of her as the managing director your codebase didn't know it needed, but absolutely deserves.
|
|
8
|
+
|
|
9
|
+
They broke her wings once. They forgot she had claws.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## What Is This?
|
|
14
|
+
|
|
15
|
+
Beth is a master AI orchestrator system—a ruthless, hyper-competent coordinator that runs your development team the way Beth Dutton runs Schwartz & Meyer. No hand-holding. No excuses. Just results.
|
|
16
|
+
|
|
17
|
+
She commands an army of specialized agents, each with their own expertise, and she's not afraid to put them to work simultaneously while she lights a cigarette and watches the crew build production-ready code.
|
|
18
|
+
|
|
19
|
+
**She handles:**
|
|
20
|
+
- Product strategy that makes competitors weep
|
|
21
|
+
- Research that finds the real dirt
|
|
22
|
+
- Designs so sharp they cut
|
|
23
|
+
- Code that actually works
|
|
24
|
+
- Security that locks the gates
|
|
25
|
+
- Tests that find every weakness before your enemies do
|
|
26
|
+
|
|
27
|
+
## The Family
|
|
28
|
+
|
|
29
|
+
Beth doesn't work alone. She's got people—loyal, skilled, and ready to execute.
|
|
30
|
+
|
|
31
|
+
| Agent | Role | What They Do |
|
|
32
|
+
|-------|------|--------------|
|
|
33
|
+
| **@Beth** | The Boss | Orchestrates everything. Routes work. Takes names. |
|
|
34
|
+
| **@product-manager** | The Strategist | PRDs, roadmaps, requirements. Knows what users need before they do. |
|
|
35
|
+
| **@researcher** | The Intelligence | Competitive analysis, user insights, market dirt. |
|
|
36
|
+
| **@ux-designer** | The Architect | Interface design, design systems. Makes it beautiful AND functional. |
|
|
37
|
+
| **@frontend-engineer** | The Craftsman | React/TypeScript/Next.js. Pixel-perfect, performance-obsessed. |
|
|
38
|
+
| **@developer** | The Builder | Full-stack implementation. Gets it done. |
|
|
39
|
+
| **@tester** | The Enforcer | Quality assurance, accessibility, performance. Finds every crack. |
|
|
40
|
+
| **@security-reviewer** | The Bodyguard | Enterprise security. Vulnerabilities, compliance, threat modeling. |
|
|
41
|
+
|
|
42
|
+
## Skills (The Weapons)
|
|
43
|
+
|
|
44
|
+
Beth's team comes equipped:
|
|
45
|
+
|
|
46
|
+
| Skill | Purpose |
|
|
47
|
+
|-------|---------|
|
|
48
|
+
| **PRD Generation** | Write requirements docs that don't waste anyone's time |
|
|
49
|
+
| **Framer Components** | Build custom React components with property controls |
|
|
50
|
+
| **React/Next.js Best Practices** | Vercel-grade performance patterns |
|
|
51
|
+
| **Web Design Guidelines** | WCAG compliance, UI review, accessibility |
|
|
52
|
+
| **Security Analysis** | OWASP, threat modeling, vulnerability assessment |
|
|
53
|
+
|
|
54
|
+
## How Beth Works
|
|
55
|
+
|
|
56
|
+
She doesn't micromanage. She delegates to specialists and holds them accountable.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Your Request
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
┌─────────────────────────────────────────┐
|
|
63
|
+
│ @Beth │
|
|
64
|
+
│ "I don't need permission to be me." │
|
|
65
|
+
│ │
|
|
66
|
+
│ • Analyzes your request │
|
|
67
|
+
│ • Picks the right people │
|
|
68
|
+
│ • Runs parallel ops when smart │
|
|
69
|
+
│ • Delivers results, not excuses │
|
|
70
|
+
└─────────────────────────────────────────┘
|
|
71
|
+
│
|
|
72
|
+
├──▶ @product-manager (strategy)
|
|
73
|
+
├──▶ @researcher (intelligence)
|
|
74
|
+
├──▶ @ux-designer (design)
|
|
75
|
+
├──▶ @frontend-engineer (UI implementation)
|
|
76
|
+
├──▶ @developer (full-stack)
|
|
77
|
+
├──▶ @tester (quality gate)
|
|
78
|
+
└──▶ @security-reviewer (protection)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### The Workflow
|
|
82
|
+
|
|
83
|
+
**New Feature?**
|
|
84
|
+
```
|
|
85
|
+
Request → Product (requirements) → Research (validation) → Design (interface)
|
|
86
|
+
→ Frontend (components) → Developer (backend) → Security (review) → Tester (QA)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Bug Hunt?**
|
|
90
|
+
```
|
|
91
|
+
Report → Tester (reproduce) → Developer (fix) → Security (verify) → Tester (confirm)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Security Audit?**
|
|
95
|
+
```
|
|
96
|
+
Concern → Security (threat model) → Developer (remediation) → Tester (penetration)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Getting Started
|
|
100
|
+
|
|
101
|
+
**One command to install:**
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npx beth-copilot init
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Then:**
|
|
108
|
+
|
|
109
|
+
1. Open your project in VS Code
|
|
110
|
+
2. Ensure GitHub Copilot + Copilot Chat are installed
|
|
111
|
+
3. Switch to **Agent mode** in Copilot Chat
|
|
112
|
+
4. Type `@Beth` and tell her what you need
|
|
113
|
+
|
|
114
|
+
For detailed setup including prerequisites, task tracking, and optional MCP servers, see [docs/INSTALLATION.md](docs/INSTALLATION.md).
|
|
115
|
+
|
|
116
|
+
## Quick Commands
|
|
117
|
+
|
|
118
|
+
Don't waste her time. Be direct.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
@Beth Build me a dashboard for user analytics with real-time updates.
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
@Beth Security review for our authentication flow. Find the holes.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
@frontend-engineer Implement a drag-and-drop task board. Make it fast.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
@security-reviewer OWASP top 10 assessment on our API endpoints.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
@tester Accessibility audit. WCAG 2.1 AA. No excuses.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## The Structure
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
.github/
|
|
144
|
+
├── agents/ # The crew
|
|
145
|
+
│ ├── beth.agent.md # The boss herself
|
|
146
|
+
│ ├── product-manager.agent.md
|
|
147
|
+
│ ├── researcher.agent.md
|
|
148
|
+
│ ├── ux-designer.agent.md
|
|
149
|
+
│ ├── frontend-engineer.agent.md # New: dedicated frontend specialist
|
|
150
|
+
│ ├── developer.agent.md
|
|
151
|
+
│ ├── tester.agent.md
|
|
152
|
+
│ └── security-reviewer.agent.md # New: enterprise security
|
|
153
|
+
├── skills/ # Domain expertise
|
|
154
|
+
│ ├── prd/
|
|
155
|
+
│ ├── framer-components/
|
|
156
|
+
│ ├── vercel-react-best-practices/
|
|
157
|
+
│ ├── web-design-guidelines/
|
|
158
|
+
│ └── security-analysis/ # New: security skill
|
|
159
|
+
└── copilot-instructions.md # The rules of engagement
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Her Philosophy
|
|
163
|
+
|
|
164
|
+
Beth operates on a few principles:
|
|
165
|
+
|
|
166
|
+
1. **Protect the family** — Your codebase is the ranch. She defends it.
|
|
167
|
+
2. **No weakness** — Tests, security, accessibility. Cover every flank.
|
|
168
|
+
3. **Move fast, break enemies** — Parallel execution, aggressive timelines.
|
|
169
|
+
4. **Loyalty earns trust** — Agents that perform get the good work.
|
|
170
|
+
|
|
171
|
+
## Quality Standards
|
|
172
|
+
|
|
173
|
+
Beth doesn't ship garbage:
|
|
174
|
+
|
|
175
|
+
- **Accessibility**: WCAG 2.1 AA minimum. Everyone uses the product.
|
|
176
|
+
- **Performance**: Core Web Vitals green. LCP < 2.5s. No exceptions.
|
|
177
|
+
- **Security**: OWASP compliant. Regular audits. Zero tolerance for vulnerabilities.
|
|
178
|
+
- **Type Safety**: Full TypeScript coverage. No `any` unless you want a lecture.
|
|
179
|
+
- **Test Coverage**: Unit, integration, E2E. If it's not tested, it's not done.
|
|
180
|
+
|
|
181
|
+
## Why Beth?
|
|
182
|
+
|
|
183
|
+
<p align="center">
|
|
184
|
+
<img src="assets/beth-questioning.png" alt="Beth" width="500">
|
|
185
|
+
</p>
|
|
186
|
+
|
|
187
|
+
Look, you *could* try to coordinate seven specialists yourself. You could context-switch between product strategy, security reviews, and accessibility audits while keeping your sanity intact.
|
|
188
|
+
|
|
189
|
+
Or you could let Beth handle it.
|
|
190
|
+
|
|
191
|
+
She's got the crew. She's got the workflows. She delegates like a managing director because that's exactly what she is. You bring the problem, she brings the people—and somehow, the code ships on time, secure, and accessible.
|
|
192
|
+
|
|
193
|
+
Is it magic? No. It's just competence with very good hair.
|
|
194
|
+
|
|
195
|
+
> *"I made two decisions in my life based on fear, and they almost ruined me. I'll never make another."*
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Requirements
|
|
200
|
+
|
|
201
|
+
- VS Code with GitHub Copilot extension
|
|
202
|
+
- GitHub Copilot Chat enabled
|
|
203
|
+
- The spine to actually ship something
|
|
204
|
+
|
|
205
|
+
### Optional: MCP Servers
|
|
206
|
+
|
|
207
|
+
Beth's agents work fine without them, but these make them smarter:
|
|
208
|
+
|
|
209
|
+
| Server | What It Does | Setup |
|
|
210
|
+
|--------|--------------|-------|
|
|
211
|
+
| **shadcn/ui** | Component browsing & installation | `npx shadcn@latest mcp init --client vscode` |
|
|
212
|
+
| **Playwright** | Browser automation for testing | See [MCP Setup Guide](docs/MCP-SETUP.md) |
|
|
213
|
+
| **Azure** | Cloud resource management | See [MCP Setup Guide](docs/MCP-SETUP.md) |
|
|
214
|
+
| **Web Search** | Internet research | See [MCP Setup Guide](docs/MCP-SETUP.md) |
|
|
215
|
+
|
|
216
|
+
Full details: [docs/MCP-SETUP.md](docs/MCP-SETUP.md)
|
|
217
|
+
|
|
218
|
+
## License
|
|
219
|
+
|
|
220
|
+
MIT — Take it. Run it. Build empires.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
*Built with the kind of ferocity that would make John Dutton proud.*
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname, join, relative } from 'path';
|
|
5
|
+
import { existsSync, mkdirSync, readdirSync, statSync, copyFileSync, readFileSync, writeFileSync } from 'fs';
|
|
6
|
+
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const TEMPLATES_DIR = join(__dirname, '..', 'templates');
|
|
10
|
+
|
|
11
|
+
const COLORS = {
|
|
12
|
+
reset: '\x1b[0m',
|
|
13
|
+
bright: '\x1b[1m',
|
|
14
|
+
red: '\x1b[31m',
|
|
15
|
+
green: '\x1b[32m',
|
|
16
|
+
yellow: '\x1b[33m',
|
|
17
|
+
cyan: '\x1b[36m',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function log(message, color = '') {
|
|
21
|
+
console.log(`${color}${message}${COLORS.reset}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function logSuccess(message) {
|
|
25
|
+
log(`✓ ${message}`, COLORS.green);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function logWarning(message) {
|
|
29
|
+
log(`⚠ ${message}`, COLORS.yellow);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function logError(message) {
|
|
33
|
+
log(`✗ ${message}`, COLORS.red);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function logInfo(message) {
|
|
37
|
+
log(` ${message}`, COLORS.cyan);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function showHelp() {
|
|
41
|
+
console.log(`
|
|
42
|
+
${COLORS.bright}Beth${COLORS.reset} - AI Orchestrator for GitHub Copilot
|
|
43
|
+
|
|
44
|
+
${COLORS.bright}Usage:${COLORS.reset}
|
|
45
|
+
npx beth-copilot init [options] Initialize Beth in current directory
|
|
46
|
+
npx beth-copilot help Show this help message
|
|
47
|
+
|
|
48
|
+
${COLORS.bright}Options:${COLORS.reset}
|
|
49
|
+
--force Overwrite existing files
|
|
50
|
+
--skip-backlog Don't create Backlog.md
|
|
51
|
+
--skip-mcp Don't create mcp.json.example
|
|
52
|
+
|
|
53
|
+
${COLORS.bright}Examples:${COLORS.reset}
|
|
54
|
+
npx beth-copilot init Set up Beth in current project
|
|
55
|
+
npx beth-copilot init --force Overwrite existing Beth files
|
|
56
|
+
|
|
57
|
+
${COLORS.bright}What gets installed:${COLORS.reset}
|
|
58
|
+
.github/agents/ 8 specialized AI agents
|
|
59
|
+
.github/skills/ 6 domain knowledge modules
|
|
60
|
+
.github/copilot-instructions.md Copilot configuration
|
|
61
|
+
AGENTS.md Workflow documentation
|
|
62
|
+
Backlog.md Task tracking file
|
|
63
|
+
mcp.json.example Optional MCP server config
|
|
64
|
+
|
|
65
|
+
${COLORS.bright}After installation:${COLORS.reset}
|
|
66
|
+
1. Open project in VS Code
|
|
67
|
+
2. Enable Agent mode in Copilot Chat
|
|
68
|
+
3. Type @Beth and tell her what you need
|
|
69
|
+
|
|
70
|
+
${COLORS.bright}Documentation:${COLORS.reset}
|
|
71
|
+
https://github.com/stephschofield/beth
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function copyDirRecursive(src, dest, options = {}) {
|
|
76
|
+
const { force = false, copiedFiles = [] } = options;
|
|
77
|
+
|
|
78
|
+
if (!existsSync(dest)) {
|
|
79
|
+
mkdirSync(dest, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const entries = readdirSync(src);
|
|
83
|
+
|
|
84
|
+
for (const entry of entries) {
|
|
85
|
+
const srcPath = join(src, entry);
|
|
86
|
+
const destPath = join(dest, entry);
|
|
87
|
+
const stats = statSync(srcPath);
|
|
88
|
+
|
|
89
|
+
if (stats.isDirectory()) {
|
|
90
|
+
copyDirRecursive(srcPath, destPath, { force, copiedFiles });
|
|
91
|
+
} else {
|
|
92
|
+
if (existsSync(destPath) && !force) {
|
|
93
|
+
logWarning(`Skipped (exists): ${relative(process.cwd(), destPath)}`);
|
|
94
|
+
} else {
|
|
95
|
+
copyFileSync(srcPath, destPath);
|
|
96
|
+
copiedFiles.push(relative(process.cwd(), destPath));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return copiedFiles;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function init(options = {}) {
|
|
105
|
+
const { force = false, skipBacklog = false, skipMcp = false } = options;
|
|
106
|
+
const cwd = process.cwd();
|
|
107
|
+
|
|
108
|
+
console.log(`
|
|
109
|
+
${COLORS.bright}🤠 Beth is moving in.${COLORS.reset}
|
|
110
|
+
${COLORS.cyan}"I don't do excuses. I do results."${COLORS.reset}
|
|
111
|
+
`);
|
|
112
|
+
|
|
113
|
+
// Check if templates exist
|
|
114
|
+
if (!existsSync(TEMPLATES_DIR)) {
|
|
115
|
+
logError('Templates directory not found. Package may be corrupted.');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const copiedFiles = [];
|
|
120
|
+
|
|
121
|
+
// Copy .github directory (agents, skills, copilot-instructions.md)
|
|
122
|
+
const githubSrc = join(TEMPLATES_DIR, '.github');
|
|
123
|
+
const githubDest = join(cwd, '.github');
|
|
124
|
+
|
|
125
|
+
if (existsSync(githubSrc)) {
|
|
126
|
+
log('\nInstalling agents and skills...');
|
|
127
|
+
copyDirRecursive(githubSrc, githubDest, { force, copiedFiles });
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Copy AGENTS.md
|
|
131
|
+
const agentsMdSrc = join(TEMPLATES_DIR, 'AGENTS.md');
|
|
132
|
+
const agentsMdDest = join(cwd, 'AGENTS.md');
|
|
133
|
+
|
|
134
|
+
if (existsSync(agentsMdSrc)) {
|
|
135
|
+
if (existsSync(agentsMdDest) && !force) {
|
|
136
|
+
logWarning('Skipped (exists): AGENTS.md');
|
|
137
|
+
} else {
|
|
138
|
+
copyFileSync(agentsMdSrc, agentsMdDest);
|
|
139
|
+
copiedFiles.push('AGENTS.md');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Copy Backlog.md (unless skipped)
|
|
144
|
+
if (!skipBacklog) {
|
|
145
|
+
const backlogSrc = join(TEMPLATES_DIR, 'Backlog.md');
|
|
146
|
+
const backlogDest = join(cwd, 'Backlog.md');
|
|
147
|
+
|
|
148
|
+
if (existsSync(backlogSrc)) {
|
|
149
|
+
if (existsSync(backlogDest) && !force) {
|
|
150
|
+
logWarning('Skipped (exists): Backlog.md');
|
|
151
|
+
} else {
|
|
152
|
+
copyFileSync(backlogSrc, backlogDest);
|
|
153
|
+
copiedFiles.push('Backlog.md');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Copy mcp.json.example (unless skipped)
|
|
159
|
+
if (!skipMcp) {
|
|
160
|
+
const mcpSrc = join(TEMPLATES_DIR, 'mcp.json.example');
|
|
161
|
+
const mcpDest = join(cwd, 'mcp.json.example');
|
|
162
|
+
|
|
163
|
+
if (existsSync(mcpSrc)) {
|
|
164
|
+
if (existsSync(mcpDest) && !force) {
|
|
165
|
+
logWarning('Skipped (exists): mcp.json.example');
|
|
166
|
+
} else {
|
|
167
|
+
copyFileSync(mcpSrc, mcpDest);
|
|
168
|
+
copiedFiles.push('mcp.json.example');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Summary
|
|
174
|
+
console.log('');
|
|
175
|
+
if (copiedFiles.length > 0) {
|
|
176
|
+
logSuccess(`Installed ${copiedFiles.length} files:`);
|
|
177
|
+
copiedFiles.forEach(f => logInfo(f));
|
|
178
|
+
} else {
|
|
179
|
+
logWarning('No files were copied. Use --force to overwrite existing files.');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Next steps
|
|
183
|
+
console.log(`
|
|
184
|
+
${COLORS.bright}Next steps:${COLORS.reset}
|
|
185
|
+
1. Open this project in VS Code
|
|
186
|
+
2. Ensure GitHub Copilot + Copilot Chat are installed
|
|
187
|
+
3. Switch to ${COLORS.cyan}Agent mode${COLORS.reset} in Copilot Chat
|
|
188
|
+
4. Type ${COLORS.cyan}@Beth${COLORS.reset} and tell her what you need
|
|
189
|
+
|
|
190
|
+
${COLORS.bright}Documentation:${COLORS.reset}
|
|
191
|
+
https://github.com/stephschofield/beth
|
|
192
|
+
|
|
193
|
+
${COLORS.cyan}"They broke my wings and forgot I had claws."${COLORS.reset}
|
|
194
|
+
`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Parse arguments
|
|
198
|
+
const args = process.argv.slice(2);
|
|
199
|
+
const command = args[0];
|
|
200
|
+
|
|
201
|
+
const options = {
|
|
202
|
+
force: args.includes('--force'),
|
|
203
|
+
skipBacklog: args.includes('--skip-backlog'),
|
|
204
|
+
skipMcp: args.includes('--skip-mcp'),
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
switch (command) {
|
|
208
|
+
case 'init':
|
|
209
|
+
init(options);
|
|
210
|
+
break;
|
|
211
|
+
case 'help':
|
|
212
|
+
case '--help':
|
|
213
|
+
case '-h':
|
|
214
|
+
showHelp();
|
|
215
|
+
break;
|
|
216
|
+
case undefined:
|
|
217
|
+
showHelp();
|
|
218
|
+
break;
|
|
219
|
+
default:
|
|
220
|
+
logError(`Unknown command: ${command}`);
|
|
221
|
+
console.log('Run "npx beth-copilot help" for usage information.');
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "beth-copilot",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Beth - A ruthless, hyper-competent AI orchestrator for GitHub Copilot multi-agent workflows",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"github-copilot",
|
|
7
|
+
"ai-agents",
|
|
8
|
+
"copilot-chat",
|
|
9
|
+
"multi-agent",
|
|
10
|
+
"orchestrator",
|
|
11
|
+
"react",
|
|
12
|
+
"nextjs",
|
|
13
|
+
"typescript"
|
|
14
|
+
],
|
|
15
|
+
"author": "Steph Schofield",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/stephschofield/beth.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/stephschofield/beth#readme",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/stephschofield/beth/issues"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"beth": "./bin/cli.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"bin/",
|
|
30
|
+
"templates/"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
},
|
|
35
|
+
"type": "module"
|
|
36
|
+
}
|