@codeledger/cli 0.6.7 → 0.6.9

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 (175) hide show
  1. package/dist/architecture-graph/dependency-scanner.d.ts +16 -0
  2. package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
  3. package/dist/architecture-graph/dependency-scanner.js +96 -0
  4. package/dist/architecture-graph/dependency-scanner.js.map +1 -0
  5. package/dist/architecture-graph/graph-builder.d.ts +70 -0
  6. package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
  7. package/dist/architecture-graph/graph-builder.js +231 -0
  8. package/dist/architecture-graph/graph-builder.js.map +1 -0
  9. package/dist/architecture-graph/index.d.ts +4 -0
  10. package/dist/architecture-graph/index.d.ts.map +1 -0
  11. package/dist/architecture-graph/index.js +7 -0
  12. package/dist/architecture-graph/index.js.map +1 -0
  13. package/dist/architecture-graph/service-scanner.d.ts +22 -0
  14. package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
  15. package/dist/architecture-graph/service-scanner.js +181 -0
  16. package/dist/architecture-graph/service-scanner.js.map +1 -0
  17. package/dist/commands/activate.d.ts.map +1 -1
  18. package/dist/commands/activate.js +16 -1
  19. package/dist/commands/activate.js.map +1 -1
  20. package/dist/commands/audit-export.d.ts +8 -0
  21. package/dist/commands/audit-export.d.ts.map +1 -0
  22. package/dist/commands/audit-export.js +190 -0
  23. package/dist/commands/audit-export.js.map +1 -0
  24. package/dist/commands/commit-msg.d.ts +58 -0
  25. package/dist/commands/commit-msg.d.ts.map +1 -0
  26. package/dist/commands/commit-msg.js +461 -0
  27. package/dist/commands/commit-msg.js.map +1 -0
  28. package/dist/commands/fix.d.ts +7 -0
  29. package/dist/commands/fix.d.ts.map +1 -0
  30. package/dist/commands/fix.js +107 -0
  31. package/dist/commands/fix.js.map +1 -0
  32. package/dist/commands/graph.d.ts +8 -0
  33. package/dist/commands/graph.d.ts.map +1 -0
  34. package/dist/commands/graph.js +29 -0
  35. package/dist/commands/graph.js.map +1 -0
  36. package/dist/commands/init.d.ts.map +1 -1
  37. package/dist/commands/init.js +14 -0
  38. package/dist/commands/init.js.map +1 -1
  39. package/dist/commands/intent.d.ts +3 -1
  40. package/dist/commands/intent.d.ts.map +1 -1
  41. package/dist/commands/intent.js +68 -2
  42. package/dist/commands/intent.js.map +1 -1
  43. package/dist/commands/learn.d.ts +8 -0
  44. package/dist/commands/learn.d.ts.map +1 -0
  45. package/dist/commands/learn.js +33 -0
  46. package/dist/commands/learn.js.map +1 -0
  47. package/dist/commands/pack.d.ts +12 -0
  48. package/dist/commands/pack.d.ts.map +1 -0
  49. package/dist/commands/pack.js +75 -0
  50. package/dist/commands/pack.js.map +1 -0
  51. package/dist/commands/pr-summary.d.ts +59 -0
  52. package/dist/commands/pr-summary.d.ts.map +1 -0
  53. package/dist/commands/pr-summary.js +524 -0
  54. package/dist/commands/pr-summary.js.map +1 -0
  55. package/dist/commands/serve.d.ts +13 -0
  56. package/dist/commands/serve.d.ts.map +1 -0
  57. package/dist/commands/serve.js +179 -0
  58. package/dist/commands/serve.js.map +1 -0
  59. package/dist/commands/session-cleanup.js +1 -0
  60. package/dist/commands/session-cleanup.js.map +1 -1
  61. package/dist/commands/session-summary.d.ts.map +1 -1
  62. package/dist/commands/session-summary.js +135 -3
  63. package/dist/commands/session-summary.js.map +1 -1
  64. package/dist/commands/setup-ci.d.ts +6 -4
  65. package/dist/commands/setup-ci.d.ts.map +1 -1
  66. package/dist/commands/setup-ci.js +228 -23
  67. package/dist/commands/setup-ci.js.map +1 -1
  68. package/dist/commands/verify.d.ts.map +1 -1
  69. package/dist/commands/verify.js +35 -3
  70. package/dist/commands/verify.js.map +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +127 -4
  73. package/dist/index.js.map +1 -1
  74. package/dist/intent/extractor.d.ts +15 -0
  75. package/dist/intent/extractor.d.ts.map +1 -0
  76. package/dist/intent/extractor.js +149 -0
  77. package/dist/intent/extractor.js.map +1 -0
  78. package/dist/intent/fetcher.d.ts +33 -0
  79. package/dist/intent/fetcher.d.ts.map +1 -0
  80. package/dist/intent/fetcher.js +364 -0
  81. package/dist/intent/fetcher.js.map +1 -0
  82. package/dist/intent/loader.d.ts +26 -0
  83. package/dist/intent/loader.d.ts.map +1 -0
  84. package/dist/intent/loader.js +80 -0
  85. package/dist/intent/loader.js.map +1 -0
  86. package/dist/intent/types.d.ts +33 -0
  87. package/dist/intent/types.d.ts.map +1 -0
  88. package/dist/intent/types.js +9 -0
  89. package/dist/intent/types.js.map +1 -0
  90. package/dist/project-config.d.ts +38 -0
  91. package/dist/project-config.d.ts.map +1 -0
  92. package/dist/project-config.js +206 -0
  93. package/dist/project-config.js.map +1 -0
  94. package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
  95. package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
  96. package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
  97. package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
  98. package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
  99. package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
  100. package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
  101. package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
  102. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
  103. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
  104. package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
  105. package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
  106. package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
  107. package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
  108. package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
  109. package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
  110. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
  111. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
  112. package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
  113. package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
  114. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
  115. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
  116. package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
  117. package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
  118. package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
  119. package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
  120. package/dist/review-intelligence/detectors/pack-rules.js +107 -0
  121. package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
  122. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
  123. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
  124. package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
  125. package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
  126. package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
  127. package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
  128. package/dist/review-intelligence/engine/ast-parser.js +266 -0
  129. package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
  130. package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
  131. package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
  132. package/dist/review-intelligence/engine/dataflow.js +115 -0
  133. package/dist/review-intelligence/engine/dataflow.js.map +1 -0
  134. package/dist/review-intelligence/engine/index.d.ts +7 -0
  135. package/dist/review-intelligence/engine/index.d.ts.map +1 -0
  136. package/dist/review-intelligence/engine/index.js +7 -0
  137. package/dist/review-intelligence/engine/index.js.map +1 -0
  138. package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
  139. package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
  140. package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
  141. package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
  142. package/dist/review-intelligence/fixes/index.d.ts +54 -0
  143. package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
  144. package/dist/review-intelligence/fixes/index.js +346 -0
  145. package/dist/review-intelligence/fixes/index.js.map +1 -0
  146. package/dist/review-intelligence/index.d.ts +4 -1
  147. package/dist/review-intelligence/index.d.ts.map +1 -1
  148. package/dist/review-intelligence/index.js +22 -3
  149. package/dist/review-intelligence/index.js.map +1 -1
  150. package/dist/review-intelligence/invariants.d.ts +15 -0
  151. package/dist/review-intelligence/invariants.d.ts.map +1 -1
  152. package/dist/review-intelligence/invariants.js +48 -4
  153. package/dist/review-intelligence/invariants.js.map +1 -1
  154. package/dist/review-intelligence/learning/index.d.ts +39 -0
  155. package/dist/review-intelligence/learning/index.d.ts.map +1 -0
  156. package/dist/review-intelligence/learning/index.js +265 -0
  157. package/dist/review-intelligence/learning/index.js.map +1 -0
  158. package/dist/review-intelligence/packs/index.d.ts +69 -0
  159. package/dist/review-intelligence/packs/index.d.ts.map +1 -0
  160. package/dist/review-intelligence/packs/index.js +168 -0
  161. package/dist/review-intelligence/packs/index.js.map +1 -0
  162. package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
  163. package/dist/review-intelligence/repair-guidance.js +46 -0
  164. package/dist/review-intelligence/repair-guidance.js.map +1 -1
  165. package/dist/review-intelligence/types.d.ts +18 -9
  166. package/dist/review-intelligence/types.d.ts.map +1 -1
  167. package/dist/review-intelligence/types.js +9 -1
  168. package/dist/review-intelligence/types.js.map +1 -1
  169. package/dist/templates/claude-md.d.ts.map +1 -1
  170. package/dist/templates/claude-md.js +23 -128
  171. package/dist/templates/claude-md.js.map +1 -1
  172. package/dist/templates/hooks.d.ts.map +1 -1
  173. package/dist/templates/hooks.js +39 -0
  174. package/dist/templates/hooks.js.map +1 -1
  175. package/package.json +9 -9
