devto-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/bin/devto-mcp.js +2 -0
- package/bin/devto.js +2 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +481 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +36 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +109 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +252 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +332 -0
- package/dist/tools.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DevTo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# devto-mcp
|
|
2
|
+
|
|
3
|
+
DevTo is an AI work manager that runs inside Claude Code via MCP. It takes feature descriptions, generates structured plans (epics, stories, subtasks), and pushes them to your project tracker. AI planning runs locally using your own Anthropic key — your code context never leaves your machine.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g devto-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires Node.js >= 18 and [Claude Code](https://claude.ai/claude-code).
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
1. Create an account and get an API key at [devto.ai](https://devto.ai)
|
|
16
|
+
|
|
17
|
+
2. Log in and configure your Anthropic key:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
devto login
|
|
21
|
+
devto config set anthropic-key sk-ant-xxxx
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
3. Connect to Claude Code:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
devto init
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
In Claude Code:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
> create a plan for the password reset flow
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
DevTo generates a structured plan. Run `confirm_plan` to push it to your project tracker.
|
|
39
|
+
|
|
40
|
+
## CLI commands
|
|
41
|
+
|
|
42
|
+
| Command | Description |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `devto login` | Authenticate with your API key |
|
|
45
|
+
| `devto status` | Show connection and usage info |
|
|
46
|
+
| `devto init` | Auto-configure MCP in Claude Code |
|
|
47
|
+
| `devto doctor` | Run diagnostics |
|
|
48
|
+
| `devto sync` | Re-sync workspace config |
|
|
49
|
+
| `devto config set anthropic-key` | Store your Anthropic key locally |
|
|
50
|
+
|
|
51
|
+
## MCP tools
|
|
52
|
+
|
|
53
|
+
| Tool | Description |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `create_plan` | Generate a plan from a feature description |
|
|
56
|
+
| `confirm_plan` | Execute a plan and create all work items |
|
|
57
|
+
| `create_epic` | Create an epic |
|
|
58
|
+
| `create_task` | Create a task or story |
|
|
59
|
+
| `create_subtask` | Create a subtask under a parent |
|
|
60
|
+
| `get_tasks` | List open tasks |
|
|
61
|
+
| `update_task` | Update a task's status |
|
|
62
|
+
| `get_status` | Get project summary |
|
|
63
|
+
|
|
64
|
+
## Dashboard
|
|
65
|
+
|
|
66
|
+
Manage your workspace, API keys, and billing at [devto.ai/dashboard](https://devto.ai/dashboard).
|
|
67
|
+
|
|
68
|
+
## License
|
|
69
|
+
|
|
70
|
+
MIT — see [LICENSE](./LICENSE).
|
package/bin/devto-mcp.js
ADDED
package/bin/devto.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* DevTo CLI — devto <command>
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* devto login Authenticate with your DevTo API key
|
|
7
|
+
* devto status Show current connection status
|
|
8
|
+
* devto init Auto-configure Claude Code MCP config
|
|
9
|
+
* devto doctor Test full connection chain
|
|
10
|
+
* devto sync Re-sync workspace configuration
|
|
11
|
+
* devto verbose Toggle verbose mode
|
|
12
|
+
* devto config set anthropic-key <key> Store Anthropic API key
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* DevTo CLI — devto <command>
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* devto login Authenticate with your DevTo API key
|
|
8
|
+
* devto status Show current connection status
|
|
9
|
+
* devto init Auto-configure Claude Code MCP config
|
|
10
|
+
* devto doctor Test full connection chain
|
|
11
|
+
* devto sync Re-sync workspace configuration
|
|
12
|
+
* devto verbose Toggle verbose mode
|
|
13
|
+
* devto config set anthropic-key <key> Store Anthropic API key
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
const readline = __importStar(require("readline"));
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
const config_1 = require("./config");
|
|
54
|
+
const command = process.argv[2];
|
|
55
|
+
async function prompt(question, hidden = false) {
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const rl = readline.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
});
|
|
61
|
+
if (hidden && process.stdout.isTTY) {
|
|
62
|
+
process.stdout.write(question);
|
|
63
|
+
let value = "";
|
|
64
|
+
process.stdin.setRawMode(true);
|
|
65
|
+
process.stdin.resume();
|
|
66
|
+
process.stdin.setEncoding("utf8");
|
|
67
|
+
const onData = (char) => {
|
|
68
|
+
if (char === "\n" || char === "\r" || char === "\u0003") {
|
|
69
|
+
process.stdin.setRawMode(false);
|
|
70
|
+
process.stdin.pause();
|
|
71
|
+
process.stdin.removeListener("data", onData);
|
|
72
|
+
process.stdout.write("\n");
|
|
73
|
+
rl.close();
|
|
74
|
+
resolve(value);
|
|
75
|
+
}
|
|
76
|
+
else if (char === "\u007f") {
|
|
77
|
+
value = value.slice(0, -1);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
value += char;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
process.stdin.on("data", onData);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
rl.question(question, (answer) => {
|
|
87
|
+
rl.close();
|
|
88
|
+
resolve(answer.trim());
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async function validateKey(apiKey) {
|
|
94
|
+
const apiUrl = process.env.DEVTO_API_URL ?? "https://api.devto.ai";
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(`${apiUrl}/api/v1/status`, {
|
|
97
|
+
headers: {
|
|
98
|
+
Authorization: `Bearer ${apiKey}`,
|
|
99
|
+
"X-DevTo-Version": "0.1.0",
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
// 200 = valid key, 401 = invalid
|
|
103
|
+
return res.status !== 401;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Network error — can't validate, but save anyway
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function login() {
|
|
111
|
+
console.log("\nDevTo Login\n");
|
|
112
|
+
console.log("Get your API key from: https://devto.ai/dashboard/keys\n");
|
|
113
|
+
const apiKey = await prompt("Paste your API key: ", true);
|
|
114
|
+
if (!apiKey || !apiKey.startsWith("devto_")) {
|
|
115
|
+
console.error("\nInvalid key format. DevTo API keys start with 'devto_'.\nGet your key at https://devto.ai/dashboard/keys\n");
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
process.stdout.write("Validating... ");
|
|
119
|
+
const valid = await validateKey(apiKey);
|
|
120
|
+
if (!valid) {
|
|
121
|
+
console.error("\nInvalid API key. Check your key at https://devto.ai/dashboard/keys\n");
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
const apiUrl = process.env.DEVTO_API_URL ?? "https://api.devto.ai";
|
|
125
|
+
(0, config_1.writeConfig)({ api_key: apiKey, api_url: apiUrl });
|
|
126
|
+
console.log("OK\n");
|
|
127
|
+
console.log("Logged in! Your API key is saved to ~/.devto/config.json\n");
|
|
128
|
+
console.log("Next step: add DevTo to your Claude Code MCP config.");
|
|
129
|
+
console.log("Run `devto status` to verify your connection.\n");
|
|
130
|
+
}
|
|
131
|
+
async function status() {
|
|
132
|
+
const config = (0, config_1.readConfig)();
|
|
133
|
+
if (!config) {
|
|
134
|
+
console.log("\nNot logged in. Run `devto login` to authenticate.\n");
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
console.log("\nDevTo Status");
|
|
138
|
+
console.log("────────────");
|
|
139
|
+
console.log(`API URL: ${config.api_url}`);
|
|
140
|
+
console.log(`API Key: ${config.api_key.slice(0, 12)}...`);
|
|
141
|
+
// Anthropic key status
|
|
142
|
+
let anthropicPresent = false;
|
|
143
|
+
try {
|
|
144
|
+
(0, config_1.getAnthropicKey)();
|
|
145
|
+
anthropicPresent = true;
|
|
146
|
+
console.log("Anthropic Key: configured");
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
console.log("Anthropic Key: missing (run `devto config set anthropic-key sk-ant-xxxx`)");
|
|
150
|
+
}
|
|
151
|
+
process.stdout.write("Connection: ");
|
|
152
|
+
try {
|
|
153
|
+
const res = await fetch(`${config.api_url}/api/v1/status`, {
|
|
154
|
+
headers: {
|
|
155
|
+
Authorization: `Bearer ${config.api_key}`,
|
|
156
|
+
"X-DevTo-Version": "0.1.0",
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
if (res.ok) {
|
|
160
|
+
const data = (await res.json());
|
|
161
|
+
console.log("Connected");
|
|
162
|
+
console.log(`Project: ${data.project}`);
|
|
163
|
+
console.log(`Workspace: ${data.jira_instance}`);
|
|
164
|
+
console.log(`Tasks: ${data.total_tasks} total, ${data.in_progress_tasks} in progress`);
|
|
165
|
+
if (data.plan_calls_this_month !== undefined) {
|
|
166
|
+
console.log(`Plan calls this month: ${data.plan_calls_this_month}${data.plan_calls_limit ? ` / ${data.plan_calls_limit}` : ""}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (res.status === 401) {
|
|
170
|
+
console.log("Invalid API key");
|
|
171
|
+
console.log("\nRun `devto login` to re-authenticate.");
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
console.log(`Error (${res.status})`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
console.log("Could not connect to DevTo API");
|
|
179
|
+
}
|
|
180
|
+
console.log();
|
|
181
|
+
}
|
|
182
|
+
async function init() {
|
|
183
|
+
console.log("\nDevTo Init — Configure Claude Code MCP\n");
|
|
184
|
+
const config = (0, config_1.readConfig)();
|
|
185
|
+
const apiKey = config?.api_key ?? "their-key-here";
|
|
186
|
+
// Check common Claude Code MCP config locations
|
|
187
|
+
const candidates = [
|
|
188
|
+
path.join(process.cwd(), ".claude", "claude_desktop_config.json"),
|
|
189
|
+
path.join(os.homedir(), ".config", "claude", "claude_desktop_config.json"),
|
|
190
|
+
path.join(os.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json"),
|
|
191
|
+
];
|
|
192
|
+
let configPath = null;
|
|
193
|
+
for (const candidate of candidates) {
|
|
194
|
+
if (fs.existsSync(candidate)) {
|
|
195
|
+
configPath = candidate;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!configPath) {
|
|
200
|
+
// Default to the first candidate that has a parent dir, or create one
|
|
201
|
+
for (const candidate of candidates) {
|
|
202
|
+
const dir = path.dirname(candidate);
|
|
203
|
+
if (fs.existsSync(dir)) {
|
|
204
|
+
configPath = candidate;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!configPath) {
|
|
209
|
+
// Fallback: create .claude dir in cwd
|
|
210
|
+
const dir = path.join(process.cwd(), ".claude");
|
|
211
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
212
|
+
configPath = path.join(dir, "claude_desktop_config.json");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
console.log(`Config file: ${configPath}`);
|
|
216
|
+
// Read existing config or start fresh
|
|
217
|
+
let mcpConfig = {};
|
|
218
|
+
try {
|
|
219
|
+
if (fs.existsSync(configPath)) {
|
|
220
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
221
|
+
mcpConfig = JSON.parse(raw);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// Start fresh if corrupt
|
|
226
|
+
}
|
|
227
|
+
// Ensure mcpServers object exists
|
|
228
|
+
if (!mcpConfig.mcpServers || typeof mcpConfig.mcpServers !== "object") {
|
|
229
|
+
mcpConfig.mcpServers = {};
|
|
230
|
+
}
|
|
231
|
+
// Inject/update devto block
|
|
232
|
+
mcpConfig.mcpServers["devto"] = {
|
|
233
|
+
command: "devto-mcp",
|
|
234
|
+
env: {
|
|
235
|
+
DEVTO_API_KEY: apiKey,
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
// Write config
|
|
239
|
+
const dir = path.dirname(configPath);
|
|
240
|
+
if (!fs.existsSync(dir)) {
|
|
241
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
242
|
+
}
|
|
243
|
+
fs.writeFileSync(configPath, JSON.stringify(mcpConfig, null, 2));
|
|
244
|
+
console.log("DevTo MCP server block injected successfully.");
|
|
245
|
+
if (apiKey === "their-key-here") {
|
|
246
|
+
console.log("\nNote: No API key found in local config. Run `devto login` first, then re-run `devto init`.");
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
console.log(`\nAPI key (${apiKey.slice(0, 12)}...) written to MCP config.`);
|
|
250
|
+
}
|
|
251
|
+
console.log("Restart Claude Code to pick up the changes.\n");
|
|
252
|
+
}
|
|
253
|
+
async function doctor() {
|
|
254
|
+
console.log("\nDevTo Doctor — Connection Diagnostics\n");
|
|
255
|
+
const config = (0, config_1.readConfig)();
|
|
256
|
+
// 1. Check DevTo API reachable
|
|
257
|
+
process.stdout.write("DevTo API reachable ... ");
|
|
258
|
+
const apiUrl = config?.api_url ?? (0, config_1.getApiUrl)();
|
|
259
|
+
try {
|
|
260
|
+
const res = await fetch(`${apiUrl}/api/v1/status`, {
|
|
261
|
+
headers: {
|
|
262
|
+
...(config?.api_key ? { Authorization: `Bearer ${config.api_key}` } : {}),
|
|
263
|
+
"X-DevTo-Version": "0.1.0",
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
if (res.ok) {
|
|
267
|
+
console.log("OK");
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.log(`FAIL (HTTP ${res.status})`);
|
|
271
|
+
console.log(` Fix: Check your internet connection or try again later.`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
console.log("FAIL (network error)");
|
|
276
|
+
console.log(` Fix: Check your internet connection. API URL: ${apiUrl}`);
|
|
277
|
+
}
|
|
278
|
+
// 2. Check API key valid
|
|
279
|
+
process.stdout.write("API key valid ... ");
|
|
280
|
+
if (!config?.api_key) {
|
|
281
|
+
console.log("FAIL (no key configured)");
|
|
282
|
+
console.log(" Fix: Run `devto login` to authenticate.");
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
try {
|
|
286
|
+
const res = await fetch(`${apiUrl}/api/v1/status`, {
|
|
287
|
+
headers: {
|
|
288
|
+
Authorization: `Bearer ${config.api_key}`,
|
|
289
|
+
"X-DevTo-Version": "0.1.0",
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
if (res.status === 401) {
|
|
293
|
+
console.log("FAIL (invalid key)");
|
|
294
|
+
console.log(" Fix: Run `devto login` to re-authenticate.");
|
|
295
|
+
}
|
|
296
|
+
else if (res.ok) {
|
|
297
|
+
console.log("OK");
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
console.log(`WARN (HTTP ${res.status})`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
console.log("SKIP (cannot reach API)");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// 3. Check workspace connection
|
|
308
|
+
process.stdout.write("Workspace connection ... ");
|
|
309
|
+
if (!config?.api_key) {
|
|
310
|
+
console.log("SKIP (no API key)");
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
try {
|
|
314
|
+
const res = await fetch(`${apiUrl}/api/v1/status`, {
|
|
315
|
+
headers: {
|
|
316
|
+
Authorization: `Bearer ${config.api_key}`,
|
|
317
|
+
"X-DevTo-Version": "0.1.0",
|
|
318
|
+
},
|
|
319
|
+
});
|
|
320
|
+
if (res.ok) {
|
|
321
|
+
const data = (await res.json());
|
|
322
|
+
if (data.jira_instance) {
|
|
323
|
+
console.log(`OK (${data.jira_instance})`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
console.log("FAIL (no workspace connected)");
|
|
327
|
+
console.log(" Fix: Connect your workspace at https://devto.ai/dashboard/settings/jira");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.log("FAIL");
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
console.log("SKIP (cannot reach API)");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// 4. Check Anthropic key
|
|
339
|
+
process.stdout.write("Anthropic API key ... ");
|
|
340
|
+
try {
|
|
341
|
+
(0, config_1.getAnthropicKey)();
|
|
342
|
+
console.log("OK");
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
console.log("MISSING");
|
|
346
|
+
console.log(" Fix: Run `devto config set anthropic-key sk-ant-xxxx`");
|
|
347
|
+
}
|
|
348
|
+
console.log();
|
|
349
|
+
}
|
|
350
|
+
async function sync() {
|
|
351
|
+
console.log("\nDevTo Sync — Workspace Configuration Discovery\n");
|
|
352
|
+
const config = (0, config_1.readConfig)();
|
|
353
|
+
if (!config?.api_key) {
|
|
354
|
+
console.log("Not logged in. Run `devto login` first.\n");
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
const apiUrl = config.api_url;
|
|
358
|
+
process.stdout.write("Discovering workspace configuration... ");
|
|
359
|
+
try {
|
|
360
|
+
const res = await fetch(`${apiUrl}/api/v1/jira/discover`, {
|
|
361
|
+
method: "POST",
|
|
362
|
+
headers: {
|
|
363
|
+
"Content-Type": "application/json",
|
|
364
|
+
Authorization: `Bearer ${config.api_key}`,
|
|
365
|
+
"X-DevTo-Version": "0.1.0",
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
if (!res.ok) {
|
|
369
|
+
console.log(`FAIL (HTTP ${res.status})`);
|
|
370
|
+
const data = (await res.json().catch(() => ({})));
|
|
371
|
+
if (data.message)
|
|
372
|
+
console.log(` ${data.message}`);
|
|
373
|
+
process.exit(1);
|
|
374
|
+
}
|
|
375
|
+
const data = (await res.json());
|
|
376
|
+
console.log("OK\n");
|
|
377
|
+
if (data.project)
|
|
378
|
+
console.log(`Project: ${data.project}`);
|
|
379
|
+
if (data.issue_types)
|
|
380
|
+
console.log(`Issue types: ${data.issue_types.join(", ")}`);
|
|
381
|
+
if (data.statuses)
|
|
382
|
+
console.log(`Statuses: ${data.statuses.join(", ")}`);
|
|
383
|
+
if (data.boards)
|
|
384
|
+
console.log(`Boards: ${data.boards.join(", ")}`);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
console.log("FAIL (network error)");
|
|
388
|
+
}
|
|
389
|
+
console.log();
|
|
390
|
+
}
|
|
391
|
+
async function verbose() {
|
|
392
|
+
const current = (0, config_1.isVerbose)();
|
|
393
|
+
const newState = !current;
|
|
394
|
+
(0, config_1.setVerbose)(newState);
|
|
395
|
+
console.log(`\nVerbose mode: ${newState ? "ON" : "OFF"}\n`);
|
|
396
|
+
}
|
|
397
|
+
async function configSet() {
|
|
398
|
+
const subcommand = process.argv[3]; // "set"
|
|
399
|
+
const key = process.argv[4]; // "anthropic-key"
|
|
400
|
+
const value = process.argv[5]; // the actual key
|
|
401
|
+
if (subcommand !== "set" || key !== "anthropic-key" || !value) {
|
|
402
|
+
console.error("\nUsage: devto config set anthropic-key <key>\n");
|
|
403
|
+
process.exit(1);
|
|
404
|
+
}
|
|
405
|
+
if (!value.startsWith("sk-ant-")) {
|
|
406
|
+
console.error("\nInvalid Anthropic key format. Keys should start with 'sk-ant-'.\n");
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
(0, config_1.setAnthropicKey)(value);
|
|
410
|
+
console.log("\nAnthropic API key saved to ~/.devto/config.json");
|
|
411
|
+
console.log(`Key: ${value.slice(0, 12)}...`);
|
|
412
|
+
console.log("You can now use `devto create_plan` with local AI generation.\n");
|
|
413
|
+
}
|
|
414
|
+
function printHelp() {
|
|
415
|
+
console.log(`
|
|
416
|
+
DevTo CLI — AI-powered work management
|
|
417
|
+
|
|
418
|
+
Usage:
|
|
419
|
+
devto login Authenticate with your DevTo API key
|
|
420
|
+
devto status Show connection status
|
|
421
|
+
devto init Auto-configure Claude Code MCP config
|
|
422
|
+
devto doctor Test full connection chain
|
|
423
|
+
devto sync Re-sync workspace configuration
|
|
424
|
+
devto verbose Toggle verbose mode
|
|
425
|
+
devto config set anthropic-key <key> Store Anthropic API key
|
|
426
|
+
devto help Show this help message
|
|
427
|
+
|
|
428
|
+
After logging in, add DevTo to your Claude Code MCP config:
|
|
429
|
+
|
|
430
|
+
{
|
|
431
|
+
"mcpServers": {
|
|
432
|
+
"devto": {
|
|
433
|
+
"command": "devto-mcp",
|
|
434
|
+
"env": {
|
|
435
|
+
"DEVTO_API_KEY": "your-api-key"
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
`);
|
|
441
|
+
}
|
|
442
|
+
async function main() {
|
|
443
|
+
switch (command) {
|
|
444
|
+
case "login":
|
|
445
|
+
await login();
|
|
446
|
+
break;
|
|
447
|
+
case "status":
|
|
448
|
+
await status();
|
|
449
|
+
break;
|
|
450
|
+
case "init":
|
|
451
|
+
await init();
|
|
452
|
+
break;
|
|
453
|
+
case "doctor":
|
|
454
|
+
await doctor();
|
|
455
|
+
break;
|
|
456
|
+
case "sync":
|
|
457
|
+
await sync();
|
|
458
|
+
break;
|
|
459
|
+
case "verbose":
|
|
460
|
+
await verbose();
|
|
461
|
+
break;
|
|
462
|
+
case "config":
|
|
463
|
+
await configSet();
|
|
464
|
+
break;
|
|
465
|
+
case "help":
|
|
466
|
+
case "--help":
|
|
467
|
+
case "-h":
|
|
468
|
+
case undefined:
|
|
469
|
+
printHelp();
|
|
470
|
+
break;
|
|
471
|
+
default:
|
|
472
|
+
console.error(`Unknown command: ${command}`);
|
|
473
|
+
printHelp();
|
|
474
|
+
process.exit(1);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
main().catch((err) => {
|
|
478
|
+
console.error("Error:", err.message);
|
|
479
|
+
process.exit(1);
|
|
480
|
+
});
|
|
481
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,mDAAqC;AACrC,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,qCAQkB;AAElB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,MAAM,GAAG,KAAK;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACxD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;qBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,KAAK,IAAI,IAAI,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC;YAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAc;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;YACjD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAC;QACH,iCAAiC;QACjC,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAExE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CACX,8GAA8G,CAC/G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACnE,IAAA,oBAAW,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAE1D,uBAAuB;IACvB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,IAAA,wBAAe,GAAE,CAAC;QAClB,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,gBAAgB,EAAE;YACzD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE;gBACzC,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAO7B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,WAAW,WAAW,IAAI,CAAC,iBAAiB,cAAc,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CACT,0BAA0B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACpH,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC;IAEnD,gDAAgD;IAChD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,4BAA4B,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,4BAA4B,CAAC;KAClG,CAAC;IAEF,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,UAAU,GAAG,SAAS,CAAC;YACvB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,sEAAsE;QACtE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,sCAAsC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;YAChD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;IAE1C,sCAAsC;IACtC,IAAI,SAAS,GAA4B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACtE,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,4BAA4B;IAC3B,SAAS,CAAC,UAAsC,CAAC,OAAO,CAAC,GAAG;QAC3D,OAAO,EAAE,WAAW;QACpB,GAAG,EAAE;YACH,aAAa,EAAE,MAAM;SACtB;KACF,CAAC;IAEF,eAAe;IACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,8FAA8F,CAC/F,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,+BAA+B;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,IAAI,IAAA,kBAAS,GAAE,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;YACjD,OAAO,EAAE;gBACP,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mDAAmD,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;gBACjD,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE;oBACzC,iBAAiB,EAAE,OAAO;iBAC3B;aACF,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;gBACjD,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE;oBACzC,iBAAiB,EAAE,OAAO;iBAC3B;aACF,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+B,CAAC;gBAC9D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,IAAA,wBAAe,GAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;IAE9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,uBAAuB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE;gBACzC,iBAAiB,EAAE,OAAO;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAyB,CAAC;YAC1E,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAK7B,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,OAAO,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC;IAC1B,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAEhD,IAAI,UAAU,KAAK,KAAK,IAAI,GAAG,KAAK,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CACX,qEAAqE,CACtE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAA,wBAAe,EAAC,KAAK,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,KAAK,EAAE,CAAC;YACd,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,MAAM,EAAE,CAAC;YACf,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAI,EAAE,CAAC;YACb,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,MAAM,EAAE,CAAC;YACf,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAI,EAAE,CAAC;YACb,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class DevToApiError extends Error {
|
|
2
|
+
code?: string | undefined;
|
|
3
|
+
status?: number | undefined;
|
|
4
|
+
constructor(message: string, code?: string | undefined, status?: number | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare function callApi<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
7
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAc,SAAQ,KAAK;IAG7B,IAAI,CAAC,EAAE,MAAM;IACb,MAAM,CAAC,EAAE,MAAM;gBAFtB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,MAAM,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED,wBAAsB,OAAO,CAAC,CAAC,EAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DevToApiError = void 0;
|
|
4
|
+
exports.callApi = callApi;
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
const DEVTO_VERSION = "0.1.0";
|
|
7
|
+
class DevToApiError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
status;
|
|
10
|
+
constructor(message, code, status) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.name = "DevToApiError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.DevToApiError = DevToApiError;
|
|
18
|
+
async function callApi(method, path, body) {
|
|
19
|
+
const apiKey = (0, config_1.getApiKey)();
|
|
20
|
+
const apiUrl = (0, config_1.getApiUrl)();
|
|
21
|
+
const res = await fetch(`${apiUrl}${path}`, {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
Authorization: `Bearer ${apiKey}`,
|
|
26
|
+
"X-DevTo-Version": DEVTO_VERSION,
|
|
27
|
+
},
|
|
28
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
29
|
+
});
|
|
30
|
+
const data = await res.json().catch(() => ({}));
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
throw new DevToApiError(data.message ?? `Request failed: ${res.status}`, data.code, res.status);
|
|
33
|
+
}
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAeA,0BA6BC;AA5CD,qCAAgD;AAEhD,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,MAAa,aAAc,SAAQ,KAAK;IAG7B;IACA;IAHT,YACE,OAAe,EACR,IAAa,EACb,MAAe;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAS;QACb,WAAM,GAAN,MAAM,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AATD,sCASC;AAEM,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAE3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;QAC1C,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,iBAAiB,EAAE,aAAa;SACjC;QACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,aAAa,CACpB,IAA6B,CAAC,OAAO,IAAI,mBAAmB,GAAG,CAAC,MAAM,EAAE,EACxE,IAA0B,CAAC,IAAI,EAChC,GAAG,CAAC,MAAM,CACX,CAAC;IACJ,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC"}
|