@principal-ai/codebase-composition 0.2.24 → 0.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/helpers/QualityMetricsCalculator.d.ts +26 -7
  2. package/dist/helpers/QualityMetricsCalculator.d.ts.map +1 -1
  3. package/dist/helpers/QualityMetricsCalculator.js +129 -131
  4. package/dist/helpers/QualityMetricsCalculator.js.map +1 -1
  5. package/dist/helpers/WorkspaceCommandHelper.d.ts +140 -0
  6. package/dist/helpers/WorkspaceCommandHelper.d.ts.map +1 -0
  7. package/dist/helpers/WorkspaceCommandHelper.js +298 -0
  8. package/dist/helpers/WorkspaceCommandHelper.js.map +1 -0
  9. package/dist/helpers/packageLayerHelpers.d.ts.map +1 -1
  10. package/dist/helpers/packageLayerHelpers.js +50 -24
  11. package/dist/helpers/packageLayerHelpers.js.map +1 -1
  12. package/dist/index.d.ts +5 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +3 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/modules/PackageLayerModule.d.ts.map +1 -1
  17. package/dist/modules/PackageLayerModule.js +169 -3
  18. package/dist/modules/PackageLayerModule.js.map +1 -1
  19. package/dist/strategies/go-tools.d.ts +27 -0
  20. package/dist/strategies/go-tools.d.ts.map +1 -0
  21. package/dist/strategies/go-tools.js +185 -0
  22. package/dist/strategies/go-tools.js.map +1 -0
  23. package/dist/strategies/index.d.ts +37 -0
  24. package/dist/strategies/index.d.ts.map +1 -0
  25. package/dist/strategies/index.js +73 -0
  26. package/dist/strategies/index.js.map +1 -0
  27. package/dist/strategies/node-tools.d.ts +21 -0
  28. package/dist/strategies/node-tools.d.ts.map +1 -0
  29. package/dist/strategies/node-tools.js +142 -0
  30. package/dist/strategies/node-tools.js.map +1 -0
  31. package/dist/strategies/python-tools.d.ts +25 -0
  32. package/dist/strategies/python-tools.d.ts.map +1 -0
  33. package/dist/strategies/python-tools.js +192 -0
  34. package/dist/strategies/python-tools.js.map +1 -0
  35. package/dist/strategies/rust-tools.d.ts +23 -0
  36. package/dist/strategies/rust-tools.d.ts.map +1 -0
  37. package/dist/strategies/rust-tools.js +177 -0
  38. package/dist/strategies/rust-tools.js.map +1 -0
  39. package/dist/strategies/tool-detection.d.ts +137 -0
  40. package/dist/strategies/tool-detection.d.ts.map +1 -0
  41. package/dist/strategies/tool-detection.js +13 -0
  42. package/dist/strategies/tool-detection.js.map +1 -0
  43. package/package.json +2 -1
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { PackageCommand, QualityMetrics, LensOperation, ConfigFile } from '../types/layer-types';
5
5
  import { type LensReadiness } from '@principal-ai/codebase-quality-lenses';