@@ -0,0 +1,16 @@
1
+ /** A dependency relationship between packages */
2
+ export interface PackageDependency {
3
+ /** Source package name */
4
+ from: string;
5
+ /** Target package name */
6
+ to: string;
7
+ /** Type of dependency */
8
+ type: 'production' | 'dev' | 'peer' | 'optional';
9
+ /** Whether this is a workspace dependency */
10
+ isWorkspace: boolean;
11
+ }
12
+ /**
13
+ * Scan all packages and extract dependency relationships.
14
+ */
15
+ export declare function scanDependencies(cwd: string): PackageDependency[];
16
+ //# sourceMappingURL=dependency-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-scanner.d.ts","sourceRoot":"","sources":["../../src/architecture-graph/dependency-scanner.ts"],"names":[],"mappings":"AAOA,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,IAAI,EAAE,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,6CAA6C;IAC7C,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAgCjE"}
@@ -0,0 +1,96 @@
1
+ // ─── Dependency Scanner ─────────────────────────────────────────────────────
2
+ //
3
+ // Scans package.json files to build a dependency graph between packages.
4
+ import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ /**
7
+ * Scan all packages and extract dependency relationships.
8
+ */
9
+ export function scanDependencies(cwd) {
10
+ const dependencies = [];
11
+ const workspacePackages = discoverWorkspacePackages(cwd);
12
+ const workspaceNames = new Set(workspacePackages.map((p) => p.name));
13
+ for (const pkg of workspacePackages) {
14
+ const depFields = [
15
+ { field: 'dependencies', type: 'production' },
16
+ { field: 'devDependencies', type: 'dev' },
17
+ { field: 'peerDependencies', type: 'peer' },
18
+ { field: 'optionalDependencies', type: 'optional' },
19
+ ];
20
+ for (const { field, type } of depFields) {
21
+ const section = pkg.packageJson[field];
22
+ if (!section || typeof section !== 'object')
23
+ continue;
24
+ for (const depName of Object.keys(section)) {
25
+ const version = section[depName] ?? '';
26
+ const isWorkspace = workspaceNames.has(depName) || version.startsWith('workspace:');
27
+ dependencies.push({
28
+ from: pkg.name,
29
+ to: depName,
30
+ type,
31
+ isWorkspace,
32
+ });
33
+ }
34
+ }
35
+ }
36
+ return dependencies;
37
+ }
38
+ function discoverWorkspacePackages(cwd) {
39
+ const packages = [];
40
+ // Check common monorepo layouts
41
+ const packageDirs = ['packages', 'services', 'apps', 'libs'];
42
+ for (const packageDir of packageDirs) {
43
+ const fullDir = join(cwd, packageDir);
44
+ if (!existsSync(fullDir))
45
+ continue;
46
+ try {
47
+ const entries = readdirSync(fullDir);
48
+ for (const entry of entries) {
49
+ const entryPath = join(fullDir, entry);
50
+ try {
51
+ if (!statSync(entryPath).isDirectory())
52
+ continue;
53
+ }
54
+ catch {
55
+ continue;
56
+ }
57
+ const pkgJsonPath = join(entryPath, 'package.json');
58
+ if (!existsSync(pkgJsonPath))
59
+ continue;
60
+ try {
61
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
62
+ const name = pkg['name'] ?? entry;
63
+ packages.push({
64
+ name,
65
+ path: join(packageDir, entry),
66
+ packageJson: pkg,
67
+ });
68
+ }
69
+ catch {
70
+ // Skip malformed package.json
71
+ }
72
+ }
73
+ }
74
+ catch {
75
+ // Skip unreadable directories
76
+ }
77
+ }
78
+ // Also check root package.json
79
+ const rootPkgPath = join(cwd, 'package.json');
80
+ if (existsSync(rootPkgPath)) {
81
+ try {
82
+ const pkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'));
83
+ const name = pkg['name'] ?? 'root';
84
+ packages.push({
85
+ name,
86
+ path: '.',
87
+ packageJson: pkg,
88
+ });
89
+ }
90
+ catch {
91
+ // Skip
92
+ }
93
+ }
94
+ return packages;
95
+ }
96
+ //# sourceMappingURL=dependency-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-scanner.js","sourceRoot":"","sources":["../../src/architecture-graph/dependency-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /** A node in the architecture graph */
2
+ export interface GraphNode {
3
+ /** Node ID (package name or service name) */
4
+ id: string;
5
+ /** Display label */
6
+ label: string;
7
+ /** Node type */
8
+ type: 'service' | 'package' | 'external' | 'infra';
9
+ /** Relative path in the repo */
10
+ path?: string;
11
+ /** Additional metadata */
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ /** An edge in the architecture graph */
15
+ export interface GraphEdge {
16
+ /** Source node ID */
17
+ from: string;
18
+ /** Target node ID */
19
+ to: string;
20
+ /** Edge type */
21
+ type: 'depends_on' | 'imports' | 'calls' | 'emits' | 'subscribes';
22
+ /** Whether this is a workspace-internal edge */
23
+ isInternal: boolean;
24
+ /** Additional metadata */
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ /** The full architecture graph */
28
+ export interface ArchitectureGraph {
29
+ /** All nodes */
30
+ nodes: GraphNode[];
31
+ /** All edges */
32
+ edges: GraphEdge[];
33
+ /** Detected circular dependencies */
34
+ cycles: string[][];
35
+ /** Service boundary violations */
36
+ boundaryViolations: BoundaryViolation[];
37
+ /** Graph generation metadata */
38
+ metadata: {
39
+ generatedAt: string;
40
+ serviceCount: number;
41
+ packageCount: number;
42
+ edgeCount: number;
43
+ };
44
+ }
45
+ /** A service boundary violation */
46
+ export interface BoundaryViolation {
47
+ /** The service doing the importing */
48
+ sourceService: string;
49
+ /** The service whose internal module is being imported */
50
+ targetService: string;
51
+ /** The specific internal import path */
52
+ importPath: string;
53
+ /** Severity */
54
+ severity: 'P1' | 'P2';
55
+ /** Description */
56
+ description: string;
57
+ }
58
+ /**
59
+ * Build the full architecture graph for a repository.
60
+ */
61
+ export declare function buildArchitectureGraph(cwd: string): ArchitectureGraph;
62
+ /**
63
+ * Format graph for human-readable console output.
64
+ */
65
+ export declare function formatGraphOutput(graph: ArchitectureGraph): string;
66
+ /**
67
+ * Format graph as JSON.
68
+ */
69
+ export declare function formatGraphJson(graph: ArchitectureGraph): string;
70
+ //# sourceMappingURL=graph-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../../src/architecture-graph/graph-builder.ts"],"names":[],"mappings":"AAQA,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACnD,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB;IAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;IAClE,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kCAAkC;AAClC,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,gBAAgB;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,kCAAkC;IAClC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,gCAAgC;IAChC,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CA4FrE;AAuFD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAyDlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,231 @@
1
+ // ─── Graph Builder ──────────────────────────────────────────────────────────
2
+ //
3
+ // Builds an architecture graph from service and dependency scan results.
4
+ import { scanServices } from './service-scanner.js';
5
+ import { scanDependencies } from './dependency-scanner.js';
6
+ /**
7
+ * Build the full architecture graph for a repository.
8
+ */
9
+ export function buildArchitectureGraph(cwd) {
10
+ const services = scanServices(cwd);
11
+ const dependencies = scanDependencies(cwd);
12
+ const nodes = [];
13
+ const edges = [];
14
+ const nodeIds = new Set();
15
+ // Add service/package nodes
16
+ for (const service of services) {
17
+ nodes.push({
18
+ id: service.name,
19
+ label: service.name,
20
+ type: service.type === 'library' ? 'package' : 'service',
21
+ path: service.path,
22
+ metadata: {
23
+ serviceType: service.type,
24
+ hasDockerfile: service.hasDockerfile,
25
+ isEntryPoint: service.isEntryPoint,
26
+ },
27
+ });
28
+ nodeIds.add(service.name);
29
+ }
30
+ // Add dependency edges (workspace only for the graph visualization)
31
+ for (const dep of dependencies) {
32
+ if (!dep.isWorkspace)
33
+ continue;
34
+ // Ensure target node exists
35
+ if (!nodeIds.has(dep.to)) {
36
+ nodes.push({
37
+ id: dep.to,
38
+ label: dep.to,
39
+ type: 'package',
40
+ });
41
+ nodeIds.add(dep.to);
42
+ }
43
+ edges.push({
44
+ from: dep.from,
45
+ to: dep.to,
46
+ type: 'depends_on',
47
+ isInternal: true,
48
+ metadata: { depType: dep.type },
49
+ });
50
+ }
51
+ // Add import-based edges from service scanning
52
+ for (const service of services) {
53
+ for (const imp of service.internalImports) {
54
+ if (!nodeIds.has(imp)) {
55
+ nodes.push({
56
+ id: imp,
57
+ label: imp,
58
+ type: 'package',
59
+ });
60
+ nodeIds.add(imp);
61
+ }
62
+ // Avoid duplicate edges
63
+ const edgeExists = edges.some((e) => e.from === service.name && e.to === imp && e.type === 'imports');
64
+ if (!edgeExists) {
65
+ edges.push({
66
+ from: service.name,
67
+ to: imp,
68
+ type: 'imports',
69
+ isInternal: true,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ // Detect cycles
75
+ const cycles = detectCycles(nodes, edges);
76
+ // Detect boundary violations
77
+ const boundaryViolations = detectBoundaryViolations(services);
78
+ return {
79
+ nodes,
80
+ edges,
81
+ cycles,
82
+ boundaryViolations,
83
+ metadata: {
84
+ generatedAt: new Date().toISOString(),
85
+ serviceCount: services.filter((s) => s.type !== 'library').length,
86
+ packageCount: services.filter((s) => s.type === 'library').length,
87
+ edgeCount: edges.length,
88
+ },
89
+ };
90
+ }
91
+ /**
92
+ * Detect circular dependencies in the graph.
93
+ */
94
+ function detectCycles(nodes, edges) {
95
+ const cycles = [];
96
+ const adjacency = new Map();
97
+ for (const edge of edges) {
98
+ if (!edge.isInternal)
99
+ continue;
100
+ const existing = adjacency.get(edge.from);
101
+ if (existing) {
102
+ existing.push(edge.to);
103
+ }
104
+ else {
105
+ adjacency.set(edge.from, [edge.to]);
106
+ }
107
+ }
108
+ const visited = new Set();
109
+ const inStack = new Set();
110
+ const path = [];
111
+ function dfs(node) {
112
+ if (inStack.has(node)) {
113
+ // Found a cycle
114
+ const cycleStart = path.indexOf(node);
115
+ if (cycleStart >= 0) {
116
+ cycles.push([...path.slice(cycleStart), node]);
117
+ }
118
+ return;
119
+ }
120
+ if (visited.has(node))
121
+ return;
122
+ visited.add(node);
123
+ inStack.add(node);
124
+ path.push(node);
125
+ const neighbors = adjacency.get(node) ?? [];
126
+ for (const neighbor of neighbors) {
127
+ dfs(neighbor);
128
+ }
129
+ path.pop();
130
+ inStack.delete(node);
131
+ }
132
+ for (const node of nodes) {
133
+ if (!visited.has(node.id)) {
134
+ dfs(node.id);
135
+ }
136
+ }
137
+ return cycles;
138
+ }
139
+ /**
140
+ * Detect service boundary violations (services importing internal modules from other services).
141
+ */
142
+ function detectBoundaryViolations(services) {
143
+ const violations = [];
144
+ const serviceByName = new Map(services.map((s) => [s.name, s]));
145
+ for (const service of services) {
146
+ if (service.type === 'library')
147
+ continue;
148
+ for (const imp of service.internalImports) {
149
+ const targetService = serviceByName.get(imp);
150
+ if (!targetService)
151
+ continue;
152
+ if (targetService.type === 'library')
153
+ continue;
154
+ if (targetService.name === service.name)
155
+ continue;
156
+ // Service-to-service import — potential boundary violation
157
+ violations.push({
158
+ sourceService: service.name,
159
+ targetService: targetService.name,
160
+ importPath: imp,
161
+ severity: 'P1',
162
+ description: `Service '${service.name}' imports from service '${targetService.name}'. ` +
163
+ 'Services should communicate through APIs or events, not direct imports.',
164
+ });
165
+ }
166
+ }
167
+ return violations;
168
+ }
169
+ /**
170
+ * Format graph for human-readable console output.
171
+ */
172
+ export function formatGraphOutput(graph) {
173
+ const lines = [];
174
+ lines.push('');
175
+ lines.push('Architecture Graph');
176
+ lines.push('──────────────────');
177
+ lines.push(` Services: ${graph.metadata.serviceCount}`);
178
+ lines.push(` Packages: ${graph.metadata.packageCount}`);
179
+ lines.push(` Edges: ${graph.metadata.edgeCount}`);
180
+ lines.push('');
181
+ // Group edges by source
182
+ const edgesBySource = new Map();
183
+ for (const edge of graph.edges) {
184
+ const existing = edgesBySource.get(edge.from);
185
+ if (existing) {
186
+ existing.push(edge);
187
+ }
188
+ else {
189
+ edgesBySource.set(edge.from, [edge]);
190
+ }
191
+ }
192
+ // Show service dependencies
193
+ lines.push(' Service Dependencies');
194
+ lines.push(' ────────────────────');
195
+ for (const node of graph.nodes) {
196
+ const nodeEdges = edgesBySource.get(node.id);
197
+ if (!nodeEdges || nodeEdges.length === 0)
198
+ continue;
199
+ lines.push(` ${node.label} (${node.type})`);
200
+ for (const edge of nodeEdges) {
201
+ lines.push(` → ${edge.to} (${edge.type})`);
202
+ }
203
+ lines.push('');
204
+ }
205
+ // Show cycles
206
+ if (graph.cycles.length > 0) {
207
+ lines.push(' Circular Dependencies');
208
+ lines.push(' ─────────────────────');
209
+ for (const cycle of graph.cycles) {
210
+ lines.push(` ${cycle.join(' → ')}`);
211
+ }
212
+ lines.push('');
213
+ }
214
+ // Show boundary violations
215
+ if (graph.boundaryViolations.length > 0) {
216
+ lines.push(' Boundary Violations');
217
+ lines.push(' ───────────────────');
218
+ for (const v of graph.boundaryViolations) {
219
+ lines.push(` [${v.severity}] ${v.description}`);
220
+ }
221
+ lines.push('');
222
+ }
223
+ return lines.join('\n');
224
+ }
225
+ /**
226
+ * Format graph as JSON.
227
+ */
228
+ export function formatGraphJson(graph) {
229
+ return JSON.stringify(graph, null, 2);
230
+ }
231
+ //# sourceMappingURL=graph-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../src/architecture-graph/graph-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { scanServices, type ServiceInfo } from './service-scanner.js';
2
+ export { scanDependencies, type PackageDependency } from './dependency-scanner.js';
3
+ export { buildArchitectureGraph, formatGraphOutput, formatGraphJson, type ArchitectureGraph, type GraphNode, type GraphEdge, } from './graph-builder.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/architecture-graph/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,SAAS,GACf,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // ─── Architecture Graph ─────────────────────────────────────────────────────
2
+ //
3
+ // Models relationships across services, packages, events, and infrastructure.
4
+ export { scanServices } from './service-scanner.js';
5
+ export { scanDependencies } from './dependency-scanner.js';
6
+ export { buildArchitectureGraph, formatGraphOutput, formatGraphJson, } from './graph-builder.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/architecture-graph/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,8EAA8E;AAE9E,OAAO,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAA0B,MAAM,yBAAyB,CAAC;AACnF,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,GAIhB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Information about a detected service */
2
+ export interface ServiceInfo {
3
+ /** Service name (directory name or package.json name) */
4
+ name: string;
5
+ /** Relative path from repo root */
6
+ path: string;
7
+ /** Type of service detected */
8
+ type: 'api' | 'worker' | 'gateway' | 'library' | 'unknown';
9
+ /** Whether it has a Dockerfile */
10
+ hasDockerfile: boolean;
11
+ /** Package dependencies (from package.json) */
12
+ dependencies: string[];
13
+ /** Internal imports detected (other services/packages) */
14
+ internalImports: string[];
15
+ /** Whether it's an entry point (has a server/main) */
16
+ isEntryPoint: boolean;
17
+ }
18
+ /**
19
+ * Scan a monorepo for services.
20
+ */
21
+ export declare function scanServices(cwd: string): ServiceInfo[];
22
+ //# sourceMappingURL=service-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-scanner.d.ts","sourceRoot":"","sources":["../../src/architecture-graph/service-scanner.ts"],"names":[],"mappings":"AAUA,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3D,kCAAkC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CA4CvD"}