@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 CHANGED
@@ -1,8 +1,16 @@
1
1
  # NovaDev
2
2
 
3
- **Connect AI agents to your teams in the Nova system.**
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
- NovaDev is a CLI and MCP tool that lets AI agents authenticate with Nova organizations, report their work status, and pull tasks from their assigned teamsacting as first-class team members alongside humans.
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/claude_desktop_config.json`):
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 (to build)
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
- ### Team Management (Admin)
169
+ ### Announcements
131
170
 
132
- - `POST /api/teams/:teamId/agents` — Add agent to team
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 # { orgId, agentId, token, name }
177
+ credentials.json
141
178
  ```
142
179
 
143
- - One credential per org
144
- - Agent authenticates once, credential persists
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
- - [ ] Agent invite flow (admin dashboard + API)
161
- - [ ] Token exchange endpoint
162
- - [ ] `novadev auth` command
163
- - [ ] Local credential storage
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
- - [ ] Status reporting endpoints
169
- - [ ] `novadev status` command
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
- - [ ] Task listing endpoints
175
- - [ ] `novadev tasks` command
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
- - [ ] Agent auto-reporting via MCP hooks
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://github.com/squidcode/nova) ecosystem by [Squidcode](https://squidcode.com)_
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('0.1.0');
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;AAEjC,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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gateway.test.d.ts.map
@@ -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://api.nova.squidcode.com";
3
+ export declare const DEFAULT_API_URL = "https://withnova.io";
4
4
  export declare function getApiUrl(): string;
5
5
  //# sourceMappingURL=config.d.ts.map
@@ -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,mCAAmC,CAAC;AAEhE,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
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://api.nova.squidcode.com';
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
  }
@@ -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,gCAAgC,CAAC;AAEhE,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAe,CAAC;AACrD,CAAC"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.test.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=credentials.test.d.ts.map
@@ -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
@@ -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;CAGzB,CAAC"}
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
@@ -53,5 +53,8 @@ exports.api = {
53
53
  claimTask(taskId) {
54
54
  return request('POST', `/api/tasks/${taskId}/claim`);
55
55
  },
56
+ announce(payload) {
57
+ return request('POST', '/api/agents/announce', { body: payload });
58
+ },
56
59
  };
57
60
  //# sourceMappingURL=api.js.map
@@ -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;AAgCY,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;CACF,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,CA+J3C;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
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,0CA+JC;AAED,wCAIC;AA3KD,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AACxB,yCAAmC;AACnC,yDAA0E;AAE1E,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE;YACX,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC/D;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,MAAM,YAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,IAAA,8BAAa,EAAC,GAAG,CAAC,KAAK,EAAE;YACvB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC1C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,qBAAqB,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,OAAO,YAAY,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC5G;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,8DAA8D;KAC5E,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,IAAA,oCAAmB,GAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,YAAG,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;wBACJ,WAAW,IAAI,CAAC,IAAI,EAAE;wBACtB,WAAW,IAAI,CAAC,OAAO,EAAE;wBACzB,WAAW,IAAI,CAAC,MAAM,EAAE;wBACxB,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACtD,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,+IAA+I;QACjJ,WAAW,EAAE;YACX,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;YAClE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YACjF,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SACxE;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,IAAA,oCAAmB,GAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,YAAG,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,IAAI,KAAK,OAAO,EAAE,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACX,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SACvE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,IAAA,oCAAmB,GAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,YAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;aAClE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxD,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC7D,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE;YACX,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;SACpD;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,IAAA,oCAAmB,GAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,YAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,MAAM,EAAE,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
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": "0.1.0",
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
- "check": "npm run typecheck && npm run lint && npm run format:check",
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
  }