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 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).
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require("../dist/index.js");
package/bin/devto.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require("../dist/cli.js");
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}