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.
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/dist/cli/commands/auth.d.ts +7 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +69 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +5 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +191 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +198 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/orgs.d.ts +8 -0
- package/dist/cli/commands/orgs.d.ts.map +1 -0
- package/dist/cli/commands/orgs.js +81 -0
- package/dist/cli/commands/orgs.js.map +1 -0
- package/dist/cli/commands/profiles.d.ts +2 -0
- package/dist/cli/commands/profiles.d.ts.map +1 -0
- package/dist/cli/commands/profiles.js +20 -0
- package/dist/cli/commands/profiles.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +130 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +267 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/issueKey.d.ts +13 -0
- package/dist/cli/issueKey.d.ts.map +1 -0
- package/dist/cli/issueKey.js +50 -0
- package/dist/cli/issueKey.js.map +1 -0
- package/dist/cli/issueKey.test.d.ts +2 -0
- package/dist/cli/issueKey.test.d.ts.map +1 -0
- package/dist/cli/issueKey.test.js +48 -0
- package/dist/cli/issueKey.test.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +49 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +173 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +130 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/configSchema.d.ts +42 -0
- package/dist/lib/configSchema.d.ts.map +1 -0
- package/dist/lib/configSchema.js +41 -0
- package/dist/lib/configSchema.js.map +1 -0
- package/dist/lib/credentials.d.ts +8 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +62 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/credentials.test.d.ts +2 -0
- package/dist/lib/credentials.test.d.ts.map +1 -0
- package/dist/lib/credentials.test.js +35 -0
- package/dist/lib/credentials.test.js.map +1 -0
- package/dist/lib/exporter.d.ts +28 -0
- package/dist/lib/exporter.d.ts.map +1 -0
- package/dist/lib/exporter.js +149 -0
- package/dist/lib/exporter.js.map +1 -0
- package/dist/lib/jiraClient.d.ts +129 -0
- package/dist/lib/jiraClient.d.ts.map +1 -0
- package/dist/lib/jiraClient.js +308 -0
- package/dist/lib/jiraClient.js.map +1 -0
- package/dist/lib/platform.d.ts +9 -0
- package/dist/lib/platform.d.ts.map +1 -0
- package/dist/lib/platform.js +82 -0
- package/dist/lib/platform.js.map +1 -0
- package/dist/lib/runCommand.d.ts +7 -0
- package/dist/lib/runCommand.d.ts.map +1 -0
- package/dist/lib/runCommand.js +26 -0
- package/dist/lib/runCommand.js.map +1 -0
- package/dist/lib/videoFrameExtractor.d.ts +22 -0
- package/dist/lib/videoFrameExtractor.d.ts.map +1 -0
- package/dist/lib/videoFrameExtractor.js +234 -0
- package/dist/lib/videoFrameExtractor.js.map +1 -0
- 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
|
+
[](https://github.com/doryski/jirallm/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/jirallm)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](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 @@
|
|
|
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 @@
|
|
|
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"}
|