6
+ import { type Ecosystem, type PackageData, type ToolAvailability, type InstallInstruction } from '../strategies';
6
7
  interface DetectedLens {
7
8
  lensId: string;
8
9
  operations: Set<LensOperation>;
@@ -48,18 +49,36 @@ export declare class QualityMetricsCalculator {
48
49
  missingLenses: string[];
49
50
  };
50
51
  /**
51
- * Calculate lens readiness for all known lenses
52
- * Checks package data against lens requirements
52
+ * Extended lens readiness result with ecosystem-aware install instructions
53
53
  */
54
- static calculateLensReadiness(dependencies: Record<string, string>, devDependencies: Record<string, string>, commands: PackageCommand[], configFiles?: Record<string, ConfigFile | undefined>): Record<string, LensReadiness>;
54
+ static calculateLensReadiness(packageType: 'package' | 'node' | 'python' | 'cargo' | 'go', packageData: PackageData, configFiles: Record<string, ConfigFile | undefined>, lensIds?: string[]): Record<string, LensReadinessExtended>;
55
55
  /**
56
- * Check requirements for a single lens
56
+ * Get install instructions for a tool in a specific ecosystem
57
57
  */
58
- private static checkLensRequirements;
58
+ static getToolInstallInstructions(toolId: string, packageType: 'package' | 'node' | 'python' | 'cargo' | 'go', packageManager?: string): InstallInstruction;
59
59
  /**
60
- * Check if a file path matches a config pattern
60
+ * Check if a tool is available in a package using ecosystem-specific detection
61
61
  */
62
- private static matchesConfigPattern;
62
+ static checkToolAvailability(toolId: string, packageType: 'package' | 'node' | 'python' | 'cargo' | 'go', packageData: PackageData, configFiles: Record<string, ConfigFile | undefined>): ToolAvailability;
63
+ /**
64
+ * Get the default command to run a tool
65
+ */
66
+ static getToolDefaultCommand(toolId: string, packageType: 'package' | 'node' | 'python' | 'cargo' | 'go'): string;
67
+ }
68
+ /**
69
+ * Extended lens readiness with ecosystem-specific information
70
+ */
71
+ export interface LensReadinessExtended extends LensReadiness {
72
+ /** The ecosystem this tool belongs to */
73
+ ecosystem: Ecosystem;
74
+ /** Detailed tool availability information */
75
+ toolAvailability: ToolAvailability;
76
+ /** Ecosystem-appropriate install instructions */
77
+ installInstructions: InstallInstruction;
78
+ /** Default command to run the tool */
79
+ defaultCommand: string;
80
+ /** Whether this is a built-in toolchain tool */
81
+ isToolchainTool: boolean;
63
82
  }
64
83
  export {};
65
84
  //# sourceMappingURL=QualityMetricsCalculator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QualityMetricsCalculator.d.ts","sourceRoot":"","sources":["../../src/helpers/QualityMetricsCalculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,uCAAuC,CAAC;AAwF/C,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;CAChC;AAED,qBAAa,wBAAwB;IACnC;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAoChF;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAW1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAkCrC;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CACrB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACzC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC;IAkB1B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE;IAI9E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE;IAK5E;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAC5B,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;IAclC;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,GACnD,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAgBhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA0GpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAapC"}
