@geeveeh/atlassian-tools 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/cli/confluence.d.ts +3 -0
  4. package/dist/cli/confluence.d.ts.map +1 -0
  5. package/dist/cli/confluence.js +209 -0
  6. package/dist/cli/confluence.js.map +1 -0
  7. package/dist/cli/helpers.d.ts +3 -0
  8. package/dist/cli/helpers.d.ts.map +1 -0
  9. package/dist/cli/helpers.js +24 -0
  10. package/dist/cli/helpers.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +12 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/jira.d.ts +3 -0
  16. package/dist/cli/jira.d.ts.map +1 -0
  17. package/dist/cli/jira.js +264 -0
  18. package/dist/cli/jira.js.map +1 -0
  19. package/dist/confluence/client.d.ts +16 -0
  20. package/dist/confluence/client.d.ts.map +1 -0
  21. package/dist/confluence/client.js +92 -0
  22. package/dist/confluence/client.js.map +1 -0
  23. package/dist/confluence/index.d.ts +3 -0
  24. package/dist/confluence/index.d.ts.map +1 -0
  25. package/dist/confluence/index.js +3 -0
  26. package/dist/confluence/index.js.map +1 -0
  27. package/dist/confluence/types.d.ts +46 -0
  28. package/dist/confluence/types.d.ts.map +1 -0
  29. package/dist/confluence/types.js +2 -0
  30. package/dist/confluence/types.js.map +1 -0
  31. package/dist/core/auth.d.ts +3 -0
  32. package/dist/core/auth.d.ts.map +1 -0
  33. package/dist/core/auth.js +22 -0
  34. package/dist/core/auth.js.map +1 -0
  35. package/dist/core/client.d.ts +9 -0
  36. package/dist/core/client.d.ts.map +1 -0
  37. package/dist/core/client.js +40 -0
  38. package/dist/core/client.js.map +1 -0
  39. package/dist/core/index.d.ts +5 -0
  40. package/dist/core/index.d.ts.map +1 -0
  41. package/dist/core/index.js +5 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/core/markdown.d.ts +15 -0
  44. package/dist/core/markdown.d.ts.map +1 -0
  45. package/dist/core/markdown.js +83 -0
  46. package/dist/core/markdown.js.map +1 -0
  47. package/dist/core/types.d.ts +22 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js +12 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/jira/client.d.ts +18 -0
  52. package/dist/jira/client.d.ts.map +1 -0
  53. package/dist/jira/client.js +86 -0
  54. package/dist/jira/client.js.map +1 -0
  55. package/dist/jira/helpers.d.ts +5 -0
  56. package/dist/jira/helpers.d.ts.map +1 -0
  57. package/dist/jira/helpers.js +35 -0
  58. package/dist/jira/helpers.js.map +1 -0
  59. package/dist/jira/index.d.ts +4 -0
  60. package/dist/jira/index.d.ts.map +1 -0
  61. package/dist/jira/index.js +4 -0
  62. package/dist/jira/index.js.map +1 -0
  63. package/dist/jira/types.d.ts +68 -0
  64. package/dist/jira/types.d.ts.map +1 -0
  65. package/dist/jira/types.js +2 -0
  66. package/dist/jira/types.js.map +1 -0
  67. package/dist/mcp/index.d.ts +3 -0
  68. package/dist/mcp/index.d.ts.map +1 -0
  69. package/dist/mcp/index.js +367 -0
  70. package/dist/mcp/index.js.map +1 -0
  71. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shadowgandor
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,228 @@
1
+ # atlassian-tools
2
+
3
+ CLI and MCP server for Atlassian Cloud. Manage Confluence pages and Jira issues from your terminal or AI agent — with a single set of credentials.
4
+
5
+ ## Features
6
+
7
+ - **Confluence** — Full CRUD for pages: search, read, create, update, delete
8
+ - **Jira** — Issues: search (JQL), view, create, update, transition, delete
9
+ - **Shared auth** — One set of credentials (`ATLASSIAN_URL`, `ATLASSIAN_EMAIL`, `ATLASSIAN_TOKEN`) for all products
10
+ - **CLI** — `atlassian` command with product subcommands, interactive confirmations, coloured output
11
+ - **MCP server** — Expose all operations as tools for AI agents (Claude Code, etc.)
12
+ - **Markdown support** — Automatically converts `.md` files to Confluence storage format
13
+ - **Secure by design** — Credentials are read from environment variables only, never written to disk
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install -g atlassian-tools
19
+ ```
20
+
21
+ Or run without installing:
22
+
23
+ ```bash
24
+ npx atlassian-tools atlassian confluence auth
25
+ ```
26
+
27
+ ### Environment variables
28
+
29
+ ```bash
30
+ export ATLASSIAN_URL="https://your-instance.atlassian.net"
31
+ export ATLASSIAN_EMAIL="you@example.com"
32
+ export ATLASSIAN_TOKEN="your-api-token"
33
+ ```
34
+
35
+ Generate an API token at https://id.atlassian.com/manage-profile/security/api-tokens
36
+
37
+ > **Migration note:** The legacy `CONFLUENCE_URL`, `CONFLUENCE_EMAIL`, and `CONFLUENCE_TOKEN` variables are still supported. `CONFLUENCE_URL` is expected to include `/wiki` — the tool strips it automatically.
38
+
39
+ ## CLI usage
40
+
41
+ ### Confluence
42
+
43
+ ```bash
44
+ # Verify connection
45
+ atlassian confluence auth
46
+
47
+ # List spaces
48
+ atlassian confluence spaces
49
+
50
+ # Read a page
51
+ atlassian confluence read 12345678
52
+ atlassian confluence read 12345678 --json
53
+
54
+ # Search pages in a space
55
+ atlassian confluence search -s DEV -t "Architecture"
56
+
57
+ # Create a page (prompts for confirmation)
58
+ atlassian confluence create -s DEV -t "New RFC" -f proposal.md
59
+
60
+ # Update a page
61
+ atlassian confluence update 12345678 -f updated.md -m "Revised section 3"
62
+
63
+ # Delete a page
64
+ atlassian confluence delete 12345678
65
+ ```
66
+
67
+ ### Jira
68
+
69
+ ```bash
70
+ # Verify connection
71
+ atlassian jira auth
72
+
73
+ # List projects
74
+ atlassian jira projects
75
+
76
+ # Search issues
77
+ atlassian jira list --project CARD --status "In Progress"
78
+ atlassian jira list --jql 'assignee = currentUser() AND status != Done'
79
+
80
+ # View an issue
81
+ atlassian jira view CARD-42
82
+ atlassian jira view CARD-42 --json
83
+
84
+ # Create an issue (prompts for confirmation)
85
+ atlassian jira create --project CARD --type Bug --summary "Fix login"
86
+
87
+ # Update an issue
88
+ atlassian jira update CARD-42 --priority High --summary "Fix login regression"
89
+
90
+ # Transition an issue
91
+ atlassian jira transition CARD-42 --to "In Progress"
92
+ atlassian jira transition CARD-42 --list # show available transitions
93
+
94
+ # Delete an issue
95
+ atlassian jira delete CARD-42
96
+ ```
97
+
98
+ All write/delete commands prompt for confirmation. Pass `-y` to skip (useful in scripts).
99
+
100
+ ## MCP server usage
101
+
102
+ Add to your Claude Code config (`~/.claude.json` or project `.mcp.json`):
103
+
104
+ ```json
105
+ {
106
+ "mcpServers": {
107
+ "atlassian": {
108
+ "command": "atlassian-mcp",
109
+ "env": {
110
+ "ATLASSIAN_URL": "https://your-instance.atlassian.net",
111
+ "ATLASSIAN_EMAIL": "you@example.com",
112
+ "ATLASSIAN_TOKEN": "your-api-token"
113
+ }
114
+ }
115
+ }
116
+ }
117
+ ```
118
+
119
+ Or without a global install:
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "atlassian": {
125
+ "command": "npx",
126
+ "args": ["--package=atlassian-tools", "-y", "atlassian-mcp"],
127
+ "env": {
128
+ "ATLASSIAN_URL": "https://your-instance.atlassian.net",
129
+ "ATLASSIAN_EMAIL": "you@example.com",
130
+ "ATLASSIAN_TOKEN": "your-api-token"
131
+ }
132
+ }
133
+ }
134
+ }
135
+ ```
136
+
137
+ ### Available tools
138
+
139
+ #### Confluence
140
+
141
+ | Tool | Description | Confirmation needed |
142
+ |----------------------------|--------------------------------------|---------------------|
143
+ | `confluence_auth` | Verify connection | No |
144
+ | `confluence_list_spaces` | List spaces | No |
145
+ | `confluence_read_page` | Read page content by ID | No |
146
+ | `confluence_search_pages` | Search by space key and title | No |
147
+ | `confluence_create_page` | Create a new page | **Yes** |
148
+ | `confluence_update_page` | Update an existing page | **Yes** |
149
+ | `confluence_delete_page` | Delete a page | **Yes** |
150
+
151
+ #### Jira
152
+
153
+ | Tool | Description | Confirmation needed |
154
+ |----------------------------|--------------------------------------|---------------------|
155
+ | `jira_auth` | Verify connection | No |
156
+ | `jira_list_projects` | List projects | No |
157
+ | `jira_get_issue` | Get issue details by key | No |
158
+ | `jira_search_issues` | Search with JQL or filters | No |
159
+ | `jira_create_issue` | Create a new issue | **Yes** |
160
+ | `jira_update_issue` | Update an existing issue | **Yes** |
161
+ | `jira_transition_issue` | Transition issue status | **Yes** |
162
+ | `jira_delete_issue` | Delete an issue | **Yes** |
163
+
164
+ ## Project structure
165
+
166
+ ```
167
+ src/
168
+ ├── core/ # Shared: auth, HTTP client, types, markdown converter
169
+ │ ├── client.ts # Generic Atlassian HTTP client (auth, fetch, errors)
170
+ │ ├── auth.ts # Environment-based config loader
171
+ │ ├── markdown.ts # Markdown → Confluence storage format converter
172
+ │ ├── types.ts # Shared TypeScript interfaces
173
+ │ └── index.ts # Barrel export
174
+ ├── confluence/ # Confluence-specific client + types
175
+ │ ├── client.ts # Confluence REST API client
176
+ │ ├── types.ts # Confluence interfaces
177
+ │ └── index.ts # Barrel export
178
+ ├── jira/ # Jira-specific client + types
179
+ │ ├── client.ts # Jira REST API v3 client
180
+ │ ├── types.ts # Jira interfaces
181
+ │ └── index.ts # Barrel export
182
+ ├── cli/ # Commander.js with product subcommands
183
+ │ ├── index.ts # Main entry point
184
+ │ ├── helpers.ts # Shared CLI utilities
185
+ │ ├── confluence.ts
186
+ │ └── jira.ts
187
+ └── mcp/ # MCP server exposing all tools
188
+ └── index.ts
189
+ ```
190
+
191
+ ## Programmatic usage
192
+
193
+ ```typescript
194
+ import { ConfluenceClient } from "atlassian-tools/confluence";
195
+ import { JiraClient } from "atlassian-tools/jira";
196
+ import { loadConfigFromEnv } from "atlassian-tools";
197
+
198
+ const config = loadConfigFromEnv();
199
+ const confluence = new ConfluenceClient(config);
200
+ const jira = new JiraClient(config);
201
+
202
+ const pages = await confluence.searchPages({ spaceKey: "DEV", title: "RFC" });
203
+ const issues = await jira.searchIssues({ project: "CARD", status: "In Progress" });
204
+ ```
205
+
206
+ ## Development
207
+
208
+ ```bash
209
+ # Run CLI in dev mode (no build step)
210
+ npm run dev:cli -- confluence auth
211
+ npm run dev:cli -- jira list --project CARD
212
+
213
+ # Run MCP server in dev mode
214
+ npm run dev:mcp
215
+
216
+ # Build
217
+ npm run build
218
+
219
+ # Test
220
+ npm test
221
+
222
+ # Lint
223
+ npm run lint
224
+ ```
225
+
226
+ ## License
227
+
228
+ MIT — GeeveeH Software
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfluenceCommands(program: Command): void;
3
+ //# sourceMappingURL=confluence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.d.ts","sourceRoot":"","sources":["../../src/cli/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,QAuM1D"}
@@ -0,0 +1,209 @@
1
+ import chalk from "chalk";
2
+ import { loadConfigFromEnv } from "../core/auth.js";
3
+ import { resolveBody } from "../core/markdown.js";
4
+ import { ConfluenceClient } from "../confluence/client.js";
5
+ import { handleError, confirm } from "./helpers.js";
6
+ function createClient() {
7
+ return new ConfluenceClient(loadConfigFromEnv());
8
+ }
9
+ function formatPage(page) {
10
+ return `${chalk.bold(page.title)} ${chalk.dim(`(id: ${page.id}, v${page.version?.number ?? "?"}, ${page.status})`)}`;
11
+ }
12
+ function pageUrl(page) {
13
+ const base = page._links?.base ?? process.env.ATLASSIAN_URL ?? process.env.CONFLUENCE_URL?.replace(/\/wiki\/?$/, "") ?? "";
14
+ return `${base}/wiki/pages/${page.id}`;
15
+ }
16
+ export function registerConfluenceCommands(program) {
17
+ const confluence = program
18
+ .command("confluence")
19
+ .description("Atlassian Confluence — create, read, update, delete pages");
20
+ confluence
21
+ .command("auth")
22
+ .description("Verify your Confluence connection")
23
+ .action(async () => {
24
+ try {
25
+ const client = createClient();
26
+ const spaces = await client.verifyConnection();
27
+ console.log(chalk.green("✓ Connected successfully."));
28
+ console.log(` Found ${spaces.length} space(s):`);
29
+ for (const s of spaces) {
30
+ console.log(` • ${chalk.bold(s.name)} ${chalk.dim(`[${s.key}]`)}`);
31
+ }
32
+ }
33
+ catch (err) {
34
+ handleError(err);
35
+ }
36
+ });
37
+ confluence
38
+ .command("spaces")
39
+ .description("List available spaces")
40
+ .option("-l, --limit <n>", "Max spaces to return", "25")
41
+ .action(async (opts) => {
42
+ try {
43
+ const client = createClient();
44
+ const spaces = await client.listSpaces(Number(opts.limit));
45
+ for (const s of spaces) {
46
+ console.log(`${chalk.bold(s.name)} ${chalk.dim(`[${s.key}] id:${s.id}`)}`);
47
+ }
48
+ }
49
+ catch (err) {
50
+ handleError(err);
51
+ }
52
+ });
53
+ confluence
54
+ .command("read <pageId>")
55
+ .description("Read a page by ID")
56
+ .option("--json", "Output raw JSON")
57
+ .action(async (pageId, opts) => {
58
+ try {
59
+ const client = createClient();
60
+ const page = await client.getPage(pageId);
61
+ if (opts.json) {
62
+ console.log(JSON.stringify(page, null, 2));
63
+ }
64
+ else {
65
+ console.log(formatPage(page));
66
+ if (page.body?.storage?.value) {
67
+ console.log(chalk.dim("─".repeat(60)));
68
+ console.log(page.body.storage.value);
69
+ }
70
+ }
71
+ }
72
+ catch (err) {
73
+ handleError(err);
74
+ }
75
+ });
76
+ confluence
77
+ .command("search")
78
+ .description("Search for pages in a space")
79
+ .requiredOption("-s, --space <key>", "Space key")
80
+ .option("-t, --title <title>", "Filter by title")
81
+ .option("-l, --limit <n>", "Max results", "25")
82
+ .action(async (opts) => {
83
+ try {
84
+ const client = createClient();
85
+ const pages = await client.searchPages({
86
+ spaceKey: opts.space,
87
+ title: opts.title,
88
+ limit: Number(opts.limit),
89
+ });
90
+ if (pages.length === 0) {
91
+ console.log(chalk.yellow("No pages found."));
92
+ return;
93
+ }
94
+ for (const p of pages) {
95
+ console.log(formatPage(p));
96
+ }
97
+ }
98
+ catch (err) {
99
+ handleError(err);
100
+ }
101
+ });
102
+ confluence
103
+ .command("create")
104
+ .description("Create a new page")
105
+ .requiredOption("-s, --space <key>", "Space key")
106
+ .requiredOption("-t, --title <title>", "Page title")
107
+ .requiredOption("-f, --file <path>", "Content file (.md, .html) or inline string")
108
+ .option("-p, --parent <id>", "Parent page ID")
109
+ .option("--draft", "Create as draft")
110
+ .option("-y, --yes", "Skip confirmation prompt")
111
+ .action(async (opts) => {
112
+ try {
113
+ const client = createClient();
114
+ const space = await client.getSpaceByKey(opts.space);
115
+ const body = await resolveBody(opts.file);
116
+ if (!opts.yes) {
117
+ console.log(chalk.yellow("⚠ About to create page:"));
118
+ console.log(` Space: ${space.name} [${space.key}]`);
119
+ console.log(` Title: ${opts.title}`);
120
+ if (opts.parent)
121
+ console.log(` Parent: ${opts.parent}`);
122
+ console.log(` Status: ${opts.draft ? "draft" : "published"}`);
123
+ console.log();
124
+ const ok = await confirm("Proceed?");
125
+ if (!ok) {
126
+ console.log(chalk.dim("Cancelled."));
127
+ return;
128
+ }
129
+ }
130
+ const page = await client.createPage({
131
+ spaceId: space.id,
132
+ title: opts.title,
133
+ body,
134
+ parentId: opts.parent,
135
+ status: opts.draft ? "draft" : "current",
136
+ });
137
+ console.log(chalk.green(`✓ Created: ${formatPage(page)}`));
138
+ console.log(` ${chalk.cyan(pageUrl(page))}`);
139
+ }
140
+ catch (err) {
141
+ handleError(err);
142
+ }
143
+ });
144
+ confluence
145
+ .command("update <pageId>")
146
+ .description("Update an existing page")
147
+ .option("-t, --title <title>", "New title")
148
+ .option("-f, --file <path>", "New content file (.md, .html) or inline string")
149
+ .option("-m, --message <msg>", "Version message")
150
+ .option("-y, --yes", "Skip confirmation prompt")
151
+ .action(async (pageId, opts) => {
152
+ try {
153
+ const client = createClient();
154
+ const current = await client.getPage(pageId);
155
+ const body = opts.file ? await resolveBody(opts.file) : undefined;
156
+ if (!opts.yes) {
157
+ console.log(chalk.yellow("⚠ About to update page:"));
158
+ console.log(` Page: ${formatPage(current)}`);
159
+ if (opts.title)
160
+ console.log(` Title: ${current.title} → ${opts.title}`);
161
+ if (body)
162
+ console.log(` Body: will be replaced`);
163
+ console.log();
164
+ const ok = await confirm("Proceed?");
165
+ if (!ok) {
166
+ console.log(chalk.dim("Cancelled."));
167
+ return;
168
+ }
169
+ }
170
+ const updated = await client.updatePage({
171
+ pageId,
172
+ title: opts.title,
173
+ body,
174
+ versionMessage: opts.message,
175
+ });
176
+ console.log(chalk.green(`✓ Updated: ${formatPage(updated)}`));
177
+ console.log(` ${chalk.cyan(pageUrl(updated))}`);
178
+ }
179
+ catch (err) {
180
+ handleError(err);
181
+ }
182
+ });
183
+ confluence
184
+ .command("delete <pageId>")
185
+ .description("Delete a page")
186
+ .option("-y, --yes", "Skip confirmation prompt")
187
+ .action(async (pageId, opts) => {
188
+ try {
189
+ const client = createClient();
190
+ const page = await client.getPage(pageId);
191
+ if (!opts.yes) {
192
+ console.log(chalk.red("⚠ About to DELETE page:"));
193
+ console.log(` ${formatPage(page)}`);
194
+ console.log();
195
+ const ok = await confirm("This cannot be undone. Proceed?");
196
+ if (!ok) {
197
+ console.log(chalk.dim("Cancelled."));
198
+ return;
199
+ }
200
+ }
201
+ await client.deletePage(pageId);
202
+ console.log(chalk.green(`✓ Deleted page "${page.title}" (id: ${pageId})`));
203
+ }
204
+ catch (err) {
205
+ handleError(err);
206
+ }
207
+ });
208
+ }
209
+ //# sourceMappingURL=confluence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../src/cli/confluence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function handleError(err: unknown): never;
2
+ export declare function confirm(question: string): Promise<boolean>;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAQ/C;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUhE"}
@@ -0,0 +1,24 @@
1
+ import chalk from "chalk";
2
+ import { AtlassianApiError } from "../core/types.js";
3
+ export function handleError(err) {
4
+ if (err instanceof AtlassianApiError) {
5
+ console.error(chalk.red(`✗ API error ${err.statusCode}: ${err.message}`));
6
+ if (err.data)
7
+ console.error(chalk.dim(JSON.stringify(err.data, null, 2)));
8
+ }
9
+ else if (err instanceof Error) {
10
+ console.error(chalk.red(`✗ ${err.message}`));
11
+ }
12
+ process.exit(1);
13
+ }
14
+ export async function confirm(question) {
15
+ const { createInterface } = await import("node:readline");
16
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
17
+ return new Promise((resolve) => {
18
+ rl.question(`${question} [y/N] `, (answer) => {
19
+ rl.close();
20
+ resolve(answer.trim().toLowerCase().startsWith("y"));
21
+ });
22
+ });
23
+ }
24
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { registerConfluenceCommands } from "./confluence.js";
4
+ import { registerJiraCommands } from "./jira.js";
5
+ const program = new Command()
6
+ .name("atlassian")
7
+ .description("CLI for Atlassian Cloud — Confluence, Jira, and more")
8
+ .version("0.2.0");
9
+ registerConfluenceCommands(program);
10
+ registerJiraCommands(program);
11
+ program.parse();
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerJiraCommands(program: Command): void;
3
+ //# sourceMappingURL=jira.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../src/cli/jira.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAmQpD"}