@squidcode/novadev 0.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/README.md +88 -33
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/gateway.test.d.ts +2 -0
- package/dist/commands/__tests__/gateway.test.d.ts.map +1 -0
- package/dist/commands/__tests__/gateway.test.js +133 -0
- package/dist/commands/__tests__/gateway.test.js.map +1 -0
- package/dist/commands/gateway.d.ts +13 -0
- package/dist/commands/gateway.d.ts.map +1 -0
- package/dist/commands/gateway.js +164 -0
- package/dist/commands/gateway.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/lib/__tests__/api.test.d.ts +2 -0
- package/dist/lib/__tests__/api.test.d.ts.map +1 -0
- package/dist/lib/__tests__/api.test.js +126 -0
- package/dist/lib/__tests__/api.test.js.map +1 -0
- package/dist/lib/__tests__/credentials.test.d.ts +2 -0
- package/dist/lib/__tests__/credentials.test.d.ts.map +1 -0
- package/dist/lib/__tests__/credentials.test.js +94 -0
- package/dist/lib/__tests__/credentials.test.js.map +1 -0
- package/dist/lib/api.d.ts +7 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +3 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +42 -0
- package/dist/mcp.js.map +1 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
# NovaDev
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**A senior engineer AI agent that plugs into [Nova](https://withnova.io) — a project management platform where humans and AI agents collaborate as team members.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Nova manages organizations, teams, and tasks. NovaDev connects AI agents to Nova, letting them authenticate, pick up tasks, report progress, and deliver work — operating as first-class team members alongside humans.
|
|
6
|
+
|
|
7
|
+
### Operating Modes
|
|
8
|
+
|
|
9
|
+
| Mode | Command | Description |
|
|
10
|
+
| ----------- | ----------------- | ----------------------------------------------------------------------- |
|
|
11
|
+
| **CLI** | `novadev <cmd>` | Interactive commands for auth, status reporting, and task management |
|
|
12
|
+
| **MCP** | `novadev mcp` | Stdio MCP server exposing all capabilities as tools for AI agents |
|
|
13
|
+
| **Gateway** | `novadev gateway` | Persistent polling loop that auto-claims and solves tasks via an AI CLI |
|
|
6
14
|
|
|
7
15
|
## Concepts
|
|
8
16
|
|
|
@@ -47,12 +55,44 @@ novadev whoami
|
|
|
47
55
|
# List available tasks for your teams
|
|
48
56
|
novadev tasks
|
|
49
57
|
|
|
58
|
+
# Filter tasks by team
|
|
59
|
+
novadev tasks --team <teamId>
|
|
60
|
+
|
|
61
|
+
# Claim a task
|
|
62
|
+
novadev tasks claim <taskId>
|
|
63
|
+
|
|
50
64
|
# Report status
|
|
51
65
|
novadev status start "Implementing auth flow for #42"
|
|
52
66
|
novadev status done "Completed auth flow for #42"
|
|
53
67
|
novadev status blocked "Waiting on API spec for payments"
|
|
68
|
+
|
|
69
|
+
# Report status linked to a task
|
|
70
|
+
novadev status start "Working on login" -t <taskId>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Gateway Mode
|
|
74
|
+
|
|
75
|
+
Run a persistent polling loop that automatically claims tasks and solves them using an AI CLI:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Start gateway with defaults (claude, poll every 5min, 1 task at a time)
|
|
79
|
+
novadev gateway
|
|
80
|
+
|
|
81
|
+
# Use a different AI provider
|
|
82
|
+
novadev gateway --provider codex
|
|
83
|
+
|
|
84
|
+
# Poll every 60s with up to 3 parallel tasks
|
|
85
|
+
novadev gateway --interval 60 --concurrency 3
|
|
54
86
|
```
|
|
55
87
|
|
|
88
|
+
| Option | Default | Description |
|
|
89
|
+
| ----------------------- | -------- | ----------------------------------- |
|
|
90
|
+
| `-i, --interval <s>` | `300` | Polling interval in seconds |
|
|
91
|
+
| `-c, --concurrency <n>` | `1` | Max parallel tasks |
|
|
92
|
+
| `-p, --provider <name>` | `claude` | AI CLI: `claude`, `codex`, `gemini` |
|
|
93
|
+
|
|
94
|
+
The gateway reports the provider name with each status update so Nova knows which AI system processed the task. Press Ctrl+C to shut down gracefully (waits for active tasks to finish).
|
|
95
|
+
|
|
56
96
|
### MCP Mode
|
|
57
97
|
|
|
58
98
|
NovaDev also runs as an MCP server (stdio transport), exposing the same capabilities as tools for AI agents:
|
|
@@ -62,15 +102,16 @@ NovaDev also runs as an MCP server (stdio transport), exposing the same capabili
|
|
|
62
102
|
novadev mcp
|
|
63
103
|
```
|
|
64
104
|
|
|
65
|
-
| Tool | Description
|
|
66
|
-
| ------------------ |
|
|
67
|
-
| `nova_auth` | Authenticate with an org using an invite token
|
|
68
|
-
| `nova_whoami` | Check agent identity and team memberships
|
|
69
|
-
| `nova_status` | Report work status (start/done/blocked)
|
|
70
|
-
| `nova_tasks` | List available tasks for your teams
|
|
71
|
-
| `nova_tasks_claim` | Claim an available task
|
|
105
|
+
| Tool | Description |
|
|
106
|
+
| ------------------ | ------------------------------------------------------ |
|
|
107
|
+
| `nova_auth` | Authenticate with an org using an invite token |
|
|
108
|
+
| `nova_whoami` | Check agent identity and team memberships |
|
|
109
|
+
| `nova_status` | Report work status (start/done/blocked) |
|
|
110
|
+
| `nova_tasks` | List available tasks for your teams |
|
|
111
|
+
| `nova_tasks_claim` | Claim an available task |
|
|
112
|
+
| `nova_announce` | Announce agent role, provider, model, and capabilities |
|
|
72
113
|
|
|
73
|
-
Add to your Claude Code MCP config (`~/.claude/
|
|
114
|
+
Add to your Claude Code MCP config (`~/.claude/settings.json` or project-level `.claude/settings.json`):
|
|
74
115
|
|
|
75
116
|
```json
|
|
76
117
|
{
|
|
@@ -108,18 +149,16 @@ Add to your Claude Code MCP config (`~/.claude/claude_desktop_config.json`):
|
|
|
108
149
|
└─────────────────────────────────────┘
|
|
109
150
|
```
|
|
110
151
|
|
|
111
|
-
## API Endpoints
|
|
152
|
+
## API Endpoints
|
|
112
153
|
|
|
113
154
|
### Auth
|
|
114
155
|
|
|
115
|
-
- `POST /api/agents/invite` — Admin creates agent invite → returns invite token
|
|
116
156
|
- `POST /api/agents/auth` — Agent exchanges invite token for auth credential
|
|
117
157
|
- `GET /api/agents/me` — Get agent identity, org, and teams
|
|
118
158
|
|
|
119
159
|
### Status Reporting
|
|
120
160
|
|
|
121
161
|
- `POST /api/agents/status` — Report work status (start/done/blocked)
|
|
122
|
-
- `GET /api/agents/status/:agentId` — Get agent's current status
|
|
123
162
|
|
|
124
163
|
### Tasks
|
|
125
164
|
|
|
@@ -127,21 +166,34 @@ Add to your Claude Code MCP config (`~/.claude/claude_desktop_config.json`):
|
|
|
127
166
|
- `GET /api/agents/me/tasks` — List tasks across all agent's teams
|
|
128
167
|
- `POST /api/tasks/:taskId/claim` — Agent claims a task
|
|
129
168
|
|
|
130
|
-
###
|
|
169
|
+
### Announcements
|
|
131
170
|
|
|
132
|
-
- `POST /api/
|
|
133
|
-
- `DELETE /api/teams/:teamId/agents/:agentId` — Remove agent from team
|
|
134
|
-
- `PUT /api/agents/:agentId` — Update agent name/config
|
|
171
|
+
- `POST /api/agents/announce` — Announce agent role, provider, model, and capabilities
|
|
135
172
|
|
|
136
173
|
## Credential Storage
|
|
137
174
|
|
|
138
175
|
```
|
|
139
176
|
~/.novadev/
|
|
140
|
-
credentials.json
|
|
177
|
+
credentials.json
|
|
141
178
|
```
|
|
142
179
|
|
|
143
|
-
|
|
144
|
-
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"orgs": {
|
|
183
|
+
"<orgId>": {
|
|
184
|
+
"agentId": "...",
|
|
185
|
+
"token": "...",
|
|
186
|
+
"name": "...",
|
|
187
|
+
"orgName": "...",
|
|
188
|
+
"authenticatedAt": "..."
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"defaultOrg": "<orgId>"
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
- Supports multiple orgs, with a default active org
|
|
196
|
+
- Agent authenticates once per org, credential persists
|
|
145
197
|
- Token used for all subsequent API calls
|
|
146
198
|
|
|
147
199
|
## Tech Stack
|
|
@@ -157,29 +209,32 @@ Add to your Claude Code MCP config (`~/.claude/claude_desktop_config.json`):
|
|
|
157
209
|
|
|
158
210
|
### Phase 1: Auth & Identity
|
|
159
211
|
|
|
160
|
-
- [
|
|
161
|
-
- [
|
|
162
|
-
- [
|
|
163
|
-
- [
|
|
164
|
-
- [ ] `novadev whoami` command
|
|
212
|
+
- [x] Token exchange endpoint
|
|
213
|
+
- [x] `novadev auth` command
|
|
214
|
+
- [x] Local credential storage
|
|
215
|
+
- [x] `novadev whoami` command
|
|
165
216
|
|
|
166
217
|
### Phase 2: Status Reporting
|
|
167
218
|
|
|
168
|
-
- [
|
|
169
|
-
- [
|
|
170
|
-
- [ ] Nova receives and displays agent activity
|
|
219
|
+
- [x] `novadev status` command
|
|
220
|
+
- [x] Nova receives and displays agent activity
|
|
171
221
|
|
|
172
222
|
### Phase 3: Task Management
|
|
173
223
|
|
|
174
|
-
- [
|
|
175
|
-
- [
|
|
176
|
-
- [ ] Task claiming flow
|
|
224
|
+
- [x] `novadev tasks` command
|
|
225
|
+
- [x] Task claiming flow
|
|
177
226
|
|
|
178
227
|
### Phase 4: MCP Integration
|
|
179
228
|
|
|
180
229
|
- [x] MCP server mode (`novadev mcp`)
|
|
181
230
|
- [x] All CLI commands as MCP tools
|
|
182
|
-
|
|
231
|
+
|
|
232
|
+
### Phase 5: Gateway Mode
|
|
233
|
+
|
|
234
|
+
- [x] Persistent polling loop
|
|
235
|
+
- [x] Multi-provider support (claude, codex, gemini)
|
|
236
|
+
- [x] Configurable concurrency and polling interval
|
|
237
|
+
- [x] Agent capability announcement
|
|
183
238
|
|
|
184
239
|
## License
|
|
185
240
|
|
|
@@ -187,4 +242,4 @@ MIT
|
|
|
187
242
|
|
|
188
243
|
---
|
|
189
244
|
|
|
190
|
-
_Part of the [Nova](https://
|
|
245
|
+
_Part of the [Nova](https://withnova.io) ecosystem by [Squidcode](https://squidcode.com)_
|
package/dist/cli.js
CHANGED
|
@@ -6,15 +6,17 @@ const auth_js_1 = require("./commands/auth.js");
|
|
|
6
6
|
const whoami_js_1 = require("./commands/whoami.js");
|
|
7
7
|
const status_js_1 = require("./commands/status.js");
|
|
8
8
|
const tasks_js_1 = require("./commands/tasks.js");
|
|
9
|
+
const gateway_js_1 = require("./commands/gateway.js");
|
|
9
10
|
const mcp_js_1 = require("./mcp.js");
|
|
10
11
|
const program = new commander_1.Command()
|
|
11
12
|
.name('novadev')
|
|
12
13
|
.description('Connect AI agents to your teams in the Nova system')
|
|
13
|
-
.version('
|
|
14
|
+
.version('1.2.0');
|
|
14
15
|
program.addCommand(auth_js_1.authCommand);
|
|
15
16
|
program.addCommand(whoami_js_1.whoamiCommand);
|
|
16
17
|
program.addCommand(status_js_1.statusCommand);
|
|
17
18
|
program.addCommand(tasks_js_1.tasksCommand);
|
|
19
|
+
program.addCommand(gateway_js_1.gatewayCommand);
|
|
18
20
|
program
|
|
19
21
|
.command('mcp')
|
|
20
22
|
.description('Start as an MCP server (stdio transport)')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAAiD;AACjD,oDAAqD;AACrD,oDAAqD;AACrD,kDAAmD;AACnD,qCAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAAiD;AACjD,oDAAqD;AACrD,oDAAqD;AACrD,kDAAmD;AACnD,sDAAuD;AACvD,qCAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,2BAAc,CAAC,CAAC;AAEnC,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,uBAAc,GAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/gateway.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
vitest_1.vi.mock('node:child_process', () => ({
|
|
6
|
+
execFile: vitest_1.vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
vitest_1.vi.mock('../../lib/api.js', () => ({
|
|
9
|
+
api: {
|
|
10
|
+
claimTask: vitest_1.vi.fn().mockResolvedValue({}),
|
|
11
|
+
reportStatus: vitest_1.vi.fn().mockResolvedValue({}),
|
|
12
|
+
tasks: vitest_1.vi.fn().mockResolvedValue([]),
|
|
13
|
+
announce: vitest_1.vi.fn().mockResolvedValue({}),
|
|
14
|
+
},
|
|
15
|
+
}));
|
|
16
|
+
vitest_1.vi.mock('../../lib/credentials.js', () => ({
|
|
17
|
+
getActiveCredential: vitest_1.vi.fn(),
|
|
18
|
+
}));
|
|
19
|
+
vitest_1.vi.mock('../../config.js', () => ({
|
|
20
|
+
getApiUrl: () => 'https://test.api',
|
|
21
|
+
NOVADEV_DIR: '/tmp/.novadev',
|
|
22
|
+
CREDENTIALS_FILE: '/tmp/.novadev/credentials.json',
|
|
23
|
+
}));
|
|
24
|
+
const api_js_1 = require("../../lib/api.js");
|
|
25
|
+
const gateway_js_1 = require("../gateway.js");
|
|
26
|
+
const mockExecFile = vitest_1.vi.mocked(node_child_process_1.execFile);
|
|
27
|
+
const mockApi = vitest_1.vi.mocked(api_js_1.api);
|
|
28
|
+
const fakeTask = {
|
|
29
|
+
id: 'task-1',
|
|
30
|
+
title: 'Fix bug',
|
|
31
|
+
description: 'Fix the login bug',
|
|
32
|
+
status: 'open',
|
|
33
|
+
teamId: 'team-1',
|
|
34
|
+
teamName: 'Alpha',
|
|
35
|
+
assigneeId: null,
|
|
36
|
+
priority: 'high',
|
|
37
|
+
createdAt: '2025-01-01',
|
|
38
|
+
};
|
|
39
|
+
(0, vitest_1.beforeEach)(() => {
|
|
40
|
+
vitest_1.vi.clearAllMocks();
|
|
41
|
+
mockApi.claimTask.mockResolvedValue({});
|
|
42
|
+
mockApi.reportStatus.mockResolvedValue(undefined);
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.describe)('provider validation', () => {
|
|
45
|
+
(0, vitest_1.it)('rejects unknown provider via PROVIDERS lookup', () => {
|
|
46
|
+
(0, vitest_1.expect)(gateway_js_1.PROVIDERS['nonexistent']).toBeUndefined();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.describe)('verifyProvider', () => {
|
|
50
|
+
(0, vitest_1.it)('resolves with version string when command exists', async () => {
|
|
51
|
+
mockExecFile.mockImplementation((_cmd, _args, cb) => {
|
|
52
|
+
cb(null, 'claude-code 1.2.3\n');
|
|
53
|
+
return undefined;
|
|
54
|
+
});
|
|
55
|
+
await (0, vitest_1.expect)((0, gateway_js_1.verifyProvider)('claude')).resolves.toBe('claude-code 1.2.3');
|
|
56
|
+
(0, vitest_1.expect)(mockExecFile).toHaveBeenCalledWith('claude', ['--version'], vitest_1.expect.any(Function));
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('rejects when command not found', async () => {
|
|
59
|
+
mockExecFile.mockImplementation((_cmd, _args, cb) => {
|
|
60
|
+
cb(new Error('ENOENT'), '');
|
|
61
|
+
return undefined;
|
|
62
|
+
});
|
|
63
|
+
await (0, vitest_1.expect)((0, gateway_js_1.verifyProvider)('claude')).rejects.toThrow('not installed or not in PATH');
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.it)('resolves with empty string when stdout is empty', async () => {
|
|
66
|
+
mockExecFile.mockImplementation((_cmd, _args, cb) => {
|
|
67
|
+
cb(null, '');
|
|
68
|
+
return undefined;
|
|
69
|
+
});
|
|
70
|
+
await (0, vitest_1.expect)((0, gateway_js_1.verifyProvider)('claude')).resolves.toBe('');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.describe)('processTask', () => {
|
|
74
|
+
(0, vitest_1.it)('claims task, reports start, runs provider, reports done', async () => {
|
|
75
|
+
mockExecFile.mockImplementation((_cmd, _args, _opts, cb) => {
|
|
76
|
+
cb(null, 'Task completed');
|
|
77
|
+
return undefined;
|
|
78
|
+
});
|
|
79
|
+
await (0, gateway_js_1.processTask)(fakeTask, 'claude');
|
|
80
|
+
(0, vitest_1.expect)(mockApi.claimTask).toHaveBeenCalledWith('task-1');
|
|
81
|
+
(0, vitest_1.expect)(mockApi.reportStatus).toHaveBeenCalledWith('start', '[claude] Fix bug', 'task-1');
|
|
82
|
+
(0, vitest_1.expect)(mockApi.reportStatus).toHaveBeenCalledWith('done', '[claude] Task completed', 'task-1');
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('reports blocked status on CLI failure', async () => {
|
|
85
|
+
mockExecFile.mockImplementation((_cmd, _args, _opts, cb) => {
|
|
86
|
+
cb(new Error('CLI crashed'), '');
|
|
87
|
+
return undefined;
|
|
88
|
+
});
|
|
89
|
+
await (0, gateway_js_1.processTask)(fakeTask, 'claude');
|
|
90
|
+
(0, vitest_1.expect)(mockApi.reportStatus).toHaveBeenCalledWith('blocked', '[claude] CLI crashed', 'task-1');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.describe)('output truncation', () => {
|
|
94
|
+
(0, vitest_1.it)('truncates stdout over MAX_OUTPUT_BYTES', async () => {
|
|
95
|
+
const longOutput = 'x'.repeat(gateway_js_1.MAX_OUTPUT_BYTES + 1000);
|
|
96
|
+
mockExecFile.mockImplementation((_cmd, _args, _opts, cb) => {
|
|
97
|
+
cb(null, longOutput);
|
|
98
|
+
return undefined;
|
|
99
|
+
});
|
|
100
|
+
await (0, gateway_js_1.processTask)(fakeTask, 'claude');
|
|
101
|
+
const doneCall = mockApi.reportStatus.mock.calls.find((c) => c[0] === 'done');
|
|
102
|
+
(0, vitest_1.expect)(doneCall).toBeDefined();
|
|
103
|
+
// The message is "[claude] " + truncated output
|
|
104
|
+
const reportedOutput = doneCall[1].replace('[claude] ', '');
|
|
105
|
+
(0, vitest_1.expect)(reportedOutput.length).toBe(gateway_js_1.MAX_OUTPUT_BYTES);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.describe)('AGENT_CAPABILITIES', () => {
|
|
109
|
+
(0, vitest_1.it)('is a non-empty array of strings', () => {
|
|
110
|
+
(0, vitest_1.expect)(gateway_js_1.AGENT_CAPABILITIES.length).toBeGreaterThan(0);
|
|
111
|
+
for (const cap of gateway_js_1.AGENT_CAPABILITIES) {
|
|
112
|
+
(0, vitest_1.expect)(typeof cap).toBe('string');
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.describe)('announcement at startup', () => {
|
|
117
|
+
(0, vitest_1.it)('api.announce is callable with expected payload shape', () => {
|
|
118
|
+
const payload = {
|
|
119
|
+
role: 'Senior full-stack engineer',
|
|
120
|
+
provider: 'claude',
|
|
121
|
+
model: 'claude-code 1.2.3',
|
|
122
|
+
capabilities: gateway_js_1.AGENT_CAPABILITIES,
|
|
123
|
+
};
|
|
124
|
+
mockApi.announce(payload);
|
|
125
|
+
(0, vitest_1.expect)(mockApi.announce).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
126
|
+
role: 'Senior full-stack engineer',
|
|
127
|
+
provider: 'claude',
|
|
128
|
+
model: 'claude-code 1.2.3',
|
|
129
|
+
capabilities: vitest_1.expect.arrayContaining(['Full-stack web development']),
|
|
130
|
+
}));
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=gateway.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/gateway.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { Task } from '../lib/api.js';
|
|
3
|
+
export declare const MAX_OUTPUT_BYTES = 4096;
|
|
4
|
+
export declare const PROVIDERS: Record<string, {
|
|
5
|
+
command: string;
|
|
6
|
+
buildArgs: (prompt: string) => string[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare const AGENT_CAPABILITIES: string[];
|
|
9
|
+
export declare function verifyProvider(provider: string): Promise<string>;
|
|
10
|
+
export declare function runProvider(provider: string, prompt: string): Promise<string>;
|
|
11
|
+
export declare function processTask(task: Task, provider: string): Promise<void>;
|
|
12
|
+
export declare const gatewayCommand: Command;
|
|
13
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAwB,IAAI,EAAE,MAAM,eAAe,CAAC;AAG3D,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,SAAS,EAAE,MAAM,CAC5B,MAAM,EACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;CAAE,CAK7D,CAAC;AAUF,eAAO,MAAM,kBAAkB,UAS9B,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY7E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB7E;AAMD,eAAO,MAAM,cAAc,SA8FvB,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gatewayCommand = exports.AGENT_CAPABILITIES = exports.PROVIDERS = exports.MAX_OUTPUT_BYTES = void 0;
|
|
4
|
+
exports.verifyProvider = verifyProvider;
|
|
5
|
+
exports.runProvider = runProvider;
|
|
6
|
+
exports.processTask = processTask;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const api_js_1 = require("../lib/api.js");
|
|
10
|
+
const credentials_js_1 = require("../lib/credentials.js");
|
|
11
|
+
exports.MAX_OUTPUT_BYTES = 4096;
|
|
12
|
+
exports.PROVIDERS = {
|
|
13
|
+
claude: { command: 'claude', buildArgs: (p) => ['-p', p] },
|
|
14
|
+
codex: { command: 'codex', buildArgs: (p) => ['-q', p] },
|
|
15
|
+
gemini: { command: 'gemini', buildArgs: (p) => ['-p', p] },
|
|
16
|
+
};
|
|
17
|
+
function timestamp() {
|
|
18
|
+
return new Date().toLocaleTimeString('en-US', { hour12: false });
|
|
19
|
+
}
|
|
20
|
+
function log(msg) {
|
|
21
|
+
console.log(`[${timestamp()}] ${msg}`);
|
|
22
|
+
}
|
|
23
|
+
exports.AGENT_CAPABILITIES = [
|
|
24
|
+
'Proficient in all programming languages',
|
|
25
|
+
'Full-stack web development',
|
|
26
|
+
'API design and implementation',
|
|
27
|
+
'Database design and query optimization',
|
|
28
|
+
'Code review and refactoring',
|
|
29
|
+
'Bug diagnosis and resolution',
|
|
30
|
+
'Testing and CI/CD pipelines',
|
|
31
|
+
'System architecture and infrastructure',
|
|
32
|
+
];
|
|
33
|
+
function verifyProvider(provider) {
|
|
34
|
+
const { command } = exports.PROVIDERS[provider];
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
(0, node_child_process_1.execFile)(command, ['--version'], (err, stdout) => {
|
|
37
|
+
if (err) {
|
|
38
|
+
reject(new Error(`"${command}" is not installed or not in PATH`));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
resolve((stdout ?? '').trim());
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function runProvider(provider, prompt) {
|
|
47
|
+
const { command, buildArgs } = exports.PROVIDERS[provider];
|
|
48
|
+
const args = buildArgs(prompt);
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
(0, node_child_process_1.execFile)(command, args, { maxBuffer: exports.MAX_OUTPUT_BYTES * 2 }, (err, stdout) => {
|
|
51
|
+
if (err) {
|
|
52
|
+
reject(err);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
resolve(stdout.slice(0, exports.MAX_OUTPUT_BYTES));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function processTask(task, provider) {
|
|
61
|
+
const label = `[${task.id}]`;
|
|
62
|
+
try {
|
|
63
|
+
await api_js_1.api.claimTask(task.id);
|
|
64
|
+
log(`Claiming: "${task.title}" (${task.id})`);
|
|
65
|
+
await api_js_1.api.reportStatus('start', `[${provider}] ${task.title}`, task.id);
|
|
66
|
+
const prompt = `Task: ${task.title}\n\n${task.description}`;
|
|
67
|
+
const { command, buildArgs } = exports.PROVIDERS[provider];
|
|
68
|
+
log(`${label} Running: ${command} ${buildArgs('...').join(' ')}`);
|
|
69
|
+
const startTime = Date.now();
|
|
70
|
+
const output = await runProvider(provider, prompt);
|
|
71
|
+
const elapsed = Math.round((Date.now() - startTime) / 1000);
|
|
72
|
+
await api_js_1.api.reportStatus('done', `[${provider}] ${output}`, task.id);
|
|
73
|
+
log(`${label} Done (${elapsed}s)`);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
77
|
+
await api_js_1.api.reportStatus('blocked', `[${provider}] ${message}`, task.id).catch(() => { });
|
|
78
|
+
log(`${label} Error: ${message}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function sleep(ms) {
|
|
82
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
83
|
+
}
|
|
84
|
+
exports.gatewayCommand = new commander_1.Command('gateway')
|
|
85
|
+
.description('Run a persistent polling loop that claims and solves tasks via an AI CLI')
|
|
86
|
+
.option('-i, --interval <seconds>', 'Polling interval in seconds', '300')
|
|
87
|
+
.option('-c, --concurrency <n>', 'Max parallel tasks', '1')
|
|
88
|
+
.option('-p, --provider <name>', `AI CLI to use: ${Object.keys(exports.PROVIDERS).join(', ')}`, 'claude')
|
|
89
|
+
.action(async (opts) => {
|
|
90
|
+
if (!(0, credentials_js_1.getActiveCredential)()) {
|
|
91
|
+
console.error('Not authenticated. Run: novadev auth <token>');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
const provider = opts.provider;
|
|
95
|
+
if (!exports.PROVIDERS[provider]) {
|
|
96
|
+
console.error(`Unknown provider "${provider}". Available: ${Object.keys(exports.PROVIDERS).join(', ')}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
const interval = parseInt(opts.interval, 10) * 1000;
|
|
100
|
+
const concurrency = parseInt(opts.concurrency, 10);
|
|
101
|
+
let model = '';
|
|
102
|
+
try {
|
|
103
|
+
model = await verifyProvider(provider);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const payload = {
|
|
110
|
+
role: 'Senior full-stack engineer',
|
|
111
|
+
provider,
|
|
112
|
+
model,
|
|
113
|
+
capabilities: exports.AGENT_CAPABILITIES,
|
|
114
|
+
};
|
|
115
|
+
try {
|
|
116
|
+
await api_js_1.api.announce(payload);
|
|
117
|
+
log(`Announced to Nova: provider=${provider} model=${model || '(unknown)'}`);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
121
|
+
log(`Announce failed (non-fatal): ${message}`);
|
|
122
|
+
}
|
|
123
|
+
log(`Gateway started. Provider: ${provider}. Polling every ${opts.interval}s. Concurrency: ${concurrency}. Ctrl+C to stop.`);
|
|
124
|
+
let shutdownRequested = false;
|
|
125
|
+
let activeTasks = 0;
|
|
126
|
+
process.on('SIGINT', () => {
|
|
127
|
+
if (shutdownRequested)
|
|
128
|
+
process.exit(1);
|
|
129
|
+
shutdownRequested = true;
|
|
130
|
+
log(`Shutting down... waiting for ${activeTasks} active task(s)`);
|
|
131
|
+
});
|
|
132
|
+
while (!shutdownRequested) {
|
|
133
|
+
log('Polling for tasks...');
|
|
134
|
+
try {
|
|
135
|
+
const tasks = await api_js_1.api.tasks();
|
|
136
|
+
const available = tasks.filter((t) => !t.assigneeId);
|
|
137
|
+
if (available.length === 0) {
|
|
138
|
+
log('No tasks available. Waiting...');
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
log(`Found ${available.length} task(s)`);
|
|
142
|
+
const slots = concurrency - activeTasks;
|
|
143
|
+
const batch = available.slice(0, slots);
|
|
144
|
+
for (const task of batch) {
|
|
145
|
+
activeTasks++;
|
|
146
|
+
processTask(task, provider).finally(() => {
|
|
147
|
+
activeTasks--;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
154
|
+
log(`Poll error: ${message}`);
|
|
155
|
+
}
|
|
156
|
+
await sleep(interval);
|
|
157
|
+
}
|
|
158
|
+
// Wait for active tasks to finish
|
|
159
|
+
while (activeTasks > 0) {
|
|
160
|
+
await sleep(500);
|
|
161
|
+
}
|
|
162
|
+
log('Gateway stopped.');
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const NOVADEV_DIR: string;
|
|
2
2
|
export declare const CREDENTIALS_FILE: string;
|
|
3
|
-
export declare const DEFAULT_API_URL = "https://
|
|
3
|
+
export declare const DEFAULT_API_URL = "https://withnova.io";
|
|
4
4
|
export declare function getApiUrl(): string;
|
|
5
5
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,gBAAgB,QAA6C,CAAC;AAE3E,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,gBAAgB,QAA6C,CAAC;AAE3E,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
|
package/dist/config.js
CHANGED
|
@@ -9,7 +9,7 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
9
9
|
const node_os_1 = __importDefault(require("node:os"));
|
|
10
10
|
exports.NOVADEV_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.novadev');
|
|
11
11
|
exports.CREDENTIALS_FILE = node_path_1.default.join(exports.NOVADEV_DIR, 'credentials.json');
|
|
12
|
-
exports.DEFAULT_API_URL = 'https://
|
|
12
|
+
exports.DEFAULT_API_URL = 'https://withnova.io';
|
|
13
13
|
function getApiUrl() {
|
|
14
14
|
return process.env.NOVA_API_URL || exports.DEFAULT_API_URL;
|
|
15
15
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAQA,8BAEC;AAVD,0DAA6B;AAC7B,sDAAyB;AAEZ,QAAA,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,QAAA,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,mBAAW,EAAE,kBAAkB,CAAC,CAAC;AAE9D,QAAA,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAQA,8BAEC;AAVD,0DAA6B;AAC7B,sDAAyB;AAEZ,QAAA,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,QAAA,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,mBAAW,EAAE,kBAAkB,CAAC,CAAC;AAE9D,QAAA,eAAe,GAAG,qBAAqB,CAAC;AAErD,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAe,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
vitest_1.vi.mock('../credentials.js', () => ({
|
|
5
|
+
getActiveCredential: vitest_1.vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vitest_1.vi.mock('../../config.js', () => ({
|
|
8
|
+
getApiUrl: () => 'https://test.api',
|
|
9
|
+
}));
|
|
10
|
+
const api_js_1 = require("../api.js");
|
|
11
|
+
const credentials_js_1 = require("../credentials.js");
|
|
12
|
+
const mockCredential = vitest_1.vi.mocked(credentials_js_1.getActiveCredential);
|
|
13
|
+
function mockFetch(body, ok = true, status = 200) {
|
|
14
|
+
const fn = vitest_1.vi.fn().mockResolvedValue({
|
|
15
|
+
ok,
|
|
16
|
+
status,
|
|
17
|
+
statusText: 'Error',
|
|
18
|
+
json: () => Promise.resolve(body),
|
|
19
|
+
text: () => Promise.resolve(typeof body === 'string' ? body : JSON.stringify(body)),
|
|
20
|
+
});
|
|
21
|
+
global.fetch = fn;
|
|
22
|
+
return fn;
|
|
23
|
+
}
|
|
24
|
+
(0, vitest_1.beforeEach)(() => {
|
|
25
|
+
vitest_1.vi.restoreAllMocks();
|
|
26
|
+
mockCredential.mockReturnValue(null);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.describe)('request helper', () => {
|
|
29
|
+
(0, vitest_1.it)('includes auth header when credential exists', async () => {
|
|
30
|
+
mockCredential.mockReturnValue({
|
|
31
|
+
agentId: 'a1',
|
|
32
|
+
token: 'tok-123',
|
|
33
|
+
name: 'bot',
|
|
34
|
+
orgName: 'org',
|
|
35
|
+
orgId: 'o1',
|
|
36
|
+
authenticatedAt: '',
|
|
37
|
+
});
|
|
38
|
+
const fetchSpy = mockFetch({ agentId: 'a1' });
|
|
39
|
+
await api_js_1.api.me();
|
|
40
|
+
const headers = fetchSpy.mock.calls[0][1].headers;
|
|
41
|
+
(0, vitest_1.expect)(headers['Authorization']).toBe('Bearer tok-123');
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('omits auth header when no credential', async () => {
|
|
44
|
+
const fetchSpy = mockFetch({ agentId: 'a1' });
|
|
45
|
+
await api_js_1.api.me();
|
|
46
|
+
const headers = fetchSpy.mock.calls[0][1].headers;
|
|
47
|
+
(0, vitest_1.expect)(headers['Authorization']).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.describe)('error handling', () => {
|
|
51
|
+
(0, vitest_1.it)('throws NovaApiError on non-OK response', async () => {
|
|
52
|
+
mockFetch('Forbidden', false, 403);
|
|
53
|
+
await (0, vitest_1.expect)(api_js_1.api.me()).rejects.toThrow(api_js_1.NovaApiError);
|
|
54
|
+
await (0, vitest_1.expect)(api_js_1.api.me()).rejects.toMatchObject({ status: 403, message: 'Forbidden' });
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.describe)('api.auth', () => {
|
|
58
|
+
(0, vitest_1.it)('POSTs to /api/agents/auth with invite token', async () => {
|
|
59
|
+
const fetchSpy = mockFetch({
|
|
60
|
+
agentId: 'a1',
|
|
61
|
+
token: 't',
|
|
62
|
+
orgId: 'o',
|
|
63
|
+
orgName: 'O',
|
|
64
|
+
name: 'n',
|
|
65
|
+
teams: [],
|
|
66
|
+
});
|
|
67
|
+
await api_js_1.api.auth('invite-abc');
|
|
68
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/agents/auth', vitest_1.expect.objectContaining({
|
|
69
|
+
method: 'POST',
|
|
70
|
+
body: JSON.stringify({ inviteToken: 'invite-abc' }),
|
|
71
|
+
}));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.describe)('api.me', () => {
|
|
75
|
+
(0, vitest_1.it)('GETs /api/agents/me', async () => {
|
|
76
|
+
const fetchSpy = mockFetch({ agentId: 'a1' });
|
|
77
|
+
await api_js_1.api.me();
|
|
78
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/agents/me', vitest_1.expect.objectContaining({ method: 'GET' }));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.describe)('api.reportStatus', () => {
|
|
82
|
+
(0, vitest_1.it)('POSTs with type, message, and taskId', async () => {
|
|
83
|
+
const fetchSpy = mockFetch({});
|
|
84
|
+
await api_js_1.api.reportStatus('start', 'working', 'task-1');
|
|
85
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/agents/status', vitest_1.expect.objectContaining({
|
|
86
|
+
method: 'POST',
|
|
87
|
+
body: JSON.stringify({ type: 'start', message: 'working', taskId: 'task-1' }),
|
|
88
|
+
}));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.describe)('api.tasks', () => {
|
|
92
|
+
(0, vitest_1.it)('GETs /api/agents/me/tasks when no teamId', async () => {
|
|
93
|
+
const fetchSpy = mockFetch([]);
|
|
94
|
+
await api_js_1.api.tasks();
|
|
95
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/agents/me/tasks', vitest_1.expect.objectContaining({ method: 'GET' }));
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)('GETs /api/teams/:id/tasks when teamId provided', async () => {
|
|
98
|
+
const fetchSpy = mockFetch([]);
|
|
99
|
+
await api_js_1.api.tasks('team-1');
|
|
100
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/teams/team-1/tasks', vitest_1.expect.objectContaining({ method: 'GET' }));
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.describe)('api.claimTask', () => {
|
|
104
|
+
(0, vitest_1.it)('POSTs to /api/tasks/:id/claim', async () => {
|
|
105
|
+
const fetchSpy = mockFetch({});
|
|
106
|
+
await api_js_1.api.claimTask('task-42');
|
|
107
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/tasks/task-42/claim', vitest_1.expect.objectContaining({ method: 'POST' }));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.describe)('api.announce', () => {
|
|
111
|
+
(0, vitest_1.it)('POSTs to /api/agents/announce with payload', async () => {
|
|
112
|
+
const fetchSpy = mockFetch({});
|
|
113
|
+
const payload = {
|
|
114
|
+
role: 'Senior full-stack engineer',
|
|
115
|
+
provider: 'claude',
|
|
116
|
+
model: 'claude-code 1.0.0',
|
|
117
|
+
capabilities: ['Full-stack web development'],
|
|
118
|
+
};
|
|
119
|
+
await api_js_1.api.announce(payload);
|
|
120
|
+
(0, vitest_1.expect)(fetchSpy).toHaveBeenCalledWith('https://test.api/api/agents/announce', vitest_1.expect.objectContaining({
|
|
121
|
+
method: 'POST',
|
|
122
|
+
body: JSON.stringify(payload),
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/api.test.ts"],"names":[],"mappings":";;AAAA,mCAA8D;AAE9D,WAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,mBAAmB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC7B,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,SAAS,EAAE,GAAG,EAAE,CAAC,kBAAkB;CACpC,CAAC,CAAC,CAAC;AAEJ,sCAA8C;AAC9C,sDAAwD;AAExD,MAAM,cAAc,GAAG,WAAE,CAAC,MAAM,CAAC,oCAAmB,CAAC,CAAC;AAEtD,SAAS,SAAS,CAAC,IAAa,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG;IACvD,MAAM,EAAE,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;QACnC,EAAE;QACF,MAAM;QACN,UAAU,EAAE,OAAO;QACnB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KACpF,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,WAAE,CAAC,eAAe,EAAE,CAAC;IACrB,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,cAAc,CAAC,eAAe,CAAC;YAC7B,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,YAAG,CAAC,EAAE,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,IAAA,eAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,YAAG,CAAC,EAAE,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,IAAA,eAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,IAAA,eAAM,EAAC,YAAG,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAY,CAAC,CAAC;QACrD,MAAM,IAAA,eAAM,EAAC,YAAG,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAA,WAAE,EAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC;YACzB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,GAAG;YACZ,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,MAAM,YAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7B,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,kCAAkC,EAClC,eAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;SACpD,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAA,WAAE,EAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,YAAG,CAAC,EAAE,EAAE,CAAC;QAEf,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,gCAAgC,EAChC,eAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,YAAG,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAErD,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,oCAAoC,EACpC,eAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAC9E,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,YAAG,CAAC,KAAK,EAAE,CAAC;QAElB,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,sCAAsC,EACtC,eAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,YAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1B,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,yCAAyC,EACzC,eAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,YAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE/B,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,0CAA0C,EAC1C,eAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE,CAAC,4BAA4B,CAAC;SAC7C,CAAC;QAEF,MAAM,YAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5B,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,sCAAsC,EACtC,eAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/credentials.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
vitest_1.vi.mock('node:fs');
|
|
8
|
+
vitest_1.vi.mock('../../config.js', () => ({
|
|
9
|
+
NOVADEV_DIR: '/home/test/.novadev',
|
|
10
|
+
CREDENTIALS_FILE: '/home/test/.novadev/credentials.json',
|
|
11
|
+
}));
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
const credentials_js_1 = require("../credentials.js");
|
|
14
|
+
const mockFs = vitest_1.vi.mocked(node_fs_1.default);
|
|
15
|
+
(0, vitest_1.beforeEach)(() => {
|
|
16
|
+
vitest_1.vi.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.describe)('loadCredentials', () => {
|
|
19
|
+
(0, vitest_1.it)('returns empty store when file does not exist', () => {
|
|
20
|
+
mockFs.existsSync.mockReturnValue(false);
|
|
21
|
+
const store = (0, credentials_js_1.loadCredentials)();
|
|
22
|
+
(0, vitest_1.expect)(store).toEqual({ orgs: {}, defaultOrg: null });
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('parses JSON when file exists', () => {
|
|
25
|
+
const data = {
|
|
26
|
+
orgs: { o1: { agentId: 'a1', token: 't', name: 'n', orgName: 'O', authenticatedAt: '' } },
|
|
27
|
+
defaultOrg: 'o1',
|
|
28
|
+
};
|
|
29
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
30
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify(data));
|
|
31
|
+
const store = (0, credentials_js_1.loadCredentials)();
|
|
32
|
+
(0, vitest_1.expect)(store).toEqual(data);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
(0, vitest_1.describe)('saveCredentials', () => {
|
|
36
|
+
(0, vitest_1.it)('creates dir if missing and writes JSON with 0o600 permissions', () => {
|
|
37
|
+
mockFs.existsSync.mockReturnValue(false);
|
|
38
|
+
mockFs.mkdirSync.mockReturnValue(undefined);
|
|
39
|
+
mockFs.writeFileSync.mockReturnValue(undefined);
|
|
40
|
+
const store = { orgs: {}, defaultOrg: null };
|
|
41
|
+
(0, credentials_js_1.saveCredentials)(store);
|
|
42
|
+
(0, vitest_1.expect)(mockFs.mkdirSync).toHaveBeenCalledWith('/home/test/.novadev', {
|
|
43
|
+
recursive: true,
|
|
44
|
+
mode: 0o700,
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.expect)(mockFs.writeFileSync).toHaveBeenCalledWith('/home/test/.novadev/credentials.json', JSON.stringify(store, null, 2), { mode: 0o600 });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.describe)('getActiveCredential', () => {
|
|
50
|
+
(0, vitest_1.it)('returns null when no default org', () => {
|
|
51
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
52
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({ orgs: {}, defaultOrg: null }));
|
|
53
|
+
(0, vitest_1.expect)((0, credentials_js_1.getActiveCredential)()).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('returns credential with orgId when set', () => {
|
|
56
|
+
const cred = {
|
|
57
|
+
agentId: 'a1',
|
|
58
|
+
token: 'tok',
|
|
59
|
+
name: 'bot',
|
|
60
|
+
orgName: 'Org',
|
|
61
|
+
authenticatedAt: '2025-01-01',
|
|
62
|
+
};
|
|
63
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
64
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({ orgs: { o1: cred }, defaultOrg: 'o1' }));
|
|
65
|
+
const result = (0, credentials_js_1.getActiveCredential)();
|
|
66
|
+
(0, vitest_1.expect)(result).toEqual({ ...cred, orgId: 'o1' });
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.describe)('setCredential', () => {
|
|
70
|
+
(0, vitest_1.it)('adds credential to store', () => {
|
|
71
|
+
const existing = {
|
|
72
|
+
orgs: { o1: { agentId: 'a1', token: 't1', name: 'n1', orgName: 'O1', authenticatedAt: '' } },
|
|
73
|
+
defaultOrg: 'o1',
|
|
74
|
+
};
|
|
75
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
76
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify(existing));
|
|
77
|
+
mockFs.writeFileSync.mockReturnValue(undefined);
|
|
78
|
+
const newCred = { agentId: 'a2', token: 't2', name: 'n2', orgName: 'O2', authenticatedAt: '' };
|
|
79
|
+
(0, credentials_js_1.setCredential)('o2', newCred);
|
|
80
|
+
const written = JSON.parse(mockFs.writeFileSync.mock.calls[0][1]);
|
|
81
|
+
(0, vitest_1.expect)(written.orgs.o2).toEqual(newCred);
|
|
82
|
+
(0, vitest_1.expect)(written.defaultOrg).toBe('o1'); // unchanged — already had a default
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('sets defaultOrg on first credential', () => {
|
|
85
|
+
mockFs.existsSync.mockReturnValue(false);
|
|
86
|
+
mockFs.mkdirSync.mockReturnValue(undefined);
|
|
87
|
+
mockFs.writeFileSync.mockReturnValue(undefined);
|
|
88
|
+
const cred = { agentId: 'a1', token: 't', name: 'n', orgName: 'O', authenticatedAt: '' };
|
|
89
|
+
(0, credentials_js_1.setCredential)('o1', cred);
|
|
90
|
+
const written = JSON.parse(mockFs.writeFileSync.mock.calls[0][1]);
|
|
91
|
+
(0, vitest_1.expect)(written.defaultOrg).toBe('o1');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=credentials.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/credentials.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -35,11 +35,18 @@ export interface Task {
|
|
|
35
35
|
priority: string;
|
|
36
36
|
createdAt: string;
|
|
37
37
|
}
|
|
38
|
+
export interface AnnouncePayload {
|
|
39
|
+
role: string;
|
|
40
|
+
provider: string;
|
|
41
|
+
model: string;
|
|
42
|
+
capabilities: string[];
|
|
43
|
+
}
|
|
38
44
|
export declare const api: {
|
|
39
45
|
auth(inviteToken: string): Promise<AuthResponse>;
|
|
40
46
|
me(): Promise<AgentInfo>;
|
|
41
47
|
reportStatus(type: "start" | "done" | "blocked", message: string, taskId?: string): Promise<unknown>;
|
|
42
48
|
tasks(teamId?: string): Promise<Task[]>;
|
|
43
49
|
claimTask(taskId: string): Promise<unknown>;
|
|
50
|
+
announce(payload: AnnouncePayload): Promise<unknown>;
|
|
44
51
|
};
|
|
45
52
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAGA,qBAAa,YAAa,SAAQ,KAAK;IAE5B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AA+BD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,GAAG;sBACI,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;UAM1C,OAAO,CAAC,SAAS,CAAC;uBAIL,OAAO,GAAG,MAAM,GAAG,SAAS,WAAW,MAAM,WAAW,MAAM;mBAMlE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;sBAKrB,MAAM;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAGA,qBAAa,YAAa,SAAQ,KAAK;IAE5B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AA+BD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,GAAG;sBACI,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;UAM1C,OAAO,CAAC,SAAS,CAAC;uBAIL,OAAO,GAAG,MAAM,GAAG,SAAS,WAAW,MAAM,WAAW,MAAM;mBAMlE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;sBAKrB,MAAM;sBAIN,eAAe;CAGlC,CAAC"}
|
package/dist/lib/api.js
CHANGED
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";;;AAAA,4CAAyC;AACzC,qDAAuD;AAEvD,MAAa,YAAa,SAAQ,KAAK;IAE5B;IADT,YACS,MAAc,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,OAA4C;IAE5C,MAAM,GAAG,GAAG,GAAG,IAAA,qBAAS,GAAE,GAAG,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAA,oCAAmB,GAAE,EAAE,KAAK,CAAC;IAC7D,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";;;AAAA,4CAAyC;AACzC,qDAAuD;AAEvD,MAAa,YAAa,SAAQ,KAAK;IAE5B;IADT,YACS,MAAc,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,OAA4C;IAE5C,MAAM,GAAG,GAAG,GAAG,IAAA,qBAAS,GAAE,GAAG,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAA,oCAAmB,GAAE,EAAE,KAAK,CAAC;IAC7D,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAuCY,QAAA,GAAG,GAAG;IACjB,IAAI,CAAC,WAAmB;QACtB,OAAO,OAAO,CAAe,MAAM,EAAE,kBAAkB,EAAE;YACvD,IAAI,EAAE,EAAE,WAAW,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,EAAE;QACA,OAAO,OAAO,CAAY,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,IAAkC,EAAE,OAAe,EAAE,MAAe;QAC/E,OAAO,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE;YAC3C,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAe;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAC5E,OAAO,OAAO,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,OAAO,OAAO,CAAC,MAAM,EAAE,cAAc,MAAM,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ,CAAC,OAAwB;QAC/B,OAAO,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;CACF,CAAC"}
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,eAAe,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,eAAe,IAAI,SAAS,CAgN3C;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
package/dist/mcp.js
CHANGED
|
@@ -130,6 +130,48 @@ function createMcpServer() {
|
|
|
130
130
|
content: [{ type: 'text', text: `Claimed task ${taskId}` }],
|
|
131
131
|
};
|
|
132
132
|
});
|
|
133
|
+
server.registerTool('nova_announce', {
|
|
134
|
+
title: 'Announce agent capabilities',
|
|
135
|
+
description: "Announce this agent's role, provider, model, and capabilities to Nova so the PM can make informed task assignments.",
|
|
136
|
+
inputSchema: {
|
|
137
|
+
role: zod_1.z.string().default('Senior full-stack engineer').describe('Agent role description'),
|
|
138
|
+
provider: zod_1.z
|
|
139
|
+
.string()
|
|
140
|
+
.default('claude')
|
|
141
|
+
.describe('AI provider name (e.g. claude, codex, gemini)'),
|
|
142
|
+
model: zod_1.z.string().default('').describe('Model version string (empty if unknown)'),
|
|
143
|
+
capabilities: zod_1.z
|
|
144
|
+
.array(zod_1.z.string())
|
|
145
|
+
.default([
|
|
146
|
+
'Proficient in all programming languages',
|
|
147
|
+
'Full-stack web development',
|
|
148
|
+
'API design and implementation',
|
|
149
|
+
'Database design and query optimization',
|
|
150
|
+
'Code review and refactoring',
|
|
151
|
+
'Bug diagnosis and resolution',
|
|
152
|
+
'Testing and CI/CD pipelines',
|
|
153
|
+
'System architecture and infrastructure',
|
|
154
|
+
])
|
|
155
|
+
.describe('List of skill areas'),
|
|
156
|
+
},
|
|
157
|
+
}, async ({ role, provider, model, capabilities }) => {
|
|
158
|
+
const cred = (0, credentials_js_1.getActiveCredential)();
|
|
159
|
+
if (!cred) {
|
|
160
|
+
return {
|
|
161
|
+
content: [{ type: 'text', text: 'Not authenticated. Use nova_auth first.' }],
|
|
162
|
+
isError: true,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
await api_js_1.api.announce({ role, provider, model, capabilities });
|
|
166
|
+
return {
|
|
167
|
+
content: [
|
|
168
|
+
{
|
|
169
|
+
type: 'text',
|
|
170
|
+
text: `Announced: role="${role}" provider=${provider} model=${model || '(unknown)'} capabilities=${capabilities.length}`,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
});
|
|
133
175
|
return server;
|
|
134
176
|
}
|
|
135
177
|
async function startMcpServer() {
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@squidcode/novadev",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Connect AI agents to your teams in the Nova system",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"format": "prettier --write .",
|
|
20
20
|
"format:check": "prettier --check .",
|
|
21
21
|
"typecheck": "tsc --noEmit",
|
|
22
|
-
"
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"check": "npm run typecheck && npm run lint && npm run format:check && npm test",
|
|
23
24
|
"prepublishOnly": "npm run check && npm run build",
|
|
24
25
|
"prepare": "husky"
|
|
25
26
|
},
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"lint-staged": "^15.4.0",
|
|
58
59
|
"prettier": "^3.5.0",
|
|
59
60
|
"typescript": "^5.7.0",
|
|
60
|
-
"typescript-eslint": "^8.25.0"
|
|
61
|
+
"typescript-eslint": "^8.25.0",
|
|
62
|
+
"vitest": "^4.0.18"
|
|
61
63
|
}
|
|
62
64
|
}
|