@contractspec/bundle.workspace 1.44.0 → 1.45.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.
Files changed (149) hide show
  1. package/README.md +5 -1
  2. package/dist/_virtual/rolldown_runtime.js +1 -19
  3. package/dist/ai/agents/cursor-agent.js +4 -4
  4. package/dist/ai/agents/cursor-agent.js.map +1 -1
  5. package/dist/ai/client.d.ts +14 -0
  6. package/dist/ai/client.d.ts.map +1 -1
  7. package/dist/ai/client.js +27 -1
  8. package/dist/ai/client.js.map +1 -1
  9. package/dist/ai/index.d.ts +1 -9
  10. package/dist/ai/index.js +1 -20
  11. package/dist/ai/prompts/index.js +1 -1
  12. package/dist/index.d.ts +42 -19
  13. package/dist/index.js +39 -150
  14. package/dist/services/agent-guide/agent-guide-service.js +3 -3
  15. package/dist/services/agent-guide/agent-guide-service.js.map +1 -1
  16. package/dist/services/ci-check/ci-check-service.d.ts.map +1 -1
  17. package/dist/services/ci-check/ci-check-service.js +69 -2
  18. package/dist/services/ci-check/ci-check-service.js.map +1 -1
  19. package/dist/services/ci-check/types.d.ts +1 -1
  20. package/dist/services/ci-check/types.d.ts.map +1 -1
  21. package/dist/services/ci-check/types.js +4 -2
  22. package/dist/services/ci-check/types.js.map +1 -1
  23. package/dist/services/config.d.ts +1 -11
  24. package/dist/services/config.d.ts.map +1 -1
  25. package/dist/services/config.js +2 -16
  26. package/dist/services/config.js.map +1 -1
  27. package/dist/services/create/ai-generator.d.ts +84 -0
  28. package/dist/services/create/ai-generator.d.ts.map +1 -0
  29. package/dist/services/create/ai-generator.js +178 -0
  30. package/dist/services/create/ai-generator.js.map +1 -0
  31. package/dist/services/create/index.d.ts +27 -0
  32. package/dist/services/create/index.d.ts.map +1 -0
  33. package/dist/services/create/index.js +36 -0
  34. package/dist/services/create/index.js.map +1 -0
  35. package/dist/services/create/templates.d.ts +21 -0
  36. package/dist/services/create/templates.d.ts.map +1 -0
  37. package/dist/services/create/templates.js +37 -0
  38. package/dist/services/create/templates.js.map +1 -0
  39. package/dist/services/docs/docs-service.d.ts +19 -0
  40. package/dist/services/docs/docs-service.d.ts.map +1 -0
  41. package/dist/services/docs/docs-service.js +41 -0
  42. package/dist/services/docs/docs-service.js.map +1 -0
  43. package/dist/services/docs/index.d.ts +1 -0
  44. package/dist/services/docs/index.js +1 -0
  45. package/dist/services/doctor/checks/cli.js +3 -3
  46. package/dist/services/doctor/checks/cli.js.map +1 -1
  47. package/dist/services/doctor/checks/index.js +1 -0
  48. package/dist/services/doctor/checks/layers.js +139 -0
  49. package/dist/services/doctor/checks/layers.js.map +1 -0
  50. package/dist/services/doctor/doctor-service.d.ts.map +1 -1
  51. package/dist/services/doctor/doctor-service.js +2 -0
  52. package/dist/services/doctor/doctor-service.js.map +1 -1
  53. package/dist/services/doctor/types.d.ts +1 -1
  54. package/dist/services/doctor/types.d.ts.map +1 -1
  55. package/dist/services/doctor/types.js +4 -2
  56. package/dist/services/doctor/types.js.map +1 -1
  57. package/dist/services/formatter.d.ts +15 -0
  58. package/dist/services/formatter.d.ts.map +1 -0
  59. package/dist/services/formatter.js +26 -0
  60. package/dist/services/formatter.js.map +1 -0
  61. package/dist/services/impact/formatters.d.ts +5 -5
  62. package/dist/services/impact/formatters.d.ts.map +1 -1
  63. package/dist/services/impact/formatters.js.map +1 -1
  64. package/dist/services/impact/impact-detection-service.js +6 -6
  65. package/dist/services/impact/impact-detection-service.js.map +1 -1
  66. package/dist/services/impact/types.d.ts +3 -3
  67. package/dist/services/implementation/resolver.js +1 -1
  68. package/dist/services/implementation/resolver.js.map +1 -1
  69. package/dist/services/implementation/types.d.ts +1 -1
  70. package/dist/services/index.d.ts +31 -5
  71. package/dist/services/index.js +30 -4
  72. package/dist/services/integrity-diagram.js +1 -1
  73. package/dist/services/integrity-diagram.js.map +1 -1
  74. package/dist/services/integrity.d.ts +1 -1
  75. package/dist/services/integrity.js.map +1 -1
  76. package/dist/services/layer-discovery.d.ts +77 -0
  77. package/dist/services/layer-discovery.d.ts.map +1 -0
  78. package/dist/services/layer-discovery.js +121 -0
  79. package/dist/services/layer-discovery.js.map +1 -0
  80. package/dist/services/llm/index.d.ts +28 -0
  81. package/dist/services/llm/index.d.ts.map +1 -0
  82. package/dist/services/llm/index.js +187 -0
  83. package/dist/services/llm/index.js.map +1 -0
  84. package/dist/services/llm/verify-static.d.ts +26 -0
  85. package/dist/services/llm/verify-static.d.ts.map +1 -0
  86. package/dist/services/llm/verify-static.js +82 -0
  87. package/dist/services/llm/verify-static.js.map +1 -0
  88. package/dist/services/openapi/import-service.d.ts.map +1 -1
  89. package/dist/services/openapi/import-service.js +98 -4
  90. package/dist/services/openapi/import-service.js.map +1 -1
  91. package/dist/services/openapi/sync-service.js +1 -1
  92. package/dist/services/setup/config-generators.js +1 -1
  93. package/dist/services/setup/config-generators.js.map +1 -1
  94. package/dist/services/sync.d.ts +2 -1
  95. package/dist/services/sync.d.ts.map +1 -1
  96. package/dist/services/sync.js +2 -1
  97. package/dist/services/sync.js.map +1 -1
  98. package/dist/services/test/index.d.ts +1 -0
  99. package/dist/services/test/index.js +1 -0
  100. package/dist/services/test/test-service.d.ts +22 -0
  101. package/dist/services/test/test-service.d.ts.map +1 -0
  102. package/dist/services/test/test-service.js +81 -0
  103. package/dist/services/test/test-service.js.map +1 -0
  104. package/dist/services/validate/blueprint-validator.d.ts +23 -0
  105. package/dist/services/validate/blueprint-validator.d.ts.map +1 -0
  106. package/dist/services/validate/blueprint-validator.js +50 -0
  107. package/dist/services/validate/blueprint-validator.js.map +1 -0
  108. package/dist/services/validate/implementation-agent-validator.d.ts +20 -0
  109. package/dist/services/validate/implementation-agent-validator.d.ts.map +1 -0
  110. package/dist/services/validate/implementation-agent-validator.js +42 -0
  111. package/dist/services/validate/implementation-agent-validator.js.map +1 -0
  112. package/dist/services/{validate-implementation.d.ts → validate/implementation-validator.d.ts} +3 -3
  113. package/dist/services/validate/implementation-validator.d.ts.map +1 -0
  114. package/dist/services/{validate-implementation.js → validate/implementation-validator.js} +2 -2
  115. package/dist/services/validate/implementation-validator.js.map +1 -0
  116. package/dist/services/validate/index.d.ts +5 -0
  117. package/dist/services/validate/index.js +5 -0
  118. package/dist/services/{validate.d.ts → validate/spec-validator.d.ts} +5 -4
  119. package/dist/services/validate/spec-validator.d.ts.map +1 -0
  120. package/dist/services/{validate.js → validate/spec-validator.js} +6 -4
  121. package/dist/services/validate/spec-validator.js.map +1 -0
  122. package/dist/services/validate/tenant-validator.d.ts +21 -0
  123. package/dist/services/validate/tenant-validator.d.ts.map +1 -0
  124. package/dist/services/validate/tenant-validator.js +165 -0
  125. package/dist/services/validate/tenant-validator.js.map +1 -0
  126. package/dist/services/watch.js +2 -1
  127. package/dist/services/watch.js.map +1 -1
  128. package/dist/templates/data-view.template.js +3 -3
  129. package/dist/templates/data-view.template.js.map +1 -1
  130. package/dist/templates/event.template.js +3 -1
  131. package/dist/templates/event.template.js.map +1 -1
  132. package/dist/templates/operation.template.js +3 -1
  133. package/dist/templates/operation.template.js.map +1 -1
  134. package/dist/types.d.ts +1 -1
  135. package/dist/utils/module-loader.js +41 -0
  136. package/dist/utils/module-loader.js.map +1 -0
  137. package/package.json +17 -9
  138. package/dist/ai/index.d.ts.map +0 -1
  139. package/dist/ai/index.js.map +0 -1
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/services/test.d.ts +0 -15
  143. package/dist/services/test.d.ts.map +0 -1
  144. package/dist/services/test.js +0 -30
  145. package/dist/services/test.js.map +0 -1
  146. package/dist/services/validate-implementation.d.ts.map +0 -1
  147. package/dist/services/validate-implementation.js.map +0 -1
  148. package/dist/services/validate.d.ts.map +0 -1
  149. package/dist/services/validate.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { __exportAll, __reExport } from "./_virtual/rolldown_runtime.js";
2
1
  import { createNodeFsAdapter } from "./adapters/fs.js";
3
2
  import { createNodeGitAdapter } from "./adapters/git.js";
4
3
  import { createNodeWatcherAdapter } from "./adapters/watcher.js";
@@ -7,12 +6,21 @@ import { createConsoleLoggerAdapter, createNoopLoggerAdapter } from "./adapters/
7
6
  import { createNodeAdapters } from "./adapters/factory.js";
8
7
  import { detectPackageManager, detectRepositoryType, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, getExecCommand, getInstallCommand, getMetaRepoInfo, getPackageName, getRunCommand, getWorkspaceInfo, getWorkspacePackages, isMonorepo, parseGitModules } from "./adapters/workspace.js";
9
8
  import "./adapters/index.js";
10
- import { validateSpec, validateSpecs } from "./services/validate.js";
11
- import { validateImplementationFiles } from "./services/validate-implementation.js";
9
+ import { validateSpec, validateSpecs } from "./services/validate/spec-validator.js";
10
+ import { validateImplementationFiles } from "./services/validate/implementation-validator.js";
11
+ import { validateBlueprint } from "./services/validate/blueprint-validator.js";
12
+ import { validateTenantConfig } from "./services/validate/tenant-validator.js";
13
+ import { getAIProvider, getRecommendedModels, validateProvider } from "./ai/providers.js";
14
+ import { SimpleAgent } from "./ai/agents/simple-agent.js";
15
+ import { CursorAgent } from "./ai/agents/cursor-agent.js";
16
+ import { ClaudeCodeAgent } from "./ai/agents/claude-code-agent.js";
17
+ import { OpenAICodexAgent } from "./ai/agents/openai-codex-agent.js";
18
+ import { AgentOrchestrator } from "./ai/agents/orchestrator.js";
19
+ import { validateImplementationWithAgent } from "./services/validate/implementation-agent-validator.js";
12
20
  import { compareSpecs } from "./services/diff.js";
13
21
  import { analyzeDeps, exportGraphAsDot, getContractNode, getGraphStats } from "./services/deps.js";
14
22
  import { groupSpecsByType, listSpecs } from "./services/list.js";
15
- import { getApiKey, loadWorkspaceConfig, mergeWorkspaceConfig } from "./services/config.js";
23
+ import { getApiKey, loadWorkspaceConfig } from "./services/config.js";
16
24
  import { buildSpec } from "./services/build.js";
17
25
  import { importFromOpenApiService } from "./services/openapi/import-service.js";
18
26
  import { syncWithOpenApiService } from "./services/openapi/sync-service.js";
