@principal-ai/codebase-composition 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.
Files changed (129) hide show
  1. package/README.md +67 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +23 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/modules/DependencyLayerModule.d.ts +44 -0
  7. package/dist/modules/DependencyLayerModule.d.ts.map +1 -0
  8. package/dist/modules/DependencyLayerModule.js +286 -0
  9. package/dist/modules/DependencyLayerModule.js.map +1 -0
  10. package/dist/modules/FileSystemModule.d.ts +30 -0
  11. package/dist/modules/FileSystemModule.d.ts.map +1 -0
  12. package/dist/modules/FileSystemModule.js +46 -0
  13. package/dist/modules/FileSystemModule.js.map +1 -0
  14. package/dist/modules/FileTypeLayerModule.d.ts +34 -0
  15. package/dist/modules/FileTypeLayerModule.d.ts.map +1 -0
  16. package/dist/modules/FileTypeLayerModule.js +169 -0
  17. package/dist/modules/FileTypeLayerModule.js.map +1 -0
  18. package/dist/modules/FrameworkLayerModule.d.ts +22 -0
  19. package/dist/modules/FrameworkLayerModule.d.ts.map +1 -0
  20. package/dist/modules/FrameworkLayerModule.js +388 -0
  21. package/dist/modules/FrameworkLayerModule.js.map +1 -0
  22. package/dist/modules/PackageLayerModule.d.ts +23 -0
  23. package/dist/modules/PackageLayerModule.d.ts.map +1 -0
  24. package/dist/modules/PackageLayerModule.js +810 -0
  25. package/dist/modules/PackageLayerModule.js.map +1 -0
  26. package/dist/modules/TypeExtractionModule.d.ts +37 -0
  27. package/dist/modules/TypeExtractionModule.d.ts.map +1 -0
  28. package/dist/modules/TypeExtractionModule.js +180 -0
  29. package/dist/modules/TypeExtractionModule.js.map +1 -0
  30. package/dist/modules/VersionControlLayerModule.d.ts +10 -0
  31. package/dist/modules/VersionControlLayerModule.d.ts.map +1 -0
  32. package/dist/modules/VersionControlLayerModule.js +32 -0
  33. package/dist/modules/VersionControlLayerModule.js.map +1 -0
  34. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/index.d.ts +4 -0
  35. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/index.d.ts.map +1 -0
  36. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/index.js +7 -0
  37. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/index.js.map +1 -0
  38. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/category.d.ts +15 -0
  39. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/category.d.ts.map +1 -0
  40. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/category.js +3 -0
  41. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/category.js.map +1 -0
  42. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/product.d.ts +34 -0
  43. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/product.d.ts.map +1 -0
  44. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/product.js +23 -0
  45. package/dist/modules/__fixtures__/typescript-packages/complex-types/src/models/product.js.map +1 -0
  46. package/dist/modules/__fixtures__/typescript-packages/simple-types/index.d.ts +39 -0
  47. package/dist/modules/__fixtures__/typescript-packages/simple-types/index.d.ts.map +1 -0
  48. package/dist/modules/__fixtures__/typescript-packages/simple-types/index.js +39 -0
  49. package/dist/modules/__fixtures__/typescript-packages/simple-types/index.js.map +1 -0
  50. package/dist/modules/extractors/TypeScriptExtractor.d.ts +18 -0
  51. package/dist/modules/extractors/TypeScriptExtractor.d.ts.map +1 -0
  52. package/dist/modules/extractors/TypeScriptExtractor.js +361 -0
  53. package/dist/modules/extractors/TypeScriptExtractor.js.map +1 -0
  54. package/dist/modules/index.d.ts +13 -0
  55. package/dist/modules/index.d.ts.map +1 -0
  56. package/dist/modules/index.js +21 -0
  57. package/dist/modules/index.js.map +1 -0
  58. package/dist/providers/GitVersionControlProvider.d.ts +108 -0
  59. package/dist/providers/GitVersionControlProvider.d.ts.map +1 -0
  60. package/dist/providers/GitVersionControlProvider.js +380 -0
  61. package/dist/providers/GitVersionControlProvider.js.map +1 -0
  62. package/dist/providers/PackageManagerApiProvider.d.ts +78 -0
  63. package/dist/providers/PackageManagerApiProvider.d.ts.map +1 -0
  64. package/dist/providers/PackageManagerApiProvider.js +14 -0
  65. package/dist/providers/PackageManagerApiProvider.js.map +1 -0
  66. package/dist/providers/index.d.ts +4 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +10 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/services/FilesystemService.d.ts +59 -0
  71. package/dist/services/FilesystemService.d.ts.map +1 -0
  72. package/dist/services/FilesystemService.js +391 -0
  73. package/dist/services/FilesystemService.js.map +1 -0
  74. package/dist/services/index.d.ts +2 -0
  75. package/dist/services/index.d.ts.map +1 -0
  76. package/dist/services/index.js +7 -0
  77. package/dist/services/index.js.map +1 -0
  78. package/dist/types/file-system.d.ts +7 -0
  79. package/dist/types/file-system.d.ts.map +1 -0
  80. package/dist/types/file-system.js +7 -0
  81. package/dist/types/file-system.js.map +1 -0
  82. package/dist/types/index.d.ts +4 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +3 -0
  85. package/dist/types/index.js.map +1 -0
  86. package/dist/types/layer-types.d.ts +187 -0
  87. package/dist/types/layer-types.d.ts.map +1 -0
  88. package/dist/types/layer-types.js +7 -0
  89. package/dist/types/layer-types.js.map +1 -0
  90. package/dist/types/version-control-layer.d.ts +53 -0
  91. package/dist/types/version-control-layer.d.ts.map +1 -0
  92. package/dist/types/version-control-layer.js +3 -0
  93. package/dist/types/version-control-layer.js.map +1 -0
  94. package/dist/types/workspace-boundaries.d.ts +17 -0
  95. package/dist/types/workspace-boundaries.d.ts.map +1 -0
  96. package/dist/types/workspace-boundaries.js +7 -0
  97. package/dist/types/workspace-boundaries.js.map +1 -0
  98. package/package.json +42 -0
  99. package/src/index.ts +62 -0
  100. package/src/modules/DependencyLayerModule.ts +329 -0
  101. package/src/modules/FileSystemModule.ts +65 -0
  102. package/src/modules/FileTypeLayerModule.ts +199 -0
  103. package/src/modules/FrameworkLayerModule.ts +437 -0
  104. package/src/modules/PackageLayerModule.ts +979 -0
  105. package/src/modules/TypeExtractionModule.test.ts +340 -0
  106. package/src/modules/TypeExtractionModule.ts +180 -0
  107. package/src/modules/VersionControlLayerModule.ts +31 -0
  108. package/src/modules/__fixtures__/typescript-packages/complex-types/package.json +6 -0
  109. package/src/modules/__fixtures__/typescript-packages/complex-types/src/index.ts +6 -0
  110. package/src/modules/__fixtures__/typescript-packages/complex-types/src/models/category.ts +15 -0
  111. package/src/modules/__fixtures__/typescript-packages/complex-types/src/models/product.ts +48 -0
  112. package/src/modules/__fixtures__/typescript-packages/javascript-only/index.js +18 -0
  113. package/src/modules/__fixtures__/typescript-packages/javascript-only/package.json +5 -0
  114. package/src/modules/__fixtures__/typescript-packages/simple-types/index.ts +53 -0
  115. package/src/modules/__fixtures__/typescript-packages/simple-types/package.json +6 -0
  116. package/src/modules/extractors/README.md +55 -0
  117. package/src/modules/extractors/TypeScriptExtractor.ts +409 -0
  118. package/src/modules/index.ts +13 -0
  119. package/src/providers/GitVersionControlProvider.ts +500 -0
  120. package/src/providers/PackageManagerApiProvider.ts +108 -0
  121. package/src/providers/README.md +88 -0
  122. package/src/providers/index.ts +17 -0
  123. package/src/services/FilesystemService.ts +530 -0
  124. package/src/services/index.ts +2 -0
  125. package/src/types/file-system.ts +11 -0
  126. package/src/types/index.ts +24 -0
  127. package/src/types/layer-types.ts +264 -0
  128. package/src/types/version-control-layer.ts +87 -0
  129. package/src/types/workspace-boundaries.ts +17 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-types.d.ts","sourceRoot":"","sources":["../../src/types/layer-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Core layer type system
