@aligndottech/cli 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 +152 -0
- package/dist/commands/capture.d.ts +3 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +74 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +94 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/connector/index.d.ts +3 -0
- package/dist/commands/connector/index.d.ts.map +1 -0
- package/dist/commands/connector/index.js +145 -0
- package/dist/commands/connector/index.js.map +1 -0
- package/dist/commands/decisions/index.d.ts +3 -0
- package/dist/commands/decisions/index.d.ts.map +1 -0
- package/dist/commands/decisions/index.js +91 -0
- package/dist/commands/decisions/index.js.map +1 -0
- package/dist/commands/dev/index.d.ts +3 -0
- package/dist/commands/dev/index.d.ts.map +1 -0
- package/dist/commands/dev/index.js +226 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/drift.d.ts +3 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +51 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +28 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/import/confluence.d.ts +3 -0
- package/dist/commands/import/confluence.d.ts.map +1 -0
- package/dist/commands/import/confluence.js +43 -0
- package/dist/commands/import/confluence.js.map +1 -0
- package/dist/commands/import/git.d.ts +3 -0
- package/dist/commands/import/git.d.ts.map +1 -0
- package/dist/commands/import/git.js +59 -0
- package/dist/commands/import/git.js.map +1 -0
- package/dist/commands/import/github.d.ts +3 -0
- package/dist/commands/import/github.d.ts.map +1 -0
- package/dist/commands/import/github.js +36 -0
- package/dist/commands/import/github.js.map +1 -0
- package/dist/commands/import/gitlab.d.ts +3 -0
- package/dist/commands/import/gitlab.d.ts.map +1 -0
- package/dist/commands/import/gitlab.js +37 -0
- package/dist/commands/import/gitlab.js.map +1 -0
- package/dist/commands/import/jira.d.ts +3 -0
- package/dist/commands/import/jira.d.ts.map +1 -0
- package/dist/commands/import/jira.js +43 -0
- package/dist/commands/import/jira.js.map +1 -0
- package/dist/commands/import/linear.d.ts +3 -0
- package/dist/commands/import/linear.d.ts.map +1 -0
- package/dist/commands/import/linear.js +36 -0
- package/dist/commands/import/linear.js.map +1 -0
- package/dist/commands/import/notion.d.ts +3 -0
- package/dist/commands/import/notion.d.ts.map +1 -0
- package/dist/commands/import/notion.js +41 -0
- package/dist/commands/import/notion.js.map +1 -0
- package/dist/commands/import/slack.d.ts +3 -0
- package/dist/commands/import/slack.d.ts.map +1 -0
- package/dist/commands/import/slack.js +46 -0
- package/dist/commands/import/slack.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +285 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/links.d.ts +3 -0
- package/dist/commands/links.d.ts.map +1 -0
- package/dist/commands/links.js +59 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +90 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +162 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +42 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/spaces.d.ts +3 -0
- package/dist/commands/spaces.d.ts.map +1 -0
- package/dist/commands/spaces.js +39 -0
- package/dist/commands/spaces.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +18 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env-resolver.d.ts +5 -0
- package/dist/lib/env-resolver.d.ts.map +1 -0
- package/dist/lib/env-resolver.js +14 -0
- package/dist/lib/env-resolver.js.map +1 -0
- package/dist/lib/fetchers/confluence.d.ts +8 -0
- package/dist/lib/fetchers/confluence.d.ts.map +1 -0
- package/dist/lib/fetchers/confluence.js +27 -0
- package/dist/lib/fetchers/confluence.js.map +1 -0
- package/dist/lib/fetchers/github.d.ts +6 -0
- package/dist/lib/fetchers/github.d.ts.map +1 -0
- package/dist/lib/fetchers/github.js +43 -0
- package/dist/lib/fetchers/github.js.map +1 -0
- package/dist/lib/fetchers/gitlab.d.ts +7 -0
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -0
- package/dist/lib/fetchers/gitlab.js +24 -0
- package/dist/lib/fetchers/gitlab.js.map +1 -0
- package/dist/lib/fetchers/jira.d.ts +8 -0
- package/dist/lib/fetchers/jira.d.ts.map +1 -0
- package/dist/lib/fetchers/jira.js +45 -0
- package/dist/lib/fetchers/jira.js.map +1 -0
- package/dist/lib/fetchers/linear.d.ts +6 -0
- package/dist/lib/fetchers/linear.d.ts.map +1 -0
- package/dist/lib/fetchers/linear.js +58 -0
- package/dist/lib/fetchers/linear.js.map +1 -0
- package/dist/lib/fetchers/notion.d.ts +6 -0
- package/dist/lib/fetchers/notion.d.ts.map +1 -0
- package/dist/lib/fetchers/notion.js +47 -0
- package/dist/lib/fetchers/notion.js.map +1 -0
- package/dist/lib/fetchers/slack.d.ts +7 -0
- package/dist/lib/fetchers/slack.d.ts.map +1 -0
- package/dist/lib/fetchers/slack.js +62 -0
- package/dist/lib/fetchers/slack.js.map +1 -0
- package/dist/lib/gateway-client.d.ts +205 -0
- package/dist/lib/gateway-client.d.ts.map +1 -0
- package/dist/lib/gateway-client.js +187 -0
- package/dist/lib/gateway-client.js.map +1 -0
- package/dist/lib/git.d.ts +23 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +92 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/personal-import.d.ts +8 -0
- package/dist/lib/personal-import.d.ts.map +1 -0
- package/dist/lib/personal-import.js +64 -0
- package/dist/lib/personal-import.js.map +1 -0
- package/dist/lib/process.d.ts +7 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +48 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/resolve-env.d.ts +3 -0
- package/dist/lib/resolve-env.d.ts.map +1 -0
- package/dist/lib/resolve-env.js +13 -0
- package/dist/lib/resolve-env.js.map +1 -0
- package/dist/lib/table.d.ts +7 -0
- package/dist/lib/table.d.ts.map +1 -0
- package/dist/lib/table.js +16 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoM1D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createConfigStore } from '../../lib/config.js';
|
|
7
|
+
import { resolveOAuthRedirectUri, resolveWebhookUrl } from '../../lib/env-resolver.js';
|
|
8
|
+
import { getNgrokTunnelUrl, isDockerRunning, isK3dRunning, isNgrokInstalled, } from '../../lib/process.js';
|
|
9
|
+
import { SLACK_REQUIRED_SCOPES } from '../../types.js';
|
|
10
|
+
const REQUIRED_SLACK_ENV_VARS = [
|
|
11
|
+
'SLACK_CLIENT_ID',
|
|
12
|
+
'SLACK_CLIENT_SECRET',
|
|
13
|
+
'SLACK_SIGNING_SECRET',
|
|
14
|
+
];
|
|
15
|
+
function loadEnvFile(path) {
|
|
16
|
+
if (!existsSync(path))
|
|
17
|
+
return {};
|
|
18
|
+
const lines = readFileSync(path, 'utf-8').split('\n');
|
|
19
|
+
const env = {};
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
const trimmed = line.trim();
|
|
22
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
23
|
+
continue;
|
|
24
|
+
const eq = trimmed.indexOf('=');
|
|
25
|
+
if (eq === -1)
|
|
26
|
+
continue;
|
|
27
|
+
env[trimmed.slice(0, eq)] = trimmed.slice(eq + 1).replace(/^["']|["']$/g, '');
|
|
28
|
+
}
|
|
29
|
+
return env;
|
|
30
|
+
}
|
|
31
|
+
function updateEnvVar(envPath, key, value) {
|
|
32
|
+
let content = existsSync(envPath) ? readFileSync(envPath, 'utf-8') : '';
|
|
33
|
+
const regex = new RegExp(`^${key}=.*$`, 'm');
|
|
34
|
+
if (regex.test(content)) {
|
|
35
|
+
content = content.replace(regex, `${key}=${value}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
content += `\n${key}=${value}`;
|
|
39
|
+
}
|
|
40
|
+
writeFileSync(envPath, content);
|
|
41
|
+
}
|
|
42
|
+
export function registerDevCommands(program) {
|
|
43
|
+
const dev = program
|
|
44
|
+
.command('dev')
|
|
45
|
+
.description('Local development commands');
|
|
46
|
+
dev
|
|
47
|
+
.command('setup')
|
|
48
|
+
.description('Interactive wizard to set up local Slack development')
|
|
49
|
+
.action(async () => {
|
|
50
|
+
p.intro(chalk.bgBlue.white(' align dev setup '));
|
|
51
|
+
const config = createConfigStore();
|
|
52
|
+
const repoRoot = process.cwd();
|
|
53
|
+
const envPath = join(repoRoot, '.env');
|
|
54
|
+
// 1. Check runtime environment
|
|
55
|
+
const [k3d, docker] = await Promise.all([isK3dRunning(), isDockerRunning()]);
|
|
56
|
+
p.log.info(`Runtime: k3d ${k3d ? chalk.green('running') : chalk.dim('not running')}, docker ${docker ? chalk.green('running') : chalk.dim('not running')}`);
|
|
57
|
+
if (!k3d && !docker) {
|
|
58
|
+
const choice = await p.select({
|
|
59
|
+
message: 'No local stack running. Start with:',
|
|
60
|
+
options: [
|
|
61
|
+
{ value: 'k3d', label: 'k3d + Tilt (recommended)' },
|
|
62
|
+
{ value: 'docker', label: 'Docker Compose (simpler)' },
|
|
63
|
+
{ value: 'skip', label: 'Skip - I will start it manually' },
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
if (p.isCancel(choice)) {
|
|
67
|
+
p.cancel('Cancelled.');
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
if (choice === 'k3d') {
|
|
71
|
+
p.log.step('Run: make k3d-start && tilt up');
|
|
72
|
+
}
|
|
73
|
+
else if (choice === 'docker') {
|
|
74
|
+
p.log.step('Run: make docker-up');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 2. Check .env file
|
|
78
|
+
const envExists = existsSync(envPath);
|
|
79
|
+
if (!envExists) {
|
|
80
|
+
p.log.warn('.env not found. Creating from .env.example...');
|
|
81
|
+
const examplePath = join(repoRoot, '.env.example');
|
|
82
|
+
if (existsSync(examplePath)) {
|
|
83
|
+
const example = readFileSync(examplePath, 'utf-8');
|
|
84
|
+
writeFileSync(envPath, example);
|
|
85
|
+
p.log.success('.env created from .env.example');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
p.log.warn('.env.example not found. Create .env manually.');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const currentEnv = loadEnvFile(envPath);
|
|
92
|
+
const missingVars = REQUIRED_SLACK_ENV_VARS.filter(v => !currentEnv[v] || currentEnv[v] === `your_${v.toLowerCase()}`);
|
|
93
|
+
if (missingVars.length) {
|
|
94
|
+
p.log.warn(`Missing Slack credentials: ${missingVars.join(', ')}`);
|
|
95
|
+
p.note('Get these from https://api.slack.com/apps\nCreate a new app or use an existing one.', 'Slack App Credentials');
|
|
96
|
+
for (const varName of missingVars) {
|
|
97
|
+
const value = await p.text({
|
|
98
|
+
message: `${varName}:`,
|
|
99
|
+
validate: (v) => !v.trim() ? 'Required' : undefined,
|
|
100
|
+
});
|
|
101
|
+
if (p.isCancel(value)) {
|
|
102
|
+
p.cancel('Cancelled.');
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
updateEnvVar(envPath, varName, value);
|
|
106
|
+
}
|
|
107
|
+
p.log.success('Credentials saved to .env');
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
p.log.success('Slack credentials already configured');
|
|
111
|
+
}
|
|
112
|
+
// 3. ngrok setup
|
|
113
|
+
const wantNgrok = await p.confirm({ message: 'Set up ngrok tunnel for OAuth callbacks and webhooks?' });
|
|
114
|
+
if (p.isCancel(wantNgrok)) {
|
|
115
|
+
p.cancel('Cancelled.');
|
|
116
|
+
process.exit(0);
|
|
117
|
+
}
|
|
118
|
+
let ngrokUrl = null;
|
|
119
|
+
if (wantNgrok) {
|
|
120
|
+
const ngrokInstalled = await isNgrokInstalled();
|
|
121
|
+
if (!ngrokInstalled) {
|
|
122
|
+
p.log.warn('ngrok is not installed. Install: https://ngrok.com/download');
|
|
123
|
+
p.note('After installing ngrok, run: align dev setup again', 'Next step');
|
|
124
|
+
process.exit(0);
|
|
125
|
+
}
|
|
126
|
+
// Check if ngrok is already running
|
|
127
|
+
ngrokUrl = await getNgrokTunnelUrl();
|
|
128
|
+
if (ngrokUrl) {
|
|
129
|
+
p.log.success(`ngrok already running: ${ngrokUrl}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
p.log.step('Starting ngrok tunnel on port 8080...');
|
|
133
|
+
// Start ngrok in background
|
|
134
|
+
const ngrokProc = execa('ngrok', ['http', '8080'], { detached: true, stdio: 'ignore' });
|
|
135
|
+
ngrokProc.unref();
|
|
136
|
+
const spinner = p.spinner();
|
|
137
|
+
spinner.start('Waiting for ngrok tunnel...');
|
|
138
|
+
for (let i = 0; i < 15; i++) {
|
|
139
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
140
|
+
ngrokUrl = await getNgrokTunnelUrl();
|
|
141
|
+
if (ngrokUrl)
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
spinner.stop(ngrokUrl ? `Tunnel started: ${ngrokUrl}` : 'Could not get ngrok URL');
|
|
145
|
+
}
|
|
146
|
+
if (ngrokUrl) {
|
|
147
|
+
config.setNgrokUrl(ngrokUrl);
|
|
148
|
+
updateEnvVar(envPath, 'SLACK_REDIRECT_URI', `${ngrokUrl}/oauth/callback/slack`);
|
|
149
|
+
p.log.success('.env updated with ngrok URL');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const localEnv = config.getEnvironment('local');
|
|
153
|
+
if (ngrokUrl)
|
|
154
|
+
localEnv.ngrokUrl = ngrokUrl;
|
|
155
|
+
// 4. Print Slack app configuration instructions
|
|
156
|
+
const redirectUri = resolveOAuthRedirectUri('slack', localEnv);
|
|
157
|
+
const webhookUrl = resolveWebhookUrl('slack', localEnv);
|
|
158
|
+
p.note([
|
|
159
|
+
`${chalk.bold('OAuth Redirect URL')} (add to Slack app):`,
|
|
160
|
+
` ${chalk.cyan(redirectUri)}`,
|
|
161
|
+
'',
|
|
162
|
+
`${chalk.bold('Events API Request URL')} (add to Slack app):`,
|
|
163
|
+
` ${chalk.cyan(webhookUrl)}`,
|
|
164
|
+
'',
|
|
165
|
+
`${chalk.bold('Required Bot Token Scopes')} (add in Slack app OAuth & Permissions):`,
|
|
166
|
+
SLACK_REQUIRED_SCOPES.map(s => ` ${s}`).join('\n'),
|
|
167
|
+
].join('\n'), 'Configure your Slack app');
|
|
168
|
+
p.outro(chalk.green('Setup complete. Run: tilt up (or make docker-up)'));
|
|
169
|
+
});
|
|
170
|
+
dev
|
|
171
|
+
.command('start')
|
|
172
|
+
.description('Start the local development stack')
|
|
173
|
+
.option('--mode <mode>', 'Stack mode: k3d or docker', 'k3d')
|
|
174
|
+
.option('--minimal', 'Start gateway only (no tilt)')
|
|
175
|
+
.action(async (opts) => {
|
|
176
|
+
if (opts.mode === 'docker') {
|
|
177
|
+
console.log(chalk.dim('Starting Docker Compose stack...'));
|
|
178
|
+
await execa('make', ['docker-up'], { stdout: process.stdout, stderr: process.stderr });
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
if (!opts.minimal) {
|
|
182
|
+
console.log(chalk.dim('Starting k3d cluster...'));
|
|
183
|
+
await execa('make', ['k3d-start'], { stdout: process.stdout, stderr: process.stderr });
|
|
184
|
+
}
|
|
185
|
+
console.log(chalk.dim('Starting Tilt...'));
|
|
186
|
+
await execa('tilt', ['up'], { stdout: process.stdout, stderr: process.stderr });
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
dev
|
|
190
|
+
.command('stop')
|
|
191
|
+
.description('Stop the local development stack')
|
|
192
|
+
.option('--mode <mode>', 'Stack mode: k3d or docker', 'k3d')
|
|
193
|
+
.action(async (opts) => {
|
|
194
|
+
if (opts.mode === 'docker') {
|
|
195
|
+
await execa('make', ['docker-down'], { stdout: process.stdout, stderr: process.stderr });
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
await execa('tilt', ['down'], { stdout: process.stdout, stderr: process.stderr });
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
dev
|
|
202
|
+
.command('status')
|
|
203
|
+
.description('Show health of local services')
|
|
204
|
+
.action(async () => {
|
|
205
|
+
const endpoints = [
|
|
206
|
+
{ name: 'Gateway', url: 'http://localhost:8080/health' },
|
|
207
|
+
{ name: 'Brain', url: 'http://localhost:8090/health' },
|
|
208
|
+
{ name: 'Slack connector', url: 'http://localhost:8081/health' },
|
|
209
|
+
{ name: 'Jira connector', url: 'http://localhost:8083/health' },
|
|
210
|
+
{ name: 'GitHub connector', url: 'http://localhost:8085/health' },
|
|
211
|
+
];
|
|
212
|
+
console.log(chalk.bold('\nLocal service health:\n'));
|
|
213
|
+
await Promise.all(endpoints.map(async (ep) => {
|
|
214
|
+
try {
|
|
215
|
+
const res = await fetch(ep.url, { signal: AbortSignal.timeout(2000) });
|
|
216
|
+
const ok = res.ok;
|
|
217
|
+
console.log(` ${ok ? chalk.green('UP') : chalk.red('DOWN')} ${ep.name.padEnd(20)} ${chalk.dim(ep.url)}`);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
console.log(` ${chalk.dim('N/A')} ${ep.name.padEnd(20)} ${chalk.dim(ep.url)}`);
|
|
221
|
+
}
|
|
222
|
+
}));
|
|
223
|
+
console.log('');
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dev/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,uBAAuB,GAAG;IAC9B,iBAAiB;IACjB,qBAAqB;IACrB,sBAAsB;CACvB,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,GAAW,EAAE,KAAa;IAC/D,IAAI,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IACjC,CAAC;IACD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEvC,+BAA+B;QAC/B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAE7E,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE5J,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;gBAC5B,OAAO,EAAE,qCAAqC;gBAC9C,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE;oBACnD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE;oBACtD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,iCAAiC,EAAE;iBAC5D;aACF,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YACpE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACnD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACnD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAEzH,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,IAAI,CACJ,qFAAqF,EACrF,uBAAuB,CACxB,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;oBACzB,OAAO,EAAE,GAAG,OAAO,GAAG;oBACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;iBACpD,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACnE,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAe,CAAC,CAAC;YAClD,CAAC;YACD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACxD,CAAC;QAED,iBAAiB;QACjB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAC;QACxG,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAEvE,IAAI,QAAQ,GAAkB,IAAI,CAAC;QAEnC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,cAAc,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAChD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBAC1E,CAAC,CAAC,IAAI,CAAC,oDAAoD,EAAE,WAAW,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,oCAAoC;YACpC,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,IAAI,QAAQ,EAAE,CAAC;gBACb,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACpD,4BAA4B;gBAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxF,SAAS,CAAC,KAAK,EAAE,CAAC;gBAElB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC5C,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;oBACrC,IAAI,QAAQ;wBAAE,MAAM;gBACtB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;YACrF,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC7B,YAAY,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,QAAQ,uBAAuB,CAAC,CAAC;gBAChF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE3C,gDAAgD;QAChD,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExD,CAAC,CAAC,IAAI,CACJ;YACE,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,sBAAsB;YACzD,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC9B,EAAE;YACF,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,sBAAsB;YAC7D,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC7B,EAAE;YACF,GAAG,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,0CAA0C;YACpF,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACpD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,0BAA0B,CAC3B,CAAC;QAEF,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,KAAK,CAAC;SAC3D,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAAwC,EAAE,EAAE;QACzD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBAClD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,KAAK,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,GAAG;YAChB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,8BAA8B,EAAE;YACxD,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,8BAA8B,EAAE;YACtD,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,8BAA8B,EAAE;YAChE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,8BAA8B,EAAE;YAC/D,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,8BAA8B,EAAE;SAClE,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAErD,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvE,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC3D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { resolveEnv } from '../lib/resolve-env.js';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { createConfigStore } from '../lib/config.js';
|
|
5
|
+
import { createGatewayClient } from '../lib/gateway-client.js';
|
|
6
|
+
import { renderTable } from '../lib/table.js';
|
|
7
|
+
const SEVERITY_COLOR = {
|
|
8
|
+
critical: chalk.bgRed.white,
|
|
9
|
+
major: chalk.red,
|
|
10
|
+
moderate: chalk.yellow,
|
|
11
|
+
minor: chalk.dim,
|
|
12
|
+
none: chalk.dim,
|
|
13
|
+
};
|
|
14
|
+
export function registerDriftCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command('drift')
|
|
17
|
+
.description('Show org-wide drift summary (decisions that may be out of date)')
|
|
18
|
+
.option('--env <env>', 'Environment')
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
const client = createGatewayClient(createConfigStore().getEnvironment(resolveEnv(opts.env)));
|
|
21
|
+
const spinner = ora('Fetching drift summary...').start();
|
|
22
|
+
try {
|
|
23
|
+
const summary = await client.getDriftSummary();
|
|
24
|
+
spinner.stop();
|
|
25
|
+
if (!summary.length) {
|
|
26
|
+
console.log(chalk.green('\nNo drift detected.\n'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log(chalk.bold(`\nDrift Summary (${summary.length} decisions)\n`));
|
|
30
|
+
renderTable([
|
|
31
|
+
{ header: 'SEVERITY', width: 12 },
|
|
32
|
+
{ header: 'TITLE', width: 50 },
|
|
33
|
+
{ header: 'SUMMARY', width: 50 },
|
|
34
|
+
{ header: 'CHECKED', width: 20 },
|
|
35
|
+
], summary.map(d => {
|
|
36
|
+
const color = SEVERITY_COLOR[d.drift_severity] ?? chalk.dim;
|
|
37
|
+
return [
|
|
38
|
+
color(d.drift_severity),
|
|
39
|
+
d.title,
|
|
40
|
+
d.drift_summary,
|
|
41
|
+
new Date(d.checked_at).toLocaleDateString(),
|
|
42
|
+
];
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
spinner.fail(chalk.red(err.message));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,cAAc,GAA0C;IAC5D,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;IAC3B,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,QAAQ,EAAE,KAAK,CAAC,MAAM;IACtB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC,GAAG;CAChB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC;YAC3E,WAAW,CACT;gBACE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;gBACjC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC9B,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;gBAChC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;aACjC,EACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACd,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC;gBAC5D,OAAO;oBACL,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;oBACvB,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,aAAa;oBACf,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;iBAC5C,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyBzD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createConfigStore } from '../lib/config.js';
|
|
3
|
+
const VALID_ENVS = ['local', 'preview', 'prod'];
|
|
4
|
+
export function registerEnvCommand(program) {
|
|
5
|
+
const env = program
|
|
6
|
+
.command('env')
|
|
7
|
+
.description('Get or set the default environment (local, preview, prod)');
|
|
8
|
+
env
|
|
9
|
+
.command('set <env>')
|
|
10
|
+
.description('Set the default environment for all commands')
|
|
11
|
+
.action((name) => {
|
|
12
|
+
if (!VALID_ENVS.includes(name)) {
|
|
13
|
+
console.error(chalk.red(`Invalid env "${name}". Must be one of: ${VALID_ENVS.join(', ')}`));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
createConfigStore().setDefaultEnv(name);
|
|
17
|
+
console.log(chalk.green(`Default env set to ${chalk.bold(name)}`));
|
|
18
|
+
console.log(chalk.dim('All commands will now target this environment unless --env is passed.'));
|
|
19
|
+
});
|
|
20
|
+
env
|
|
21
|
+
.command('get')
|
|
22
|
+
.description('Show the current default environment')
|
|
23
|
+
.action(() => {
|
|
24
|
+
const current = createConfigStore().getDefaultEnv();
|
|
25
|
+
console.log(current);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AAEnE,MAAM,UAAU,GAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2DAA2D,CAAC,CAAC;IAE5E,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACvB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAe,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,iBAAiB,EAAE,CAAC,aAAa,CAAC,IAAe,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,aAAa,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confluence.d.ts","sourceRoot":"","sources":["../../../src/commands/import/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAkCxE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { createConfigStore } from '../../lib/config.js';
|
|
3
|
+
import { createGatewayClient } from '../../lib/gateway-client.js';
|
|
4
|
+
import { resolveEnv } from '../../lib/resolve-env.js';
|
|
5
|
+
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
6
|
+
import { fetchConfluenceItems } from '../../lib/fetchers/confluence.js';
|
|
7
|
+
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
8
|
+
export function registerImportConfluenceCommand(importCmd) {
|
|
9
|
+
importCmd
|
|
10
|
+
.command('confluence')
|
|
11
|
+
.description('Import your Confluence pages (Atlassian API token)')
|
|
12
|
+
.requiredOption('--email <email>', 'Your Atlassian account email')
|
|
13
|
+
.requiredOption('--token <token>', 'Atlassian API token (from id.atlassian.com/manage-profile/security/api-tokens)')
|
|
14
|
+
.requiredOption('--domain <domain>', 'Your Confluence domain (e.g. company.atlassian.net)')
|
|
15
|
+
.option('--limit <n>', 'Max pages to import', '50')
|
|
16
|
+
.option('--approve', 'Skip confirmation prompt')
|
|
17
|
+
.option('--env <env>', 'Environment')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
const config = createConfigStore();
|
|
20
|
+
const envName = resolveEnv(opts.env);
|
|
21
|
+
const env = config.getEnvironment(envName);
|
|
22
|
+
const client = createGatewayClient(env);
|
|
23
|
+
p.intro('align import confluence');
|
|
24
|
+
const spinner = p.spinner();
|
|
25
|
+
spinner.start('Fetching your Confluence pages...');
|
|
26
|
+
try {
|
|
27
|
+
const items = await fetchConfluenceItems({
|
|
28
|
+
email: opts.email,
|
|
29
|
+
token: opts.token,
|
|
30
|
+
domain: opts.domain,
|
|
31
|
+
limit: parseInt(opts.limit, 10),
|
|
32
|
+
});
|
|
33
|
+
spinner.stop(`Found ${items.length} pages`);
|
|
34
|
+
await runPersonalImport(items, client, { label: 'Confluence', approve: opts.approve, appUrl: resolveAppUrl(env) });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
spinner.stop('');
|
|
38
|
+
p.log.error(err.message);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=confluence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../src/commands/import/confluence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAWjE,MAAM,UAAU,+BAA+B,CAAC,SAAkB;IAChE,SAAS;SACN,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,oDAAoD,CAAC;SACjE,cAAc,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;SACjE,cAAc,CAAC,iBAAiB,EAAE,gFAAgF,CAAC;SACnH,cAAc,CAAC,mBAAmB,EAAE,qDAAqD,CAAC;SAC1F,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,IAAI,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC;gBACvC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC5C,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/commands/import/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAwDjE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { createConfigStore } from '../../lib/config.js';
|
|
3
|
+
import { createGatewayClient } from '../../lib/gateway-client.js';
|
|
4
|
+
import { resolveEnv } from '../../lib/resolve-env.js';
|
|
5
|
+
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
6
|
+
import { buildCommitUrl, formatCommitAsText, getCommitHistory, getRemoteUrl, isGitRepo } from '../../lib/git.js';
|
|
7
|
+
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
8
|
+
export function registerImportGitCommand(importCmd) {
|
|
9
|
+
importCmd
|
|
10
|
+
.command('git')
|
|
11
|
+
.description('Import local git commit history (no auth required)')
|
|
12
|
+
.option('--limit <n>', 'Max commits to import', '100')
|
|
13
|
+
.option('--from <date>', 'Start date (ISO e.g. 2025-01-01)')
|
|
14
|
+
.option('--to <date>', 'End date (ISO)')
|
|
15
|
+
.option('--branch <name>', 'Branch to scan (default: current)')
|
|
16
|
+
.option('--approve', 'Skip confirmation prompt')
|
|
17
|
+
.option('--env <env>', 'Environment')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
if (!(await isGitRepo())) {
|
|
20
|
+
p.log.error('Not in a git repository. Run from inside your project directory.');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const config = createConfigStore();
|
|
24
|
+
const envName = resolveEnv(opts.env);
|
|
25
|
+
const env = config.getEnvironment(envName);
|
|
26
|
+
const client = createGatewayClient(env);
|
|
27
|
+
p.intro('align import git');
|
|
28
|
+
const spinner = p.spinner();
|
|
29
|
+
spinner.start('Reading git history...');
|
|
30
|
+
const commits = await getCommitHistory({
|
|
31
|
+
limit: parseInt(opts.limit, 10),
|
|
32
|
+
from: opts.from,
|
|
33
|
+
to: opts.to,
|
|
34
|
+
branch: opts.branch,
|
|
35
|
+
});
|
|
36
|
+
const remoteUrl = await getRemoteUrl();
|
|
37
|
+
spinner.stop(`Found ${commits.length} commits worth importing`);
|
|
38
|
+
if (remoteUrl) {
|
|
39
|
+
const remote = remoteUrl.includes('github.com') ? 'GitHub'
|
|
40
|
+
: remoteUrl.includes('gitlab.com') ? 'GitLab' : 'remote';
|
|
41
|
+
p.log.info(`Detected ${remote} remote - commits will have clickable links`);
|
|
42
|
+
}
|
|
43
|
+
const items = commits.map(c => {
|
|
44
|
+
const url = buildCommitUrl(remoteUrl, c.sha);
|
|
45
|
+
return {
|
|
46
|
+
source_url: url,
|
|
47
|
+
platform: 'git',
|
|
48
|
+
raw_text: formatCommitAsText(c, url),
|
|
49
|
+
title: c.subject,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
await runPersonalImport(items, client, {
|
|
53
|
+
label: 'git history',
|
|
54
|
+
approve: opts.approve,
|
|
55
|
+
appUrl: resolveAppUrl(env),
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/commands/import/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/commands/import/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA2BpE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { createConfigStore } from '../../lib/config.js';
|
|
3
|
+
import { createGatewayClient } from '../../lib/gateway-client.js';
|
|
4
|
+
import { resolveEnv } from '../../lib/resolve-env.js';
|
|
5
|
+
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
6
|
+
import { fetchGitHubItems } from '../../lib/fetchers/github.js';
|
|
7
|
+
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
8
|
+
export function registerImportGitHubCommand(importCmd) {
|
|
9
|
+
importCmd
|
|
10
|
+
.command('github')
|
|
11
|
+
.description('Import your GitHub PRs and issues (personal access token)')
|
|
12
|
+
.requiredOption('--token <token>', 'GitHub personal access token (ghp_...)')
|
|
13
|
+
.option('--limit <n>', 'Max items to import', '100')
|
|
14
|
+
.option('--approve', 'Skip confirmation prompt')
|
|
15
|
+
.option('--env <env>', 'Environment')
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
const config = createConfigStore();
|
|
18
|
+
const envName = resolveEnv(opts.env);
|
|
19
|
+
const env = config.getEnvironment(envName);
|
|
20
|
+
const client = createGatewayClient(env);
|
|
21
|
+
p.intro('align import github');
|
|
22
|
+
const spinner = p.spinner();
|
|
23
|
+
spinner.start('Fetching your GitHub PRs and issues...');
|
|
24
|
+
try {
|
|
25
|
+
const items = await fetchGitHubItems({ token: opts.token, limit: parseInt(opts.limit, 10) });
|
|
26
|
+
spinner.stop(`Found ${items.length} items`);
|
|
27
|
+
await runPersonalImport(items, client, { label: 'GitHub', approve: opts.approve, appUrl: resolveAppUrl(env) });
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
spinner.stop('');
|
|
31
|
+
p.log.error(err.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/commands/import/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AASjE,MAAM,UAAU,2BAA2B,CAAC,SAAkB;IAC5D,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,cAAc,CAAC,iBAAiB,EAAE,wCAAwC,CAAC;SAC3E,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,KAAK,CAAC;SACnD,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC5C,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../../src/commands/import/gitlab.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA4BpE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { createConfigStore } from '../../lib/config.js';
|
|
3
|
+
import { createGatewayClient } from '../../lib/gateway-client.js';
|
|
4
|
+
import { resolveEnv } from '../../lib/resolve-env.js';
|
|
5
|
+
import { resolveAppUrl } from '../../lib/env-resolver.js';
|
|
6
|
+
import { fetchGitLabItems } from '../../lib/fetchers/gitlab.js';
|
|
7
|
+
import { runPersonalImport } from '../../lib/personal-import.js';
|
|
8
|
+
export function registerImportGitLabCommand(importCmd) {
|
|
9
|
+
importCmd
|
|
10
|
+
.command('gitlab')
|
|
11
|
+
.description('Import your GitLab merge requests (personal access token)')
|
|
12
|
+
.requiredOption('--token <token>', 'GitLab personal access token (glpat-...)')
|
|
13
|
+
.option('--domain <domain>', 'GitLab domain for self-hosted (default: gitlab.com)')
|
|
14
|
+
.option('--limit <n>', 'Max items to import', '100')
|
|
15
|
+
.option('--approve', 'Skip confirmation prompt')
|
|
16
|
+
.option('--env <env>', 'Environment')
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const config = createConfigStore();
|
|
19
|
+
const envName = resolveEnv(opts.env);
|
|
20
|
+
const env = config.getEnvironment(envName);
|
|
21
|
+
const client = createGatewayClient(env);
|
|
22
|
+
p.intro('align import gitlab');
|
|
23
|
+
const spinner = p.spinner();
|
|
24
|
+
spinner.start('Fetching your GitLab merge requests...');
|
|
25
|
+
try {
|
|
26
|
+
const items = await fetchGitLabItems({ token: opts.token, domain: opts.domain, limit: parseInt(opts.limit, 10) });
|
|
27
|
+
spinner.stop(`Found ${items.length} items`);
|
|
28
|
+
await runPersonalImport(items, client, { label: 'GitLab', approve: opts.approve, appUrl: resolveAppUrl(env) });
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
spinner.stop('');
|
|
32
|
+
p.log.error(err.message);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=gitlab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../../src/commands/import/gitlab.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAUjE,MAAM,UAAU,2BAA2B,CAAC,SAAkB;IAC5D,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,cAAc,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;SAC7E,MAAM,CAAC,mBAAmB,EAAE,qDAAqD,CAAC;SAClF,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,KAAK,CAAC;SACnD,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAExC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAClH,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC5C,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../src/commands/import/jira.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAkClE"}
|