@contractspec/bundle.workspace 1.48.1 → 1.50.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.
@@ -75,6 +75,21 @@ function createNodeGitAdapter(cwd) {
75
75
  } catch {
76
76
  return [];
77
77
  }
78
+ },
79
+ async diffFiles(baseline, patterns) {
80
+ try {
81
+ return execSync(`git diff --name-only ${baseline}...HEAD ${patterns && patterns.length > 0 ? `-- ${patterns.map((p) => `'${p}'`).join(" ")}` : ""}`, {
82
+ cwd: baseCwd,
83
+ encoding: "utf-8",
84
+ stdio: [
85
+ "ignore",
86
+ "pipe",
87
+ "pipe"
88
+ ]
89
+ }).trim().split("\n").filter(Boolean);
90
+ } catch {
91
+ return [];
92
+ }
78
93
  }
79
94
  };
80
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git.mjs","names":["path"],"sources":["../../src/adapters/git.ts"],"sourcesContent":["/**\n * Node.js git adapter implementation.\n */\n\nimport { execSync } from 'node:child_process';\nimport { access } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { GitAdapter, GitCleanOptions, GitLogEntry } from '../ports/git';\n\n/**\n * Create a Node.js git adapter.\n */\nexport function createNodeGitAdapter(cwd?: string): GitAdapter {\n const baseCwd = cwd ?? process.cwd();\n\n return {\n async showFile(ref: string, filePath: string): Promise<string> {\n try {\n return execSync(`git show ${ref}:${filePath}`, {\n cwd: baseCwd,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n } catch (error) {\n throw new Error(\n `Could not load ${filePath} at ref ${ref}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n },\n\n async clean(options?: GitCleanOptions): Promise<void> {\n const flags: string[] = [];\n if (options?.force) flags.push('-f');\n if (options?.directories) flags.push('-d');\n if (options?.ignored) flags.push('-x');\n if (options?.dryRun) flags.push('--dry-run');\n\n execSync(`git clean ${flags.join(' ')}`, {\n cwd: baseCwd,\n stdio: 'inherit',\n });\n },\n\n async isGitRepo(path?: string): Promise<boolean> {\n const targetPath = path ? resolve(baseCwd, path) : baseCwd;\n try {\n await access(resolve(targetPath, '.git'));\n return true;\n } catch {\n return false;\n }\n },\n\n async log(baseline?: string): Promise<GitLogEntry[]> {\n const ref = baseline ?? 'HEAD~10';\n const format = '--format=%H|||%s|||%an|||%aI';\n\n try {\n const output = execSync(`git log ${ref}..HEAD ${format}`, {\n cwd: baseCwd,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n const entries: GitLogEntry[] = [];\n\n for (const line of output.trim().split('\\n')) {\n if (!line) continue;\n const [hash, message, author, date] = line.split('|||');\n if (hash && message) {\n entries.push({ hash, message, author, date });\n }\n }\n\n return entries;\n } catch {\n // Return empty if git log fails (e.g., not enough commits)\n return [];\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,qBAAqB,KAA0B;CAC7D,MAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,QAAO;EACL,MAAM,SAAS,KAAa,UAAmC;AAC7D,OAAI;AACF,WAAO,SAAS,YAAY,IAAI,GAAG,YAAY;KAC7C,KAAK;KACL,UAAU;KACV,OAAO;MAAC;MAAU;MAAQ;MAAO;KAClC,CAAC;YACK,OAAO;AACd,UAAM,IAAI,MACR,kBAAkB,SAAS,UAAU,IAAI,IACvC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAEzD;;;EAIL,MAAM,MAAM,SAA0C;GACpD,MAAM,QAAkB,EAAE;AAC1B,OAAI,SAAS,MAAO,OAAM,KAAK,KAAK;AACpC,OAAI,SAAS,YAAa,OAAM,KAAK,KAAK;AAC1C,OAAI,SAAS,QAAS,OAAM,KAAK,KAAK;AACtC,OAAI,SAAS,OAAQ,OAAM,KAAK,YAAY;AAE5C,YAAS,aAAa,MAAM,KAAK,IAAI,IAAI;IACvC,KAAK;IACL,OAAO;IACR,CAAC;;EAGJ,MAAM,UAAU,QAAiC;GAC/C,MAAM,aAAaA,SAAO,QAAQ,SAASA,OAAK,GAAG;AACnD,OAAI;AACF,UAAM,OAAO,QAAQ,YAAY,OAAO,CAAC;AACzC,WAAO;WACD;AACN,WAAO;;;EAIX,MAAM,IAAI,UAA2C;GACnD,MAAM,MAAM,YAAY;GACxB,MAAM,SAAS;AAEf,OAAI;IACF,MAAM,SAAS,SAAS,WAAW,IAAI,SAAS,UAAU;KACxD,KAAK;KACL,UAAU;KACV,OAAO;MAAC;MAAU;MAAQ;MAAO;KAClC,CAAC;IAEF,MAAM,UAAyB,EAAE;AAEjC,SAAK,MAAM,QAAQ,OAAO,MAAM,CAAC,MAAM,KAAK,EAAE;AAC5C,SAAI,CAAC,KAAM;KACX,MAAM,CAAC,MAAM,SAAS,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvD,SAAI,QAAQ,QACV,SAAQ,KAAK;MAAE;MAAM;MAAS;MAAQ;MAAM,CAAC;;AAIjD,WAAO;WACD;AAEN,WAAO,EAAE;;;EAGd"}
1
+ {"version":3,"file":"git.mjs","names":["path"],"sources":["../../src/adapters/git.ts"],"sourcesContent":["/**\n * Node.js git adapter implementation.\n */\n\nimport { execSync } from 'node:child_process';\nimport { access } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { GitAdapter, GitCleanOptions, GitLogEntry } from '../ports/git';\n\n/**\n * Create a Node.js git adapter.\n */\nexport function createNodeGitAdapter(cwd?: string): GitAdapter {\n const baseCwd = cwd ?? process.cwd();\n\n return {\n async showFile(ref: string, filePath: string): Promise<string> {\n try {\n return execSync(`git show ${ref}:${filePath}`, {\n cwd: baseCwd,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n } catch (error) {\n throw new Error(\n `Could not load ${filePath} at ref ${ref}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n },\n\n async clean(options?: GitCleanOptions): Promise<void> {\n const flags: string[] = [];\n if (options?.force) flags.push('-f');\n if (options?.directories) flags.push('-d');\n if (options?.ignored) flags.push('-x');\n if (options?.dryRun) flags.push('--dry-run');\n\n execSync(`git clean ${flags.join(' ')}`, {\n cwd: baseCwd,\n stdio: 'inherit',\n });\n },\n\n async isGitRepo(path?: string): Promise<boolean> {\n const targetPath = path ? resolve(baseCwd, path) : baseCwd;\n try {\n await access(resolve(targetPath, '.git'));\n return true;\n } catch {\n return false;\n }\n },\n\n async log(baseline?: string): Promise<GitLogEntry[]> {\n const ref = baseline ?? 'HEAD~10';\n const format = '--format=%H|||%s|||%an|||%aI';\n\n try {\n const output = execSync(`git log ${ref}..HEAD ${format}`, {\n cwd: baseCwd,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n const entries: GitLogEntry[] = [];\n\n for (const line of output.trim().split('\\n')) {\n if (!line) continue;\n const [hash, message, author, date] = line.split('|||');\n if (hash && message) {\n entries.push({ hash, message, author, date });\n }\n }\n\n return entries;\n } catch {\n // Return empty if git log fails (e.g., not enough commits)\n return [];\n }\n },\n\n async diffFiles(baseline: string, patterns?: string[]): Promise<string[]> {\n try {\n const pathSpecs =\n patterns && patterns.length > 0\n ? `-- ${patterns.map((p) => `'${p}'`).join(' ')}`\n : '';\n\n const output = execSync(\n `git diff --name-only ${baseline}...HEAD ${pathSpecs}`,\n {\n cwd: baseCwd,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'pipe'],\n }\n );\n\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n // Return empty array if diff fails (e.g., baseline doesn't exist)\n return [];\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,qBAAqB,KAA0B;CAC7D,MAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,QAAO;EACL,MAAM,SAAS,KAAa,UAAmC;AAC7D,OAAI;AACF,WAAO,SAAS,YAAY,IAAI,GAAG,YAAY;KAC7C,KAAK;KACL,UAAU;KACV,OAAO;MAAC;MAAU;MAAQ;MAAO;KAClC,CAAC;YACK,OAAO;AACd,UAAM,IAAI,MACR,kBAAkB,SAAS,UAAU,IAAI,IACvC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAEzD;;;EAIL,MAAM,MAAM,SAA0C;GACpD,MAAM,QAAkB,EAAE;AAC1B,OAAI,SAAS,MAAO,OAAM,KAAK,KAAK;AACpC,OAAI,SAAS,YAAa,OAAM,KAAK,KAAK;AAC1C,OAAI,SAAS,QAAS,OAAM,KAAK,KAAK;AACtC,OAAI,SAAS,OAAQ,OAAM,KAAK,YAAY;AAE5C,YAAS,aAAa,MAAM,KAAK,IAAI,IAAI;IACvC,KAAK;IACL,OAAO;IACR,CAAC;;EAGJ,MAAM,UAAU,QAAiC;GAC/C,MAAM,aAAaA,SAAO,QAAQ,SAASA,OAAK,GAAG;AACnD,OAAI;AACF,UAAM,OAAO,QAAQ,YAAY,OAAO,CAAC;AACzC,WAAO;WACD;AACN,WAAO;;;EAIX,MAAM,IAAI,UAA2C;GACnD,MAAM,MAAM,YAAY;GACxB,MAAM,SAAS;AAEf,OAAI;IACF,MAAM,SAAS,SAAS,WAAW,IAAI,SAAS,UAAU;KACxD,KAAK;KACL,UAAU;KACV,OAAO;MAAC;MAAU;MAAQ;MAAO;KAClC,CAAC;IAEF,MAAM,UAAyB,EAAE;AAEjC,SAAK,MAAM,QAAQ,OAAO,MAAM,CAAC,MAAM,KAAK,EAAE;AAC5C,SAAI,CAAC,KAAM;KACX,MAAM,CAAC,MAAM,SAAS,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvD,SAAI,QAAQ,QACV,SAAQ,KAAK;MAAE;MAAM;MAAS;MAAQ;MAAM,CAAC;;AAIjD,WAAO;WACD;AAEN,WAAO,EAAE;;;EAIb,MAAM,UAAU,UAAkB,UAAwC;AACxE,OAAI;AAeF,WATe,SACb,wBAAwB,SAAS,UALjC,YAAY,SAAS,SAAS,IAC1B,MAAM,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,KAC7C,MAIJ;KACE,KAAK;KACL,UAAU;KACV,OAAO;MAAC;MAAU;MAAQ;MAAO;KAClC,CACF,CAEa,MAAM,CAAC,MAAM,KAAK,CAAC,OAAO,QAAQ;WAC1C;AAEN,WAAO,EAAE;;;EAGd"}
package/dist/index.d.mts CHANGED
@@ -103,7 +103,7 @@ import { index_d_exports as index_d_exports$3 } from "./services/hooks/index.mjs
103
103
  import { RuleSyncService } from "./services/rulesync.mjs";
104
104
  import { FixStrategyType, FixableIssue } from "./services/fix/types.mjs";
105
105
  import { index_d_exports as index_d_exports$1 } from "./services/fix/index.mjs";
106
- import { ViewAudience, generateView } from "./services/view/index.mjs";
106
+ import { GenerateViewsOptions, GenerateViewsResult, ListSpecsForViewOptions, ListSpecsForViewResult, VALID_AUDIENCES, ViewAudience, ViewEntry, generateView, generateViews, listSpecsForView, validateAudience } from "./services/view/index.mjs";
107
107
  import { GapAnalysisResult, analyzeGap } from "./services/gap.mjs";
108
108
  import { GenerateArtifactsResult, generateArtifacts } from "./services/generate-artifacts.mjs";
109
109
  import { ExtractOptions, extractContracts } from "./services/extract.mjs";
@@ -125,4 +125,4 @@ import { index_d_exports as index_d_exports$5 } from "./ai/prompts/index.mjs";
125
125
  import "./ai/index.mjs";
126
126
  import { index_d_exports as index_d_exports$8 } from "./utils/index.mjs";
127
127
  import * as module from "@contractspec/module.workspace";
128
- export { AIClient, AIGenerator, AIReviewResult, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentAdapter, AgentConfig, AgentGuideConfig, AgentGuideService, type AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, AiAdapter, AiGenerateOptions, AiGenerateResult, AiGenerateStructuredOptions, type AiProvider, AiValidationResult, AnalyzeDepsOptions, AnalyzeDepsResult, BehaviorCheck, BlueprintValidationResult, BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, CHECK_CATEGORY_LABELS, CICheckCategory, CICheckCategorySummary, CICheckOptions, CICheckResult, CIFormatOptions, CIIssue, CIIssueSeverity, CIOutputFormat, CI_CHECK_CATEGORY_LABELS, CacheEntryMeta, CacheKeyString, CacheLookupResult, CacheMissReason, CacheStats, CacheStorageAdapter, CheckCategory, CheckContext, CheckResult, CheckStatus, ClaudeCodeAdapter, ClaudeCodeAgent, CleanOptions, CleanResult, CompareSpecsOptions, CompareSpecsResult, type Config, CoverageByType, CreateAdaptersOptions, CreateRegeneratorOptions, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DEFAULT_SPEC_PATTERNS, DiagramOptions, DiagramType, DiscoverOptions, DiscoveryOptions, DocsServiceOptions, DocsServiceResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult, EndpointVerification, ExtendedWorkspaceInfo, ExtractOptions, FULL_DEPENDENCIES, FeatureSpecParams, FieldMapping, FieldMatchType, FileStat, FileSystemCacheStorage, FixAction, FixResult, type FixStrategyType, type FixableIssue, FormatOptions, FormatterOptions, FsAdapter, GapAnalysisResult, GenerateArtifactsResult, GenericMCPAdapter, GitAdapter, GitCleanOptions, GitLogEntry, GuideOptions, GuideResult, ImplementationSource, ImplementationStatus, ImplementationValidationResult, ImplementationValidatorOptions, ImportServiceAdapters, ImportServiceOptions, ImportServiceResult, VerificationIssue as ImportVerificationIssue, VerifyOptions as ImportVerifyOptions, VerifyResult as ImportVerifyResult, InMemoryCacheStorage, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, IntentAlignment, KeyValueStore, LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, OpenApiExportOptions as LegacyOpenApiExportOptions, OpenApiExportResult as LegacyOpenApiExportResult, ListSpecsOptions, LogLevel, LoggerAdapter, MINIMAL_DEPENDENCIES, MetaRepoInfo, MonorepoConfig, OpenAICodexAgent, OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult, PackageInstallResult, PackageManager, ProgressReporter, ProgressUpdate, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult, RegistryClient, RegistryClientOptions, ReportOptions, RepositoryType, ResolvedImplementation, ResolverOptions, RuleSyncOptions, RuleSyncPort, RuleSyncResult, RuleSyncService, RunTestsResult, SETUP_TARGET_LABELS, SemanticVerificationResult, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget, SimpleAgent, SpecCreatorService, SpecImplementationResult, SpecInventory, SpecLocation, SpecReferenceMatch, SpecVersionAnalysis, StructureCheck, SubmoduleInfo, SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, TenantValidationContext, TenantValidationResult, TestGeneratorOptions, TestGeneratorService, TestServiceOptions, TestServiceResult, ValidateImplementationOptions, ValidateImplementationResult, ValidateSpecOptions, ValidateSpecResult, VerificationCacheConfig, VerificationCacheEntry, VerificationCacheKey, VerificationCacheService, VerificationIssue$1 as VerificationIssue, VerifyConfig, VerifyInput, VerifyOptions$1 as VerifyOptions, VerifyResult$1 as VerifyResult, VerifyService, ViewAudience, WatchBuildFn, WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, WatchSpecsOptions, WatchValidateFn, Watcher, WatcherAdapter, WorkspaceAdapters, WorkspaceConfigInfo, WorkspaceInfo, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeGap, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, determineStatus, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractContracts, extractSpecReferences, index_d_exports as features, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, index_d_exports$1 as fix, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, index_d_exports$2 as formatters, generateAgentsMd, generateAppBlueprintSpec, generateArtifacts, generateClaudeMcpConfig, generateCliReport, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateFeatureSpec, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMarkdownReport, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateView, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getConventionPaths, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getSpecKeyVariants, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, index_d_exports$3 as hooks, index_d_exports$4 as impact, importFromOpenApiService, importFromSourceService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, listTests, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseExplicitImplementations, parseGitModules, index_d_exports$5 as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, index_d_exports$6 as templates, toKebabCase, index_d_exports$7 as upgrade, index_d_exports$8 as utils, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifyImportedContracts, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, index_d_exports$9 as versioning, index_d_exports$10 as vibe, watchSpecs };
128
+ export { AIClient, AIGenerator, AIReviewResult, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentAdapter, AgentConfig, AgentGuideConfig, AgentGuideService, type AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, AiAdapter, AiGenerateOptions, AiGenerateResult, AiGenerateStructuredOptions, type AiProvider, AiValidationResult, AnalyzeDepsOptions, AnalyzeDepsResult, BehaviorCheck, BlueprintValidationResult, BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, CHECK_CATEGORY_LABELS, CICheckCategory, CICheckCategorySummary, CICheckOptions, CICheckResult, CIFormatOptions, CIIssue, CIIssueSeverity, CIOutputFormat, CI_CHECK_CATEGORY_LABELS, CacheEntryMeta, CacheKeyString, CacheLookupResult, CacheMissReason, CacheStats, CacheStorageAdapter, CheckCategory, CheckContext, CheckResult, CheckStatus, ClaudeCodeAdapter, ClaudeCodeAgent, CleanOptions, CleanResult, CompareSpecsOptions, CompareSpecsResult, type Config, CoverageByType, CreateAdaptersOptions, CreateRegeneratorOptions, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DEFAULT_SPEC_PATTERNS, DiagramOptions, DiagramType, DiscoverOptions, DiscoveryOptions, DocsServiceOptions, DocsServiceResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult, EndpointVerification, ExtendedWorkspaceInfo, ExtractOptions, FULL_DEPENDENCIES, FeatureSpecParams, FieldMapping, FieldMatchType, FileStat, FileSystemCacheStorage, FixAction, FixResult, type FixStrategyType, type FixableIssue, FormatOptions, FormatterOptions, FsAdapter, GapAnalysisResult, GenerateArtifactsResult, GenerateViewsOptions, GenerateViewsResult, GenericMCPAdapter, GitAdapter, GitCleanOptions, GitLogEntry, GuideOptions, GuideResult, ImplementationSource, ImplementationStatus, ImplementationValidationResult, ImplementationValidatorOptions, ImportServiceAdapters, ImportServiceOptions, ImportServiceResult, VerificationIssue as ImportVerificationIssue, VerifyOptions as ImportVerifyOptions, VerifyResult as ImportVerifyResult, InMemoryCacheStorage, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, IntentAlignment, KeyValueStore, LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, OpenApiExportOptions as LegacyOpenApiExportOptions, OpenApiExportResult as LegacyOpenApiExportResult, ListSpecsForViewOptions, ListSpecsForViewResult, ListSpecsOptions, LogLevel, LoggerAdapter, MINIMAL_DEPENDENCIES, MetaRepoInfo, MonorepoConfig, OpenAICodexAgent, OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult, PackageInstallResult, PackageManager, ProgressReporter, ProgressUpdate, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult, RegistryClient, RegistryClientOptions, ReportOptions, RepositoryType, ResolvedImplementation, ResolverOptions, RuleSyncOptions, RuleSyncPort, RuleSyncResult, RuleSyncService, RunTestsResult, SETUP_TARGET_LABELS, SemanticVerificationResult, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget, SimpleAgent, SpecCreatorService, SpecImplementationResult, SpecInventory, SpecLocation, SpecReferenceMatch, SpecVersionAnalysis, StructureCheck, SubmoduleInfo, SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, TenantValidationContext, TenantValidationResult, TestGeneratorOptions, TestGeneratorService, TestServiceOptions, TestServiceResult, VALID_AUDIENCES, ValidateImplementationOptions, ValidateImplementationResult, ValidateSpecOptions, ValidateSpecResult, VerificationCacheConfig, VerificationCacheEntry, VerificationCacheKey, VerificationCacheService, VerificationIssue$1 as VerificationIssue, VerifyConfig, VerifyInput, VerifyOptions$1 as VerifyOptions, VerifyResult$1 as VerifyResult, VerifyService, ViewAudience, ViewEntry, WatchBuildFn, WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, WatchSpecsOptions, WatchValidateFn, Watcher, WatcherAdapter, WorkspaceAdapters, WorkspaceConfigInfo, WorkspaceInfo, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeGap, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, determineStatus, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractContracts, extractSpecReferences, index_d_exports as features, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, index_d_exports$1 as fix, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, index_d_exports$2 as formatters, generateAgentsMd, generateAppBlueprintSpec, generateArtifacts, generateClaudeMcpConfig, generateCliReport, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateFeatureSpec, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMarkdownReport, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateView, generateViews, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getConventionPaths, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getSpecKeyVariants, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, index_d_exports$3 as hooks, index_d_exports$4 as impact, importFromOpenApiService, importFromSourceService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, listSpecsForView, listTests, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseExplicitImplementations, parseGitModules, index_d_exports$5 as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, index_d_exports$6 as templates, toKebabCase, index_d_exports$7 as upgrade, index_d_exports$8 as utils, validateAgainstOpenApiService, validateAudience, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifyImportedContracts, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, index_d_exports$9 as versioning, index_d_exports$10 as vibe, watchSpecs };
package/dist/index.mjs CHANGED
@@ -96,7 +96,7 @@ import { upgrade_exports } from "./services/upgrade/index.mjs";
96
96
  import { hooks_exports } from "./services/hooks/index.mjs";
97
97
  import { RuleSyncService } from "./services/rulesync.mjs";
98
98
  import { fix_exports } from "./services/fix/index.mjs";
99
- import { generateView } from "./services/view/index.mjs";
99
+ import { VALID_AUDIENCES, generateView, generateViews, listSpecsForView, validateAudience } from "./services/view/index.mjs";
100
100
  import { analyzeGap } from "./services/gap.mjs";
101
101
  import { extractContracts } from "./services/extract.mjs";
102
102
  import { vibe_exports } from "./services/vibe/index.mjs";
@@ -110,4 +110,4 @@ import { prompts_exports } from "./ai/prompts/index.mjs";
110
110
  import "./ai/index.mjs";
111
111
  import * as module from "@contractspec/module.workspace";
112
112
 
113
- export { AIClient, AIGenerator, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentGuideService, AgentOrchestrator, CHECK_CATEGORY_LABELS, CI_CHECK_CATEGORY_LABELS, ClaudeCodeAdapter, ClaudeCodeAgent, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DEFAULT_SPEC_PATTERNS, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, OpenAICodexAgent, RegistryClient, RuleSyncService, SETUP_TARGET_LABELS, SimpleAgent, SpecCreatorService, TestGeneratorService, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeGap, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, determineStatus, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractContracts, extractSpecReferences, features_exports as features, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, fix_exports as fix, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateArtifacts, generateClaudeMcpConfig, generateCliReport, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateFeatureSpec, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMarkdownReport, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateView, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getConventionPaths, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getSpecKeyVariants, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, hooks_exports as hooks, impact_exports as impact, importFromOpenApiService, importFromSourceService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, listTests, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseExplicitImplementations, parseGitModules, prompts_exports as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, toKebabCase, upgrade_exports as upgrade, utils_exports as utils, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifyImportedContracts, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, versioning_exports as versioning, vibe_exports as vibe, watchSpecs };
113
+ export { AIClient, AIGenerator, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentGuideService, AgentOrchestrator, CHECK_CATEGORY_LABELS, CI_CHECK_CATEGORY_LABELS, ClaudeCodeAdapter, ClaudeCodeAgent, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DEFAULT_SPEC_PATTERNS, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, OpenAICodexAgent, RegistryClient, RuleSyncService, SETUP_TARGET_LABELS, SimpleAgent, SpecCreatorService, TestGeneratorService, VALID_AUDIENCES, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeGap, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, determineStatus, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractContracts, extractSpecReferences, features_exports as features, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, fix_exports as fix, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateArtifacts, generateClaudeMcpConfig, generateCliReport, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateFeatureSpec, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMarkdownReport, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateView, generateViews, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getConventionPaths, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getSpecKeyVariants, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, hooks_exports as hooks, impact_exports as impact, importFromOpenApiService, importFromSourceService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, listSpecsForView, listTests, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseExplicitImplementations, parseGitModules, prompts_exports as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, toKebabCase, upgrade_exports as upgrade, utils_exports as utils, validateAgainstOpenApiService, validateAudience, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifyImportedContracts, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, versioning_exports as versioning, vibe_exports as vibe, watchSpecs };
@@ -22,6 +22,11 @@ interface GitAdapter {
22
22
  * Get commit log since a baseline ref.
23
23
  */
24
24
  log(baseline?: string): Promise<GitLogEntry[]>;
25
+ /**
26
+ * Get list of files changed between baseline and HEAD.
27
+ * Uses three-dot diff (baseline...HEAD) to show changes since branches diverged.
28
+ */
29
+ diffFiles(baseline: string, patterns?: string[]): Promise<string[]>;
25
30
  }
26
31
  /**
27
32
  * Entry from git log.
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.mts","names":[],"sources":["../../src/ports/git.ts"],"sourcesContent":[],"mappings":";;AAOA;;;;;AAmBkC,UAnBjB,UAAA,CAmBiB;EAAR;;AAM1B;EAUiB,QAAA,CAAA,GAAA,EAAA,MAAe,EAAA,QAAA,EAAA,MAAA,CAAA,EA/BW,OA+BX,CAAA,MAAA,CAAA;;;;kBA1Bd,kBAAkB;;;;4BAKR;;;;0BAKF,QAAQ;;;;;UAMjB,WAAA;;;;;;;;;UAUA,eAAA"}
1
+ {"version":3,"file":"git.d.mts","names":[],"sources":["../../src/ports/git.ts"],"sourcesContent":[],"mappings":";;AAOA;;;;;AAmBkC,UAnBjB,UAAA,CAmBiB;EAAR;;;EAYT,QAAA,CAAA,GAAA,EAAW,MAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EA3Be,OA2Bf,CAAA,MAAA,CAAA;EAUX;;;kBAhCC,kBAAkB;;;;4BAKR;;;;0BAKF,QAAQ;;;;;oDAMkB;;;;;UAMnC,WAAA;;;;;;;;;UAUA,eAAA"}
@@ -96,7 +96,7 @@ import { index_d_exports as index_d_exports$3 } from "./upgrade/index.mjs";
96
96
  import { index_d_exports as index_d_exports$4 } from "./hooks/index.mjs";
97
97
  import { RuleSyncService } from "./rulesync.mjs";
98
98
  import { index_d_exports as index_d_exports$5 } from "./fix/index.mjs";
99
- import { ViewAudience, generateView } from "./view/index.mjs";
99
+ import { GenerateViewsOptions, GenerateViewsResult, ListSpecsForViewOptions, ListSpecsForViewResult, VALID_AUDIENCES, ViewAudience, ViewEntry, generateView, generateViews, listSpecsForView, validateAudience } from "./view/index.mjs";
100
100
  import { GapAnalysisResult, analyzeGap } from "./gap.mjs";
101
101
  import { GenerateArtifactsResult, generateArtifacts } from "./generate-artifacts.mjs";
102
102
  import { ExtractOptions, extractContracts } from "./extract.mjs";
@@ -92,7 +92,7 @@ import { upgrade_exports } from "./upgrade/index.mjs";
92
92
  import { hooks_exports } from "./hooks/index.mjs";
93
93
  import { RuleSyncService } from "./rulesync.mjs";
94
94
  import { fix_exports } from "./fix/index.mjs";
95
- import { generateView } from "./view/index.mjs";
95
+ import { VALID_AUDIENCES, generateView, generateViews, listSpecsForView, validateAudience } from "./view/index.mjs";
96
96
  import { analyzeGap } from "./gap.mjs";
97
97
  import { extractContracts } from "./extract.mjs";
98
98
  import { vibe_exports } from "./vibe/index.mjs";
@@ -2,10 +2,110 @@ import { WorkspaceAdapters } from "../../ports/logger.mjs";
2
2
 
3
3
  //#region src/services/view/index.d.ts
4
4
  type ViewAudience = 'product' | 'eng' | 'qa';
5
+ /**
6
+ * Valid audience types for view generation.
7
+ */
8
+ declare const VALID_AUDIENCES: ViewAudience[];
9
+ /**
10
+ * Options for generating views.
11
+ */
12
+ interface GenerateViewsOptions {
13
+ /**
14
+ * Target audience for the views.
15
+ */
16
+ audience: ViewAudience;
17
+ /**
18
+ * Explicit spec files to process (if not provided, scans workspace).
19
+ */
20
+ specFiles?: string[];
21
+ /**
22
+ * Git ref to compare against (only include specs changed since baseline).
23
+ * Only used when specFiles is not provided.
24
+ */
25
+ baseline?: string;
26
+ }
27
+ /**
28
+ * A single view entry with file path and content.
29
+ */
30
+ interface ViewEntry {
31
+ filePath: string;
32
+ content: string;
33
+ }
34
+ /**
35
+ * Result of generating views.
36
+ */
37
+ interface GenerateViewsResult {
38
+ /**
39
+ * Generated views.
40
+ */
41
+ views: ViewEntry[];
42
+ /**
43
+ * Total number of specs found in workspace (when scanning).
44
+ */
45
+ totalSpecs?: number;
46
+ /**
47
+ * Number of changed files since baseline (when baseline is provided).
48
+ */
49
+ changedFilesCount?: number;
50
+ /**
51
+ * Status of the operation.
52
+ */
53
+ status: 'success' | 'no_specs' | 'no_changes' | 'no_changed_specs';
54
+ }
55
+ /**
56
+ * Validate that the audience is a valid ViewAudience.
57
+ */
58
+ declare function validateAudience(audience: string): audience is ViewAudience;
59
+ /**
60
+ * Generate audience-specific views for specs.
61
+ *
62
+ * This is the main entry point for view generation. It handles:
63
+ * - Audience validation
64
+ * - Spec file resolution (explicit files or workspace scan with optional baseline filtering)
65
+ * - View generation for all matching specs
66
+ */
67
+ declare function generateViews(adapters: WorkspaceAdapters, options: GenerateViewsOptions): Promise<GenerateViewsResult>;
68
+ /**
69
+ * Options for listing specs for view generation.
70
+ */
71
+ interface ListSpecsForViewOptions {
72
+ /**
73
+ * Git ref to compare against (only include specs changed since baseline).
74
+ */
75
+ baseline?: string;
76
+ }
77
+ /**
78
+ * Result of listing specs for view generation.
79
+ */
80
+ interface ListSpecsForViewResult {
81
+ /**
82
+ * List of spec file paths to process.
83
+ */
84
+ specFiles: string[];
85
+ /**
86
+ * Total number of specs found in workspace.
87
+ */
88
+ totalSpecs: number;
89
+ /**
90
+ * Number of changed files (when baseline is provided).
91
+ */
92
+ changedFilesCount?: number;
93
+ /**
94
+ * Whether any changes were detected (when baseline is provided).
95
+ */
96
+ hasChanges?: boolean;
97
+ }
98
+ /**
99
+ * List spec files for view generation, with optional baseline filtering.
100
+ *
101
+ * When a baseline is provided, only specs that changed since the baseline
102
+ * are included in the result.
103
+ */
104
+ declare function listSpecsForView(adapters: WorkspaceAdapters, options?: ListSpecsForViewOptions): Promise<ListSpecsForViewResult>;
5
105
  /**
6
106
  * Generate an audience-specific view of a spec file.
7
107
  */
8
108
  declare function generateView(specFile: string, audience: ViewAudience, adapters: WorkspaceAdapters): Promise<string>;
9
109
  //#endregion
10
- export { ViewAudience, generateView };
110
+ export { GenerateViewsOptions, GenerateViewsResult, ListSpecsForViewOptions, ListSpecsForViewResult, VALID_AUDIENCES, ViewAudience, ViewEntry, generateView, generateViews, listSpecsForView, validateAudience };
11
111
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":[],"mappings":";;;KAMY,YAAA;;AAAZ;AAKA;AAEY,iBAFU,YAAA,CAEV,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EACA,iBADA,CAAA,EAET,OAFS,CAAA,MAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":[],"mappings":";;;KAOY,YAAA;;AAAZ;AAKA;AAKiB,cALJ,eAKwB,EALP,YASlB,EAAA;AAeZ;AAQA;AAsBA;AAYsB,UA7DL,oBAAA,CA6DkB;EACvB;;;EAET,QAAA,EA5DS,YA4DT;EAAO;AA4EV;AAUA;EAyBsB,SAAA,CAAA,EAAA,MAAA,EAAgB;EAC1B;;;;EAEF,QAAA,CAAA,EAAA,MAAA;AAgDV;;;;AAIU,UAnNO,SAAA,CAmNP;;;;;;;UA3MO,mBAAA;;;;SAIR;;;;;;;;;;;;;;;;;iBAkBO,gBAAA,gCAAgD;;;;;;;;;iBAY1C,aAAA,WACV,4BACD,uBACR,QAAQ;;;;UA4EM,uBAAA;;;;;;;;;UAUA,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;iBAyBK,gBAAA,WACV,6BACD,0BACR,QAAQ;;;;iBAgDW,YAAA,6BAEV,wBACA,oBACT"}
@@ -1,7 +1,105 @@
1
+ import { listSpecs } from "../list.mjs";
1
2
  import { loadSpecFromSource } from "@contractspec/module.workspace";
2
3
 
3
4
  //#region src/services/view/index.ts
4
5
  /**
6
+ * Valid audience types for view generation.
7
+ */
8
+ const VALID_AUDIENCES = [
9
+ "product",
10
+ "eng",
11
+ "qa"
12
+ ];
13
+ /**
14
+ * Validate that the audience is a valid ViewAudience.
15
+ */
16
+ function validateAudience(audience) {
17
+ return VALID_AUDIENCES.includes(audience);
18
+ }
19
+ /**
20
+ * Generate audience-specific views for specs.
21
+ *
22
+ * This is the main entry point for view generation. It handles:
23
+ * - Audience validation
24
+ * - Spec file resolution (explicit files or workspace scan with optional baseline filtering)
25
+ * - View generation for all matching specs
26
+ */
27
+ async function generateViews(adapters, options) {
28
+ if (!validateAudience(options.audience)) throw new Error(`Invalid audience: ${options.audience}. Must be one of: ${VALID_AUDIENCES.join(", ")}`);
29
+ let filesToProcess;
30
+ let totalSpecs;
31
+ let changedFilesCount;
32
+ if (options.specFiles && options.specFiles.length > 0) filesToProcess = options.specFiles;
33
+ else {
34
+ const listResult = await listSpecsForView(adapters, { baseline: options.baseline });
35
+ totalSpecs = listResult.totalSpecs;
36
+ changedFilesCount = listResult.changedFilesCount;
37
+ if (options.baseline) {
38
+ if (listResult.changedFilesCount === 0) return {
39
+ views: [],
40
+ totalSpecs,
41
+ changedFilesCount: 0,
42
+ status: "no_changes"
43
+ };
44
+ if (listResult.specFiles.length === 0) return {
45
+ views: [],
46
+ totalSpecs,
47
+ changedFilesCount,
48
+ status: "no_changed_specs"
49
+ };
50
+ }
51
+ filesToProcess = listResult.specFiles;
52
+ }
53
+ if (filesToProcess.length === 0) return {
54
+ views: [],
55
+ totalSpecs,
56
+ changedFilesCount,
57
+ status: "no_specs"
58
+ };
59
+ const views = [];
60
+ for (const specFile of filesToProcess) {
61
+ const content = await generateView(specFile, options.audience, adapters);
62
+ views.push({
63
+ filePath: specFile,
64
+ content
65
+ });
66
+ }
67
+ return {
68
+ views,
69
+ totalSpecs,
70
+ changedFilesCount,
71
+ status: "success"
72
+ };
73
+ }
74
+ /**
75
+ * List spec files for view generation, with optional baseline filtering.
76
+ *
77
+ * When a baseline is provided, only specs that changed since the baseline
78
+ * are included in the result.
79
+ */
80
+ async function listSpecsForView(adapters, options = {}) {
81
+ const allSpecFiles = (await listSpecs({ fs: adapters.fs })).map((s) => s.filePath);
82
+ const totalSpecs = allSpecFiles.length;
83
+ if (!options.baseline) return {
84
+ specFiles: allSpecFiles,
85
+ totalSpecs
86
+ };
87
+ const changedFiles = await adapters.git.diffFiles(options.baseline);
88
+ if (changedFiles.length === 0) return {
89
+ specFiles: [],
90
+ totalSpecs,
91
+ changedFilesCount: 0,
92
+ hasChanges: false
93
+ };
94
+ const filteredSpecs = allSpecFiles.filter((specPath) => changedFiles.some((changed) => specPath.endsWith(changed) || changed.endsWith(specPath) || specPath.includes(changed) || changed.includes(specPath)));
95
+ return {
96
+ specFiles: filteredSpecs,
97
+ totalSpecs,
98
+ changedFilesCount: changedFiles.length,
99
+ hasChanges: filteredSpecs.length > 0
100
+ };
101
+ }
102
+ /**
5
103
  * Generate an audience-specific view of a spec file.
6
104
  */
7
105
  async function generateView(specFile, audience, adapters) {
@@ -115,5 +213,5 @@ function formatQaView(spec, lines) {
115
213
  }
116
214
 
117
215
  //#endregion
118
- export { generateView };
216
+ export { VALID_AUDIENCES, generateView, generateViews, listSpecsForView, validateAudience };
119
217
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":["import {\n loadSpecFromSource,\n type ParsedSpec,\n} from '@contractspec/module.workspace';\nimport type { WorkspaceAdapters } from '../../ports/logger';\n\nexport type ViewAudience = 'product' | 'eng' | 'qa';\n\n/**\n * Generate an audience-specific view of a spec file.\n */\nexport async function generateView(\n specFile: string,\n audience: ViewAudience,\n adapters: WorkspaceAdapters\n): Promise<string> {\n // Using the module's static analysis, which uses node:fs internally\n // We check existence first using adapters for better error handling\n if (!(await adapters.fs.exists(specFile))) {\n throw new Error(`File not found: ${specFile}`);\n }\n\n const specs = await loadSpecFromSource(specFile);\n\n if (specs.length === 0) {\n return `No specs found in ${specFile} (Parse result empty)`;\n }\n\n return specs\n .map((spec) => formatSpecForAudience(spec, audience))\n .join('\\n\\n---\\n\\n');\n}\n\nfunction formatSpecForAudience(\n spec: ParsedSpec,\n audience: ViewAudience\n): string {\n const lines: string[] = [];\n\n switch (audience) {\n case 'product':\n formatProductView(spec, lines);\n break;\n case 'eng':\n formatEngView(spec, lines);\n break;\n case 'qa':\n formatQaView(spec, lines);\n break;\n }\n\n return lines.join('\\n');\n}\n\nfunction formatProductView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Product (User Flow & Capabilities)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`### Goal\\n${spec.meta.goal}\\n`);\n }\n if (spec.meta.context) {\n lines.push(`### Context\\n${spec.meta.context}\\n`);\n }\n\n if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Capabilities (Operations)');\n spec.operations.forEach((op) => lines.push(`- **${op.name}**`));\n lines.push('');\n }\n if (spec.presentations?.length) {\n lines.push('### User Interfaces (Presentations)');\n spec.presentations.forEach((p) => lines.push(`- **${p.name}**`));\n lines.push('');\n }\n } else if (spec.specType === 'operation') {\n lines.push('### Behavior');\n if (spec.hasPolicy) lines.push('- ✅ Enforces Business Policies');\n if (spec.hasIo) lines.push('- ✅ Validates Inputs/Outputs');\n if (spec.emittedEvents?.length) {\n lines.push('### Triggers');\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- **${ev.name}** (Event)`)\n );\n }\n } else {\n lines.push(`Type: ${spec.specType}`);\n }\n}\n\nfunction formatEngView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Engineering (API, Schemas, Constraints)');\n lines.push('');\n\n lines.push(`- **Type**: \\`${spec.specType}\\``);\n lines.push(`- **Version**: \\`${spec.meta.version}\\``);\n if (spec.meta.stability)\n lines.push(`- **Stability**: \\`${spec.meta.stability}\\``);\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push('### Contract Details');\n lines.push(`- **I/O Schema**: ${spec.hasIo ? '✅ Defined' : '❌ Missing'}`);\n lines.push(\n `- **Policy Config**: ${spec.hasPolicy ? '✅ Defined' : '❌ None'}`\n );\n lines.push('');\n\n if (spec.emittedEvents?.length) {\n lines.push('### Emitted Events');\n spec.emittedEvents.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Operations');\n spec.operations.forEach((op) => lines.push(`- \\`${op.name}\\``));\n lines.push('');\n }\n if (spec.events?.length) {\n lines.push('### Events');\n spec.events.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n }\n\n if (spec.sourceBlock) {\n lines.push('### Source Signature');\n lines.push('```typescript');\n lines.push(spec.sourceBlock);\n lines.push('```');\n }\n}\n\nfunction formatQaView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: QA (Scenarios, Test Coverage)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`**Goal**: ${spec.meta.goal}\\n`);\n }\n\n if (spec.testRefs?.length) {\n lines.push('### Linked Scenarios');\n spec.testRefs.forEach((test) => lines.push(`- 🧪 \\`${test.name}\\``));\n lines.push('');\n } else {\n lines.push('### Linked Scenarios');\n lines.push('_(No explicit test refs found)_');\n lines.push('');\n }\n\n lines.push('### Verification Checklist');\n if (spec.specType === 'operation') {\n lines.push(\n `- [ ] Verify input validation for \\`${spec.meta.key}\\` (Success/Fail cases)`\n );\n if (spec.hasPolicy) lines.push(`- [ ] Verify policy enforcement rules`);\n if (spec.emittedEvents?.length) {\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- [ ] Verify event \\`${ev.name}\\` is emitted`)\n );\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n spec.operations.forEach((op) =>\n lines.push(`- [ ] Test Operation flow: \\`${op.name}\\``)\n );\n }\n if (spec.presentations?.length) {\n spec.presentations.forEach((p) =>\n lines.push(`- [ ] Test UI Component: \\`${p.name}\\``)\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":["import {\n loadSpecFromSource,\n type ParsedSpec,\n} from '@contractspec/module.workspace';\nimport type { WorkspaceAdapters } from '../../ports/logger';\nimport { listSpecs } from '../list';\n\nexport type ViewAudience = 'product' | 'eng' | 'qa';\n\n/**\n * Valid audience types for view generation.\n */\nexport const VALID_AUDIENCES: ViewAudience[] = ['product', 'eng', 'qa'];\n\n/**\n * Options for generating views.\n */\nexport interface GenerateViewsOptions {\n /**\n * Target audience for the views.\n */\n audience: ViewAudience;\n /**\n * Explicit spec files to process (if not provided, scans workspace).\n */\n specFiles?: string[];\n /**\n * Git ref to compare against (only include specs changed since baseline).\n * Only used when specFiles is not provided.\n */\n baseline?: string;\n}\n\n/**\n * A single view entry with file path and content.\n */\nexport interface ViewEntry {\n filePath: string;\n content: string;\n}\n\n/**\n * Result of generating views.\n */\nexport interface GenerateViewsResult {\n /**\n * Generated views.\n */\n views: ViewEntry[];\n /**\n * Total number of specs found in workspace (when scanning).\n */\n totalSpecs?: number;\n /**\n * Number of changed files since baseline (when baseline is provided).\n */\n changedFilesCount?: number;\n /**\n * Status of the operation.\n */\n status: 'success' | 'no_specs' | 'no_changes' | 'no_changed_specs';\n}\n\n/**\n * Validate that the audience is a valid ViewAudience.\n */\nexport function validateAudience(audience: string): audience is ViewAudience {\n return VALID_AUDIENCES.includes(audience as ViewAudience);\n}\n\n/**\n * Generate audience-specific views for specs.\n *\n * This is the main entry point for view generation. It handles:\n * - Audience validation\n * - Spec file resolution (explicit files or workspace scan with optional baseline filtering)\n * - View generation for all matching specs\n */\nexport async function generateViews(\n adapters: WorkspaceAdapters,\n options: GenerateViewsOptions\n): Promise<GenerateViewsResult> {\n // Validate audience\n if (!validateAudience(options.audience)) {\n throw new Error(\n `Invalid audience: ${options.audience}. Must be one of: ${VALID_AUDIENCES.join(', ')}`\n );\n }\n\n let filesToProcess: string[];\n let totalSpecs: number | undefined;\n let changedFilesCount: number | undefined;\n\n // Resolve files to process\n if (options.specFiles && options.specFiles.length > 0) {\n filesToProcess = options.specFiles;\n } else {\n // Scan workspace with optional baseline filtering\n const listResult = await listSpecsForView(adapters, {\n baseline: options.baseline,\n });\n\n totalSpecs = listResult.totalSpecs;\n changedFilesCount = listResult.changedFilesCount;\n\n // Handle baseline filtering edge cases\n if (options.baseline) {\n if (listResult.changedFilesCount === 0) {\n return {\n views: [],\n totalSpecs,\n changedFilesCount: 0,\n status: 'no_changes',\n };\n }\n\n if (listResult.specFiles.length === 0) {\n return {\n views: [],\n totalSpecs,\n changedFilesCount,\n status: 'no_changed_specs',\n };\n }\n }\n\n filesToProcess = listResult.specFiles;\n }\n\n // No specs to process\n if (filesToProcess.length === 0) {\n return {\n views: [],\n totalSpecs,\n changedFilesCount,\n status: 'no_specs',\n };\n }\n\n // Generate views for all specs\n const views: ViewEntry[] = [];\n for (const specFile of filesToProcess) {\n const content = await generateView(specFile, options.audience, adapters);\n views.push({ filePath: specFile, content });\n }\n\n return {\n views,\n totalSpecs,\n changedFilesCount,\n status: 'success',\n };\n}\n\n/**\n * Options for listing specs for view generation.\n */\nexport interface ListSpecsForViewOptions {\n /**\n * Git ref to compare against (only include specs changed since baseline).\n */\n baseline?: string;\n}\n\n/**\n * Result of listing specs for view generation.\n */\nexport interface ListSpecsForViewResult {\n /**\n * List of spec file paths to process.\n */\n specFiles: string[];\n /**\n * Total number of specs found in workspace.\n */\n totalSpecs: number;\n /**\n * Number of changed files (when baseline is provided).\n */\n changedFilesCount?: number;\n /**\n * Whether any changes were detected (when baseline is provided).\n */\n hasChanges?: boolean;\n}\n\n/**\n * List spec files for view generation, with optional baseline filtering.\n *\n * When a baseline is provided, only specs that changed since the baseline\n * are included in the result.\n */\nexport async function listSpecsForView(\n adapters: WorkspaceAdapters,\n options: ListSpecsForViewOptions = {}\n): Promise<ListSpecsForViewResult> {\n // Get all specs in workspace\n const specs = await listSpecs({ fs: adapters.fs });\n const allSpecFiles = specs.map((s) => s.filePath);\n const totalSpecs = allSpecFiles.length;\n\n // If no baseline, return all specs\n if (!options.baseline) {\n return {\n specFiles: allSpecFiles,\n totalSpecs,\n };\n }\n\n // Get changed files since baseline\n const changedFiles = await adapters.git.diffFiles(options.baseline);\n\n if (changedFiles.length === 0) {\n return {\n specFiles: [],\n totalSpecs,\n changedFilesCount: 0,\n hasChanges: false,\n };\n }\n\n // Filter to specs that match changed files\n const filteredSpecs = allSpecFiles.filter((specPath) =>\n changedFiles.some(\n (changed) =>\n specPath.endsWith(changed) ||\n changed.endsWith(specPath) ||\n specPath.includes(changed) ||\n changed.includes(specPath)\n )\n );\n\n return {\n specFiles: filteredSpecs,\n totalSpecs,\n changedFilesCount: changedFiles.length,\n hasChanges: filteredSpecs.length > 0,\n };\n}\n\n/**\n * Generate an audience-specific view of a spec file.\n */\nexport async function generateView(\n specFile: string,\n audience: ViewAudience,\n adapters: WorkspaceAdapters\n): Promise<string> {\n // Using the module's static analysis, which uses node:fs internally\n // We check existence first using adapters for better error handling\n if (!(await adapters.fs.exists(specFile))) {\n throw new Error(`File not found: ${specFile}`);\n }\n\n const specs = await loadSpecFromSource(specFile);\n\n if (specs.length === 0) {\n return `No specs found in ${specFile} (Parse result empty)`;\n }\n\n return specs\n .map((spec) => formatSpecForAudience(spec, audience))\n .join('\\n\\n---\\n\\n');\n}\n\nfunction formatSpecForAudience(\n spec: ParsedSpec,\n audience: ViewAudience\n): string {\n const lines: string[] = [];\n\n switch (audience) {\n case 'product':\n formatProductView(spec, lines);\n break;\n case 'eng':\n formatEngView(spec, lines);\n break;\n case 'qa':\n formatQaView(spec, lines);\n break;\n }\n\n return lines.join('\\n');\n}\n\nfunction formatProductView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Product (User Flow & Capabilities)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`### Goal\\n${spec.meta.goal}\\n`);\n }\n if (spec.meta.context) {\n lines.push(`### Context\\n${spec.meta.context}\\n`);\n }\n\n if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Capabilities (Operations)');\n spec.operations.forEach((op) => lines.push(`- **${op.name}**`));\n lines.push('');\n }\n if (spec.presentations?.length) {\n lines.push('### User Interfaces (Presentations)');\n spec.presentations.forEach((p) => lines.push(`- **${p.name}**`));\n lines.push('');\n }\n } else if (spec.specType === 'operation') {\n lines.push('### Behavior');\n if (spec.hasPolicy) lines.push('- ✅ Enforces Business Policies');\n if (spec.hasIo) lines.push('- ✅ Validates Inputs/Outputs');\n if (spec.emittedEvents?.length) {\n lines.push('### Triggers');\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- **${ev.name}** (Event)`)\n );\n }\n } else {\n lines.push(`Type: ${spec.specType}`);\n }\n}\n\nfunction formatEngView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Engineering (API, Schemas, Constraints)');\n lines.push('');\n\n lines.push(`- **Type**: \\`${spec.specType}\\``);\n lines.push(`- **Version**: \\`${spec.meta.version}\\``);\n if (spec.meta.stability)\n lines.push(`- **Stability**: \\`${spec.meta.stability}\\``);\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push('### Contract Details');\n lines.push(`- **I/O Schema**: ${spec.hasIo ? '✅ Defined' : '❌ Missing'}`);\n lines.push(\n `- **Policy Config**: ${spec.hasPolicy ? '✅ Defined' : '❌ None'}`\n );\n lines.push('');\n\n if (spec.emittedEvents?.length) {\n lines.push('### Emitted Events');\n spec.emittedEvents.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Operations');\n spec.operations.forEach((op) => lines.push(`- \\`${op.name}\\``));\n lines.push('');\n }\n if (spec.events?.length) {\n lines.push('### Events');\n spec.events.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n }\n\n if (spec.sourceBlock) {\n lines.push('### Source Signature');\n lines.push('```typescript');\n lines.push(spec.sourceBlock);\n lines.push('```');\n }\n}\n\nfunction formatQaView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: QA (Scenarios, Test Coverage)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`**Goal**: ${spec.meta.goal}\\n`);\n }\n\n if (spec.testRefs?.length) {\n lines.push('### Linked Scenarios');\n spec.testRefs.forEach((test) => lines.push(`- 🧪 \\`${test.name}\\``));\n lines.push('');\n } else {\n lines.push('### Linked Scenarios');\n lines.push('_(No explicit test refs found)_');\n lines.push('');\n }\n\n lines.push('### Verification Checklist');\n if (spec.specType === 'operation') {\n lines.push(\n `- [ ] Verify input validation for \\`${spec.meta.key}\\` (Success/Fail cases)`\n );\n if (spec.hasPolicy) lines.push(`- [ ] Verify policy enforcement rules`);\n if (spec.emittedEvents?.length) {\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- [ ] Verify event \\`${ev.name}\\` is emitted`)\n );\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n spec.operations.forEach((op) =>\n lines.push(`- [ ] Test Operation flow: \\`${op.name}\\``)\n );\n }\n if (spec.presentations?.length) {\n spec.presentations.forEach((p) =>\n lines.push(`- [ ] Test UI Component: \\`${p.name}\\``)\n );\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/bundle.workspace",
3
- "version": "1.48.1",
3
+ "version": "1.50.0",
4
4
  "description": "Workspace utilities for monorepo development",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -31,12 +31,12 @@
31
31
  "dependencies": {
32
32
  "@ai-sdk/anthropic": "3.0.11",
33
33
  "@ai-sdk/openai": "3.0.8",
34
- "@contractspec/lib.ai-agent": "1.48.1",
35
- "@contractspec/lib.ai-providers": "1.48.0",
36
- "@contractspec/lib.contracts": "1.48.1",
37
- "@contractspec/lib.contracts-transformers": "1.48.1",
38
- "@contractspec/lib.source-extractors": "0.2.1",
39
- "@contractspec/module.workspace": "1.48.1",
34
+ "@contractspec/lib.ai-agent": "1.50.0",
35
+ "@contractspec/lib.ai-providers": "1.50.0",
36
+ "@contractspec/lib.contracts": "1.50.0",
37
+ "@contractspec/lib.contracts-transformers": "1.50.0",
38
+ "@contractspec/lib.source-extractors": "0.4.0",
39
+ "@contractspec/module.workspace": "1.50.0",
40
40
  "ai": "6.0.29",
41
41
  "chalk": "^5.6.2",
42
42
  "chokidar": "^5.0.0",
@@ -48,8 +48,8 @@
48
48
  "zod": "^4.3.5"
49
49
  },
50
50
  "devDependencies": {
51
- "@contractspec/tool.tsdown": "1.48.0",
52
- "@contractspec/tool.typescript": "1.48.0",
51
+ "@contractspec/tool.tsdown": "1.50.0",
52
+ "@contractspec/tool.typescript": "1.50.0",
53
53
  "@types/micromatch": "^4.0.10",
54
54
  "@types/node": "^25.0.6",
55
55
  "tsdown": "^0.19.0",