import os import subprocess import sys def get_all_files(extensions=['.mjs', '.js']): files = [] for root, dirs, filenames in os.walk('.'): if 'node_modules' in root or '.git' in root or 'artifacts' in root or 'dist' in root: continue for filename in filenames: if any(filename.endswith(ext) for ext in extensions): files.append(os.path.join(root, filename)) return files def grep_file(filepath, all_files): filename = os.path.basename(filepath) name_no_ext = os.path.splitext(filename)[0] # Heuristic: search for the filename or the name without extension # We must exclude the file itself from the search # Construct grep command # git grep -F "string" -- . # Check for full filename usage try: # We use git grep because it's fast and respects .gitignore # We search for the filename string. # We assume if the filename appears in another file, it MIGHT be used. # This is conservative. # Search for filename (e.g. "foo.mjs") result_full = subprocess.run( ['git', 'grep', '-F', filename, '--', '.'], capture_output=True, text=True ) # Search for name without extension (e.g. "foo") if it's not "index" result_no_ext = None if name_no_ext != 'index': result_no_ext = subprocess.run( ['git', 'grep', '-F', name_no_ext, '--', '.'], capture_output=True, text=True ) output = result_full.stdout if result_no_ext: output += result_no_ext.stdout lines = output.splitlines() # Filter out self-references count = 0 for line in lines: if line.startswith(filepath.lstrip('./')): continue count += 1 return count except Exception as e: print(f"Error grepping {filepath}: {e}") return 1 # Assume used on error def main(): files = get_all_files() candidates = [] # Known entry points or special files to exclude from "dead" list immediately # These might not be imported but are used by scripts or configuration exclusions = [ './bin/torch-lock.mjs', './src/lib.mjs', # Main entry './src/constants.mjs', # Likely used './build.mjs', './eslint.config.mjs', ] print(f"Scanning {len(files)} files...") for f in files: if f in exclusions: continue # Skip test files if '.test.' in f or '/test/' in f or '/tests/' in f: continue count = grep_file(f, files) if count == 0: candidates.append(f) print(f"Candidate: {f}") if not candidates: print("No candidates found.") else: print(f"Found {len(candidates)} candidates.") with open('artifacts/candidates.txt', 'w') as f_out: for c in candidates: f_out.write(c + '\n') if __name__ == "__main__": main()