@girardelli/architect 1.1.0 → 1.2.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.
@@ -7,7 +7,23 @@ export declare class ArchitectureAnalyzer {
7
7
  analyzeDependencies(fileTree: FileNode): DependencyEdge[];
8
8
  detectLayers(fileTree: FileNode): Layer[];
9
9
  private buildDependencyGraph;
10
+ /**
11
+ * Known Python standard library modules (partial list of most common ones)
12
+ */
13
+ private static readonly PYTHON_STDLIB;
14
+ /**
15
+ * Resolve the project's root Python package name from directory structure.
16
+ * E.g., for projectPath="/foo/src", if there's a "deepguard/" dir, the package is "deepguard".
17
+ */
18
+ private projectPackageNames;
19
+ private getProjectPackageNames;
10
20
  private parseImports;
21
+ /**
22
+ * Check if a Python import is internal to the project.
23
+ * Internal imports: relative (starts with .) or matches project package names.
24
+ * External imports: stdlib, third-party (numpy, cv2, PIL, etc.)
25
+ */
26
+ private isInternalPythonImport;
11
27
  private buildEdgeList;
12
28
  private categorizeFiles;
13
29
  getModuleBoundaries(fileTree: FileNode): Map<string, string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,cAAc,CAAkC;gBAE5C,WAAW,EAAE,MAAM;IAI/B,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;IAKzD,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;IAqDzC,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,eAAe;IAiIvB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAM9D,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;CAW7B"}
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,cAAc,CAAkC;gBAE5C,WAAW,EAAE,MAAM;IAI/B,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;IAMzD,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;IAqDzC,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CA+BlC;IAEH;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA4B;IAEvD,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,YAAY;IAiDpB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,eAAe;IAiIvB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAM9D,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;CAW7B"}
package/dist/analyzer.js CHANGED
@@ -4,9 +4,15 @@ export class ArchitectureAnalyzer {
4
4
  constructor(projectPath) {
5
5
  this.dependencyGraph = new Map();
6
6
  this.fileExtensions = new Map();
7
+ /**
8
+ * Resolve the project's root Python package name from directory structure.
9
+ * E.g., for projectPath="/foo/src", if there's a "deepguard/" dir, the package is "deepguard".
10
+ */
11
+ this.projectPackageNames = null;
7
12
  this.projectPath = projectPath;
8
13
  }
9
14
  analyzeDependencies(fileTree) {
15
+ this.getProjectPackageNames(fileTree);
10
16
  this.buildDependencyGraph(fileTree);
11
17
  return this.buildEdgeList();
12
18
  }
@@ -66,6 +72,19 @@ export class ArchitectureAnalyzer {
66
72
  }
67
73
  }
68
74
  }