1
+ {"version":3,"file":"QualityMetricsCalculator.d.ts","sourceRoot":"","sources":["../../src/helpers/QualityMetricsCalculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,uCAAuC,CAAC;AAM/C,OAAO,EACL,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAGxB,MAAM,eAAe,CAAC;AAwGvB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;CAChC;AAED,qBAAa,wBAAwB;IACnC;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAoChF;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAW1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAoCrC;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CACrB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACzC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC;IAkB1B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE;IAI9E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE;IAK5E;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAC5B,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;IAkBlC;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAC3B,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,EAC3D,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,EACnD,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAyExC;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,EAC3D,cAAc,CAAC,EAAE,MAAM,GACtB,kBAAkB;IAMrB;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,EAC3D,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,GAClD,gBAAgB;IAMnB;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAC1D,MAAM;CAKV;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC;IAErB,6CAA6C;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,iDAAiD;IACjD,mBAAmB,EAAE,kBAAkB,CAAC;IAExC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IAEvB,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAC;CAC1B"}
@@ -2,35 +2,26 @@
2
2
  * Calculate quality metrics from lens commands
3
3
  */
4
4
  import { ALL_LENS_REQUIREMENTS, } from '@principal-ai/codebase-quality-lenses';
5
+ import { getLensDisplayName, getHexagonMetricForCategory, LENS_REGISTRY, } from '@principal-ai/quality-lens-registry';
6
+ import { getToolDetectionStrategy, packageTypeToEcosystem, } from '../strategies/index.js';
7
+ /**
8
+ * Build lens-to-metric map from registry
9
+ */
10
+ function buildLensToMetricMap() {
11
+ const map = {};
12
+ // Build from registry
13
+ for (const lens of LENS_REGISTRY) {
14
+ const hexagonKey = getHexagonMetricForCategory(lens.category);
15
+ if (hexagonKey) {
16
+ map[lens.id] = hexagonKey;
17
+ }
18
+ }
19
+ // Alias for generic 'test' script name
20
+ map['test'] = 'tests';
21
+ return map;
22
+ }
5
23
  // Standard lens IDs and their corresponding hexagon metrics
6
- const LENS_TO_METRIC_MAP = {
7
- // Linting tools
8
- 'eslint': 'linting',
9
- 'biome': 'linting',
10
- 'biome-lint': 'linting',
11
- 'oxlint': 'linting',
12
- // Type checking tools
13
- 'typescript': 'types',
14
- 'flow': 'types',
15
- // Testing tools
16
- 'test': 'tests',
17
- 'jest': 'tests',
18
- 'vitest': 'tests',
19
- 'bun-test': 'tests',
20
- 'mocha': 'tests',
21
- 'playwright': 'tests',
22
- 'cypress': 'tests',
23
- // Formatting tools
24
- 'prettier': 'formatting',
25
- 'biome-format': 'formatting',
26
- // Dead code detection
27
- 'knip': 'deadCode',
28
- 'depcheck': 'deadCode',
29
- // Documentation
30
- 'typedoc': 'documentation',
31
- 'jsdoc': 'documentation',
32
- 'alexandria': 'documentation',
33
- };
24
+ const LENS_TO_METRIC_MAP = buildLensToMetricMap();
34
25
  // Patterns to detect specific tools from script content
35
26
  // Maps regex patterns to lens IDs
36
27
  const SCRIPT_CONTENT_PATTERNS = [
@@ -44,25 +35,48 @@ const SCRIPT_CONTENT_PATTERNS = [
44
35
  { pattern: /\bvitest\b/, lensId: 'vitest' },
45
36
  // Jest
46
37
  { pattern: /\bjest\b/, lensId: 'jest' },
38
+ // Python tools
39
+ { pattern: /\bruff\s+(check|lint)\b/, lensId: 'ruff' },
40
+ { pattern: /\bruff\s+format\b/, lensId: 'ruff-format' },
41
+ { pattern: /\bmypy\b/, lensId: 'mypy' },
42
+ { pattern: /\bpytest\b/, lensId: 'pytest' },
43
+ { pattern: /\bpython\s+-m\s+pytest\b/, lensId: 'pytest' },
44
+ { pattern: /\bblack\b/, lensId: 'black' },
45
+ { pattern: /\bisort\b/, lensId: 'isort' },
46
+ { pattern: /\bflake8\b/, lensId: 'flake8' },
47
+ { pattern: /\bpylint\b/, lensId: 'pylint' },
48
+ { pattern: /\bpyright\b/, lensId: 'pyright' },
47
49
  ];
48
50
  // Standard lenses we expect to find
49
51
  const STANDARD_LENSES = ['eslint', 'typescript', 'test', 'prettier', 'knip', 'typedoc', 'alexandria'];
50
52
  // Fallback patterns for common script names
51
53
  const SCRIPT_TO_LENS_MAP = {
52
- // Linting
54
+ // Linting (JavaScript/TypeScript)
53
55
  'lint': 'eslint',
54
56
  'eslint': 'eslint',
55
- // Type checking
57
+ // Linting (Python)
58
+ 'ruff': 'ruff',
59
+ 'flake8': 'flake8',
60
+ 'pylint': 'pylint',
61
+ // Type checking (JavaScript/TypeScript)
56
62
  'typecheck': 'typescript',
57
63
  'type-check': 'typescript',
58
64
  'tsc': 'typescript',
59
- // Testing
65
+ // Type checking (Python)
66
+ 'mypy': 'mypy',
67
+ 'pyright': 'pyright',
68
+ // Testing (JavaScript/TypeScript)
60
69
  'test': 'test',
61
70
  'jest': 'jest',
62
71
  'vitest': 'vitest',
63
- // Formatting
72
+ // Testing (Python)
73
+ 'pytest': 'pytest',
74
+ // Formatting (JavaScript/TypeScript)
64
75
  'format': 'prettier',
65
76
  'prettier': 'prettier',
77
+ // Formatting (Python)
78
+ 'black': 'black',
79
+ 'isort': 'isort',
66
80
  // Dead code
67
81
  'knip': 'knip',
68
82
  'unused': 'knip',
@@ -128,7 +142,9 @@ export class QualityMetricsCalculator {
128
142
  let lensId = this.detectLensFromScriptContent(command.description);
129
143
  // Fall back to script name mapping
130
144
  if (!lensId) {
131
- lensId = SCRIPT_TO_LENS_MAP[command.name] || null;
145
+ // Try exact match first, then base name (before colon suffix like :ci, :coverage)
146
+ const baseName = command.name.split(':')[0];
147
+ lensId = SCRIPT_TO_LENS_MAP[command.name] || SCRIPT_TO_LENS_MAP[baseName] || null;
132
148
  }
133
149
  if (lensId) {
134
150
  if (!detectedLenses.has(lensId)) {
@@ -197,116 +213,98 @@ export class QualityMetricsCalculator {
197
213
  missingLenses
198
214
  };
199
215
  }
216
+ // ============================================================================
217
+ // Strategy-based tool detection (multi-ecosystem support)
218
+ // ============================================================================
200
219
  /**
201
- * Calculate lens readiness for all known lenses
202
- * Checks package data against lens requirements
220
+ * Extended lens readiness result with ecosystem-aware install instructions
203
221
  */
204
- static calculateLensReadiness(dependencies, devDependencies, commands, configFiles) {
222
+ static calculateLensReadiness(packageType, packageData, configFiles, lensIds) {
223
+ const ecosystem = packageTypeToEcosystem(packageType);
224
+ const strategy = getToolDetectionStrategy(ecosystem);
205
225
  const result = {};
206
- for (const [lensId, requirements] of Object.entries(ALL_LENS_REQUIREMENTS)) {
207
- result[lensId] = this.checkLensRequirements(requirements, dependencies, devDependencies, commands, configFiles);
208
- }
209
- return result;
210
- }
211
- /**
212
- * Check requirements for a single lens
213
- */
214
- static checkLensRequirements(requirements, dependencies, devDependencies, commands, configFiles) {
215
- const checks = [];
216
- const missing = [];
217
- const allDeps = { ...dependencies, ...devDependencies };
218
- // Check devDependencies
219
- for (const req of requirements.devDependencies) {
220
- const version = devDependencies[req.name] || dependencies[req.name];
221
- const satisfied = !!version;
226
+ // Get tools to check - either specified or all from ALL_LENS_REQUIREMENTS
227
+ const toolsToCheck = lensIds ?? Object.keys(ALL_LENS_REQUIREMENTS);
228
+ for (const lensId of toolsToCheck) {
229
+ const availability = strategy.detectToolAvailability(lensId, packageData, configFiles);
230
+ const installInstructions = strategy.getInstallInstructions(lensId, packageData.packageManager);
231
+ const defaultCommand = strategy.getDefaultCommand(lensId);
232
+ const isToolchain = strategy.isToolchainTool(lensId);
233
+ // Build checks array from availability
234
+ const checks = [];
235
+ // Check for tool installation
222
236
  checks.push({
223
- requirement: req,
224
- satisfied,
225
- foundValue: version,
226
- });
227
- if (!satisfied && req.critical !== false) {
228
- missing.push(req);
229
- }
230
- }
231
- // Check scripts - strict matching by script name only
232
- // The commandPattern is used for validation, not discovery
233
- for (const req of requirements.scripts) {
234
- const matchingCommand = commands.find(cmd => {
235
- // Only match by exact script name
236
- return cmd.name === req.name;
237
+ requirement: {
238
+ type: 'devDependency',
239
+ name: lensId,
240
+ critical: true,
241
+ },
242
+ satisfied: availability.installed,
243
+ foundValue: availability.version,
237
244
  });
238
- const satisfied = !!matchingCommand;
245
+ // Check for configuration
239
246
  checks.push({
240
- requirement: req,
241
- satisfied,
242
- foundValue: matchingCommand?.description || matchingCommand?.command,
247
+ requirement: {
248
+ type: 'config',
249
+ name: `${lensId} config`,
250
+ critical: false,
251
+ },
252
+ satisfied: availability.configured,
253
+ foundValue: configFiles[lensId]?.path,
243
254
  });
244
- if (!satisfied && req.critical !== false) {
245
- missing.push(req);
255
+ // Determine missing requirements
256
+ const missing = [];
257
+ if (!availability.installed && !isToolchain) {
258
+ missing.push({
259
+ type: 'devDependency',
260
+ name: lensId,
261
+ critical: true,
262
+ suggestedFix: installInstructions.command,
263
+ });
246
264
  }
265
+ // Overall readiness
266
+ const ready = availability.installed || isToolchain;
267
+ const partial = !ready && availability.configured;
268
+ result[lensId] = {
269
+ lensId,
270
+ displayName: getLensDisplayName(lensId) ?? lensId,
271
+ ready,
272
+ partial,
273
+ checks,
274
+ missing,
275
+ // Extended fields
276
+ ecosystem,
277
+ toolAvailability: availability,
278
+ installInstructions,
279
+ defaultCommand,
280
+ isToolchainTool: isToolchain,
281
+ };
247
282
  }
248
- // Check config files
249
- for (const req of requirements.configs) {
250
- let satisfied = false;
251
- let foundValue;
252
- // Check against configFiles object
253
- if (configFiles) {
254
- // Try the primary config name (e.g., 'eslint' for eslint.config.js)
255
- const lensConfigKey = requirements.lensId;
256
- const configFile = configFiles[lensConfigKey];
257
- if (configFile?.exists) {
258
- satisfied = true;
259
- foundValue = configFile.path;
260
- }
261
- // Check alternatives if not found
262
- if (!satisfied && req.alternatives) {
263
- for (const alt of req.alternatives) {
264
- // Check if any config file matches the alternative pattern
265
- for (const [, cf] of Object.entries(configFiles)) {
266
- if (cf?.exists && cf.path && this.matchesConfigPattern(cf.path, alt)) {
267
- satisfied = true;
268
- foundValue = cf.path;
269
- break;
270
- }
271
- }
272
- if (satisfied)
273
- break;
274
- }
275
- }
276
- }
277
- checks.push({
278
- requirement: req,
279
- satisfied,
280
- foundValue,
281
- });
282
- if (!satisfied && req.critical !== false) {
283
- missing.push(req);
284
- }
285
- }
286
- // Determine overall readiness
287
- const criticalMissing = missing.filter(m => m.critical !== false);
288
- const ready = criticalMissing.length === 0;
289
- const partial = !ready && checks.some(c => c.satisfied);
290
- return {
291
- lensId: requirements.lensId,
292
- displayName: requirements.displayName,
293
- ready,
294
- partial,
295
- checks,
296
- missing,
297
- };
283
+ return result;
298
284
  }
299
285
  /**
300
- * Check if a file path matches a config pattern
286
+ * Get install instructions for a tool in a specific ecosystem
301
287
  */
302
- static matchesConfigPattern(filePath, pattern) {
303
- const fileName = filePath.split('/').pop() || filePath;
304
- // Handle glob-like patterns
305
- if (pattern.includes('*')) {
306
- const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
307
- return regex.test(fileName);
308
- }
309
- return fileName === pattern;
288
+ static getToolInstallInstructions(toolId, packageType, packageManager) {
289
+ const ecosystem = packageTypeToEcosystem(packageType);
290
+ const strategy = getToolDetectionStrategy(ecosystem);
291
+ return strategy.getInstallInstructions(toolId, packageManager);
292
+ }
293
+ /**
294
+ * Check if a tool is available in a package using ecosystem-specific detection
295
+ */
296
+ static checkToolAvailability(toolId, packageType, packageData, configFiles) {
297
+ const ecosystem = packageTypeToEcosystem(packageType);
298
+ const strategy = getToolDetectionStrategy(ecosystem);
299
+ return strategy.detectToolAvailability(toolId, packageData, configFiles);
300
+ }
301
+ /**
302
+ * Get the default command to run a tool
303
+ */
304
+ static getToolDefaultCommand(toolId, packageType) {
305
+ const ecosystem = packageTypeToEcosystem(packageType);
306
+ const strategy = getToolDetectionStrategy(ecosystem);
307
+ return strategy.getDefaultCommand(toolId);
310
308
  }
311
309
  }
312
310
  //# sourceMappingURL=QualityMetricsCalculator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QualityMetricsCalculator.js","sourceRoot":"","sources":["../../src/helpers/QualityMetricsCalculator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QualityMetricsCalculator.js","sourceRoot":"","sources":["../../src/helpers/QualityMetricsCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Workspace Command Helper
3
+ *
4
+ * Handles workspace-aware command execution for monorepos.
5
+ * Detects workspace commands, groups packages by workspace,
6
+ * and provides utilities for distributing results to packages.
7
+ *
8
+ * Supports:
9
+ * - Cargo workspaces (--workspace, --manifest-path)
10
+ * - npm/pnpm workspaces (--workspaces, -w, --recursive)
11
+ * - Yarn workspaces
12
+ */
13
+ import type { PackageLayer } from '../types/layer-types';
14
+ /**
15
+ * Ecosystem types for workspace detection
16
+ */
17
+ export type WorkspaceEcosystem = 'rust' | 'node' | 'python' | 'go';
18
+ /**
19
+ * Information about a workspace command
20
+ */
21
+ export interface WorkspaceCommandInfo {
22
+ /** Whether this command targets an entire workspace */
23
+ isWorkspaceCommand: boolean;
24
+ /**
25
+ * The workspace root directory extracted from the command
26
+ * e.g., "codex-rs" from "--manifest-path codex-rs/Cargo.toml"
27
+ */
28
+ workspaceRoot?: string;
29
+ /** The ecosystem this command belongs to */
30
+ ecosystem?: WorkspaceEcosystem;
31
+ }
32
+ /**
33
+ * A group of packages that belong to the same workspace
34
+ */
35
+ export interface WorkspaceGroup {
36
+ /** The workspace root directory (relative to repo root) */
37
+ workspaceRoot: string;
38
+ /** Path to the workspace manifest file */
39
+ manifestPath: string;
40
+ /** The ecosystem (rust, node, etc.) */
41
+ ecosystem: WorkspaceEcosystem;
42
+ /** Packages that are members of this workspace */
43
+ memberPackages: PackageLayer[];
44
+ /** The root package of the workspace (if it exists as a package) */
45
+ rootPackage?: PackageLayer;
46
+ }
47
+ /**
48
+ * Detect if a command is a workspace-wide command and extract workspace info.
49
+ *
50
+ * Detects:
51
+ * - Cargo: --workspace, --manifest-path
52
+ * - pnpm: -r, --recursive, -w, --workspace-root, --filter
53
+ * - npm: --workspaces, -ws
54
+ * - yarn: workspaces foreach
55
+ *
56
+ * @param command - The command being executed (e.g., "cargo", "pnpm")
57
+ * @param args - Command arguments as an array
58
+ * @returns WorkspaceCommandInfo with detection results
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * // Cargo workspace command
63
+ * detectWorkspaceCommand('cargo', ['clippy', '--manifest-path', 'codex-rs/Cargo.toml', '--workspace'])
64
+ * // => { isWorkspaceCommand: true, workspaceRoot: 'codex-rs', ecosystem: 'rust' }
65
+ *
66
+ * // pnpm recursive command
67
+ * detectWorkspaceCommand('pnpm', ['-r', 'run', 'lint'])
68
+ * // => { isWorkspaceCommand: true, ecosystem: 'node' }
69
+ *
70
+ * // Regular command (not workspace-wide)
71
+ * detectWorkspaceCommand('cargo', ['clippy'])
72
+ * // => { isWorkspaceCommand: false }
73
+ * ```
74
+ */
75
+ export declare function detectWorkspaceCommand(command: string, args: string[]): WorkspaceCommandInfo;
76
+ /**
77
+ * Group discovered packages by their workspace.
78
+ *
79
+ * Uses the package's `isWorkspace`, `parentPackage`, and `isMonorepoRoot`
80
+ * fields to determine workspace membership.
81
+ *
82
+ * @param packages - Array of discovered packages
83
+ * @returns Array of workspace groups
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const packages = await packageModule.discoverPackages(fileTree);
88
+ * const workspaceGroups = groupPackagesByWorkspace(packages);
89
+ *
90
+ * for (const group of workspaceGroups) {
91
+ * console.log(`Workspace: ${group.workspaceRoot}`);
92
+ * console.log(`Members: ${group.memberPackages.map(p => p.packageData.name)}`);
93
+ * }
94
+ * ```
95
+ */
96
+ export declare function groupPackagesByWorkspace(packages: PackageLayer[]): WorkspaceGroup[];
97
+ /**
98
+ * Match a file path to its package within a workspace.
99
+ *
100
+ * Used to distribute lens results to the correct packages.
101
+ * Takes a file path (relative to workspace root) and finds
102
+ * which package it belongs to.
103
+ *
104
+ * @param filePath - File path relative to workspace root (e.g., "protocol/src/lib.rs")
105
+ * @param workspaceRoot - Workspace root directory (e.g., "codex-rs")
106
+ * @param packages - Array of packages to search
107
+ * @returns The matching package, or undefined if not found
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * // Clippy outputs: "protocol/src/lib.rs" (relative to codex-rs/)
112
+ * // We need to find which package this belongs to
113
+ *
114
+ * const pkg = matchPathToPackage(
115
+ * 'protocol/src/lib.rs',
116
+ * 'codex-rs',
117
+ * packages
118
+ * );
119
+ * // => PackageLayer for "codex-rs/protocol"
120
+ * ```
121
+ */
122
+ export declare function matchPathToPackage(filePath: string, workspaceRoot: string, packages: PackageLayer[]): PackageLayer | undefined;
123
+ /**
124
+ * Prefix a file path with the workspace root.
125
+ *
126
+ * Utility function to convert paths from workspace-relative
127
+ * to repo-relative.
128
+ *
129
+ * @param filePath - File path relative to workspace root
130
+ * @param workspaceRoot - Workspace root directory
131
+ * @returns Full path relative to repo root
132
+ *
133
+ * @example
134
+ * ```ts
135
+ * prefixWithWorkspaceRoot('protocol/src/lib.rs', 'codex-rs')
136
+ * // => 'codex-rs/protocol/src/lib.rs'
137
+ * ```
138
+ */
139
+ export declare function prefixWithWorkspaceRoot(filePath: string, workspaceRoot: string): string;
140
+ //# sourceMappingURL=WorkspaceCommandHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceCommandHelper.d.ts","sourceRoot":"","sources":["../../src/helpers/WorkspaceCommandHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,kDAAkD;IAClD,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,oEAAoE;IACpE,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACb,oBAAoB,CA4FtB;AA2BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAoDnF;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,YAAY,EAAE,GACvB,YAAY,GAAG,SAAS,CA2B1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,MAAM,CAWR"}