agentblueprint 0.4.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 +137 -0
- package/dist/__tests__/cli.test.d.ts +1 -0
- package/dist/__tests__/cli.test.js +136 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/client.test.d.ts +1 -0
- package/dist/__tests__/client.test.js +99 -0
- package/dist/__tests__/client.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +37 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/renderers.test.d.ts +1 -0
- package/dist/__tests__/renderers.test.js +471 -0
- package/dist/__tests__/renderers.test.js.map +1 -0
- package/dist/__tests__/token-store.test.d.ts +1 -0
- package/dist/__tests__/token-store.test.js +61 -0
- package/dist/__tests__/token-store.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +1 -0
- package/dist/__tests__/tools.test.js +379 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +233 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +80 -0
- package/dist/client.js +56 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/download.d.ts +9 -0
- package/dist/download.js +113 -0
- package/dist/download.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/renderers.d.ts +16 -0
- package/dist/renderers.js +1468 -0
- package/dist/renderers.js.map +1 -0
- package/dist/resources/blueprint.d.ts +14 -0
- package/dist/resources/blueprint.js +46 -0
- package/dist/resources/blueprint.js.map +1 -0
- package/dist/resources/blueprints.d.ts +14 -0
- package/dist/resources/blueprints.js +33 -0
- package/dist/resources/blueprints.js.map +1 -0
- package/dist/resources/business-profile.d.ts +14 -0
- package/dist/resources/business-profile.js +33 -0
- package/dist/resources/business-profile.js.map +1 -0
- package/dist/resources/spec.d.ts +14 -0
- package/dist/resources/spec.js +33 -0
- package/dist/resources/spec.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +47 -0
- package/dist/server.js.map +1 -0
- package/dist/token-store.d.ts +7 -0
- package/dist/token-store.js +34 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tools/download-blueprint.d.ts +17 -0
- package/dist/tools/download-blueprint.js +55 -0
- package/dist/tools/download-blueprint.js.map +1 -0
- package/dist/tools/get-blueprint.d.ts +17 -0
- package/dist/tools/get-blueprint.js +65 -0
- package/dist/tools/get-blueprint.js.map +1 -0
- package/dist/tools/get-business-case.d.ts +17 -0
- package/dist/tools/get-business-case.js +66 -0
- package/dist/tools/get-business-case.js.map +1 -0
- package/dist/tools/get-business-profile.d.ts +14 -0
- package/dist/tools/get-business-profile.js +21 -0
- package/dist/tools/get-business-profile.js.map +1 -0
- package/dist/tools/get-implementation-plan.d.ts +17 -0
- package/dist/tools/get-implementation-plan.js +67 -0
- package/dist/tools/get-implementation-plan.js.map +1 -0
- package/dist/tools/get-implementation-spec.d.ts +31 -0
- package/dist/tools/get-implementation-spec.js +35 -0
- package/dist/tools/get-implementation-spec.js.map +1 -0
- package/dist/tools/get-use-case.d.ts +31 -0
- package/dist/tools/get-use-case.js +35 -0
- package/dist/tools/get-use-case.js.map +1 -0
- package/dist/tools/list-blueprints.d.ts +22 -0
- package/dist/tools/list-blueprints.js +29 -0
- package/dist/tools/list-blueprints.js.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# agentblueprint
|
|
2
|
+
|
|
3
|
+
CLI and MCP server for [Agent Blueprint](https://app.agentblueprint.ai) — gives your coding agent read access to your AI blueprints, business cases, implementation plans, and specs.
|
|
4
|
+
|
|
5
|
+
## CLI Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install globally
|
|
9
|
+
npm install -g agentblueprint
|
|
10
|
+
|
|
11
|
+
# Store your API token (one-time)
|
|
12
|
+
agentblueprint login
|
|
13
|
+
|
|
14
|
+
# List blueprints
|
|
15
|
+
agentblueprint list
|
|
16
|
+
|
|
17
|
+
# Get a blueprint summary (JSON to stdout)
|
|
18
|
+
agentblueprint get blueprint <id>
|
|
19
|
+
|
|
20
|
+
# Get other artifacts
|
|
21
|
+
agentblueprint get business-case <id>
|
|
22
|
+
agentblueprint get use-case <id>
|
|
23
|
+
agentblueprint get implementation-plan <id>
|
|
24
|
+
agentblueprint get implementation-spec <id>
|
|
25
|
+
agentblueprint get business-profile
|
|
26
|
+
|
|
27
|
+
# Download as Agent Skills directory
|
|
28
|
+
agentblueprint download <id>
|
|
29
|
+
|
|
30
|
+
# Partner cross-org access
|
|
31
|
+
agentblueprint list --org <customer-org-id>
|
|
32
|
+
agentblueprint get blueprint <id> --org <customer-org-id>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or run without installing via npx:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx agentblueprint list --token <your-api-key>
|
|
39
|
+
npx agentblueprint get blueprint <id> --token <your-api-key>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## MCP Server Setup
|
|
43
|
+
|
|
44
|
+
The same binary auto-detects MCP mode when stdin is piped (non-interactive). No separate command needed.
|
|
45
|
+
|
|
46
|
+
Add to your Claude Code MCP config (`.claude/settings.json` or project settings):
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"agent-blueprint": {
|
|
52
|
+
"command": "npx",
|
|
53
|
+
"args": ["@agentblueprint/mcp-server"],
|
|
54
|
+
"env": {
|
|
55
|
+
"AGENT_BLUEPRINT_API_KEY": "<your-api-key>"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
You can also start the MCP server explicitly with `agentblueprint serve`.
|
|
63
|
+
|
|
64
|
+
## Get an API Key
|
|
65
|
+
|
|
66
|
+
1. Go to [Agent Blueprint Settings > API Tokens](https://app.agentblueprint.ai/settings/api-tokens)
|
|
67
|
+
2. Click "Create Token"
|
|
68
|
+
3. Copy the token (shown once)
|
|
69
|
+
|
|
70
|
+
## Download Blueprint as Agent Skills
|
|
71
|
+
|
|
72
|
+
Download a blueprint as a local Agent Skills directory that any coding agent can read from the filesystem. This is the recommended way to work with blueprints.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Using the CLI (after `agentblueprint login`)
|
|
76
|
+
agentblueprint download <id>
|
|
77
|
+
agentblueprint download <id> --dir ./my-skills
|
|
78
|
+
|
|
79
|
+
# Or via npx
|
|
80
|
+
npx agentblueprint download --token <key> --blueprint <id>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This creates an Agent Skills directory structure:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
.agent-blueprint/<blueprint-slug>/
|
|
87
|
+
├── SKILL.md # Overview + frontmatter (auto-discovered by agents)
|
|
88
|
+
├── references/
|
|
89
|
+
│ ├── business-context.md # Use case, pain points, transformation story
|
|
90
|
+
│ ├── agent-specifications.md # Full agent specs with tools, guardrails, metrics
|
|
91
|
+
│ ├── financial-case.md # ROI, cost breakdown, sensitivity, 5-year projection
|
|
92
|
+
│ ├── implementation-roadmap.md # Epics, stories, timeline, roles, dependencies
|
|
93
|
+
│ ├── architecture-decisions.md # Platform, pattern, integration gaps, feasibility
|
|
94
|
+
│ └── guardrails-and-governance.md # Risks, mitigation, per-agent guardrails
|
|
95
|
+
└── scripts/
|
|
96
|
+
└── validate-spec.sh # Structure completeness checker
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The [Agent Skills](https://agentskills.io) standard is supported by Claude Code, Codex, Cursor, GitHub Copilot, Windsurf, and 18+ other coding agents. SKILL.md loads automatically at activation (~100 tokens), reference files load on demand.
|
|
100
|
+
|
|
101
|
+
## Available Tools
|
|
102
|
+
|
|
103
|
+
| Tool | Description |
|
|
104
|
+
|------|-------------|
|
|
105
|
+
| `list_blueprints` | List all blueprints (summaries) |
|
|
106
|
+
| `get_blueprint` | Blueprint summary — title, agents, phases, pattern |
|
|
107
|
+
| `get_business_case` | Business case summary — ROI, pilot economics, recommendation |
|
|
108
|
+
| `get_implementation_plan` | Implementation plan summary — epics, timeline, story counts |
|
|
109
|
+
| `get_use_case` | Use case analysis for a blueprint |
|
|
110
|
+
| `get_implementation_spec` | Implementation spec metadata |
|
|
111
|
+
| `get_business_profile` | Organization business profile |
|
|
112
|
+
| `download_blueprint` | Download full blueprint as Agent Skills file manifest |
|
|
113
|
+
|
|
114
|
+
The `get_blueprint`, `get_business_case`, and `get_implementation_plan` tools return concise summaries optimized for agent context windows. For full details (agent specs, financial projections, user stories), use `download_blueprint` to get the complete Agent Skills directory.
|
|
115
|
+
|
|
116
|
+
## Available Resources
|
|
117
|
+
|
|
118
|
+
| URI | Description |
|
|
119
|
+
|-----|-------------|
|
|
120
|
+
| `agentblueprint://blueprints` | Blueprint list (JSON) |
|
|
121
|
+
| `agentblueprint://blueprints/{id}` | Blueprint detail (Markdown) |
|
|
122
|
+
| `agentblueprint://blueprints/{id}/spec` | Implementation spec (Markdown) |
|
|
123
|
+
|
|
124
|
+
## Authentication
|
|
125
|
+
|
|
126
|
+
Three ways to provide your API token (checked in this order):
|
|
127
|
+
|
|
128
|
+
1. `--token <key>` flag on any command
|
|
129
|
+
2. `AGENT_BLUEPRINT_API_KEY` environment variable
|
|
130
|
+
3. `agentblueprint login` (saved to `~/.config/agentblueprint/config.json`)
|
|
131
|
+
|
|
132
|
+
## Environment Variables
|
|
133
|
+
|
|
134
|
+
| Variable | Required | Default | Description |
|
|
135
|
+
|----------|----------|---------|-------------|
|
|
136
|
+
| `AGENT_BLUEPRINT_API_KEY` | No | — | Your API token (alternative to `agentblueprint login`) |
|
|
137
|
+
| `AGENT_BLUEPRINT_API_URL` | No | `https://app.agentblueprint.ai` | API base URL |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { parseDownloadArgs } from '../download.js';
|
|
6
|
+
const exec = promisify(execFile);
|
|
7
|
+
const CLI_PATH = join(import.meta.dirname, '../../dist/cli.js');
|
|
8
|
+
describe('parseDownloadArgs', () => {
|
|
9
|
+
it('parses positional blueprint ID', () => {
|
|
10
|
+
const result = parseDownloadArgs(['abc-123']);
|
|
11
|
+
expect(result.blueprintId).toBe('abc-123');
|
|
12
|
+
expect(result.dir).toBe('.agent-blueprint');
|
|
13
|
+
});
|
|
14
|
+
it('parses --org flag', () => {
|
|
15
|
+
const result = parseDownloadArgs(['abc-123', '--org', 'org-456']);
|
|
16
|
+
expect(result.blueprintId).toBe('abc-123');
|
|
17
|
+
expect(result.customerOrgId).toBe('org-456');
|
|
18
|
+
});
|
|
19
|
+
it('parses --blueprint flag alongside --org', () => {
|
|
20
|
+
const result = parseDownloadArgs(['--blueprint', 'bp-789', '--org', 'org-456', '--dir', '/tmp/out']);
|
|
21
|
+
expect(result.blueprintId).toBe('bp-789');
|
|
22
|
+
expect(result.customerOrgId).toBe('org-456');
|
|
23
|
+
expect(result.dir).toBe('/tmp/out');
|
|
24
|
+
});
|
|
25
|
+
it('parses --list flag', () => {
|
|
26
|
+
const result = parseDownloadArgs(['--list']);
|
|
27
|
+
expect(result.list).toBe(true);
|
|
28
|
+
expect(result.blueprintId).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
it('--blueprint takes priority over positional', () => {
|
|
31
|
+
const result = parseDownloadArgs(['--blueprint', 'bp-flag', 'bp-positional']);
|
|
32
|
+
expect(result.blueprintId).toBe('bp-flag');
|
|
33
|
+
});
|
|
34
|
+
it('defaults dir to .agent-blueprint', () => {
|
|
35
|
+
const result = parseDownloadArgs([]);
|
|
36
|
+
expect(result.dir).toBe('.agent-blueprint');
|
|
37
|
+
expect(result.list).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('CLI binary', () => {
|
|
41
|
+
it('shows help with --help', async () => {
|
|
42
|
+
const { stderr } = await exec('node', [CLI_PATH, '--help']);
|
|
43
|
+
expect(stderr).toContain('Agent Blueprint CLI');
|
|
44
|
+
expect(stderr).toContain('agentblueprint login');
|
|
45
|
+
expect(stderr).toContain('agentblueprint list');
|
|
46
|
+
expect(stderr).toContain('agentblueprint get');
|
|
47
|
+
expect(stderr).toContain('agentblueprint download');
|
|
48
|
+
});
|
|
49
|
+
it('shows version with --version', async () => {
|
|
50
|
+
const { stdout } = await exec('node', [CLI_PATH, '--version']);
|
|
51
|
+
expect(stdout.trim()).toMatch(/^\d+\.\d+\.\d+$/);
|
|
52
|
+
});
|
|
53
|
+
it('starts MCP server with no arguments on piped stdin (non-TTY)', async () => {
|
|
54
|
+
// When stdin is piped (as in execFile), no-args triggers MCP mode.
|
|
55
|
+
// Without a token, it errors with missing API key.
|
|
56
|
+
try {
|
|
57
|
+
await exec('node', [CLI_PATH], {
|
|
58
|
+
env: { ...process.env, AGENT_BLUEPRINT_API_KEY: '', HOME: '/tmp/nonexistent-cli-test' },
|
|
59
|
+
});
|
|
60
|
+
expect.fail('should have exited with error');
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const error = err;
|
|
64
|
+
expect(error.stderr).toContain('Missing API key');
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
it('errors on unknown command', async () => {
|
|
68
|
+
try {
|
|
69
|
+
await exec('node', [CLI_PATH, 'foobar']);
|
|
70
|
+
expect.fail('should have exited with error');
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const error = err;
|
|
74
|
+
expect(error.stderr).toContain('Unknown command');
|
|
75
|
+
expect(error.code).toBe(1);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
it('errors on get without type', async () => {
|
|
79
|
+
try {
|
|
80
|
+
await exec('node', [CLI_PATH, 'get']);
|
|
81
|
+
expect.fail('should have exited with error');
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const error = err;
|
|
85
|
+
expect(error.stderr).toContain('Missing artifact type');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
it('errors on get with unknown type', async () => {
|
|
89
|
+
try {
|
|
90
|
+
await exec('node', [CLI_PATH, 'get', 'foobar', 'some-id', '--token', 'ab_live_fake']);
|
|
91
|
+
expect.fail('should have exited with error');
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const error = err;
|
|
95
|
+
expect(error.stderr).toContain('Unknown type');
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it('errors on get blueprint without ID', async () => {
|
|
99
|
+
try {
|
|
100
|
+
await exec('node', [CLI_PATH, 'get', 'blueprint', '--token', 'ab_live_fake']);
|
|
101
|
+
expect.fail('should have exited with error');
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
const error = err;
|
|
105
|
+
expect(error.stderr).toContain('Missing blueprint ID');
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
it('errors on get implementation-spec without ID', async () => {
|
|
109
|
+
try {
|
|
110
|
+
await exec('node', [CLI_PATH, 'get', 'implementation-spec', '--token', 'ab_live_fake']);
|
|
111
|
+
expect.fail('should have exited with error');
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const error = err;
|
|
115
|
+
expect(error.stderr).toContain('Missing blueprint ID');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
it('errors on list without token', async () => {
|
|
119
|
+
try {
|
|
120
|
+
await exec('node', [CLI_PATH, 'list'], {
|
|
121
|
+
env: { ...process.env, AGENT_BLUEPRINT_API_KEY: '', HOME: '/tmp/nonexistent-cli-test' },
|
|
122
|
+
});
|
|
123
|
+
expect.fail('should have exited with error');
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
const error = err;
|
|
127
|
+
expect(error.stderr).toContain('Missing API key');
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it('help includes implementation-spec and serve', async () => {
|
|
131
|
+
const { stderr } = await exec('node', [CLI_PATH, '--help']);
|
|
132
|
+
expect(stderr).toContain('implementation-spec');
|
|
133
|
+
expect(stderr).toContain('When stdin is piped');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { AgentBlueprintClient } from '../client.js';
|
|
3
|
+
import { ApiError } from '../errors.js';
|
|
4
|
+
const mockConfig = {
|
|
5
|
+
apiKey: 'ab_live_test1234567890',
|
|
6
|
+
apiUrl: 'https://test.agentblueprint.ai',
|
|
7
|
+
};
|
|
8
|
+
describe('AgentBlueprintClient', () => {
|
|
9
|
+
let client;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
client = new AgentBlueprintClient(mockConfig);
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
it('getBusinessProfile calls correct endpoint', async () => {
|
|
15
|
+
const profileData = { id: 'prof-1', companyName: 'Acme Corp', industry: 'Technology' };
|
|
16
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
17
|
+
ok: true,
|
|
18
|
+
json: () => Promise.resolve({ success: true, data: profileData, timestamp: '' }),
|
|
19
|
+
}));
|
|
20
|
+
const result = await client.getBusinessProfile();
|
|
21
|
+
expect(result).toEqual(profileData);
|
|
22
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/business-profile', expect.objectContaining({
|
|
23
|
+
headers: expect.objectContaining({
|
|
24
|
+
'Authorization': 'Bearer ab_live_test1234567890',
|
|
25
|
+
}),
|
|
26
|
+
}));
|
|
27
|
+
});
|
|
28
|
+
it('listBlueprints sends correct request', async () => {
|
|
29
|
+
const mockData = [
|
|
30
|
+
{ id: 'bp-1', title: 'Test BP', version: 1, platform: 'general', agentCount: 2 },
|
|
31
|
+
];
|
|
32
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
33
|
+
ok: true,
|
|
34
|
+
json: () => Promise.resolve({ success: true, data: mockData, timestamp: new Date().toISOString() }),
|
|
35
|
+
}));
|
|
36
|
+
const result = await client.listBlueprints();
|
|
37
|
+
expect(result).toEqual(mockData);
|
|
38
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints', expect.objectContaining({
|
|
39
|
+
headers: expect.objectContaining({
|
|
40
|
+
'Authorization': 'Bearer ab_live_test1234567890',
|
|
41
|
+
}),
|
|
42
|
+
}));
|
|
43
|
+
});
|
|
44
|
+
it('getBlueprint encodes ID in URL', async () => {
|
|
45
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
46
|
+
ok: true,
|
|
47
|
+
json: () => Promise.resolve({ success: true, data: { id: 'bp-1' }, timestamp: '' }),
|
|
48
|
+
}));
|
|
49
|
+
await client.getBlueprint('bp-1');
|
|
50
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints/bp-1', expect.anything());
|
|
51
|
+
});
|
|
52
|
+
it('throws ApiError on non-ok response', async () => {
|
|
53
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
54
|
+
ok: false,
|
|
55
|
+
status: 401,
|
|
56
|
+
statusText: 'Unauthorized',
|
|
57
|
+
json: () => Promise.resolve({ error: 'Invalid token' }),
|
|
58
|
+
}));
|
|
59
|
+
await expect(client.listBlueprints()).rejects.toThrow(ApiError);
|
|
60
|
+
await expect(client.listBlueprints()).rejects.toThrow('Invalid token');
|
|
61
|
+
});
|
|
62
|
+
it('getBusinessCase calls correct endpoint', async () => {
|
|
63
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
64
|
+
ok: true,
|
|
65
|
+
json: () => Promise.resolve({ success: true, data: { id: 'bc-1' }, timestamp: '' }),
|
|
66
|
+
}));
|
|
67
|
+
await client.getBusinessCase('bp-1');
|
|
68
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints/bp-1/business-case', expect.anything());
|
|
69
|
+
});
|
|
70
|
+
it('getImplementationPlan calls correct endpoint', async () => {
|
|
71
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
72
|
+
ok: true,
|
|
73
|
+
json: () => Promise.resolve({ success: true, data: { id: 'ip-1' }, timestamp: '' }),
|
|
74
|
+
}));
|
|
75
|
+
await client.getImplementationPlan('bp-1');
|
|
76
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints/bp-1/implementation-plan', expect.anything());
|
|
77
|
+
});
|
|
78
|
+
it('getUseCase calls correct endpoint', async () => {
|
|
79
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
80
|
+
ok: true,
|
|
81
|
+
json: () => Promise.resolve({ success: true, data: { id: 'uc-1' }, timestamp: '' }),
|
|
82
|
+
}));
|
|
83
|
+
await client.getUseCase('bp-1');
|
|
84
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints/bp-1/use-case', expect.anything());
|
|
85
|
+
});
|
|
86
|
+
it('getImplementationSpec calls correct endpoint', async () => {
|
|
87
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
|
88
|
+
ok: true,
|
|
89
|
+
json: () => Promise.resolve({
|
|
90
|
+
success: true,
|
|
91
|
+
data: { blueprintId: 'bp-1', filename: 'test.zip', metadata: {} },
|
|
92
|
+
timestamp: '',
|
|
93
|
+
}),
|
|
94
|
+
}));
|
|
95
|
+
await client.getImplementationSpec('bp-1');
|
|
96
|
+
expect(fetch).toHaveBeenCalledWith('https://test.agentblueprint.ai/api/v1/blueprints/bp-1/implementation-spec', expect.anything());
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,gCAAgC;CACzC,CAAC;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,MAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC9C,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QACvF,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SACjF,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,wDAAwD,EACxD,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,eAAe,EAAE,+BAA+B;aACjD,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE;SACjF,CAAC;QAEF,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;SACpG,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,kDAAkD,EAClD,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,eAAe,EAAE,+BAA+B;aACjD,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SACpF,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,uDAAuD,EACvD,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAc;YAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;SACxD,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SACpF,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,qEAAqE,EACrE,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SACpF,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,2EAA2E,EAC3E,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SACpF,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,gEAAgE,EAChE,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC1B,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACjE,SAAS,EAAE,EAAE;aACd,CAAC;SACH,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,2EAA2E,EAC3E,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { loadConfig } from '../config.js';
|
|
3
|
+
describe('loadConfig', () => {
|
|
4
|
+
const originalEnv = { ...process.env };
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
vi.unstubAllEnvs();
|
|
7
|
+
});
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
process.env = { ...originalEnv };
|
|
10
|
+
});
|
|
11
|
+
it('loads API key from token override', () => {
|
|
12
|
+
const config = loadConfig('ab_live_test123');
|
|
13
|
+
expect(config.apiKey).toBe('ab_live_test123');
|
|
14
|
+
expect(config.apiUrl).toBe('https://app.agentblueprint.ai');
|
|
15
|
+
});
|
|
16
|
+
it('loads API key from environment', () => {
|
|
17
|
+
process.env.AGENT_BLUEPRINT_API_KEY = 'ab_live_envkey';
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
expect(config.apiKey).toBe('ab_live_envkey');
|
|
20
|
+
});
|
|
21
|
+
it('uses custom API URL from environment', () => {
|
|
22
|
+
process.env.AGENT_BLUEPRINT_API_KEY = 'ab_live_test';
|
|
23
|
+
process.env.AGENT_BLUEPRINT_API_URL = 'http://localhost:3000';
|
|
24
|
+
const config = loadConfig();
|
|
25
|
+
expect(config.apiUrl).toBe('http://localhost:3000');
|
|
26
|
+
});
|
|
27
|
+
it('throws when no API key provided', () => {
|
|
28
|
+
delete process.env.AGENT_BLUEPRINT_API_KEY;
|
|
29
|
+
expect(() => loadConfig()).toThrow('Missing API key');
|
|
30
|
+
});
|
|
31
|
+
it('token override takes precedence over env', () => {
|
|
32
|
+
process.env.AGENT_BLUEPRINT_API_KEY = 'ab_live_env';
|
|
33
|
+
const config = loadConfig('ab_live_override');
|
|
34
|
+
expect(config.apiKey).toBe('ab_live_override');
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,gBAAgB,CAAC;QACvD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,cAAc,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;QAC9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,aAAa,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|