@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.
Files changed (63) hide show
  1. package/.dockerignore +7 -0
  2. package/.env.example +30 -0
  3. package/.github/workflows/ci.yml +16 -0
  4. package/.github/workflows/pages.yml +33 -0
  5. package/.github/workflows/publish.yml +45 -0
  6. package/CLAUDE.md +28 -0
  7. package/Dockerfile +37 -0
  8. package/LICENSE +21 -0
  9. package/README.md +183 -0
  10. package/bin/ove.ts +72 -0
  11. package/bun.lock +703 -0
  12. package/bunfig.toml +2 -0
  13. package/config.example.json +35 -0
  14. package/deploy/ove.service +15 -0
  15. package/docker-compose.yml +15 -0
  16. package/docs/CNAME +1 -0
  17. package/docs/examples.md +198 -0
  18. package/docs/index.html +922 -0
  19. package/docs/logo.png +0 -0
  20. package/logo.png +0 -0
  21. package/package.json +44 -0
  22. package/public/index.html +83 -0
  23. package/src/adapters/cli.ts +93 -0
  24. package/src/adapters/discord.test.ts +13 -0
  25. package/src/adapters/discord.ts +98 -0
  26. package/src/adapters/github.test.ts +21 -0
  27. package/src/adapters/github.ts +134 -0
  28. package/src/adapters/http.test.ts +87 -0
  29. package/src/adapters/http.ts +167 -0
  30. package/src/adapters/slack.ts +123 -0
  31. package/src/adapters/telegram.test.ts +15 -0
  32. package/src/adapters/telegram.ts +75 -0
  33. package/src/adapters/types.test.ts +38 -0
  34. package/src/adapters/types.ts +32 -0
  35. package/src/adapters/whatsapp.ts +118 -0
  36. package/src/adapters/wiring.test.ts +16 -0
  37. package/src/config.test.ts +51 -0
  38. package/src/config.ts +73 -0
  39. package/src/cron.test.ts +65 -0
  40. package/src/cron.ts +80 -0
  41. package/src/flows.test.ts +312 -0
  42. package/src/index.ts +588 -0
  43. package/src/logger.ts +29 -0
  44. package/src/queue.test.ts +113 -0
  45. package/src/queue.ts +131 -0
  46. package/src/repos.test.ts +31 -0
  47. package/src/repos.ts +81 -0
  48. package/src/router.test.ts +167 -0
  49. package/src/router.ts +125 -0
  50. package/src/runner.ts +21 -0
  51. package/src/runners/claude.test.ts +77 -0
  52. package/src/runners/claude.ts +107 -0
  53. package/src/schedule-flow.test.ts +67 -0
  54. package/src/schedule-parser.test.ts +37 -0
  55. package/src/schedule-parser.ts +70 -0
  56. package/src/schedules.test.ts +54 -0
  57. package/src/schedules.ts +73 -0
  58. package/src/sessions.test.ts +45 -0
  59. package/src/sessions.ts +55 -0
  60. package/src/setup.test.ts +195 -0
  61. package/src/setup.ts +248 -0
  62. package/src/smoke.test.ts +80 -0
  63. package/tsconfig.json +14 -0
package/bunfig.toml ADDED
@@ -0,0 +1,2 @@
1
+ [test]
2
+ root = "./src"
@@ -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
@@ -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
+ ```