@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,76 @@
|
|
|
1
|
+
//#region src/services/ci-check/utils.ts
|
|
2
|
+
/**
|
|
3
|
+
* Create a category summary from issues.
|
|
4
|
+
*/
|
|
5
|
+
function createCategorySummary(category, issues, durationMs) {
|
|
6
|
+
const categoryLabels = {
|
|
7
|
+
structure: "Spec Structure Validation",
|
|
8
|
+
integrity: "Contract Integrity Analysis",
|
|
9
|
+
deps: "Dependency Analysis",
|
|
10
|
+
doctor: "Installation Health",
|
|
11
|
+
handlers: "Handler Implementation",
|
|
12
|
+
tests: "Test Coverage",
|
|
13
|
+
"test-refs": "Test Reference Validation",
|
|
14
|
+
coverage: "Coverage Verification",
|
|
15
|
+
implementation: "Implementation Verification",
|
|
16
|
+
layers: "Contract Layers Validation",
|
|
17
|
+
drift: "Drift Detection"
|
|
18
|
+
};
|
|
19
|
+
const errors = issues.filter((i) => i.severity === "error").length;
|
|
20
|
+
const warnings = issues.filter((i) => i.severity === "warning").length;
|
|
21
|
+
const notes = issues.filter((i) => i.severity === "note").length;
|
|
22
|
+
return {
|
|
23
|
+
category,
|
|
24
|
+
label: categoryLabels[category],
|
|
25
|
+
errors,
|
|
26
|
+
warnings,
|
|
27
|
+
notes,
|
|
28
|
+
passed: errors === 0,
|
|
29
|
+
durationMs
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get git information if available.
|
|
34
|
+
*/
|
|
35
|
+
async function getGitInfo(fs) {
|
|
36
|
+
try {
|
|
37
|
+
const gitHeadPath = ".git/HEAD";
|
|
38
|
+
if (!await fs.exists(gitHeadPath)) return {};
|
|
39
|
+
const headContent = await fs.readFile(gitHeadPath);
|
|
40
|
+
const refMatch = headContent.match(/^ref: (.+)$/m);
|
|
41
|
+
if (refMatch) {
|
|
42
|
+
const branch = refMatch[1]?.replace("refs/heads/", "");
|
|
43
|
+
const refPath = `.git/${refMatch[1]}`;
|
|
44
|
+
if (await fs.exists(refPath)) return {
|
|
45
|
+
commitSha: (await fs.readFile(refPath)).trim(),
|
|
46
|
+
branch
|
|
47
|
+
};
|
|
48
|
+
return { branch };
|
|
49
|
+
}
|
|
50
|
+
return { commitSha: headContent.trim() };
|
|
51
|
+
} catch {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Determine which checks to run based on options.
|
|
57
|
+
*/
|
|
58
|
+
function getChecksToRun(options) {
|
|
59
|
+
const allCategories = [
|
|
60
|
+
"structure",
|
|
61
|
+
"integrity",
|
|
62
|
+
"deps",
|
|
63
|
+
"doctor"
|
|
64
|
+
];
|
|
65
|
+
if (options.checkHandlers) allCategories.push("handlers");
|
|
66
|
+
if (options.checkTests) allCategories.push("tests");
|
|
67
|
+
if (options.implementation) allCategories.push("implementation");
|
|
68
|
+
if (options.checkDrift) allCategories.push("drift");
|
|
69
|
+
if (options.checks && options.checks.length > 0) return options.checks;
|
|
70
|
+
if (options.skip && options.skip.length > 0) return allCategories.filter((c) => !options.skip?.includes(c));
|
|
71
|
+
return allCategories;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { createCategorySummary, getChecksToRun, getGitInfo };
|
|
76
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/services/ci-check/utils.ts"],"sourcesContent":["/**\n * CI check utilities.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { CICheckCategory, CICheckCategorySummary, CIIssue } from './types';\n\n/**\n * Create a category summary from issues.\n */\nexport function 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 'test-refs': 'Test Reference Validation',\n coverage: 'Coverage Verification',\n implementation: 'Implementation Verification',\n layers: 'Contract Layers Validation',\n drift: 'Drift Detection',\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 */\nexport async 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\n/**\n * Determine which checks to run based on options.\n */\nexport function getChecksToRun(options: {\n checkHandlers?: boolean;\n checkTests?: boolean;\n implementation?: unknown;\n checkDrift?: boolean;\n checks?: CICheckCategory[];\n skip?: CICheckCategory[];\n}): 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 if (options.checkDrift) {\n allCategories.push('drift');\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"],"mappings":";;;;AAUA,SAAgB,sBACd,UACA,QACA,YACwB;CACxB,MAAM,iBAAkD;EACtD,WAAW;EACX,WAAW;EACX,MAAM;EACN,QAAQ;EACR,UAAU;EACV,OAAO;EACP,aAAa;EACb,UAAU;EACV,gBAAgB;EAChB,QAAQ;EACR,OAAO;EACR;CAED,MAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,aAAa,QAAQ,CAAC;CAC5D,MAAM,WAAW,OAAO,QAAQ,MAAM,EAAE,aAAa,UAAU,CAAC;CAChE,MAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE,aAAa,OAAO,CAAC;AAE1D,QAAO;EACL;EACA,OAAO,eAAe;EACtB;EACA;EACA;EACA,QAAQ,WAAW;EACnB;EACD;;;;;AAMH,eAAsB,WACpB,IACkD;AAClD,KAAI;EAEF,MAAM,cAAc;AACpB,MAAI,CAAE,MAAM,GAAG,OAAO,YAAY,CAChC,QAAO,EAAE;EAGX,MAAM,cAAc,MAAM,GAAG,SAAS,YAAY;EAClD,MAAM,WAAW,YAAY,MAAM,eAAe;AAElD,MAAI,UAAU;GACZ,MAAM,SAAS,SAAS,IAAI,QAAQ,eAAe,GAAG;GACtD,MAAM,UAAU,QAAQ,SAAS;AAEjC,OAAI,MAAM,GAAG,OAAO,QAAQ,CAE1B,QAAO;IAAE,YADU,MAAM,GAAG,SAAS,QAAQ,EAAE,MAAM;IACjC;IAAQ;AAG9B,UAAO,EAAE,QAAQ;;AAKnB,SAAO,EAAE,WADS,YAAY,MAAM,EAChB;SACd;AACN,SAAO,EAAE;;;;;;AAOb,SAAgB,eAAe,SAOT;CACpB,MAAM,gBAAmC;EACvC;EACA;EACA;EACA;EACD;AAGD,KAAI,QAAQ,cACV,eAAc,KAAK,WAAW;AAEhC,KAAI,QAAQ,WACV,eAAc,KAAK,QAAQ;AAE7B,KAAI,QAAQ,eACV,eAAc,KAAK,iBAAiB;AAEtC,KAAI,QAAQ,WACV,eAAc,KAAK,QAAQ;AAI7B,KAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,EAC5C,QAAO,QAAQ;AAIjB,KAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,EACxC,QAAO,cAAc,QAAQ,MAAM,CAAC,QAAQ,MAAM,SAAS,EAAE,CAAC;AAGhE,QAAO"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.mjs";
|
|
2
|
+
import { LoggerAdapter } from "../ports/logger.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/clean.d.ts
|
|
5
|
+
|
|
6
|
+
interface CleanOptions {
|
|
7
|
+
/**
|
|
8
|
+
* When true, only remove known build artifact directories and known generated
|
|
9
|
+
* suffixes (safe-by-default).
|
|
10
|
+
*/
|
|
11
|
+
generatedOnly?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Skip deletions; just report.
|
|
14
|
+
*/
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Only delete files older than this many days.
|
|
18
|
+
*/
|
|
19
|
+
olderThanDays?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Output directory used for generated artifacts (handlers/components/forms).
|
|
22
|
+
*/
|
|
23
|
+
outputDir?: string;
|
|
24
|
+
}
|
|
25
|
+
interface CleanResult {
|
|
26
|
+
removed: {
|
|
27
|
+
path: string;
|
|
28
|
+
size: number;
|
|
29
|
+
}[];
|
|
30
|
+
skipped: {
|
|
31
|
+
path: string;
|
|
32
|
+
reason: string;
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
declare function cleanArtifacts(adapters: {
|
|
36
|
+
fs: FsAdapter;
|
|
37
|
+
logger: LoggerAdapter;
|
|
38
|
+
}, options?: CleanOptions): Promise<CleanResult>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { CleanOptions, CleanResult, cleanArtifacts };
|
|
41
|
+
//# sourceMappingURL=clean.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.d.mts","names":[],"sources":["../../src/services/clean.ts"],"sourcesContent":[],"mappings":";;;;;AAmCkB,UA1BD,YAAA,CA0BC;EAAmB;;;;EAE3B,aAAA,CAAA,EAAA,OAAA;;;;;;;;;;;;;;UARO,WAAA;;;;;;;;;;iBAKK,cAAA;MACJ;UAAmB;aAC1B,eACR,QAAQ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/services/clean.ts
|
|
2
|
+
async function cleanArtifacts(adapters, options = {}) {
|
|
3
|
+
const { fs, logger } = adapters;
|
|
4
|
+
const outputDir = (options.outputDir ?? "./src").replace(/\\/g, "/");
|
|
5
|
+
const basePatterns = [
|
|
6
|
+
"generated/**",
|
|
7
|
+
"dist/**",
|
|
8
|
+
".turbo/**"
|
|
9
|
+
];
|
|
10
|
+
const outputDirPatterns = [
|
|
11
|
+
`${outputDir}/handlers/**/*.handler.ts`,
|
|
12
|
+
`${outputDir}/handlers/**/*.handler.test.ts`,
|
|
13
|
+
`${outputDir}/components/**/*.tsx`,
|
|
14
|
+
`${outputDir}/components/**/*.test.tsx`,
|
|
15
|
+
`${outputDir}/forms/**/*.form.tsx`,
|
|
16
|
+
`${outputDir}/forms/**/*.form.test.tsx`,
|
|
17
|
+
`${outputDir}/**/*.runner.ts`,
|
|
18
|
+
`${outputDir}/**/*.renderer.tsx`
|
|
19
|
+
];
|
|
20
|
+
const patterns = options.generatedOnly ? [...basePatterns, ...outputDirPatterns] : [
|
|
21
|
+
...basePatterns,
|
|
22
|
+
"**/*.generated.ts",
|
|
23
|
+
"**/*.generated.js",
|
|
24
|
+
"**/*.generated.d.ts",
|
|
25
|
+
...outputDirPatterns
|
|
26
|
+
];
|
|
27
|
+
const candidates = await fs.glob({
|
|
28
|
+
patterns,
|
|
29
|
+
ignore: ["node_modules/**"]
|
|
30
|
+
});
|
|
31
|
+
const removed = [];
|
|
32
|
+
const skipped = [];
|
|
33
|
+
for (const p of candidates) try {
|
|
34
|
+
const st = await fs.stat(p);
|
|
35
|
+
const ageDays = (Date.now() - st.mtime.getTime()) / (1e3 * 60 * 60 * 24);
|
|
36
|
+
if (typeof options.olderThanDays === "number" && ageDays < options.olderThanDays) {
|
|
37
|
+
skipped.push({
|
|
38
|
+
path: p,
|
|
39
|
+
reason: `younger_than_${options.olderThanDays}_days`
|
|
40
|
+
});
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (options.dryRun) logger.info("[dry-run] clean would remove", {
|
|
44
|
+
path: p,
|
|
45
|
+
size: st.size
|
|
46
|
+
});
|
|
47
|
+
else {
|
|
48
|
+
await fs.remove(p);
|
|
49
|
+
logger.info("clean.removed", {
|
|
50
|
+
path: p,
|
|
51
|
+
size: st.size
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
removed.push({
|
|
55
|
+
path: p,
|
|
56
|
+
size: st.size
|
|
57
|
+
});
|
|
58
|
+
} catch (error) {
|
|
59
|
+
skipped.push({
|
|
60
|
+
path: p,
|
|
61
|
+
reason: error instanceof Error ? error.message : String(error)
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
removed,
|
|
66
|
+
skipped
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { cleanArtifacts };
|
|
72
|
+
//# sourceMappingURL=clean.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.mjs","names":[],"sources":["../../src/services/clean.ts"],"sourcesContent":["/**\n * Clean service.\n *\n * Safe-by-default cleanup of generated artifacts.\n */\n\nimport type { FsAdapter } from '../ports/fs';\nimport type { LoggerAdapter } from '../ports/logger';\n\nexport interface CleanOptions {\n /**\n * When true, only remove known build artifact directories and known generated\n * suffixes (safe-by-default).\n */\n generatedOnly?: boolean;\n /**\n * Skip deletions; just report.\n */\n dryRun?: boolean;\n /**\n * Only delete files older than this many days.\n */\n olderThanDays?: number;\n /**\n * Output directory used for generated artifacts (handlers/components/forms).\n */\n outputDir?: string;\n}\n\nexport interface CleanResult {\n removed: { path: string; size: number }[];\n skipped: { path: string; reason: string }[];\n}\n\nexport async function cleanArtifacts(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CleanOptions = {}\n): Promise<CleanResult> {\n const { fs, logger } = adapters;\n const outputDir = (options.outputDir ?? './src').replace(/\\\\/g, '/');\n\n const basePatterns = ['generated/**', 'dist/**', '.turbo/**'];\n\n const outputDirPatterns = [\n `${outputDir}/handlers/**/*.handler.ts`,\n `${outputDir}/handlers/**/*.handler.test.ts`,\n `${outputDir}/components/**/*.tsx`,\n `${outputDir}/components/**/*.test.tsx`,\n `${outputDir}/forms/**/*.form.tsx`,\n `${outputDir}/forms/**/*.form.test.tsx`,\n `${outputDir}/**/*.runner.ts`,\n `${outputDir}/**/*.renderer.tsx`,\n ];\n\n const patterns = options.generatedOnly\n ? [...basePatterns, ...outputDirPatterns]\n : [\n ...basePatterns,\n '**/*.generated.ts',\n '**/*.generated.js',\n '**/*.generated.d.ts',\n ...outputDirPatterns,\n ];\n\n const candidates = await fs.glob({\n patterns,\n ignore: ['node_modules/**'],\n });\n\n const removed: { path: string; size: number }[] = [];\n const skipped: { path: string; reason: string }[] = [];\n\n for (const p of candidates) {\n try {\n const st = await fs.stat(p);\n const ageDays = (Date.now() - st.mtime.getTime()) / (1000 * 60 * 60 * 24);\n if (\n typeof options.olderThanDays === 'number' &&\n ageDays < options.olderThanDays\n ) {\n skipped.push({\n path: p,\n reason: `younger_than_${options.olderThanDays}_days`,\n });\n continue;\n }\n\n if (options.dryRun) {\n logger.info('[dry-run] clean would remove', { path: p, size: st.size });\n } else {\n await fs.remove(p);\n logger.info('clean.removed', { path: p, size: st.size });\n }\n removed.push({ path: p, size: st.size });\n } catch (error) {\n skipped.push({\n path: p,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { removed, skipped };\n}\n"],"mappings":";AAkCA,eAAsB,eACpB,UACA,UAAwB,EAAE,EACJ;CACtB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,aAAa,QAAQ,aAAa,SAAS,QAAQ,OAAO,IAAI;CAEpE,MAAM,eAAe;EAAC;EAAgB;EAAW;EAAY;CAE7D,MAAM,oBAAoB;EACxB,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACd;CAED,MAAM,WAAW,QAAQ,gBACrB,CAAC,GAAG,cAAc,GAAG,kBAAkB,GACvC;EACE,GAAG;EACH;EACA;EACA;EACA,GAAG;EACJ;CAEL,MAAM,aAAa,MAAM,GAAG,KAAK;EAC/B;EACA,QAAQ,CAAC,kBAAkB;EAC5B,CAAC;CAEF,MAAM,UAA4C,EAAE;CACpD,MAAM,UAA8C,EAAE;AAEtD,MAAK,MAAM,KAAK,WACd,KAAI;EACF,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE;EAC3B,MAAM,WAAW,KAAK,KAAK,GAAG,GAAG,MAAM,SAAS,KAAK,MAAO,KAAK,KAAK;AACtE,MACE,OAAO,QAAQ,kBAAkB,YACjC,UAAU,QAAQ,eAClB;AACA,WAAQ,KAAK;IACX,MAAM;IACN,QAAQ,gBAAgB,QAAQ,cAAc;IAC/C,CAAC;AACF;;AAGF,MAAI,QAAQ,OACV,QAAO,KAAK,gCAAgC;GAAE,MAAM;GAAG,MAAM,GAAG;GAAM,CAAC;OAClE;AACL,SAAM,GAAG,OAAO,EAAE;AAClB,UAAO,KAAK,iBAAiB;IAAE,MAAM;IAAG,MAAM,GAAG;IAAM,CAAC;;AAE1D,UAAQ,KAAK;GAAE,MAAM;GAAG,MAAM,GAAG;GAAM,CAAC;UACjC,OAAO;AACd,UAAQ,KAAK;GACX,MAAM;GACN,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC/D,CAAC;;AAIN,QAAO;EAAE;EAAS;EAAS"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.mjs";
|
|
2
|
+
import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
3
|
+
|
|
4
|
+
//#region src/services/config.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Load workspace configuration from .contractsrc.json.
|
|
8
|
+
*/
|
|
9
|
+
declare function loadWorkspaceConfig(fs: FsAdapter, cwd?: string): Promise<WorkspaceConfig>;
|
|
10
|
+
/**
|
|
11
|
+
* Get API key for the configured provider.
|
|
12
|
+
*/
|
|
13
|
+
declare function getApiKey(provider: WorkspaceConfig['aiProvider']): string | undefined;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { getApiKey, loadWorkspaceConfig };
|
|
16
|
+
//# sourceMappingURL=config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.mts","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAoCU,iBAHY,mBAAA,CAGZ,EAAA,EAFJ,SAEI,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAP,OAAO,CAAC,eAAD,CAAA;AAoBV;;;iBAAgB,SAAA,WACJ"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { DEFAULT_WORKSPACE_CONFIG } from "@contractspec/module.workspace";
|
|
2
|
+
import * as z$1 from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/services/config.ts
|
|
5
|
+
/**
|
|
6
|
+
* Workspace configuration service.
|
|
7
|
+
*/
|
|
8
|
+
const ConfigSchema = z$1.object({
|
|
9
|
+
aiProvider: z$1.enum([
|
|
10
|
+
"claude",
|
|
11
|
+
"openai",
|
|
12
|
+
"ollama",
|
|
13
|
+
"custom"
|
|
14
|
+
]).default("claude"),
|
|
15
|
+
aiModel: z$1.string().optional(),
|
|
16
|
+
agentMode: z$1.enum([
|
|
17
|
+
"simple",
|
|
18
|
+
"cursor",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"openai-codex"
|
|
21
|
+
]).default("simple"),
|
|
22
|
+
customEndpoint: z$1.url().nullable().optional(),
|
|
23
|
+
customApiKey: z$1.string().nullable().optional(),
|
|
24
|
+
outputDir: z$1.string().default("./src"),
|
|
25
|
+
conventions: z$1.object({
|
|
26
|
+
operations: z$1.string().default("interactions/commands|queries"),
|
|
27
|
+
events: z$1.string().default("events"),
|
|
28
|
+
presentations: z$1.string().default("presentations"),
|
|
29
|
+
forms: z$1.string().default("forms")
|
|
30
|
+
}),
|
|
31
|
+
defaultOwners: z$1.array(z$1.string()).default([]),
|
|
32
|
+
defaultTags: z$1.array(z$1.string()).default([])
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Load workspace configuration from .contractsrc.json.
|
|
36
|
+
*/
|
|
37
|
+
async function loadWorkspaceConfig(fs, cwd) {
|
|
38
|
+
const configPath = fs.join(cwd ?? ".", ".contractsrc.json");
|
|
39
|
+
if (!await fs.exists(configPath)) return DEFAULT_WORKSPACE_CONFIG;
|
|
40
|
+
try {
|
|
41
|
+
const content = await fs.readFile(configPath);
|
|
42
|
+
const parsed = JSON.parse(content);
|
|
43
|
+
return ConfigSchema.parse(parsed);
|
|
44
|
+
} catch {
|
|
45
|
+
return DEFAULT_WORKSPACE_CONFIG;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get API key for the configured provider.
|
|
50
|
+
*/
|
|
51
|
+
function getApiKey(provider) {
|
|
52
|
+
switch (provider) {
|
|
53
|
+
case "claude": return process.env["ANTHROPIC_API_KEY"];
|
|
54
|
+
case "openai": return process.env["OPENAI_API_KEY"];
|
|
55
|
+
case "custom": return process.env["CONTRACTSPEC_LLM_API_KEY"];
|
|
56
|
+
case "ollama": return;
|
|
57
|
+
default: return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { getApiKey, loadWorkspaceConfig };
|
|
63
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":["z"],"sources":["../../src/services/config.ts"],"sourcesContent":["/**\n * Workspace configuration service.\n */\n\nimport * as z from 'zod';\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { DEFAULT_WORKSPACE_CONFIG } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\n\nconst ConfigSchema = z.object({\n aiProvider: z\n .enum(['claude', 'openai', 'ollama', 'custom'])\n .default('claude'),\n aiModel: z.string().optional(),\n agentMode: z\n .enum(['simple', 'cursor', 'claude-code', 'openai-codex'])\n .default('simple'),\n customEndpoint: z.url().nullable().optional(),\n customApiKey: z.string().nullable().optional(),\n outputDir: z.string().default('./src'),\n conventions: z.object({\n operations: z.string().default('interactions/commands|queries'),\n events: z.string().default('events'),\n presentations: z.string().default('presentations'),\n forms: z.string().default('forms'),\n }),\n defaultOwners: z.array(z.string()).default([]),\n defaultTags: z.array(z.string()).default([]),\n});\n\n/**\n * Load workspace configuration from .contractsrc.json.\n */\nexport async function loadWorkspaceConfig(\n fs: FsAdapter,\n cwd?: string\n): Promise<WorkspaceConfig> {\n const configPath = fs.join(cwd ?? '.', '.contractsrc.json');\n\n const exists = await fs.exists(configPath);\n if (!exists) {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n\n try {\n const content = await fs.readFile(configPath);\n const parsed = JSON.parse(content);\n return ConfigSchema.parse(parsed) as WorkspaceConfig;\n } catch {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n}\n\n/**\n * Get API key for the configured provider.\n */\nexport function getApiKey(\n provider: WorkspaceConfig['aiProvider']\n): string | undefined {\n switch (provider) {\n case 'claude':\n return process.env['ANTHROPIC_API_KEY'];\n case 'openai':\n return process.env['OPENAI_API_KEY'];\n case 'custom':\n return process.env['CONTRACTSPEC_LLM_API_KEY'];\n case 'ollama':\n return undefined; // Ollama doesn't need API key for local\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;;;;AASA,MAAM,eAAeA,IAAE,OAAO;CAC5B,YAAYA,IACT,KAAK;EAAC;EAAU;EAAU;EAAU;EAAS,CAAC,CAC9C,QAAQ,SAAS;CACpB,SAASA,IAAE,QAAQ,CAAC,UAAU;CAC9B,WAAWA,IACR,KAAK;EAAC;EAAU;EAAU;EAAe;EAAe,CAAC,CACzD,QAAQ,SAAS;CACpB,gBAAgBA,IAAE,KAAK,CAAC,UAAU,CAAC,UAAU;CAC7C,cAAcA,IAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC9C,WAAWA,IAAE,QAAQ,CAAC,QAAQ,QAAQ;CACtC,aAAaA,IAAE,OAAO;EACpB,YAAYA,IAAE,QAAQ,CAAC,QAAQ,gCAAgC;EAC/D,QAAQA,IAAE,QAAQ,CAAC,QAAQ,SAAS;EACpC,eAAeA,IAAE,QAAQ,CAAC,QAAQ,gBAAgB;EAClD,OAAOA,IAAE,QAAQ,CAAC,QAAQ,QAAQ;EACnC,CAAC;CACF,eAAeA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9C,aAAaA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC7C,CAAC;;;;AAKF,eAAsB,oBACpB,IACA,KAC0B;CAC1B,MAAM,aAAa,GAAG,KAAK,OAAO,KAAK,oBAAoB;AAG3D,KAAI,CADW,MAAM,GAAG,OAAO,WAAW,CAExC,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,WAAW;EAC7C,MAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,SAAO,aAAa,MAAM,OAAO;SAC3B;AACN,SAAO;;;;;;AAOX,SAAgB,UACd,UACoB;AACpB,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH;EACF,QACE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { parseIstanbulCoverage } from "./istanbul-parser.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/coverage/parsers/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Create a parser for the specified format.
|
|
6
|
+
*
|
|
7
|
+
* @param format - The coverage report format
|
|
8
|
+
* @returns A parser for the format
|
|
9
|
+
*/
|
|
10
|
+
function createParser(format) {
|
|
11
|
+
switch (format) {
|
|
12
|
+
case "istanbul": return { parse: parseIstanbulCoverage };
|
|
13
|
+
case "lcov": throw new Error("LCOV format not yet supported");
|
|
14
|
+
case "cobertura": throw new Error("Cobertura format not yet supported");
|
|
15
|
+
default: throw new Error(`Unknown coverage format: ${format}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect the coverage format from a file path or content.
|
|
20
|
+
*
|
|
21
|
+
* @param path - The file path
|
|
22
|
+
* @param content - Optional file content
|
|
23
|
+
* @returns The detected format
|
|
24
|
+
*/
|
|
25
|
+
function detectFormat(path, content) {
|
|
26
|
+
if (path.endsWith(".json") || path.includes("coverage-final.json")) return "istanbul";
|
|
27
|
+
if (path.endsWith(".lcov") || path.includes("lcov.info")) return "lcov";
|
|
28
|
+
if (path.endsWith(".xml") && content?.includes("cobertura")) return "cobertura";
|
|
29
|
+
return "istanbul";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createParser, detectFormat };
|
|
34
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/coverage/parsers/index.ts"],"sourcesContent":["/**\n * Coverage report parsers.\n *\n * Parses coverage reports from various test runners into a unified format.\n */\n\nimport type { CoverageReport } from '../types';\nimport { parseIstanbulCoverage } from './istanbul-parser';\n\n/**\n * Supported coverage report formats.\n */\nexport type CoverageFormat = 'istanbul' | 'lcov' | 'cobertura';\n\n/**\n * Parser interface for coverage reports.\n */\nexport interface CoverageParser {\n /**\n * Parse a coverage report file or directory.\n *\n * @param content - The file content or directory path\n * @returns Parsed coverage report\n */\n parse(content: string): CoverageReport;\n}\n\n/**\n * Create a parser for the specified format.\n *\n * @param format - The coverage report format\n * @returns A parser for the format\n */\nexport function createParser(format: CoverageFormat): CoverageParser {\n switch (format) {\n case 'istanbul':\n return { parse: parseIstanbulCoverage };\n case 'lcov':\n // LCOV support can be added later\n throw new Error('LCOV format not yet supported');\n case 'cobertura':\n // Cobertura support can be added later\n throw new Error('Cobertura format not yet supported');\n default:\n throw new Error(`Unknown coverage format: ${format}`);\n }\n}\n\n/**\n * Detect the coverage format from a file path or content.\n *\n * @param path - The file path\n * @param content - Optional file content\n * @returns The detected format\n */\nexport function detectFormat(path: string, content?: string): CoverageFormat {\n // Check file extension first\n if (path.endsWith('.json') || path.includes('coverage-final.json')) {\n return 'istanbul';\n }\n if (path.endsWith('.lcov') || path.includes('lcov.info')) {\n return 'lcov';\n }\n if (path.endsWith('.xml') && content?.includes('cobertura')) {\n return 'cobertura';\n }\n\n // Default to Istanbul JSON\n return 'istanbul';\n}\n\nexport { parseIstanbulCoverage } from './istanbul-parser';\n"],"mappings":";;;;;;;;;AAiCA,SAAgB,aAAa,QAAwC;AACnE,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,EAAE,OAAO,uBAAuB;EACzC,KAAK,OAEH,OAAM,IAAI,MAAM,gCAAgC;EAClD,KAAK,YAEH,OAAM,IAAI,MAAM,qCAAqC;EACvD,QACE,OAAM,IAAI,MAAM,4BAA4B,SAAS;;;;;;;;;;AAW3D,SAAgB,aAAa,MAAc,SAAkC;AAE3E,KAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,SAAS,sBAAsB,CAChE,QAAO;AAET,KAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,SAAS,YAAY,CACtD,QAAO;AAET,KAAI,KAAK,SAAS,OAAO,IAAI,SAAS,SAAS,YAAY,CACzD,QAAO;AAIT,QAAO"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
//#region src/services/coverage/parsers/istanbul-parser.ts
|
|
2
|
+
function calculatePct(covered, total) {
|
|
3
|
+
if (total === 0) return 100;
|
|
4
|
+
return Math.round(covered / total * 100 * 100) / 100;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parse Istanbul JSON coverage report.
|
|
8
|
+
*
|
|
9
|
+
* @param content - The JSON content as a string
|
|
10
|
+
* @returns Parsed coverage report
|
|
11
|
+
*/
|
|
12
|
+
function parseIstanbulCoverage(content) {
|
|
13
|
+
const data = JSON.parse(content);
|
|
14
|
+
const files = /* @__PURE__ */ new Map();
|
|
15
|
+
let totalStatements = 0;
|
|
16
|
+
let coveredStatements = 0;
|
|
17
|
+
let totalBranches = 0;
|
|
18
|
+
let coveredBranches = 0;
|
|
19
|
+
let totalFunctions = 0;
|
|
20
|
+
let coveredFunctions = 0;
|
|
21
|
+
let totalLines = 0;
|
|
22
|
+
let coveredLines = 0;
|
|
23
|
+
for (const [filePath, fileCoverage] of Object.entries(data)) {
|
|
24
|
+
const parsed = parseFileCoverage(filePath, fileCoverage);
|
|
25
|
+
files.set(filePath, parsed);
|
|
26
|
+
totalStatements += parsed.statements.total;
|
|
27
|
+
coveredStatements += parsed.statements.covered;
|
|
28
|
+
totalBranches += parsed.branches.total;
|
|
29
|
+
coveredBranches += parsed.branches.covered;
|
|
30
|
+
totalFunctions += parsed.functions.total;
|
|
31
|
+
coveredFunctions += parsed.functions.covered;
|
|
32
|
+
totalLines += parsed.lines.total;
|
|
33
|
+
coveredLines += parsed.lines.covered;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
files,
|
|
37
|
+
total: {
|
|
38
|
+
statements: {
|
|
39
|
+
covered: coveredStatements,
|
|
40
|
+
total: totalStatements,
|
|
41
|
+
pct: calculatePct(coveredStatements, totalStatements)
|
|
42
|
+
},
|
|
43
|
+
branches: {
|
|
44
|
+
covered: coveredBranches,
|
|
45
|
+
total: totalBranches,
|
|
46
|
+
pct: calculatePct(coveredBranches, totalBranches)
|
|
47
|
+
},
|
|
48
|
+
functions: {
|
|
49
|
+
covered: coveredFunctions,
|
|
50
|
+
total: totalFunctions,
|
|
51
|
+
pct: calculatePct(coveredFunctions, totalFunctions)
|
|
52
|
+
},
|
|
53
|
+
lines: {
|
|
54
|
+
covered: coveredLines,
|
|
55
|
+
total: totalLines,
|
|
56
|
+
pct: calculatePct(coveredLines, totalLines)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse coverage data for a single file.
|
|
63
|
+
*/
|
|
64
|
+
function parseFileCoverage(path, coverage) {
|
|
65
|
+
const statementTotal = Object.keys(coverage.statementMap).length;
|
|
66
|
+
const statementCovered = Object.values(coverage.s).filter((c) => c > 0).length;
|
|
67
|
+
const functionTotal = Object.keys(coverage.fnMap).length;
|
|
68
|
+
const functionCovered = Object.values(coverage.f).filter((c) => c > 0).length;
|
|
69
|
+
let branchTotal = 0;
|
|
70
|
+
let branchCovered = 0;
|
|
71
|
+
for (const branch of Object.values(coverage.b)) {
|
|
72
|
+
branchTotal += branch.length;
|
|
73
|
+
branchCovered += branch.filter((c) => c > 0).length;
|
|
74
|
+
}
|
|
75
|
+
const lineSet = /* @__PURE__ */ new Set();
|
|
76
|
+
const coveredLineSet = /* @__PURE__ */ new Set();
|
|
77
|
+
for (const [id, location] of Object.entries(coverage.statementMap)) for (let line = location.start.line; line <= location.end.line; line++) {
|
|
78
|
+
lineSet.add(line);
|
|
79
|
+
if ((coverage.s[id] ?? 0) > 0) coveredLineSet.add(line);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
path,
|
|
83
|
+
statements: {
|
|
84
|
+
covered: statementCovered,
|
|
85
|
+
total: statementTotal,
|
|
86
|
+
pct: calculatePct(statementCovered, statementTotal)
|
|
87
|
+
},
|
|
88
|
+
branches: {
|
|
89
|
+
covered: branchCovered,
|
|
90
|
+
total: branchTotal,
|
|
91
|
+
pct: calculatePct(branchCovered, branchTotal)
|
|
92
|
+
},
|
|
93
|
+
functions: {
|
|
94
|
+
covered: functionCovered,
|
|
95
|
+
total: functionTotal,
|
|
96
|
+
pct: calculatePct(functionCovered, functionTotal)
|
|
97
|
+
},
|
|
98
|
+
lines: {
|
|
99
|
+
covered: coveredLineSet.size,
|
|
100
|
+
total: lineSet.size,
|
|
101
|
+
pct: calculatePct(coveredLineSet.size, lineSet.size)
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { parseIstanbulCoverage };
|
|
108
|
+
//# sourceMappingURL=istanbul-parser.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"istanbul-parser.mjs","names":[],"sources":["../../../../src/services/coverage/parsers/istanbul-parser.ts"],"sourcesContent":["/**\n * Istanbul JSON coverage report parser.\n *\n * Parses the standard Istanbul JSON format used by:\n * - Vitest (with coverage.reporter = ['json'])\n * - Bun (with --coverage)\n * - Jest (with collectCoverage and json reporter)\n * - NYC (directly)\n */\n\nimport type { CoverageReport, FileCoverage, CoverageData } from '../types';\n\nfunction calculatePct(covered: number, total: number): number {\n if (total === 0) return 100;\n return Math.round((covered / total) * 100 * 100) / 100;\n}\n\n/**\n * Istanbul JSON coverage format.\n */\ntype IstanbulCoverage = Record<string, IstanbulFileCoverage>;\n\ninterface IstanbulFileCoverage {\n path: string;\n statementMap: Record<string, IstanbulLocation>;\n fnMap: Record<string, IstanbulFunction>;\n branchMap: Record<string, IstanbulBranch>;\n s: Record<string, number>; // statement execution counts\n f: Record<string, number>; // function execution counts\n b: Record<string, number[]>; // branch execution counts\n}\n\ninterface IstanbulLocation {\n start: { line: number; column: number };\n end: { line: number; column: number };\n}\n\ninterface IstanbulFunction {\n name: string;\n decl: IstanbulLocation;\n loc: IstanbulLocation;\n line: number;\n}\n\ninterface IstanbulBranch {\n type: string;\n loc: IstanbulLocation;\n locations: IstanbulLocation[];\n line: number;\n}\n\n/**\n * Parse Istanbul JSON coverage report.\n *\n * @param content - The JSON content as a string\n * @returns Parsed coverage report\n */\nexport function parseIstanbulCoverage(content: string): CoverageReport {\n const data: IstanbulCoverage = JSON.parse(content);\n const files = new Map<string, FileCoverage>();\n\n // Aggregate totals\n let totalStatements = 0;\n let coveredStatements = 0;\n let totalBranches = 0;\n let coveredBranches = 0;\n let totalFunctions = 0;\n let coveredFunctions = 0;\n let totalLines = 0;\n let coveredLines = 0;\n\n for (const [filePath, fileCoverage] of Object.entries(data)) {\n const parsed = parseFileCoverage(filePath, fileCoverage);\n files.set(filePath, parsed);\n\n // Accumulate totals\n totalStatements += parsed.statements.total;\n coveredStatements += parsed.statements.covered;\n totalBranches += parsed.branches.total;\n coveredBranches += parsed.branches.covered;\n totalFunctions += parsed.functions.total;\n coveredFunctions += parsed.functions.covered;\n totalLines += parsed.lines.total;\n coveredLines += parsed.lines.covered;\n }\n\n const total: CoverageData = {\n statements: {\n covered: coveredStatements,\n total: totalStatements,\n pct: calculatePct(coveredStatements, totalStatements),\n },\n branches: {\n covered: coveredBranches,\n total: totalBranches,\n pct: calculatePct(coveredBranches, totalBranches),\n },\n functions: {\n covered: coveredFunctions,\n total: totalFunctions,\n pct: calculatePct(coveredFunctions, totalFunctions),\n },\n lines: {\n covered: coveredLines,\n total: totalLines,\n pct: calculatePct(coveredLines, totalLines),\n },\n };\n\n return { files, total };\n}\n\n/**\n * Parse coverage data for a single file.\n */\nfunction parseFileCoverage(\n path: string,\n coverage: IstanbulFileCoverage\n): FileCoverage {\n // Count statements\n const statementTotal = Object.keys(coverage.statementMap).length;\n const statementCovered = Object.values(coverage.s).filter(\n (c) => c > 0\n ).length;\n\n // Count functions\n const functionTotal = Object.keys(coverage.fnMap).length;\n const functionCovered = Object.values(coverage.f).filter((c) => c > 0).length;\n\n // Count branches (each branch can have multiple paths)\n let branchTotal = 0;\n let branchCovered = 0;\n for (const branch of Object.values(coverage.b)) {\n branchTotal += branch.length;\n branchCovered += branch.filter((c) => c > 0).length;\n }\n\n // Calculate line coverage from statement map\n const lineSet = new Set<number>();\n const coveredLineSet = new Set<number>();\n\n for (const [id, location] of Object.entries(coverage.statementMap)) {\n for (let line = location.start.line; line <= location.end.line; line++) {\n lineSet.add(line);\n if ((coverage.s[id] ?? 0) > 0) {\n coveredLineSet.add(line);\n }\n }\n }\n\n return {\n path,\n statements: {\n covered: statementCovered,\n total: statementTotal,\n pct: calculatePct(statementCovered, statementTotal),\n },\n branches: {\n covered: branchCovered,\n total: branchTotal,\n pct: calculatePct(branchCovered, branchTotal),\n },\n functions: {\n covered: functionCovered,\n total: functionTotal,\n pct: calculatePct(functionCovered, functionTotal),\n },\n lines: {\n covered: coveredLineSet.size,\n total: lineSet.size,\n pct: calculatePct(coveredLineSet.size, lineSet.size),\n },\n };\n}\n"],"mappings":";AAYA,SAAS,aAAa,SAAiB,OAAuB;AAC5D,KAAI,UAAU,EAAG,QAAO;AACxB,QAAO,KAAK,MAAO,UAAU,QAAS,MAAM,IAAI,GAAG;;;;;;;;AA2CrD,SAAgB,sBAAsB,SAAiC;CACrE,MAAM,OAAyB,KAAK,MAAM,QAAQ;CAClD,MAAM,wBAAQ,IAAI,KAA2B;CAG7C,IAAI,kBAAkB;CACtB,IAAI,oBAAoB;CACxB,IAAI,gBAAgB;CACpB,IAAI,kBAAkB;CACtB,IAAI,iBAAiB;CACrB,IAAI,mBAAmB;CACvB,IAAI,aAAa;CACjB,IAAI,eAAe;AAEnB,MAAK,MAAM,CAAC,UAAU,iBAAiB,OAAO,QAAQ,KAAK,EAAE;EAC3D,MAAM,SAAS,kBAAkB,UAAU,aAAa;AACxD,QAAM,IAAI,UAAU,OAAO;AAG3B,qBAAmB,OAAO,WAAW;AACrC,uBAAqB,OAAO,WAAW;AACvC,mBAAiB,OAAO,SAAS;AACjC,qBAAmB,OAAO,SAAS;AACnC,oBAAkB,OAAO,UAAU;AACnC,sBAAoB,OAAO,UAAU;AACrC,gBAAc,OAAO,MAAM;AAC3B,kBAAgB,OAAO,MAAM;;AA0B/B,QAAO;EAAE;EAAO,OAvBY;GAC1B,YAAY;IACV,SAAS;IACT,OAAO;IACP,KAAK,aAAa,mBAAmB,gBAAgB;IACtD;GACD,UAAU;IACR,SAAS;IACT,OAAO;IACP,KAAK,aAAa,iBAAiB,cAAc;IAClD;GACD,WAAW;IACT,SAAS;IACT,OAAO;IACP,KAAK,aAAa,kBAAkB,eAAe;IACpD;GACD,OAAO;IACL,SAAS;IACT,OAAO;IACP,KAAK,aAAa,cAAc,WAAW;IAC5C;GACF;EAEsB;;;;;AAMzB,SAAS,kBACP,MACA,UACc;CAEd,MAAM,iBAAiB,OAAO,KAAK,SAAS,aAAa,CAAC;CAC1D,MAAM,mBAAmB,OAAO,OAAO,SAAS,EAAE,CAAC,QAChD,MAAM,IAAI,EACZ,CAAC;CAGF,MAAM,gBAAgB,OAAO,KAAK,SAAS,MAAM,CAAC;CAClD,MAAM,kBAAkB,OAAO,OAAO,SAAS,EAAE,CAAC,QAAQ,MAAM,IAAI,EAAE,CAAC;CAGvE,IAAI,cAAc;CAClB,IAAI,gBAAgB;AACpB,MAAK,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,EAAE;AAC9C,iBAAe,OAAO;AACtB,mBAAiB,OAAO,QAAQ,MAAM,IAAI,EAAE,CAAC;;CAI/C,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,iCAAiB,IAAI,KAAa;AAExC,MAAK,MAAM,CAAC,IAAI,aAAa,OAAO,QAAQ,SAAS,aAAa,CAChE,MAAK,IAAI,OAAO,SAAS,MAAM,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ;AACtE,UAAQ,IAAI,KAAK;AACjB,OAAK,SAAS,EAAE,OAAO,KAAK,EAC1B,gBAAe,IAAI,KAAK;;AAK9B,QAAO;EACL;EACA,YAAY;GACV,SAAS;GACT,OAAO;GACP,KAAK,aAAa,kBAAkB,eAAe;GACpD;EACD,UAAU;GACR,SAAS;GACT,OAAO;GACP,KAAK,aAAa,eAAe,YAAY;GAC9C;EACD,WAAW;GACT,SAAS;GACT,OAAO;GACP,KAAK,aAAa,iBAAiB,cAAc;GAClD;EACD,OAAO;GACL,SAAS,eAAe;GACxB,OAAO,QAAQ;GACf,KAAK,aAAa,eAAe,MAAM,QAAQ,KAAK;GACrD;EACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//#region src/services/coverage/validator.ts
|
|
2
|
+
/**
|
|
3
|
+
* Validate coverage data against requirements.
|
|
4
|
+
*
|
|
5
|
+
* @param specKey - The spec key being validated
|
|
6
|
+
* @param specVersion - The spec version
|
|
7
|
+
* @param requirement - The coverage requirements from TestSpec
|
|
8
|
+
* @param actual - The actual coverage data
|
|
9
|
+
* @returns Validation result with pass/fail and details
|
|
10
|
+
*/
|
|
11
|
+
function validateCoverage(specKey, specVersion, requirement, actual) {
|
|
12
|
+
const failures = [];
|
|
13
|
+
if (requirement.statements !== void 0 && actual.statements.pct < requirement.statements) failures.push({
|
|
14
|
+
metric: "statements",
|
|
15
|
+
required: requirement.statements,
|
|
16
|
+
actual: actual.statements.pct,
|
|
17
|
+
message: `Statement coverage ${actual.statements.pct}% is below required ${requirement.statements}%`
|
|
18
|
+
});
|
|
19
|
+
if (requirement.branches !== void 0 && actual.branches.pct < requirement.branches) failures.push({
|
|
20
|
+
metric: "branches",
|
|
21
|
+
required: requirement.branches,
|
|
22
|
+
actual: actual.branches.pct,
|
|
23
|
+
message: `Branch coverage ${actual.branches.pct}% is below required ${requirement.branches}%`
|
|
24
|
+
});
|
|
25
|
+
if (requirement.functions !== void 0 && actual.functions.pct < requirement.functions) failures.push({
|
|
26
|
+
metric: "functions",
|
|
27
|
+
required: requirement.functions,
|
|
28
|
+
actual: actual.functions.pct,
|
|
29
|
+
message: `Function coverage ${actual.functions.pct}% is below required ${requirement.functions}%`
|
|
30
|
+
});
|
|
31
|
+
if (requirement.lines !== void 0 && actual.lines.pct < requirement.lines) failures.push({
|
|
32
|
+
metric: "lines",
|
|
33
|
+
required: requirement.lines,
|
|
34
|
+
actual: actual.lines.pct,
|
|
35
|
+
message: `Line coverage ${actual.lines.pct}% is below required ${requirement.lines}%`
|
|
36
|
+
});
|
|
37
|
+
if (requirement.mutations !== void 0) failures.push({
|
|
38
|
+
metric: "mutations",
|
|
39
|
+
required: requirement.mutations,
|
|
40
|
+
actual: 0,
|
|
41
|
+
message: `Mutation coverage required (${requirement.mutations}%) but mutation testing is not yet supported`
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
specKey,
|
|
45
|
+
specVersion,
|
|
46
|
+
requirement,
|
|
47
|
+
actual,
|
|
48
|
+
passed: failures.length === 0,
|
|
49
|
+
failures
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { validateCoverage };
|
|
55
|
+
//# sourceMappingURL=validator.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.mjs","names":[],"sources":["../../../src/services/coverage/validator.ts"],"sourcesContent":["/**\n * Coverage validator.\n *\n * Validates actual coverage data against TestSpec.coverage requirements.\n */\n\nimport type { CoverageRequirement } from '@contractspec/lib.contracts';\nimport type {\n CoverageData,\n CoverageValidationResult,\n CoverageFailure,\n CoverageValidationSummary,\n} from './types';\n\n/**\n * Validate coverage data against requirements.\n *\n * @param specKey - The spec key being validated\n * @param specVersion - The spec version\n * @param requirement - The coverage requirements from TestSpec\n * @param actual - The actual coverage data\n * @returns Validation result with pass/fail and details\n */\nexport function validateCoverage(\n specKey: string,\n specVersion: string,\n requirement: CoverageRequirement,\n actual: CoverageData\n): CoverageValidationResult {\n const failures: CoverageFailure[] = [];\n\n // Check statements requirement\n if (\n requirement.statements !== undefined &&\n actual.statements.pct < requirement.statements\n ) {\n failures.push({\n metric: 'statements',\n required: requirement.statements,\n actual: actual.statements.pct,\n message: `Statement coverage ${actual.statements.pct}% is below required ${requirement.statements}%`,\n });\n }\n\n // Check branches requirement\n if (\n requirement.branches !== undefined &&\n actual.branches.pct < requirement.branches\n ) {\n failures.push({\n metric: 'branches',\n required: requirement.branches,\n actual: actual.branches.pct,\n message: `Branch coverage ${actual.branches.pct}% is below required ${requirement.branches}%`,\n });\n }\n\n // Check functions requirement\n if (\n requirement.functions !== undefined &&\n actual.functions.pct < requirement.functions\n ) {\n failures.push({\n metric: 'functions',\n required: requirement.functions,\n actual: actual.functions.pct,\n message: `Function coverage ${actual.functions.pct}% is below required ${requirement.functions}%`,\n });\n }\n\n // Check lines requirement\n if (requirement.lines !== undefined && actual.lines.pct < requirement.lines) {\n failures.push({\n metric: 'lines',\n required: requirement.lines,\n actual: actual.lines.pct,\n message: `Line coverage ${actual.lines.pct}% is below required ${requirement.lines}%`,\n });\n }\n\n // Note: Mutation coverage would require integration with a mutation testing tool\n // like Stryker. For now, we skip this check.\n if (requirement.mutations !== undefined) {\n // Mutation testing not yet supported\n failures.push({\n metric: 'mutations',\n required: requirement.mutations,\n actual: 0,\n message: `Mutation coverage required (${requirement.mutations}%) but mutation testing is not yet supported`,\n });\n }\n\n return {\n specKey,\n specVersion,\n requirement,\n actual,\n passed: failures.length === 0,\n failures,\n };\n}\n\n/**\n * Validate coverage for multiple specs and create a summary.\n *\n * @param validations - Array of specs with requirements and coverage\n * @returns Summary of all validations\n */\nexport function validateAllCoverage(\n validations: {\n specKey: string;\n specVersion: string;\n requirement: CoverageRequirement;\n actual: CoverageData;\n }[]\n): CoverageValidationSummary {\n const results: CoverageValidationResult[] = [];\n\n for (const v of validations) {\n results.push(\n validateCoverage(v.specKey, v.specVersion, v.requirement, v.actual)\n );\n }\n\n const passedSpecs = results.filter((r) => r.passed).length;\n const failedSpecs = results.filter((r) => !r.passed).length;\n\n return {\n totalSpecs: results.length,\n passedSpecs,\n failedSpecs,\n results,\n allPassed: failedSpecs === 0,\n };\n}\n\n/**\n * Format coverage validation result as a human-readable string.\n */\nexport function formatCoverageResult(result: CoverageValidationResult): string {\n const lines: string[] = [];\n\n lines.push(\n `${result.specKey}.v${result.specVersion}: ${result.passed ? 'PASS' : 'FAIL'}`\n );\n\n if (!result.passed) {\n for (const failure of result.failures) {\n lines.push(` - ${failure.message}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format coverage validation summary as a human-readable string.\n */\nexport function formatCoverageSummary(\n summary: CoverageValidationSummary\n): string {\n const lines: string[] = [];\n\n lines.push('Coverage Validation Summary');\n lines.push('===========================');\n lines.push(`Total specs: ${summary.totalSpecs}`);\n lines.push(`Passed: ${summary.passedSpecs}`);\n lines.push(`Failed: ${summary.failedSpecs}`);\n lines.push('');\n\n for (const result of summary.results) {\n lines.push(formatCoverageResult(result));\n }\n\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;;;;;AAuBA,SAAgB,iBACd,SACA,aACA,aACA,QAC0B;CAC1B,MAAM,WAA8B,EAAE;AAGtC,KACE,YAAY,eAAe,UAC3B,OAAO,WAAW,MAAM,YAAY,WAEpC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,WAAW;EAC1B,SAAS,sBAAsB,OAAO,WAAW,IAAI,sBAAsB,YAAY,WAAW;EACnG,CAAC;AAIJ,KACE,YAAY,aAAa,UACzB,OAAO,SAAS,MAAM,YAAY,SAElC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,SAAS;EACxB,SAAS,mBAAmB,OAAO,SAAS,IAAI,sBAAsB,YAAY,SAAS;EAC5F,CAAC;AAIJ,KACE,YAAY,cAAc,UAC1B,OAAO,UAAU,MAAM,YAAY,UAEnC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,UAAU;EACzB,SAAS,qBAAqB,OAAO,UAAU,IAAI,sBAAsB,YAAY,UAAU;EAChG,CAAC;AAIJ,KAAI,YAAY,UAAU,UAAa,OAAO,MAAM,MAAM,YAAY,MACpE,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,MAAM;EACrB,SAAS,iBAAiB,OAAO,MAAM,IAAI,sBAAsB,YAAY,MAAM;EACpF,CAAC;AAKJ,KAAI,YAAY,cAAc,OAE5B,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ;EACR,SAAS,+BAA+B,YAAY,UAAU;EAC/D,CAAC;AAGJ,QAAO;EACL;EACA;EACA;EACA;EACA,QAAQ,SAAS,WAAW;EAC5B;EACD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { PresentationKind, WorkspaceConfig } from "@contractspec/module.workspace";
|
|
2
|
+
import { OpKind } from "@contractspec/lib.contracts";
|
|
3
|
+
|
|
4
|
+
//#region src/services/create/ai-generator.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* AI Generator Service
|
|
8
|
+
*/
|
|
9
|
+
declare class AIGenerator {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: WorkspaceConfig);
|
|
12
|
+
private getModel;
|
|
13
|
+
/**
|
|
14
|
+
* Generate operation spec from natural language description
|
|
15
|
+
*/
|
|
16
|
+
generateOperationSpec(description: string, kind: OpKind): Promise<{
|
|
17
|
+
name: string;
|
|
18
|
+
version: number;
|
|
19
|
+
description: string;
|
|
20
|
+
goal: string;
|
|
21
|
+
context: string;
|
|
22
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
23
|
+
owners: string[];
|
|
24
|
+
tags: string[];
|
|
25
|
+
auth: "anonymous" | "user" | "admin";
|
|
26
|
+
inputShape: string;
|
|
27
|
+
outputShape: string;
|
|
28
|
+
flags: string[];
|
|
29
|
+
possibleEvents: string[];
|
|
30
|
+
analytics: string[];
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Generate event spec from description
|
|
34
|
+
*/
|
|
35
|
+
generateEventSpec(description: string): Promise<{
|
|
36
|
+
name: string;
|
|
37
|
+
version: number;
|
|
38
|
+
description: string;
|
|
39
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
40
|
+
owners: string[];
|
|
41
|
+
tags: string[];
|
|
42
|
+
payloadShape: string;
|
|
43
|
+
piiFields: string[];
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Generate presentation spec from description
|
|
47
|
+
*/
|
|
48
|
+
generatePresentationSpec(description: string, kind: PresentationKind): Promise<{
|
|
49
|
+
name: string;
|
|
50
|
+
version: number;
|
|
51
|
+
description: string;
|
|
52
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
53
|
+
owners: string[];
|
|
54
|
+
tags: string[];
|
|
55
|
+
componentKey?: string | undefined;
|
|
56
|
+
propsShape?: string | undefined;
|
|
57
|
+
content?: string | undefined;
|
|
58
|
+
mimeType?: string | undefined;
|
|
59
|
+
dataShape?: string | undefined;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Generate handler implementation from spec
|
|
63
|
+
*/
|
|
64
|
+
generateHandler(specCode: string): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Generate React component from presentation spec
|
|
67
|
+
*/
|
|
68
|
+
generateComponent(specCode: string): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Generate form component from form spec
|
|
71
|
+
*/
|
|
72
|
+
generateForm(specCode: string): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Generate tests for implementation
|
|
75
|
+
*/
|
|
76
|
+
generateTests(specCode: string, implementationCode: string, testType: 'handler' | 'component'): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Stream code generation for better UX
|
|
79
|
+
*/
|
|
80
|
+
streamCodeGeneration(prompt: string, onChunk: (text: string) => void): Promise<string>;
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { AIGenerator };
|
|
84
|
+
//# sourceMappingURL=ai-generator.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-generator.d.mts","names":[],"sources":["../../../src/services/create/ai-generator.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAsI4E,cApG/D,WAAA,CAoG+D;EAkCjC,QAAA,MAAA;EAeE,WAAA,CAAA,MAAA,EApJf,eAoJe;EAeL,QAAA,QAAA;EAmBnC;;;mDA/JoD,SAAM;;;;;;;;;;;;;;;;;;;0CA6ClB;;;;;;;;;;;;;sDA+Be,mBAAgB;;;;;;;;;;;;;;;;qCAkCjC;;;;uCAeE;;;;kCAeL;;;;kGAmBnC;;;;yEAkBA"}
|