@@ -22,11 +30,12 @@ import { RegistryClient, addToRegistry, listFromRegistry, resolveRegistryUrl, se
22
30
  import { syncSpecs } from "./services/sync.js";
23
31
  import { watchSpecs } from "./services/watch.js";
24
32
  import { cleanArtifacts } from "./services/clean.js";
25
- import { runTests } from "./services/test.js";
33
+ import { runTestSpecs, runTests } from "./services/test/test-service.js";
26
34
  import { createRegeneratorService } from "./services/regenerator.js";
27
35
  import { findAllConfigFiles, formatWorkspaceInfo, getExtendedWorkspaceInfo, mergeMonorepoConfigs } from "./services/workspace-info.js";
28
36
  import { analyzeIntegrity, filterIssuesBySeverity, filterIssuesByType, getAllSpecs } from "./services/integrity.js";
29
37
  import { generateMermaidDiagram } from "./services/integrity-diagram.js";
38
+ import { createEmptyLayerInventory, discoverLayers, getAllLayerLocations } from "./services/layer-discovery.js";
30
39
  import { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS } from "./services/setup/types.js";
31
40
  import { generateAgentsMd, generateClaudeMcpConfig, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateVscodeSettings, getClaudeDesktopConfigPath } from "./services/setup/config-generators.js";
32
41
  import { deepMergeOverwrite, deepMergePreserve, formatJson, safeParseJson } from "./services/setup/file-merger.js";
@@ -42,6 +51,24 @@ import { CursorCLIAdapter, cursorCLIAdapter } from "./services/agent-guide/adapt
42
51
  import { GenericMCPAdapter, genericMCPAdapter } from "./services/agent-guide/adapters/generic-mcp.js";
43
52
  import { agentAdapters, getAgentAdapter, listAgentTypes } from "./services/agent-guide/adapters/index.js";
44
53
  import { AgentGuideService, agentGuideService, createAgentGuideService } from "./services/agent-guide/agent-guide-service.js";
54
+ import { formatVerificationReport, verifyImplementationAgainstParsedSpec } from "./services/llm/verify-static.js";
55
+ import { exportSpecForLLM, generateCursorRulesFromParsedSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec } from "./services/llm/index.js";
56
+ import { AIGenerator } from "./services/create/ai-generator.js";
57
+ import { generateOperationSpec } from "./templates/operation.template.js";
58
+ import { generateEventSpec } from "./templates/event.template.js";
59
+ import { generatePresentationSpec } from "./templates/presentation.template.js";
60
+ import { generateWorkflowSpec } from "./templates/workflow.template.js";
61
+ import { generateMigrationSpec } from "./templates/migration.template.js";
62
+ import { generateTelemetrySpec } from "./templates/telemetry.template.js";
63
+ import { generateExperimentSpec } from "./templates/experiment.template.js";
64
+ import { generateAppBlueprintSpec } from "./templates/app-config.template.js";
65
+ import { generateDataViewSpec } from "./templates/data-view.template.js";
66
+ import { generateIntegrationSpec } from "./templates/integration.template.js";
67
+ import { generateKnowledgeSpaceSpec } from "./templates/knowledge.template.js";
68
+ import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "./templates/handler.template.js";
69
+ import { generateWorkflowRunnerTemplate } from "./templates/workflow-runner.template.js";
70
+ import { templates_exports } from "./templates/index.js";
71
+ import { SpecCreatorService, createSpecCreator } from "./services/create/index.js";
45
72
  import { verifyStructure } from "./services/verify/structure-verifier.js";
46
73
  import { verifyBehavior } from "./services/verify/behavior-verifier.js";
47
74
  import { createQuickAIReview, verifySemanticFields, verifyWithAI, verifyWithAIEnhanced } from "./services/verify/ai-verifier.js";
@@ -53,152 +80,14 @@ import { FileSystemCacheStorage, createFileSystemCacheStorage } from "./services
53
80
  import { WorkspaceStateCacheStorage, createWorkspaceStateCacheStorage } from "./services/verification-cache/adapters/workspace-state.js";
54
81
  import { FULL_DEPENDENCIES, MINIMAL_DEPENDENCIES, getDependencies, getDevDependencies, getProductionDependencies } from "./services/quickstart/dependencies.js";
55
82
  import { formatQuickstartPreview, isContractSpecInstalled, runQuickstart } from "./services/quickstart/quickstart-service.js";
83
+ import { generateDocsFromSpecs } from "./services/docs/docs-service.js";
56
84
  import { impact_exports } from "./services/impact/index.js";
85
+ import { formatFiles } from "./services/formatter.js";
57
86
  import "./services/index.js";
58
87
  import { formatters_exports } from "./formatters/index.js";
59
- import { templates_exports } from "./templates/index.js";
60
- import { ai_exports } from "./ai/index.js";
61
-
62
- export * from "@contractspec/module.workspace"
63
-
64
- //#region src/index.ts
65
- var src_exports = /* @__PURE__ */ __exportAll({
66
- ALL_CHECK_CATEGORIES: () => ALL_CHECK_CATEGORIES,
67
- ALL_CI_CHECK_CATEGORIES: () => ALL_CI_CHECK_CATEGORIES,
68
- ALL_SETUP_TARGETS: () => ALL_SETUP_TARGETS,
69
- AgentGuideService: () => AgentGuideService,
70
- CHECK_CATEGORY_LABELS: () => CHECK_CATEGORY_LABELS,
71
- CI_CHECK_CATEGORY_LABELS: () => CI_CHECK_CATEGORY_LABELS,
72
- ClaudeCodeAdapter: () => ClaudeCodeAdapter,
73
- CursorCLIAdapter: () => CursorCLIAdapter,
74
- DEFAULT_CACHE_CONFIG: () => DEFAULT_CACHE_CONFIG,
75
- FULL_DEPENDENCIES: () => FULL_DEPENDENCIES,
76
- FileSystemCacheStorage: () => FileSystemCacheStorage,
77
- GenericMCPAdapter: () => GenericMCPAdapter,
78
- InMemoryCacheStorage: () => InMemoryCacheStorage,
79
- MINIMAL_DEPENDENCIES: () => MINIMAL_DEPENDENCIES,
80
- RegistryClient: () => RegistryClient,
81
- SETUP_TARGET_LABELS: () => SETUP_TARGET_LABELS,
82
- VerificationCacheService: () => VerificationCacheService,
83
- VerifyService: () => VerifyService,
84
- WorkspaceStateCacheStorage: () => WorkspaceStateCacheStorage,
85
- addToRegistry: () => addToRegistry,
86
- agentAdapters: () => agentAdapters,
87
- agentGuideService: () => agentGuideService,
88
- ai: () => ai_exports,
89
- analyzeDeps: () => analyzeDeps,
90
- analyzeIntegrity: () => analyzeIntegrity,
91
- buildSpec: () => buildSpec,
92
- cacheKeyToString: () => cacheKeyToString,
93
- claudeCodeAdapter: () => claudeCodeAdapter,
94
- cleanArtifacts: () => cleanArtifacts,
95
- compareSpecs: () => compareSpecs,
96
- computeContentHash: () => computeContentHash,
97
- createAgentGuideService: () => createAgentGuideService,
98
- createConsoleLoggerAdapter: () => createConsoleLoggerAdapter,
99
- createFileSystemCacheStorage: () => createFileSystemCacheStorage,
100
- createInMemoryCacheStorage: () => createInMemoryCacheStorage,
101
- createNodeAdapters: () => createNodeAdapters,
102
- createNodeAiAdapter: () => createNodeAiAdapter,
103
- createNodeFsAdapter: () => createNodeFsAdapter,
104
- createNodeGitAdapter: () => createNodeGitAdapter,
105
- createNodeWatcherAdapter: () => createNodeWatcherAdapter,
106
- createNoopLoggerAdapter: () => createNoopLoggerAdapter,
107
- createQuickAIReview: () => createQuickAIReview,
108
- createRegeneratorService: () => createRegeneratorService,
109
- createVerificationCacheService: () => createVerificationCacheService,
110
- createVerifyService: () => createVerifyService,
111
- createWorkspaceStateCacheStorage: () => createWorkspaceStateCacheStorage,
112
- cursorCLIAdapter: () => cursorCLIAdapter,
113
- deepMergeOverwrite: () => deepMergeOverwrite,
114
- deepMergePreserve: () => deepMergePreserve,
115
- detectPackageManager: () => detectPackageManager,
116
- detectRepositoryType: () => detectRepositoryType,
117
- discoverAllImplementations: () => discoverAllImplementations,
118
- discoverImplementationsForSpec: () => discoverImplementationsForSpec,
119
- exportGraphAsDot: () => exportGraphAsDot,
120
- exportOpenApi: () => exportOpenApi,
121
- extractSpecReferences: () => extractSpecReferences,
122
- filterIssuesBySeverity: () => filterIssuesBySeverity,
123
- filterIssuesByType: () => filterIssuesByType,
124
- findAllConfigFiles: () => findAllConfigFiles,
125
- findMetaRepoRoot: () => findMetaRepoRoot,
126
- findPackageRoot: () => findPackageRoot,
127
- findWorkspaceRoot: () => findWorkspaceRoot,
128
- formatCheckResult: () => formatCheckResult,
129
- formatDoctorSummary: () => formatDoctorSummary,
130
- formatJson: () => formatJson,
131
- formatQuickstartPreview: () => formatQuickstartPreview,
132
- formatWorkspaceInfo: () => formatWorkspaceInfo,
133
- formatters: () => formatters_exports,
134
- generateAgentsMd: () => generateAgentsMd,
135
- generateClaudeMcpConfig: () => generateClaudeMcpConfig,
136
- generateContractsrcConfig: () => generateContractsrcConfig,
137
- generateCursorMcpConfig: () => generateCursorMcpConfig,
138
- generateCursorRules: () => generateCursorRules,
139
- generateMermaidDiagram: () => generateMermaidDiagram,
140
- generateVscodeSettings: () => generateVscodeSettings,
141
- genericMCPAdapter: () => genericMCPAdapter,
142
- getAgentAdapter: () => getAgentAdapter,
143
- getAllSpecs: () => getAllSpecs,
144
- getApiKey: () => getApiKey,
145
- getClaudeDesktopConfigPath: () => getClaudeDesktopConfigPath,
146
- getContractNode: () => getContractNode,
147
- getDependencies: () => getDependencies,
148
- getDevDependencies: () => getDevDependencies,
149
- getExecCommand: () => getExecCommand,
150
- getExtendedWorkspaceInfo: () => getExtendedWorkspaceInfo,
151
- getGraphStats: () => getGraphStats,
152
- getImplementationSummary: () => getImplementationSummary,
153
- getInstallCommand: () => getInstallCommand,
154
- getMetaRepoInfo: () => getMetaRepoInfo,
155
- getPackageName: () => getPackageName,
156
- getProductionDependencies: () => getProductionDependencies,
157
- getRunCommand: () => getRunCommand,
158
- getWorkspaceInfo: () => getWorkspaceInfo,
159
- getWorkspacePackages: () => getWorkspacePackages,
160
- groupSpecsByType: () => groupSpecsByType,
161
- impact: () => impact_exports,
162
- importFromOpenApiService: () => importFromOpenApiService,
163
- inferImplementationType: () => inferImplementationType,
164
- isContractSpecInstalled: () => isContractSpecInstalled,
165
- isMonorepo: () => isMonorepo,
166
- listAgentTypes: () => listAgentTypes,
167
- listFromRegistry: () => listFromRegistry,
168
- listSpecs: () => listSpecs,
169
- loadWorkspaceConfig: () => loadWorkspaceConfig,
170
- mergeMonorepoConfigs: () => mergeMonorepoConfigs,
171
- mergeWorkspaceConfig: () => mergeWorkspaceConfig,
172
- parseGitModules: () => parseGitModules,
173
- resolveAllImplementations: () => resolveAllImplementations,
174
- resolveImplementations: () => resolveImplementations,
175
- resolveRegistryUrl: () => resolveRegistryUrl,
176
- runCIChecks: () => runCIChecks,
177
- runDoctor: () => runDoctor,
178
- runQuickstart: () => runQuickstart,
179
- runSetup: () => runSetup,
180
- runTests: () => runTests,
181
- safeParseJson: () => safeParseJson,
182
- searchRegistry: () => searchRegistry,
183
- stringToCacheKey: () => stringToCacheKey,
184
- syncSpecs: () => syncSpecs,
185
- syncWithOpenApiService: () => syncWithOpenApiService,
186
- templates: () => templates_exports,
187
- validateAgainstOpenApiService: () => validateAgainstOpenApiService,
188
- validateImplementationFiles: () => validateImplementationFiles,
189
- validateSpec: () => validateSpec,
190
- validateSpecs: () => validateSpecs,
191
- verifyBehavior: () => verifyBehavior,
192
- verifySemanticFields: () => verifySemanticFields,
193
- verifyService: () => verifyService,
194
- verifyStructure: () => verifyStructure,
195
- verifyWithAI: () => verifyWithAI,
196
- verifyWithAIEnhanced: () => verifyWithAIEnhanced,
197
- watchSpecs: () => watchSpecs
198
- });
199
- import * as import__contractspec_module_workspace from "@contractspec/module.workspace";
200
- __reExport(src_exports, import__contractspec_module_workspace);
88
+ import { AIClient } from "./ai/client.js";
89
+ import { prompts_exports } from "./ai/prompts/index.js";
90
+ import "./ai/index.js";
91
+ import * as module from "@contractspec/module.workspace";
201
92
 
202
- //#endregion
203
- export { ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentGuideService, CHECK_CATEGORY_LABELS, CI_CHECK_CATEGORY_LABELS, ClaudeCodeAdapter, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, RegistryClient, SETUP_TARGET_LABELS, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, ai_exports as ai, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, exportGraphAsDot, exportOpenApi, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatJson, formatQuickstartPreview, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateClaudeMcpConfig, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateMermaidDiagram, generateVscodeSettings, genericMCPAdapter, getAgentAdapter, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, impact_exports as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, mergeWorkspaceConfig, parseGitModules, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTests, safeParseJson, searchRegistry, src_exports, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, validateAgainstOpenApiService, validateImplementationFiles, validateSpec, validateSpecs, verifyBehavior, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, watchSpecs };
204
- //# sourceMappingURL=index.js.map
93
+ 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, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, OpenAICodexAgent, RegistryClient, SETUP_TARGET_LABELS, SimpleAgent, SpecCreatorService, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, 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, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, impact_exports as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, prompts_exports as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, watchSpecs };
@@ -40,21 +40,21 @@ var AgentGuideService = class {
40
40
  generateFeatureGuide(feature, deps, options = {}) {
41
41
  const adapter = getAgentAdapter(options.agent ?? this.config.defaultAgent);
42
42
  const firstOp = feature.operations?.[0];
43
- const spec = firstOp ? deps.specs?.getSpec(firstOp.key, firstOp.version) : void 0;
43
+ const spec = firstOp ? deps.specs?.get(firstOp.key, firstOp.version) : void 0;
44
44
  let plan;
45
45
  if (spec) {
46
46
  plan = generateImplementationPlan(spec, { projectRoot: this.config.projectRoot });
47
47
  plan.target = {
48
48
  type: "feature",
49
49
  key: feature.meta.key,
50
- version: 1
50
+ version: "1.0.0"
51
51
  };
52
52
  plan.context.goal = feature.meta.description ?? plan.context.goal;
53
53
  } else plan = {
54
54
  target: {
55
55
  type: "feature",
56
56
  key: feature.meta.key,
57
- version: 1
57
+ version: "1.0.0"
58
58
  },
59
59
  context: {
60
60
  goal: feature.meta.description ?? `Implement feature ${feature.meta.key}`,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-guide-service.js","names":["DEFAULT_CONFIG: AgentGuideConfig","plan: ImplementationPlan"],"sources":["../../../src/services/agent-guide/agent-guide-service.ts"],"sourcesContent":["/**\n * Agent Guide Service\n *\n * Generates implementation plans and prompts for AI coding agents.\n * Bridges ContractSpec specifications with agent-specific formats.\n */\n\nimport type {\n AnyOperationSpec,\n OperationSpecRegistry,\n PresentationRegistry,\n} from '@contractspec/lib.contracts';\nimport type { FeatureModuleSpec } from '@contractspec/lib.contracts/features';\nimport type {\n AgentType,\n ImplementationPlan,\n} from '@contractspec/lib.contracts/llm';\nimport {\n featureToMarkdown,\n generateImplementationPlan,\n operationSpecToAgentPrompt,\n operationSpecToFullMarkdown,\n} from '@contractspec/lib.contracts/llm';\nimport { getAgentAdapter, listAgentTypes } from './adapters';\nimport type { AgentGuideConfig, GuideOptions, GuideResult } from './types';\n\nconst DEFAULT_CONFIG: AgentGuideConfig = {\n defaultAgent: 'generic-mcp',\n verbose: false,\n};\n\n/**\n * Agent Guide Service\n *\n * Main service for generating implementation guidance for AI coding agents.\n */\nexport class AgentGuideService {\n private config: AgentGuideConfig;\n\n constructor(config: Partial<AgentGuideConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Generate an implementation guide for a spec.\n */\n generateGuide(\n spec: AnyOperationSpec,\n options: GuideOptions = {}\n ): GuideResult {\n const agent = options.agent ?? this.config.defaultAgent;\n const adapter = getAgentAdapter(agent);\n\n // Generate the implementation plan\n const plan = generateImplementationPlan(spec, {\n projectRoot: this.config.projectRoot,\n existingFiles: options.targetPath ? [options.targetPath] : undefined,\n });\n\n // Format for the target agent\n const prompt = adapter.formatPlan(plan);\n\n // Generate raw markdown for clipboard/export\n const markdown = operationSpecToFullMarkdown(spec);\n\n return {\n plan,\n prompt,\n markdown,\n };\n }\n\n /**\n * Generate a guide for a feature (includes all related specs).\n */\n generateFeatureGuide(\n feature: FeatureModuleSpec,\n deps: {\n specs?: OperationSpecRegistry;\n presentations?: PresentationRegistry;\n },\n options: GuideOptions = {}\n ): GuideResult {\n const agent = options.agent ?? this.config.defaultAgent;\n const adapter = getAgentAdapter(agent);\n\n // Create a composite plan for the feature\n const firstOp = feature.operations?.[0];\n const spec = firstOp\n ? deps.specs?.getSpec(firstOp.key, firstOp.version)\n : undefined;\n\n // Generate base plan from first spec or create feature-level plan\n let plan: ImplementationPlan;\n if (spec) {\n plan = generateImplementationPlan(spec, {\n projectRoot: this.config.projectRoot,\n });\n // Override target to indicate it's a feature\n plan.target = {\n type: 'feature',\n key: feature.meta.key,\n version: 1,\n };\n plan.context.goal = feature.meta.description ?? plan.context.goal;\n } else {\n // Create a minimal plan for features without specs\n plan = {\n target: {\n type: 'feature',\n key: feature.meta.key,\n version: 1,\n },\n context: {\n goal:\n feature.meta.description ?? `Implement feature ${feature.meta.key}`,\n description: feature.meta.title ?? feature.meta.key,\n background: '',\n },\n specMarkdown: featureToMarkdown(feature, deps),\n fileStructure: [],\n steps: [\n {\n order: 1,\n title: 'Implement Feature',\n description: `Implement the ${feature.meta.key} feature`,\n acceptanceCriteria: [],\n },\n ],\n constraints: { policy: [], security: [], pii: [] },\n verificationChecklist: [],\n };\n }\n\n // Enhance spec markdown with full feature context\n plan.specMarkdown = featureToMarkdown(feature, deps, {\n format: 'full',\n includeRelatedSpecs: true,\n includeRelatedEvents: true,\n includeRelatedPresentations: true,\n });\n\n // Add steps for each operation\n if (feature.operations?.length) {\n plan.steps = feature.operations.map((op, idx) => ({\n order: idx + 1,\n title: `Implement ${op.key}`,\n description: `Implement operation ${op.key}.v${op.version}`,\n acceptanceCriteria: [`Operation ${op.key} works as specified`],\n }));\n }\n\n const prompt = adapter.formatPlan(plan);\n const markdown = featureToMarkdown(feature, deps);\n\n return {\n plan,\n prompt,\n markdown,\n };\n }\n\n /**\n * Generate agent-specific configuration (e.g., cursor rules).\n */\n generateAgentConfig(\n spec: AnyOperationSpec,\n agent?: AgentType\n ): string | undefined {\n const adapter = getAgentAdapter(agent ?? this.config.defaultAgent);\n return adapter.generateConfig?.(spec);\n }\n\n /**\n * Export a spec in a specific format for an agent.\n */\n exportForAgent(\n spec: AnyOperationSpec,\n _agent: AgentType,\n taskType: 'implement' | 'test' | 'refactor' | 'review' = 'implement',\n existingCode?: string\n ): string {\n return operationSpecToAgentPrompt(spec, { taskType, existingCode });\n }\n\n /**\n * List available agent types.\n */\n listAgentTypes(): AgentType[] {\n return listAgentTypes();\n }\n\n /**\n * Get the default agent type.\n */\n getDefaultAgent(): AgentType {\n return this.config.defaultAgent;\n }\n\n /**\n * Update configuration.\n */\n configure(config: Partial<AgentGuideConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Create a new AgentGuideService instance.\n */\nexport function createAgentGuideService(\n config?: Partial<AgentGuideConfig>\n): AgentGuideService {\n return new AgentGuideService(config);\n}\n\n/** Default singleton instance */\nexport const agentGuideService = new AgentGuideService();\n"],"mappings":";;;;AA0BA,MAAMA,iBAAmC;CACvC,cAAc;CACd,SAAS;CACV;;;;;;AAOD,IAAa,oBAAb,MAA+B;CAC7B,AAAQ;CAER,YAAY,SAAoC,EAAE,EAAE;AAClD,OAAK,SAAS;GAAE,GAAG;GAAgB,GAAG;GAAQ;;;;;CAMhD,cACE,MACA,UAAwB,EAAE,EACb;EAEb,MAAM,UAAU,gBADF,QAAQ,SAAS,KAAK,OAAO,aACL;EAGtC,MAAM,OAAO,2BAA2B,MAAM;GAC5C,aAAa,KAAK,OAAO;GACzB,eAAe,QAAQ,aAAa,CAAC,QAAQ,WAAW,GAAG;GAC5D,CAAC;AAQF,SAAO;GACL;GACA,QAPa,QAAQ,WAAW,KAAK;GAQrC,UALe,4BAA4B,KAAK;GAMjD;;;;;CAMH,qBACE,SACA,MAIA,UAAwB,EAAE,EACb;EAEb,MAAM,UAAU,gBADF,QAAQ,SAAS,KAAK,OAAO,aACL;EAGtC,MAAM,UAAU,QAAQ,aAAa;EACrC,MAAM,OAAO,UACT,KAAK,OAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GACjD;EAGJ,IAAIC;AACJ,MAAI,MAAM;AACR,UAAO,2BAA2B,MAAM,EACtC,aAAa,KAAK,OAAO,aAC1B,CAAC;AAEF,QAAK,SAAS;IACZ,MAAM;IACN,KAAK,QAAQ,KAAK;IAClB,SAAS;IACV;AACD,QAAK,QAAQ,OAAO,QAAQ,KAAK,eAAe,KAAK,QAAQ;QAG7D,QAAO;GACL,QAAQ;IACN,MAAM;IACN,KAAK,QAAQ,KAAK;IAClB,SAAS;IACV;GACD,SAAS;IACP,MACE,QAAQ,KAAK,eAAe,qBAAqB,QAAQ,KAAK;IAChE,aAAa,QAAQ,KAAK,SAAS,QAAQ,KAAK;IAChD,YAAY;IACb;GACD,cAAc,kBAAkB,SAAS,KAAK;GAC9C,eAAe,EAAE;GACjB,OAAO,CACL;IACE,OAAO;IACP,OAAO;IACP,aAAa,iBAAiB,QAAQ,KAAK,IAAI;IAC/C,oBAAoB,EAAE;IACvB,CACF;GACD,aAAa;IAAE,QAAQ,EAAE;IAAE,UAAU,EAAE;IAAE,KAAK,EAAE;IAAE;GAClD,uBAAuB,EAAE;GAC1B;AAIH,OAAK,eAAe,kBAAkB,SAAS,MAAM;GACnD,QAAQ;GACR,qBAAqB;GACrB,sBAAsB;GACtB,6BAA6B;GAC9B,CAAC;AAGF,MAAI,QAAQ,YAAY,OACtB,MAAK,QAAQ,QAAQ,WAAW,KAAK,IAAI,SAAS;GAChD,OAAO,MAAM;GACb,OAAO,aAAa,GAAG;GACvB,aAAa,uBAAuB,GAAG,IAAI,IAAI,GAAG;GAClD,oBAAoB,CAAC,aAAa,GAAG,IAAI,qBAAqB;GAC/D,EAAE;EAGL,MAAM,SAAS,QAAQ,WAAW,KAAK;EACvC,MAAM,WAAW,kBAAkB,SAAS,KAAK;AAEjD,SAAO;GACL;GACA;GACA;GACD;;;;;CAMH,oBACE,MACA,OACoB;AAEpB,SADgB,gBAAgB,SAAS,KAAK,OAAO,aAAa,CACnD,iBAAiB,KAAK;;;;;CAMvC,eACE,MACA,QACA,WAAyD,aACzD,cACQ;AACR,SAAO,2BAA2B,MAAM;GAAE;GAAU;GAAc,CAAC;;;;;CAMrE,iBAA8B;AAC5B,SAAO,gBAAgB;;;;;CAMzB,kBAA6B;AAC3B,SAAO,KAAK,OAAO;;;;;CAMrB,UAAU,QAAyC;AACjD,OAAK,SAAS;GAAE,GAAG,KAAK;GAAQ,GAAG;GAAQ;;;;;;AAO/C,SAAgB,wBACd,QACmB;AACnB,QAAO,IAAI,kBAAkB,OAAO;;;AAItC,MAAa,oBAAoB,IAAI,mBAAmB"}
1
+ {"version":3,"file":"agent-guide-service.js","names":["DEFAULT_CONFIG: AgentGuideConfig","plan: ImplementationPlan"],"sources":["../../../src/services/agent-guide/agent-guide-service.ts"],"sourcesContent":["/**\n * Agent Guide Service\n *\n * Generates implementation plans and prompts for AI coding agents.\n * Bridges ContractSpec specifications with agent-specific formats.\n */\n\nimport type {\n AnyOperationSpec,\n OperationSpecRegistry,\n PresentationRegistry,\n} from '@contractspec/lib.contracts';\nimport type { FeatureModuleSpec } from '@contractspec/lib.contracts/features';\nimport type {\n AgentType,\n ImplementationPlan,\n} from '@contractspec/lib.contracts/llm';\nimport {\n featureToMarkdown,\n generateImplementationPlan,\n operationSpecToAgentPrompt,\n operationSpecToFullMarkdown,\n} from '@contractspec/lib.contracts/llm';\nimport { getAgentAdapter, listAgentTypes } from './adapters';\nimport type { AgentGuideConfig, GuideOptions, GuideResult } from './types';\n\nconst DEFAULT_CONFIG: AgentGuideConfig = {\n defaultAgent: 'generic-mcp',\n verbose: false,\n};\n\n/**\n * Agent Guide Service\n *\n * Main service for generating implementation guidance for AI coding agents.\n */\nexport class AgentGuideService {\n private config: AgentGuideConfig;\n\n constructor(config: Partial<AgentGuideConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Generate an implementation guide for a spec.\n */\n generateGuide(\n spec: AnyOperationSpec,\n options: GuideOptions = {}\n ): GuideResult {\n const agent = options.agent ?? this.config.defaultAgent;\n const adapter = getAgentAdapter(agent);\n\n // Generate the implementation plan\n const plan = generateImplementationPlan(spec, {\n projectRoot: this.config.projectRoot,\n existingFiles: options.targetPath ? [options.targetPath] : undefined,\n });\n\n // Format for the target agent\n const prompt = adapter.formatPlan(plan);\n\n // Generate raw markdown for clipboard/export\n const markdown = operationSpecToFullMarkdown(spec);\n\n return {\n plan,\n prompt,\n markdown,\n };\n }\n\n /**\n * Generate a guide for a feature (includes all related specs).\n */\n generateFeatureGuide(\n feature: FeatureModuleSpec,\n deps: {\n specs?: OperationSpecRegistry;\n presentations?: PresentationRegistry;\n },\n options: GuideOptions = {}\n ): GuideResult {\n const agent = options.agent ?? this.config.defaultAgent;\n const adapter = getAgentAdapter(agent);\n\n // Create a composite plan for the feature\n const firstOp = feature.operations?.[0];\n const spec = firstOp\n ? deps.specs?.get(firstOp.key, firstOp.version)\n : undefined;\n\n // Generate base plan from first spec or create feature-level plan\n let plan: ImplementationPlan;\n if (spec) {\n plan = generateImplementationPlan(spec, {\n projectRoot: this.config.projectRoot,\n });\n // Override target to indicate it's a feature\n plan.target = {\n type: 'feature',\n key: feature.meta.key,\n version: '1.0.0',\n };\n plan.context.goal = feature.meta.description ?? plan.context.goal;\n } else {\n // Create a minimal plan for features without specs\n plan = {\n target: {\n type: 'feature',\n key: feature.meta.key,\n version: '1.0.0',\n },\n context: {\n goal:\n feature.meta.description ?? `Implement feature ${feature.meta.key}`,\n description: feature.meta.title ?? feature.meta.key,\n background: '',\n },\n specMarkdown: featureToMarkdown(feature, deps),\n fileStructure: [],\n steps: [\n {\n order: 1,\n title: 'Implement Feature',\n description: `Implement the ${feature.meta.key} feature`,\n acceptanceCriteria: [],\n },\n ],\n constraints: { policy: [], security: [], pii: [] },\n verificationChecklist: [],\n };\n }\n\n // Enhance spec markdown with full feature context\n plan.specMarkdown = featureToMarkdown(feature, deps, {\n format: 'full',\n includeRelatedSpecs: true,\n includeRelatedEvents: true,\n includeRelatedPresentations: true,\n });\n\n // Add steps for each operation\n if (feature.operations?.length) {\n plan.steps = feature.operations.map((op, idx) => ({\n order: idx + 1,\n title: `Implement ${op.key}`,\n description: `Implement operation ${op.key}.v${op.version}`,\n acceptanceCriteria: [`Operation ${op.key} works as specified`],\n }));\n }\n\n const prompt = adapter.formatPlan(plan);\n const markdown = featureToMarkdown(feature, deps);\n\n return {\n plan,\n prompt,\n markdown,\n };\n }\n\n /**\n * Generate agent-specific configuration (e.g., cursor rules).\n */\n generateAgentConfig(\n spec: AnyOperationSpec,\n agent?: AgentType\n ): string | undefined {\n const adapter = getAgentAdapter(agent ?? this.config.defaultAgent);\n return adapter.generateConfig?.(spec);\n }\n\n /**\n * Export a spec in a specific format for an agent.\n */\n exportForAgent(\n spec: AnyOperationSpec,\n _agent: AgentType,\n taskType: 'implement' | 'test' | 'refactor' | 'review' = 'implement',\n existingCode?: string\n ): string {\n return operationSpecToAgentPrompt(spec, { taskType, existingCode });\n }\n\n /**\n * List available agent types.\n */\n listAgentTypes(): AgentType[] {\n return listAgentTypes();\n }\n\n /**\n * Get the default agent type.\n */\n getDefaultAgent(): AgentType {\n return this.config.defaultAgent;\n }\n\n /**\n * Update configuration.\n */\n configure(config: Partial<AgentGuideConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Create a new AgentGuideService instance.\n */\nexport function createAgentGuideService(\n config?: Partial<AgentGuideConfig>\n): AgentGuideService {\n return new AgentGuideService(config);\n}\n\n/** Default singleton instance */\nexport const agentGuideService = new AgentGuideService();\n"],"mappings":";;;;AA0BA,MAAMA,iBAAmC;CACvC,cAAc;CACd,SAAS;CACV;;;;;;AAOD,IAAa,oBAAb,MAA+B;CAC7B,AAAQ;CAER,YAAY,SAAoC,EAAE,EAAE;AAClD,OAAK,SAAS;GAAE,GAAG;GAAgB,GAAG;GAAQ;;;;;CAMhD,cACE,MACA,UAAwB,EAAE,EACb;EAEb,MAAM,UAAU,gBADF,QAAQ,SAAS,KAAK,OAAO,aACL;EAGtC,MAAM,OAAO,2BAA2B,MAAM;GAC5C,aAAa,KAAK,OAAO;GACzB,eAAe,QAAQ,aAAa,CAAC,QAAQ,WAAW,GAAG;GAC5D,CAAC;AAQF,SAAO;GACL;GACA,QAPa,QAAQ,WAAW,KAAK;GAQrC,UALe,4BAA4B,KAAK;GAMjD;;;;;CAMH,qBACE,SACA,MAIA,UAAwB,EAAE,EACb;EAEb,MAAM,UAAU,gBADF,QAAQ,SAAS,KAAK,OAAO,aACL;EAGtC,MAAM,UAAU,QAAQ,aAAa;EACrC,MAAM,OAAO,UACT,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,QAAQ,GAC7C;EAGJ,IAAIC;AACJ,MAAI,MAAM;AACR,UAAO,2BAA2B,MAAM,EACtC,aAAa,KAAK,OAAO,aAC1B,CAAC;AAEF,QAAK,SAAS;IACZ,MAAM;IACN,KAAK,QAAQ,KAAK;IAClB,SAAS;IACV;AACD,QAAK,QAAQ,OAAO,QAAQ,KAAK,eAAe,KAAK,QAAQ;QAG7D,QAAO;GACL,QAAQ;IACN,MAAM;IACN,KAAK,QAAQ,KAAK;IAClB,SAAS;IACV;GACD,SAAS;IACP,MACE,QAAQ,KAAK,eAAe,qBAAqB,QAAQ,KAAK;IAChE,aAAa,QAAQ,KAAK,SAAS,QAAQ,KAAK;IAChD,YAAY;IACb;GACD,cAAc,kBAAkB,SAAS,KAAK;GAC9C,eAAe,EAAE;GACjB,OAAO,CACL;IACE,OAAO;IACP,OAAO;IACP,aAAa,iBAAiB,QAAQ,KAAK,IAAI;IAC/C,oBAAoB,EAAE;IACvB,CACF;GACD,aAAa;IAAE,QAAQ,EAAE;IAAE,UAAU,EAAE;IAAE,KAAK,EAAE;IAAE;GAClD,uBAAuB,EAAE;GAC1B;AAIH,OAAK,eAAe,kBAAkB,SAAS,MAAM;GACnD,QAAQ;GACR,qBAAqB;GACrB,sBAAsB;GACtB,6BAA6B;GAC9B,CAAC;AAGF,MAAI,QAAQ,YAAY,OACtB,MAAK,QAAQ,QAAQ,WAAW,KAAK,IAAI,SAAS;GAChD,OAAO,MAAM;GACb,OAAO,aAAa,GAAG;GACvB,aAAa,uBAAuB,GAAG,IAAI,IAAI,GAAG;GAClD,oBAAoB,CAAC,aAAa,GAAG,IAAI,qBAAqB;GAC/D,EAAE;EAGL,MAAM,SAAS,QAAQ,WAAW,KAAK;EACvC,MAAM,WAAW,kBAAkB,SAAS,KAAK;AAEjD,SAAO;GACL;GACA;GACA;GACD;;;;;CAMH,oBACE,MACA,OACoB;AAEpB,SADgB,gBAAgB,SAAS,KAAK,OAAO,aAAa,CACnD,iBAAiB,KAAK;;;;;CAMvC,eACE,MACA,QACA,WAAyD,aACzD,cACQ;AACR,SAAO,2BAA2B,MAAM;GAAE;GAAU;GAAc,CAAC;;;;;CAMrE,iBAA8B;AAC5B,SAAO,gBAAgB;;;;;CAMzB,kBAA6B;AAC3B,SAAO,KAAK,OAAO;;;;;CAMrB,UAAU,QAAyC;AACjD,OAAK,SAAS;GAAE,GAAG,KAAK;GAAQ,GAAG;GAAQ;;;;;;AAO/C,SAAgB,wBACd,QACmB;AACnB,QAAO,IAAI,kBAAkB,OAAO;;;AAItC,MAAa,oBAAoB,IAAI,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ci-check-service.d.ts","names":[],"sources":["../../../src/services/ci-check/ci-check-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;iBA+BsB,WAAA;MACJ;UAAmB;aAC1B,iBACR,QAAQ"}
1
+ {"version":3,"file":"ci-check-service.d.ts","names":[],"sources":["../../../src/services/ci-check/ci-check-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;iBAgCsB,WAAA;MACJ;UAAmB;aAC1B,iBACR,QAAQ"}
@@ -1,7 +1,8 @@
1
- import { validateImplementationFiles } from "../validate-implementation.js";
1
+ import { validateImplementationFiles } from "../validate/implementation-validator.js";
2
2
  import { analyzeDeps } from "../deps.js";
3
3
  import { loadWorkspaceConfig } from "../config.js";
4
4
  import { analyzeIntegrity } from "../integrity.js";
5
+ import { discoverLayers } from "../layer-discovery.js";
5
6
  import { runDoctor } from "../doctor/doctor-service.js";
6
7
  import { resolveAllImplementations } from "../implementation/resolver.js";
7
8
  import { isFeatureFile, validateSpecStructure } from "@contractspec/module.workspace";
@@ -66,6 +67,12 @@ async function runCIChecks(adapters, options = {}) {
66
67
  issues.push(...implIssues);
67
68
  categorySummaries.push(createCategorySummary("implementation", implIssues, Date.now() - categoryStart));
68
69
  }
70
+ if (checksToRun.includes("layers")) {
71
+ const categoryStart = Date.now();
72
+ const layerIssues = await runLayerChecks(adapters, options);
73
+ issues.push(...layerIssues);
74
+ categorySummaries.push(createCategorySummary("layers", layerIssues, Date.now() - categoryStart));
75
+ }
69
76
  const totalErrors = issues.filter((i) => i.severity === "error").length;
70
77
  const totalWarnings = issues.filter((i) => i.severity === "warning").length;
71
78
  const totalNotes = issues.filter((i) => i.severity === "note").length;
@@ -338,6 +345,65 @@ async function runImplementationChecks(adapters, specFiles, options) {
338
345
  return issues;
339
346
  }
340
347
  /**
348
+ * Run layer validation checks.
349
+ */
350
+ async function runLayerChecks(adapters, _options) {
351
+ const issues = [];
352
+ const result = await discoverLayers(adapters, {});
353
+ for (const [key, feature] of result.inventory.features) {
354
+ if (!feature.key) issues.push({
355
+ ruleId: "layer-feature-missing-key",
356
+ severity: "error",
357
+ message: `Feature missing required 'key' field`,
358
+ category: "layers",
359
+ file: feature.filePath,
360
+ context: { key }
361
+ });
362
+ if (!feature.owners?.length) issues.push({
363
+ ruleId: "layer-feature-missing-owners",
364
+ severity: "warning",
365
+ message: `Feature '${key}' missing 'owners' field`,
366
+ category: "layers",
367
+ file: feature.filePath,
368
+ context: { key }
369
+ });
370
+ if (feature.operations.length === 0 && feature.events.length === 0 && feature.presentations.length === 0) issues.push({
371
+ ruleId: "layer-feature-empty",
372
+ severity: "warning",
373
+ message: `Feature '${key}' has no operations, events, or presentations`,
374
+ category: "layers",
375
+ file: feature.filePath,
376
+ context: { key }
377
+ });
378
+ }
379
+ for (const [key, example] of result.inventory.examples) {
380
+ if (!example.entrypoints.packageName) issues.push({
381
+ ruleId: "layer-example-missing-package",
382
+ severity: "error",
383
+ message: `Example '${key}' missing 'packageName' in entrypoints`,
384
+ category: "layers",
385
+ file: example.filePath,
386
+ context: { key }
387
+ });
388
+ if (!example.surfaces.templates && !example.surfaces.sandbox.enabled && !example.surfaces.studio.enabled && !example.surfaces.mcp.enabled) issues.push({
389
+ ruleId: "layer-example-no-surfaces",
390
+ severity: "warning",
391
+ message: `Example '${key}' has no enabled surfaces`,
392
+ category: "layers",
393
+ file: example.filePath,
394
+ context: { key }
395
+ });
396
+ }
397
+ for (const config of result.inventory.workspaceConfigs.values()) if (!config.valid) for (const error of config.errors) issues.push({
398
+ ruleId: "layer-workspace-config-invalid",
399
+ severity: "error",
400
+ message: `Invalid workspace config: ${error}`,
401
+ category: "layers",
402
+ file: config.file
403
+ });
404
+ return issues;
405
+ }
406
+ /**
341
407
  * Create a category summary from issues.
342
408
  */
343
409
  function createCategorySummary(category, issues, durationMs) {
@@ -348,7 +414,8 @@ function createCategorySummary(category, issues, durationMs) {
348
414
  doctor: "Installation Health",
349
415
  handlers: "Handler Implementation",
350
416
  tests: "Test Coverage",
351
- implementation: "Implementation Verification"
417
+ implementation: "Implementation Verification",
418
+ layers: "Contract Layers Validation"
352
419
  };
353
420
  const errors = issues.filter((i) => i.severity === "error").length;
354
421
  const warnings = issues.filter((i) => i.severity === "warning").length;
@@ -1 +1 @@
1
- {"version":3,"file":"ci-check-service.js","names":["issues: CIIssue[]","categorySummaries: CICheckCategorySummary[]","result: CICheckResult","allCategories: CICheckCategory[]","categoryLabels: Record<CICheckCategory, string>"],"sources":["../../../src/services/ci-check/ci-check-service.ts"],"sourcesContent":["/**\n * CI Check service.\n *\n * Orchestrates all validation checks for CI/CD pipelines.\n * Returns structured results suitable for multiple output formats.\n */\n\nimport {\n isFeatureFile,\n validateSpecStructure,\n} from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport { analyzeIntegrity } from '../integrity';\nimport { analyzeDeps } from '../deps';\nimport { runDoctor } from '../doctor/doctor-service';\nimport { validateImplementationFiles } from '../validate-implementation';\nimport { loadWorkspaceConfig } from '../config';\nimport { resolveAllImplementations } from '../implementation/resolver';\n\nimport type {\n CICheckCategory,\n CICheckCategorySummary,\n CICheckOptions,\n CICheckResult,\n CIIssue,\n} from './types';\n\n/**\n * Run all CI checks and return structured results.\n */\nexport async function runCIChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions = {}\n): Promise<CICheckResult> {\n const startTime = Date.now();\n const { fs, logger } = adapters;\n\n const issues: CIIssue[] = [];\n const categorySummaries: CICheckCategorySummary[] = [];\n\n // Determine which checks to run\n const checksToRun = getChecksToRun(options);\n\n logger.info('Starting CI checks...', { checks: checksToRun });\n\n // Discover spec files\n const files = await fs.glob({ pattern: options.pattern });\n const specFiles = files.filter(\n (f) => !isFeatureFile(f) && !f.includes('.test.') && !f.includes('.spec.')\n );\n\n // Run spec structure validation\n if (checksToRun.includes('structure')) {\n const categoryStart = Date.now();\n const structureIssues = await runStructureChecks(adapters, specFiles);\n issues.push(...structureIssues);\n categorySummaries.push(\n createCategorySummary(\n 'structure',\n structureIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run integrity analysis\n if (checksToRun.includes('integrity')) {\n const categoryStart = Date.now();\n const integrityIssues = await runIntegrityChecks(adapters, options);\n issues.push(...integrityIssues);\n categorySummaries.push(\n createCategorySummary(\n 'integrity',\n integrityIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run dependency analysis\n if (checksToRun.includes('deps')) {\n const categoryStart = Date.now();\n const depsIssues = await runDepsChecks(adapters, options);\n issues.push(...depsIssues);\n categorySummaries.push(\n createCategorySummary('deps', depsIssues, Date.now() - categoryStart)\n );\n }\n\n // Run doctor checks (skip AI in CI)\n if (checksToRun.includes('doctor')) {\n const categoryStart = Date.now();\n const doctorIssues = await runDoctorChecks(adapters, options);\n issues.push(...doctorIssues);\n categorySummaries.push(\n createCategorySummary('doctor', doctorIssues, Date.now() - categoryStart)\n );\n }\n\n // Run handler checks\n if (checksToRun.includes('handlers') || options.checkHandlers) {\n const categoryStart = Date.now();\n const handlerIssues = await runHandlerChecks(adapters, specFiles);\n issues.push(...handlerIssues);\n categorySummaries.push(\n createCategorySummary(\n 'handlers',\n handlerIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run test checks\n if (checksToRun.includes('tests') || options.checkTests) {\n const categoryStart = Date.now();\n const testIssues = await runTestChecks(adapters, specFiles);\n issues.push(...testIssues);\n categorySummaries.push(\n createCategorySummary('tests', testIssues, Date.now() - categoryStart)\n );\n }\n\n // Run implementation checks\n if (checksToRun.includes('implementation')) {\n const categoryStart = Date.now();\n const implIssues = await runImplementationChecks(\n adapters,\n specFiles,\n options\n );\n issues.push(...implIssues);\n categorySummaries.push(\n createCategorySummary(\n 'implementation',\n implIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Calculate totals\n const totalErrors = issues.filter((i) => i.severity === 'error').length;\n const totalWarnings = issues.filter((i) => i.severity === 'warning').length;\n const totalNotes = issues.filter((i) => i.severity === 'note').length;\n\n // Determine success (no errors, or no warnings if failOnWarnings)\n const success = options.failOnWarnings\n ? totalErrors === 0 && totalWarnings === 0\n : totalErrors === 0;\n\n // Try to get git info\n const gitInfo = await getGitInfo(fs);\n\n const result: CICheckResult = {\n success,\n totalErrors,\n totalWarnings,\n totalNotes,\n issues,\n categories: categorySummaries,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n ...gitInfo,\n };\n\n logger.info('CI checks complete', {\n success,\n errors: totalErrors,\n warnings: totalWarnings,\n durationMs: result.durationMs,\n });\n\n return result;\n}\n\n/**\n * Determine which checks to run based on options.\n */\nfunction getChecksToRun(options: CICheckOptions): CICheckCategory[] {\n const allCategories: CICheckCategory[] = [\n 'structure',\n 'integrity',\n 'deps',\n 'doctor',\n ];\n\n // Add optional checks if explicitly requested\n if (options.checkHandlers) {\n allCategories.push('handlers');\n }\n if (options.checkTests) {\n allCategories.push('tests');\n }\n if (options.implementation) {\n allCategories.push('implementation');\n }\n\n // If specific checks are requested, use those\n if (options.checks && options.checks.length > 0) {\n return options.checks;\n }\n\n // Otherwise, use all minus skipped\n if (options.skip && options.skip.length > 0) {\n return allCategories.filter((c) => !options.skip?.includes(c));\n }\n\n return allCategories;\n}\n\n/**\n * Run spec structure validation checks.\n */\nasync function runStructureChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n for (const file of specFiles) {\n const content = await fs.readFile(file);\n const result = validateSpecStructure(content, file);\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'spec-structure-error',\n severity: 'error',\n message: error,\n category: 'structure',\n file,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'spec-structure-warning',\n severity: 'warning',\n message: warning,\n category: 'structure',\n file,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run integrity analysis checks.\n */\nasync function runIntegrityChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const result = await analyzeIntegrity(adapters, {\n pattern: options.pattern,\n all: true,\n });\n\n for (const issue of result.issues) {\n issues.push({\n ruleId: `integrity-${issue.type}`,\n severity: issue.severity === 'error' ? 'error' : 'warning',\n message: issue.message,\n category: 'integrity',\n file: issue.file,\n context: {\n specKey: issue.specKey,\n specType: issue.specType,\n featureKey: issue.featureKey,\n ref: issue.ref,\n },\n });\n }\n\n return issues;\n}\n\n/**\n * Run dependency analysis checks.\n */\nasync function runDepsChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const result = await analyzeDeps(adapters, {\n pattern: options.pattern,\n });\n\n // Report circular dependencies as errors\n for (const cycle of result.cycles) {\n issues.push({\n ruleId: 'deps-circular',\n severity: 'error',\n message: `Circular dependency detected: ${cycle.join(' → ')}`,\n category: 'deps',\n context: { cycle },\n });\n }\n\n // Report missing dependencies as errors\n for (const item of result.missing) {\n for (const missing of item.missing) {\n issues.push({\n ruleId: 'deps-missing',\n severity: 'error',\n message: `Missing dependency: ${item.contract} requires ${missing}`,\n category: 'deps',\n context: { contract: item.contract, missing },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run doctor checks (skipping AI in CI).\n */\nasync function runDoctorChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n const result = await runDoctor(adapters, {\n workspaceRoot,\n skipAi: true, // Always skip AI in CI\n categories: ['cli', 'config', 'deps', 'workspace'], // Skip AI and MCP\n });\n\n for (const check of result.checks) {\n if (check.status === 'fail') {\n issues.push({\n ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\\s+/g, '-')}`,\n severity: 'error',\n message: `${check.name}: ${check.message}`,\n category: 'doctor',\n context: { details: check.details },\n });\n } else if (check.status === 'warn') {\n issues.push({\n ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\\s+/g, '-')}`,\n severity: 'warning',\n message: `${check.name}: ${check.message}`,\n category: 'doctor',\n context: { details: check.details },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run handler implementation checks.\n */\nasync function runHandlerChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n\n for (const specFile of specFiles) {\n // Only check operation specs\n if (!specFile.includes('.operation.')) continue;\n\n const result = await validateImplementationFiles(specFile, { fs }, config, {\n checkHandlers: true,\n outputDir: config.outputDir,\n });\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'handler-missing',\n severity: 'warning', // Handler missing is a warning, not error\n message: error,\n category: 'handlers',\n file: specFile,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'handler-warning',\n severity: 'warning',\n message: warning,\n category: 'handlers',\n file: specFile,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run test coverage checks.\n */\nasync function runTestChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n\n for (const specFile of specFiles) {\n // Only check operation specs\n if (!specFile.includes('.operation.')) continue;\n\n const result = await validateImplementationFiles(specFile, { fs }, config, {\n checkTests: true,\n outputDir: config.outputDir,\n });\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'test-missing',\n severity: 'warning', // Test missing is a warning, not error\n message: error,\n category: 'tests',\n file: specFile,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'test-warning',\n severity: 'warning',\n message: warning,\n category: 'tests',\n file: specFile,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run implementation verification checks.\n */\nasync function runImplementationChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[],\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n const implOptions = options.implementation ?? {};\n\n // Only check operation specs by default\n const operationSpecs = specFiles.filter((f) => f.includes('.operation.'));\n\n // Resolve implementations for all specs\n const results = await resolveAllImplementations(\n operationSpecs,\n { fs },\n config,\n {\n computeHashes: implOptions.useCache ?? true,\n }\n );\n\n for (const result of results) {\n // Check if implementation is required\n if (implOptions.requireImplemented && result.status === 'missing') {\n issues.push({\n ruleId: 'impl-missing',\n severity: 'error',\n message: `Spec ${result.specKey} has no implementation`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n },\n });\n } else if (result.status === 'missing') {\n issues.push({\n ruleId: 'impl-missing',\n severity: 'warning',\n message: `Spec ${result.specKey} has no implementation`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n },\n });\n }\n\n // Check for partial implementations\n if (!implOptions.allowPartial && result.status === 'partial') {\n const missingImpls = result.implementations\n .filter((i) => !i.exists && i.type !== 'test')\n .map((i) => i.path);\n\n issues.push({\n ruleId: 'impl-partial',\n severity: 'warning',\n message: `Spec ${result.specKey} has partial implementation: missing ${missingImpls.join(', ')}`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n missingFiles: missingImpls,\n },\n });\n }\n\n // Report missing tests\n const missingTests = result.implementations.filter(\n (i) => !i.exists && i.type === 'test'\n );\n if (missingTests.length > 0) {\n issues.push({\n ruleId: 'impl-missing-tests',\n severity: 'note',\n message: `Spec ${result.specKey} missing test files: ${missingTests.map((t) => t.path).join(', ')}`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n missingTests: missingTests.map((t) => t.path),\n },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Create a category summary from issues.\n */\nfunction createCategorySummary(\n category: CICheckCategory,\n issues: CIIssue[],\n durationMs: number\n): CICheckCategorySummary {\n const categoryLabels: Record<CICheckCategory, string> = {\n structure: 'Spec Structure Validation',\n integrity: 'Contract Integrity Analysis',\n deps: 'Dependency Analysis',\n doctor: 'Installation Health',\n handlers: 'Handler Implementation',\n tests: 'Test Coverage',\n implementation: 'Implementation Verification',\n };\n\n const errors = issues.filter((i) => i.severity === 'error').length;\n const warnings = issues.filter((i) => i.severity === 'warning').length;\n const notes = issues.filter((i) => i.severity === 'note').length;\n\n return {\n category,\n label: categoryLabels[category],\n errors,\n warnings,\n notes,\n passed: errors === 0,\n durationMs,\n };\n}\n\n/**\n * Get git information if available.\n */\nasync function getGitInfo(\n fs: FsAdapter\n): Promise<{ commitSha?: string; branch?: string }> {\n try {\n // Try to read from .git/HEAD and refs\n const gitHeadPath = '.git/HEAD';\n if (!(await fs.exists(gitHeadPath))) {\n return {};\n }\n\n const headContent = await fs.readFile(gitHeadPath);\n const refMatch = headContent.match(/^ref: (.+)$/m);\n\n if (refMatch) {\n const branch = refMatch[1]?.replace('refs/heads/', '');\n const refPath = `.git/${refMatch[1]}`;\n\n if (await fs.exists(refPath)) {\n const commitSha = (await fs.readFile(refPath)).trim();\n return { commitSha, branch };\n }\n\n return { branch };\n }\n\n // Detached HEAD - content is the SHA\n const commitSha = headContent.trim();\n return { commitSha };\n } catch {\n return {};\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ci-check-service.js","names":["issues: CIIssue[]","categorySummaries: CICheckCategorySummary[]","result: CICheckResult","allCategories: CICheckCategory[]","categoryLabels: Record<CICheckCategory, string>"],"sources":["../../../src/services/ci-check/ci-check-service.ts"],"sourcesContent":["/**\n * CI Check service.\n *\n * Orchestrates all validation checks for CI/CD pipelines.\n * Returns structured results suitable for multiple output formats.\n */\n\nimport {\n isFeatureFile,\n validateSpecStructure,\n} from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport { analyzeIntegrity } from '../integrity';\nimport { analyzeDeps } from '../deps';\nimport { runDoctor } from '../doctor/doctor-service';\nimport { validateImplementationFiles } from '../validate/implementation-validator';\nimport { loadWorkspaceConfig } from '../config';\nimport { resolveAllImplementations } from '../implementation/resolver';\nimport { discoverLayers } from '../layer-discovery';\n\nimport type {\n CICheckCategory,\n CICheckCategorySummary,\n CICheckOptions,\n CICheckResult,\n CIIssue,\n} from './types';\n\n/**\n * Run all CI checks and return structured results.\n */\nexport async function runCIChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions = {}\n): Promise<CICheckResult> {\n const startTime = Date.now();\n const { fs, logger } = adapters;\n\n const issues: CIIssue[] = [];\n const categorySummaries: CICheckCategorySummary[] = [];\n\n // Determine which checks to run\n const checksToRun = getChecksToRun(options);\n\n logger.info('Starting CI checks...', { checks: checksToRun });\n\n // Discover spec files\n const files = await fs.glob({ pattern: options.pattern });\n const specFiles = files.filter(\n (f) => !isFeatureFile(f) && !f.includes('.test.') && !f.includes('.spec.')\n );\n\n // Run spec structure validation\n if (checksToRun.includes('structure')) {\n const categoryStart = Date.now();\n const structureIssues = await runStructureChecks(adapters, specFiles);\n issues.push(...structureIssues);\n categorySummaries.push(\n createCategorySummary(\n 'structure',\n structureIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run integrity analysis\n if (checksToRun.includes('integrity')) {\n const categoryStart = Date.now();\n const integrityIssues = await runIntegrityChecks(adapters, options);\n issues.push(...integrityIssues);\n categorySummaries.push(\n createCategorySummary(\n 'integrity',\n integrityIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run dependency analysis\n if (checksToRun.includes('deps')) {\n const categoryStart = Date.now();\n const depsIssues = await runDepsChecks(adapters, options);\n issues.push(...depsIssues);\n categorySummaries.push(\n createCategorySummary('deps', depsIssues, Date.now() - categoryStart)\n );\n }\n\n // Run doctor checks (skip AI in CI)\n if (checksToRun.includes('doctor')) {\n const categoryStart = Date.now();\n const doctorIssues = await runDoctorChecks(adapters, options);\n issues.push(...doctorIssues);\n categorySummaries.push(\n createCategorySummary('doctor', doctorIssues, Date.now() - categoryStart)\n );\n }\n\n // Run handler checks\n if (checksToRun.includes('handlers') || options.checkHandlers) {\n const categoryStart = Date.now();\n const handlerIssues = await runHandlerChecks(adapters, specFiles);\n issues.push(...handlerIssues);\n categorySummaries.push(\n createCategorySummary(\n 'handlers',\n handlerIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run test checks\n if (checksToRun.includes('tests') || options.checkTests) {\n const categoryStart = Date.now();\n const testIssues = await runTestChecks(adapters, specFiles);\n issues.push(...testIssues);\n categorySummaries.push(\n createCategorySummary('tests', testIssues, Date.now() - categoryStart)\n );\n }\n\n // Run implementation checks\n if (checksToRun.includes('implementation')) {\n const categoryStart = Date.now();\n const implIssues = await runImplementationChecks(\n adapters,\n specFiles,\n options\n );\n issues.push(...implIssues);\n categorySummaries.push(\n createCategorySummary(\n 'implementation',\n implIssues,\n Date.now() - categoryStart\n )\n );\n }\n\n // Run layers checks\n if (checksToRun.includes('layers')) {\n const categoryStart = Date.now();\n const layerIssues = await runLayerChecks(adapters, options);\n issues.push(...layerIssues);\n categorySummaries.push(\n createCategorySummary('layers', layerIssues, Date.now() - categoryStart)\n );\n }\n\n // Calculate totals\n const totalErrors = issues.filter((i) => i.severity === 'error').length;\n const totalWarnings = issues.filter((i) => i.severity === 'warning').length;\n const totalNotes = issues.filter((i) => i.severity === 'note').length;\n\n // Determine success (no errors, or no warnings if failOnWarnings)\n const success = options.failOnWarnings\n ? totalErrors === 0 && totalWarnings === 0\n : totalErrors === 0;\n\n // Try to get git info\n const gitInfo = await getGitInfo(fs);\n\n const result: CICheckResult = {\n success,\n totalErrors,\n totalWarnings,\n totalNotes,\n issues,\n categories: categorySummaries,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n ...gitInfo,\n };\n\n logger.info('CI checks complete', {\n success,\n errors: totalErrors,\n warnings: totalWarnings,\n durationMs: result.durationMs,\n });\n\n return result;\n}\n\n/**\n * Determine which checks to run based on options.\n */\nfunction getChecksToRun(options: CICheckOptions): CICheckCategory[] {\n const allCategories: CICheckCategory[] = [\n 'structure',\n 'integrity',\n 'deps',\n 'doctor',\n ];\n\n // Add optional checks if explicitly requested\n if (options.checkHandlers) {\n allCategories.push('handlers');\n }\n if (options.checkTests) {\n allCategories.push('tests');\n }\n if (options.implementation) {\n allCategories.push('implementation');\n }\n\n // If specific checks are requested, use those\n if (options.checks && options.checks.length > 0) {\n return options.checks;\n }\n\n // Otherwise, use all minus skipped\n if (options.skip && options.skip.length > 0) {\n return allCategories.filter((c) => !options.skip?.includes(c));\n }\n\n return allCategories;\n}\n\n/**\n * Run spec structure validation checks.\n */\nasync function runStructureChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n for (const file of specFiles) {\n const content = await fs.readFile(file);\n const result = validateSpecStructure(content, file);\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'spec-structure-error',\n severity: 'error',\n message: error,\n category: 'structure',\n file,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'spec-structure-warning',\n severity: 'warning',\n message: warning,\n category: 'structure',\n file,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run integrity analysis checks.\n */\nasync function runIntegrityChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const result = await analyzeIntegrity(adapters, {\n pattern: options.pattern,\n all: true,\n });\n\n for (const issue of result.issues) {\n issues.push({\n ruleId: `integrity-${issue.type}`,\n severity: issue.severity === 'error' ? 'error' : 'warning',\n message: issue.message,\n category: 'integrity',\n file: issue.file,\n context: {\n specKey: issue.specKey,\n specType: issue.specType,\n featureKey: issue.featureKey,\n ref: issue.ref,\n },\n });\n }\n\n return issues;\n}\n\n/**\n * Run dependency analysis checks.\n */\nasync function runDepsChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const result = await analyzeDeps(adapters, {\n pattern: options.pattern,\n });\n\n // Report circular dependencies as errors\n for (const cycle of result.cycles) {\n issues.push({\n ruleId: 'deps-circular',\n severity: 'error',\n message: `Circular dependency detected: ${cycle.join(' → ')}`,\n category: 'deps',\n context: { cycle },\n });\n }\n\n // Report missing dependencies as errors\n for (const item of result.missing) {\n for (const missing of item.missing) {\n issues.push({\n ruleId: 'deps-missing',\n severity: 'error',\n message: `Missing dependency: ${item.contract} requires ${missing}`,\n category: 'deps',\n context: { contract: item.contract, missing },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run doctor checks (skipping AI in CI).\n */\nasync function runDoctorChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n const result = await runDoctor(adapters, {\n workspaceRoot,\n skipAi: true, // Always skip AI in CI\n categories: ['cli', 'config', 'deps', 'workspace'], // Skip AI and MCP\n });\n\n for (const check of result.checks) {\n if (check.status === 'fail') {\n issues.push({\n ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\\s+/g, '-')}`,\n severity: 'error',\n message: `${check.name}: ${check.message}`,\n category: 'doctor',\n context: { details: check.details },\n });\n } else if (check.status === 'warn') {\n issues.push({\n ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\\s+/g, '-')}`,\n severity: 'warning',\n message: `${check.name}: ${check.message}`,\n category: 'doctor',\n context: { details: check.details },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run handler implementation checks.\n */\nasync function runHandlerChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n\n for (const specFile of specFiles) {\n // Only check operation specs\n if (!specFile.includes('.operation.')) continue;\n\n const result = await validateImplementationFiles(specFile, { fs }, config, {\n checkHandlers: true,\n outputDir: config.outputDir,\n });\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'handler-missing',\n severity: 'warning', // Handler missing is a warning, not error\n message: error,\n category: 'handlers',\n file: specFile,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'handler-warning',\n severity: 'warning',\n message: warning,\n category: 'handlers',\n file: specFile,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run test coverage checks.\n */\nasync function runTestChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[]\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n\n for (const specFile of specFiles) {\n // Only check operation specs\n if (!specFile.includes('.operation.')) continue;\n\n const result = await validateImplementationFiles(specFile, { fs }, config, {\n checkTests: true,\n outputDir: config.outputDir,\n });\n\n for (const error of result.errors) {\n issues.push({\n ruleId: 'test-missing',\n severity: 'warning', // Test missing is a warning, not error\n message: error,\n category: 'tests',\n file: specFile,\n });\n }\n\n for (const warning of result.warnings) {\n issues.push({\n ruleId: 'test-warning',\n severity: 'warning',\n message: warning,\n category: 'tests',\n file: specFile,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run implementation verification checks.\n */\nasync function runImplementationChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[],\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const { fs } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n const implOptions = options.implementation ?? {};\n\n // Only check operation specs by default\n const operationSpecs = specFiles.filter((f) => f.includes('.operation.'));\n\n // Resolve implementations for all specs\n const results = await resolveAllImplementations(\n operationSpecs,\n { fs },\n config,\n {\n computeHashes: implOptions.useCache ?? true,\n }\n );\n\n for (const result of results) {\n // Check if implementation is required\n if (implOptions.requireImplemented && result.status === 'missing') {\n issues.push({\n ruleId: 'impl-missing',\n severity: 'error',\n message: `Spec ${result.specKey} has no implementation`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n },\n });\n } else if (result.status === 'missing') {\n issues.push({\n ruleId: 'impl-missing',\n severity: 'warning',\n message: `Spec ${result.specKey} has no implementation`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n },\n });\n }\n\n // Check for partial implementations\n if (!implOptions.allowPartial && result.status === 'partial') {\n const missingImpls = result.implementations\n .filter((i) => !i.exists && i.type !== 'test')\n .map((i) => i.path);\n\n issues.push({\n ruleId: 'impl-partial',\n severity: 'warning',\n message: `Spec ${result.specKey} has partial implementation: missing ${missingImpls.join(', ')}`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n specVersion: result.specVersion,\n status: result.status,\n missingFiles: missingImpls,\n },\n });\n }\n\n // Report missing tests\n const missingTests = result.implementations.filter(\n (i) => !i.exists && i.type === 'test'\n );\n if (missingTests.length > 0) {\n issues.push({\n ruleId: 'impl-missing-tests',\n severity: 'note',\n message: `Spec ${result.specKey} missing test files: ${missingTests.map((t) => t.path).join(', ')}`,\n category: 'implementation',\n file: result.specPath,\n context: {\n specKey: result.specKey,\n missingTests: missingTests.map((t) => t.path),\n },\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Run layer validation checks.\n */\nasync function runLayerChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n _options: CICheckOptions\n): Promise<CIIssue[]> {\n const issues: CIIssue[] = [];\n\n // Discover all layers\n const result = await discoverLayers(adapters, {});\n\n // Validate features\n for (const [key, feature] of result.inventory.features) {\n // Check required meta fields\n if (!feature.key) {\n issues.push({\n ruleId: 'layer-feature-missing-key',\n severity: 'error',\n message: `Feature missing required 'key' field`,\n category: 'layers',\n file: feature.filePath,\n context: { key },\n });\n }\n\n if (!feature.owners?.length) {\n issues.push({\n ruleId: 'layer-feature-missing-owners',\n severity: 'warning',\n message: `Feature '${key}' missing 'owners' field`,\n category: 'layers',\n file: feature.filePath,\n context: { key },\n });\n }\n\n // Check for empty features\n if (\n feature.operations.length === 0 &&\n feature.events.length === 0 &&\n feature.presentations.length === 0\n ) {\n issues.push({\n ruleId: 'layer-feature-empty',\n severity: 'warning',\n message: `Feature '${key}' has no operations, events, or presentations`,\n category: 'layers',\n file: feature.filePath,\n context: { key },\n });\n }\n }\n\n // Validate examples\n for (const [key, example] of result.inventory.examples) {\n // Check required entrypoints\n if (!example.entrypoints.packageName) {\n issues.push({\n ruleId: 'layer-example-missing-package',\n severity: 'error',\n message: `Example '${key}' missing 'packageName' in entrypoints`,\n category: 'layers',\n file: example.filePath,\n context: { key },\n });\n }\n\n // Check required surfaces\n if (\n !example.surfaces.templates &&\n !example.surfaces.sandbox.enabled &&\n !example.surfaces.studio.enabled &&\n !example.surfaces.mcp.enabled\n ) {\n issues.push({\n ruleId: 'layer-example-no-surfaces',\n severity: 'warning',\n message: `Example '${key}' has no enabled surfaces`,\n category: 'layers',\n file: example.filePath,\n context: { key },\n });\n }\n }\n\n // Validate workspace configs\n for (const config of result.inventory.workspaceConfigs.values()) {\n if (!config.valid) {\n for (const error of config.errors) {\n issues.push({\n ruleId: 'layer-workspace-config-invalid',\n severity: 'error',\n message: `Invalid workspace config: ${error}`,\n category: 'layers',\n file: config.file,\n });\n }\n }\n }\n\n return issues;\n}\n\n/**\n * Create a category summary from issues.\n */\nfunction createCategorySummary(\n category: CICheckCategory,\n issues: CIIssue[],\n durationMs: number\n): CICheckCategorySummary {\n const categoryLabels: Record<CICheckCategory, string> = {\n structure: 'Spec Structure Validation',\n integrity: 'Contract Integrity Analysis',\n deps: 'Dependency Analysis',\n doctor: 'Installation Health',\n handlers: 'Handler Implementation',\n tests: 'Test Coverage',\n implementation: 'Implementation Verification',\n layers: 'Contract Layers Validation',\n };\n\n const errors = issues.filter((i) => i.severity === 'error').length;\n const warnings = issues.filter((i) => i.severity === 'warning').length;\n const notes = issues.filter((i) => i.severity === 'note').length;\n\n return {\n category,\n label: categoryLabels[category],\n errors,\n warnings,\n notes,\n passed: errors === 0,\n durationMs,\n };\n}\n\n/**\n * Get git information if available.\n */\nasync function getGitInfo(\n fs: FsAdapter\n): Promise<{ commitSha?: string; branch?: string }> {\n try {\n // Try to read from .git/HEAD and refs\n const gitHeadPath = '.git/HEAD';\n if (!(await fs.exists(gitHeadPath))) {\n return {};\n }\n\n const headContent = await fs.readFile(gitHeadPath);\n const refMatch = headContent.match(/^ref: (.+)$/m);\n\n if (refMatch) {\n const branch = refMatch[1]?.replace('refs/heads/', '');\n const refPath = `.git/${refMatch[1]}`;\n\n if (await fs.exists(refPath)) {\n const commitSha = (await fs.readFile(refPath)).trim();\n return { commitSha, branch };\n }\n\n return { branch };\n }\n\n // Detached HEAD - content is the SHA\n const commitSha = headContent.trim();\n return { commitSha };\n } catch {\n return {};\n }\n}\n"],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  /**
8
8
  * Categories of CI checks.
9
9
  */
10
- type CICheckCategory = 'structure' | 'integrity' | 'deps' | 'doctor' | 'handlers' | 'tests' | 'implementation';
10
+ type CICheckCategory = 'structure' | 'integrity' | 'deps' | 'doctor' | 'handlers' | 'tests' | 'implementation' | 'layers';
11
11
  /**
12
12
  * All available CI check categories.
13
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/ci-check/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAYA;AAaA;AAaA;AAKA;;;AAoBY,KA/DA,eAAA,GA+DA,WAAA,GAAA,WAAA,GAAA,MAAA,GAAA,QAAA,GAAA,UAAA,GAAA,OAAA,GAAA,gBAAA;;AAMZ;AAoBA;AA0BiB,cAvGJ,uBA2GF,EA3G2B,eA6G7B,EAAA;AAyBT;AAKA;;cA9Ha,0BAA0B,OAAO;;;;KAalC,eAAA;;;;UAKK,OAAA;;;;YAIL;;;;YAIA;;;;;;;;;;;;YAYA;;;;;UAMK,sBAAA;;YAEL;;;;;;;;;;;;;;;;;UAkBK,aAAA;;;;;;;;;;UAUP;;cAEI;;;;;;;;;;;;;UAcG,cAAA;;;;WAIN;;SAEF;;;;;;;;;;;;;;;;;;;;;;;;KAyBG,cAAA;;;;UAKK,eAAA;;UAEP"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/ci-check/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAaA;AAcA;AAcA;AAKA;;;AAoBY,KAlEA,eAAA,GAkEA,WAAA,GAAA,WAAA,GAAA,MAAA,GAAA,QAAA,GAAA,UAAA,GAAA,OAAA,GAAA,gBAAA,GAAA,QAAA;;AAMZ;AAoBA;AA0BiB,cAzGJ,uBA6GF,EA7G2B,eA+G7B,EAAA;AAyBT;AAKA;;cA/Ha,0BAA0B,OAAO;;;;KAclC,eAAA;;;;UAKK,OAAA;;;;YAIL;;;;YAIA;;;;;;;;;;;;YAYA;;;;;UAMK,sBAAA;;YAEL;;;;;;;;;;;;;;;;;UAkBK,aAAA;;;;;;;;;;UAUP;;cAEI;;;;;;;;;;;;;UAcG,cAAA;;;;WAIN;;SAEF;;;;;;;;;;;;;;;;;;;;;;;;KAyBG,cAAA;;;;UAKK,eAAA;;UAEP"}
@@ -9,7 +9,8 @@ const ALL_CI_CHECK_CATEGORIES = [
9
9
  "doctor",
10
10
  "handlers",
11
11
  "tests",
12
- "implementation"
12
+ "implementation",
13
+ "layers"
13
14
  ];
14
15
  /**
15
16
  * Human-readable labels for CI check categories.
@@ -21,7 +22,8 @@ const CI_CHECK_CATEGORY_LABELS = {
21
22
  doctor: "Installation Health",
22
23
  handlers: "Handler Implementation",
23
24
  tests: "Test Coverage",
24
- implementation: "Implementation Verification"
25
+ implementation: "Implementation Verification",
26
+ layers: "Contract Layers Validation"
25
27
  };
26
28
 
27
29
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["ALL_CI_CHECK_CATEGORIES: CICheckCategory[]","CI_CHECK_CATEGORY_LABELS: Record<CICheckCategory, string>"],"sources":["../../../src/services/ci-check/types.ts"],"sourcesContent":["/**\n * CI Check service types.\n *\n * Types for CI/CD validation checks with support for multiple output formats.\n */\n\n/**\n * Categories of CI checks.\n */\nexport type CICheckCategory =\n | 'structure'\n | 'integrity'\n | 'deps'\n | 'doctor'\n | 'handlers'\n | 'tests'\n | 'implementation';\n\n/**\n * All available CI check categories.\n */\nexport const ALL_CI_CHECK_CATEGORIES: CICheckCategory[] = [\n 'structure',\n 'integrity',\n 'deps',\n 'doctor',\n 'handlers',\n 'tests',\n 'implementation',\n];\n\n/**\n * Human-readable labels for CI check categories.\n */\nexport const CI_CHECK_CATEGORY_LABELS: Record<CICheckCategory, string> = {\n structure: 'Spec Structure Validation',\n integrity: 'Contract Integrity Analysis',\n deps: 'Dependency Analysis',\n doctor: 'Installation Health',\n handlers: 'Handler Implementation',\n tests: 'Test Coverage',\n implementation: 'Implementation Verification',\n};\n\n/**\n * Severity of a CI check issue.\n */\nexport type CIIssueSeverity = 'error' | 'warning' | 'note';\n\n/**\n * A single issue found during CI checks.\n */\nexport interface CIIssue {\n /** Unique ID for the issue type. */\n ruleId: string;\n /** Severity level. */\n severity: CIIssueSeverity;\n /** Human-readable message. */\n message: string;\n /** Category of the check. */\n category: CICheckCategory;\n /** File path where the issue was found. */\n file?: string;\n /** Line number (1-based). */\n line?: number;\n /** Column number (1-based). */\n column?: number;\n /** End line number (1-based). */\n endLine?: number;\n /** End column number (1-based). */\n endColumn?: number;\n /** Additional context. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Summary statistics for a CI check category.\n */\nexport interface CICheckCategorySummary {\n /** Category name. */\n category: CICheckCategory;\n /** Human-readable label. */\n label: string;\n /** Number of errors. */\n errors: number;\n /** Number of warnings. */\n warnings: number;\n /** Number of notes. */\n notes: number;\n /** Whether this category passed. */\n passed: boolean;\n /** Duration in milliseconds. */\n durationMs: number;\n}\n\n/**\n * Overall CI check result.\n */\nexport interface CICheckResult {\n /** Whether all checks passed (no errors). */\n success: boolean;\n /** Total number of errors. */\n totalErrors: number;\n /** Total number of warnings. */\n totalWarnings: number;\n /** Total number of notes. */\n totalNotes: number;\n /** All issues found. */\n issues: CIIssue[];\n /** Summary by category. */\n categories: CICheckCategorySummary[];\n /** Total duration in milliseconds. */\n durationMs: number;\n /** Timestamp when the check was run. */\n timestamp: string;\n /** Git commit SHA if available. */\n commitSha?: string;\n /** Git branch if available. */\n branch?: string;\n}\n\n/**\n * Options for running CI checks.\n */\nexport interface CICheckOptions {\n /** Glob pattern for spec discovery. */\n pattern?: string;\n /** Check categories to run (defaults to all). */\n checks?: CICheckCategory[];\n /** Skip specific categories. */\n skip?: CICheckCategory[];\n /** Include handler existence checks. */\n checkHandlers?: boolean;\n /** Include test coverage checks. */\n checkTests?: boolean;\n /** Fail on warnings (treat warnings as errors). */\n failOnWarnings?: boolean;\n /** Workspace root directory. */\n workspaceRoot?: string;\n /** Implementation check options. */\n implementation?: {\n /** Require all specs to be implemented. */\n requireImplemented?: boolean;\n /** Verification tier to run. */\n verificationTier?: 'structure' | 'behavior' | 'ai';\n /** Use cache for verification results. */\n useCache?: boolean;\n /** Allow partial implementations. */\n allowPartial?: boolean;\n };\n}\n\n/**\n * Output format for CI check results.\n */\nexport type CIOutputFormat = 'text' | 'json' | 'sarif';\n\n/**\n * Options for formatting CI check output.\n */\nexport interface CIFormatOptions {\n /** Output format. */\n format: CIOutputFormat;\n /** Whether to use colors (for text format). */\n colors?: boolean;\n /** Tool name for SARIF output. */\n toolName?: string;\n /** Tool version for SARIF output. */\n toolVersion?: string;\n /** Repository URI for SARIF output. */\n repositoryUri?: string;\n}\n"],"mappings":";;;;AAqBA,MAAaA,0BAA6C;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAaC,2BAA4D;CACvE,WAAW;CACX,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,gBAAgB;CACjB"}
1
+ {"version":3,"file":"types.js","names":["ALL_CI_CHECK_CATEGORIES: CICheckCategory[]","CI_CHECK_CATEGORY_LABELS: Record<CICheckCategory, string>"],"sources":["../../../src/services/ci-check/types.ts"],"sourcesContent":["/**\n * CI Check service types.\n *\n * Types for CI/CD validation checks with support for multiple output formats.\n */\n\n/**\n * Categories of CI checks.\n */\nexport type CICheckCategory =\n | 'structure'\n | 'integrity'\n | 'deps'\n | 'doctor'\n | 'handlers'\n | 'tests'\n | 'implementation'\n | 'layers';\n\n/**\n * All available CI check categories.\n */\nexport const ALL_CI_CHECK_CATEGORIES: CICheckCategory[] = [\n 'structure',\n 'integrity',\n 'deps',\n 'doctor',\n 'handlers',\n 'tests',\n 'implementation',\n 'layers',\n];\n\n/**\n * Human-readable labels for CI check categories.\n */\nexport const CI_CHECK_CATEGORY_LABELS: Record<CICheckCategory, string> = {\n structure: 'Spec Structure Validation',\n integrity: 'Contract Integrity Analysis',\n deps: 'Dependency Analysis',\n doctor: 'Installation Health',\n handlers: 'Handler Implementation',\n tests: 'Test Coverage',\n implementation: 'Implementation Verification',\n layers: 'Contract Layers Validation',\n};\n\n/**\n * Severity of a CI check issue.\n */\nexport type CIIssueSeverity = 'error' | 'warning' | 'note';\n\n/**\n * A single issue found during CI checks.\n */\nexport interface CIIssue {\n /** Unique ID for the issue type. */\n ruleId: string;\n /** Severity level. */\n severity: CIIssueSeverity;\n /** Human-readable message. */\n message: string;\n /** Category of the check. */\n category: CICheckCategory;\n /** File path where the issue was found. */\n file?: string;\n /** Line number (1-based). */\n line?: number;\n /** Column number (1-based). */\n column?: number;\n /** End line number (1-based). */\n endLine?: number;\n /** End column number (1-based). */\n endColumn?: number;\n /** Additional context. */\n context?: Record<string, unknown>;\n}\n\n/**\n * Summary statistics for a CI check category.\n */\nexport interface CICheckCategorySummary {\n /** Category name. */\n category: CICheckCategory;\n /** Human-readable label. */\n label: string;\n /** Number of errors. */\n errors: number;\n /** Number of warnings. */\n warnings: number;\n /** Number of notes. */\n notes: number;\n /** Whether this category passed. */\n passed: boolean;\n /** Duration in milliseconds. */\n durationMs: number;\n}\n\n/**\n * Overall CI check result.\n */\nexport interface CICheckResult {\n /** Whether all checks passed (no errors). */\n success: boolean;\n /** Total number of errors. */\n totalErrors: number;\n /** Total number of warnings. */\n totalWarnings: number;\n /** Total number of notes. */\n totalNotes: number;\n /** All issues found. */\n issues: CIIssue[];\n /** Summary by category. */\n categories: CICheckCategorySummary[];\n /** Total duration in milliseconds. */\n durationMs: number;\n /** Timestamp when the check was run. */\n timestamp: string;\n /** Git commit SHA if available. */\n commitSha?: string;\n /** Git branch if available. */\n branch?: string;\n}\n\n/**\n * Options for running CI checks.\n */\nexport interface CICheckOptions {\n /** Glob pattern for spec discovery. */\n pattern?: string;\n /** Check categories to run (defaults to all). */\n checks?: CICheckCategory[];\n /** Skip specific categories. */\n skip?: CICheckCategory[];\n /** Include handler existence checks. */\n checkHandlers?: boolean;\n /** Include test coverage checks. */\n checkTests?: boolean;\n /** Fail on warnings (treat warnings as errors). */\n failOnWarnings?: boolean;\n /** Workspace root directory. */\n workspaceRoot?: string;\n /** Implementation check options. */\n implementation?: {\n /** Require all specs to be implemented. */\n requireImplemented?: boolean;\n /** Verification tier to run. */\n verificationTier?: 'structure' | 'behavior' | 'ai';\n /** Use cache for verification results. */\n useCache?: boolean;\n /** Allow partial implementations. */\n allowPartial?: boolean;\n };\n}\n\n/**\n * Output format for CI check results.\n */\nexport type CIOutputFormat = 'text' | 'json' | 'sarif';\n\n/**\n * Options for formatting CI check output.\n */\nexport interface CIFormatOptions {\n /** Output format. */\n format: CIOutputFormat;\n /** Whether to use colors (for text format). */\n colors?: boolean;\n /** Tool name for SARIF output. */\n toolName?: string;\n /** Tool version for SARIF output. */\n toolVersion?: string;\n /** Repository URI for SARIF output. */\n repositoryUri?: string;\n}\n"],"mappings":";;;;AAsBA,MAAaA,0BAA6C;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAaC,2BAA4D;CACvE,WAAW;CACX,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,gBAAgB;CAChB,QAAQ;CACT"}