/** * OpenSpec Compatibility Layer * * Ensures perfect compatibility with OpenSpec's tooling and conventions. * Handles config.yaml integration, validation, and context injection. */ import type { ProjectSurveyResult } from './spec-pipeline.js'; /** * Validation result for specs and config */ export interface ValidationResult { valid: boolean; errors: string[]; warnings: string[]; } /** * OpenSpec config.yaml structure */ export interface OpenSpecConfig { schema?: string; context?: string; rules?: { proposal?: string[]; specs?: string[]; design?: string[]; tasks?: string[]; }; 'openlore'?: OpenLoreMetadata; } /** * openlore metadata added to config.yaml */ export interface OpenLoreMetadata { version: string; generatedAt: string; domains: string[]; confidence: number; adrCount?: number; } /** * Detected project context for injection */ export interface DetectedContext { techStack: string; architecture: string; domains: string[]; patterns: string[]; } /** * Options for context update */ export interface ContextUpdateOptions { preserveUserContext: boolean; appendDetectedInfo: boolean; version: string; } /** * OpenSpec validator for specs and configuration */ export declare class OpenSpecValidator { /** * Validate the complete spec structure */ validateSpecStructure(content: string): ValidationResult; /** * Validate requirement format follows RFC 2119 */ validateRequirementFormat(requirement: string): ValidationResult; /** * Validate scenario format (Given/When/Then) */ validateScenarioFormat(scenario: string): ValidationResult; /** * Validate config.yaml structure */ validateConfigYaml(config: unknown): ValidationResult; /** * Check heading hierarchy is valid (no skipped levels) */ private checkHeadingHierarchy; /** * Check for malformed markdown links */ private checkMarkdownLinks; } /** * OpenSpec config.yaml manager */ export declare class OpenSpecConfigManager { private configPath; private openspecRoot; constructor(projectRoot: string); /** * Check if OpenSpec is initialized */ isInitialized(): Promise; /** * Check if config.yaml exists */ hasConfig(): Promise; /** * Read existing config.yaml */ readConfig(): Promise; /** * Write config.yaml, preserving user content */ writeConfig(config: OpenSpecConfig): Promise; /** * Update config with openlore metadata while preserving user content */ updateWithOpenLoreMetadata(metadata: OpenLoreMetadata, detectedContext?: DetectedContext, options?: ContextUpdateOptions): Promise; /** * Build context string combining user and detected info */ private buildContext; /** * Get existing user context from config */ getUserContext(): Promise; /** * Get existing domains from specs directory */ getExistingDomains(): Promise; } /** * Build detected context from analysis results */ export declare function buildDetectedContext(survey: ProjectSurveyResult): DetectedContext; /** * Normalize domain name to OpenSpec conventions */ export declare function normalizeDomainName(name: string): string; /** * Check if domain name follows conventions */ export declare function isValidDomainName(name: string): boolean; /** * Match suggested domains against existing domains */ export declare function matchExistingDomains(suggestedDomains: string[], existingDomains: string[]): Map; /** * Validate a complete spec file */ export declare function validateFullSpec(content: string): ValidationResult; /** * Validate all specs in a directory */ export declare function validateSpecsDirectory(specsDir: string): Promise<{ valid: boolean; results: Map; }>; /** * Create a new OpenSpec compatibility helper */ export declare function createOpenSpecCompat(projectRoot: string): { validator: OpenSpecValidator; configManager: OpenSpecConfigManager; }; //# sourceMappingURL=openspec-compat.d.ts.map