@lovenyberg/ove 0.1.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/.dockerignore +7 -0
- package/.env.example +30 -0
- package/.github/workflows/ci.yml +16 -0
- package/.github/workflows/pages.yml +33 -0
- package/.github/workflows/publish.yml +45 -0
- package/CLAUDE.md +28 -0
- package/Dockerfile +37 -0
- package/LICENSE +21 -0
- package/README.md +183 -0
- package/bin/ove.ts +72 -0
- package/bun.lock +703 -0
- package/bunfig.toml +2 -0
- package/config.example.json +35 -0
- package/deploy/ove.service +15 -0
- package/docker-compose.yml +15 -0
- package/docs/CNAME +1 -0
- package/docs/examples.md +198 -0
- package/docs/index.html +922 -0
- package/docs/logo.png +0 -0
- package/logo.png +0 -0
- package/package.json +44 -0
- package/public/index.html +83 -0
- package/src/adapters/cli.ts +93 -0
- package/src/adapters/discord.test.ts +13 -0
- package/src/adapters/discord.ts +98 -0
- package/src/adapters/github.test.ts +21 -0
- package/src/adapters/github.ts +134 -0
- package/src/adapters/http.test.ts +87 -0
- package/src/adapters/http.ts +167 -0
- package/src/adapters/slack.ts +123 -0
- package/src/adapters/telegram.test.ts +15 -0
- package/src/adapters/telegram.ts +75 -0
- package/src/adapters/types.test.ts +38 -0
- package/src/adapters/types.ts +32 -0
- package/src/adapters/whatsapp.ts +118 -0
- package/src/adapters/wiring.test.ts +16 -0
- package/src/config.test.ts +51 -0
- package/src/config.ts +73 -0
- package/src/cron.test.ts +65 -0
- package/src/cron.ts +80 -0
- package/src/flows.test.ts +312 -0
- package/src/index.ts +588 -0
- package/src/logger.ts +29 -0
- package/src/queue.test.ts +113 -0
- package/src/queue.ts +131 -0
- package/src/repos.test.ts +31 -0
- package/src/repos.ts +81 -0
- package/src/router.test.ts +167 -0
- package/src/router.ts +125 -0
- package/src/runner.ts +21 -0
- package/src/runners/claude.test.ts +77 -0
- package/src/runners/claude.ts +107 -0
- package/src/schedule-flow.test.ts +67 -0
- package/src/schedule-parser.test.ts +37 -0
- package/src/schedule-parser.ts +70 -0
- package/src/schedules.test.ts +54 -0
- package/src/schedules.ts +73 -0
- package/src/sessions.test.ts +45 -0
- package/src/sessions.ts +55 -0
- package/src/setup.test.ts +195 -0
- package/src/setup.ts +248 -0
- package/src/smoke.test.ts +80 -0
- package/tsconfig.json +14 -0
package/bunfig.toml
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"repos": {
|
|
3
|
+
"my-app": {
|
|
4
|
+
"url": "git@github.com:user/my-app.git",
|
|
5
|
+
"defaultBranch": "main"
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
"users": {
|
|
9
|
+
"slack:U12345678": {
|
|
10
|
+
"name": "love",
|
|
11
|
+
"repos": ["my-app"]
|
|
12
|
+
},
|
|
13
|
+
"whatsapp:46701234567": {
|
|
14
|
+
"name": "love",
|
|
15
|
+
"repos": ["my-app"]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"claude": {
|
|
19
|
+
"maxTurns": 25
|
|
20
|
+
},
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"filesystem": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/YOUR_USER"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"cron": [
|
|
28
|
+
{
|
|
29
|
+
"schedule": "0 9 * * 1-5",
|
|
30
|
+
"repo": "my-app",
|
|
31
|
+
"prompt": "Review all open PRs and post review comments.",
|
|
32
|
+
"userId": "slack:U12345678"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=Ove - Personal AI coding assistant
|
|
3
|
+
After=network.target
|
|
4
|
+
|
|
5
|
+
[Service]
|
|
6
|
+
Type=simple
|
|
7
|
+
User=YOUR_USER
|
|
8
|
+
WorkingDirectory=/path/to/ove
|
|
9
|
+
ExecStart=/path/to/bun run src/index.ts
|
|
10
|
+
Restart=always
|
|
11
|
+
RestartSec=5
|
|
12
|
+
EnvironmentFile=/path/to/ove/.env
|
|
13
|
+
|
|
14
|
+
[Install]
|
|
15
|
+
WantedBy=multi-user.target
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
services:
|
|
2
|
+
ove:
|
|
3
|
+
build: .
|
|
4
|
+
env_file: .env
|
|
5
|
+
environment:
|
|
6
|
+
- ANTHROPIC_API_KEY
|
|
7
|
+
ports:
|
|
8
|
+
- "${HTTP_API_PORT:-3000}:${HTTP_API_PORT:-3000}"
|
|
9
|
+
volumes:
|
|
10
|
+
- ./config.json:/app/config.json:ro
|
|
11
|
+
- ./.env:/app/.env:ro
|
|
12
|
+
- ./repos:/app/repos
|
|
13
|
+
- ~/.ssh:/home/bun/.ssh:ro
|
|
14
|
+
- ~/.claude:/home/bun/.claude
|
|
15
|
+
restart: unless-stopped
|
package/docs/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ove.jacksoncage.se
|
package/docs/examples.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Example Interactions
|
|
2
|
+
|
|
3
|
+
Examples showing Ove across different transports and command types.
|
|
4
|
+
|
|
5
|
+
## PR Review
|
|
6
|
+
|
|
7
|
+
**Slack DM:**
|
|
8
|
+
```
|
|
9
|
+
alice: review PR #42 on my-app
|
|
10
|
+
ove: Task queued (abc12345). Working on it...
|
|
11
|
+
> Bash: gh pr diff 42
|
|
12
|
+
> Read: src/auth.ts
|
|
13
|
+
> Read: src/middleware.ts
|
|
14
|
+
ove: PR #42 review done. Left 3 inline comments:
|
|
15
|
+
- src/auth.ts:15 — potential SQL injection in query param
|
|
16
|
+
- src/middleware.ts:42 — missing error handler for async route
|
|
17
|
+
- src/utils.ts:8 — unused import
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**GitHub issue comment:**
|
|
21
|
+
```
|
|
22
|
+
@ove review PR #42
|
|
23
|
+
```
|
|
24
|
+
Ove replies with a comment containing the review summary.
|
|
25
|
+
|
|
26
|
+
## Fix Issue
|
|
27
|
+
|
|
28
|
+
**Telegram:**
|
|
29
|
+
```
|
|
30
|
+
alice: fix issue #15 on my-app
|
|
31
|
+
ove: Task queued (bbb22222). Working on it...
|
|
32
|
+
> Bash: gh issue view 15
|
|
33
|
+
> Grep: "handleAuth"
|
|
34
|
+
> Read: src/auth.ts
|
|
35
|
+
> Edit: src/auth.ts
|
|
36
|
+
> Bash: bun test
|
|
37
|
+
> Bash: git add -A && git commit -m "Fix auth token expiry check"
|
|
38
|
+
> Bash: gh pr create --title "Fix #15: auth token expiry"
|
|
39
|
+
ove: Fixed! Created PR #43:
|
|
40
|
+
https://github.com/org/my-app/pull/43
|
|
41
|
+
Changed src/auth.ts to properly check token expiry timestamps.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Validate
|
|
45
|
+
|
|
46
|
+
**Discord:**
|
|
47
|
+
```
|
|
48
|
+
alice: validate my-app
|
|
49
|
+
ove: Task queued (ccc33333). Working on it...
|
|
50
|
+
> Bash: bun test
|
|
51
|
+
> Read: package.json
|
|
52
|
+
> Bash: bunx eslint src/
|
|
53
|
+
ove: All 42 tests pass. ESLint found 3 warnings:
|
|
54
|
+
• src/utils.ts:12 — unused variable 'tmp'
|
|
55
|
+
• src/api.ts:45 — prefer const
|
|
56
|
+
• src/api.ts:88 — prefer const
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Simplify
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
alice: simplify src/router.ts in my-app
|
|
63
|
+
ove: Task queued (ddd44444). Working on it...
|
|
64
|
+
> Read: src/router.ts
|
|
65
|
+
> Edit: src/router.ts
|
|
66
|
+
> Bash: bun test
|
|
67
|
+
> Bash: gh pr create --title "Simplify src/router.ts"
|
|
68
|
+
ove: Created PR #44. Reduced cyclomatic complexity from 18 to 9.
|
|
69
|
+
Extracted 3 helper functions, removed duplicated regex logic.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Brainstorm / Discuss
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
alice: I have a new idea
|
|
76
|
+
ove: What's the idea? Tell me more about what you're thinking.
|
|
77
|
+
alice: a notification service for our platform
|
|
78
|
+
ove: Interesting! A few questions to shape this:
|
|
79
|
+
1. What types of notifications? (email, push, in-app, SMS?)
|
|
80
|
+
2. Real-time or batched?
|
|
81
|
+
3. Do users need preferences/opt-out?
|
|
82
|
+
Let's think through the architecture...
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
alice: discuss auth flow for the new API
|
|
87
|
+
ove: Let's think about this. Key questions:
|
|
88
|
+
- Who are the consumers? (internal services, external apps, users?)
|
|
89
|
+
- Do you need OAuth2/OIDC or is API key auth sufficient?
|
|
90
|
+
- What about rate limiting per client?
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Create Project
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
alice: create project my-api with template express
|
|
97
|
+
ove: Task queued (eee55555). Working on it...
|
|
98
|
+
> Bash: mkdir -p my-api && cd my-api && npm init -y
|
|
99
|
+
> Write: src/index.ts
|
|
100
|
+
> Bash: npm install express
|
|
101
|
+
> Bash: git init && git add -A && git commit -m "Initial commit"
|
|
102
|
+
> Bash: gh repo create my-api --public --push
|
|
103
|
+
ove: Project "my-api" created and pushed to GitHub:
|
|
104
|
+
https://github.com/org/my-api
|
|
105
|
+
Structure: Express + TypeScript, src/index.ts entry point
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Scheduling
|
|
109
|
+
|
|
110
|
+
**Create a recurring task:**
|
|
111
|
+
```
|
|
112
|
+
alice: validate my-app every weekday at 9:00
|
|
113
|
+
ove: Scheduled! Will run "validate my-app" Mon–Fri at 09:00.
|
|
114
|
+
Schedule #1 created.
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**List schedules:**
|
|
118
|
+
```
|
|
119
|
+
alice: list schedules
|
|
120
|
+
ove: Your scheduled tasks:
|
|
121
|
+
#1 validate my-app — Mon–Fri at 09:00
|
|
122
|
+
#2 review PR activity on my-app — every Monday at 08:00
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Remove a schedule:**
|
|
126
|
+
```
|
|
127
|
+
alice: remove schedule #1
|
|
128
|
+
ove: Schedule #1 removed.
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Free-form
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
alice: what does the auth middleware do in my-app
|
|
135
|
+
ove: Task queued (fff66666). Working on it...
|
|
136
|
+
> Glob: **/*middleware*
|
|
137
|
+
> Read: src/middleware/auth.ts
|
|
138
|
+
ove: The auth middleware in my-app:
|
|
139
|
+
1. Extracts JWT from Authorization header
|
|
140
|
+
2. Verifies signature against JWKS endpoint
|
|
141
|
+
3. Attaches decoded user to req.user
|
|
142
|
+
4. Returns 401 for invalid/missing tokens
|
|
143
|
+
Located in src/middleware/auth.ts (42 lines).
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## HTTP API
|
|
147
|
+
|
|
148
|
+
**Send a task via curl:**
|
|
149
|
+
```bash
|
|
150
|
+
curl -X POST http://localhost:3000/api/message \
|
|
151
|
+
-H "X-API-Key: your-secret" \
|
|
152
|
+
-H "Content-Type: application/json" \
|
|
153
|
+
-d '{"text": "validate my-app"}'
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Stream results via SSE:**
|
|
157
|
+
```bash
|
|
158
|
+
curl -N http://localhost:3000/api/tasks/abc12345/stream \
|
|
159
|
+
-H "X-API-Key: your-secret"
|
|
160
|
+
|
|
161
|
+
data: {"type":"status","message":"Running tests..."}
|
|
162
|
+
data: {"type":"status","message":"All 42 tests pass."}
|
|
163
|
+
data: {"type":"done","result":"Validation complete. No issues."}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Web UI:** Open `http://localhost:3000` in a browser for a chat-style interface.
|
|
167
|
+
|
|
168
|
+
## Meta Commands
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
alice: status
|
|
172
|
+
ove: Agent status: 2 pending, 1 running, 15 completed, 0 failed
|
|
173
|
+
|
|
174
|
+
alice: history
|
|
175
|
+
ove: Recent tasks:
|
|
176
|
+
• [completed] Review PR #42 (my-app)
|
|
177
|
+
• [completed] Fix issue #15 (my-app)
|
|
178
|
+
• [running] Validate my-app
|
|
179
|
+
|
|
180
|
+
alice: help
|
|
181
|
+
ove: Commands:
|
|
182
|
+
• review PR #N on <repo>
|
|
183
|
+
• fix issue #N on <repo>
|
|
184
|
+
• simplify <path> in <repo>
|
|
185
|
+
• validate <repo>
|
|
186
|
+
• discuss <topic> — brainstorm ideas (no code changes)
|
|
187
|
+
• create project <name> [with template <type>]
|
|
188
|
+
• <task> every day at <time> — schedule a recurring task
|
|
189
|
+
• list schedules — see your scheduled tasks
|
|
190
|
+
• remove schedule #N — remove a scheduled task
|
|
191
|
+
• status — show queue stats
|
|
192
|
+
• history — show recent tasks
|
|
193
|
+
• clear — reset conversation
|
|
194
|
+
• Or just type anything for free-form coding help
|
|
195
|
+
|
|
196
|
+
alice: clear
|
|
197
|
+
ove: Conversation cleared.
|
|
198
|
+
```
|