@contractspec/bundle.workspace 0.0.0-canary-20260113162409
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.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/_virtual/rolldown_runtime.mjs +20 -0
- package/dist/adapters/ai.d.mts +12 -0
- package/dist/adapters/ai.d.mts.map +1 -0
- package/dist/adapters/ai.mjs +83 -0
- package/dist/adapters/ai.mjs.map +1 -0
- package/dist/adapters/factory.d.mts +29 -0
- package/dist/adapters/factory.d.mts.map +1 -0
- package/dist/adapters/factory.mjs +37 -0
- package/dist/adapters/factory.mjs.map +1 -0
- package/dist/adapters/fs.d.mts +12 -0
- package/dist/adapters/fs.d.mts.map +1 -0
- package/dist/adapters/fs.mjs +133 -0
- package/dist/adapters/fs.mjs.map +1 -0
- package/dist/adapters/git.d.mts +11 -0
- package/dist/adapters/git.d.mts.map +1 -0
- package/dist/adapters/git.mjs +84 -0
- package/dist/adapters/git.mjs.map +1 -0
- package/dist/adapters/index.d.mts +7 -0
- package/dist/adapters/index.mjs +9 -0
- package/dist/adapters/logger.d.mts +18 -0
- package/dist/adapters/logger.d.mts.map +1 -0
- package/dist/adapters/logger.mjs +81 -0
- package/dist/adapters/logger.mjs.map +1 -0
- package/dist/adapters/watcher.d.mts +11 -0
- package/dist/adapters/watcher.d.mts.map +1 -0
- package/dist/adapters/watcher.mjs +74 -0
- package/dist/adapters/watcher.mjs.map +1 -0
- package/dist/adapters/workspace.d.mts +148 -0
- package/dist/adapters/workspace.d.mts.map +1 -0
- package/dist/adapters/workspace.mjs +275 -0
- package/dist/adapters/workspace.mjs.map +1 -0
- package/dist/ai/agents/claude-code-agent.d.mts +22 -0
- package/dist/ai/agents/claude-code-agent.d.mts.map +1 -0
- package/dist/ai/agents/claude-code-agent.mjs +182 -0
- package/dist/ai/agents/claude-code-agent.mjs.map +1 -0
- package/dist/ai/agents/cursor-agent.d.mts +68 -0
- package/dist/ai/agents/cursor-agent.d.mts.map +1 -0
- package/dist/ai/agents/cursor-agent.mjs +436 -0
- package/dist/ai/agents/cursor-agent.mjs.map +1 -0
- package/dist/ai/agents/index.mjs +7 -0
- package/dist/ai/agents/openai-codex-agent.d.mts +22 -0
- package/dist/ai/agents/openai-codex-agent.d.mts.map +1 -0
- package/dist/ai/agents/openai-codex-agent.mjs +167 -0
- package/dist/ai/agents/openai-codex-agent.mjs.map +1 -0
- package/dist/ai/agents/orchestrator.d.mts +50 -0
- package/dist/ai/agents/orchestrator.d.mts.map +1 -0
- package/dist/ai/agents/orchestrator.mjs +143 -0
- package/dist/ai/agents/orchestrator.mjs.map +1 -0
- package/dist/ai/agents/simple-agent.d.mts +17 -0
- package/dist/ai/agents/simple-agent.d.mts.map +1 -0
- package/dist/ai/agents/simple-agent.mjs +92 -0
- package/dist/ai/agents/simple-agent.mjs.map +1 -0
- package/dist/ai/agents/types.d.mts +36 -0
- package/dist/ai/agents/types.d.mts.map +1 -0
- package/dist/ai/client.d.mts +97 -0
- package/dist/ai/client.d.mts.map +1 -0
- package/dist/ai/client.mjs +189 -0
- package/dist/ai/client.mjs.map +1 -0
- package/dist/ai/index.d.mts +9 -0
- package/dist/ai/index.mjs +11 -0
- package/dist/ai/prompts/code-generation.d.mts +26 -0
- package/dist/ai/prompts/code-generation.d.mts.map +1 -0
- package/dist/ai/prompts/code-generation.mjs +143 -0
- package/dist/ai/prompts/code-generation.mjs.map +1 -0
- package/dist/ai/prompts/index.d.mts +10 -0
- package/dist/ai/prompts/index.d.mts.map +1 -0
- package/dist/ai/prompts/index.mjs +13 -0
- package/dist/ai/prompts/index.mjs.map +1 -0
- package/dist/ai/prompts/spec-creation.d.mts +29 -0
- package/dist/ai/prompts/spec-creation.d.mts.map +1 -0
- package/dist/ai/prompts/spec-creation.mjs +111 -0
- package/dist/ai/prompts/spec-creation.mjs.map +1 -0
- package/dist/ai/providers.d.mts +29 -0
- package/dist/ai/providers.d.mts.map +1 -0
- package/dist/ai/providers.mjs +39 -0
- package/dist/ai/providers.mjs.map +1 -0
- package/dist/formatters/index.d.mts +11 -0
- package/dist/formatters/index.d.mts.map +1 -0
- package/dist/formatters/index.mjs +17 -0
- package/dist/formatters/index.mjs.map +1 -0
- package/dist/formatters/json.d.mts +56 -0
- package/dist/formatters/json.d.mts.map +1 -0
- package/dist/formatters/json.mjs +43 -0
- package/dist/formatters/json.mjs.map +1 -0
- package/dist/formatters/sarif.d.mts +101 -0
- package/dist/formatters/sarif.d.mts.map +1 -0
- package/dist/formatters/sarif.mjs +163 -0
- package/dist/formatters/sarif.mjs.map +1 -0
- package/dist/formatters/text.d.mts +35 -0
- package/dist/formatters/text.d.mts.map +1 -0
- package/dist/formatters/text.mjs +209 -0
- package/dist/formatters/text.mjs.map +1 -0
- package/dist/index.d.mts +125 -0
- package/dist/index.mjs +110 -0
- package/dist/ports/ai.d.mts +59 -0
- package/dist/ports/ai.d.mts.map +1 -0
- package/dist/ports/fs.d.mts +81 -0
- package/dist/ports/fs.d.mts.map +1 -0
- package/dist/ports/git.d.mts +46 -0
- package/dist/ports/git.d.mts.map +1 -0
- package/dist/ports/index.d.mts +6 -0
- package/dist/ports/logger.d.mts +88 -0
- package/dist/ports/logger.d.mts.map +1 -0
- package/dist/ports/rulesync.d.mts +38 -0
- package/dist/ports/rulesync.d.mts.map +1 -0
- package/dist/ports/watcher.d.mts +52 -0
- package/dist/ports/watcher.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.d.mts +35 -0
- package/dist/services/agent-guide/adapters/claude-code.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.mjs +144 -0
- package/dist/services/agent-guide/adapters/claude-code.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts +39 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.mjs +135 -0
- package/dist/services/agent-guide/adapters/cursor-cli.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts +53 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.mjs +159 -0
- package/dist/services/agent-guide/adapters/generic-mcp.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/index.d.mts +23 -0
- package/dist/services/agent-guide/adapters/index.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/index.mjs +31 -0
- package/dist/services/agent-guide/adapters/index.mjs.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.d.mts +56 -0
- package/dist/services/agent-guide/agent-guide-service.d.mts.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.mjs +147 -0
- package/dist/services/agent-guide/agent-guide-service.mjs.map +1 -0
- package/dist/services/agent-guide/index.d.mts +6 -0
- package/dist/services/agent-guide/index.mjs +7 -0
- package/dist/services/agent-guide/types.d.mts +58 -0
- package/dist/services/agent-guide/types.d.mts.map +1 -0
- package/dist/services/build.d.mts +61 -0
- package/dist/services/build.d.mts.map +1 -0
- package/dist/services/build.mjs +151 -0
- package/dist/services/build.mjs.map +1 -0
- package/dist/services/ci-check/checks/coverage.mjs +77 -0
- package/dist/services/ci-check/checks/coverage.mjs.map +1 -0
- package/dist/services/ci-check/checks/deps.mjs +32 -0
- package/dist/services/ci-check/checks/deps.mjs.map +1 -0
- package/dist/services/ci-check/checks/doctor.mjs +38 -0
- package/dist/services/ci-check/checks/doctor.mjs.map +1 -0
- package/dist/services/ci-check/checks/drift.mjs +40 -0
- package/dist/services/ci-check/checks/drift.mjs.map +1 -0
- package/dist/services/ci-check/checks/handlers.mjs +38 -0
- package/dist/services/ci-check/checks/handlers.mjs.map +1 -0
- package/dist/services/ci-check/checks/implementation.mjs +73 -0
- package/dist/services/ci-check/checks/implementation.mjs.map +1 -0
- package/dist/services/ci-check/checks/index.mjs +13 -0
- package/dist/services/ci-check/checks/integrity.mjs +31 -0
- package/dist/services/ci-check/checks/integrity.mjs.map +1 -0
- package/dist/services/ci-check/checks/layers.mjs +66 -0
- package/dist/services/ci-check/checks/layers.mjs.map +1 -0
- package/dist/services/ci-check/checks/structure.mjs +35 -0
- package/dist/services/ci-check/checks/structure.mjs.map +1 -0
- package/dist/services/ci-check/checks/test-refs.mjs +63 -0
- package/dist/services/ci-check/checks/test-refs.mjs.map +1 -0
- package/dist/services/ci-check/checks/tests.mjs +38 -0
- package/dist/services/ci-check/checks/tests.mjs.map +1 -0
- package/dist/services/ci-check/ci-check-service.d.mts +16 -0
- package/dist/services/ci-check/ci-check-service.d.mts.map +1 -0
- package/dist/services/ci-check/ci-check-service.mjs +129 -0
- package/dist/services/ci-check/ci-check-service.mjs.map +1 -0
- package/dist/services/ci-check/index.d.mts +2 -0
- package/dist/services/ci-check/index.mjs +4 -0
- package/dist/services/ci-check/types.d.mts +147 -0
- package/dist/services/ci-check/types.d.mts.map +1 -0
- package/dist/services/ci-check/types.mjs +37 -0
- package/dist/services/ci-check/types.mjs.map +1 -0
- package/dist/services/ci-check/utils.mjs +76 -0
- package/dist/services/ci-check/utils.mjs.map +1 -0
- package/dist/services/clean.d.mts +41 -0
- package/dist/services/clean.d.mts.map +1 -0
- package/dist/services/clean.mjs +72 -0
- package/dist/services/clean.mjs.map +1 -0
- package/dist/services/config.d.mts +16 -0
- package/dist/services/config.d.mts.map +1 -0
- package/dist/services/config.mjs +63 -0
- package/dist/services/config.mjs.map +1 -0
- package/dist/services/coverage/parsers/index.mjs +34 -0
- package/dist/services/coverage/parsers/index.mjs.map +1 -0
- package/dist/services/coverage/parsers/istanbul-parser.mjs +108 -0
- package/dist/services/coverage/parsers/istanbul-parser.mjs.map +1 -0
- package/dist/services/coverage/validator.mjs +55 -0
- package/dist/services/coverage/validator.mjs.map +1 -0
- package/dist/services/create/ai-generator.d.mts +84 -0
- package/dist/services/create/ai-generator.d.mts.map +1 -0
- package/dist/services/create/ai-generator.mjs +178 -0
- package/dist/services/create/ai-generator.mjs.map +1 -0
- package/dist/services/create/index.d.mts +28 -0
- package/dist/services/create/index.d.mts.map +1 -0
- package/dist/services/create/index.mjs +37 -0
- package/dist/services/create/index.mjs.map +1 -0
- package/dist/services/create/templates.d.mts +22 -0
- package/dist/services/create/templates.d.mts.map +1 -0
- package/dist/services/create/templates.mjs +39 -0
- package/dist/services/create/templates.mjs.map +1 -0
- package/dist/services/deps.d.mts +53 -0
- package/dist/services/deps.d.mts.map +1 -0
- package/dist/services/deps.mjs +62 -0
- package/dist/services/deps.mjs.map +1 -0
- package/dist/services/diff.d.mts +34 -0
- package/dist/services/diff.d.mts.map +1 -0
- package/dist/services/diff.mjs +34 -0
- package/dist/services/diff.mjs.map +1 -0
- package/dist/services/docs/docs-service.d.mts +20 -0
- package/dist/services/docs/docs-service.d.mts.map +1 -0
- package/dist/services/docs/docs-service.mjs +59 -0
- package/dist/services/docs/docs-service.mjs.map +1 -0
- package/dist/services/docs/index.d.mts +1 -0
- package/dist/services/docs/index.mjs +3 -0
- package/dist/services/doctor/checks/ai.mjs +119 -0
- package/dist/services/doctor/checks/ai.mjs.map +1 -0
- package/dist/services/doctor/checks/cli.mjs +156 -0
- package/dist/services/doctor/checks/cli.mjs.map +1 -0
- package/dist/services/doctor/checks/config.mjs +303 -0
- package/dist/services/doctor/checks/config.mjs.map +1 -0
- package/dist/services/doctor/checks/deps.mjs +267 -0
- package/dist/services/doctor/checks/deps.mjs.map +1 -0
- package/dist/services/doctor/checks/index.mjs +9 -0
- package/dist/services/doctor/checks/layers.mjs +139 -0
- package/dist/services/doctor/checks/layers.mjs.map +1 -0
- package/dist/services/doctor/checks/mcp.mjs +145 -0
- package/dist/services/doctor/checks/mcp.mjs.map +1 -0
- package/dist/services/doctor/checks/workspace.mjs +263 -0
- package/dist/services/doctor/checks/workspace.mjs.map +1 -0
- package/dist/services/doctor/doctor-service.d.mts +24 -0
- package/dist/services/doctor/doctor-service.d.mts.map +1 -0
- package/dist/services/doctor/doctor-service.mjs +118 -0
- package/dist/services/doctor/doctor-service.mjs.map +1 -0
- package/dist/services/doctor/index.d.mts +2 -0
- package/dist/services/doctor/index.mjs +4 -0
- package/dist/services/doctor/types.d.mts +118 -0
- package/dist/services/doctor/types.d.mts.map +1 -0
- package/dist/services/doctor/types.mjs +29 -0
- package/dist/services/doctor/types.mjs.map +1 -0
- package/dist/services/drift.mjs +73 -0
- package/dist/services/drift.mjs.map +1 -0
- package/dist/services/extract.d.mts +12 -0
- package/dist/services/extract.d.mts.map +1 -0
- package/dist/services/extract.mjs +33 -0
- package/dist/services/extract.mjs.map +1 -0
- package/dist/services/features/completion.d.mts +21 -0
- package/dist/services/features/completion.d.mts.map +1 -0
- package/dist/services/features/completion.mjs +70 -0
- package/dist/services/features/completion.mjs.map +1 -0
- package/dist/services/features/feature-editor.d.mts +27 -0
- package/dist/services/features/feature-editor.d.mts.map +1 -0
- package/dist/services/features/feature-editor.mjs +37 -0
- package/dist/services/features/feature-editor.mjs.map +1 -0
- package/dist/services/features/index.d.mts +11 -0
- package/dist/services/features/index.d.mts.map +1 -0
- package/dist/services/features/index.mjs +16 -0
- package/dist/services/features/index.mjs.map +1 -0
- package/dist/services/features/validation.d.mts +21 -0
- package/dist/services/features/validation.d.mts.map +1 -0
- package/dist/services/features/validation.mjs +27 -0
- package/dist/services/features/validation.mjs.map +1 -0
- package/dist/services/fix/fix-link-formatter.d.mts +12 -0
- package/dist/services/fix/fix-link-formatter.d.mts.map +1 -0
- package/dist/services/fix/fix-link-formatter.mjs +38 -0
- package/dist/services/fix/fix-link-formatter.mjs.map +1 -0
- package/dist/services/fix/fix-service.d.mts +74 -0
- package/dist/services/fix/fix-service.d.mts.map +1 -0
- package/dist/services/fix/fix-service.mjs +169 -0
- package/dist/services/fix/fix-service.mjs.map +1 -0
- package/dist/services/fix/index.d.mts +16 -0
- package/dist/services/fix/index.d.mts.map +1 -0
- package/dist/services/fix/index.mjs +24 -0
- package/dist/services/fix/index.mjs.map +1 -0
- package/dist/services/fix/path-resolver.mjs +83 -0
- package/dist/services/fix/path-resolver.mjs.map +1 -0
- package/dist/services/fix/schemas.d.mts +17 -0
- package/dist/services/fix/schemas.d.mts.map +1 -0
- package/dist/services/fix/schemas.mjs +12 -0
- package/dist/services/fix/schemas.mjs.map +1 -0
- package/dist/services/fix/strategies/implement-ai.d.mts +18 -0
- package/dist/services/fix/strategies/implement-ai.d.mts.map +1 -0
- package/dist/services/fix/strategies/implement-ai.mjs +139 -0
- package/dist/services/fix/strategies/implement-ai.mjs.map +1 -0
- package/dist/services/fix/strategies/implement-skeleton.d.mts +14 -0
- package/dist/services/fix/strategies/implement-skeleton.d.mts.map +1 -0
- package/dist/services/fix/strategies/implement-skeleton.mjs +77 -0
- package/dist/services/fix/strategies/implement-skeleton.mjs.map +1 -0
- package/dist/services/fix/strategies/index.d.mts +3 -0
- package/dist/services/fix/strategies/remove-reference.d.mts +17 -0
- package/dist/services/fix/strategies/remove-reference.d.mts.map +1 -0
- package/dist/services/fix/strategies/remove-reference.mjs +98 -0
- package/dist/services/fix/strategies/remove-reference.mjs.map +1 -0
- package/dist/services/fix/types.d.mts +207 -0
- package/dist/services/fix/types.d.mts.map +1 -0
- package/dist/services/fix/types.mjs +20 -0
- package/dist/services/fix/types.mjs.map +1 -0
- package/dist/services/formatter.d.mts +15 -0
- package/dist/services/formatter.d.mts.map +1 -0
- package/dist/services/formatter.mjs +26 -0
- package/dist/services/formatter.mjs.map +1 -0
- package/dist/services/gap.d.mts +18 -0
- package/dist/services/gap.d.mts.map +1 -0
- package/dist/services/gap.mjs +44 -0
- package/dist/services/gap.mjs.map +1 -0
- package/dist/services/generate-artifacts.d.mts +11 -0
- package/dist/services/generate-artifacts.d.mts.map +1 -0
- package/dist/services/generate-artifacts.mjs +27 -0
- package/dist/services/generate-artifacts.mjs.map +1 -0
- package/dist/services/hooks/hooks-service.d.mts +24 -0
- package/dist/services/hooks/hooks-service.d.mts.map +1 -0
- package/dist/services/hooks/hooks-service.mjs +126 -0
- package/dist/services/hooks/hooks-service.mjs.map +1 -0
- package/dist/services/hooks/index.d.mts +10 -0
- package/dist/services/hooks/index.d.mts.map +1 -0
- package/dist/services/hooks/index.mjs +12 -0
- package/dist/services/hooks/index.mjs.map +1 -0
- package/dist/services/hooks/types.d.mts +56 -0
- package/dist/services/hooks/types.d.mts.map +1 -0
- package/dist/services/impact/formatters.d.mts +27 -0
- package/dist/services/impact/formatters.d.mts.map +1 -0
- package/dist/services/impact/formatters.mjs +139 -0
- package/dist/services/impact/formatters.mjs.map +1 -0
- package/dist/services/impact/impact-detection-service.d.mts +22 -0
- package/dist/services/impact/impact-detection-service.d.mts.map +1 -0
- package/dist/services/impact/impact-detection-service.mjs +96 -0
- package/dist/services/impact/impact-detection-service.mjs.map +1 -0
- package/dist/services/impact/index.d.mts +11 -0
- package/dist/services/impact/index.d.mts.map +1 -0
- package/dist/services/impact/index.mjs +16 -0
- package/dist/services/impact/index.mjs.map +1 -0
- package/dist/services/impact/types.d.mts +63 -0
- package/dist/services/impact/types.d.mts.map +1 -0
- package/dist/services/implementation/discovery.d.mts +30 -0
- package/dist/services/implementation/discovery.d.mts.map +1 -0
- package/dist/services/implementation/discovery.mjs +144 -0
- package/dist/services/implementation/discovery.mjs.map +1 -0
- package/dist/services/implementation/index.d.mts +6 -0
- package/dist/services/implementation/index.mjs +7 -0
- package/dist/services/implementation/resolver/conventions.d.mts +18 -0
- package/dist/services/implementation/resolver/conventions.d.mts.map +1 -0
- package/dist/services/implementation/resolver/conventions.mjs +59 -0
- package/dist/services/implementation/resolver/conventions.mjs.map +1 -0
- package/dist/services/implementation/resolver/index.d.mts +24 -0
- package/dist/services/implementation/resolver/index.d.mts.map +1 -0
- package/dist/services/implementation/resolver/index.mjs +111 -0
- package/dist/services/implementation/resolver/index.mjs.map +1 -0
- package/dist/services/implementation/resolver/parsers.d.mts +16 -0
- package/dist/services/implementation/resolver/parsers.d.mts.map +1 -0
- package/dist/services/implementation/resolver/parsers.mjs +100 -0
- package/dist/services/implementation/resolver/parsers.mjs.map +1 -0
- package/dist/services/implementation/resolver/status.d.mts +21 -0
- package/dist/services/implementation/resolver/status.d.mts.map +1 -0
- package/dist/services/implementation/resolver/status.mjs +31 -0
- package/dist/services/implementation/resolver/status.mjs.map +1 -0
- package/dist/services/implementation/types.d.mts +89 -0
- package/dist/services/implementation/types.d.mts.map +1 -0
- package/dist/services/index.d.mts +103 -0
- package/dist/services/index.mjs +100 -0
- package/dist/services/integrity-diagram.d.mts +36 -0
- package/dist/services/integrity-diagram.d.mts.map +1 -0
- package/dist/services/integrity-diagram.mjs +275 -0
- package/dist/services/integrity-diagram.mjs.map +1 -0
- package/dist/services/integrity.d.mts +152 -0
- package/dist/services/integrity.d.mts.map +1 -0
- package/dist/services/integrity.mjs +361 -0
- package/dist/services/integrity.mjs.map +1 -0
- package/dist/services/layer-discovery.d.mts +77 -0
- package/dist/services/layer-discovery.d.mts.map +1 -0
- package/dist/services/layer-discovery.mjs +121 -0
- package/dist/services/layer-discovery.mjs.map +1 -0
- package/dist/services/list.d.mts +37 -0
- package/dist/services/list.d.mts.map +1 -0
- package/dist/services/list.mjs +46 -0
- package/dist/services/list.mjs.map +1 -0
- package/dist/services/llm/index.d.mts +28 -0
- package/dist/services/llm/index.d.mts.map +1 -0
- package/dist/services/llm/index.mjs +187 -0
- package/dist/services/llm/index.mjs.map +1 -0
- package/dist/services/llm/verify-static.d.mts +26 -0
- package/dist/services/llm/verify-static.d.mts.map +1 -0
- package/dist/services/llm/verify-static.mjs +82 -0
- package/dist/services/llm/verify-static.mjs.map +1 -0
- package/dist/services/modules/module-resolver.mjs +61 -0
- package/dist/services/modules/module-resolver.mjs.map +1 -0
- package/dist/services/openapi/export-service.d.mts +53 -0
- package/dist/services/openapi/export-service.d.mts.map +1 -0
- package/dist/services/openapi/export-service.mjs +50 -0
- package/dist/services/openapi/export-service.mjs.map +1 -0
- package/dist/services/openapi/import-service.d.mts +17 -0
- package/dist/services/openapi/import-service.d.mts.map +1 -0
- package/dist/services/openapi/import-service.mjs +168 -0
- package/dist/services/openapi/import-service.mjs.map +1 -0
- package/dist/services/openapi/index.d.mts +5 -0
- package/dist/services/openapi/index.mjs +6 -0
- package/dist/services/openapi/sync-service.d.mts +17 -0
- package/dist/services/openapi/sync-service.d.mts.map +1 -0
- package/dist/services/openapi/sync-service.mjs +120 -0
- package/dist/services/openapi/sync-service.mjs.map +1 -0
- package/dist/services/openapi/types.d.mts +162 -0
- package/dist/services/openapi/types.d.mts.map +1 -0
- package/dist/services/openapi/validate-service.d.mts +16 -0
- package/dist/services/openapi/validate-service.d.mts.map +1 -0
- package/dist/services/openapi/validate-service.mjs +130 -0
- package/dist/services/openapi/validate-service.mjs.map +1 -0
- package/dist/services/quickstart/dependencies.d.mts +31 -0
- package/dist/services/quickstart/dependencies.d.mts.map +1 -0
- package/dist/services/quickstart/dependencies.mjs +57 -0
- package/dist/services/quickstart/dependencies.mjs.map +1 -0
- package/dist/services/quickstart/index.mjs +4 -0
- package/dist/services/quickstart/quickstart-service.d.mts +20 -0
- package/dist/services/quickstart/quickstart-service.d.mts.map +1 -0
- package/dist/services/quickstart/quickstart-service.mjs +196 -0
- package/dist/services/quickstart/quickstart-service.mjs.map +1 -0
- package/dist/services/quickstart/types.d.mts +81 -0
- package/dist/services/quickstart/types.d.mts.map +1 -0
- package/dist/services/regenerator.d.mts +18 -0
- package/dist/services/regenerator.d.mts.map +1 -0
- package/dist/services/regenerator.mjs +23 -0
- package/dist/services/regenerator.mjs.map +1 -0
- package/dist/services/registry.d.mts +53 -0
- package/dist/services/registry.d.mts.map +1 -0
- package/dist/services/registry.mjs +74 -0
- package/dist/services/registry.mjs.map +1 -0
- package/dist/services/rulesync.d.mts +17 -0
- package/dist/services/rulesync.d.mts.map +1 -0
- package/dist/services/rulesync.mjs +71 -0
- package/dist/services/rulesync.mjs.map +1 -0
- package/dist/services/setup/config-generators.d.mts +42 -0
- package/dist/services/setup/config-generators.d.mts.map +1 -0
- package/dist/services/setup/config-generators.mjs +252 -0
- package/dist/services/setup/config-generators.mjs.map +1 -0
- package/dist/services/setup/file-merger.d.mts +27 -0
- package/dist/services/setup/file-merger.d.mts.map +1 -0
- package/dist/services/setup/file-merger.mjs +61 -0
- package/dist/services/setup/file-merger.mjs.map +1 -0
- package/dist/services/setup/setup-service.d.mts +12 -0
- package/dist/services/setup/setup-service.d.mts.map +1 -0
- package/dist/services/setup/setup-service.mjs +96 -0
- package/dist/services/setup/setup-service.mjs.map +1 -0
- package/dist/services/setup/targets/agents-md.mjs +47 -0
- package/dist/services/setup/targets/agents-md.mjs.map +1 -0
- package/dist/services/setup/targets/cli-config.mjs +60 -0
- package/dist/services/setup/targets/cli-config.mjs.map +1 -0
- package/dist/services/setup/targets/cursor-rules.mjs +48 -0
- package/dist/services/setup/targets/cursor-rules.mjs.map +1 -0
- package/dist/services/setup/targets/mcp-claude.mjs +60 -0
- package/dist/services/setup/targets/mcp-claude.mjs.map +1 -0
- package/dist/services/setup/targets/mcp-cursor.mjs +59 -0
- package/dist/services/setup/targets/mcp-cursor.mjs.map +1 -0
- package/dist/services/setup/targets/vscode-settings.mjs +63 -0
- package/dist/services/setup/targets/vscode-settings.mjs.map +1 -0
- package/dist/services/setup/types.d.mts +85 -0
- package/dist/services/setup/types.d.mts.map +1 -0
- package/dist/services/setup/types.mjs +27 -0
- package/dist/services/setup/types.mjs.map +1 -0
- package/dist/services/sync.d.mts +42 -0
- package/dist/services/sync.d.mts.map +1 -0
- package/dist/services/sync.mjs +64 -0
- package/dist/services/sync.mjs.map +1 -0
- package/dist/services/test/index.d.mts +2 -0
- package/dist/services/test/index.mjs +4 -0
- package/dist/services/test/test-generator-service.d.mts +24 -0
- package/dist/services/test/test-generator-service.d.mts.map +1 -0
- package/dist/services/test/test-generator-service.mjs +92 -0
- package/dist/services/test/test-generator-service.mjs.map +1 -0
- package/dist/services/test/test-service.d.mts +27 -0
- package/dist/services/test/test-service.d.mts.map +1 -0
- package/dist/services/test/test-service.mjs +94 -0
- package/dist/services/test/test-service.mjs.map +1 -0
- package/dist/services/test-link/index.d.mts +18 -0
- package/dist/services/test-link/index.d.mts.map +1 -0
- package/dist/services/test-link/index.mjs +60 -0
- package/dist/services/test-link/index.mjs.map +1 -0
- package/dist/services/test-link/test-ref-validator.d.mts +2 -0
- package/dist/services/test-link/test-ref-validator.mjs +50 -0
- package/dist/services/test-link/test-ref-validator.mjs.map +1 -0
- package/dist/services/upgrade/index.d.mts +10 -0
- package/dist/services/upgrade/index.d.mts.map +1 -0
- package/dist/services/upgrade/index.mjs +15 -0
- package/dist/services/upgrade/index.mjs.map +1 -0
- package/dist/services/upgrade/types.d.mts +78 -0
- package/dist/services/upgrade/types.d.mts.map +1 -0
- package/dist/services/upgrade/upgrade-service.d.mts +38 -0
- package/dist/services/upgrade/upgrade-service.d.mts.map +1 -0
- package/dist/services/upgrade/upgrade-service.mjs +201 -0
- package/dist/services/upgrade/upgrade-service.mjs.map +1 -0
- package/dist/services/validate/blueprint-validator.d.mts +23 -0
- package/dist/services/validate/blueprint-validator.d.mts.map +1 -0
- package/dist/services/validate/blueprint-validator.mjs +50 -0
- package/dist/services/validate/blueprint-validator.mjs.map +1 -0
- package/dist/services/validate/implementation-agent-validator.d.mts +20 -0
- package/dist/services/validate/implementation-agent-validator.d.mts.map +1 -0
- package/dist/services/validate/implementation-agent-validator.mjs +42 -0
- package/dist/services/validate/implementation-agent-validator.mjs.map +1 -0
- package/dist/services/validate/implementation-validator.d.mts +32 -0
- package/dist/services/validate/implementation-validator.d.mts.map +1 -0
- package/dist/services/validate/implementation-validator.mjs +64 -0
- package/dist/services/validate/implementation-validator.mjs.map +1 -0
- package/dist/services/validate/index.d.mts +5 -0
- package/dist/services/validate/index.mjs +7 -0
- package/dist/services/validate/spec-validator.d.mts +42 -0
- package/dist/services/validate/spec-validator.d.mts.map +1 -0
- package/dist/services/validate/spec-validator.mjs +49 -0
- package/dist/services/validate/spec-validator.mjs.map +1 -0
- package/dist/services/validate/tenant-validator.d.mts +21 -0
- package/dist/services/validate/tenant-validator.d.mts.map +1 -0
- package/dist/services/validate/tenant-validator.mjs +165 -0
- package/dist/services/validate/tenant-validator.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.d.mts +46 -0
- package/dist/services/verification-cache/adapters/filesystem.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.mjs +120 -0
- package/dist/services/verification-cache/adapters/filesystem.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.d.mts +27 -0
- package/dist/services/verification-cache/adapters/in-memory.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.mjs +46 -0
- package/dist/services/verification-cache/adapters/in-memory.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/index.d.mts +3 -0
- package/dist/services/verification-cache/adapters/index.mjs +5 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.mts +49 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/workspace-state.mjs +91 -0
- package/dist/services/verification-cache/adapters/workspace-state.mjs.map +1 -0
- package/dist/services/verification-cache/cache-service.d.mts +70 -0
- package/dist/services/verification-cache/cache-service.d.mts.map +1 -0
- package/dist/services/verification-cache/cache-service.mjs +256 -0
- package/dist/services/verification-cache/cache-service.mjs.map +1 -0
- package/dist/services/verification-cache/index.d.mts +6 -0
- package/dist/services/verification-cache/index.mjs +8 -0
- package/dist/services/verification-cache/types.d.mts +124 -0
- package/dist/services/verification-cache/types.d.mts.map +1 -0
- package/dist/services/verification-cache/types.mjs +16 -0
- package/dist/services/verification-cache/types.mjs.map +1 -0
- package/dist/services/verify/ai-verifier.d.mts +25 -0
- package/dist/services/verify/ai-verifier.d.mts.map +1 -0
- package/dist/services/verify/ai-verifier.mjs +403 -0
- package/dist/services/verify/ai-verifier.mjs.map +1 -0
- package/dist/services/verify/behavior-verifier.d.mts +12 -0
- package/dist/services/verify/behavior-verifier.d.mts.map +1 -0
- package/dist/services/verify/behavior-verifier.mjs +186 -0
- package/dist/services/verify/behavior-verifier.mjs.map +1 -0
- package/dist/services/verify/index.d.mts +5 -0
- package/dist/services/verify/index.mjs +6 -0
- package/dist/services/verify/structure-verifier.d.mts +12 -0
- package/dist/services/verify/structure-verifier.d.mts.map +1 -0
- package/dist/services/verify/structure-verifier.mjs +196 -0
- package/dist/services/verify/structure-verifier.mjs.map +1 -0
- package/dist/services/verify/types.d.mts +137 -0
- package/dist/services/verify/types.d.mts.map +1 -0
- package/dist/services/verify/verify-service.d.mts +60 -0
- package/dist/services/verify/verify-service.d.mts.map +1 -0
- package/dist/services/verify/verify-service.mjs +204 -0
- package/dist/services/verify/verify-service.mjs.map +1 -0
- package/dist/services/versioning/changelog-formatter.d.mts +24 -0
- package/dist/services/versioning/changelog-formatter.d.mts.map +1 -0
- package/dist/services/versioning/changelog-formatter.mjs +155 -0
- package/dist/services/versioning/changelog-formatter.mjs.map +1 -0
- package/dist/services/versioning/conventional-commits.d.mts +95 -0
- package/dist/services/versioning/conventional-commits.d.mts.map +1 -0
- package/dist/services/versioning/conventional-commits.mjs +184 -0
- package/dist/services/versioning/conventional-commits.mjs.map +1 -0
- package/dist/services/versioning/index.d.mts +12 -0
- package/dist/services/versioning/index.d.mts.map +1 -0
- package/dist/services/versioning/index.mjs +28 -0
- package/dist/services/versioning/index.mjs.map +1 -0
- package/dist/services/versioning/types.d.mts +135 -0
- package/dist/services/versioning/types.d.mts.map +1 -0
- package/dist/services/versioning/versioning-service.d.mts +74 -0
- package/dist/services/versioning/versioning-service.d.mts.map +1 -0
- package/dist/services/versioning/versioning-service.mjs +501 -0
- package/dist/services/versioning/versioning-service.mjs.map +1 -0
- package/dist/services/vibe/config.d.mts +12 -0
- package/dist/services/vibe/config.d.mts.map +1 -0
- package/dist/services/vibe/config.mjs +43 -0
- package/dist/services/vibe/config.mjs.map +1 -0
- package/dist/services/vibe/context.d.mts +19 -0
- package/dist/services/vibe/context.d.mts.map +1 -0
- package/dist/services/vibe/context.mjs +92 -0
- package/dist/services/vibe/context.mjs.map +1 -0
- package/dist/services/vibe/definitions.d.mts +8 -0
- package/dist/services/vibe/definitions.d.mts.map +1 -0
- package/dist/services/vibe/definitions.mjs +129 -0
- package/dist/services/vibe/definitions.mjs.map +1 -0
- package/dist/services/vibe/engine.d.mts +44 -0
- package/dist/services/vibe/engine.d.mts.map +1 -0
- package/dist/services/vibe/engine.mjs +147 -0
- package/dist/services/vibe/engine.mjs.map +1 -0
- package/dist/services/vibe/index.d.mts +15 -0
- package/dist/services/vibe/index.d.mts.map +1 -0
- package/dist/services/vibe/index.mjs +26 -0
- package/dist/services/vibe/index.mjs.map +1 -0
- package/dist/services/vibe/loader.d.mts +15 -0
- package/dist/services/vibe/loader.d.mts.map +1 -0
- package/dist/services/vibe/loader.mjs +48 -0
- package/dist/services/vibe/loader.mjs.map +1 -0
- package/dist/services/vibe/pack.d.mts +19 -0
- package/dist/services/vibe/pack.d.mts.map +1 -0
- package/dist/services/vibe/pack.mjs +66 -0
- package/dist/services/vibe/pack.mjs.map +1 -0
- package/dist/services/vibe/types.d.mts +59 -0
- package/dist/services/vibe/types.d.mts.map +1 -0
- package/dist/services/vibe/types.mjs +12 -0
- package/dist/services/vibe/types.mjs.map +1 -0
- package/dist/services/view/index.d.mts +11 -0
- package/dist/services/view/index.d.mts.map +1 -0
- package/dist/services/view/index.mjs +119 -0
- package/dist/services/view/index.mjs.map +1 -0
- package/dist/services/watch.d.mts +25 -0
- package/dist/services/watch.d.mts.map +1 -0
- package/dist/services/watch.mjs +33 -0
- package/dist/services/watch.mjs.map +1 -0
- package/dist/services/workspace-info.d.mts +62 -0
- package/dist/services/workspace-info.d.mts.map +1 -0
- package/dist/services/workspace-info.mjs +103 -0
- package/dist/services/workspace-info.mjs.map +1 -0
- package/dist/templates/app-config.template.d.mts +7 -0
- package/dist/templates/app-config.template.d.mts.map +1 -0
- package/dist/templates/app-config.template.mjs +107 -0
- package/dist/templates/app-config.template.mjs.map +1 -0
- package/dist/templates/data-view.template.d.mts +7 -0
- package/dist/templates/data-view.template.d.mts.map +1 -0
- package/dist/templates/data-view.template.mjs +70 -0
- package/dist/templates/data-view.template.mjs.map +1 -0
- package/dist/templates/event.template.d.mts +11 -0
- package/dist/templates/event.template.d.mts.map +1 -0
- package/dist/templates/event.template.mjs +42 -0
- package/dist/templates/event.template.mjs.map +1 -0
- package/dist/templates/experiment.template.d.mts +7 -0
- package/dist/templates/experiment.template.d.mts.map +1 -0
- package/dist/templates/experiment.template.mjs +89 -0
- package/dist/templates/experiment.template.mjs.map +1 -0
- package/dist/templates/feature.template.d.mts +33 -0
- package/dist/templates/feature.template.d.mts.map +1 -0
- package/dist/templates/feature.template.mjs +52 -0
- package/dist/templates/feature.template.mjs.map +1 -0
- package/dist/templates/fix/skeleton-capability.mjs +49 -0
- package/dist/templates/fix/skeleton-capability.mjs.map +1 -0
- package/dist/templates/fix/skeleton-event.mjs +56 -0
- package/dist/templates/fix/skeleton-event.mjs.map +1 -0
- package/dist/templates/fix/skeleton-operation.mjs +122 -0
- package/dist/templates/fix/skeleton-operation.mjs.map +1 -0
- package/dist/templates/fix/skeleton-presentation.mjs +65 -0
- package/dist/templates/fix/skeleton-presentation.mjs.map +1 -0
- package/dist/templates/fix/utils.mjs +34 -0
- package/dist/templates/fix/utils.mjs.map +1 -0
- package/dist/templates/handler.template.d.mts +16 -0
- package/dist/templates/handler.template.d.mts.map +1 -0
- package/dist/templates/handler.template.mjs +100 -0
- package/dist/templates/handler.template.mjs.map +1 -0
- package/dist/templates/index.d.mts +22 -0
- package/dist/templates/index.d.mts.map +1 -0
- package/dist/templates/index.mjs +39 -0
- package/dist/templates/index.mjs.map +1 -0
- package/dist/templates/integration.template.d.mts +7 -0
- package/dist/templates/integration.template.d.mts.map +1 -0
- package/dist/templates/integration.template.mjs +160 -0
- package/dist/templates/integration.template.mjs.map +1 -0
- package/dist/templates/knowledge.template.d.mts +7 -0
- package/dist/templates/knowledge.template.d.mts.map +1 -0
- package/dist/templates/knowledge.template.mjs +75 -0
- package/dist/templates/knowledge.template.mjs.map +1 -0
- package/dist/templates/migration.template.d.mts +7 -0
- package/dist/templates/migration.template.d.mts.map +1 -0
- package/dist/templates/migration.template.mjs +62 -0
- package/dist/templates/migration.template.mjs.map +1 -0
- package/dist/templates/operation.template.d.mts +11 -0
- package/dist/templates/operation.template.d.mts.map +1 -0
- package/dist/templates/operation.template.mjs +107 -0
- package/dist/templates/operation.template.mjs.map +1 -0
- package/dist/templates/presentation.template.d.mts +11 -0
- package/dist/templates/presentation.template.d.mts.map +1 -0
- package/dist/templates/presentation.template.mjs +80 -0
- package/dist/templates/presentation.template.mjs.map +1 -0
- package/dist/templates/telemetry.template.d.mts +7 -0
- package/dist/templates/telemetry.template.d.mts.map +1 -0
- package/dist/templates/telemetry.template.mjs +91 -0
- package/dist/templates/telemetry.template.mjs.map +1 -0
- package/dist/templates/workflow-runner.template.d.mts +16 -0
- package/dist/templates/workflow-runner.template.d.mts.map +1 -0
- package/dist/templates/workflow-runner.template.mjs +50 -0
- package/dist/templates/workflow-runner.template.mjs.map +1 -0
- package/dist/templates/workflow.template.d.mts +7 -0
- package/dist/templates/workflow.template.d.mts.map +1 -0
- package/dist/templates/workflow.template.mjs +69 -0
- package/dist/templates/workflow.template.mjs.map +1 -0
- package/dist/types/config.d.mts +34 -0
- package/dist/types/config.d.mts.map +1 -0
- package/dist/types.d.mts +324 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/utils/filter.d.mts +16 -0
- package/dist/utils/filter.d.mts.map +1 -0
- package/dist/utils/filter.mjs +22 -0
- package/dist/utils/filter.mjs.map +1 -0
- package/dist/utils/index.d.mts +11 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +20 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/module-loader.d.mts +5 -0
- package/dist/utils/module-loader.d.mts.map +1 -0
- package/dist/utils/module-loader.mjs +41 -0
- package/dist/utils/module-loader.mjs.map +1 -0
- package/dist/utils/validation.d.mts +37 -0
- package/dist/utils/validation.d.mts.map +1 -0
- package/dist/utils/validation.mjs +43 -0
- package/dist/utils/validation.mjs.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.mjs";
|
|
2
|
+
import { LoggerAdapter } from "../ports/logger.mjs";
|
|
3
|
+
import * as _contractspec_module_workspace0 from "@contractspec/module.workspace";
|
|
4
|
+
import { SpecScanResult, WorkspaceConfig } from "@contractspec/module.workspace";
|
|
5
|
+
|
|
6
|
+
//#region src/services/build.d.ts
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build target types.
|
|
10
|
+
*/
|
|
11
|
+
type BuildTarget = 'handler' | 'component' | 'test';
|
|
12
|
+
/**
|
|
13
|
+
* Options for building from a spec.
|
|
14
|
+
*/
|
|
15
|
+
interface BuildSpecOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Which artifacts to generate.
|
|
18
|
+
*/
|
|
19
|
+
targets?: BuildTarget[];
|
|
20
|
+
/**
|
|
21
|
+
* Override output directory.
|
|
22
|
+
*/
|
|
23
|
+
outputDir?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Whether to overwrite existing files.
|
|
26
|
+
*/
|
|
27
|
+
overwrite?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Skip writing files (dry run).
|
|
30
|
+
*/
|
|
31
|
+
dryRun?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result of a single build target.
|
|
35
|
+
*/
|
|
36
|
+
interface BuildTargetResult {
|
|
37
|
+
target: BuildTarget;
|
|
38
|
+
outputPath: string;
|
|
39
|
+
success: boolean;
|
|
40
|
+
skipped?: boolean;
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of building from a spec.
|
|
45
|
+
*/
|
|
46
|
+
interface BuildSpecResult {
|
|
47
|
+
specPath: string;
|
|
48
|
+
specInfo: SpecScanResult;
|
|
49
|
+
results: BuildTargetResult[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build implementation files from a spec.
|
|
53
|
+
*/
|
|
54
|
+
declare function buildSpec(specPath: string, adapters: {
|
|
55
|
+
fs: FsAdapter;
|
|
56
|
+
logger: LoggerAdapter;
|
|
57
|
+
workspace?: typeof _contractspec_module_workspace0;
|
|
58
|
+
}, config: WorkspaceConfig, options?: BuildSpecOptions): Promise<BuildSpecResult>;
|
|
59
|
+
//#endregion
|
|
60
|
+
export { BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, buildSpec };
|
|
61
|
+
//# sourceMappingURL=build.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.mts","names":[],"sources":["../../src/services/build.ts"],"sourcesContent":[],"mappings":";;;;;;;AA+DA;AASA;;AAIY,KAtDA,WAAA,GAsDA,SAAA,GAAA,WAAA,GAAA,MAAA;;;;AAKD,UAtDM,gBAAA,CAsDN;EAAR;;;YAlDS;;;;;;;;;;;;;;;;;UAqBK,iBAAA;UACP;;;;;;;;;UAUO,eAAA;;YAEL;WACD;;;;;iBAMW,SAAA;MAGd;UACI;qBAAa;WAGf,2BACC,mBACR,QAAQ"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate, inferSpecTypeFromFilePath, scanSpecSource } from "@contractspec/module.workspace";
|
|
2
|
+
|
|
3
|
+
//#region src/services/build.ts
|
|
4
|
+
/**
|
|
5
|
+
* Build/scaffold service for generating implementation files from specs.
|
|
6
|
+
*
|
|
7
|
+
* Uses templates from @contractspec/module.workspace to generate
|
|
8
|
+
* handler, component, and test skeletons without requiring AI.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Build implementation files from a spec.
|
|
12
|
+
*/
|
|
13
|
+
async function buildSpec(specPath, adapters, config, options = {}) {
|
|
14
|
+
const { fs, logger, workspace } = adapters;
|
|
15
|
+
const scan = workspace?.scanSpecSource ?? scanSpecSource;
|
|
16
|
+
const inferType = workspace?.inferSpecTypeFromFilePath ?? inferSpecTypeFromFilePath;
|
|
17
|
+
const genHandler = workspace?.generateHandlerTemplate ?? generateHandlerTemplate;
|
|
18
|
+
const genComponent = workspace?.generateComponentTemplate ?? generateComponentTemplate;
|
|
19
|
+
const genTest = workspace?.generateTestTemplate ?? generateTestTemplate;
|
|
20
|
+
const { targets = detectDefaultTargets(specPath, inferType), outputDir = config.outputDir, overwrite = false, dryRun = false } = options;
|
|
21
|
+
const specCode = await fs.readFile(specPath);
|
|
22
|
+
const specInfo = scan(specCode, specPath);
|
|
23
|
+
const specType = inferType(specPath);
|
|
24
|
+
logger.info(`Building from spec: ${specPath}`, { specType });
|
|
25
|
+
const results = [];
|
|
26
|
+
for (const target of targets) try {
|
|
27
|
+
const result = await buildTarget(target, specPath, specCode, specInfo, specType, {
|
|
28
|
+
fs,
|
|
29
|
+
logger
|
|
30
|
+
}, outputDir, overwrite, dryRun, {
|
|
31
|
+
genHandler,
|
|
32
|
+
genComponent,
|
|
33
|
+
genTest
|
|
34
|
+
});
|
|
35
|
+
results.push(result);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
results.push({
|
|
38
|
+
target,
|
|
39
|
+
outputPath: "",
|
|
40
|
+
success: false,
|
|
41
|
+
error: error instanceof Error ? error.message : String(error),
|
|
42
|
+
skipped: false
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
specPath,
|
|
47
|
+
specInfo,
|
|
48
|
+
results
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build a single target from a spec.
|
|
53
|
+
*/
|
|
54
|
+
async function buildTarget(target, specPath, _specCode, specInfo, specType, adapters, outputDir, overwrite, dryRun, generators) {
|
|
55
|
+
const { fs, logger } = adapters;
|
|
56
|
+
const { genHandler, genComponent, genTest } = generators;
|
|
57
|
+
let code;
|
|
58
|
+
let outputPath;
|
|
59
|
+
switch (target) {
|
|
60
|
+
case "handler": {
|
|
61
|
+
if (specType !== "operation") return {
|
|
62
|
+
target,
|
|
63
|
+
outputPath: "",
|
|
64
|
+
success: false,
|
|
65
|
+
skipped: true,
|
|
66
|
+
error: `Handler generation only supported for operation specs (got ${specType})`
|
|
67
|
+
};
|
|
68
|
+
const kind = specInfo.kind === "command" || specInfo.kind === "query" ? specInfo.kind : "command";
|
|
69
|
+
code = genHandler(specInfo.key ?? "unknown", kind);
|
|
70
|
+
outputPath = resolveOutputPath(specPath, outputDir, "handlers", specInfo.key ?? "unknown", ".handler.ts", adapters.fs);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case "component":
|
|
74
|
+
if (specType !== "presentation") return {
|
|
75
|
+
target,
|
|
76
|
+
outputPath: "",
|
|
77
|
+
success: false,
|
|
78
|
+
skipped: true,
|
|
79
|
+
error: `Component generation only supported for presentation specs (got ${specType})`
|
|
80
|
+
};
|
|
81
|
+
code = genComponent(specInfo.key ?? "unknown", specInfo.description ?? "");
|
|
82
|
+
outputPath = resolveOutputPath(specPath, outputDir, "components", specInfo.key ?? "unknown", ".tsx", adapters.fs);
|
|
83
|
+
break;
|
|
84
|
+
case "test": {
|
|
85
|
+
const testType = specType === "operation" ? "handler" : "component";
|
|
86
|
+
code = genTest(specInfo.key ?? "unknown", testType);
|
|
87
|
+
outputPath = resolveOutputPath(specPath, outputDir, "__tests__", specInfo.key ?? "unknown", ".test.ts", adapters.fs);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default: return {
|
|
91
|
+
target,
|
|
92
|
+
outputPath: "",
|
|
93
|
+
success: false,
|
|
94
|
+
error: `Unknown target: ${target}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (await fs.exists(outputPath) && !overwrite) return {
|
|
98
|
+
target,
|
|
99
|
+
outputPath,
|
|
100
|
+
success: false,
|
|
101
|
+
skipped: true,
|
|
102
|
+
error: "File already exists (use overwrite option)"
|
|
103
|
+
};
|
|
104
|
+
if (dryRun) {
|
|
105
|
+
logger.info(`[dry-run] Would write: ${outputPath}`);
|
|
106
|
+
return {
|
|
107
|
+
target,
|
|
108
|
+
outputPath,
|
|
109
|
+
success: true
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const dirPath = fs.dirname(outputPath);
|
|
113
|
+
await fs.mkdir(dirPath);
|
|
114
|
+
await fs.writeFile(outputPath, code);
|
|
115
|
+
logger.info(`Generated: ${outputPath}`);
|
|
116
|
+
return {
|
|
117
|
+
target,
|
|
118
|
+
outputPath,
|
|
119
|
+
success: true
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Detect default targets based on spec type.
|
|
124
|
+
*/
|
|
125
|
+
function detectDefaultTargets(specPath, inferType) {
|
|
126
|
+
switch (inferType(specPath)) {
|
|
127
|
+
case "operation": return ["handler"];
|
|
128
|
+
case "presentation": return ["component"];
|
|
129
|
+
default: return [];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve output path for generated file.
|
|
134
|
+
*/
|
|
135
|
+
function resolveOutputPath(specPath, outputDir, subdir, specName, extension, fs) {
|
|
136
|
+
const sanitizedName = toKebabCase(specName.split(".").pop() ?? "unknown");
|
|
137
|
+
let baseDir;
|
|
138
|
+
if (outputDir.startsWith(".")) baseDir = fs.resolve(fs.dirname(specPath), "..", outputDir, subdir);
|
|
139
|
+
else baseDir = fs.resolve(outputDir, subdir);
|
|
140
|
+
return fs.join(baseDir, `${sanitizedName}${extension}`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Convert string to kebab-case.
|
|
144
|
+
*/
|
|
145
|
+
function toKebabCase(str) {
|
|
146
|
+
return str.replace(/\./g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
export { buildSpec };
|
|
151
|
+
//# sourceMappingURL=build.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.mjs","names":[],"sources":["../../src/services/build.ts"],"sourcesContent":["/**\n * Build/scaffold service for generating implementation files from specs.\n *\n * Uses templates from @contractspec/module.workspace to generate\n * handler, component, and test skeletons without requiring AI.\n */\n\nimport {\n generateComponentTemplate,\n generateHandlerTemplate,\n generateTestTemplate,\n inferSpecTypeFromFilePath,\n scanSpecSource,\n type SpecScanResult,\n type WorkspaceConfig,\n} from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\nimport type { LoggerAdapter } from '../ports/logger';\n\n/**\n * Build target types.\n */\nexport type BuildTarget = 'handler' | 'component' | 'test';\n\n/**\n * Options for building from a spec.\n */\nexport interface BuildSpecOptions {\n /**\n * Which artifacts to generate.\n */\n targets?: BuildTarget[];\n\n /**\n * Override output directory.\n */\n outputDir?: string;\n\n /**\n * Whether to overwrite existing files.\n */\n overwrite?: boolean;\n\n /**\n * Skip writing files (dry run).\n */\n dryRun?: boolean;\n}\n\n/**\n * Result of a single build target.\n */\nexport interface BuildTargetResult {\n target: BuildTarget;\n outputPath: string;\n success: boolean;\n skipped?: boolean;\n error?: string;\n}\n\n/**\n * Result of building from a spec.\n */\nexport interface BuildSpecResult {\n specPath: string;\n specInfo: SpecScanResult;\n results: BuildTargetResult[];\n}\n\n/**\n * Build implementation files from a spec.\n */\nexport async function buildSpec(\n specPath: string,\n adapters: {\n fs: FsAdapter;\n logger: LoggerAdapter;\n workspace?: typeof import('@contractspec/module.workspace');\n },\n config: WorkspaceConfig,\n options: BuildSpecOptions = {}\n): Promise<BuildSpecResult> {\n const { fs, logger, workspace } = adapters;\n\n // Use injected modules or defaults\n const scan = workspace?.scanSpecSource ?? scanSpecSource;\n const inferType =\n workspace?.inferSpecTypeFromFilePath ?? inferSpecTypeFromFilePath;\n const genHandler =\n workspace?.generateHandlerTemplate ?? generateHandlerTemplate;\n const genComponent =\n workspace?.generateComponentTemplate ?? generateComponentTemplate;\n const genTest = workspace?.generateTestTemplate ?? generateTestTemplate;\n\n const {\n targets = detectDefaultTargets(specPath, inferType),\n outputDir = config.outputDir,\n overwrite = false,\n dryRun = false,\n } = options;\n\n // Read and scan spec\n const specCode = await fs.readFile(specPath);\n const specInfo = scan(specCode, specPath);\n const specType = inferType(specPath);\n\n logger.info(`Building from spec: ${specPath}`, { specType });\n\n const results: BuildTargetResult[] = [];\n\n for (const target of targets) {\n try {\n const result = await buildTarget(\n target,\n specPath,\n specCode,\n specInfo,\n specType,\n { fs, logger },\n outputDir,\n overwrite,\n dryRun,\n { genHandler, genComponent, genTest }\n );\n results.push(result);\n } catch (error) {\n results.push({\n target,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n skipped: false, // Default to false unless overridden\n });\n }\n }\n\n return {\n specPath,\n specInfo,\n results,\n };\n}\n\n/**\n * Build a single target from a spec.\n */\nasync function buildTarget(\n target: BuildTarget,\n specPath: string,\n _specCode: string,\n specInfo: SpecScanResult,\n specType: string,\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n outputDir: string,\n overwrite: boolean,\n dryRun: boolean,\n generators: {\n genHandler: typeof generateHandlerTemplate;\n genComponent: typeof generateComponentTemplate;\n genTest: typeof generateTestTemplate;\n }\n): Promise<BuildTargetResult> {\n const { fs, logger } = adapters;\n const { genHandler, genComponent, genTest } = generators;\n\n let code: string;\n let outputPath: string;\n\n switch (target) {\n case 'handler': {\n if (specType !== 'operation') {\n return {\n target,\n outputPath: '',\n success: false,\n skipped: true,\n error: `Handler generation only supported for operation specs (got ${specType})`,\n };\n }\n\n const kind =\n specInfo.kind === 'command' || specInfo.kind === 'query'\n ? specInfo.kind\n : 'command';\n\n code = genHandler(specInfo.key ?? 'unknown', kind);\n outputPath = resolveOutputPath(\n specPath,\n outputDir,\n 'handlers',\n specInfo.key ?? 'unknown',\n '.handler.ts',\n adapters.fs\n );\n break;\n }\n\n case 'component': {\n if (specType !== 'presentation') {\n return {\n target,\n outputPath: '',\n success: false,\n skipped: true,\n error: `Component generation only supported for presentation specs (got ${specType})`,\n };\n }\n\n code = genComponent(\n specInfo.key ?? 'unknown',\n specInfo.description ?? ''\n );\n outputPath = resolveOutputPath(\n specPath,\n outputDir,\n 'components',\n specInfo.key ?? 'unknown',\n '.tsx',\n adapters.fs\n );\n break;\n }\n\n case 'test': {\n const testType = specType === 'operation' ? 'handler' : 'component';\n code = genTest(specInfo.key ?? 'unknown', testType);\n outputPath = resolveOutputPath(\n specPath,\n outputDir,\n '__tests__',\n specInfo.key ?? 'unknown',\n '.test.ts',\n adapters.fs\n );\n break;\n }\n\n default:\n return {\n target,\n outputPath: '',\n success: false,\n error: `Unknown target: ${target}`,\n };\n }\n\n // Check if file exists\n const exists = await fs.exists(outputPath);\n if (exists && !overwrite) {\n return {\n target,\n outputPath,\n success: false,\n skipped: true,\n error: 'File already exists (use overwrite option)',\n };\n }\n\n if (dryRun) {\n logger.info(`[dry-run] Would write: ${outputPath}`);\n return {\n target,\n outputPath,\n success: true,\n };\n }\n\n // Ensure directory exists\n const dirPath = fs.dirname(outputPath);\n await fs.mkdir(dirPath);\n\n // Write file\n await fs.writeFile(outputPath, code);\n logger.info(`Generated: ${outputPath}`);\n\n return {\n target,\n outputPath,\n success: true,\n };\n}\n\n/**\n * Detect default targets based on spec type.\n */\nfunction detectDefaultTargets(\n specPath: string,\n inferType: typeof inferSpecTypeFromFilePath\n): BuildTarget[] {\n const specType = inferType(specPath);\n\n switch (specType) {\n case 'operation':\n return ['handler'];\n case 'presentation':\n return ['component'];\n default:\n return [];\n }\n}\n\n/**\n * Resolve output path for generated file.\n */\nfunction resolveOutputPath(\n specPath: string,\n outputDir: string,\n subdir: string,\n specName: string,\n extension: string,\n fs: FsAdapter\n): string {\n const sanitizedName = toKebabCase(specName.split('.').pop() ?? 'unknown');\n\n let baseDir: string;\n if (outputDir.startsWith('.')) {\n // Relative to spec file location\n baseDir = fs.resolve(fs.dirname(specPath), '..', outputDir, subdir);\n } else {\n // Absolute or relative to cwd\n baseDir = fs.resolve(outputDir, subdir);\n }\n\n return fs.join(baseDir, `${sanitizedName}${extension}`);\n}\n\n/**\n * Convert string to kebab-case.\n */\nfunction toKebabCase(str: string): string {\n return str\n .replace(/\\./g, '-')\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n"],"mappings":";;;;;;;;;;;;AAwEA,eAAsB,UACpB,UACA,UAKA,QACA,UAA4B,EAAE,EACJ;CAC1B,MAAM,EAAE,IAAI,QAAQ,cAAc;CAGlC,MAAM,OAAO,WAAW,kBAAkB;CAC1C,MAAM,YACJ,WAAW,6BAA6B;CAC1C,MAAM,aACJ,WAAW,2BAA2B;CACxC,MAAM,eACJ,WAAW,6BAA6B;CAC1C,MAAM,UAAU,WAAW,wBAAwB;CAEnD,MAAM,EACJ,UAAU,qBAAqB,UAAU,UAAU,EACnD,YAAY,OAAO,WACnB,YAAY,OACZ,SAAS,UACP;CAGJ,MAAM,WAAW,MAAM,GAAG,SAAS,SAAS;CAC5C,MAAM,WAAW,KAAK,UAAU,SAAS;CACzC,MAAM,WAAW,UAAU,SAAS;AAEpC,QAAO,KAAK,uBAAuB,YAAY,EAAE,UAAU,CAAC;CAE5D,MAAM,UAA+B,EAAE;AAEvC,MAAK,MAAM,UAAU,QACnB,KAAI;EACF,MAAM,SAAS,MAAM,YACnB,QACA,UACA,UACA,UACA,UACA;GAAE;GAAI;GAAQ,EACd,WACA,WACA,QACA;GAAE;GAAY;GAAc;GAAS,CACtC;AACD,UAAQ,KAAK,OAAO;UACb,OAAO;AACd,UAAQ,KAAK;GACX;GACA,YAAY;GACZ,SAAS;GACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC7D,SAAS;GACV,CAAC;;AAIN,QAAO;EACL;EACA;EACA;EACD;;;;;AAMH,eAAe,YACb,QACA,UACA,WACA,UACA,UACA,UACA,WACA,WACA,QACA,YAK4B;CAC5B,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,YAAY,cAAc,YAAY;CAE9C,IAAI;CACJ,IAAI;AAEJ,SAAQ,QAAR;EACE,KAAK,WAAW;AACd,OAAI,aAAa,YACf,QAAO;IACL;IACA,YAAY;IACZ,SAAS;IACT,SAAS;IACT,OAAO,8DAA8D,SAAS;IAC/E;GAGH,MAAM,OACJ,SAAS,SAAS,aAAa,SAAS,SAAS,UAC7C,SAAS,OACT;AAEN,UAAO,WAAW,SAAS,OAAO,WAAW,KAAK;AAClD,gBAAa,kBACX,UACA,WACA,YACA,SAAS,OAAO,WAChB,eACA,SAAS,GACV;AACD;;EAGF,KAAK;AACH,OAAI,aAAa,eACf,QAAO;IACL;IACA,YAAY;IACZ,SAAS;IACT,SAAS;IACT,OAAO,mEAAmE,SAAS;IACpF;AAGH,UAAO,aACL,SAAS,OAAO,WAChB,SAAS,eAAe,GACzB;AACD,gBAAa,kBACX,UACA,WACA,cACA,SAAS,OAAO,WAChB,QACA,SAAS,GACV;AACD;EAGF,KAAK,QAAQ;GACX,MAAM,WAAW,aAAa,cAAc,YAAY;AACxD,UAAO,QAAQ,SAAS,OAAO,WAAW,SAAS;AACnD,gBAAa,kBACX,UACA,WACA,aACA,SAAS,OAAO,WAChB,YACA,SAAS,GACV;AACD;;EAGF,QACE,QAAO;GACL;GACA,YAAY;GACZ,SAAS;GACT,OAAO,mBAAmB;GAC3B;;AAKL,KADe,MAAM,GAAG,OAAO,WAAW,IAC5B,CAAC,UACb,QAAO;EACL;EACA;EACA,SAAS;EACT,SAAS;EACT,OAAO;EACR;AAGH,KAAI,QAAQ;AACV,SAAO,KAAK,0BAA0B,aAAa;AACnD,SAAO;GACL;GACA;GACA,SAAS;GACV;;CAIH,MAAM,UAAU,GAAG,QAAQ,WAAW;AACtC,OAAM,GAAG,MAAM,QAAQ;AAGvB,OAAM,GAAG,UAAU,YAAY,KAAK;AACpC,QAAO,KAAK,cAAc,aAAa;AAEvC,QAAO;EACL;EACA;EACA,SAAS;EACV;;;;;AAMH,SAAS,qBACP,UACA,WACe;AAGf,SAFiB,UAAU,SAAS,EAEpC;EACE,KAAK,YACH,QAAO,CAAC,UAAU;EACpB,KAAK,eACH,QAAO,CAAC,YAAY;EACtB,QACE,QAAO,EAAE;;;;;;AAOf,SAAS,kBACP,UACA,WACA,QACA,UACA,WACA,IACQ;CACR,MAAM,gBAAgB,YAAY,SAAS,MAAM,IAAI,CAAC,KAAK,IAAI,UAAU;CAEzE,IAAI;AACJ,KAAI,UAAU,WAAW,IAAI,CAE3B,WAAU,GAAG,QAAQ,GAAG,QAAQ,SAAS,EAAE,MAAM,WAAW,OAAO;KAGnE,WAAU,GAAG,QAAQ,WAAW,OAAO;AAGzC,QAAO,GAAG,KAAK,SAAS,GAAG,gBAAgB,YAAY;;;;;AAMzD,SAAS,YAAY,KAAqB;AACxC,QAAO,IACJ,QAAQ,OAAO,IAAI,CACnB,QAAQ,mBAAmB,QAAQ,CACnC,aAAa"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createParser, detectFormat } from "../../coverage/parsers/index.mjs";
|
|
2
|
+
import { validateCoverage } from "../../coverage/validator.mjs";
|
|
3
|
+
import { scanAllSpecsFromSource } from "@contractspec/module.workspace";
|
|
4
|
+
|
|
5
|
+
//#region src/services/ci-check/checks/coverage.ts
|
|
6
|
+
/**
|
|
7
|
+
* Coverage goal enforcement checks.
|
|
8
|
+
*
|
|
9
|
+
* Validates that TestSpec.coverage requirements are met by actual coverage data.
|
|
10
|
+
* Requires a coverage report file to exist (from a previous test run).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Run coverage goal enforcement checks.
|
|
14
|
+
*/
|
|
15
|
+
async function runCoverageChecks(adapters, specFiles, options) {
|
|
16
|
+
const { fs, logger } = adapters;
|
|
17
|
+
const issues = [];
|
|
18
|
+
const coverageDir = options.workspaceRoot ? `${options.workspaceRoot}/coverage` : "./coverage";
|
|
19
|
+
const possiblePaths = [
|
|
20
|
+
`${coverageDir}/coverage-final.json`,
|
|
21
|
+
`${coverageDir}/coverage.json`,
|
|
22
|
+
`${coverageDir}/coverage-summary.json`
|
|
23
|
+
];
|
|
24
|
+
let coverageContent;
|
|
25
|
+
let coveragePath;
|
|
26
|
+
for (const path of possiblePaths) if (await fs.exists(path)) {
|
|
27
|
+
coverageContent = await fs.readFile(path);
|
|
28
|
+
coveragePath = path;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
if (!coverageContent) {
|
|
32
|
+
logger.info("No coverage report found, skipping coverage checks");
|
|
33
|
+
return issues;
|
|
34
|
+
}
|
|
35
|
+
const coverageReport = createParser(detectFormat(coveragePath ?? "coverage.json")).parse(coverageContent);
|
|
36
|
+
for (const specFile of specFiles) {
|
|
37
|
+
if (!specFile.includes(".test-spec.")) continue;
|
|
38
|
+
const content = await fs.readFile(specFile);
|
|
39
|
+
const scans = scanAllSpecsFromSource(content, specFile);
|
|
40
|
+
for (const scan of scans) {
|
|
41
|
+
if (scan.specType !== "test-spec" || !scan.key || !scan.version) continue;
|
|
42
|
+
const coverageMatch = content.match(/coverage\s*:\s*\{([^}]+)\}/);
|
|
43
|
+
if (!coverageMatch || !coverageMatch[1]) continue;
|
|
44
|
+
const coverageBlock = coverageMatch[1];
|
|
45
|
+
const requirements = {};
|
|
46
|
+
const statementsMatch = coverageBlock.match(/statements\s*:\s*(\d+)/);
|
|
47
|
+
if (statementsMatch && statementsMatch[1]) requirements.statements = parseInt(statementsMatch[1], 10);
|
|
48
|
+
const branchesMatch = coverageBlock.match(/branches\s*:\s*(\d+)/);
|
|
49
|
+
if (branchesMatch && branchesMatch[1]) requirements.branches = parseInt(branchesMatch[1], 10);
|
|
50
|
+
const functionsMatch = coverageBlock.match(/functions\s*:\s*(\d+)/);
|
|
51
|
+
if (functionsMatch && functionsMatch[1]) requirements.functions = parseInt(functionsMatch[1], 10);
|
|
52
|
+
const linesMatch = coverageBlock.match(/lines\s*:\s*(\d+)/);
|
|
53
|
+
if (linesMatch && linesMatch[1]) requirements.lines = parseInt(linesMatch[1], 10);
|
|
54
|
+
if (Object.keys(requirements).length === 0) continue;
|
|
55
|
+
const result = validateCoverage(scan.key, scan.version, requirements, coverageReport.total);
|
|
56
|
+
for (const failure of result.failures) issues.push({
|
|
57
|
+
ruleId: "coverage-below-threshold",
|
|
58
|
+
severity: "error",
|
|
59
|
+
message: failure.message,
|
|
60
|
+
category: "coverage",
|
|
61
|
+
file: specFile,
|
|
62
|
+
context: {
|
|
63
|
+
specKey: scan.key,
|
|
64
|
+
specVersion: scan.version,
|
|
65
|
+
metric: failure.metric,
|
|
66
|
+
required: failure.required,
|
|
67
|
+
actual: failure.actual
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return issues;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { runCoverageChecks };
|
|
77
|
+
//# sourceMappingURL=coverage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/coverage.ts"],"sourcesContent":["/**\n * Coverage goal enforcement checks.\n *\n * Validates that TestSpec.coverage requirements are met by actual coverage data.\n * Requires a coverage report file to exist (from a previous test run).\n */\n\nimport { scanAllSpecsFromSource } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { createParser, detectFormat, validateCoverage } from '../../coverage';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run coverage goal enforcement checks.\n */\nexport async function runCoverageChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n specFiles: string[],\n options: CICheckOptions\n): Promise<CIIssue[]> {\n const { fs, logger } = adapters;\n const issues: CIIssue[] = [];\n\n // Try to find coverage report\n const coverageDir = options.workspaceRoot\n ? `${options.workspaceRoot}/coverage`\n : './coverage';\n\n const possiblePaths = [\n `${coverageDir}/coverage-final.json`,\n `${coverageDir}/coverage.json`,\n `${coverageDir}/coverage-summary.json`,\n ];\n\n let coverageContent: string | undefined;\n let coveragePath: string | undefined;\n\n for (const path of possiblePaths) {\n const exists = await fs.exists(path);\n if (exists) {\n coverageContent = await fs.readFile(path);\n coveragePath = path;\n break;\n }\n }\n\n if (!coverageContent) {\n logger.info('No coverage report found, skipping coverage checks');\n return issues;\n }\n\n // Parse coverage report\n const format = detectFormat(coveragePath ?? 'coverage.json');\n const parser = createParser(format);\n const coverageReport = parser.parse(coverageContent);\n\n // Scan for test specs with coverage requirements\n for (const specFile of specFiles) {\n if (!specFile.includes('.test-spec.')) continue;\n\n const content = await fs.readFile(specFile);\n const scans = scanAllSpecsFromSource(content, specFile);\n\n for (const scan of scans) {\n if (scan.specType !== 'test-spec' || !scan.key || !scan.version) continue;\n\n // Extract coverage requirements (simplified - actual extraction would need more parsing)\n const coverageMatch = content.match(/coverage\\s*:\\s*\\{([^}]+)\\}/);\n if (!coverageMatch || !coverageMatch[1]) continue;\n\n // Parse coverage requirements\n const coverageBlock = coverageMatch[1];\n const requirements: Record<string, number> = {};\n\n const statementsMatch = coverageBlock.match(/statements\\s*:\\s*(\\d+)/);\n if (statementsMatch && statementsMatch[1])\n requirements.statements = parseInt(statementsMatch[1], 10);\n\n const branchesMatch = coverageBlock.match(/branches\\s*:\\s*(\\d+)/);\n if (branchesMatch && branchesMatch[1])\n requirements.branches = parseInt(branchesMatch[1], 10);\n\n const functionsMatch = coverageBlock.match(/functions\\s*:\\s*(\\d+)/);\n if (functionsMatch && functionsMatch[1])\n requirements.functions = parseInt(functionsMatch[1], 10);\n\n const linesMatch = coverageBlock.match(/lines\\s*:\\s*(\\d+)/);\n if (linesMatch && linesMatch[1])\n requirements.lines = parseInt(linesMatch[1], 10);\n\n if (Object.keys(requirements).length === 0) continue;\n\n // Validate coverage against requirements\n const result = validateCoverage(\n scan.key,\n scan.version,\n requirements,\n coverageReport.total\n );\n\n // Report failures as errors\n for (const failure of result.failures) {\n issues.push({\n ruleId: 'coverage-below-threshold',\n severity: 'error',\n message: failure.message,\n category: 'coverage',\n file: specFile,\n context: {\n specKey: scan.key,\n specVersion: scan.version,\n metric: failure.metric,\n required: failure.required,\n actual: failure.actual,\n },\n });\n }\n }\n }\n\n return issues;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,eAAsB,kBACpB,UACA,WACA,SACoB;CACpB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,SAAoB,EAAE;CAG5B,MAAM,cAAc,QAAQ,gBACxB,GAAG,QAAQ,cAAc,aACzB;CAEJ,MAAM,gBAAgB;EACpB,GAAG,YAAY;EACf,GAAG,YAAY;EACf,GAAG,YAAY;EAChB;CAED,IAAI;CACJ,IAAI;AAEJ,MAAK,MAAM,QAAQ,cAEjB,KADe,MAAM,GAAG,OAAO,KAAK,EACxB;AACV,oBAAkB,MAAM,GAAG,SAAS,KAAK;AACzC,iBAAe;AACf;;AAIJ,KAAI,CAAC,iBAAiB;AACpB,SAAO,KAAK,qDAAqD;AACjE,SAAO;;CAMT,MAAM,iBADS,aADA,aAAa,gBAAgB,gBAAgB,CACzB,CACL,MAAM,gBAAgB;AAGpD,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,CAAC,SAAS,SAAS,cAAc,CAAE;EAEvC,MAAM,UAAU,MAAM,GAAG,SAAS,SAAS;EAC3C,MAAM,QAAQ,uBAAuB,SAAS,SAAS;AAEvD,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,KAAK,aAAa,eAAe,CAAC,KAAK,OAAO,CAAC,KAAK,QAAS;GAGjE,MAAM,gBAAgB,QAAQ,MAAM,6BAA6B;AACjE,OAAI,CAAC,iBAAiB,CAAC,cAAc,GAAI;GAGzC,MAAM,gBAAgB,cAAc;GACpC,MAAM,eAAuC,EAAE;GAE/C,MAAM,kBAAkB,cAAc,MAAM,yBAAyB;AACrE,OAAI,mBAAmB,gBAAgB,GACrC,cAAa,aAAa,SAAS,gBAAgB,IAAI,GAAG;GAE5D,MAAM,gBAAgB,cAAc,MAAM,uBAAuB;AACjE,OAAI,iBAAiB,cAAc,GACjC,cAAa,WAAW,SAAS,cAAc,IAAI,GAAG;GAExD,MAAM,iBAAiB,cAAc,MAAM,wBAAwB;AACnE,OAAI,kBAAkB,eAAe,GACnC,cAAa,YAAY,SAAS,eAAe,IAAI,GAAG;GAE1D,MAAM,aAAa,cAAc,MAAM,oBAAoB;AAC3D,OAAI,cAAc,WAAW,GAC3B,cAAa,QAAQ,SAAS,WAAW,IAAI,GAAG;AAElD,OAAI,OAAO,KAAK,aAAa,CAAC,WAAW,EAAG;GAG5C,MAAM,SAAS,iBACb,KAAK,KACL,KAAK,SACL,cACA,eAAe,MAChB;AAGD,QAAK,MAAM,WAAW,OAAO,SAC3B,QAAO,KAAK;IACV,QAAQ;IACR,UAAU;IACV,SAAS,QAAQ;IACjB,UAAU;IACV,MAAM;IACN,SAAS;KACP,SAAS,KAAK;KACd,aAAa,KAAK;KAClB,QAAQ,QAAQ;KAChB,UAAU,QAAQ;KAClB,QAAQ,QAAQ;KACjB;IACF,CAAC;;;AAKR,QAAO"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { analyzeDeps } from "../../deps.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/ci-check/checks/deps.ts
|
|
4
|
+
/**
|
|
5
|
+
* Run dependency analysis checks.
|
|
6
|
+
*/
|
|
7
|
+
async function runDepsChecks(adapters, options) {
|
|
8
|
+
const issues = [];
|
|
9
|
+
const result = await analyzeDeps(adapters, { pattern: options.pattern });
|
|
10
|
+
for (const cycle of result.cycles) issues.push({
|
|
11
|
+
ruleId: "deps-circular",
|
|
12
|
+
severity: "error",
|
|
13
|
+
message: `Circular dependency detected: ${cycle.join(" → ")}`,
|
|
14
|
+
category: "deps",
|
|
15
|
+
context: { cycle }
|
|
16
|
+
});
|
|
17
|
+
for (const item of result.missing) for (const missing of item.missing) issues.push({
|
|
18
|
+
ruleId: "deps-missing",
|
|
19
|
+
severity: "error",
|
|
20
|
+
message: `Missing dependency: ${item.contract} requires ${missing}`,
|
|
21
|
+
category: "deps",
|
|
22
|
+
context: {
|
|
23
|
+
contract: item.contract,
|
|
24
|
+
missing
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return issues;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { runDepsChecks };
|
|
32
|
+
//# sourceMappingURL=deps.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/deps.ts"],"sourcesContent":["/**\n * Dependency analysis checks.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { analyzeDeps } from '../../deps';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run dependency analysis checks.\n */\nexport async 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"],"mappings":";;;;;;AAYA,eAAsB,cACpB,UACA,SACoB;CACpB,MAAM,SAAoB,EAAE;CAE5B,MAAM,SAAS,MAAM,YAAY,UAAU,EACzC,SAAS,QAAQ,SAClB,CAAC;AAGF,MAAK,MAAM,SAAS,OAAO,OACzB,QAAO,KAAK;EACV,QAAQ;EACR,UAAU;EACV,SAAS,iCAAiC,MAAM,KAAK,MAAM;EAC3D,UAAU;EACV,SAAS,EAAE,OAAO;EACnB,CAAC;AAIJ,MAAK,MAAM,QAAQ,OAAO,QACxB,MAAK,MAAM,WAAW,KAAK,QACzB,QAAO,KAAK;EACV,QAAQ;EACR,UAAU;EACV,SAAS,uBAAuB,KAAK,SAAS,YAAY;EAC1D,UAAU;EACV,SAAS;GAAE,UAAU,KAAK;GAAU;GAAS;EAC9C,CAAC;AAIN,QAAO"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { runDoctor } from "../../doctor/doctor-service.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/ci-check/checks/doctor.ts
|
|
4
|
+
/**
|
|
5
|
+
* Run doctor checks (skipping AI in CI).
|
|
6
|
+
*/
|
|
7
|
+
async function runDoctorChecks(adapters, options) {
|
|
8
|
+
const issues = [];
|
|
9
|
+
const result = await runDoctor(adapters, {
|
|
10
|
+
workspaceRoot: options.workspaceRoot ?? process.cwd(),
|
|
11
|
+
skipAi: true,
|
|
12
|
+
categories: [
|
|
13
|
+
"cli",
|
|
14
|
+
"config",
|
|
15
|
+
"deps",
|
|
16
|
+
"workspace"
|
|
17
|
+
]
|
|
18
|
+
});
|
|
19
|
+
for (const check of result.checks) if (check.status === "fail") issues.push({
|
|
20
|
+
ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\s+/g, "-")}`,
|
|
21
|
+
severity: "error",
|
|
22
|
+
message: `${check.name}: ${check.message}`,
|
|
23
|
+
category: "doctor",
|
|
24
|
+
context: { details: check.details }
|
|
25
|
+
});
|
|
26
|
+
else if (check.status === "warn") issues.push({
|
|
27
|
+
ruleId: `doctor-${check.category}-${check.name.toLowerCase().replace(/\s+/g, "-")}`,
|
|
28
|
+
severity: "warning",
|
|
29
|
+
message: `${check.name}: ${check.message}`,
|
|
30
|
+
category: "doctor",
|
|
31
|
+
context: { details: check.details }
|
|
32
|
+
});
|
|
33
|
+
return issues;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { runDoctorChecks };
|
|
38
|
+
//# sourceMappingURL=doctor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/doctor.ts"],"sourcesContent":["/**\n * Doctor checks (skipping AI in CI).\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { runDoctor } from '../../doctor/doctor-service';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run doctor checks (skipping AI in CI).\n */\nexport async 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"],"mappings":";;;;;;AAYA,eAAsB,gBACpB,UACA,SACoB;CACpB,MAAM,SAAoB,EAAE;CAI5B,MAAM,SAAS,MAAM,UAAU,UAAU;EACvC,eAHoB,QAAQ,iBAAiB,QAAQ,KAAK;EAI1D,QAAQ;EACR,YAAY;GAAC;GAAO;GAAU;GAAQ;GAAY;EACnD,CAAC;AAEF,MAAK,MAAM,SAAS,OAAO,OACzB,KAAI,MAAM,WAAW,OACnB,QAAO,KAAK;EACV,QAAQ,UAAU,MAAM,SAAS,GAAG,MAAM,KAAK,aAAa,CAAC,QAAQ,QAAQ,IAAI;EACjF,UAAU;EACV,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM;EACjC,UAAU;EACV,SAAS,EAAE,SAAS,MAAM,SAAS;EACpC,CAAC;UACO,MAAM,WAAW,OAC1B,QAAO,KAAK;EACV,QAAQ,UAAU,MAAM,SAAS,GAAG,MAAM,KAAK,aAAa,CAAC,QAAQ,QAAQ,IAAI;EACjF,UAAU;EACV,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM;EACjC,UAAU;EACV,SAAS,EAAE,SAAS,MAAM,SAAS;EACpC,CAAC;AAIN,QAAO"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { loadWorkspaceConfig } from "../../config.mjs";
|
|
2
|
+
import { detectDrift } from "../../drift.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/ci-check/checks/drift.ts
|
|
5
|
+
/**
|
|
6
|
+
* Run drift detection checks.
|
|
7
|
+
*/
|
|
8
|
+
async function runDriftChecks(adapters, _options) {
|
|
9
|
+
const { fs, logger } = adapters;
|
|
10
|
+
const issues = [];
|
|
11
|
+
const config = await loadWorkspaceConfig(fs);
|
|
12
|
+
if (!config.outputDir) {
|
|
13
|
+
logger.info("No outputDir configured, skipping drift checks");
|
|
14
|
+
return issues;
|
|
15
|
+
}
|
|
16
|
+
const contractsDir = "./contracts";
|
|
17
|
+
const generatedDir = config.outputDir;
|
|
18
|
+
if (!await fs.exists(generatedDir)) {
|
|
19
|
+
logger.info("Generated directory does not exist, skipping drift checks");
|
|
20
|
+
return issues;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const result = await detectDrift(adapters, contractsDir, generatedDir);
|
|
24
|
+
if (result.hasDrift) for (const file of result.files) issues.push({
|
|
25
|
+
ruleId: "drift-detected",
|
|
26
|
+
severity: "error",
|
|
27
|
+
message: `Drift detected: generated file is out of sync with spec: ${file}`,
|
|
28
|
+
category: "drift",
|
|
29
|
+
file: `${generatedDir}/${file}`,
|
|
30
|
+
context: { file }
|
|
31
|
+
});
|
|
32
|
+
} catch (error) {
|
|
33
|
+
logger.warn("Drift detection failed", { error: error instanceof Error ? error.message : String(error) });
|
|
34
|
+
}
|
|
35
|
+
return issues;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { runDriftChecks };
|
|
40
|
+
//# sourceMappingURL=drift.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/drift.ts"],"sourcesContent":["/**\n * Drift detection checks.\n *\n * Detects when generated artifacts are out of sync with specs.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { loadWorkspaceConfig } from '../../config';\nimport { detectDrift } from '../../drift';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run drift detection checks.\n */\nexport async function runDriftChecks(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n _options: CICheckOptions\n): Promise<CIIssue[]> {\n const { fs, logger } = adapters;\n const issues: CIIssue[] = [];\n\n const config = await loadWorkspaceConfig(fs);\n\n // Check if we have the required config\n if (!config.outputDir) {\n logger.info('No outputDir configured, skipping drift checks');\n return issues;\n }\n\n const contractsDir = './contracts';\n const generatedDir = config.outputDir;\n\n // Check if generated dir exists\n if (!(await fs.exists(generatedDir))) {\n logger.info('Generated directory does not exist, skipping drift checks');\n return issues;\n }\n\n try {\n const result = await detectDrift(\n adapters as Parameters<typeof detectDrift>[0],\n contractsDir,\n generatedDir\n );\n\n if (result.hasDrift) {\n for (const file of result.files) {\n issues.push({\n ruleId: 'drift-detected',\n severity: 'error',\n message: `Drift detected: generated file is out of sync with spec: ${file}`,\n category: 'drift',\n file: `${generatedDir}/${file}`,\n context: { file },\n });\n }\n }\n } catch (error) {\n logger.warn('Drift detection failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n return issues;\n}\n"],"mappings":";;;;;;;AAeA,eAAsB,eACpB,UACA,UACoB;CACpB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,SAAoB,EAAE;CAE5B,MAAM,SAAS,MAAM,oBAAoB,GAAG;AAG5C,KAAI,CAAC,OAAO,WAAW;AACrB,SAAO,KAAK,iDAAiD;AAC7D,SAAO;;CAGT,MAAM,eAAe;CACrB,MAAM,eAAe,OAAO;AAG5B,KAAI,CAAE,MAAM,GAAG,OAAO,aAAa,EAAG;AACpC,SAAO,KAAK,4DAA4D;AACxE,SAAO;;AAGT,KAAI;EACF,MAAM,SAAS,MAAM,YACnB,UACA,cACA,aACD;AAED,MAAI,OAAO,SACT,MAAK,MAAM,QAAQ,OAAO,MACxB,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS,4DAA4D;GACrE,UAAU;GACV,MAAM,GAAG,aAAa,GAAG;GACzB,SAAS,EAAE,MAAM;GAClB,CAAC;UAGC,OAAO;AACd,SAAO,KAAK,0BAA0B,EACpC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAC9D,CAAC;;AAGJ,QAAO"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { validateImplementationFiles } from "../../validate/implementation-validator.mjs";
|
|
2
|
+
import { loadWorkspaceConfig } from "../../config.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/ci-check/checks/handlers.ts
|
|
5
|
+
/**
|
|
6
|
+
* Run handler implementation checks.
|
|
7
|
+
*/
|
|
8
|
+
async function runHandlerChecks(adapters, specFiles) {
|
|
9
|
+
const { fs } = adapters;
|
|
10
|
+
const issues = [];
|
|
11
|
+
const config = await loadWorkspaceConfig(fs);
|
|
12
|
+
for (const specFile of specFiles) {
|
|
13
|
+
if (!specFile.includes(".operation.")) continue;
|
|
14
|
+
const result = await validateImplementationFiles(specFile, { fs }, config, {
|
|
15
|
+
checkHandlers: true,
|
|
16
|
+
outputDir: config.outputDir
|
|
17
|
+
});
|
|
18
|
+
for (const error of result.errors) issues.push({
|
|
19
|
+
ruleId: "handler-missing",
|
|
20
|
+
severity: "warning",
|
|
21
|
+
message: error,
|
|
22
|
+
category: "handlers",
|
|
23
|
+
file: specFile
|
|
24
|
+
});
|
|
25
|
+
for (const warning of result.warnings) issues.push({
|
|
26
|
+
ruleId: "handler-warning",
|
|
27
|
+
severity: "warning",
|
|
28
|
+
message: warning,
|
|
29
|
+
category: "handlers",
|
|
30
|
+
file: specFile
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return issues;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { runHandlerChecks };
|
|
38
|
+
//# sourceMappingURL=handlers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/handlers.ts"],"sourcesContent":["/**\n * Handler implementation checks.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { loadWorkspaceConfig } from '../../config';\nimport { validateImplementationFiles } from '../../validate/implementation-validator';\nimport type { CIIssue } from '../types';\n\n/**\n * Run handler implementation checks.\n */\nexport async 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"],"mappings":";;;;;;;AAaA,eAAsB,iBACpB,UACA,WACoB;CACpB,MAAM,EAAE,OAAO;CACf,MAAM,SAAoB,EAAE;CAE5B,MAAM,SAAS,MAAM,oBAAoB,GAAG;AAE5C,MAAK,MAAM,YAAY,WAAW;AAEhC,MAAI,CAAC,SAAS,SAAS,cAAc,CAAE;EAEvC,MAAM,SAAS,MAAM,4BAA4B,UAAU,EAAE,IAAI,EAAE,QAAQ;GACzE,eAAe;GACf,WAAW,OAAO;GACnB,CAAC;AAEF,OAAK,MAAM,SAAS,OAAO,OACzB,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS;GACT,UAAU;GACV,MAAM;GACP,CAAC;AAGJ,OAAK,MAAM,WAAW,OAAO,SAC3B,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS;GACT,UAAU;GACV,MAAM;GACP,CAAC;;AAIN,QAAO"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { loadWorkspaceConfig } from "../../config.mjs";
|
|
2
|
+
import { resolveAllImplementations } from "../../implementation/resolver/index.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/ci-check/checks/implementation.ts
|
|
5
|
+
/**
|
|
6
|
+
* Run implementation verification checks.
|
|
7
|
+
*/
|
|
8
|
+
async function runImplementationChecks(adapters, specFiles, options) {
|
|
9
|
+
const { fs } = adapters;
|
|
10
|
+
const issues = [];
|
|
11
|
+
const config = await loadWorkspaceConfig(fs);
|
|
12
|
+
const implOptions = options.implementation ?? {};
|
|
13
|
+
const results = await resolveAllImplementations(specFiles.filter((f) => f.includes(".operation.")), { fs }, config, { computeHashes: implOptions.useCache ?? true });
|
|
14
|
+
for (const result of results) {
|
|
15
|
+
if (implOptions.requireImplemented && result.status === "missing") issues.push({
|
|
16
|
+
ruleId: "impl-missing",
|
|
17
|
+
severity: "error",
|
|
18
|
+
message: `Spec ${result.specKey} has no implementation`,
|
|
19
|
+
category: "implementation",
|
|
20
|
+
file: result.specPath,
|
|
21
|
+
context: {
|
|
22
|
+
specKey: result.specKey,
|
|
23
|
+
specVersion: result.specVersion,
|
|
24
|
+
status: result.status
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
else if (result.status === "missing") issues.push({
|
|
28
|
+
ruleId: "impl-missing",
|
|
29
|
+
severity: "warning",
|
|
30
|
+
message: `Spec ${result.specKey} has no implementation`,
|
|
31
|
+
category: "implementation",
|
|
32
|
+
file: result.specPath,
|
|
33
|
+
context: {
|
|
34
|
+
specKey: result.specKey,
|
|
35
|
+
specVersion: result.specVersion,
|
|
36
|
+
status: result.status
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
if (!implOptions.allowPartial && result.status === "partial") {
|
|
40
|
+
const missingImpls = result.implementations.filter((i) => !i.exists && i.type !== "test").map((i) => i.path);
|
|
41
|
+
issues.push({
|
|
42
|
+
ruleId: "impl-partial",
|
|
43
|
+
severity: "warning",
|
|
44
|
+
message: `Spec ${result.specKey} has partial implementation: missing ${missingImpls.join(", ")}`,
|
|
45
|
+
category: "implementation",
|
|
46
|
+
file: result.specPath,
|
|
47
|
+
context: {
|
|
48
|
+
specKey: result.specKey,
|
|
49
|
+
specVersion: result.specVersion,
|
|
50
|
+
status: result.status,
|
|
51
|
+
missingFiles: missingImpls
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const missingTests = result.implementations.filter((i) => !i.exists && i.type === "test");
|
|
56
|
+
if (missingTests.length > 0) issues.push({
|
|
57
|
+
ruleId: "impl-missing-tests",
|
|
58
|
+
severity: "note",
|
|
59
|
+
message: `Spec ${result.specKey} missing test files: ${missingTests.map((t) => t.path).join(", ")}`,
|
|
60
|
+
category: "implementation",
|
|
61
|
+
file: result.specPath,
|
|
62
|
+
context: {
|
|
63
|
+
specKey: result.specKey,
|
|
64
|
+
missingTests: missingTests.map((t) => t.path)
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return issues;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { runImplementationChecks };
|
|
73
|
+
//# sourceMappingURL=implementation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/implementation.ts"],"sourcesContent":["/**\n * Implementation verification checks.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { loadWorkspaceConfig } from '../../config';\nimport { resolveAllImplementations } from '../../implementation/resolver';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run implementation verification checks.\n */\nexport async 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"],"mappings":";;;;;;;AAaA,eAAsB,wBACpB,UACA,WACA,SACoB;CACpB,MAAM,EAAE,OAAO;CACf,MAAM,SAAoB,EAAE;CAE5B,MAAM,SAAS,MAAM,oBAAoB,GAAG;CAC5C,MAAM,cAAc,QAAQ,kBAAkB,EAAE;CAMhD,MAAM,UAAU,MAAM,0BAHC,UAAU,QAAQ,MAAM,EAAE,SAAS,cAAc,CAAC,EAKvE,EAAE,IAAI,EACN,QACA,EACE,eAAe,YAAY,YAAY,MACxC,CACF;AAED,MAAK,MAAM,UAAU,SAAS;AAE5B,MAAI,YAAY,sBAAsB,OAAO,WAAW,UACtD,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS,QAAQ,OAAO,QAAQ;GAChC,UAAU;GACV,MAAM,OAAO;GACb,SAAS;IACP,SAAS,OAAO;IAChB,aAAa,OAAO;IACpB,QAAQ,OAAO;IAChB;GACF,CAAC;WACO,OAAO,WAAW,UAC3B,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS,QAAQ,OAAO,QAAQ;GAChC,UAAU;GACV,MAAM,OAAO;GACb,SAAS;IACP,SAAS,OAAO;IAChB,aAAa,OAAO;IACpB,QAAQ,OAAO;IAChB;GACF,CAAC;AAIJ,MAAI,CAAC,YAAY,gBAAgB,OAAO,WAAW,WAAW;GAC5D,MAAM,eAAe,OAAO,gBACzB,QAAQ,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,OAAO,CAC7C,KAAK,MAAM,EAAE,KAAK;AAErB,UAAO,KAAK;IACV,QAAQ;IACR,UAAU;IACV,SAAS,QAAQ,OAAO,QAAQ,uCAAuC,aAAa,KAAK,KAAK;IAC9F,UAAU;IACV,MAAM,OAAO;IACb,SAAS;KACP,SAAS,OAAO;KAChB,aAAa,OAAO;KACpB,QAAQ,OAAO;KACf,cAAc;KACf;IACF,CAAC;;EAIJ,MAAM,eAAe,OAAO,gBAAgB,QACzC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,OAChC;AACD,MAAI,aAAa,SAAS,EACxB,QAAO,KAAK;GACV,QAAQ;GACR,UAAU;GACV,SAAS,QAAQ,OAAO,QAAQ,uBAAuB,aAAa,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK;GACjG,UAAU;GACV,MAAM,OAAO;GACb,SAAS;IACP,SAAS,OAAO;IAChB,cAAc,aAAa,KAAK,MAAM,EAAE,KAAK;IAC9C;GACF,CAAC;;AAIN,QAAO"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { runStructureChecks } from "./structure.mjs";
|
|
2
|
+
import { runIntegrityChecks } from "./integrity.mjs";
|
|
3
|
+
import { runDepsChecks } from "./deps.mjs";
|
|
4
|
+
import { runDoctorChecks } from "./doctor.mjs";
|
|
5
|
+
import { runHandlerChecks } from "./handlers.mjs";
|
|
6
|
+
import { runTestChecks } from "./tests.mjs";
|
|
7
|
+
import { runTestRefsChecks } from "./test-refs.mjs";
|
|
8
|
+
import { runCoverageChecks } from "./coverage.mjs";
|
|
9
|
+
import { runImplementationChecks } from "./implementation.mjs";
|
|
10
|
+
import { runLayerChecks } from "./layers.mjs";
|
|
11
|
+
import { runDriftChecks } from "./drift.mjs";
|
|
12
|
+
|
|
13
|
+
export { };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { analyzeIntegrity } from "../../integrity.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/ci-check/checks/integrity.ts
|
|
4
|
+
/**
|
|
5
|
+
* Run integrity analysis checks.
|
|
6
|
+
*/
|
|
7
|
+
async function runIntegrityChecks(adapters, options) {
|
|
8
|
+
const issues = [];
|
|
9
|
+
const result = await analyzeIntegrity(adapters, {
|
|
10
|
+
pattern: options.pattern,
|
|
11
|
+
all: true
|
|
12
|
+
});
|
|
13
|
+
for (const issue of result.issues) issues.push({
|
|
14
|
+
ruleId: `integrity-${issue.type}`,
|
|
15
|
+
severity: issue.severity === "error" ? "error" : "warning",
|
|
16
|
+
message: issue.message,
|
|
17
|
+
category: "integrity",
|
|
18
|
+
file: issue.file,
|
|
19
|
+
context: {
|
|
20
|
+
specKey: issue.specKey,
|
|
21
|
+
specType: issue.specType,
|
|
22
|
+
featureKey: issue.featureKey,
|
|
23
|
+
ref: issue.ref
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return issues;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { runIntegrityChecks };
|
|
31
|
+
//# sourceMappingURL=integrity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.mjs","names":[],"sources":["../../../../src/services/ci-check/checks/integrity.ts"],"sourcesContent":["/**\n * Integrity analysis checks.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { analyzeIntegrity } from '../../integrity';\nimport type { CICheckOptions, CIIssue } from '../types';\n\n/**\n * Run integrity analysis checks.\n */\nexport async 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"],"mappings":";;;;;;AAYA,eAAsB,mBACpB,UACA,SACoB;CACpB,MAAM,SAAoB,EAAE;CAE5B,MAAM,SAAS,MAAM,iBAAiB,UAAU;EAC9C,SAAS,QAAQ;EACjB,KAAK;EACN,CAAC;AAEF,MAAK,MAAM,SAAS,OAAO,OACzB,QAAO,KAAK;EACV,QAAQ,aAAa,MAAM;EAC3B,UAAU,MAAM,aAAa,UAAU,UAAU;EACjD,SAAS,MAAM;EACf,UAAU;EACV,MAAM,MAAM;EACZ,SAAS;GACP,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,YAAY,MAAM;GAClB,KAAK,MAAM;GACZ;EACF,CAAC;AAGJ,QAAO"}
|