75
+ getProjectPackageNames(fileTree) {
76
+ if (this.projectPackageNames)
77
+ return this.projectPackageNames;
78
+ this.projectPackageNames = new Set();
79
+ if (fileTree.children) {
80
+ for (const child of fileTree.children) {
81
+ if (child.type === 'directory') {
82
+ this.projectPackageNames.add(child.name);
83
+ }
84
+ }
85
+ }
86
+ return this.projectPackageNames;
87
+ }
69
88
  parseImports(filePath) {
70
89
  try {
71
90
  const content = readFileSync(filePath, 'utf-8');
@@ -75,15 +94,29 @@ export class ArchitectureAnalyzer {
75
94
  const importRegex = /(?:import|require)\s*(?:\{[^}]+\}|[^\s]+)\s*from\s*['"]([^'"]+)['"]/g;
76
95
  let match;
77
96
  while ((match = importRegex.exec(content)) !== null) {
78
- imports.push(match[1]);
97
+ const importPath = match[1];
98
+ // Only count relative imports (./ ../) as internal dependencies
99
+ if (importPath.startsWith('.')) {
100
+ imports.push(importPath);
101
+ }
79
102
  }
80
103
  }
81
104
  else if (ext === '.py') {
82
- const importRegex = /(?:from|import)\s+(?:[^\s]+)\s*(?:import\s+)?([^\n]+)?/g;
105
+ // Parse "from X import Y" — capture X (the module source)
106
+ const fromImportRegex = /^from\s+([\w.]+)\s+import\b/gm;
83
107
  let match;
84
- while ((match = importRegex.exec(content)) !== null) {
85
- if (match[1]) {
86
- imports.push(match[1].trim());
108
+ while ((match = fromImportRegex.exec(content)) !== null) {
109
+ const moduleName = match[1];
110
+ if (this.isInternalPythonImport(moduleName)) {
111
+ imports.push(moduleName);
112
+ }
113
+ }
114
+ // Parse "import X" — capture X
115
+ const directImportRegex = /^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm;
116
+ while ((match = directImportRegex.exec(content)) !== null) {
117
+ const moduleName = match[1];
118
+ if (this.isInternalPythonImport(moduleName)) {
119
+ imports.push(moduleName);
87
120
  }
88
121
  }
89
122
  }
@@ -100,6 +133,26 @@ export class ArchitectureAnalyzer {
100
133
  return [];
101
134
  }
102
135
  }
136
+ /**
137
+ * Check if a Python import is internal to the project.
138
+ * Internal imports: relative (starts with .) or matches project package names.
139
+ * External imports: stdlib, third-party (numpy, cv2, PIL, etc.)
140
+ */
141
+ isInternalPythonImport(moduleName) {
142
+ // Relative imports are always internal
143
+ if (moduleName.startsWith('.'))
144
+ return true;
145
+ // Get the top-level module name (e.g., "deepguard" from "deepguard.cli")
146
+ const topLevel = moduleName.split('.')[0];
147
+ // Check against Python stdlib
148
+ if (ArchitectureAnalyzer.PYTHON_STDLIB.has(topLevel))
149
+ return false;
150
+ // Check if it matches a known project package directory
151
+ if (this.projectPackageNames && this.projectPackageNames.has(topLevel))
152
+ return true;
153
+ // Default: treat unknown imports as external (conservative approach)
154
+ return false;
155
+ }
103
156
  buildEdgeList() {
104
157
  const edges = [];
105
158
  const seenEdges = new Set();
@@ -251,4 +304,39 @@ export class ArchitectureAnalyzer {
251
304
  }
252
305
  }
253
306
  }
307
+ /**
308
+ * Known Python standard library modules (partial list of most common ones)
309
+ */
310
+ ArchitectureAnalyzer.PYTHON_STDLIB = new Set([
311
+ 'abc', 'aifc', 'argparse', 'array', 'ast', 'asynchat', 'asyncio', 'asyncore',
312
+ 'atexit', 'base64', 'bdb', 'binascii', 'binhex', 'bisect', 'builtins',
313
+ 'bz2', 'calendar', 'cgi', 'cgitb', 'chunk', 'cmath', 'cmd', 'code',
314
+ 'codecs', 'codeop', 'collections', 'colorsys', 'compileall', 'concurrent',
315
+ 'configparser', 'contextlib', 'contextvars', 'copy', 'copyreg', 'cProfile',
316
+ 'crypt', 'csv', 'ctypes', 'curses', 'dataclasses', 'datetime', 'dbm',
317
+ 'decimal', 'difflib', 'dis', 'distutils', 'doctest', 'email', 'encodings',
318
+ 'enum', 'errno', 'faulthandler', 'fcntl', 'filecmp', 'fileinput', 'fnmatch',
319
+ 'fractions', 'ftplib', 'functools', 'gc', 'getopt', 'getpass', 'gettext',
320
+ 'glob', 'grp', 'gzip', 'hashlib', 'heapq', 'hmac', 'html', 'http',
321
+ 'idlelib', 'imaplib', 'imghdr', 'imp', 'importlib', 'inspect', 'io',
322
+ 'ipaddress', 'itertools', 'json', 'keyword', 'lib2to3', 'linecache',
323
+ 'locale', 'logging', 'lzma', 'mailbox', 'mailcap', 'marshal', 'math',
324
+ 'mimetypes', 'mmap', 'modulefinder', 'multiprocessing', 'netrc', 'nis',
325
+ 'nntplib', 'numbers', 'operator', 'optparse', 'os', 'ossaudiodev',
326
+ 'pathlib', 'pdb', 'pickle', 'pickletools', 'pipes', 'pkgutil', 'platform',
327
+ 'plistlib', 'poplib', 'posix', 'posixpath', 'pprint', 'profile', 'pstats',
328
+ 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'queue', 'quopri',
329
+ 'random', 're', 'readline', 'reprlib', 'resource', 'rlcompleter', 'runpy',
330
+ 'sched', 'secrets', 'select', 'selectors', 'shelve', 'shlex', 'shutil',
331
+ 'signal', 'site', 'smtpd', 'smtplib', 'sndhdr', 'socket', 'socketserver',
332
+ 'sqlite3', 'ssl', 'stat', 'statistics', 'string', 'stringprep', 'struct',
333
+ 'subprocess', 'sunau', 'symtable', 'sys', 'sysconfig', 'syslog', 'tabnanny',
334
+ 'tarfile', 'telnetlib', 'tempfile', 'termios', 'test', 'textwrap', 'threading',
335
+ 'time', 'timeit', 'tkinter', 'token', 'tokenize', 'tomllib', 'trace',
336
+ 'traceback', 'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types',
337
+ 'typing', 'unicodedata', 'unittest', 'urllib', 'uu', 'uuid', 'venv',
338
+ 'warnings', 'wave', 'weakref', 'webbrowser', 'winreg', 'winsound',
339
+ 'wsgiref', 'xdrlib', 'xml', 'xmlrpc', 'zipapp', 'zipfile', 'zipimport',
340
+ 'zlib', '_thread',
341
+ ]);
254
342
  //# sourceMappingURL=analyzer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardelli/architect",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "description": "AI-powered architecture analysis for Claude Code",
6
6
  "author": {
package/src/analyzer.ts CHANGED
@@ -12,6 +12,7 @@ export class ArchitectureAnalyzer {
12
12
  }
13
13
 
14
14
  analyzeDependencies(fileTree: FileNode): DependencyEdge[] {
15
+ this.getProjectPackageNames(fileTree);
15
16
  this.buildDependencyGraph(fileTree);
16
17
  return this.buildEdgeList();
17
18
  }
@@ -82,6 +83,61 @@ export class ArchitectureAnalyzer {
82
83
  }
83
84
  }
84
85
 
86
+ /**
87
+ * Known Python standard library modules (partial list of most common ones)
88
+ */
89
+ private static readonly PYTHON_STDLIB: Set<string> = new Set([
90
+ 'abc', 'aifc', 'argparse', 'array', 'ast', 'asynchat', 'asyncio', 'asyncore',
91
+ 'atexit', 'base64', 'bdb', 'binascii', 'binhex', 'bisect', 'builtins',
92
+ 'bz2', 'calendar', 'cgi', 'cgitb', 'chunk', 'cmath', 'cmd', 'code',
93
+ 'codecs', 'codeop', 'collections', 'colorsys', 'compileall', 'concurrent',
94
+ 'configparser', 'contextlib', 'contextvars', 'copy', 'copyreg', 'cProfile',
95
+ 'crypt', 'csv', 'ctypes', 'curses', 'dataclasses', 'datetime', 'dbm',
96
+ 'decimal', 'difflib', 'dis', 'distutils', 'doctest', 'email', 'encodings',
97
+ 'enum', 'errno', 'faulthandler', 'fcntl', 'filecmp', 'fileinput', 'fnmatch',
98
+ 'fractions', 'ftplib', 'functools', 'gc', 'getopt', 'getpass', 'gettext',
99
+ 'glob', 'grp', 'gzip', 'hashlib', 'heapq', 'hmac', 'html', 'http',
100
+ 'idlelib', 'imaplib', 'imghdr', 'imp', 'importlib', 'inspect', 'io',
101
+ 'ipaddress', 'itertools', 'json', 'keyword', 'lib2to3', 'linecache',
102
+ 'locale', 'logging', 'lzma', 'mailbox', 'mailcap', 'marshal', 'math',
103
+ 'mimetypes', 'mmap', 'modulefinder', 'multiprocessing', 'netrc', 'nis',
104
+ 'nntplib', 'numbers', 'operator', 'optparse', 'os', 'ossaudiodev',
105
+ 'pathlib', 'pdb', 'pickle', 'pickletools', 'pipes', 'pkgutil', 'platform',
106
+ 'plistlib', 'poplib', 'posix', 'posixpath', 'pprint', 'profile', 'pstats',
107
+ 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'queue', 'quopri',
108
+ 'random', 're', 'readline', 'reprlib', 'resource', 'rlcompleter', 'runpy',
109
+ 'sched', 'secrets', 'select', 'selectors', 'shelve', 'shlex', 'shutil',
110
+ 'signal', 'site', 'smtpd', 'smtplib', 'sndhdr', 'socket', 'socketserver',
111
+ 'sqlite3', 'ssl', 'stat', 'statistics', 'string', 'stringprep', 'struct',
112
+ 'subprocess', 'sunau', 'symtable', 'sys', 'sysconfig', 'syslog', 'tabnanny',
113
+ 'tarfile', 'telnetlib', 'tempfile', 'termios', 'test', 'textwrap', 'threading',
114
+ 'time', 'timeit', 'tkinter', 'token', 'tokenize', 'tomllib', 'trace',
115
+ 'traceback', 'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types',
116
+ 'typing', 'unicodedata', 'unittest', 'urllib', 'uu', 'uuid', 'venv',
117
+ 'warnings', 'wave', 'weakref', 'webbrowser', 'winreg', 'winsound',
118
+ 'wsgiref', 'xdrlib', 'xml', 'xmlrpc', 'zipapp', 'zipfile', 'zipimport',
119
+ 'zlib', '_thread',
120
+ ]);
121
+
122
+ /**
123
+ * Resolve the project's root Python package name from directory structure.
124
+ * E.g., for projectPath="/foo/src", if there's a "deepguard/" dir, the package is "deepguard".
125
+ */
126
+ private projectPackageNames: Set<string> | null = null;
127
+
128
+ private getProjectPackageNames(fileTree: FileNode): Set<string> {
129
+ if (this.projectPackageNames) return this.projectPackageNames;
130
+ this.projectPackageNames = new Set<string>();
131
+ if (fileTree.children) {
132
+ for (const child of fileTree.children) {
133
+ if (child.type === 'directory') {
134
+ this.projectPackageNames.add(child.name);
135
+ }
136
+ }
137
+ }
138
+ return this.projectPackageNames;
139
+ }
140
+
85
141
  private parseImports(filePath: string): string[] {
86
142
  try {
87
143
  const content = readFileSync(filePath, 'utf-8');
@@ -93,15 +149,28 @@ export class ArchitectureAnalyzer {
93
149
  /(?:import|require)\s*(?:\{[^}]+\}|[^\s]+)\s*from\s*['"]([^'"]+)['"]/g;
94
150
  let match;
95
151
  while ((match = importRegex.exec(content)) !== null) {
96
- imports.push(match[1]);
152
+ const importPath = match[1];
153
+ // Only count relative imports (./ ../) as internal dependencies
154
+ if (importPath.startsWith('.')) {
155
+ imports.push(importPath);
156
+ }
97
157
  }
98
158
  } else if (ext === '.py') {
99
- const importRegex =
100
- /(?:from|import)\s+(?:[^\s]+)\s*(?:import\s+)?([^\n]+)?/g;
159
+ // Parse "from X import Y" — capture X (the module source)
160
+ const fromImportRegex = /^from\s+([\w.]+)\s+import\b/gm;
101
161
  let match;
102
- while ((match = importRegex.exec(content)) !== null) {
103
- if (match[1]) {
104
- imports.push(match[1].trim());
162
+ while ((match = fromImportRegex.exec(content)) !== null) {
163
+ const moduleName = match[1];
164
+ if (this.isInternalPythonImport(moduleName)) {
165
+ imports.push(moduleName);
166
+ }
167
+ }
168
+ // Parse "import X" — capture X
169
+ const directImportRegex = /^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm;
170
+ while ((match = directImportRegex.exec(content)) !== null) {
171
+ const moduleName = match[1];
172
+ if (this.isInternalPythonImport(moduleName)) {
173
+ imports.push(moduleName);
105
174
  }
106
175
  }
107
176
  } else if (ext === '.java') {
@@ -118,6 +187,28 @@ export class ArchitectureAnalyzer {
118
187
  }
119
188
  }
120
189
 
190
+ /**
191
+ * Check if a Python import is internal to the project.
192
+ * Internal imports: relative (starts with .) or matches project package names.
193
+ * External imports: stdlib, third-party (numpy, cv2, PIL, etc.)
194
+ */
195
+ private isInternalPythonImport(moduleName: string): boolean {
196
+ // Relative imports are always internal
197
+ if (moduleName.startsWith('.')) return true;
198
+
199
+ // Get the top-level module name (e.g., "deepguard" from "deepguard.cli")
200
+ const topLevel = moduleName.split('.')[0];
201
+
202
+ // Check against Python stdlib
203
+ if (ArchitectureAnalyzer.PYTHON_STDLIB.has(topLevel)) return false;
204
+
205
+ // Check if it matches a known project package directory
206
+ if (this.projectPackageNames && this.projectPackageNames.has(topLevel)) return true;
207
+
208
+ // Default: treat unknown imports as external (conservative approach)
209
+ return false;
210
+ }
211
+
121
212
  private buildEdgeList(): DependencyEdge[] {
122
213
  const edges: DependencyEdge[] = [];
123
214
  const seenEdges = new Set<string>();