jirallm 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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +214 -0
  3. package/dist/cli/commands/auth.d.ts +7 -0
  4. package/dist/cli/commands/auth.d.ts.map +1 -0
  5. package/dist/cli/commands/auth.js +69 -0
  6. package/dist/cli/commands/auth.js.map +1 -0
  7. package/dist/cli/commands/doctor.d.ts +5 -0
  8. package/dist/cli/commands/doctor.d.ts.map +1 -0
  9. package/dist/cli/commands/doctor.js +191 -0
  10. package/dist/cli/commands/doctor.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +2 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +198 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/orgs.d.ts +8 -0
  16. package/dist/cli/commands/orgs.d.ts.map +1 -0
  17. package/dist/cli/commands/orgs.js +81 -0
  18. package/dist/cli/commands/orgs.js.map +1 -0
  19. package/dist/cli/commands/profiles.d.ts +2 -0
  20. package/dist/cli/commands/profiles.d.ts.map +1 -0
  21. package/dist/cli/commands/profiles.js +20 -0
  22. package/dist/cli/commands/profiles.js.map +1 -0
  23. package/dist/cli/commands/setup.d.ts +7 -0
  24. package/dist/cli/commands/setup.d.ts.map +1 -0
  25. package/dist/cli/commands/setup.js +130 -0
  26. package/dist/cli/commands/setup.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +267 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/issueKey.d.ts +13 -0
  32. package/dist/cli/issueKey.d.ts.map +1 -0
  33. package/dist/cli/issueKey.js +50 -0
  34. package/dist/cli/issueKey.js.map +1 -0
  35. package/dist/cli/issueKey.test.d.ts +2 -0
  36. package/dist/cli/issueKey.test.d.ts.map +1 -0
  37. package/dist/cli/issueKey.test.js +48 -0
  38. package/dist/cli/issueKey.test.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +6 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lib/config.d.ts +49 -0
  44. package/dist/lib/config.d.ts.map +1 -0
  45. package/dist/lib/config.js +173 -0
  46. package/dist/lib/config.js.map +1 -0
  47. package/dist/lib/config.test.d.ts +2 -0
  48. package/dist/lib/config.test.d.ts.map +1 -0
  49. package/dist/lib/config.test.js +130 -0
  50. package/dist/lib/config.test.js.map +1 -0
  51. package/dist/lib/configSchema.d.ts +42 -0
  52. package/dist/lib/configSchema.d.ts.map +1 -0
  53. package/dist/lib/configSchema.js +41 -0
  54. package/dist/lib/configSchema.js.map +1 -0
  55. package/dist/lib/credentials.d.ts +8 -0
  56. package/dist/lib/credentials.d.ts.map +1 -0
  57. package/dist/lib/credentials.js +62 -0
  58. package/dist/lib/credentials.js.map +1 -0
  59. package/dist/lib/credentials.test.d.ts +2 -0
  60. package/dist/lib/credentials.test.d.ts.map +1 -0
  61. package/dist/lib/credentials.test.js +35 -0
  62. package/dist/lib/credentials.test.js.map +1 -0
  63. package/dist/lib/exporter.d.ts +28 -0
  64. package/dist/lib/exporter.d.ts.map +1 -0
  65. package/dist/lib/exporter.js +149 -0
  66. package/dist/lib/exporter.js.map +1 -0
  67. package/dist/lib/jiraClient.d.ts +129 -0
  68. package/dist/lib/jiraClient.d.ts.map +1 -0
  69. package/dist/lib/jiraClient.js +308 -0
  70. package/dist/lib/jiraClient.js.map +1 -0
  71. package/dist/lib/platform.d.ts +9 -0
  72. package/dist/lib/platform.d.ts.map +1 -0
  73. package/dist/lib/platform.js +82 -0
  74. package/dist/lib/platform.js.map +1 -0
  75. package/dist/lib/runCommand.d.ts +7 -0
  76. package/dist/lib/runCommand.d.ts.map +1 -0
  77. package/dist/lib/runCommand.js +26 -0
  78. package/dist/lib/runCommand.js.map +1 -0
  79. package/dist/lib/videoFrameExtractor.d.ts +22 -0
  80. package/dist/lib/videoFrameExtractor.d.ts.map +1 -0
  81. package/dist/lib/videoFrameExtractor.js +234 -0
  82. package/dist/lib/videoFrameExtractor.js.map +1 -0
  83. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dominik Rycharski
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,214 @@
1
+ # jirallm
2
+
3
+ [![CI](https://github.com/doryski/jirallm/actions/workflows/ci.yml/badge.svg)](https://github.com/doryski/jirallm/actions/workflows/ci.yml)
4
+ [![npm version](https://img.shields.io/npm/v/jirallm)](https://www.npmjs.com/package/jirallm)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org/)
7
+
8
+ Export Jira Cloud issues as LLM-ready context bundles — markdown, attachments, and deduplicated video frames.
9
+
10
+ ## Why it exists
11
+
12
+ Pasting Jira tickets into an LLM is painful: descriptions are ADF (Atlassian Document Format), comments live in a separate API, attachments are URLs behind auth, and video recordings are useless to a text model. `jirallm` turns a Jira issue (or a JQL query) into a self-contained folder of clean markdown plus extracted media — ready to drop into Claude, ChatGPT, Cursor, or any RAG pipeline.
13
+
14
+ It exists because every team that uses Jira + LLMs ends up writing the same brittle scraping script. This is the version you wish you had.
15
+
16
+ ## Features
17
+
18
+ - Export a single issue or a JQL result set into a structured folder
19
+ - Renders Jira ADF descriptions and comments to clean Markdown
20
+ - Downloads all attachments with original filenames (auth handled)
21
+ - Extracts frames from attached videos via `ffmpeg` and deduplicates near-identical frames using `pixelmatch`
22
+ - Produces an `index.md` summary per issue, ready to paste into an LLM context window
23
+ - Works as a CLI (`jirallm`) and as a programmatic library
24
+ - TypeScript-first, ESM, zero hidden globals
25
+
26
+ ## Requirements
27
+
28
+ - Node.js >= 20
29
+ - [`ffmpeg`](https://ffmpeg.org/download.html) on your `PATH` — only required if you export issues with video attachments. You can also run `jirallm setup` to install it for you (and `jirallm init` will offer to do this automatically when you opt into video frames).
30
+ - A Jira Cloud API token
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ # Global CLI
36
+ npm install -g jirallm
37
+ # or
38
+ pnpm add -g jirallm
39
+
40
+ # As a library inside a project
41
+ pnpm add jirallm
42
+ ```
43
+
44
+ ## Configuration
45
+
46
+ The recommended way to configure `jirallm` is the interactive wizard:
47
+
48
+ ```bash
49
+ jirallm init
50
+ ```
51
+
52
+ It prompts for everything, writes an org + project entry to `~/.config/jirallm/config.toml`, and stores the API token in your OS keychain (macOS Keychain / libsecret / Windows Credential Manager) — never on disk.
53
+
54
+ Run `jirallm init` again any time you want to **add another organization** or **add a new project to an existing organization** — the wizard detects existing config and lets you pick "Create a new organization" or "Add a project to *<org>*".
55
+
56
+ If you enable video frame extraction during `init` and `ffmpeg` isn't on your `PATH`, `init` will offer to run `jirallm setup` for you. You can also run it manually any time, or use `jirallm setup --bundled` to install a self-contained `ffmpeg` via npm without touching your system.
57
+
58
+ ### Organizations and projects
59
+
60
+ Configuration is two levels: an **organization** owns the connection (Jira instance, account email, API token); each org has one or more **projects** that share those credentials and only differ by project key (and optionally output directory).
61
+
62
+ ```toml
63
+ # ~/.config/jirallm/config.toml
64
+
65
+ [orgs.widgets]
66
+ base_url = "https://widgets.atlassian.net"
67
+ user_email = "user@widgets.example"
68
+ include_subtasks = true
69
+
70
+ [orgs.widgets.video_frames]
71
+ enabled = true
72
+ fps = 5
73
+ max_frames = 10
74
+
75
+ [orgs.widgets.projects.WID]
76
+ output_dir = "~/jira/widgets"
77
+
78
+ [orgs.acme]
79
+ base_url = "https://acme.atlassian.net"
80
+ user_email = "user@acme.example"
81
+
82
+ # Three projects share the same Jira instance + token
83
+ [orgs.acme.projects.PROJ]
84
+ output_dir = "~/jira/acme/proj"
85
+
86
+ [orgs.acme.projects.CORE]
87
+ output_dir = "~/jira/acme/core"
88
+
89
+ [orgs.acme.projects.LIB]
90
+ ```
91
+
92
+ Most invocations are just the issue key — `jirallm` looks up the org by the project prefix:
93
+
94
+ ```bash
95
+ jirallm PROJ-7 # auto-resolves to the org that owns PROJ
96
+ jirallm acme/PROJ-7 # disambiguate if multiple orgs have a PROJ project
97
+ jirallm --org acme PROJ-7 # explicit override
98
+ ```
99
+
100
+ If a project key exists in more than one org and you didn't qualify it, you'll get an interactive picker (TTY) or an error suggesting `--org` / `org/KEY` (non-TTY).
101
+
102
+ Useful subcommands:
103
+
104
+ ```bash
105
+ jirallm orgs list # show orgs, projects, and token status
106
+ jirallm auth set --org acme # replace stored token (per organization)
107
+ jirallm auth rm --org acme # remove stored token
108
+ ```
109
+
110
+ ### Selection precedence
111
+
112
+ 1. `--org` flag
113
+ 2. `org/` prefix on the issue key (e.g. `acme/PROJ-7`)
114
+ 3. Auto-resolved from the project prefix when only one configured org owns it
115
+
116
+ CLI flags (`--base-url`, `--output-dir`, `--fps`, …) override whatever the resolved config produces.
117
+
118
+ ## Quick start
119
+
120
+ ### CLI
121
+
122
+ ```bash
123
+ # First-time setup (config + credentials, offers to install ffmpeg)
124
+ jirallm init
125
+
126
+ # Install ffmpeg later, or independently of init
127
+ jirallm setup
128
+ jirallm setup --bundled # self-contained ffmpeg-static, no system changes
129
+
130
+ # Export a single issue (output defaults to ./jira-export)
131
+ jirallm PROJ-123
132
+
133
+ # Export several issues to a custom directory
134
+ jirallm PROJ-123 PROJ-124 --output-dir ./context
135
+
136
+ # Skip video frame extraction (faster, no ffmpeg required)
137
+ jirallm PROJ-123 --no-video-frames
138
+
139
+ # Tune frame extraction
140
+ jirallm PROJ-123 --fps 2 --max-frames 6
141
+
142
+ # Include subtask metadata in the export
143
+ jirallm PROJ-123 --include-subtasks
144
+
145
+ # Show all options
146
+ jirallm --help
147
+ ```
148
+
149
+ Each issue lands in its own folder:
150
+
151
+ ```
152
+ jira-export/
153
+ PROJ-123/
154
+ index.md # summary + description + comments
155
+ attachments/
156
+ design.pdf
157
+ screen-recording.mp4
158
+ frames/
159
+ screen-recording/
160
+ frame-0001.jpg
161
+ frame-0042.jpg # only meaningfully different frames are kept
162
+ ```
163
+
164
+ ### Programmatic
165
+
166
+ ```ts
167
+ import { JiraExporter, loadProfile } from 'jirallm';
168
+
169
+ // Resolve an org/project (config file + keychain), with the same precedence as the CLI
170
+ const { config, apiToken, org, project } = await loadProfile({ org: 'acme', project: 'CORE' });
171
+
172
+ const exporter = new JiraExporter(config, apiToken);
173
+
174
+ const result = await exporter.exportIssues(['CIT-123'], {
175
+ outputDir: project.outputDir ?? './jira-export',
176
+ includeSubtasks: org.includeSubtasks ?? false,
177
+ videoFrames: { enabled: true, fps: 5, maxFrames: 10 },
178
+ });
179
+ ```
180
+
181
+ The constructor also accepts a hand-rolled `JiraConfig` + token if you don't want to use the config file.
182
+
183
+ A lower-level `JiraClient` is also exported for callers that want to drive the Jira API directly.
184
+
185
+ ## Example
186
+
187
+ Bundle a few issues and pipe the resulting summary into your LLM of choice:
188
+
189
+ ```bash
190
+ jirallm PROJ-123 PROJ-124 --output-dir ./triage-bundle
191
+ cat ./triage-bundle/PROJ-123/index.md | pbcopy
192
+ ```
193
+
194
+ ## Platform support
195
+
196
+ - macOS — fully supported
197
+ - Linux — fully supported
198
+ - Windows — should work; `ffmpeg` must be on `PATH`
199
+
200
+ ## Contributing
201
+
202
+ Issues and pull requests are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for development setup and guidelines, and please follow our [Code of Conduct](./CODE_OF_CONDUCT.md).
203
+
204
+ ## Security
205
+
206
+ Found a vulnerability? Please follow the disclosure process in [SECURITY.md](./SECURITY.md).
207
+
208
+ ## License
209
+
210
+ MIT — see [LICENSE](./LICENSE). Authored by [Dominik Rycharski](https://github.com/doryski).
211
+
212
+ ### Third-party tools
213
+
214
+ `jirallm` invokes [`ffmpeg`](https://ffmpeg.org/) as an external process to extract video frames. **`jirallm` does not distribute or bundle `ffmpeg` or any codec binaries.** Users install `ffmpeg` themselves (via system package manager, or via `jirallm setup --bundled`, which installs the [`ffmpeg-static`](https://www.npmjs.com/package/ffmpeg-static) npm package globally on the user's machine). `ffmpeg` and its codecs are governed by their own licenses (LGPL/GPL) and may carry codec patent obligations (H.264, HEVC, AAC, etc.) depending on jurisdiction and usage. The end user is responsible for compliance with those licenses and any applicable patent licensing.
@@ -0,0 +1,7 @@
1
+ export declare function runAuthSet(orgName: string): Promise<void>;
2
+ export declare function runAuthRm(orgName: string, opts?: {
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ export declare function runAuthList(): Promise<void>;
6
+ export declare function runAuthStatus(orgName: string): Promise<void>;
7
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAcA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/D;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB5F;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAcjD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE"}
@@ -0,0 +1,69 @@
1
+ import { intro, outro, password, confirm, isCancel, cancel } from '@clack/prompts';
2
+ import { setToken, removeToken, hasStoredToken } from '../../lib/credentials.js';
3
+ import { listOrgs, readConfig } from '../../lib/config.js';
4
+ function ensureOrg(name) {
5
+ const orgs = listOrgs();
6
+ if (!orgs.includes(name)) {
7
+ console.error(`Organization "${name}" not found. Existing orgs: ${orgs.join(', ') || '(none)'}\nRun \`jirallm init\` first.`);
8
+ process.exit(1);
9
+ }
10
+ }
11
+ export async function runAuthSet(orgName) {
12
+ ensureOrg(orgName);
13
+ intro(`jirallm auth set --org ${orgName}`);
14
+ const token = await password({
15
+ message: 'Jira API token\n\x1b[2mCreate one at https://id.atlassian.com/manage-profile/security/api-tokens. Stored in your OS keychain.\x1b[22m',
16
+ validate: (v) => (v ? undefined : 'Required'),
17
+ });
18
+ if (isCancel(token)) {
19
+ cancel('Cancelled.');
20
+ process.exit(0);
21
+ }
22
+ await setToken(orgName, token);
23
+ outro('Token stored in OS keychain.');
24
+ }
25
+ export async function runAuthRm(orgName, opts = {}) {
26
+ ensureOrg(orgName);
27
+ if (!(await hasStoredToken(orgName))) {
28
+ console.log(`No stored token for "${orgName}" (nothing to remove).`);
29
+ return;
30
+ }
31
+ if (!opts.yes) {
32
+ const ok = await confirm({
33
+ message: `Remove stored token for "${orgName}"?`,
34
+ initialValue: false,
35
+ });
36
+ if (isCancel(ok) || ok !== true) {
37
+ cancel('Cancelled.');
38
+ return;
39
+ }
40
+ }
41
+ const removed = await removeToken(orgName);
42
+ if (removed)
43
+ console.log(`Removed token for "${orgName}".`);
44
+ else
45
+ console.log(`No stored token for "${orgName}" (nothing to remove).`);
46
+ }
47
+ export async function runAuthList() {
48
+ const raw = readConfig();
49
+ const orgs = Object.keys(raw.orgs ?? {});
50
+ if (orgs.length === 0) {
51
+ console.log('No organizations configured. Run `jirallm init`.');
52
+ return;
53
+ }
54
+ for (const name of orgs) {
55
+ const baseUrl = raw.orgs?.[name]?.base_url ?? '';
56
+ const stored = await hasStoredToken(name);
57
+ const tokenLabel = stored ? 'token: stored' : 'token: missing';
58
+ console.log(` ${name} ${baseUrl} ${tokenLabel}`);
59
+ }
60
+ }
61
+ export async function runAuthStatus(orgName) {
62
+ ensureOrg(orgName);
63
+ if (!(await hasStoredToken(orgName))) {
64
+ console.error(`No token stored for "${orgName}". Run \`jirallm auth set --org ${orgName}\`.`);
65
+ process.exit(1);
66
+ }
67
+ console.log(`${orgName}: token stored in OS keychain.`);
68
+ }
69
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function runDoctor(opts?: {
2
+ org?: string;
3
+ project?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AA8LA,wBAAsB,SAAS,CAAC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5F"}
@@ -0,0 +1,191 @@
1
+ import { intro, outro, note } from '@clack/prompts';
2
+ import { checkFFmpegInstalled, resolveFfmpegBinary } from '../../lib/videoFrameExtractor.js';
3
+ import { detectOS, getFfmpegInstallHint } from '../../lib/platform.js';
4
+ import { readConfig, resolveConfigPath, loadProfile } from '../../lib/config.js';
5
+ import { JiraClient } from '../../lib/jiraClient.js';
6
+ import { getToken } from '../../lib/credentials.js';
7
+ const symbols = {
8
+ pass: '\x1b[32m✔\x1b[0m',
9
+ fail: '\x1b[31m✖\x1b[0m',
10
+ warn: '\x1b[33m⚠\x1b[0m',
11
+ };
12
+ function printResult(r) {
13
+ console.log(`${symbols[r.severity]} ${r.name}: ${r.detail}`);
14
+ if (r.hint) {
15
+ for (const line of r.hint.split('\n'))
16
+ console.log(` \x1b[2m${line}\x1b[0m`);
17
+ }
18
+ }
19
+ function checkNode() {
20
+ const major = parseInt(process.versions.node.split('.')[0], 10);
21
+ if (major >= 20) {
22
+ return { name: 'Node.js', severity: 'pass', detail: `v${process.versions.node}` };
23
+ }
24
+ return {
25
+ name: 'Node.js',
26
+ severity: 'fail',
27
+ detail: `v${process.versions.node} (requires >= 20)`,
28
+ hint: 'Upgrade Node.js to 20 or later (https://nodejs.org).',
29
+ };
30
+ }
31
+ async function checkFfmpeg() {
32
+ if (await checkFFmpegInstalled()) {
33
+ return { name: 'ffmpeg', severity: 'pass', detail: 'system ffmpeg available' };
34
+ }
35
+ const resolved = await resolveFfmpegBinary();
36
+ if (resolved) {
37
+ return {
38
+ name: 'ffmpeg',
39
+ severity: 'pass',
40
+ detail: `bundled (${resolved})`,
41
+ };
42
+ }
43
+ return {
44
+ name: 'ffmpeg',
45
+ severity: 'warn',
46
+ detail: 'not found (video frame extraction will fail)',
47
+ hint: await getFfmpegInstallHint(),
48
+ };
49
+ }
50
+ async function checkKeychain() {
51
+ try {
52
+ const mod = (await import('keytar'));
53
+ if (!mod)
54
+ throw new Error('keytar not loaded');
55
+ return { name: 'OS keychain', severity: 'pass', detail: 'keytar loaded' };
56
+ }
57
+ catch (err) {
58
+ return {
59
+ name: 'OS keychain',
60
+ severity: 'fail',
61
+ detail: 'keytar unavailable; tokens cannot be stored or read',
62
+ hint: err instanceof Error
63
+ ? `${err.message}\nTry: pnpm rebuild keytar (after pnpm approve-builds)`
64
+ : 'Try: pnpm rebuild keytar (after pnpm approve-builds)',
65
+ };
66
+ }
67
+ }
68
+ function checkConfig() {
69
+ const path = resolveConfigPath();
70
+ try {
71
+ const raw = readConfig(path);
72
+ const orgs = Object.keys(raw.orgs ?? {});
73
+ if (orgs.length === 0) {
74
+ return {
75
+ name: 'Config',
76
+ severity: 'warn',
77
+ detail: `no orgs configured (${path})`,
78
+ hint: 'Run `jirallm init` to create one.',
79
+ };
80
+ }
81
+ const projectCount = orgs.reduce((acc, name) => acc + Object.keys(raw.orgs?.[name].projects ?? {}).length, 0);
82
+ return {
83
+ name: 'Config',
84
+ severity: 'pass',
85
+ detail: `${orgs.length} org(s), ${projectCount} project(s) at ${path}`,
86
+ };
87
+ }
88
+ catch (err) {
89
+ return {
90
+ name: 'Config',
91
+ severity: 'fail',
92
+ detail: err instanceof Error ? err.message : String(err),
93
+ };
94
+ }
95
+ }
96
+ async function checkJiraOrg(orgName, project) {
97
+ const label = `Jira reachable [${orgName}]`;
98
+ try {
99
+ const raw = readConfig();
100
+ const orgRaw = raw.orgs?.[orgName];
101
+ if (!orgRaw) {
102
+ return {
103
+ name: label,
104
+ severity: 'fail',
105
+ detail: `org "${orgName}" not found in config`,
106
+ };
107
+ }
108
+ if (project) {
109
+ const resolved = await loadProfile({ org: orgName, project });
110
+ const client = new JiraClient(resolved.config, resolved.apiToken);
111
+ const user = await client.getCurrentUser();
112
+ return {
113
+ name: label,
114
+ severity: 'pass',
115
+ detail: `${resolved.org.baseUrl} as ${user.displayName}${user.emailAddress ? ` <${user.emailAddress}>` : ''}`,
116
+ };
117
+ }
118
+ const apiToken = await getToken(orgName);
119
+ if (!apiToken) {
120
+ return {
121
+ name: label,
122
+ severity: 'warn',
123
+ detail: `no API token stored for org "${orgName}"`,
124
+ hint: `Run \`jirallm auth set --org ${orgName}\`.`,
125
+ };
126
+ }
127
+ const firstProjectKey = Object.keys(orgRaw.projects ?? {})[0] ?? '';
128
+ const client = new JiraClient({ baseUrl: orgRaw.base_url, userEmail: orgRaw.user_email, projectKey: firstProjectKey }, apiToken);
129
+ const user = await client.getCurrentUser();
130
+ return {
131
+ name: label,
132
+ severity: 'pass',
133
+ detail: `${orgRaw.base_url} as ${user.displayName}${user.emailAddress ? ` <${user.emailAddress}>` : ''}`,
134
+ };
135
+ }
136
+ catch (err) {
137
+ return {
138
+ name: label,
139
+ severity: 'warn',
140
+ detail: err instanceof Error ? err.message : String(err),
141
+ };
142
+ }
143
+ }
144
+ async function checkJira(org, project) {
145
+ if (org)
146
+ return [await checkJiraOrg(org, project)];
147
+ let orgs = [];
148
+ try {
149
+ const raw = readConfig();
150
+ orgs = Object.keys(raw.orgs ?? {});
151
+ }
152
+ catch (err) {
153
+ return [
154
+ {
155
+ name: 'Jira reachable',
156
+ severity: 'warn',
157
+ detail: `skipped: ${err instanceof Error ? err.message : String(err)}`,
158
+ },
159
+ ];
160
+ }
161
+ if (orgs.length === 0) {
162
+ return [
163
+ {
164
+ name: 'Jira reachable',
165
+ severity: 'warn',
166
+ detail: 'skipped (no orgs configured)',
167
+ hint: 'Run `jirallm init` to create one.',
168
+ },
169
+ ];
170
+ }
171
+ return Promise.all(orgs.map((name) => checkJiraOrg(name)));
172
+ }
173
+ export async function runDoctor(opts = {}) {
174
+ intro('jirallm doctor');
175
+ note(`OS: ${detectOS()}`, 'Environment');
176
+ const results = [];
177
+ results.push(checkNode());
178
+ results.push(await checkFfmpeg());
179
+ results.push(await checkKeychain());
180
+ results.push(checkConfig());
181
+ results.push(...(await checkJira(opts.org, opts.project)));
182
+ for (const r of results)
183
+ printResult(r);
184
+ const failed = results.some((r) => r.severity === 'fail');
185
+ if (failed) {
186
+ outro('Doctor found blocking issues.');
187
+ process.exit(1);
188
+ }
189
+ outro('Doctor finished.');
190
+ }
191
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AA0MA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC7C"}