@faros-fde-sandbox/cli 1.0.2 → 1.1.1
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/README.md +6 -0
- package/lib/commands/logs/index.d.ts.map +1 -1
- package/lib/commands/logs/index.js +61 -82
- package/lib/commands/logs/index.js.map +1 -1
- package/lib/commands/sources/index.d.ts.map +1 -1
- package/lib/commands/sources/index.js +38 -12
- package/lib/commands/sources/index.js.map +1 -1
- package/lib/commands/sync/index.d.ts.map +1 -1
- package/lib/commands/sync/index.js +4 -0
- package/lib/commands/sync/index.js.map +1 -1
- package/lib/commands/sync/linear.d.ts +3 -0
- package/lib/commands/sync/linear.d.ts.map +1 -0
- package/lib/commands/sync/linear.js +347 -0
- package/lib/commands/sync/linear.js.map +1 -0
- package/lib/config/loader.d.ts.map +1 -1
- package/lib/config/loader.js +20 -5
- package/lib/config/loader.js.map +1 -1
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -1
- package/lib/lib/api/client.js +1 -1
- package/lib/lib/api/client.js.map +1 -1
- package/lib/lib/logger.d.ts +8 -0
- package/lib/lib/logger.d.ts.map +1 -0
- package/lib/lib/logger.js +73 -0
- package/lib/lib/logger.js.map +1 -0
- package/lib/types/config.d.ts +48 -20
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/config.js +15 -8
- package/lib/types/config.js.map +1 -1
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Faros CLI
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@faros-fde-sandbox/cli)
|
|
4
|
+
|
|
3
5
|
CLI for Faros AI - sync data, manage sources, view logs.
|
|
4
6
|
|
|
5
7
|
## Installation
|
|
@@ -411,6 +413,10 @@ npm test
|
|
|
411
413
|
npm run lint
|
|
412
414
|
```
|
|
413
415
|
|
|
416
|
+
### Publishing
|
|
417
|
+
|
|
418
|
+
See [PUBLISHING.md](PUBLISHING.md) for instructions on publishing new versions to npm.
|
|
419
|
+
|
|
414
420
|
## License
|
|
415
421
|
|
|
416
422
|
Apache-2.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/logs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/logs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6FpC,wBAAgB,WAAW,IAAI,OAAO,CA0BrC"}
|
|
@@ -40,113 +40,92 @@ exports.logsCommand = logsCommand;
|
|
|
40
40
|
const commander_1 = require("commander");
|
|
41
41
|
const chalk_1 = __importDefault(require("chalk"));
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
|
-
const os = __importStar(require("os"));
|
|
45
43
|
const ui_1 = require("../../lib/ui");
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
const logger_1 = require("../../lib/logger");
|
|
45
|
+
// pino numeric levels -> names
|
|
46
|
+
const LEVEL_NAMES = {
|
|
47
|
+
10: 'trace', 20: 'debug', 30: 'info', 40: 'warn', 50: 'error', 60: 'fatal',
|
|
48
|
+
};
|
|
49
|
+
function levelName(level) {
|
|
50
|
+
if (typeof level === 'number')
|
|
51
|
+
return LEVEL_NAMES[level] ?? String(level);
|
|
52
|
+
return String(level);
|
|
48
53
|
}
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return
|
|
54
|
+
function formatLevel(level) {
|
|
55
|
+
switch (level) {
|
|
56
|
+
case 'info': return chalk_1.default.blue('INFO ');
|
|
57
|
+
case 'warn': return chalk_1.default.yellow('WARN ');
|
|
58
|
+
case 'error': return chalk_1.default.red('ERROR');
|
|
59
|
+
case 'fatal': return chalk_1.default.red.bold('FATAL');
|
|
60
|
+
case 'debug': return chalk_1.default.dim('DEBUG');
|
|
61
|
+
case 'trace': return chalk_1.default.dim('TRACE');
|
|
62
|
+
default: return level.toUpperCase().padEnd(5);
|
|
53
63
|
}
|
|
54
|
-
const logFiles = fs.readdirSync(logsDir)
|
|
55
|
-
.filter(f => f.endsWith('.log'))
|
|
56
|
-
.sort()
|
|
57
|
-
.reverse();
|
|
58
|
-
const logs = [];
|
|
59
|
-
for (const file of logFiles.slice(0, 10)) { // Last 10 log files
|
|
60
|
-
const content = fs.readFileSync(path.join(logsDir, file), 'utf-8');
|
|
61
|
-
const lines = content.split('\n').filter(l => l.trim());
|
|
62
|
-
for (const line of lines) {
|
|
63
|
-
try {
|
|
64
|
-
const entry = JSON.parse(line);
|
|
65
|
-
logs.push({
|
|
66
|
-
timestamp: entry.time || entry.timestamp,
|
|
67
|
-
level: entry.level,
|
|
68
|
-
source: entry.source,
|
|
69
|
-
message: entry.msg || entry.message,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Skip invalid lines
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return logs;
|
|
78
64
|
}
|
|
79
|
-
function
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
65
|
+
function readLogFile() {
|
|
66
|
+
if (!fs.existsSync(logger_1.LOG_FILE_PATH))
|
|
67
|
+
return [];
|
|
68
|
+
const lines = fs.readFileSync(logger_1.LOG_FILE_PATH, 'utf-8').split('\n').filter(Boolean);
|
|
69
|
+
const entries = [];
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
try {
|
|
72
|
+
const raw = JSON.parse(line);
|
|
73
|
+
entries.push({
|
|
74
|
+
time: raw.time ?? raw.timestamp ?? '',
|
|
75
|
+
level: levelName(raw.level),
|
|
76
|
+
source: raw.source,
|
|
77
|
+
msg: raw.msg ?? raw.message ?? '',
|
|
78
|
+
...raw,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch { /* skip malformed lines */ }
|
|
92
82
|
}
|
|
83
|
+
return entries;
|
|
93
84
|
}
|
|
94
85
|
async function viewLogs(options) {
|
|
95
|
-
|
|
96
|
-
if (
|
|
86
|
+
let entries = readLogFile();
|
|
87
|
+
if (entries.length === 0) {
|
|
97
88
|
ui_1.ui.log.info('No logs found');
|
|
98
|
-
console.log(chalk_1.default.dim(
|
|
89
|
+
console.log(chalk_1.default.dim(`Log file: ${logger_1.LOG_FILE_PATH}`));
|
|
99
90
|
return;
|
|
100
91
|
}
|
|
101
|
-
// Filter by level
|
|
102
|
-
let filteredLogs = logs;
|
|
103
92
|
if (options.level) {
|
|
104
|
-
|
|
93
|
+
entries = entries.filter(e => e.level === options.level.toLowerCase());
|
|
105
94
|
}
|
|
106
|
-
// Filter by time range
|
|
107
95
|
if (options.since) {
|
|
108
|
-
const
|
|
109
|
-
|
|
96
|
+
const t = new Date(options.since).getTime();
|
|
97
|
+
entries = entries.filter(e => new Date(e.time).getTime() >= t);
|
|
110
98
|
}
|
|
111
99
|
if (options.until) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
// Output to file if requested
|
|
116
|
-
if (options.outFile) {
|
|
117
|
-
fs.writeFileSync(options.outFile, JSON.stringify(filteredLogs, null, 2));
|
|
118
|
-
ui_1.ui.log.success(`Exported ${filteredLogs.length} log entries to ${options.outFile}`);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
// Display logs
|
|
122
|
-
console.log(chalk_1.default.bold(`\nRecent Logs (${filteredLogs.length} entries):\n`));
|
|
123
|
-
const displayLogs = filteredLogs.slice(0, 100); // Limit to 100 for display
|
|
124
|
-
for (const log of displayLogs) {
|
|
125
|
-
const timestamp = new Date(log.timestamp).toLocaleString();
|
|
126
|
-
const level = formatLogLevel(log.level);
|
|
127
|
-
const source = log.source ? chalk_1.default.cyan(`[${log.source}]`) : '';
|
|
128
|
-
console.log(`${chalk_1.default.dim(timestamp)} ${level} ${source} ${log.message}`);
|
|
100
|
+
const t = new Date(options.until).getTime();
|
|
101
|
+
entries = entries.filter(e => new Date(e.time).getTime() <= t);
|
|
129
102
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
103
|
+
// Tail: show last N entries (default 50)
|
|
104
|
+
const tail = parseInt(options.tail, 10) || 50;
|
|
105
|
+
entries = entries.slice(-tail);
|
|
106
|
+
console.log(chalk_1.default.bold(`\nLogs (${entries.length} entries) — ${logger_1.LOG_FILE_PATH}\n`));
|
|
107
|
+
for (const e of entries) {
|
|
108
|
+
const ts = chalk_1.default.dim(e.time);
|
|
109
|
+
const lvl = formatLevel(e.level);
|
|
110
|
+
const src = e.source ? chalk_1.default.cyan(`[${e.source}]`) + ' ' : '';
|
|
111
|
+
console.log(`${ts} ${lvl} ${src}${e.msg}`);
|
|
133
112
|
}
|
|
113
|
+
console.log();
|
|
134
114
|
}
|
|
135
115
|
function logsCommand() {
|
|
136
116
|
const cmd = new commander_1.Command('logs');
|
|
137
117
|
cmd
|
|
138
|
-
.description('View
|
|
139
|
-
.option('--level <level>', 'Filter by
|
|
140
|
-
.option('--since <time>', 'Show
|
|
141
|
-
.option('--until <time>', 'Show
|
|
142
|
-
.option('--
|
|
143
|
-
.option('--follow', 'Follow logs in real-time (not yet implemented)')
|
|
118
|
+
.description('View faros.log in the current directory')
|
|
119
|
+
.option('--level <level>', 'Filter by level (debug, info, warn, error)')
|
|
120
|
+
.option('--since <time>', 'Show entries since (ISO-8601)')
|
|
121
|
+
.option('--until <time>', 'Show entries until (ISO-8601)')
|
|
122
|
+
.option('--tail <n>', 'Show last N entries', '50')
|
|
144
123
|
.addHelpText('after', `
|
|
145
124
|
Examples:
|
|
146
125
|
$ faros logs
|
|
147
126
|
$ faros logs --level error
|
|
148
|
-
$ faros logs --
|
|
149
|
-
$ faros logs --
|
|
127
|
+
$ faros logs --tail 20
|
|
128
|
+
$ faros logs --since "2025-01-01"
|
|
150
129
|
`)
|
|
151
130
|
.action(async (options) => {
|
|
152
131
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/logs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/logs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiGpC,wBAAgB,cAAc,IAAI,OAAO,CAwCxC"}
|
|
@@ -8,8 +8,23 @@ const commander_1 = require("commander");
|
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
const loader_1 = require("../../config/loader");
|
|
10
10
|
const ui_1 = require("../../lib/ui");
|
|
11
|
+
// Map source names to the env var that provides their credential
|
|
12
|
+
const SOURCE_CREDENTIAL_ENV = {
|
|
13
|
+
linear: 'LINEAR_API_KEY',
|
|
14
|
+
github: 'GITHUB_TOKEN',
|
|
15
|
+
};
|
|
16
|
+
function hasCredential(sourceName) {
|
|
17
|
+
const envVar = SOURCE_CREDENTIAL_ENV[sourceName];
|
|
18
|
+
return envVar ? !!process.env[envVar] : false;
|
|
19
|
+
}
|
|
20
|
+
function maskCredential(value) {
|
|
21
|
+
if (value.length <= 6)
|
|
22
|
+
return '***';
|
|
23
|
+
return `${value.substring(0, 6)}***`;
|
|
24
|
+
}
|
|
11
25
|
async function listSources() {
|
|
12
|
-
const
|
|
26
|
+
const fileConfig = await (0, loader_1.loadConfig)();
|
|
27
|
+
const config = (0, loader_1.mergeConfig)(fileConfig, {});
|
|
13
28
|
if (!config || !config.sources || Object.keys(config.sources).length === 0) {
|
|
14
29
|
ui_1.ui.log.info('No sources configured');
|
|
15
30
|
console.log();
|
|
@@ -18,24 +33,30 @@ async function listSources() {
|
|
|
18
33
|
return;
|
|
19
34
|
}
|
|
20
35
|
console.log(chalk_1.default.bold('\nConfigured Sources:\n'));
|
|
21
|
-
const table = ui_1.ui.table(['Source', 'Type', '
|
|
36
|
+
const table = ui_1.ui.table(['Source', 'Type', 'Credentials', 'Status']);
|
|
22
37
|
for (const [name, sourceConfig] of Object.entries(config.sources)) {
|
|
23
38
|
const type = sourceConfig.type || 'Unknown';
|
|
24
|
-
const
|
|
25
|
-
const
|
|
39
|
+
const envVar = SOURCE_CREDENTIAL_ENV[name];
|
|
40
|
+
const hasCred = hasCredential(name);
|
|
41
|
+
const credIcon = hasCred ? ui_1.ui.success : chalk_1.default.yellow('⚠');
|
|
42
|
+
const status = hasCred
|
|
43
|
+
? `${envVar} set`
|
|
44
|
+
: envVar ? `Set ${envVar} in .env` : 'N/A';
|
|
26
45
|
table.push([
|
|
27
46
|
name,
|
|
28
47
|
type,
|
|
29
|
-
|
|
30
|
-
status
|
|
48
|
+
credIcon,
|
|
49
|
+
status,
|
|
31
50
|
]);
|
|
32
51
|
}
|
|
33
52
|
console.log(table.toString());
|
|
34
53
|
console.log();
|
|
54
|
+
console.log(chalk_1.default.dim('Credentials are read from environment variables / .env file'));
|
|
35
55
|
console.log(chalk_1.default.dim('Run \'faros sources get <name>\' for details'));
|
|
36
56
|
}
|
|
37
57
|
async function getSource(name) {
|
|
38
|
-
const
|
|
58
|
+
const fileConfig = await (0, loader_1.loadConfig)();
|
|
59
|
+
const config = (0, loader_1.mergeConfig)(fileConfig, {});
|
|
39
60
|
if (!config || !config.sources || !config.sources[name]) {
|
|
40
61
|
ui_1.ui.log.error(`Source '${name}' not found`);
|
|
41
62
|
console.log(chalk_1.default.dim('Run \'faros sources list\' to see all sources'));
|
|
@@ -44,11 +65,16 @@ async function getSource(name) {
|
|
|
44
65
|
const source = config.sources[name];
|
|
45
66
|
console.log(chalk_1.default.bold(`\nSource: ${name}\n`));
|
|
46
67
|
console.log(`Type: ${source.type || 'Unknown'}`);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
// Show credential status from env vars
|
|
69
|
+
const envVar = SOURCE_CREDENTIAL_ENV[name];
|
|
70
|
+
if (envVar) {
|
|
71
|
+
const value = process.env[envVar];
|
|
72
|
+
if (value) {
|
|
73
|
+
console.log(`Credential: ${envVar} = ${maskCredential(value)}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(chalk_1.default.yellow(`Credential: ${envVar} not set (add to .env file)`));
|
|
77
|
+
}
|
|
52
78
|
}
|
|
53
79
|
if (source.syncInterval) {
|
|
54
80
|
console.log(`Sync Interval: ${source.syncInterval}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sources/index.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sources/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,IAAI,OAAO,CAuBrC"}
|
|
@@ -4,6 +4,7 @@ exports.syncCommand = syncCommand;
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const tests_1 = require("./tests");
|
|
6
6
|
const ci_cd_1 = require("./ci-cd");
|
|
7
|
+
const linear_1 = require("./linear");
|
|
7
8
|
function syncCommand() {
|
|
8
9
|
const cmd = new commander_1.Command('sync');
|
|
9
10
|
cmd
|
|
@@ -12,14 +13,17 @@ function syncCommand() {
|
|
|
12
13
|
Available Sources:
|
|
13
14
|
tests Sync test results (JUnit/TestNG/xUnit/Cucumber/Mocha)
|
|
14
15
|
ci-cd Sync CI/CD events (builds and deployments)
|
|
16
|
+
linear Sync Linear data (issues, projects, teams, users, comments)
|
|
15
17
|
|
|
16
18
|
Examples:
|
|
17
19
|
$ faros sync tests test-results/*.xml --source "Jenkins"
|
|
18
20
|
$ faros sync ci-cd build --status Success --commit "GitHub://org/repo/abc"
|
|
21
|
+
$ faros sync linear --streams issues,projects
|
|
19
22
|
`);
|
|
20
23
|
// Register subcommands
|
|
21
24
|
cmd.addCommand((0, tests_1.syncTestsCommand)());
|
|
22
25
|
cmd.addCommand((0, ci_cd_1.syncCICDCommand)());
|
|
26
|
+
cmd.addCommand((0, linear_1.syncLinearCommand)());
|
|
23
27
|
return cmd;
|
|
24
28
|
}
|
|
25
29
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":";;AAKA,kCAuBC;AA5BD,yCAAoC;AACpC,mCAA2C;AAC3C,mCAA0C;AAC1C,qCAA6C;AAE7C,SAAgB,WAAW;IACzB,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,yCAAyC,CAAC;SACtD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;KAUrB,CAAC,CAAC;IAEL,uBAAuB;IACvB,GAAG,CAAC,UAAU,CAAC,IAAA,wBAAgB,GAAE,CAAC,CAAC;IACnC,GAAG,CAAC,UAAU,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAC;IAClC,GAAG,CAAC,UAAU,CAAC,IAAA,0BAAiB,GAAE,CAAC,CAAC;IAEpC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/linear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8RpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4E3C"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.syncLinearCommand = syncLinearCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const loader_1 = require("../../config/loader");
|
|
47
|
+
const ui_1 = require("../../lib/ui");
|
|
48
|
+
const logger_1 = require("../../lib/logger");
|
|
49
|
+
// Default Docker images
|
|
50
|
+
const DEFAULT_LINEAR_SRC_IMAGE = 'farosai/airbyte-linear-source';
|
|
51
|
+
const DEFAULT_FAROS_DST_IMAGE = 'farosai/airbyte-faros-destination';
|
|
52
|
+
// All available Linear streams
|
|
53
|
+
const ALL_LINEAR_STREAMS = ['teams', 'users', 'projects', 'issues', 'comments'];
|
|
54
|
+
function buildLinearSourceConfig(config, options) {
|
|
55
|
+
const sourceEntry = config.sources?.linear;
|
|
56
|
+
const apiKey = options.linearApiKey || process.env.LINEAR_API_KEY;
|
|
57
|
+
if (!apiKey) {
|
|
58
|
+
throw new Error('Linear API key is required. Provide via --linear-api-key flag or LINEAR_API_KEY env var (in .env file or environment)');
|
|
59
|
+
}
|
|
60
|
+
const srcConfig = { api_key: apiKey };
|
|
61
|
+
const cutoffDays = options.cutoffDays ?? sourceEntry?.cutoffDays;
|
|
62
|
+
if (cutoffDays !== undefined)
|
|
63
|
+
srcConfig.cutoff_days = cutoffDays;
|
|
64
|
+
const startDate = options.startDate ?? sourceEntry?.startDate;
|
|
65
|
+
if (startDate)
|
|
66
|
+
srcConfig.start_date = startDate;
|
|
67
|
+
const endDate = options.endDate ?? sourceEntry?.endDate;
|
|
68
|
+
if (endDate)
|
|
69
|
+
srcConfig.end_date = endDate;
|
|
70
|
+
return srcConfig;
|
|
71
|
+
}
|
|
72
|
+
function buildFarosDestinationConfig(config, options) {
|
|
73
|
+
const targetGraph = options.dryRun ? (0, loader_1.getStagingGraph)(config) : config.graph;
|
|
74
|
+
const farosApiKey = config.apiKey;
|
|
75
|
+
if (!farosApiKey) {
|
|
76
|
+
throw new Error('Faros API key is required. Set via --api-key flag or FAROS_API_KEY env var (in .env file or environment)');
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
edition_configs: {
|
|
80
|
+
edition: 'cloud',
|
|
81
|
+
api_key: farosApiKey,
|
|
82
|
+
api_url: config.url,
|
|
83
|
+
graph: targetGraph,
|
|
84
|
+
},
|
|
85
|
+
origin: config.origin,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function resolveAirbyteLocalBin() {
|
|
89
|
+
const localPaths = [
|
|
90
|
+
path.resolve(__dirname, '../../../../airbyte-local-cli/airbyte-local-cli-nodejs/lib/index.js'),
|
|
91
|
+
path.resolve(__dirname, '../../../../../airbyte-local-cli/airbyte-local-cli-nodejs/lib/index.js'),
|
|
92
|
+
];
|
|
93
|
+
for (const p of localPaths) {
|
|
94
|
+
if (fs.existsSync(p)) {
|
|
95
|
+
return { command: process.execPath, args: [p] };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const whichCmd = process.platform === 'win32' ? 'where' : 'which';
|
|
99
|
+
try {
|
|
100
|
+
const { execSync } = require('child_process');
|
|
101
|
+
execSync(`${whichCmd} airbyte-local`, { stdio: 'pipe' });
|
|
102
|
+
return { command: 'airbyte-local', args: [] };
|
|
103
|
+
}
|
|
104
|
+
catch { /* not on PATH */ }
|
|
105
|
+
return { command: 'npx', args: ['airbyte-local'] };
|
|
106
|
+
}
|
|
107
|
+
async function syncLinear(options) {
|
|
108
|
+
const log = (0, logger_1.getLogger)().child({ source: 'sync-linear' });
|
|
109
|
+
// Load and merge config
|
|
110
|
+
const fileConfig = await (0, loader_1.loadConfig)();
|
|
111
|
+
const config = (0, loader_1.mergeConfig)(fileConfig, options);
|
|
112
|
+
log.info('Config loaded');
|
|
113
|
+
const sourceEntry = config.sources?.linear;
|
|
114
|
+
if (!sourceEntry && !options.linearApiKey && !process.env.LINEAR_API_KEY) {
|
|
115
|
+
throw new Error('No Linear source configuration found. Add a "linear" entry under "sources" in faros.config.yaml, ' +
|
|
116
|
+
'or provide --linear-api-key');
|
|
117
|
+
}
|
|
118
|
+
// Resolve images
|
|
119
|
+
const srcImage = options.srcImage ?? sourceEntry?.srcImage ?? DEFAULT_LINEAR_SRC_IMAGE;
|
|
120
|
+
const dstImage = options.dstImage ?? sourceEntry?.dstImage ?? DEFAULT_FAROS_DST_IMAGE;
|
|
121
|
+
// Build airbyte-local config
|
|
122
|
+
const srcConfig = buildLinearSourceConfig(config, options);
|
|
123
|
+
const dstConfig = buildFarosDestinationConfig(config, options);
|
|
124
|
+
const airbyteConfig = {
|
|
125
|
+
src: { image: srcImage, config: srcConfig },
|
|
126
|
+
dst: { image: dstImage, config: dstConfig },
|
|
127
|
+
};
|
|
128
|
+
const targetGraph = options.dryRun ? (0, loader_1.getStagingGraph)(config) : config.graph;
|
|
129
|
+
// Resolve streams
|
|
130
|
+
const requestedStreams = options.streams
|
|
131
|
+
? options.streams.split(',').map(s => s.trim())
|
|
132
|
+
: sourceEntry?.streams ?? ALL_LINEAR_STREAMS;
|
|
133
|
+
const invalidStreams = requestedStreams.filter(s => !ALL_LINEAR_STREAMS.includes(s));
|
|
134
|
+
if (invalidStreams.length > 0) {
|
|
135
|
+
throw new Error(`Invalid stream(s): ${invalidStreams.join(', ')}. Valid streams: ${ALL_LINEAR_STREAMS.join(', ')}`);
|
|
136
|
+
}
|
|
137
|
+
const mode = options.fullRefresh ? 'full_refresh' : 'incremental';
|
|
138
|
+
const connName = options.connectionName ?? sourceEntry?.connectionName ?? 'mylinearsrc';
|
|
139
|
+
log.info({
|
|
140
|
+
srcImage, dstImage, graph: targetGraph, origin: config.origin,
|
|
141
|
+
streams: requestedStreams, mode, connectionName: connName,
|
|
142
|
+
dryRun: !!options.dryRun,
|
|
143
|
+
}, 'Sync plan resolved');
|
|
144
|
+
// Display sync plan to console
|
|
145
|
+
console.log();
|
|
146
|
+
console.log(chalk_1.default.bold('Linear Sync Configuration'));
|
|
147
|
+
console.log(chalk_1.default.dim('─'.repeat(40)));
|
|
148
|
+
console.log(` Source: ${chalk_1.default.cyan(srcImage)}`);
|
|
149
|
+
console.log(` Destination: ${chalk_1.default.cyan(dstImage)}`);
|
|
150
|
+
console.log(` Graph: ${chalk_1.default.cyan(targetGraph)}`);
|
|
151
|
+
console.log(` Origin: ${chalk_1.default.cyan(config.origin)}`);
|
|
152
|
+
console.log(` Streams: ${chalk_1.default.cyan(requestedStreams.join(', '))}`);
|
|
153
|
+
if (options.fullRefresh) {
|
|
154
|
+
console.log(` Mode: ${chalk_1.default.yellow('full_refresh (overwrite)')}`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(` Mode: ${chalk_1.default.green('incremental')}`);
|
|
158
|
+
}
|
|
159
|
+
if (options.dryRun) {
|
|
160
|
+
console.log();
|
|
161
|
+
ui_1.ui.log.warning(`Dry-run mode: syncing to staging graph '${targetGraph}'`);
|
|
162
|
+
}
|
|
163
|
+
console.log(chalk_1.default.dim('─'.repeat(40)));
|
|
164
|
+
console.log();
|
|
165
|
+
// Write config to temp file
|
|
166
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'faros-linear-'));
|
|
167
|
+
const configFilePath = path.join(tmpDir, 'airbyte_config.json');
|
|
168
|
+
try {
|
|
169
|
+
fs.writeFileSync(configFilePath, JSON.stringify(airbyteConfig, null, 2));
|
|
170
|
+
log.debug({ configFilePath }, 'Wrote airbyte config to temp file');
|
|
171
|
+
// Build airbyte-local CLI arguments
|
|
172
|
+
const cliArgs = ['--config-file', configFilePath];
|
|
173
|
+
if (options.fullRefresh)
|
|
174
|
+
cliArgs.push('--full-refresh');
|
|
175
|
+
if (options.checkConnection)
|
|
176
|
+
cliArgs.push('--src-check-connection');
|
|
177
|
+
cliArgs.push('--connection-name', connName);
|
|
178
|
+
if (options.stateFile)
|
|
179
|
+
cliArgs.push('--state-file', options.stateFile);
|
|
180
|
+
if (options.keepContainers)
|
|
181
|
+
cliArgs.push('--keep-containers');
|
|
182
|
+
const logLevel = options.logLevel ?? (options.debug ? 'debug' : config.logs?.level ?? 'info');
|
|
183
|
+
cliArgs.push('--log-level', logLevel);
|
|
184
|
+
if (options.rawMessages)
|
|
185
|
+
cliArgs.push('--raw-messages');
|
|
186
|
+
if (options.noSrcPull)
|
|
187
|
+
cliArgs.push('--no-src-pull');
|
|
188
|
+
if (options.noDstPull)
|
|
189
|
+
cliArgs.push('--no-dst-pull');
|
|
190
|
+
if (options.debug)
|
|
191
|
+
cliArgs.push('--debug');
|
|
192
|
+
// Resolve airbyte-local binary
|
|
193
|
+
const bin = resolveAirbyteLocalBin();
|
|
194
|
+
const fullArgs = [...bin.args, ...cliArgs];
|
|
195
|
+
log.info({ command: bin.command, args: fullArgs }, 'Spawning airbyte-local');
|
|
196
|
+
if (options.debug) {
|
|
197
|
+
console.log(chalk_1.default.dim(` Config file: ${configFilePath}`));
|
|
198
|
+
console.log(chalk_1.default.dim(` Command: ${bin.command} ${fullArgs.join(' ')}`));
|
|
199
|
+
console.log();
|
|
200
|
+
}
|
|
201
|
+
const spinner = ui_1.ui.spinner('Starting Linear sync via airbyte-local...');
|
|
202
|
+
spinner.start();
|
|
203
|
+
const startTime = Date.now();
|
|
204
|
+
// Spawn airbyte-local
|
|
205
|
+
const exitCode = await new Promise((resolve, reject) => {
|
|
206
|
+
const child = (0, child_process_1.spawn)(bin.command, fullArgs, {
|
|
207
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
208
|
+
env: { ...process.env },
|
|
209
|
+
});
|
|
210
|
+
let started = false;
|
|
211
|
+
child.stdout?.on('data', (data) => {
|
|
212
|
+
if (!started) {
|
|
213
|
+
started = true;
|
|
214
|
+
spinner.succeed('Linear sync started');
|
|
215
|
+
console.log();
|
|
216
|
+
}
|
|
217
|
+
process.stdout.write(data);
|
|
218
|
+
});
|
|
219
|
+
child.stderr?.on('data', (data) => {
|
|
220
|
+
if (!started) {
|
|
221
|
+
started = true;
|
|
222
|
+
spinner.succeed('Linear sync started');
|
|
223
|
+
console.log();
|
|
224
|
+
}
|
|
225
|
+
process.stderr.write(data);
|
|
226
|
+
});
|
|
227
|
+
child.on('error', (err) => {
|
|
228
|
+
spinner.fail('Failed to start airbyte-local');
|
|
229
|
+
if (err.message.includes('ENOENT')) {
|
|
230
|
+
reject(new Error(`Could not find 'airbyte-local' command. Please install it:\n` +
|
|
231
|
+
` npm install -g airbyte-local-cli\n` +
|
|
232
|
+
`Or ensure it is on your PATH.`));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
reject(err);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
child.on('close', (code) => {
|
|
239
|
+
if (!started) {
|
|
240
|
+
if (code === 0) {
|
|
241
|
+
spinner.succeed('Linear sync completed');
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
spinner.fail('Linear sync failed');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
resolve(code ?? 1);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
const durationMs = Date.now() - startTime;
|
|
251
|
+
if (exitCode !== 0) {
|
|
252
|
+
log.error({ exitCode, durationMs }, 'Sync failed');
|
|
253
|
+
throw new Error(`airbyte-local exited with code ${exitCode}`);
|
|
254
|
+
}
|
|
255
|
+
log.info({ durationMs }, 'Sync completed successfully');
|
|
256
|
+
console.log();
|
|
257
|
+
ui_1.ui.log.success(`Linear sync completed${options.dryRun ? ' (dry-run to staging graph)' : ''}`);
|
|
258
|
+
if (options.dryRun) {
|
|
259
|
+
console.log(chalk_1.default.dim(` Graph: ${targetGraph}`));
|
|
260
|
+
console.log(chalk_1.default.dim(' Run without --dry-run to sync to production'));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
try {
|
|
265
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
266
|
+
}
|
|
267
|
+
catch { /* ignore */ }
|
|
268
|
+
log.debug('Cleaned up temp dir');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function syncLinearCommand() {
|
|
272
|
+
const cmd = new commander_1.Command('linear');
|
|
273
|
+
cmd
|
|
274
|
+
.description('Sync Linear data (issues, projects, teams, users, comments) to Faros via airbyte-connectors')
|
|
275
|
+
.option('--linear-api-key <key>', 'Linear API key (or set LINEAR_API_KEY env var)')
|
|
276
|
+
.option('--cutoff-days <days>', 'Only fetch data updated in the last N days', parseInt)
|
|
277
|
+
.option('--start-date <date>', 'Start date (ISO 8601: YYYY-MM-DD)')
|
|
278
|
+
.option('--end-date <date>', 'End date (ISO 8601: YYYY-MM-DD)')
|
|
279
|
+
.option('--streams <streams>', `Comma-separated streams (${ALL_LINEAR_STREAMS.join(',')})`)
|
|
280
|
+
.option('--full-refresh', 'Force full_refresh + overwrite mode (ignore saved state)')
|
|
281
|
+
.option('--connection-name <name>', 'Connection name for state tracking', 'mylinearsrc')
|
|
282
|
+
.option('--state-file <path>', 'Path to state file for incremental sync')
|
|
283
|
+
.option('--check-connection', 'Validate source connection before syncing')
|
|
284
|
+
.option('--src-image <image>', 'Override Linear source Docker image')
|
|
285
|
+
.option('--dst-image <image>', 'Override Faros destination Docker image')
|
|
286
|
+
.option('--keep-containers', 'Do not remove Docker containers after exit')
|
|
287
|
+
.option('--log-level <level>', 'Log level for connectors (debug, info, warn, error)')
|
|
288
|
+
.option('--raw-messages', 'Output raw Airbyte messages')
|
|
289
|
+
.option('--no-src-pull', 'Skip pulling the source Docker image')
|
|
290
|
+
.option('--no-dst-pull', 'Skip pulling the destination Docker image')
|
|
291
|
+
.option('--dry-run', 'Sync to staging graph for verification')
|
|
292
|
+
.addHelpText('after', `
|
|
293
|
+
Credentials (.env file or environment variables):
|
|
294
|
+
LINEAR_API_KEY Linear API key (or --linear-api-key flag)
|
|
295
|
+
FAROS_API_KEY Faros API key (or --api-key flag)
|
|
296
|
+
|
|
297
|
+
Other Environment Variables:
|
|
298
|
+
FAROS_URL Faros API URL
|
|
299
|
+
FAROS_GRAPH Target Faros graph
|
|
300
|
+
|
|
301
|
+
Config File (faros.config.yaml -- non-sensitive settings only):
|
|
302
|
+
sources:
|
|
303
|
+
linear:
|
|
304
|
+
type: Linear
|
|
305
|
+
cutoffDays: 90
|
|
306
|
+
streams:
|
|
307
|
+
- issues
|
|
308
|
+
- projects
|
|
309
|
+
- teams
|
|
310
|
+
- users
|
|
311
|
+
- comments
|
|
312
|
+
|
|
313
|
+
Examples:
|
|
314
|
+
# Sync all Linear data using config file + env vars
|
|
315
|
+
$ faros sync linear
|
|
316
|
+
|
|
317
|
+
# Sync only issues and projects
|
|
318
|
+
$ faros sync linear --streams issues,projects
|
|
319
|
+
|
|
320
|
+
# Full refresh (ignore incremental state)
|
|
321
|
+
$ faros sync linear --full-refresh
|
|
322
|
+
|
|
323
|
+
# Check connection first, then sync
|
|
324
|
+
$ faros sync linear --check-connection
|
|
325
|
+
|
|
326
|
+
# Dry-run to staging graph
|
|
327
|
+
$ faros sync linear --dry-run
|
|
328
|
+
|
|
329
|
+
# Use a specific API key inline
|
|
330
|
+
$ faros sync linear --linear-api-key lin_api_xxxxx
|
|
331
|
+
`)
|
|
332
|
+
.action(async (options) => {
|
|
333
|
+
try {
|
|
334
|
+
await syncLinear(options);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
(0, logger_1.getLogger)().error({ err: error }, error.message);
|
|
338
|
+
ui_1.ui.log.error(error.message);
|
|
339
|
+
if (options.debug) {
|
|
340
|
+
console.error(error.stack);
|
|
341
|
+
}
|
|
342
|
+
process.exit(1);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
return cmd;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/commands/sync/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAkCvD,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBzD;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,GAAG,EACf,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,MAAM,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAkCvD,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBzD;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,GAAG,EACf,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,MAAM,CAgDR;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
package/lib/config/loader.js
CHANGED
|
@@ -102,14 +102,29 @@ function mergeConfig(fileConfig, cliOptions, envVars = process.env) {
|
|
|
102
102
|
},
|
|
103
103
|
...fileConfig,
|
|
104
104
|
};
|
|
105
|
-
//
|
|
105
|
+
// Strip any credentials that may have been placed in the config file.
|
|
106
|
+
// Credentials must come from env vars / .env only.
|
|
107
|
+
delete merged.apiKey;
|
|
108
|
+
if (merged.sources) {
|
|
109
|
+
for (const source of Object.values(merged.sources)) {
|
|
110
|
+
delete source?.apiKey;
|
|
111
|
+
delete source?.token;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Credentials from environment variables / .env file only
|
|
106
115
|
if (envVars.FAROS_API_KEY)
|
|
107
116
|
merged.apiKey = envVars.FAROS_API_KEY;
|
|
108
|
-
if (envVars.LINEAR_API_KEY
|
|
109
|
-
merged.sources
|
|
117
|
+
if (envVars.LINEAR_API_KEY) {
|
|
118
|
+
if (!merged.sources)
|
|
119
|
+
merged.sources = {};
|
|
120
|
+
if (!merged.sources.linear)
|
|
121
|
+
merged.sources.linear = { type: 'Linear' };
|
|
110
122
|
}
|
|
111
|
-
if (envVars.GITHUB_TOKEN
|
|
112
|
-
merged.sources
|
|
123
|
+
if (envVars.GITHUB_TOKEN) {
|
|
124
|
+
if (!merged.sources)
|
|
125
|
+
merged.sources = {};
|
|
126
|
+
if (!merged.sources.github)
|
|
127
|
+
merged.sources.github = { type: 'GitHub' };
|
|
113
128
|
}
|
|
114
129
|
// AWS credentials from environment
|
|
115
130
|
if (envVars.AWS_ACCESS_KEY_ID) {
|
package/lib/config/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,gCAwBC;AAED,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const sync_1 = require("./commands/sync");
|
|
|
11
11
|
const sources_1 = require("./commands/sources");
|
|
12
12
|
const logs_1 = require("./commands/logs");
|
|
13
13
|
const ui_1 = require("./lib/ui");
|
|
14
|
+
const logger_1 = require("./lib/logger");
|
|
14
15
|
const pkg = require('../package.json');
|
|
15
16
|
// Check for updates
|
|
16
17
|
const notifier = (0, update_notifier_1.default)({
|
|
@@ -31,6 +32,12 @@ ${chalk_1.default.bold.blue('Faros CLI')} - Instrumentation & Data Sync
|
|
|
31
32
|
`)
|
|
32
33
|
.addHelpText('after', `
|
|
33
34
|
${chalk_1.default.bold('Quick Start:')}
|
|
35
|
+
${chalk_1.default.dim('# Sync Linear data (issues, projects, teams, etc.)')}
|
|
36
|
+
$ faros sync linear
|
|
37
|
+
|
|
38
|
+
${chalk_1.default.dim('# Sync only specific Linear streams')}
|
|
39
|
+
$ faros sync linear --streams issues,projects
|
|
40
|
+
|
|
34
41
|
${chalk_1.default.dim('# Sync test results')}
|
|
35
42
|
$ faros sync tests test-results/*.xml --source "Jenkins" --commit "GitHub://org/repo/abc"
|
|
36
43
|
|
|
@@ -55,6 +62,10 @@ ${chalk_1.default.bold('Support:')} https://community.faros.ai
|
|
|
55
62
|
.option('--quiet', 'Minimal output')
|
|
56
63
|
.option('--json', 'Output JSON (for scripting)')
|
|
57
64
|
.option('--no-color', 'Disable colors');
|
|
65
|
+
// Init file logger (debug level if --debug is present, else info)
|
|
66
|
+
const debugFlag = process.argv.includes('--debug') || process.argv.includes('-d');
|
|
67
|
+
const log = (0, logger_1.initLogger)(debugFlag ? 'debug' : 'info');
|
|
68
|
+
log.info({ version: pkg.version, argv: process.argv.slice(2) }, 'faros-cli started');
|
|
58
69
|
// Register commands
|
|
59
70
|
program.addCommand((0, sync_1.syncCommand)());
|
|
60
71
|
program.addCommand((0, sources_1.sourcesCommand)());
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,sEAA6C;AAC7C,0CAA8C;AAC9C,gDAAoD;AACpD,0CAA8C;AAC9C,iCAA8B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/lib/api/client.js
CHANGED
|
@@ -9,7 +9,7 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
9
9
|
const axios_retry_1 = __importDefault(require("axios-retry"));
|
|
10
10
|
function createClient(config) {
|
|
11
11
|
if (!config.apiKey) {
|
|
12
|
-
throw new Error('Faros API key is required. Set via --api-key
|
|
12
|
+
throw new Error('Faros API key is required. Set via --api-key flag or FAROS_API_KEY in .env / environment');
|
|
13
13
|
}
|
|
14
14
|
const client = axios_1.default.create({
|
|
15
15
|
baseURL: config.url,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/api/client.ts"],"names":[],"mappings":";;;;;AAIA,oCA4BC;AAED,8BAeC;AAjDD,kDAA6C;AAC7C,8DAAqC;AAGrC,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/api/client.ts"],"names":[],"mappings":";;;;;AAIA,oCA4BC;AAED,8BAeC;AAjDD,kDAA6C;AAC7C,8DAAqC;AAGrC,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,GAAG;QACnB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,YAAY,EAAE,iBAAiB;SAChC;KACF,CAAC,CAAC;IAEH,kBAAkB;IAClB,IAAA,qBAAU,EAAC,MAAM,EAAE;QACjB,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,qBAAU,CAAC,gBAAgB;QACvC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CACL,qBAAU,CAAC,iCAAiC,CAAC,KAAK,CAAC;gBACnD,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,IAAI,aAAa;gBAC/C,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAI,sBAAsB;aACzD,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,MAAqB,EACrB,KAAa,EACb,IAAS,EACT,UAGI,EAAE;IAEN,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,IAAI,EAAE;QACjD,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;SAC5C;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
/** Initialise the file logger. Call once at startup. */
|
|
3
|
+
export declare function initLogger(level?: string): pino.Logger;
|
|
4
|
+
/** Get the logger. Returns a silent logger if initLogger hasn't been called. */
|
|
5
|
+
export declare function getLogger(): pino.Logger;
|
|
6
|
+
/** Path to the log file. */
|
|
7
|
+
export declare const LOG_FILE_PATH: string;
|
|
8
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,KAAK,GAAE,MAAe,GAAG,IAAI,CAAC,MAAM,CAmB9D;AAED,gFAAgF;AAChF,wBAAgB,SAAS,IAAI,IAAI,CAAC,MAAM,CAKvC;AAED,4BAA4B;AAC5B,eAAO,MAAM,aAAa,QAAW,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.LOG_FILE_PATH = void 0;
|
|
40
|
+
exports.initLogger = initLogger;
|
|
41
|
+
exports.getLogger = getLogger;
|
|
42
|
+
const pino_1 = __importDefault(require("pino"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const LOG_FILE = path.join(process.cwd(), 'faros.log');
|
|
45
|
+
let _logger = null;
|
|
46
|
+
/** Initialise the file logger. Call once at startup. */
|
|
47
|
+
function initLogger(level = 'info') {
|
|
48
|
+
_logger = (0, pino_1.default)({
|
|
49
|
+
level,
|
|
50
|
+
timestamp: pino_1.default.stdTimeFunctions.isoTime,
|
|
51
|
+
redact: {
|
|
52
|
+
paths: [
|
|
53
|
+
'apiKey', 'api_key', 'token', 'secret',
|
|
54
|
+
'password', 'authorization',
|
|
55
|
+
'*.apiKey', '*.api_key', '*.token', '*.secret',
|
|
56
|
+
'*.password', '*.authorization',
|
|
57
|
+
'config.api_key', 'dstConfig.edition_configs.api_key',
|
|
58
|
+
],
|
|
59
|
+
censor: '***',
|
|
60
|
+
},
|
|
61
|
+
}, pino_1.default.destination({ dest: LOG_FILE, append: true, sync: true }));
|
|
62
|
+
return _logger;
|
|
63
|
+
}
|
|
64
|
+
/** Get the logger. Returns a silent logger if initLogger hasn't been called. */
|
|
65
|
+
function getLogger() {
|
|
66
|
+
if (!_logger) {
|
|
67
|
+
_logger = (0, pino_1.default)({ level: 'silent' });
|
|
68
|
+
}
|
|
69
|
+
return _logger;
|
|
70
|
+
}
|
|
71
|
+
/** Path to the log file. */
|
|
72
|
+
exports.LOG_FILE_PATH = LOG_FILE;
|
|
73
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gCAmBC;AAGD,8BAKC;AApCD,gDAAwB;AAExB,2CAA6B;AAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAEvD,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC,wDAAwD;AACxD,SAAgB,UAAU,CAAC,QAAgB,MAAM;IAC/C,OAAO,GAAG,IAAA,cAAI,EACZ;QACE,KAAK;QACL,SAAS,EAAE,cAAI,CAAC,gBAAgB,CAAC,OAAO;QACxC,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ;gBACtC,UAAU,EAAE,eAAe;gBAC3B,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU;gBAC9C,YAAY,EAAE,iBAAiB;gBAC/B,gBAAgB,EAAE,mCAAmC;aACtD;YACD,MAAM,EAAE,KAAK;SACd;KACF,EACD,cAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAC/D,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,SAAgB,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAA,cAAI,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4BAA4B;AACf,QAAA,aAAa,GAAG,QAAQ,CAAC"}
|
package/lib/types/config.d.ts
CHANGED
|
@@ -7,34 +7,46 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
7
7
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
8
8
|
sources: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
9
9
|
type: z.ZodOptional<z.ZodString>;
|
|
10
|
-
apiKey: z.ZodOptional<z.ZodString>;
|
|
11
|
-
token: z.ZodOptional<z.ZodString>;
|
|
12
10
|
bucket: z.ZodOptional<z.ZodString>;
|
|
13
11
|
region: z.ZodOptional<z.ZodString>;
|
|
14
12
|
prefix: z.ZodOptional<z.ZodString>;
|
|
15
13
|
pattern: z.ZodOptional<z.ZodString>;
|
|
16
14
|
syncInterval: z.ZodOptional<z.ZodString>;
|
|
17
15
|
streams: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
16
|
+
cutoffDays: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
18
|
+
endDate: z.ZodOptional<z.ZodString>;
|
|
19
|
+
srcImage: z.ZodOptional<z.ZodString>;
|
|
20
|
+
dstImage: z.ZodOptional<z.ZodString>;
|
|
21
|
+
connectionName: z.ZodOptional<z.ZodString>;
|
|
18
22
|
}, "strip", z.ZodTypeAny, {
|
|
19
|
-
apiKey?: string | undefined;
|
|
20
23
|
type?: string | undefined;
|
|
21
|
-
token?: string | undefined;
|
|
22
24
|
bucket?: string | undefined;
|
|
23
25
|
region?: string | undefined;
|
|
24
26
|
prefix?: string | undefined;
|
|
25
27
|
pattern?: string | undefined;
|
|
26
28
|
syncInterval?: string | undefined;
|
|
27
29
|
streams?: string[] | undefined;
|
|
30
|
+
cutoffDays?: number | undefined;
|
|
31
|
+
startDate?: string | undefined;
|
|
32
|
+
endDate?: string | undefined;
|
|
33
|
+
srcImage?: string | undefined;
|
|
34
|
+
dstImage?: string | undefined;
|
|
35
|
+
connectionName?: string | undefined;
|
|
28
36
|
}, {
|
|
29
|
-
apiKey?: string | undefined;
|
|
30
37
|
type?: string | undefined;
|
|
31
|
-
token?: string | undefined;
|
|
32
38
|
bucket?: string | undefined;
|
|
33
39
|
region?: string | undefined;
|
|
34
40
|
prefix?: string | undefined;
|
|
35
41
|
pattern?: string | undefined;
|
|
36
42
|
syncInterval?: string | undefined;
|
|
37
43
|
streams?: string[] | undefined;
|
|
44
|
+
cutoffDays?: number | undefined;
|
|
45
|
+
startDate?: string | undefined;
|
|
46
|
+
endDate?: string | undefined;
|
|
47
|
+
srcImage?: string | undefined;
|
|
48
|
+
dstImage?: string | undefined;
|
|
49
|
+
connectionName?: string | undefined;
|
|
38
50
|
}>>>>;
|
|
39
51
|
defaults: z.ZodOptional<z.ZodObject<{
|
|
40
52
|
testSource: z.ZodOptional<z.ZodString>;
|
|
@@ -51,16 +63,10 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
51
63
|
}>>;
|
|
52
64
|
logs: z.ZodOptional<z.ZodObject<{
|
|
53
65
|
level: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
|
|
54
|
-
directory: z.ZodOptional<z.ZodString>;
|
|
55
|
-
retention: z.ZodOptional<z.ZodString>;
|
|
56
66
|
}, "strip", z.ZodTypeAny, {
|
|
57
67
|
level: "debug" | "info" | "warn" | "error";
|
|
58
|
-
directory?: string | undefined;
|
|
59
|
-
retention?: string | undefined;
|
|
60
68
|
}, {
|
|
61
69
|
level?: "debug" | "info" | "warn" | "error" | undefined;
|
|
62
|
-
directory?: string | undefined;
|
|
63
|
-
retention?: string | undefined;
|
|
64
70
|
}>>;
|
|
65
71
|
}, "strip", z.ZodTypeAny, {
|
|
66
72
|
url: string;
|
|
@@ -69,15 +75,19 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
69
75
|
stagingGraph?: string | undefined;
|
|
70
76
|
apiKey?: string | undefined;
|
|
71
77
|
sources?: Record<string, {
|
|
72
|
-
apiKey?: string | undefined;
|
|
73
78
|
type?: string | undefined;
|
|
74
|
-
token?: string | undefined;
|
|
75
79
|
bucket?: string | undefined;
|
|
76
80
|
region?: string | undefined;
|
|
77
81
|
prefix?: string | undefined;
|
|
78
82
|
pattern?: string | undefined;
|
|
79
83
|
syncInterval?: string | undefined;
|
|
80
84
|
streams?: string[] | undefined;
|
|
85
|
+
cutoffDays?: number | undefined;
|
|
86
|
+
startDate?: string | undefined;
|
|
87
|
+
endDate?: string | undefined;
|
|
88
|
+
srcImage?: string | undefined;
|
|
89
|
+
dstImage?: string | undefined;
|
|
90
|
+
connectionName?: string | undefined;
|
|
81
91
|
}> | null | undefined;
|
|
82
92
|
defaults?: {
|
|
83
93
|
concurrency: number;
|
|
@@ -86,8 +96,6 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
86
96
|
} | undefined;
|
|
87
97
|
logs?: {
|
|
88
98
|
level: "debug" | "info" | "warn" | "error";
|
|
89
|
-
directory?: string | undefined;
|
|
90
|
-
retention?: string | undefined;
|
|
91
99
|
} | undefined;
|
|
92
100
|
}, {
|
|
93
101
|
url?: string | undefined;
|
|
@@ -96,15 +104,19 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
96
104
|
origin?: string | undefined;
|
|
97
105
|
apiKey?: string | undefined;
|
|
98
106
|
sources?: Record<string, {
|
|
99
|
-
apiKey?: string | undefined;
|
|
100
107
|
type?: string | undefined;
|
|
101
|
-
token?: string | undefined;
|
|
102
108
|
bucket?: string | undefined;
|
|
103
109
|
region?: string | undefined;
|
|
104
110
|
prefix?: string | undefined;
|
|
105
111
|
pattern?: string | undefined;
|
|
106
112
|
syncInterval?: string | undefined;
|
|
107
113
|
streams?: string[] | undefined;
|
|
114
|
+
cutoffDays?: number | undefined;
|
|
115
|
+
startDate?: string | undefined;
|
|
116
|
+
endDate?: string | undefined;
|
|
117
|
+
srcImage?: string | undefined;
|
|
118
|
+
dstImage?: string | undefined;
|
|
119
|
+
connectionName?: string | undefined;
|
|
108
120
|
}> | null | undefined;
|
|
109
121
|
defaults?: {
|
|
110
122
|
testSource?: string | undefined;
|
|
@@ -113,8 +125,6 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
113
125
|
} | undefined;
|
|
114
126
|
logs?: {
|
|
115
127
|
level?: "debug" | "info" | "warn" | "error" | undefined;
|
|
116
|
-
directory?: string | undefined;
|
|
117
|
-
retention?: string | undefined;
|
|
118
128
|
} | undefined;
|
|
119
129
|
}>;
|
|
120
130
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
@@ -157,4 +167,22 @@ export interface SyncCICDOptions extends BaseCommandOptions {
|
|
|
157
167
|
deployEndTime?: string;
|
|
158
168
|
artifact?: string;
|
|
159
169
|
}
|
|
170
|
+
export interface SyncLinearOptions extends BaseCommandOptions {
|
|
171
|
+
linearApiKey?: string;
|
|
172
|
+
cutoffDays?: number;
|
|
173
|
+
startDate?: string;
|
|
174
|
+
endDate?: string;
|
|
175
|
+
streams?: string;
|
|
176
|
+
fullRefresh?: boolean;
|
|
177
|
+
connectionName?: string;
|
|
178
|
+
checkConnection?: boolean;
|
|
179
|
+
stateFile?: string;
|
|
180
|
+
srcImage?: string;
|
|
181
|
+
dstImage?: string;
|
|
182
|
+
keepContainers?: boolean;
|
|
183
|
+
logLevel?: string;
|
|
184
|
+
rawMessages?: boolean;
|
|
185
|
+
noSrcPull?: boolean;
|
|
186
|
+
noDstPull?: boolean;
|
|
187
|
+
}
|
|
160
188
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAGlD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
package/lib/types/config.js
CHANGED
|
@@ -3,26 +3,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ConfigSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
// Config schema
|
|
6
|
-
// NOTE:
|
|
6
|
+
// NOTE: All credentials (API keys, tokens) MUST be in .env or env vars, NOT in config files.
|
|
7
7
|
exports.ConfigSchema = zod_1.z.object({
|
|
8
8
|
// API Configuration (can be in config file)
|
|
9
9
|
url: zod_1.z.string().url().default('https://prod.api.faros.ai'),
|
|
10
10
|
graph: zod_1.z.string().default('default'),
|
|
11
11
|
stagingGraph: zod_1.z.string().optional(),
|
|
12
12
|
origin: zod_1.z.string().default('faros-cli'),
|
|
13
|
-
// Credentials
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
// Credentials - populated at runtime from env vars / CLI flags only.
|
|
14
|
+
// Not read from config file. Set FAROS_API_KEY in .env or environment.
|
|
15
|
+
apiKey: zod_1.z.string().optional(),
|
|
16
|
+
// Data Sources
|
|
17
|
+
// Credentials (apiKey, token) are injected at runtime from env vars / .env only.
|
|
16
18
|
sources: zod_1.z.record(zod_1.z.object({
|
|
17
19
|
type: zod_1.z.string().optional(),
|
|
18
|
-
apiKey: zod_1.z.string().optional(), // Prefer SOURCE_API_KEY env var
|
|
19
|
-
token: zod_1.z.string().optional(), // Prefer SOURCE_TOKEN env var
|
|
20
20
|
bucket: zod_1.z.string().optional(), // S3 bucket name
|
|
21
21
|
region: zod_1.z.string().optional(), // S3 region
|
|
22
22
|
prefix: zod_1.z.string().optional(), // S3 prefix
|
|
23
23
|
pattern: zod_1.z.string().optional(), // S3 pattern
|
|
24
24
|
syncInterval: zod_1.z.string().optional(),
|
|
25
25
|
streams: zod_1.z.array(zod_1.z.string()).optional(),
|
|
26
|
+
// Linear-specific settings
|
|
27
|
+
cutoffDays: zod_1.z.number().optional(),
|
|
28
|
+
startDate: zod_1.z.string().optional(),
|
|
29
|
+
endDate: zod_1.z.string().optional(),
|
|
30
|
+
// Docker image overrides
|
|
31
|
+
srcImage: zod_1.z.string().optional(),
|
|
32
|
+
dstImage: zod_1.z.string().optional(),
|
|
33
|
+
// Connection settings
|
|
34
|
+
connectionName: zod_1.z.string().optional(),
|
|
26
35
|
})).optional().nullable(),
|
|
27
36
|
// Defaults
|
|
28
37
|
defaults: zod_1.z.object({
|
|
@@ -33,8 +42,6 @@ exports.ConfigSchema = zod_1.z.object({
|
|
|
33
42
|
// Logging
|
|
34
43
|
logs: zod_1.z.object({
|
|
35
44
|
level: zod_1.z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
36
|
-
directory: zod_1.z.string().optional(),
|
|
37
|
-
retention: zod_1.z.string().optional(),
|
|
38
45
|
}).optional(),
|
|
39
46
|
});
|
|
40
47
|
//# sourceMappingURL=config.js.map
|
package/lib/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,gBAAgB;AAChB,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,gBAAgB;AAChB,6FAA6F;AAChF,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,4CAA4C;IAC5C,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC1D,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACpC,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IAEvC,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE7B,eAAe;IACf,iFAAiF;IACjF,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,CAAC;QACzB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,iBAAiB;QAChD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY;QAC3C,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY;QAC3C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa;QAC7C,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACnC,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACvC,2BAA2B;QAC3B,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,yBAAyB;QACzB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,sBAAsB;QACtB,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACtC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAEzB,WAAW;IACX,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;QACjB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;KACnC,CAAC,CAAC,QAAQ,EAAE;IAEb,UAAU;IACV,IAAI,EAAE,OAAC,CAAC,MAAM,CAAC;QACb,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KAClE,CAAC,CAAC,QAAQ,EAAE;CACd,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faros-fde-sandbox/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "CLI for Faros AI - sync data, manage sources, view logs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"faros",
|
|
@@ -12,9 +12,16 @@
|
|
|
12
12
|
"linear",
|
|
13
13
|
"github"
|
|
14
14
|
],
|
|
15
|
-
"homepage": "https://
|
|
15
|
+
"homepage": "https://github.com/faros-fde/faros-cli#readme",
|
|
16
16
|
"author": "Faros AI, Inc.",
|
|
17
17
|
"license": "Apache-2.0",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/faros-fde/faros-cli.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/faros-fde/faros-cli/issues"
|
|
24
|
+
},
|
|
18
25
|
"bin": {
|
|
19
26
|
"faros": "./bin/faros"
|
|
20
27
|
},
|