4
+ * Minimal types needed for FileTypeLayerModule
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=layer-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-types.js","sourceRoot":"","sources":["../../src/types/layer-types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,53 @@
1
+ import { BaseLayer, FilePattern } from './layer-types';
2
+ /**
3
+ * Version Control Layer - provides VCS-specific functionality
4
+ * including ignore patterns, tracked files, and VCS metadata
5
+ */
6
+ export interface VersionControlLayer extends BaseLayer {
7
+ type: 'version-control';
8
+ vcsData: {
9
+ system: 'git' | 'svn' | 'mercurial' | 'perforce' | 'unknown';
10
+ repositoryRoot: string;
11
+ remotes?: Array<{
12
+ name: string;
13
+ url: string;
14
+ type: 'fetch' | 'push' | 'both';
15
+ }>;
16
+ currentBranch?: string;
17
+ currentRevision?: string;
18
+ ignorePatterns: VersionControlIgnorePattern[];
19
+ status?: {
20
+ trackedFiles?: string[];
21
+ untrackedFiles?: string[];
22
+ modifiedFiles?: string[];
23
+ stagedFiles?: string[];
24
+ conflictedFiles?: string[];
25
+ };
26
+ };
27
+ }
28
+ /**
29
+ * Represents an ignore pattern from version control
30
+ */
31
+ export interface VersionControlIgnorePattern extends FilePattern {
32
+ source: string;
33
+ negated?: boolean;
34
+ directoryOnly?: boolean;
35
+ scope?: string;
36
+ }
37
+ /**
38
+ * Interface for version control providers
39
+ */
40
+ export interface VersionControlProvider {
41
+ detect(directoryPath: string): Promise<boolean>;
42
+ getRepositoryRoot(directoryPath: string): Promise<string | null>;
43
+ createLayer(repositoryRoot: string): Promise<VersionControlLayer>;
44
+ extractIgnorePatterns(repositoryRoot: string): Promise<VersionControlIgnorePattern[]>;
45
+ getCurrentBranch(repositoryRoot: string): Promise<string | null>;
46
+ getCurrentRevision(repositoryPath: string): Promise<string | null>;
47
+ getRemotes(repositoryRoot: string): Promise<Array<{
48
+ name: string;
49
+ url: string;
50
+ type: 'fetch' | 'push' | 'both';
51
+ }>>;
52
+ }
53
+ //# sourceMappingURL=version-control-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-control-layer.d.ts","sourceRoot":"","sources":["../../src/types/version-control-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,iBAAiB,CAAC;IAExB,OAAO,EAAE;QAEP,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;QAG7D,cAAc,EAAE,MAAM,CAAC;QAGvB,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;SACjC,CAAC,CAAC;QAGH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QAGzB,cAAc,EAAE,2BAA2B,EAAE,CAAC;QAG9C,MAAM,CAAC,EAAE;YACP,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;YACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;YAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;YACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;YACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,WAAW;IAE9D,MAAM,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAErC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGhD,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAGjE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAGlE,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAGtF,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjE,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAGnE,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CACzC,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;KACjC,CAAC,CACH,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=version-control-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-control-layer.js","sourceRoot":"","sources":["../../src/types/version-control-layer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Minimal workspace boundary type for backwards compatibility
3
+ * This is a stub - the full implementation can be added later if needed
4
+ */
5
+ export interface WorkspaceBoundary {
6
+ id: string;
7
+ name: string;
8
+ rootPath?: string;
9
+ packageJsonPath: string;
10
+ isRoot: boolean;
11
+ packageData?: {
12
+ name?: string;
13
+ version?: string;
14
+ workspaces?: string[];
15
+ };
16
+ }
17
+ //# sourceMappingURL=workspace-boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-boundaries.d.ts","sourceRoot":"","sources":["../../src/types/workspace-boundaries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal workspace boundary type for backwards compatibility
4
+ * This is a stub - the full implementation can be added later if needed
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=workspace-boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-boundaries.js","sourceRoot":"","sources":["../../src/types/workspace-boundaries.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@principal-ai/codebase-composition",
3
+ "version": "0.1.0",
4
+ "description": "Codebase decomposition into semantic layers",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "src",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "bun build:clean && bun build:ts",
15
+ "build:clean": "rm -rf dist",
16
+ "build:ts": "bun run tsc",
17
+ "dev": "bun run tsc --watch",
18
+ "test": "bun test",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@principal-ai/repository-abstraction": "^0.1.0",
23
+ "ignore": "^5.3.0",
24
+ "js-toml": "^1.0.0",
25
+ "pip-requirements-js": "^0.2.1",
26
+ "typescript": "^5.0.4"
27
+ },
28
+ "devDependencies": {
29
+ "@types/bun": "latest",
30
+ "@types/node": "^22.0.0"
31
+ },
32
+ "peerDependencies": {},
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/principal-ai/principle-md.git",
36
+ "directory": "packages/codebase-composition"
37
+ },
38
+ "publishConfig": {
39
+ "access": "restricted",
40
+ "registry": "https://registry.npmjs.org/"
41
+ }
42
+ }
package/src/index.ts ADDED
@@ -0,0 +1,62 @@
1
+ // Main export file for layers module
2
+
3
+ // Types
4
+ export type {
5
+ FilePattern,
6
+ FileSet,
7
+ BaseLayer,
8
+ PackageCommand,
9
+ ConfigFile,
10
+ PackageLayer,
11
+ FileSystemFilterLayer,
12
+ VersionControlLayer,
13
+ VersionControlIgnorePattern,
14
+ VersionControlProvider,
15
+ FileInfo,
16
+ DirectoryInfo,
17
+ FileTree,
18
+ FileSystemTree, // Alias for backward compatibility
19
+ ExtractedType,
20
+ PackageTypes,
21
+ TypeDefinitionLayer,
22
+ TypeExtractor,
23
+ } from './types';
24
+
25
+ // Modules
26
+ export {
27
+ FileTypeLayerModule,
28
+ PackageLayerModule,
29
+ VersionControlLayerFactory,
30
+ DependencyLayerModule,
31
+ FrameworkLayerModule,
32
+ FileSystemModule,
33
+ TypeExtractionModule,
34
+ } from './modules';
35
+ export type {
36
+ FileTypeInfo,
37
+ FileSystemModuleConfig,
38
+ FileSystemLoadResult,
39
+ TypeExtractionOptions,
40
+ TypeScriptExtractionOptions,
41
+ } from './modules';
42
+ export { TypeScriptExtractor } from './modules';
43
+
44
+ // Services
45
+ export { FilesystemService } from './services';
46
+
47
+ // Providers
48
+ export { GitVersionControlProvider, PackageManagerApiProvider } from './providers';
49
+ export type {
50
+ FileSystemAdapter,
51
+ GitAdapter,
52
+ ShellAdapter,
53
+ PackageManager,
54
+ PackageVersionInfo,
55
+ VersionCheckResult,
56
+ VulnerabilityInfo,
57
+ VulnerabilityCheckResult,
58
+ LicenseInfo,
59
+ LicenseCheckResult,
60
+ DependencyCheckProgress,
61
+ BatchCheckOptions,
62
+ } from './providers';
@@ -0,0 +1,329 @@
1
+ import { DependencyLayer, PackageLayer, FileSet } from '../types/layer-types';
2
+
3
+ interface DependencyInfo {
4
+ name: string;
5
+ versions: Map<string, Set<string>>; // version -> set of package names using it
6
+ isDev: Set<string>; // packages where it's a dev dependency
7
+ isPeer: Set<string>; // packages where it's a peer dependency
8
+ isProd: Set<string>; // packages where it's a production dependency
9
+ packagePaths: Map<string, string>; // package name -> path
10
+ }
11
+
12
+ export class DependencyLayerModule {
13
+ /**
14
+ * Create dependency layers from package layers
15
+ */
16
+ createDependencyLayers(packageLayers: PackageLayer[]): DependencyLayer[] {
17
+ const dependencyMap = new Map<string, DependencyInfo>();
18
+
19
+ // Collect all dependencies from all packages
20
+ packageLayers.forEach(packageLayer => {
21
+ const { dependencies, devDependencies, peerDependencies } = packageLayer.packageData;
22
+ const packageName = packageLayer.packageData.name;
23
+ const packagePath = packageLayer.packageData.path;
24
+
25
+ // Process production dependencies
26
+ Object.entries(dependencies).forEach(([depName, version]) => {
27
+ this.addDependency(dependencyMap, depName, version, packageName, packagePath, 'prod');
28
+ });
29
+
30
+ // Process dev dependencies
31
+ Object.entries(devDependencies).forEach(([depName, version]) => {
32
+ this.addDependency(dependencyMap, depName, version, packageName, packagePath, 'dev');
33
+ });
34
+
35
+ // Process peer dependencies
36
+ Object.entries(peerDependencies).forEach(([depName, version]) => {
37
+ this.addDependency(dependencyMap, depName, version, packageName, packagePath, 'peer');
38
+ });
39
+ });
40
+
41
+ // Convert to DependencyLayer array
42
+ const dependencyLayers: DependencyLayer[] = [];
43
+
44
+ dependencyMap.forEach((depInfo, depName) => {
45
+ // For each unique version of this dependency
46
+ depInfo.versions.forEach((packageNames, version) => {
47
+ const declaredIn = Array.from(packageNames);
48
+ const isDev = declaredIn.every(pkg => depInfo.isDev.has(pkg));
49
+ const isPeer = declaredIn.some(pkg => depInfo.isPeer.has(pkg));
50
+
51
+ // Create file patterns for all package.json files that declare this dependency
52
+ const patterns = declaredIn.map(pkgName => {
53
+ const path = depInfo.packagePaths.get(pkgName) || '.';
54
+ return {
55
+ type: 'exact' as const,
56
+ pattern: path === '.' ? 'package.json' : `${path}/package.json`,
57
+ description: `${pkgName} package manifest`,
58
+ };
59
+ });
60
+
61
+ // Create the source file set
62
+ const sourceFileSet: FileSet = {
63
+ id: `dep-source-${depName}-${version}`,
64
+ name: 'Package manifests',
65
+ patterns,
66
+ matchedFiles: patterns.map(p => p.pattern),
67
+ fileCount: patterns.length,
68
+ };
69
+
70
+ // Determine the dependency type for the ID
71
+ const depType = isPeer ? 'peer' : isDev ? 'dev' : 'prod';
72
+
73
+ const layer: DependencyLayer = {
74
+ id: `dependency-${depType}-${depName}-${version.replace(/[^a-zA-Z0-9]/g, '-')}`,
75
+ name: depName,
76
+ type: 'dependency',
77
+ enabled: false, // Dependencies are not enabled by default
78
+ derivedFrom: {
79
+ fileSets: [sourceFileSet],
80
+ derivationType: 'content',
81
+ description: `${depName}@${version} ${isPeer ? 'peer ' : ''}${isDev ? 'dev ' : ''}dependency`,
82
+ contentExtraction: {
83
+ method: 'parse',
84
+ parser: {
85
+ format: 'json',
86
+ paths: this.getJsonPaths(depName, isDev, isPeer, declaredIn, depInfo),
87
+ },
88
+ },
89
+ },
90
+ dependencyData: {
91
+ name: depName,
92
+ version,
93
+ isDev,
94
+ isPeer,
95
+ declaredIn: declaredIn.map(pkgName => {
96
+ // Find the package layer ID
97
+ const packageLayer = packageLayers.find(p => p.packageData.name === pkgName);
98
+ return packageLayer?.id || `package-${pkgName}`;
99
+ }),
100
+ sourceFile: sourceFileSet,
101
+ },
102
+ color: this.getDependencyColor(depName, isDev, isPeer),
103
+ icon: this.getDependencyIcon(depName),
104
+ pillar: 'foundationHealth',
105
+ };
106
+
107
+ dependencyLayers.push(layer);
108
+ });
109
+ });
110
+
111
+ // Sort by dependency name and version
112
+ return dependencyLayers.sort((a, b) => {
113
+ const nameCompare = a.name.localeCompare(b.name);
114
+ if (nameCompare !== 0) return nameCompare;
115
+ return a.dependencyData.version.localeCompare(b.dependencyData.version);
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Add a dependency to the map
121
+ */
122
+ private addDependency(
123
+ dependencyMap: Map<string, DependencyInfo>,
124
+ depName: string,
125
+ version: string,
126
+ packageName: string,
127
+ packagePath: string,
128
+ type: 'prod' | 'dev' | 'peer',
129
+ ): void {
130
+ if (!dependencyMap.has(depName)) {
131
+ dependencyMap.set(depName, {
132
+ name: depName,
133
+ versions: new Map(),
134
+ isDev: new Set(),
135
+ isPeer: new Set(),
136
+ isProd: new Set(),
137
+ packagePaths: new Map(),
138
+ });
139
+ }
140
+
141
+ const depInfo = dependencyMap.get(depName)!;
142
+
143
+ // Add version
144
+ if (!depInfo.versions.has(version)) {
145
+ depInfo.versions.set(version, new Set());
146
+ }
147
+ depInfo.versions.get(version)!.add(packageName);
148
+
149
+ // Track package path
150
+ depInfo.packagePaths.set(packageName, packagePath);
151
+
152
+ // Track dependency type
153
+ if (type === 'dev') {
154
+ depInfo.isDev.add(packageName);
155
+ } else if (type === 'peer') {
156
+ depInfo.isPeer.add(packageName);
157
+ } else {
158
+ depInfo.isProd.add(packageName);
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Get JSON paths for content extraction
164
+ */
165
+ private getJsonPaths(
166
+ depName: string,
167
+ isDev: boolean,
168
+ isPeer: boolean,
169
+ declaredIn: string[],
170
+ depInfo: DependencyInfo,
171
+ ): string[] {
172
+ const paths: string[] = [];
173
+
174
+ declaredIn.forEach(pkgName => {
175
+ if (depInfo.isProd.has(pkgName)) {
176
+ paths.push(`dependencies.${depName}`);
177
+ }
178
+ if (depInfo.isDev.has(pkgName)) {
179
+ paths.push(`devDependencies.${depName}`);
180
+ }
181
+ if (depInfo.isPeer.has(pkgName)) {
182
+ paths.push(`peerDependencies.${depName}`);
183
+ }
184
+ });
185
+
186
+ return paths;
187
+ }
188
+
189
+ /**
190
+ * Get color for dependency based on type and name
191
+ */
192
+ private getDependencyColor(name: string, isDev: boolean, isPeer: boolean): string {
193
+ // Special colors for common dependencies
194
+ const specialColors: Record<string, string> = {
195
+ react: '#61DAFB',
196
+ 'react-dom': '#61DAFB',
197
+ vue: '#4FC08D',
198
+ angular: '#DD0031',
199
+ typescript: '#3178C6',
200
+ webpack: '#8DD6F9',
201
+ vite: '#646CFF',
202
+ jest: '#C21325',
203
+ eslint: '#4B32C3',
204
+ prettier: '#F7B93E',
205
+ lodash: '#3492FF',
206
+ axios: '#5A29E4',
207
+ express: '#000000',
208
+ next: '#000000',
209
+ tailwindcss: '#06B6D4',
210
+ };
211
+
212
+ if (specialColors[name]) {
213
+ return specialColors[name];
214
+ }
215
+
216
+ // Default colors by type
217
+ if (isPeer) return '#FF6B6B'; // Red for peer deps
218
+ if (isDev) return '#FFA94D'; // Orange for dev deps
219
+ return '#40C057'; // Green for production deps
220
+ }
221
+
222
+ /**
223
+ * Get icon for dependency based on its name/type
224
+ */
225
+ private getDependencyIcon(name: string): string {
226
+ // Special icons for common dependency types
227
+ if (name.includes('react')) return 'atom';
228
+ if (name.includes('vue')) return 'triangle';
229
+ if (name.includes('angular')) return 'hexagon';
230
+ if (name.includes('test') || name.includes('jest') || name.includes('mocha'))
231
+ return 'test-tube';
232
+ if (name.includes('lint') || name.includes('eslint')) return 'check-circle';
233
+ if (name.includes('prettier')) return 'palette';
234
+ if (name.includes('webpack') || name.includes('rollup') || name.includes('parcel'))
235
+ return 'package';
236
+ if (name.includes('vite') || name.includes('esbuild')) return 'zap';
237
+ if (name.includes('typescript') || name.includes('ts-')) return 'file-code';
238
+ if (name.includes('css') || name.includes('style')) return 'palette';
239
+ if (name.includes('axios') || name.includes('fetch')) return 'download';
240
+ if (name.includes('express') || name.includes('koa') || name.includes('fastify'))
241
+ return 'server';
242
+ if (name.includes('database') || name.includes('mongo') || name.includes('postgres'))
243
+ return 'database';
244
+ if (name.includes('auth') || name.includes('jwt')) return 'lock';
245
+ if (name.includes('log') || name.includes('winston') || name.includes('pino'))
246
+ return 'file-text';
247
+ if (name.includes('cli') || name.includes('commander')) return 'terminal';
248
+ if (name.includes('crypto') || name.includes('bcrypt')) return 'shield';
249
+
250
+ // Default icon
251
+ return 'package-2';
252
+ }
253
+
254
+ /**
255
+ * Analyze dependency health and conflicts
256
+ */
257
+ analyzeDependencyHealth(dependencyLayers: DependencyLayer[]): {
258
+ duplicates: Array<{ name: string; versions: string[]; packages: Record<string, string> }>;
259
+ outdated: Array<{ name: string; version: string; latest?: string }>;
260
+ security: Array<{ name: string; severity: 'low' | 'medium' | 'high'; issue: string }>;
261
+ } {
262
+ const health = {
263
+ duplicates: [] as Array<{
264
+ name: string;
265
+ versions: string[];
266
+ packages: Record<string, string>;
267
+ }>,
268
+ outdated: [] as Array<{ name: string; version: string; latest?: string }>,
269
+ security: [] as Array<{ name: string; severity: 'low' | 'medium' | 'high'; issue: string }>,
270
+ };
271
+
272
+ // Group by dependency name
273
+ const depGroups = new Map<string, DependencyLayer[]>();
274
+ dependencyLayers.forEach(layer => {
275
+ const name = layer.dependencyData.name;
276
+ if (!depGroups.has(name)) {
277
+ depGroups.set(name, []);
278
+ }
279
+ depGroups.get(name)!.push(layer);
280
+ });
281
+
282
+ // Check for duplicates (multiple versions)
283
+ depGroups.forEach((layers, name) => {
284
+ if (layers.length > 1) {
285
+ const versions = new Set<string>();
286
+ const packages: Record<string, string> = {};
287
+
288
+ layers.forEach(layer => {
289
+ versions.add(layer.dependencyData.version);
290
+ // Get package names from declaredIn
291
+ layer.dependencyData.declaredIn.forEach((layerId: string) => {
292
+ // Extract package name from layer ID (e.g., "package-node-root" -> "root")
293
+ const pkgName = layerId.replace(/^package-[^-]+-/, '');
294
+ packages[pkgName] = layer.dependencyData.version;
295
+ });
296
+ });
297
+
298
+ if (versions.size > 1) {
299
+ health.duplicates.push({
300
+ name,
301
+ versions: Array.from(versions),
302
+ packages,
303
+ });
304
+ }
305
+ }
306
+ });
307
+
308
+ // Check for known security issues (simplified)
309
+ const knownIssues: Record<string, { severity: 'low' | 'medium' | 'high'; issue: string }> = {
310
+ minimist: {
311
+ severity: 'high',
312
+ issue: 'Prototype pollution vulnerability in versions < 1.2.6',
313
+ },
314
+ lodash: { severity: 'medium', issue: 'Multiple vulnerabilities in versions < 4.17.21' },
315
+ 'node-fetch': { severity: 'high', issue: 'Denial of service in versions < 2.6.7' },
316
+ };
317
+
318
+ depGroups.forEach((layers, name) => {
319
+ if (knownIssues[name]) {
320
+ health.security.push({
321
+ name,
322
+ ...knownIssues[name],
323
+ });
324
+ }
325
+ });
326
+
327
+ return health;
328
+ }
329
+ }
@@ -0,0 +1,65 @@
1
+ import { FileTree } from '@principal-ai/repository-abstraction';
2
+ import { FileSystemFilterLayer, BaseLayer } from '../types';
3
+
4
+ export interface FileSystemModuleConfig {
5
+ directoryPath: string;
6
+ buildFileSystemTree: (path: string, filters?: FileSystemFilterLayer[]) => Promise<FileTree>;
7
+ }
8
+
9
+ export interface FileSystemLoadResult {
10
+ fileSystemTree: FileTree;
11
+ filterLayers: FileSystemFilterLayer[];
12
+ warningLayers: BaseLayer[];
13
+ }
14
+
15
+ /**
16
+ * Module responsible for loading and filtering the filesystem tree
17
+ * Now simplified to use globby-based filtering
18
+ */
19
+ export class FileSystemModule {
20
+ private config: FileSystemModuleConfig;
21
+
22
+ constructor(config: FileSystemModuleConfig) {
23
+ this.config = config;
24
+ }
25
+
26
+ /**
27
+ * Load the filesystem tree using globby-based filtering
28
+ */
29
+ async loadFileSystemTree(): Promise<FileSystemLoadResult> {
30
+ const { directoryPath, buildFileSystemTree } = this.config;
31
+
32
+ if (!directoryPath || !buildFileSystemTree) {
33
+ throw new Error('Directory path and buildFileSystemTree function are required');
34
+ }
35
+
36
+ console.log('[FileSystemModule] Loading filesystem tree with globby...');
37
+
38
+ // Build filesystem tree (adapters handle .gitignore filtering via globby)
39
+ const fileSystemTree = await buildFileSystemTree(directoryPath, []);
40
+
41
+ console.log('[FileSystemModule] Tree loaded:', {
42
+ totalFiles: fileSystemTree?.allFiles?.length || 0,
43
+ totalDirectories: fileSystemTree?.allDirectories?.length || 0,
44
+ });
45
+
46
+ return {
47
+ fileSystemTree,
48
+ filterLayers: [], // No filter layers - globby handles everything
49
+ warningLayers: [],
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Get all package.json files from the filesystem tree
55
+ */
56
+ getPackageJsonFiles(fileSystemTree: FileTree): Array<{ path: string }> {
57
+ if (!fileSystemTree?.allFiles) {
58
+ return [];
59
+ }
60
+
61
+ return fileSystemTree.allFiles
62
+ .filter(file => file.path?.endsWith('package.json'))
63
+ .map(file => ({ path: file.path! }));
64
+ }
65
+ }