@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,130 @@
|
|
|
1
|
+
import { parseOpenApi } from "@contractspec/lib.contracts-transformers/openapi";
|
|
2
|
+
|
|
3
|
+
//#region src/services/openapi/validate-service.ts
|
|
4
|
+
/**
|
|
5
|
+
* OpenAPI validation service - validates specs against OpenAPI sources.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate ContractSpec specs against an OpenAPI source.
|
|
9
|
+
*/
|
|
10
|
+
async function validateAgainstOpenApiService(options, adapters) {
|
|
11
|
+
const { fs, logger } = adapters;
|
|
12
|
+
const { specPath, openApiSource, ignoreDescriptions: _ignoreDescriptions, ignoreTags: _ignoreTags, ignoreTransport } = options;
|
|
13
|
+
logger.info(`Validating specs against OpenAPI: ${openApiSource}`);
|
|
14
|
+
const parseResult = await parseOpenApi(openApiSource, {
|
|
15
|
+
fetch: globalThis.fetch,
|
|
16
|
+
readFile: (path) => fs.readFile(path)
|
|
17
|
+
});
|
|
18
|
+
logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title}`);
|
|
19
|
+
const operationsMap = /* @__PURE__ */ new Map();
|
|
20
|
+
for (const op of parseResult.operations) operationsMap.set(op.operationId, op);
|
|
21
|
+
const results = [];
|
|
22
|
+
let specsValidated = 0;
|
|
23
|
+
let specsWithDiffs = 0;
|
|
24
|
+
const stat = await fs.stat(specPath);
|
|
25
|
+
const specFiles = [];
|
|
26
|
+
if (stat.isDirectory) {
|
|
27
|
+
const files = await fs.glob({
|
|
28
|
+
pattern: "**/*.ts",
|
|
29
|
+
cwd: specPath,
|
|
30
|
+
ignore: [
|
|
31
|
+
"node_modules/**",
|
|
32
|
+
"dist/**",
|
|
33
|
+
"*.test.ts",
|
|
34
|
+
"*.spec.ts"
|
|
35
|
+
],
|
|
36
|
+
absolute: true
|
|
37
|
+
});
|
|
38
|
+
specFiles.push(...files);
|
|
39
|
+
} else specFiles.push(specPath);
|
|
40
|
+
logger.info(`Found ${specFiles.length} spec files to validate`);
|
|
41
|
+
for (const file of specFiles) try {
|
|
42
|
+
const content = await fs.readFile(file);
|
|
43
|
+
const operationIdMatch = content.match(/operationId:\s*['"]([^'"]+)['"]/) || content.match(/name:\s*['"]([^'"]+)['"]/) || content.match(/export\s+const\s+(\w+)Spec\s*=/);
|
|
44
|
+
if (!operationIdMatch || !operationIdMatch[1]) {
|
|
45
|
+
logger.debug(`Could not extract operationId from ${file}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const specName = operationIdMatch[1];
|
|
49
|
+
specsValidated++;
|
|
50
|
+
let matchingOp;
|
|
51
|
+
matchingOp = operationsMap.get(specName);
|
|
52
|
+
if (!matchingOp) {
|
|
53
|
+
const snakeName = specName.replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
54
|
+
matchingOp = operationsMap.get(snakeName);
|
|
55
|
+
}
|
|
56
|
+
if (!matchingOp) {
|
|
57
|
+
for (const [opId, op] of operationsMap) if (opId.toLowerCase().includes(specName.toLowerCase()) || specName.toLowerCase().includes(opId.toLowerCase())) {
|
|
58
|
+
matchingOp = op;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!matchingOp) {
|
|
63
|
+
results.push({
|
|
64
|
+
specPath: file,
|
|
65
|
+
valid: false,
|
|
66
|
+
diffs: [{
|
|
67
|
+
path: "",
|
|
68
|
+
type: "removed",
|
|
69
|
+
description: `No matching operation found in OpenAPI for spec: ${specName}`
|
|
70
|
+
}]
|
|
71
|
+
});
|
|
72
|
+
specsWithDiffs++;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const diffs = [];
|
|
76
|
+
if (matchingOp.deprecated && !content.includes("deprecated")) diffs.push({
|
|
77
|
+
path: "meta.stability",
|
|
78
|
+
type: "modified",
|
|
79
|
+
description: "OpenAPI operation is deprecated but spec does not indicate deprecation"
|
|
80
|
+
});
|
|
81
|
+
if (!ignoreTransport) {
|
|
82
|
+
const pathMatch = content.match(/path:\s*['"]([^'"]+)['"]/);
|
|
83
|
+
if (pathMatch && pathMatch[1] !== matchingOp.path) diffs.push({
|
|
84
|
+
path: "transport.rest.path",
|
|
85
|
+
type: "modified",
|
|
86
|
+
description: `Path mismatch: spec has "${pathMatch[1]}", OpenAPI has "${matchingOp.path}"`
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (!ignoreTransport) {
|
|
90
|
+
const methodMatch = content.match(/method:\s*['"]([^'"]+)['"]/);
|
|
91
|
+
if (methodMatch?.[1] && methodMatch[1].toLowerCase() !== matchingOp.method.toLowerCase()) diffs.push({
|
|
92
|
+
path: "transport.rest.method",
|
|
93
|
+
type: "modified",
|
|
94
|
+
description: `Method mismatch: spec has "${methodMatch[1]}", OpenAPI has "${matchingOp.method.toUpperCase()}"`
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const valid$1 = diffs.length === 0;
|
|
98
|
+
if (!valid$1) specsWithDiffs++;
|
|
99
|
+
results.push({
|
|
100
|
+
specPath: file,
|
|
101
|
+
operationId: matchingOp.operationId,
|
|
102
|
+
valid: valid$1,
|
|
103
|
+
diffs
|
|
104
|
+
});
|
|
105
|
+
} catch (error) {
|
|
106
|
+
logger.error(`Error validating ${file}: ${error}`);
|
|
107
|
+
results.push({
|
|
108
|
+
specPath: file,
|
|
109
|
+
valid: false,
|
|
110
|
+
diffs: [{
|
|
111
|
+
path: "",
|
|
112
|
+
type: "modified",
|
|
113
|
+
description: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
114
|
+
}]
|
|
115
|
+
});
|
|
116
|
+
specsWithDiffs++;
|
|
117
|
+
}
|
|
118
|
+
const valid = specsWithDiffs === 0;
|
|
119
|
+
logger.info(`Validation ${valid ? "passed" : "failed"}: ${specsValidated} specs checked, ${specsWithDiffs} with differences`);
|
|
120
|
+
return {
|
|
121
|
+
valid,
|
|
122
|
+
specsValidated,
|
|
123
|
+
specsWithDiffs,
|
|
124
|
+
results
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
//#endregion
|
|
129
|
+
export { validateAgainstOpenApiService };
|
|
130
|
+
//# sourceMappingURL=validate-service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-service.mjs","names":["valid"],"sources":["../../../src/services/openapi/validate-service.ts"],"sourcesContent":["/**\n * OpenAPI validation service - validates specs against OpenAPI sources.\n */\n\nimport {\n parseOpenApi,\n type ParsedOperation,\n} from '@contractspec/lib.contracts-transformers/openapi';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n OpenApiValidateServiceOptions,\n OpenApiValidateServiceResult,\n} from './types';\n\n/**\n * Validate ContractSpec specs against an OpenAPI source.\n */\nexport async function validateAgainstOpenApiService(\n options: OpenApiValidateServiceOptions,\n adapters: { fs: FsAdapter; logger: LoggerAdapter }\n): Promise<OpenApiValidateServiceResult> {\n const { fs, logger } = adapters;\n const {\n specPath,\n openApiSource,\n ignoreDescriptions: _ignoreDescriptions,\n ignoreTags: _ignoreTags,\n ignoreTransport,\n } = options;\n\n logger.info(`Validating specs against OpenAPI: ${openApiSource}`);\n\n // Parse the OpenAPI document\n const parseResult = await parseOpenApi(openApiSource, {\n fetch: globalThis.fetch,\n readFile: (path) => fs.readFile(path),\n });\n\n logger.info(\n `Parsed ${parseResult.operations.length} operations from ${parseResult.info.title}`\n );\n\n // Build a map of operations by operationId\n const operationsMap = new Map<string, ParsedOperation>();\n for (const op of parseResult.operations) {\n operationsMap.set(op.operationId, op);\n }\n\n const results: OpenApiValidateServiceResult['results'] = [];\n let specsValidated = 0;\n let specsWithDiffs = 0;\n\n // Check if specPath is a directory or file\n const stat = await fs.stat(specPath);\n const specFiles: string[] = [];\n\n if (stat.isDirectory) {\n // Find all spec files in directory\n const files = await fs.glob({\n pattern: '**/*.ts',\n cwd: specPath,\n ignore: ['node_modules/**', 'dist/**', '*.test.ts', '*.spec.ts'],\n absolute: true,\n });\n specFiles.push(...files);\n } else {\n specFiles.push(specPath);\n }\n\n logger.info(`Found ${specFiles.length} spec files to validate`);\n\n for (const file of specFiles) {\n try {\n // Read the spec file\n const content = await fs.readFile(file);\n\n // Try to extract operationId from the spec file\n // Look for x-contractspec metadata or transport.rest.path\n const operationIdMatch =\n content.match(/operationId:\\s*['\"]([^'\"]+)['\"]/) ||\n content.match(/name:\\s*['\"]([^'\"]+)['\"]/) ||\n content.match(/export\\s+const\\s+(\\w+)Spec\\s*=/);\n\n if (!operationIdMatch || !operationIdMatch[1]) {\n logger.debug(`Could not extract operationId from ${file}`);\n continue;\n }\n\n const specName: string = operationIdMatch[1];\n specsValidated++;\n\n // Try to find matching OpenAPI operation\n // Match by operationId or by similar naming\n let matchingOp: ParsedOperation | undefined;\n\n // Direct match\n matchingOp = operationsMap.get(specName);\n\n // Try variations if no direct match\n if (!matchingOp) {\n // Try camelCase to snake_case\n const snakeName = specName.replace(/([A-Z])/g, '_$1').toLowerCase();\n matchingOp = operationsMap.get(snakeName);\n }\n\n if (!matchingOp) {\n // Try matching by partial name\n for (const [opId, op] of operationsMap) {\n if (\n opId.toLowerCase().includes(specName.toLowerCase()) ||\n specName.toLowerCase().includes(opId.toLowerCase())\n ) {\n matchingOp = op;\n break;\n }\n }\n }\n\n if (!matchingOp) {\n results.push({\n specPath: file,\n valid: false,\n diffs: [\n {\n path: '',\n type: 'removed',\n description: `No matching operation found in OpenAPI for spec: ${specName}`,\n },\n ],\n });\n specsWithDiffs++;\n continue;\n }\n\n // For now, we'll do a basic validation\n // In a full implementation, we would load the actual spec and compare\n const diffs: OpenApiValidateServiceResult['results'][0]['diffs'] = [];\n\n // Check if spec mentions deprecated when OpenAPI says deprecated\n if (matchingOp.deprecated && !content.includes('deprecated')) {\n diffs.push({\n path: 'meta.stability',\n type: 'modified',\n description:\n 'OpenAPI operation is deprecated but spec does not indicate deprecation',\n });\n }\n\n // Check path match\n if (!ignoreTransport) {\n const pathMatch = content.match(/path:\\s*['\"]([^'\"]+)['\"]/);\n if (pathMatch && pathMatch[1] !== matchingOp.path) {\n diffs.push({\n path: 'transport.rest.path',\n type: 'modified',\n description: `Path mismatch: spec has \"${pathMatch[1]}\", OpenAPI has \"${matchingOp.path}\"`,\n });\n }\n }\n\n // Check method match\n if (!ignoreTransport) {\n const methodMatch = content.match(/method:\\s*['\"]([^'\"]+)['\"]/);\n if (\n methodMatch?.[1] &&\n methodMatch[1].toLowerCase() !== matchingOp.method.toLowerCase()\n ) {\n diffs.push({\n path: 'transport.rest.method',\n type: 'modified',\n description: `Method mismatch: spec has \"${methodMatch[1]}\", OpenAPI has \"${matchingOp.method.toUpperCase()}\"`,\n });\n }\n }\n\n const valid = diffs.length === 0;\n if (!valid) {\n specsWithDiffs++;\n }\n\n results.push({\n specPath: file,\n operationId: matchingOp.operationId,\n valid,\n diffs,\n });\n } catch (error) {\n logger.error(`Error validating ${file}: ${error}`);\n results.push({\n specPath: file,\n valid: false,\n diffs: [\n {\n path: '',\n type: 'modified',\n description: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n });\n specsWithDiffs++;\n }\n }\n\n const valid = specsWithDiffs === 0;\n\n logger.info(\n `Validation ${valid ? 'passed' : 'failed'}: ${specsValidated} specs checked, ${specsWithDiffs} with differences`\n );\n\n return {\n valid,\n specsValidated,\n specsWithDiffs,\n results,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { QuickstartDependency } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/quickstart/dependencies.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Minimal dependencies required for ContractSpec to work.
|
|
7
|
+
*
|
|
8
|
+
* This is the absolute minimum needed to define and use contracts.
|
|
9
|
+
*/
|
|
10
|
+
declare const MINIMAL_DEPENDENCIES: QuickstartDependency[];
|
|
11
|
+
/**
|
|
12
|
+
* Full dependencies for a complete ContractSpec setup.
|
|
13
|
+
*
|
|
14
|
+
* Includes development tools and extended libraries.
|
|
15
|
+
*/
|
|
16
|
+
declare const FULL_DEPENDENCIES: QuickstartDependency[];
|
|
17
|
+
/**
|
|
18
|
+
* Get dependencies for the specified mode.
|
|
19
|
+
*/
|
|
20
|
+
declare function getDependencies(mode: 'minimal' | 'full'): QuickstartDependency[];
|
|
21
|
+
/**
|
|
22
|
+
* Get production dependencies (non-dev).
|
|
23
|
+
*/
|
|
24
|
+
declare function getProductionDependencies(dependencies: QuickstartDependency[]): QuickstartDependency[];
|
|
25
|
+
/**
|
|
26
|
+
* Get development dependencies.
|
|
27
|
+
*/
|
|
28
|
+
declare function getDevDependencies(dependencies: QuickstartDependency[]): QuickstartDependency[];
|
|
29
|
+
//#endregion
|
|
30
|
+
export { FULL_DEPENDENCIES, MINIMAL_DEPENDENCIES, getDependencies, getDevDependencies, getProductionDependencies };
|
|
31
|
+
//# sourceMappingURL=dependencies.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.mts","names":[],"sources":["../../../src/services/quickstart/dependencies.ts"],"sourcesContent":[],"mappings":";;;;AA0EA;;;;;cA5Da,sBAAsB;;;;;;cAiBtB,mBAAmB;;;;iBAyBhB,eAAA,4BAEb;;;;iBAOa,yBAAA,eACA,yBACb;;;;iBAOa,kBAAA,eACA,yBACb"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//#region src/services/quickstart/dependencies.ts
|
|
2
|
+
/**
|
|
3
|
+
* Minimal dependencies required for ContractSpec to work.
|
|
4
|
+
*
|
|
5
|
+
* This is the absolute minimum needed to define and use contracts.
|
|
6
|
+
*/
|
|
7
|
+
const MINIMAL_DEPENDENCIES = [{
|
|
8
|
+
name: "@contractspec/lib.contracts",
|
|
9
|
+
description: "Core ContractSpec library for defining commands, queries, and events"
|
|
10
|
+
}, {
|
|
11
|
+
name: "zod",
|
|
12
|
+
description: "Schema validation library (peer dependency)"
|
|
13
|
+
}];
|
|
14
|
+
/**
|
|
15
|
+
* Full dependencies for a complete ContractSpec setup.
|
|
16
|
+
*
|
|
17
|
+
* Includes development tools and extended libraries.
|
|
18
|
+
*/
|
|
19
|
+
const FULL_DEPENDENCIES = [
|
|
20
|
+
...MINIMAL_DEPENDENCIES,
|
|
21
|
+
{
|
|
22
|
+
name: "@contractspec/lib.schema",
|
|
23
|
+
description: "Extended schema utilities and common types"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "@contractspec/app.cli-contractspec",
|
|
27
|
+
dev: true,
|
|
28
|
+
description: "ContractSpec CLI for validation, scaffolding, and code generation"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "typescript",
|
|
32
|
+
dev: true,
|
|
33
|
+
description: "TypeScript compiler for type checking"
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Get dependencies for the specified mode.
|
|
38
|
+
*/
|
|
39
|
+
function getDependencies(mode) {
|
|
40
|
+
return mode === "minimal" ? MINIMAL_DEPENDENCIES : FULL_DEPENDENCIES;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get production dependencies (non-dev).
|
|
44
|
+
*/
|
|
45
|
+
function getProductionDependencies(dependencies) {
|
|
46
|
+
return dependencies.filter((dep) => !dep.dev);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get development dependencies.
|
|
50
|
+
*/
|
|
51
|
+
function getDevDependencies(dependencies) {
|
|
52
|
+
return dependencies.filter((dep) => dep.dev);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { FULL_DEPENDENCIES, MINIMAL_DEPENDENCIES, getDependencies, getDevDependencies, getProductionDependencies };
|
|
57
|
+
//# sourceMappingURL=dependencies.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.mjs","names":[],"sources":["../../../src/services/quickstart/dependencies.ts"],"sourcesContent":["/**\n * Quickstart dependencies configuration.\n *\n * Defines the minimal and full sets of packages needed\n * for ContractSpec to work.\n */\n\nimport type { QuickstartDependency } from './types';\n\n/**\n * Minimal dependencies required for ContractSpec to work.\n *\n * This is the absolute minimum needed to define and use contracts.\n */\nexport const MINIMAL_DEPENDENCIES: QuickstartDependency[] = [\n {\n name: '@contractspec/lib.contracts',\n description:\n 'Core ContractSpec library for defining commands, queries, and events',\n },\n {\n name: 'zod',\n description: 'Schema validation library (peer dependency)',\n },\n];\n\n/**\n * Full dependencies for a complete ContractSpec setup.\n *\n * Includes development tools and extended libraries.\n */\nexport const FULL_DEPENDENCIES: QuickstartDependency[] = [\n // Core dependencies (from minimal)\n ...MINIMAL_DEPENDENCIES,\n // Extended schema utilities\n {\n name: '@contractspec/lib.schema',\n description: 'Extended schema utilities and common types',\n },\n // Development tools\n {\n name: '@contractspec/app.cli-contractspec',\n dev: true,\n description:\n 'ContractSpec CLI for validation, scaffolding, and code generation',\n },\n {\n name: 'typescript',\n dev: true,\n description: 'TypeScript compiler for type checking',\n },\n];\n\n/**\n * Get dependencies for the specified mode.\n */\nexport function getDependencies(\n mode: 'minimal' | 'full'\n): QuickstartDependency[] {\n return mode === 'minimal' ? MINIMAL_DEPENDENCIES : FULL_DEPENDENCIES;\n}\n\n/**\n * Get production dependencies (non-dev).\n */\nexport function getProductionDependencies(\n dependencies: QuickstartDependency[]\n): QuickstartDependency[] {\n return dependencies.filter((dep) => !dep.dev);\n}\n\n/**\n * Get development dependencies.\n */\nexport function getDevDependencies(\n dependencies: QuickstartDependency[]\n): QuickstartDependency[] {\n return dependencies.filter((dep) => dep.dev);\n}\n"],"mappings":";;;;;;AAcA,MAAa,uBAA+C,CAC1D;CACE,MAAM;CACN,aACE;CACH,EACD;CACE,MAAM;CACN,aAAa;CACd,CACF;;;;;;AAOD,MAAa,oBAA4C;CAEvD,GAAG;CAEH;EACE,MAAM;EACN,aAAa;EACd;CAED;EACE,MAAM;EACN,KAAK;EACL,aACE;EACH;CACD;EACE,MAAM;EACN,KAAK;EACL,aAAa;EACd;CACF;;;;AAKD,SAAgB,gBACd,MACwB;AACxB,QAAO,SAAS,YAAY,uBAAuB;;;;;AAMrD,SAAgB,0BACd,cACwB;AACxB,QAAO,aAAa,QAAQ,QAAQ,CAAC,IAAI,IAAI;;;;;AAM/C,SAAgB,mBACd,cACwB;AACxB,QAAO,aAAa,QAAQ,QAAQ,IAAI,IAAI"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FsAdapter } from "../../ports/fs.mjs";
|
|
2
|
+
import { QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult } from "./types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/quickstart/quickstart-service.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Run the ContractSpec quickstart installation.
|
|
8
|
+
*/
|
|
9
|
+
declare function runQuickstart(fs: FsAdapter, options: QuickstartOptions, prompts?: QuickstartPromptCallbacks): Promise<QuickstartResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if ContractSpec is already set up in the workspace.
|
|
12
|
+
*/
|
|
13
|
+
declare function isContractSpecInstalled(fs: FsAdapter, workspaceRoot: string): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a summary of what would be installed.
|
|
16
|
+
*/
|
|
17
|
+
declare function formatQuickstartPreview(mode: 'minimal' | 'full'): string;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { formatQuickstartPreview, isContractSpecInstalled, runQuickstart };
|
|
20
|
+
//# sourceMappingURL=quickstart-service.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart-service.d.mts","names":[],"sources":["../../../src/services/quickstart/quickstart-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAwQsB,iBA/NA,aAAA,CA+NuB,EAAA,EA9NvC,SA+NA,EAAA,OAEH,EAhOQ,iBAgOD,EAAA,OAAA,CAAA,EA/NC,yBA+ND,CAAA,EA9NP,OA8NO,CA9NC,gBA8ND,CAAA;AAwBV;;;iBA3BsB,uBAAA,KAChB,mCAEH;;;;iBAwBa,uBAAA"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { detectPackageManager, getInstallCommand } from "../../adapters/workspace.mjs";
|
|
2
|
+
import { getDependencies, getDevDependencies, getProductionDependencies } from "./dependencies.mjs";
|
|
3
|
+
import { exec } from "node:child_process";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
|
|
6
|
+
//#region src/services/quickstart/quickstart-service.ts
|
|
7
|
+
/**
|
|
8
|
+
* Quickstart service.
|
|
9
|
+
*
|
|
10
|
+
* Orchestrates the installation of minimal necessary packages
|
|
11
|
+
* for ContractSpec to work across CLI, VS Code, and JetBrains.
|
|
12
|
+
*/
|
|
13
|
+
const execAsync = promisify(exec);
|
|
14
|
+
/**
|
|
15
|
+
* Default prompt callbacks that accept all defaults.
|
|
16
|
+
*/
|
|
17
|
+
const defaultPrompts = {
|
|
18
|
+
confirm: async () => true,
|
|
19
|
+
select: async (_msg, options) => options[0]?.value ?? ""
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Run the ContractSpec quickstart installation.
|
|
23
|
+
*/
|
|
24
|
+
async function runQuickstart(fs, options, prompts = defaultPrompts) {
|
|
25
|
+
const dependencies = getDependencies(options.mode);
|
|
26
|
+
const prodDeps = getProductionDependencies(dependencies);
|
|
27
|
+
const devDeps = getDevDependencies(dependencies);
|
|
28
|
+
const installed = [];
|
|
29
|
+
const skipped = [];
|
|
30
|
+
const errors = [];
|
|
31
|
+
const packageJsonPath = fs.join(options.workspaceRoot, "package.json");
|
|
32
|
+
if (!await fs.exists(packageJsonPath)) return {
|
|
33
|
+
success: false,
|
|
34
|
+
installed: [],
|
|
35
|
+
skipped: [],
|
|
36
|
+
errors: [{
|
|
37
|
+
name: "package.json",
|
|
38
|
+
action: "error",
|
|
39
|
+
message: "No package.json found. Run `npm init` first."
|
|
40
|
+
}],
|
|
41
|
+
summary: "No package.json found in workspace root."
|
|
42
|
+
};
|
|
43
|
+
const packageJsonContent = await fs.readFile(packageJsonPath);
|
|
44
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
45
|
+
const existingDeps = new Set([...Object.keys(packageJson.dependencies ?? {}), ...Object.keys(packageJson.devDependencies ?? {})]);
|
|
46
|
+
const packageManager = detectPackageManager(options.workspaceRoot);
|
|
47
|
+
const toInstallProd = prodDeps.filter((dep) => {
|
|
48
|
+
if (existingDeps.has(dep.name) && !options.force) {
|
|
49
|
+
skipped.push({
|
|
50
|
+
name: dep.name,
|
|
51
|
+
action: "skipped",
|
|
52
|
+
message: "Already installed",
|
|
53
|
+
dev: false
|
|
54
|
+
});
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
});
|
|
59
|
+
const toInstallDev = devDeps.filter((dep) => {
|
|
60
|
+
if (existingDeps.has(dep.name) && !options.force) {
|
|
61
|
+
skipped.push({
|
|
62
|
+
name: dep.name,
|
|
63
|
+
action: "skipped",
|
|
64
|
+
message: "Already installed",
|
|
65
|
+
dev: true
|
|
66
|
+
});
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
});
|
|
71
|
+
if (options.dryRun) {
|
|
72
|
+
const wouldInstall = [...toInstallProd, ...toInstallDev];
|
|
73
|
+
return {
|
|
74
|
+
success: true,
|
|
75
|
+
installed: wouldInstall.map((dep) => ({
|
|
76
|
+
name: dep.name,
|
|
77
|
+
action: "installed",
|
|
78
|
+
message: `Would install: ${dep.description}`,
|
|
79
|
+
dev: dep.dev
|
|
80
|
+
})),
|
|
81
|
+
skipped,
|
|
82
|
+
errors: [],
|
|
83
|
+
summary: `Dry run: would install ${wouldInstall.length} package(s), skip ${skipped.length}.`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (!options.skipPrompts && (toInstallProd.length > 0 || toInstallDev.length > 0)) {
|
|
87
|
+
const total = toInstallProd.length + toInstallDev.length;
|
|
88
|
+
if (!await prompts.confirm(`Install ${total} package(s) using ${packageManager}?`)) return {
|
|
89
|
+
success: true,
|
|
90
|
+
installed: [],
|
|
91
|
+
skipped: [
|
|
92
|
+
...skipped,
|
|
93
|
+
...toInstallProd.map((d) => ({
|
|
94
|
+
name: d.name,
|
|
95
|
+
action: "skipped",
|
|
96
|
+
message: "User cancelled"
|
|
97
|
+
})),
|
|
98
|
+
...toInstallDev.map((d) => ({
|
|
99
|
+
name: d.name,
|
|
100
|
+
action: "skipped",
|
|
101
|
+
message: "User cancelled",
|
|
102
|
+
dev: true
|
|
103
|
+
}))
|
|
104
|
+
],
|
|
105
|
+
errors: [],
|
|
106
|
+
summary: "Installation cancelled by user."
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (toInstallProd.length > 0) {
|
|
110
|
+
const results = await installPackages(toInstallProd, packageManager, options.workspaceRoot, false);
|
|
111
|
+
for (const result of results) if (result.action === "installed") installed.push(result);
|
|
112
|
+
else errors.push(result);
|
|
113
|
+
}
|
|
114
|
+
if (toInstallDev.length > 0) {
|
|
115
|
+
const results = await installPackages(toInstallDev, packageManager, options.workspaceRoot, true);
|
|
116
|
+
for (const result of results) if (result.action === "installed") installed.push(result);
|
|
117
|
+
else errors.push(result);
|
|
118
|
+
}
|
|
119
|
+
const success = errors.length === 0;
|
|
120
|
+
return {
|
|
121
|
+
success,
|
|
122
|
+
installed,
|
|
123
|
+
skipped,
|
|
124
|
+
errors,
|
|
125
|
+
summary: success ? `Successfully installed ${installed.length} package(s), skipped ${skipped.length}.` : `Installed ${installed.length}, skipped ${skipped.length}, failed ${errors.length}.`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Install a set of packages using the detected package manager.
|
|
130
|
+
*/
|
|
131
|
+
async function installPackages(dependencies, packageManager, cwd, isDev) {
|
|
132
|
+
const results = [];
|
|
133
|
+
const packageNames = dependencies.map((dep) => dep.version ? `${dep.name}@${dep.version}` : dep.name);
|
|
134
|
+
try {
|
|
135
|
+
await execAsync(`${getInstallCommand(packageManager, isDev)} ${packageNames.join(" ")}`, {
|
|
136
|
+
cwd,
|
|
137
|
+
timeout: 12e4
|
|
138
|
+
});
|
|
139
|
+
for (const dep of dependencies) results.push({
|
|
140
|
+
name: dep.name,
|
|
141
|
+
action: "installed",
|
|
142
|
+
message: dep.description,
|
|
143
|
+
dev: isDev
|
|
144
|
+
});
|
|
145
|
+
} catch (error) {
|
|
146
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
147
|
+
for (const dep of dependencies) results.push({
|
|
148
|
+
name: dep.name,
|
|
149
|
+
action: "error",
|
|
150
|
+
message: `Failed to install: ${msg}`,
|
|
151
|
+
dev: isDev
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Check if ContractSpec is already set up in the workspace.
|
|
158
|
+
*/
|
|
159
|
+
async function isContractSpecInstalled(fs, workspaceRoot) {
|
|
160
|
+
const packageJsonPath = fs.join(workspaceRoot, "package.json");
|
|
161
|
+
try {
|
|
162
|
+
const content = await fs.readFile(packageJsonPath);
|
|
163
|
+
const packageJson = JSON.parse(content);
|
|
164
|
+
return "@contractspec/lib.contracts" in {
|
|
165
|
+
...packageJson.dependencies,
|
|
166
|
+
...packageJson.devDependencies
|
|
167
|
+
};
|
|
168
|
+
} catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get a summary of what would be installed.
|
|
174
|
+
*/
|
|
175
|
+
function formatQuickstartPreview(mode) {
|
|
176
|
+
const deps = getDependencies(mode);
|
|
177
|
+
const lines = [];
|
|
178
|
+
lines.push(`ContractSpec ${mode} installation:`);
|
|
179
|
+
lines.push("");
|
|
180
|
+
const prodDeps = getProductionDependencies(deps);
|
|
181
|
+
if (prodDeps.length > 0) {
|
|
182
|
+
lines.push("Dependencies:");
|
|
183
|
+
for (const dep of prodDeps) lines.push(` • ${dep.name} - ${dep.description}`);
|
|
184
|
+
}
|
|
185
|
+
const devDeps = getDevDependencies(deps);
|
|
186
|
+
if (devDeps.length > 0) {
|
|
187
|
+
lines.push("");
|
|
188
|
+
lines.push("Dev Dependencies:");
|
|
189
|
+
for (const dep of devDeps) lines.push(` • ${dep.name} - ${dep.description}`);
|
|
190
|
+
}
|
|
191
|
+
return lines.join("\n");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
//#endregion
|
|
195
|
+
export { formatQuickstartPreview, isContractSpecInstalled, runQuickstart };
|
|
196
|
+
//# sourceMappingURL=quickstart-service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart-service.mjs","names":[],"sources":["../../../src/services/quickstart/quickstart-service.ts"],"sourcesContent":["/**\n * Quickstart service.\n *\n * Orchestrates the installation of minimal necessary packages\n * for ContractSpec to work across CLI, VS Code, and JetBrains.\n */\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { FsAdapter } from '../../ports/fs';\nimport type {\n QuickstartOptions,\n QuickstartResult,\n QuickstartPromptCallbacks,\n PackageInstallResult,\n QuickstartDependency,\n} from './types';\nimport {\n getDependencies,\n getProductionDependencies,\n getDevDependencies,\n} from './dependencies';\nimport {\n detectPackageManager,\n getInstallCommand,\n type PackageManager,\n} from '../../adapters/workspace';\n\nconst execAsync = promisify(exec);\n\n/**\n * Default prompt callbacks that accept all defaults.\n */\nconst defaultPrompts: QuickstartPromptCallbacks = {\n confirm: async () => true,\n select: async (_msg, options) => options[0]?.value ?? ('' as never),\n};\n\n/**\n * Run the ContractSpec quickstart installation.\n */\nexport async function runQuickstart(\n fs: FsAdapter,\n options: QuickstartOptions,\n prompts: QuickstartPromptCallbacks = defaultPrompts\n): Promise<QuickstartResult> {\n const dependencies = getDependencies(options.mode);\n const prodDeps = getProductionDependencies(dependencies);\n const devDeps = getDevDependencies(dependencies);\n\n const installed: PackageInstallResult[] = [];\n const skipped: PackageInstallResult[] = [];\n const errors: PackageInstallResult[] = [];\n\n // Check if package.json exists\n const packageJsonPath = fs.join(options.workspaceRoot, 'package.json');\n const hasPackageJson = await fs.exists(packageJsonPath);\n\n if (!hasPackageJson) {\n return {\n success: false,\n installed: [],\n skipped: [],\n errors: [\n {\n name: 'package.json',\n action: 'error',\n message: 'No package.json found. Run `npm init` first.',\n },\n ],\n summary: 'No package.json found in workspace root.',\n };\n }\n\n // Read current package.json to check existing dependencies\n const packageJsonContent = await fs.readFile(packageJsonPath);\n const packageJson = JSON.parse(packageJsonContent) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const existingDeps = new Set([\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ]);\n\n // Detect package manager\n const packageManager = detectPackageManager(options.workspaceRoot);\n\n // Filter dependencies based on what's already installed\n const toInstallProd = prodDeps.filter((dep) => {\n if (existingDeps.has(dep.name) && !options.force) {\n skipped.push({\n name: dep.name,\n action: 'skipped',\n message: 'Already installed',\n dev: false,\n });\n return false;\n }\n return true;\n });\n\n const toInstallDev = devDeps.filter((dep) => {\n if (existingDeps.has(dep.name) && !options.force) {\n skipped.push({\n name: dep.name,\n action: 'skipped',\n message: 'Already installed',\n dev: true,\n });\n return false;\n }\n return true;\n });\n\n // Dry run - just report what would be installed\n if (options.dryRun) {\n const wouldInstall = [...toInstallProd, ...toInstallDev];\n return {\n success: true,\n installed: wouldInstall.map((dep) => ({\n name: dep.name,\n action: 'installed',\n message: `Would install: ${dep.description}`,\n dev: dep.dev,\n })),\n skipped,\n errors: [],\n summary: `Dry run: would install ${wouldInstall.length} package(s), skip ${skipped.length}.`,\n };\n }\n\n // Confirm installation if interactive\n if (\n !options.skipPrompts &&\n (toInstallProd.length > 0 || toInstallDev.length > 0)\n ) {\n const total = toInstallProd.length + toInstallDev.length;\n const confirmed = await prompts.confirm(\n `Install ${total} package(s) using ${packageManager}?`\n );\n if (!confirmed) {\n return {\n success: true,\n installed: [],\n skipped: [\n ...skipped,\n ...toInstallProd.map((d) => ({\n name: d.name,\n action: 'skipped' as const,\n message: 'User cancelled',\n })),\n ...toInstallDev.map((d) => ({\n name: d.name,\n action: 'skipped' as const,\n message: 'User cancelled',\n dev: true,\n })),\n ],\n errors: [],\n summary: 'Installation cancelled by user.',\n };\n }\n }\n\n // Install production dependencies\n if (toInstallProd.length > 0) {\n const results = await installPackages(\n toInstallProd,\n packageManager,\n options.workspaceRoot,\n false\n );\n for (const result of results) {\n if (result.action === 'installed') {\n installed.push(result);\n } else {\n errors.push(result);\n }\n }\n }\n\n // Install dev dependencies\n if (toInstallDev.length > 0) {\n const results = await installPackages(\n toInstallDev,\n packageManager,\n options.workspaceRoot,\n true\n );\n for (const result of results) {\n if (result.action === 'installed') {\n installed.push(result);\n } else {\n errors.push(result);\n }\n }\n }\n\n const success = errors.length === 0;\n const summary = success\n ? `Successfully installed ${installed.length} package(s), skipped ${skipped.length}.`\n : `Installed ${installed.length}, skipped ${skipped.length}, failed ${errors.length}.`;\n\n return {\n success,\n installed,\n skipped,\n errors,\n summary,\n };\n}\n\n/**\n * Install a set of packages using the detected package manager.\n */\nasync function installPackages(\n dependencies: QuickstartDependency[],\n packageManager: PackageManager,\n cwd: string,\n isDev: boolean\n): Promise<PackageInstallResult[]> {\n const results: PackageInstallResult[] = [];\n const packageNames = dependencies.map((dep) =>\n dep.version ? `${dep.name}@${dep.version}` : dep.name\n );\n\n try {\n const baseCommand = getInstallCommand(packageManager, isDev);\n const command = `${baseCommand} ${packageNames.join(' ')}`;\n\n await execAsync(command, {\n cwd,\n timeout: 120000, // 2 minutes timeout\n });\n\n // All packages installed successfully\n for (const dep of dependencies) {\n results.push({\n name: dep.name,\n action: 'installed',\n message: dep.description,\n dev: isDev,\n });\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n for (const dep of dependencies) {\n results.push({\n name: dep.name,\n action: 'error',\n message: `Failed to install: ${msg}`,\n dev: isDev,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Check if ContractSpec is already set up in the workspace.\n */\nexport async function isContractSpecInstalled(\n fs: FsAdapter,\n workspaceRoot: string\n): Promise<boolean> {\n const packageJsonPath = fs.join(workspaceRoot, 'package.json');\n\n try {\n const content = await fs.readFile(packageJsonPath);\n const packageJson = JSON.parse(content) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return '@contractspec/lib.contracts' in allDeps;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a summary of what would be installed.\n */\nexport function formatQuickstartPreview(mode: 'minimal' | 'full'): string {\n const deps = getDependencies(mode);\n const lines: string[] = [];\n\n lines.push(`ContractSpec ${mode} installation:`);\n lines.push('');\n\n const prodDeps = getProductionDependencies(deps);\n if (prodDeps.length > 0) {\n lines.push('Dependencies:');\n for (const dep of prodDeps) {\n lines.push(` • ${dep.name} - ${dep.description}`);\n }\n }\n\n const devDeps = getDevDependencies(deps);\n if (devDeps.length > 0) {\n lines.push('');\n lines.push('Dev Dependencies:');\n for (const dep of devDeps) {\n lines.push(` • ${dep.name} - ${dep.description}`);\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
//#region src/services/quickstart/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Quickstart service types.
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for the ContractSpec quickstart installation feature.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Installation mode for quickstart.
|
|
9
|
+
*/
|
|
10
|
+
type QuickstartMode = 'minimal' | 'full';
|
|
11
|
+
/**
|
|
12
|
+
* A dependency to install during quickstart.
|
|
13
|
+
*/
|
|
14
|
+
interface QuickstartDependency {
|
|
15
|
+
/** Package name (e.g., '@contractspec/lib.contracts') */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Specific version or latest if not specified */
|
|
18
|
+
version?: string;
|
|
19
|
+
/** Whether this is a dev dependency */
|
|
20
|
+
dev?: boolean;
|
|
21
|
+
/** Whether this dependency is optional */
|
|
22
|
+
optional?: boolean;
|
|
23
|
+
/** Human-readable description */
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Options for running quickstart.
|
|
28
|
+
*/
|
|
29
|
+
interface QuickstartOptions {
|
|
30
|
+
/** Workspace root directory */
|
|
31
|
+
workspaceRoot: string;
|
|
32
|
+
/** Installation mode */
|
|
33
|
+
mode: QuickstartMode;
|
|
34
|
+
/** Dry run - show what would be installed without installing */
|
|
35
|
+
dryRun?: boolean;
|
|
36
|
+
/** Skip interactive prompts */
|
|
37
|
+
skipPrompts?: boolean;
|
|
38
|
+
/** Force reinstall even if packages exist */
|
|
39
|
+
force?: boolean;
|
|
40
|
+
/** Verbose output */
|
|
41
|
+
verbose?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of a single package installation.
|
|
45
|
+
*/
|
|
46
|
+
interface PackageInstallResult {
|
|
47
|
+
name: string;
|
|
48
|
+
action: 'installed' | 'skipped' | 'error';
|
|
49
|
+
message: string;
|
|
50
|
+
dev?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result of the quickstart operation.
|
|
54
|
+
*/
|
|
55
|
+
interface QuickstartResult {
|
|
56
|
+
/** Whether the operation was successful overall */
|
|
57
|
+
success: boolean;
|
|
58
|
+
/** Packages that were installed */
|
|
59
|
+
installed: PackageInstallResult[];
|
|
60
|
+
/** Packages that were skipped (already installed) */
|
|
61
|
+
skipped: PackageInstallResult[];
|
|
62
|
+
/** Packages that failed to install */
|
|
63
|
+
errors: PackageInstallResult[];
|
|
64
|
+
/** Summary message */
|
|
65
|
+
summary: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Prompt callbacks for interactive quickstart.
|
|
69
|
+
*/
|
|
70
|
+
interface QuickstartPromptCallbacks {
|
|
71
|
+
/** Confirm a yes/no question */
|
|
72
|
+
confirm: (message: string) => Promise<boolean>;
|
|
73
|
+
/** Select from a list of options */
|
|
74
|
+
select: <T extends string>(message: string, options: {
|
|
75
|
+
value: T;
|
|
76
|
+
label: string;
|
|
77
|
+
}[]) => Promise<T>;
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { PackageInstallResult, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult };
|
|
81
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/quickstart/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAKA;AAgBA;AAkBA;AAUA;;;AAQU,KAzDE,cAAA,GAyDF,SAAA,GAAA,MAAA;;AAQV;;AAMsB,UAlEL,oBAAA,CAkEK;EACP;EAAR,IAAA,EAAA,MAAA;EAAO;;;;;;;;;;;;UAnDG,iBAAA;;;;QAIT;;;;;;;;;;;;;UAcS,oBAAA;;;;;;;;;UAUA,gBAAA;;;;aAIJ;;WAEF;;UAED;;;;;;;UAQO,yBAAA;;gCAEe;;;WAIV;;UACf,QAAQ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RegeneratorService } from "@contractspec/lib.contracts/regenerator";
|
|
2
|
+
import { ProposalSink, RegenerationContext, RegenerationRule } from "@contractspec/lib.contracts/regenerator/types";
|
|
3
|
+
import { SignalAdapters } from "@contractspec/lib.contracts/regenerator/adapters";
|
|
4
|
+
|
|
5
|
+
//#region src/services/regenerator.d.ts
|
|
6
|
+
|
|
7
|
+
interface CreateRegeneratorOptions {
|
|
8
|
+
contexts: RegenerationContext[];
|
|
9
|
+
rules: RegenerationRule[];
|
|
10
|
+
sink: ProposalSink;
|
|
11
|
+
adapters?: SignalAdapters;
|
|
12
|
+
pollIntervalMs?: number;
|
|
13
|
+
batchDurationMs?: number;
|
|
14
|
+
}
|
|
15
|
+
declare function createRegeneratorService(options: CreateRegeneratorOptions): RegeneratorService;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { CreateRegeneratorOptions, createRegeneratorService };
|
|
18
|
+
//# sourceMappingURL=regenerator.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regenerator.d.mts","names":[],"sources":["../../src/services/regenerator.ts"],"sourcesContent":[],"mappings":";;;;;;AAmBa,UAJI,wBAAA,CAIJ;EAAc,QAAA,EAHf,mBAGe,EAAA;EAKX,KAAA,EAPP,gBAOO,EAAA;QANR;aACK;;;;iBAKG,wBAAA,UACL,2BACR"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RegeneratorService } from "@contractspec/lib.contracts/regenerator";
|
|
2
|
+
|
|
3
|
+
//#region src/services/regenerator.ts
|
|
4
|
+
/**
|
|
5
|
+
* Regenerator service.
|
|
6
|
+
*
|
|
7
|
+
* Thin wrapper around `@contractspec/lib.contracts/regenerator` for reuse across CLI/VSCode/web.
|
|
8
|
+
* This service does not perform module loading; callers provide resolved contexts/rules/sink.
|
|
9
|
+
*/
|
|
10
|
+
function createRegeneratorService(options) {
|
|
11
|
+
return new RegeneratorService({
|
|
12
|
+
contexts: options.contexts,
|
|
13
|
+
adapters: options.adapters ?? {},
|
|
14
|
+
rules: options.rules,
|
|
15
|
+
sink: options.sink,
|
|
16
|
+
pollIntervalMs: options.pollIntervalMs,
|
|
17
|
+
batchDurationMs: options.batchDurationMs
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createRegeneratorService };
|
|
23
|
+
//# sourceMappingURL=regenerator.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regenerator.mjs","names":[],"sources":["../../src/services/regenerator.ts"],"sourcesContent":["/**\n * Regenerator service.\n *\n * Thin wrapper around `@contractspec/lib.contracts/regenerator` for reuse across CLI/VSCode/web.\n * This service does not perform module loading; callers provide resolved contexts/rules/sink.\n */\n\nimport { RegeneratorService } from '@contractspec/lib.contracts/regenerator';\nimport type {\n ProposalSink,\n RegenerationContext,\n RegenerationRule,\n} from '@contractspec/lib.contracts/regenerator/types';\nimport type { SignalAdapters } from '@contractspec/lib.contracts/regenerator/adapters';\n\nexport interface CreateRegeneratorOptions {\n contexts: RegenerationContext[];\n rules: RegenerationRule[];\n sink: ProposalSink;\n adapters?: SignalAdapters;\n pollIntervalMs?: number;\n batchDurationMs?: number;\n}\n\nexport function createRegeneratorService(\n options: CreateRegeneratorOptions\n): RegeneratorService {\n return new RegeneratorService({\n contexts: options.contexts,\n adapters: options.adapters ?? {},\n rules: options.rules,\n sink: options.sink,\n pollIntervalMs: options.pollIntervalMs,\n batchDurationMs: options.batchDurationMs,\n });\n}\n"],"mappings":";;;;;;;;;AAwBA,SAAgB,yBACd,SACoB;AACpB,QAAO,IAAI,mBAAmB;EAC5B,UAAU,QAAQ;EAClB,UAAU,QAAQ,YAAY,EAAE;EAChC,OAAO,QAAQ;EACf,MAAM,QAAQ;EACd,gBAAgB,QAAQ;EACxB,iBAAiB,QAAQ;EAC1B,CAAC"}
|