/** * Portfolio Manager - Manages the portfolio directory structure for all element types */ import { ElementType, PortfolioConfig } from './types.js'; import { FileOperationsService } from '../services/FileOperationsService.js'; interface ListElementsOptions { /** Preserve filesystem failures instead of representing them as an empty portfolio. */ throwOnFilesystemError?: boolean; } /** * Get the file extension for an element type without requiring a PortfolioManager instance. * Issue #815: Shared by PortfolioRepoManager and submitToPortfolioTool to avoid * hardcoded '.md' assumptions. */ export declare function getElementFileExtension(type: string): string; export { ElementType }; export type { PortfolioConfig }; export declare class PortfolioManager { private initializationPromise; private baseDir; private fileOperations; /** * Create a new PortfolioManager instance * * @param config - Optional portfolio configuration * @param fileOperations - Optional FileOperationsService for dependency injection. * BREAKING CHANGE (v1.5.0): Added as second parameter for DI. * Direct instantiation without DI container should pass undefined * or provide a FileOperationsService instance. */ constructor(fileOperations: FileOperationsService, config?: PortfolioConfig); /** * Get the base portfolio directory */ getBaseDir(): string; /** * Get the directory for a specific element type */ getElementDir(type: ElementType): string; /** * Get the file extension for a specific element type * FIX (#1213): Expose ELEMENT_FILE_EXTENSIONS mapping for correct extension display */ getFileExtension(type: ElementType): string; /** * Initialize the portfolio directory structure * Uses locking to prevent race conditions during concurrent initialization */ initialize(): Promise; /** * Perform the actual initialization - should only be called once */ private performInitialization; /** * Check if portfolio directory exists */ exists(): Promise; /** * Check if portfolio is fully initialized (base dir + all subdirectories exist) * This prevents the bug where base dir exists but subdirectories were deleted */ private isFullyInitialized; /** * Check if a filename appears to be a test element * SAFETY: Pattern-based filtering only, no content parsing * * This method IDENTIFIES test patterns (always returns true for test files). * The actual FILTERING decision (whether to exclude them) is made in listElements(). */ isTestElement(filename: string): boolean; /** * List all elements of a specific type */ listElements(type: ElementType, options?: ListElementsOptions): Promise; /** * Get full path to an element file */ getElementPath(type: ElementType, filename: string): string; /** * Check if an element exists */ elementExists(type: ElementType, filename: string): Promise; /** * Get legacy personas directory path (for migration) */ getLegacyPersonasDir(): string; /** * Check if legacy personas directory exists */ hasLegacyPersonas(): Promise; /** * Get portfolio statistics */ getStatistics(): Promise>; /** * Migrate from v1.4.2 singular directory names to v1.4.3 plural names * This handles the upgrade path for existing users */ private migrateFromSingularDirectories; } //# sourceMappingURL=PortfolioManager.d.ts.map