@principal-ai/quality-lens-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/README.md ADDED
@@ -0,0 +1,166 @@
1
+ # Quality Lens CLI
2
+
3
+ A standalone CLI tool for running quality lenses (ESLint, Jest, TypeScript, Knip, Git) on codebases in CI/CD pipelines.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @principal-ai/quality-lens-cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Run quality lenses
14
+
15
+ ```bash
16
+ # Run all available lenses in current directory
17
+ quality-lens run
18
+
19
+ # Run on specific directory
20
+ quality-lens run /path/to/repo
21
+
22
+ # Run specific lenses only
23
+ quality-lens run --lenses eslint,jest,typescript
24
+
25
+ # Output to JSON file
26
+ quality-lens run --output results.json --format json
27
+
28
+ # Console output (default)
29
+ quality-lens run --format console
30
+ ```
31
+
32
+ ### List available lenses
33
+
34
+ ```bash
35
+ # List lenses in current directory
36
+ quality-lens list
37
+
38
+ # List lenses in specific directory
39
+ quality-lens list /path/to/repo
40
+ ```
41
+
42
+ ## Options
43
+
44
+ - `--output, -o`: Output file path for results (JSON format)
45
+ - `--lenses`: Comma-separated list of lenses to run (eslint,jest,typescript,knip,git)
46
+ - `--format`: Output format - `json` or `console` (default: console)
47
+
48
+ ## GitHub Actions Integration
49
+
50
+ Create `.github/workflows/quality-lens.yml`:
51
+
52
+ ```yaml
53
+ name: Quality Lens Analysis
54
+
55
+ on:
56
+ push:
57
+ branches: [main]
58
+ pull_request:
59
+ branches: [main]
60
+
61
+ jobs:
62
+ analyze:
63
+ runs-on: ubuntu-latest
64
+
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+
68
+ - uses: actions/setup-node@v4
69
+ with:
70
+ node-version: '20'
71
+
72
+ - run: npm ci
73
+
74
+ - name: Install quality-lens-cli
75
+ run: npm install -g @principal-ai/quality-lens-cli
76
+
77
+ - name: Run quality lenses
78
+ run: |
79
+ quality-lens run . \\
80
+ --output results.json \\
81
+ --format json \\
82
+ --lenses eslint,jest,typescript
83
+
84
+ - name: Upload results
85
+ uses: actions/upload-artifact@v4
86
+ with:
87
+ name: quality-lens-results
88
+ path: results.json
89
+ ```
90
+
91
+ ## Output Format
92
+
93
+ ### JSON Output
94
+
95
+ ```json
96
+ {
97
+ "metadata": {
98
+ "timestamp": "2025-10-16T20:00:00.000Z",
99
+ "version": "1.0.0",
100
+ "totalPackages": 2,
101
+ "totalLenses": 6
102
+ },
103
+ "results": [
104
+ {
105
+ "package": {
106
+ "name": "my-package",
107
+ "path": "packages/my-package"
108
+ },
109
+ "lens": {
110
+ "id": "eslint",
111
+ "command": "npm run lint"
112
+ },
113
+ "execution": {
114
+ "success": true,
115
+ "exitCode": 0,
116
+ "duration": 1234,
117
+ "timestamp": 1697486400000
118
+ },
119
+ "issues": [],
120
+ "metrics": {},
121
+ "qualityContext": {}
122
+ }
123
+ ]
124
+ }
125
+ ```
126
+
127
+ ### Console Output
128
+
129
+ ```
130
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
131
+ Quality Lens Results
132
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
133
+
134
+ 📦 my-package
135
+ ✓ eslint: npm run lint (1234ms)
136
+ ✓ jest: npm run test (5678ms)
137
+ ✓ typescript: npm run typecheck (2345ms)
138
+
139
+ Summary:
140
+ Total: 3
141
+ Passed: 3
142
+ Failed: 0
143
+ ```
144
+
145
+ ## Development
146
+
147
+ ```bash
148
+ # Install dependencies
149
+ npm install
150
+
151
+ # Build
152
+ npm run build
153
+
154
+ # Run locally
155
+ ./bin/quality-lens.js run .
156
+
157
+ # Lint
158
+ npm run lint
159
+
160
+ # Type check
161
+ npm run typecheck
162
+ ```
163
+
164
+ ## License
165
+
166
+ MIT
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Entry point for the quality-lens CLI
4
+ require('../dist/cli.js');
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const yargs_1 = tslib_1.__importDefault(require("yargs"));
6
+ const helpers_1 = require("yargs/helpers");
7
+ const RepositoryScanner_1 = require("./scanner/RepositoryScanner");
8
+ const QualityLensService_1 = require("./service/QualityLensService");
9
+ const JsonFormatter_1 = require("./output/JsonFormatter");
10
+ const ConsoleReporter_1 = require("./output/ConsoleReporter");
11
+ const repository_abstraction_1 = require("@principal-ai/repository-abstraction");
12
+ const fs = tslib_1.__importStar(require("fs/promises"));
13
+ const path = tslib_1.__importStar(require("path"));
14
+ async function buildFileTree(dirPath) {
15
+ const paths = await collectPaths(dirPath, '');
16
+ const builder = new repository_abstraction_1.PathsFileTreeBuilder();
17
+ const result = builder.build({
18
+ files: paths,
19
+ rootPath: dirPath,
20
+ });
21
+ return result;
22
+ }
23
+ async function collectPaths(dirPath, relativePath) {
24
+ const paths = [];
25
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
26
+ for (const entry of entries) {
27
+ if (shouldSkip(entry.name)) {
28
+ continue;
29
+ }
30
+ const fullPath = path.join(dirPath, entry.name);
31
+ const entryRelativePath = relativePath
32
+ ? `${relativePath}/${entry.name}`
33
+ : entry.name;
34
+ if (entry.isDirectory()) {
35
+ const subPaths = await collectPaths(fullPath, entryRelativePath);
36
+ paths.push(...subPaths);
37
+ }
38
+ else if (entry.isFile()) {
39
+ paths.push(entryRelativePath);
40
+ }
41
+ }
42
+ return paths;
43
+ }
44
+ function shouldSkip(name) {
45
+ const skipPatterns = [
46
+ 'node_modules',
47
+ '.git',
48
+ '.next',
49
+ '.nuxt',
50
+ 'dist',
51
+ 'build',
52
+ 'coverage',
53
+ '.turbo',
54
+ '.cache',
55
+ ];
56
+ return skipPatterns.includes(name) || name.startsWith('.');
57
+ }
58
+ async function runCommand(argv) {
59
+ const scanner = new RepositoryScanner_1.RepositoryScanner();
60
+ const lensService = new QualityLensService_1.QualityLensService();
61
+ const jsonFormatter = new JsonFormatter_1.JsonFormatter();
62
+ const consoleReporter = new ConsoleReporter_1.ConsoleReporter();
63
+ try {
64
+ const repoPath = path.resolve(argv.path);
65
+ console.log(`Scanning repository: ${repoPath}`);
66
+ const fileTree = await buildFileTree(repoPath);
67
+ const packages = await scanner.extractPackages(fileTree, repoPath);
68
+ if (packages.length === 0) {
69
+ console.warn('No packages found in repository');
70
+ process.exit(1);
71
+ }
72
+ console.log(`Found ${packages.length} package(s)`);
73
+ const lensFilter = argv.lenses
74
+ ? argv.lenses.split(',').map((l) => l.trim())
75
+ : null;
76
+ const allResults = [];
77
+ for (const pkg of packages) {
78
+ const lensCommands = pkg.packageData.availableCommands?.filter((cmd) => {
79
+ if (!cmd.isLensCommand)
80
+ return false;
81
+ if (lensFilter && !lensFilter.includes(cmd.lensId || '')) {
82
+ return false;
83
+ }
84
+ return true;
85
+ });
86
+ if (!lensCommands || lensCommands.length === 0) {
87
+ console.log(`Skipping ${pkg.packageData.name} (no lens commands)`);
88
+ continue;
89
+ }
90
+ console.log(`\nRunning lenses for ${pkg.packageData.name}...`);
91
+ for (const command of lensCommands) {
92
+ console.log(` - ${command.lensId}: ${command.name}`);
93
+ try {
94
+ const result = await lensService.executeTool({
95
+ repoPath,
96
+ packageLayer: pkg,
97
+ packageCommand: command,
98
+ });
99
+ allResults.push({
100
+ package: pkg.packageData.name,
101
+ packagePath: pkg.packageData.path,
102
+ lens: command.lensId || 'unknown',
103
+ command: command.name,
104
+ result,
105
+ timestamp: Date.now(),
106
+ });
107
+ console.log(` ${result.success ? '✓' : '✗'} ${result.success ? 'Success' : 'Failed'} (${result.duration}ms)`);
108
+ }
109
+ catch (error) {
110
+ console.error(` ✗ Error: ${error.message}`);
111
+ allResults.push({
112
+ package: pkg.packageData.name,
113
+ packagePath: pkg.packageData.path,
114
+ lens: command.lensId || 'unknown',
115
+ command: command.name,
116
+ error: error.message,
117
+ timestamp: Date.now(),
118
+ });
119
+ }
120
+ }
121
+ }
122
+ if (argv.format === 'json') {
123
+ const json = jsonFormatter.format(allResults);
124
+ if (argv.output) {
125
+ await fs.writeFile(argv.output, json, 'utf-8');
126
+ console.log(`\nResults written to: ${argv.output}`);
127
+ }
128
+ else {
129
+ console.log('\n' + json);
130
+ }
131
+ }
132
+ else {
133
+ consoleReporter.report(allResults);
134
+ }
135
+ const hasFailures = allResults.some((r) => r.error || !r.result?.success);
136
+ process.exit(hasFailures ? 1 : 0);
137
+ }
138
+ catch (error) {
139
+ console.error('Fatal error:', error.message);
140
+ process.exit(1);
141
+ }
142
+ }
143
+ (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
144
+ .command('run [path]', 'Run quality lenses on repository', (yargs) => {
145
+ return yargs
146
+ .positional('path', {
147
+ describe: 'Repository path',
148
+ type: 'string',
149
+ default: process.cwd(),
150
+ })
151
+ .option('output', {
152
+ alias: 'o',
153
+ describe: 'Output file for results',
154
+ type: 'string',
155
+ })
156
+ .option('lenses', {
157
+ describe: 'Specific lenses to run (comma-separated)',
158
+ type: 'string',
159
+ example: 'eslint,jest,typescript',
160
+ })
161
+ .option('format', {
162
+ describe: 'Output format',
163
+ choices: ['json', 'console'],
164
+ default: 'console',
165
+ });
166
+ }, (argv) => runCommand(argv))
167
+ .command('list [path]', 'List available lenses in repository', (yargs) => {
168
+ return yargs.positional('path', {
169
+ describe: 'Repository path',
170
+ type: 'string',
171
+ default: process.cwd(),
172
+ });
173
+ }, async (argv) => {
174
+ const repoPath = path.resolve(argv.path);
175
+ const scanner = new RepositoryScanner_1.RepositoryScanner();
176
+ console.log(`Scanning repository: ${repoPath}`);
177
+ const fileTree = await buildFileTree(repoPath);
178
+ const packages = await scanner.extractPackages(fileTree, repoPath);
179
+ packages.forEach((pkg) => {
180
+ console.log(`\n${pkg.packageData.name}:`);
181
+ console.log(` Available: ${pkg.qualityMetrics?.availableLenses?.join(', ') || 'none'}`);
182
+ console.log(` Missing: ${pkg.qualityMetrics?.missingLenses?.join(', ') || 'none'}`);
183
+ });
184
+ })
185
+ .demandCommand()
186
+ .help()
187
+ .argv;
188
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Executor, ExecuteResult, ExecuteOptions, StreamOptions, StreamResult } from '@principal-ai/codebase-quality-lenses';
2
+ export declare class NodeExecutor implements Executor {
3
+ readonly type: "node";
4
+ execute(command: string, args?: string[], options?: ExecuteOptions): Promise<ExecuteResult>;
5
+ stream(command: string, args?: string[], options?: StreamOptions): StreamResult;
6
+ isAvailable(command: string): Promise<boolean>;
7
+ }
8
+ //# sourceMappingURL=NodeExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeExecutor.d.ts","sourceRoot":"","sources":["../../src/executor/NodeExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,uCAAuC,CAAC;AAQ/C,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAK1B,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAuEzB,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,aAAkB,GAC1B,YAAY;IAoET,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAWrD"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NodeExecutor = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const stream_1 = require("stream");
6
+ class NodeExecutor {
7
+ constructor() {
8
+ this.type = 'node';
9
+ }
10
+ async execute(command, args = [], options = {}) {
11
+ const startTime = Date.now();
12
+ return new Promise((resolve) => {
13
+ let stdout = '';
14
+ let stderr = '';
15
+ const baseEnv = options.env || process.env;
16
+ const cleanEnv = { ...baseEnv };
17
+ delete cleanEnv['NODE_OPTIONS'];
18
+ delete cleanEnv['TS_NODE_PROJECT'];
19
+ delete cleanEnv['TS_NODE_TRANSPILE_ONLY'];
20
+ const child = (0, child_process_1.spawn)(command, args, {
21
+ cwd: options.cwd,
22
+ env: cleanEnv,
23
+ shell: true,
24
+ });
25
+ if (child.stdout) {
26
+ child.stdout.on('data', (data) => {
27
+ stdout += data.toString();
28
+ });
29
+ }
30
+ if (child.stderr) {
31
+ child.stderr.on('data', (data) => {
32
+ stderr += data.toString();
33
+ });
34
+ }
35
+ let timeoutHandle;
36
+ if (options.timeout) {
37
+ timeoutHandle = setTimeout(() => {
38
+ child.kill('SIGTERM');
39
+ }, options.timeout);
40
+ }
41
+ child.on('error', (error) => {
42
+ if (timeoutHandle)
43
+ clearTimeout(timeoutHandle);
44
+ resolve({
45
+ stdout,
46
+ stderr: stderr || error.message,
47
+ exitCode: 1,
48
+ duration: Date.now() - startTime,
49
+ command,
50
+ args,
51
+ error,
52
+ });
53
+ });
54
+ child.on('close', (code) => {
55
+ if (timeoutHandle)
56
+ clearTimeout(timeoutHandle);
57
+ resolve({
58
+ stdout,
59
+ stderr,
60
+ exitCode: code ?? 0,
61
+ duration: Date.now() - startTime,
62
+ command,
63
+ args,
64
+ });
65
+ });
66
+ });
67
+ }
68
+ stream(command, args = [], options = {}) {
69
+ const baseEnv = options.env || process.env;
70
+ const cleanEnv = { ...baseEnv };
71
+ delete cleanEnv['NODE_OPTIONS'];
72
+ delete cleanEnv['TS_NODE_PROJECT'];
73
+ delete cleanEnv['TS_NODE_TRANSPILE_ONLY'];
74
+ const child = (0, child_process_1.spawn)(command, args, {
75
+ cwd: options.cwd,
76
+ env: cleanEnv,
77
+ shell: true,
78
+ });
79
+ const exitPromise = new Promise((resolve) => {
80
+ let stdout = '';
81
+ let stderr = '';
82
+ const startTime = Date.now();
83
+ if (child.stdout) {
84
+ child.stdout.on('data', (data) => {
85
+ stdout += data.toString();
86
+ });
87
+ }
88
+ if (child.stderr) {
89
+ child.stderr.on('data', (data) => {
90
+ stderr += data.toString();
91
+ });
92
+ }
93
+ child.on('close', (code) => {
94
+ resolve({
95
+ stdout,
96
+ stderr,
97
+ exitCode: code ?? 0,
98
+ duration: Date.now() - startTime,
99
+ command,
100
+ args,
101
+ });
102
+ });
103
+ child.on('error', (error) => {
104
+ resolve({
105
+ stdout,
106
+ stderr: stderr || error.message,
107
+ exitCode: 1,
108
+ duration: Date.now() - startTime,
109
+ command,
110
+ args,
111
+ error,
112
+ });
113
+ });
114
+ });
115
+ return {
116
+ stdout: child.stdout || new stream_1.Readable({ read() { } }),
117
+ stderr: child.stderr || new stream_1.Readable({ read() { } }),
118
+ exitPromise,
119
+ kill: () => {
120
+ child.kill('SIGTERM');
121
+ },
122
+ };
123
+ }
124
+ async isAvailable(command) {
125
+ try {
126
+ const testArgs = ['--version'];
127
+ const result = await this.execute(command, testArgs, {
128
+ timeout: 5000,
129
+ });
130
+ return result.exitCode === 0;
131
+ }
132
+ catch (error) {
133
+ return false;
134
+ }
135
+ }
136
+ }
137
+ exports.NodeExecutor = NodeExecutor;
138
+ //# sourceMappingURL=NodeExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeExecutor.js","sourceRoot":"","sources":["../../src/executor/NodeExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LensExecutionResult } from './JsonFormatter';
2
+ export declare class ConsoleReporter {
3
+ report(results: LensExecutionResult[]): void;
4
+ private groupByPackage;
5
+ }
6
+ //# sourceMappingURL=ConsoleReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleReporter.d.ts","sourceRoot":"","sources":["../../src/output/ConsoleReporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,qBAAa,eAAe;IAC1B,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,IAAI;IA6D5C,OAAO,CAAC,cAAc;CASvB"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsoleReporter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ class ConsoleReporter {
7
+ report(results) {
8
+ console.log(chalk_1.default.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
9
+ console.log(chalk_1.default.bold('Quality Lens Results'));
10
+ console.log(chalk_1.default.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
11
+ const byPackage = this.groupByPackage(results);
12
+ Object.entries(byPackage).forEach(([pkg, pkgResults]) => {
13
+ console.log(chalk_1.default.bold.blue(`📦 ${pkg}`));
14
+ pkgResults.forEach((r) => {
15
+ const icon = r.result?.success ? '✓' : '✗';
16
+ const color = r.result?.success ? chalk_1.default.green : chalk_1.default.red;
17
+ const duration = r.result?.duration
18
+ ? `(${r.result.duration}ms)`
19
+ : '';
20
+ console.log(` ${color(icon)} ${r.lens}: ${r.command} ${chalk_1.default.gray(duration)}`);
21
+ if (r.result?.lensResult?.issues && r.result.lensResult.issues.length > 0) {
22
+ const errorCount = r.result.lensResult.issues.filter((i) => i.severity === 'error').length;
23
+ const warningCount = r.result.lensResult.issues.filter((i) => i.severity === 'warning').length;
24
+ if (errorCount > 0) {
25
+ console.log(` ${chalk_1.default.red(`${errorCount} error(s)`)}`);
26
+ }
27
+ if (warningCount > 0) {
28
+ console.log(` ${chalk_1.default.yellow(`${warningCount} warning(s)`)}`);
29
+ }
30
+ }
31
+ if (r.error) {
32
+ console.log(` ${chalk_1.default.red('Error:')} ${r.error}`);
33
+ }
34
+ });
35
+ console.log('');
36
+ });
37
+ const total = results.length;
38
+ const passed = results.filter((r) => r.result?.success).length;
39
+ const failed = total - passed;
40
+ console.log(chalk_1.default.bold('Summary:'));
41
+ console.log(` Total: ${total}`);
42
+ console.log(` ${chalk_1.default.green('Passed:')} ${passed}`);
43
+ console.log(` ${chalk_1.default.red('Failed:')} ${failed}`);
44
+ console.log('');
45
+ }
46
+ groupByPackage(results) {
47
+ return results.reduce((acc, r) => {
48
+ if (!acc[r.package]) {
49
+ acc[r.package] = [];
50
+ }
51
+ acc[r.package].push(r);
52
+ return acc;
53
+ }, {});
54
+ }
55
+ }
56
+ exports.ConsoleReporter = ConsoleReporter;
57
+ //# sourceMappingURL=ConsoleReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleReporter.js","sourceRoot":"","sources":["../../src/output/ConsoleReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ToolExecutionResponse } from '../service/QualityLensService';
2
+ export interface LensExecutionResult {
3
+ package: string;
4
+ packagePath?: string;
5
+ lens: string;
6
+ command: string;
7
+ result?: ToolExecutionResponse;
8
+ error?: string;
9
+ timestamp: number;
10
+ }
11
+ export interface FormattedResults {
12
+ metadata: {
13
+ timestamp: string;
14
+ version: string;
15
+ totalPackages: number;
16
+ totalLenses: number;
17
+ };
18
+ results: Array<{
19
+ package: {
20
+ name: string;
21
+ path?: string;
22
+ };
23
+ lens: {
24
+ id: string;
25
+ command: string;
26
+ };
27
+ execution: {
28
+ success: boolean;
29
+ exitCode?: number;
30
+ duration?: number;
31
+ timestamp: number;
32
+ };
33
+ issues: any[];
34
+ metrics: Record<string, any>;
35
+ qualityContext: Record<string, any>;
36
+ error?: string;
37
+ }>;
38
+ }
39
+ export declare class JsonFormatter {
40
+ format(results: LensExecutionResult[]): string;
41
+ }
42
+ //# sourceMappingURL=JsonFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonFormatter.d.ts","sourceRoot":"","sources":["../../src/output/JsonFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;QACF,IAAI,EAAE;YACJ,EAAE,EAAE,MAAM,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,EAAE;YACT,OAAO,EAAE,OAAO,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAKD,qBAAa,aAAa;IACxB,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,MAAM;CAgC/C"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonFormatter = void 0;
4
+ class JsonFormatter {
5
+ format(results) {
6
+ const formatted = {
7
+ metadata: {
8
+ timestamp: new Date().toISOString(),
9
+ version: '1.0.0',
10
+ totalPackages: new Set(results.map((r) => r.package)).size,
11
+ totalLenses: results.length,
12
+ },
13
+ results: results.map((r) => ({
14
+ package: {
15
+ name: r.package,
16
+ path: r.packagePath,
17
+ },
18
+ lens: {
19
+ id: r.lens,
20
+ command: r.command,
21
+ },
22
+ execution: {
23
+ success: r.result?.success ?? false,
24
+ exitCode: r.result?.exitCode,
25
+ duration: r.result?.duration,
26
+ timestamp: r.timestamp,
27
+ },
28
+ issues: r.result?.lensResult?.issues || [],
29
+ metrics: r.result?.lensResult?.metrics || {},
30
+ qualityContext: r.result?.qualityContext || {},
31
+ error: r.error,
32
+ })),
33
+ };
34
+ return JSON.stringify(formatted, null, 2);
35
+ }
36
+ }
37
+ exports.JsonFormatter = JsonFormatter;
38
+ //# sourceMappingURL=JsonFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonFormatter.js","sourceRoot":"","sources":["../../src/output/JsonFormatter.ts"],"names":[],"mappings":";;;AA4CA,MAAa,aAAa;IACxB,MAAM,CAAC,OAA8B;QACnC,MAAM,SAAS,GAAqB;YAClC,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,OAAO;gBAChB,aAAa,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;gBAC1D,WAAW,EAAE,OAAO,CAAC,MAAM;aAC5B;YACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,OAAO,EAAE;oBACP,IAAI,EAAE,CAAC,CAAC,OAAO;oBACf,IAAI,EAAE,CAAC,CAAC,WAAW;iBACpB;gBACD,IAAI,EAAE;oBACJ,EAAE,EAAE,CAAC,CAAC,IAAI;oBACV,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB;gBACD,SAAS,EAAE;oBACT,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;oBACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ;oBAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ;oBAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB;gBACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,EAAE;gBAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,IAAI,EAAE;gBAC5C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,IAAI,EAAE;gBAC9C,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AAjCD,sCAiCC"}
@@ -0,0 +1,8 @@
1
+ import { PackageLayer } from '@principal-ai/codebase-composition';
2
+ import type { FileTree } from '@principal-ai/repository-abstraction';
3
+ export declare class RepositoryScanner {
4
+ private packageModule;
5
+ constructor();
6
+ extractPackages(fileTree: FileTree, repoPath: string): Promise<PackageLayer[]>;
7
+ }
8
+ //# sourceMappingURL=RepositoryScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepositoryScanner.d.ts","sourceRoot":"","sources":["../../src/scanner/RepositoryScanner.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,YAAY,EAEb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAyFrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAqB;;IAYpC,eAAe,CACnB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,EAAE,CAAC;CA2B3B"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RepositoryScanner = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const codebase_composition_1 = require("@principal-ai/codebase-composition");
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const fs = tslib_1.__importStar(require("fs/promises"));
8
+ class CLIFileSystemAdapter {
9
+ constructor(basePath) {
10
+ this.basePath = basePath;
11
+ }
12
+ async readFile(filePath) {
13
+ try {
14
+ const absolutePath = path.isAbsolute(filePath)
15
+ ? filePath
16
+ : path.join(this.basePath, filePath);
17
+ const content = await fs.readFile(absolutePath, 'utf-8');
18
+ return { content };
19
+ }
20
+ catch (error) {
21
+ console.error(`[CLIFileSystemAdapter] Failed to read ${filePath}:`, error);
22
+ return null;
23
+ }
24
+ }
25
+ async fileExists(filePath) {
26
+ try {
27
+ const absolutePath = path.isAbsolute(filePath)
28
+ ? filePath
29
+ : path.join(this.basePath, filePath);
30
+ await fs.access(absolutePath);
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ async readDirectory(dirPath) {
38
+ try {
39
+ const absolutePath = path.isAbsolute(dirPath)
40
+ ? dirPath
41
+ : path.join(this.basePath, dirPath);
42
+ const entries = await fs.readdir(absolutePath);
43
+ return entries;
44
+ }
45
+ catch (error) {
46
+ console.error(`[CLIFileSystemAdapter] Failed to read directory ${dirPath}:`, error);
47
+ return [];
48
+ }
49
+ }
50
+ async isDirectory(filePath) {
51
+ try {
52
+ const absolutePath = path.isAbsolute(filePath)
53
+ ? filePath
54
+ : path.join(this.basePath, filePath);
55
+ const stats = await fs.stat(absolutePath);
56
+ return stats.isDirectory();
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ async buildFilteredFileTree(_directoryPath, _patterns, _sourceDirectory) {
63
+ return { paths: [] };
64
+ }
65
+ }
66
+ class RepositoryScanner {
67
+ constructor() {
68
+ this.packageModule = new codebase_composition_1.PackageLayerModule();
69
+ }
70
+ async extractPackages(fileTree, repoPath) {
71
+ try {
72
+ const adapter = new CLIFileSystemAdapter(repoPath);
73
+ const fileReader = async (filePath) => {
74
+ const result = await adapter.readFile(filePath);
75
+ return result?.content || '';
76
+ };
77
+ const packages = await this.packageModule.discoverPackages(fileTree, fileReader);
78
+ console.info(`[RepositoryScanner] Found ${packages.length} packages in ${repoPath}`);
79
+ return packages;
80
+ }
81
+ catch (error) {
82
+ console.error('[RepositoryScanner] Failed to extract packages:', error);
83
+ return [];
84
+ }
85
+ }
86
+ }
87
+ exports.RepositoryScanner = RepositoryScanner;
88
+ //# sourceMappingURL=RepositoryScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepositoryScanner.js","sourceRoot":"","sources":["../../src/scanner/RepositoryScanner.ts"],"names":[],"mappings":";;;;AAKA,6EAI4C;AAE5C,mDAA6B;AAC7B,wDAAkC;AAKlC,MAAM,oBAAoB;IACxB,YAAoB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAExC,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,IAAI,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,yCAAyC,QAAQ,GAAG,EACpD,KAAK,CACN,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvC,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC3C,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,mDAAmD,OAAO,GAAG,EAC7D,KAAK,CACN,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,qBAAqB,CACzB,cAAsB,EACtB,SAAoB,EACpB,gBAAyB;QAUzB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;CACF;AAED,MAAa,iBAAiB;IAG5B;QACE,IAAI,CAAC,aAAa,GAAG,IAAI,yCAAkB,EAAE,CAAC;IAChD,CAAC;IAQD,KAAK,CAAC,eAAe,CACnB,QAAkB,EAClB,QAAgB;QAEhB,IAAI,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAGnD,MAAM,UAAU,GAAG,KAAK,EAAE,QAAgB,EAAmB,EAAE;gBAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAChD,OAAO,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;YAC/B,CAAC,CAAC;YAGF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CACxD,QAAQ,EACR,UAAU,CACX,CAAC;YAEF,OAAO,CAAC,IAAI,CACV,6BAA6B,QAAQ,CAAC,MAAM,gBAAgB,QAAQ,EAAE,CACvE,CAAC;YAEF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AA3CD,8CA2CC"}
@@ -0,0 +1,40 @@
1
+ import { type LensResult } from '@principal-ai/codebase-quality-lenses';
2
+ import type { PackageCommand, PackageLayer } from '@principal-ai/codebase-composition';
3
+ export interface ToolExecutionRequest {
4
+ repoPath: string;
5
+ packageLayer?: PackageLayer;
6
+ packageCommand?: PackageCommand;
7
+ }
8
+ export interface ToolExecutionResponse {
9
+ success: boolean;
10
+ toolName: string;
11
+ command: string;
12
+ packagePath?: string;
13
+ exitCode: number;
14
+ duration: number;
15
+ stdout: string;
16
+ stderr: string;
17
+ lensResult?: LensResult;
18
+ qualityContext?: {
19
+ lensId?: string;
20
+ operation?: string;
21
+ availableLenses?: string[];
22
+ missingLenses?: string[];
23
+ };
24
+ error?: string;
25
+ }
26
+ export declare class QualityLensService {
27
+ private executor;
28
+ private lenses;
29
+ constructor();
30
+ private initializeLenses;
31
+ executeTool(request: ToolExecutionRequest): Promise<ToolExecutionResponse>;
32
+ private executeWithPackageLayer;
33
+ private executeNonLensCommand;
34
+ private parseCommandString;
35
+ private determineLensSuccess;
36
+ private createErrorResponse;
37
+ getAvailableLenses(): string[];
38
+ hasLensForTool(toolName: string): boolean;
39
+ }
40
+ //# sourceMappingURL=QualityLensService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityLensService.d.ts","sourceRoot":"","sources":["../../src/service/QualityLensService.ts"],"names":[],"mappings":"AAKA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAKD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAoB;;IAclC,OAAO,CAAC,gBAAgB;IA6BX,WAAW,CACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;YAgBnB,uBAAuB;YAgGvB,qBAAqB;IAwCnC,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,oBAAoB;IAqC5B,OAAO,CAAC,mBAAmB;IAuBpB,kBAAkB,IAAI,MAAM,EAAE;IAO9B,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGjD"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QualityLensService = void 0;
4
+ const codebase_quality_lenses_1 = require("@principal-ai/codebase-quality-lenses");
5
+ const NodeExecutor_1 = require("../executor/NodeExecutor");
6
+ class QualityLensService {
7
+ constructor() {
8
+ this.executor = new NodeExecutor_1.NodeExecutor();
9
+ this.lenses = new Map();
10
+ this.initializeLenses();
11
+ }
12
+ initializeLenses() {
13
+ console.log('[QualityLensService] Initializing lenses...');
14
+ const eslintLens = new codebase_quality_lenses_1.ESLintLens(this.executor);
15
+ this.lenses.set('eslint', eslintLens);
16
+ this.lenses.set('lint', eslintLens);
17
+ const jestLens = new codebase_quality_lenses_1.JestLens(this.executor);
18
+ this.lenses.set('jest', jestLens);
19
+ this.lenses.set('test', jestLens);
20
+ const typescriptLens = new codebase_quality_lenses_1.TypeScriptLens(this.executor);
21
+ this.lenses.set('typescript', typescriptLens);
22
+ this.lenses.set('typecheck', typescriptLens);
23
+ this.lenses.set('tsc', typescriptLens);
24
+ const knipLens = new codebase_quality_lenses_1.KnipLens(this.executor);
25
+ this.lenses.set('knip', knipLens);
26
+ this.lenses.set('deadcode', knipLens);
27
+ const gitLens = new codebase_quality_lenses_1.GitLens(this.executor);
28
+ this.lenses.set('git', gitLens);
29
+ }
30
+ async executeTool(request) {
31
+ const startTime = Date.now();
32
+ if (!request.packageLayer || !request.packageCommand) {
33
+ throw new Error('packageLayer and packageCommand are required. Legacy execution has been removed.');
34
+ }
35
+ return this.executeWithPackageLayer(request, startTime);
36
+ }
37
+ async executeWithPackageLayer(request, startTime) {
38
+ const { repoPath, packageLayer, packageCommand } = request;
39
+ if (!packageLayer || !packageCommand) {
40
+ throw new Error('packageLayer and packageCommand are required for new execution path');
41
+ }
42
+ const packagePath = packageLayer.packageData.path || '';
43
+ const cwd = packagePath ? `${repoPath}/${packagePath}` : repoPath;
44
+ if (!packageCommand.isLensCommand || !packageCommand.lensId) {
45
+ console.log(`[QualityLensService] Not a lens command, executing directly: ${packageCommand.name}`);
46
+ return this.executeNonLensCommand(request, packageCommand, cwd, startTime);
47
+ }
48
+ const lens = this.lenses.get(packageCommand.lensId);
49
+ if (!lens) {
50
+ console.warn(`[QualityLensService] No lens registered for: ${packageCommand.lensId}`);
51
+ return this.executeNonLensCommand(request, packageCommand, cwd, startTime);
52
+ }
53
+ console.log(`[QualityLensService] Using ${lens.name} for command: ${packageCommand.name} (lensId: ${packageCommand.lensId})`);
54
+ try {
55
+ const { command, args } = this.parseCommandString(packageCommand.command);
56
+ lens.configure({
57
+ cwd,
58
+ tool: {
59
+ name: packageCommand.lensId,
60
+ command,
61
+ args,
62
+ cwd,
63
+ available: true,
64
+ },
65
+ });
66
+ const lensResult = await lens.run();
67
+ const { success, exitCode } = this.determineLensSuccess(lensResult);
68
+ return {
69
+ success,
70
+ toolName: packageCommand.lensId,
71
+ command: packageCommand.command,
72
+ packagePath,
73
+ exitCode,
74
+ duration: Date.now() - startTime,
75
+ stdout: lensResult.raw?.stdout || '',
76
+ stderr: lensResult.raw?.stderr || lensResult.error?.message || '',
77
+ lensResult,
78
+ qualityContext: {
79
+ lensId: packageCommand.lensId,
80
+ operation: packageCommand.lensOperation,
81
+ availableLenses: packageLayer.qualityMetrics?.availableLenses,
82
+ missingLenses: packageLayer.qualityMetrics?.missingLenses,
83
+ },
84
+ };
85
+ }
86
+ catch (error) {
87
+ console.error(`[QualityLensService] Error:`, error);
88
+ return this.createErrorResponse(packageCommand.lensId || packageCommand.name, packageCommand.command, packagePath, error, startTime);
89
+ }
90
+ }
91
+ async executeNonLensCommand(request, packageCommand, cwd, startTime) {
92
+ const { command, args } = this.parseCommandString(packageCommand.command);
93
+ try {
94
+ const result = await this.executor.execute(command, args, { cwd });
95
+ return {
96
+ success: result.exitCode === 0,
97
+ toolName: packageCommand.name,
98
+ command: packageCommand.command,
99
+ packagePath: request.packageLayer?.packageData.path,
100
+ exitCode: result.exitCode,
101
+ duration: Date.now() - startTime,
102
+ stdout: result.stdout,
103
+ stderr: result.stderr,
104
+ };
105
+ }
106
+ catch (error) {
107
+ return this.createErrorResponse(packageCommand.name, packageCommand.command, request.packageLayer?.packageData.path, error, startTime);
108
+ }
109
+ }
110
+ parseCommandString(commandString) {
111
+ if (commandString.startsWith('npm run ')) {
112
+ const parts = commandString.split(' ');
113
+ return { command: 'npm', args: ['run', ...parts.slice(2)] };
114
+ }
115
+ if (commandString.startsWith('yarn ')) {
116
+ const parts = commandString.split(' ');
117
+ return { command: 'yarn', args: parts.slice(1) };
118
+ }
119
+ if (commandString.startsWith('pnpm ')) {
120
+ const parts = commandString.split(' ');
121
+ return { command: 'pnpm', args: parts.slice(1) };
122
+ }
123
+ const parts = commandString.split(' ');
124
+ return { command: parts[0] || '', args: parts.slice(1) };
125
+ }
126
+ determineLensSuccess(lensResult) {
127
+ let exitCode = 0;
128
+ let success = true;
129
+ if (lensResult.raw?.exitCode !== undefined) {
130
+ exitCode = lensResult.raw.exitCode;
131
+ success = exitCode === 0;
132
+ }
133
+ else if (lensResult.error) {
134
+ exitCode = 1;
135
+ success = false;
136
+ }
137
+ else if (lensResult.metrics?.issuesBySeverity?.error &&
138
+ lensResult.metrics.issuesBySeverity.error > 0) {
139
+ exitCode = 1;
140
+ success = false;
141
+ }
142
+ else {
143
+ success = lensResult.success !== false;
144
+ exitCode = success ? 0 : 1;
145
+ }
146
+ return { success, exitCode };
147
+ }
148
+ createErrorResponse(toolName, command, packagePath, error, startTime) {
149
+ return {
150
+ success: false,
151
+ toolName,
152
+ command,
153
+ packagePath,
154
+ exitCode: 1,
155
+ duration: Date.now() - startTime,
156
+ stdout: '',
157
+ stderr: error.message || 'Tool execution failed',
158
+ error: error.message,
159
+ };
160
+ }
161
+ getAvailableLenses() {
162
+ return Array.from(this.lenses.keys());
163
+ }
164
+ hasLensForTool(toolName) {
165
+ return this.lenses.has(toolName.toLowerCase());
166
+ }
167
+ }
168
+ exports.QualityLensService = QualityLensService;
169
+ //# sourceMappingURL=QualityLensService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityLensService.js","sourceRoot":"","sources":["../../src/service/QualityLensService.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@principal-ai/quality-lens-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for running quality lenses on codebases in CI/CD pipelines",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "quality-lens": "bin/quality-lens.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "watch": "tsc --watch",
13
+ "clean": "rm -rf dist",
14
+ "prepublishOnly": "npm run clean && npm run build",
15
+ "lint": "eslint . --ext .ts",
16
+ "lint:fix": "eslint . --ext .ts --fix",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "echo \"Error: no test specified\" && exit 1"
19
+ },
20
+ "keywords": [
21
+ "quality",
22
+ "linting",
23
+ "testing",
24
+ "typescript",
25
+ "eslint",
26
+ "jest",
27
+ "ci",
28
+ "cd",
29
+ "github-actions"
30
+ ],
31
+ "author": "Principal AI",
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@principal-ai/codebase-composition": "^0.2.8",
35
+ "@principal-ai/codebase-quality-lenses": "^0.1.7",
36
+ "@principal-ai/repository-abstraction": "^0.2.0",
37
+ "chalk": "^5.3.0",
38
+ "tslib": "^2.8.1",
39
+ "yargs": "^17.7.2"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.0.0",
43
+ "@types/yargs": "^17.0.32",
44
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
45
+ "@typescript-eslint/parser": "^6.0.0",
46
+ "eslint": "^8.0.0",
47
+ "typescript": "^5.0.0"
48
+ },
49
+ "optionalDependencies": {
50
+ "@types/pg": "^8.11.0",
51
+ "pg": "^8.11.0"
52
+ },
53
+ "engines": {
54
+ "node": ">=18.0.0"
55
+ },
56
+ "files": [
57
+ "dist",
58
+ "bin",
59
+ "README.md"
60
+ ]
61
+ }