@contractspec/bundle.workspace 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/_virtual/rolldown_runtime.js +36 -0
- package/dist/adapters/ai.d.ts +12 -0
- package/dist/adapters/ai.d.ts.map +1 -0
- package/dist/adapters/ai.js +83 -0
- package/dist/adapters/ai.js.map +1 -0
- package/dist/adapters/factory.d.ts +29 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +37 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/fs.d.ts +11 -0
- package/dist/adapters/fs.d.ts.map +1 -0
- package/dist/adapters/fs.js +131 -0
- package/dist/adapters/fs.js.map +1 -0
- package/dist/adapters/git.d.ts +11 -0
- package/dist/adapters/git.d.ts.map +1 -0
- package/dist/adapters/git.js +55 -0
- package/dist/adapters/git.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/logger.d.ts +18 -0
- package/dist/adapters/logger.d.ts.map +1 -0
- package/dist/adapters/logger.js +81 -0
- package/dist/adapters/logger.js.map +1 -0
- package/dist/adapters/watcher.d.ts +11 -0
- package/dist/adapters/watcher.d.ts.map +1 -0
- package/dist/adapters/watcher.js +74 -0
- package/dist/adapters/watcher.js.map +1 -0
- package/dist/adapters/workspace.d.ts +148 -0
- package/dist/adapters/workspace.d.ts.map +1 -0
- package/dist/adapters/workspace.js +275 -0
- package/dist/adapters/workspace.js.map +1 -0
- package/dist/ai/agents/claude-code-agent.d.ts +22 -0
- package/dist/ai/agents/claude-code-agent.d.ts.map +1 -0
- package/dist/ai/agents/claude-code-agent.js +182 -0
- package/dist/ai/agents/claude-code-agent.js.map +1 -0
- package/dist/ai/agents/cursor-agent.d.ts +68 -0
- package/dist/ai/agents/cursor-agent.d.ts.map +1 -0
- package/dist/ai/agents/cursor-agent.js +436 -0
- package/dist/ai/agents/cursor-agent.js.map +1 -0
- package/dist/ai/agents/index.js +5 -0
- package/dist/ai/agents/openai-codex-agent.d.ts +22 -0
- package/dist/ai/agents/openai-codex-agent.d.ts.map +1 -0
- package/dist/ai/agents/openai-codex-agent.js +167 -0
- package/dist/ai/agents/openai-codex-agent.js.map +1 -0
- package/dist/ai/agents/orchestrator.d.ts +50 -0
- package/dist/ai/agents/orchestrator.d.ts.map +1 -0
- package/dist/ai/agents/orchestrator.js +143 -0
- package/dist/ai/agents/orchestrator.js.map +1 -0
- package/dist/ai/agents/simple-agent.d.ts +17 -0
- package/dist/ai/agents/simple-agent.d.ts.map +1 -0
- package/dist/ai/agents/simple-agent.js +92 -0
- package/dist/ai/agents/simple-agent.js.map +1 -0
- package/dist/ai/agents/types.d.ts +36 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/client.d.ts +83 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +163 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +28 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/code-generation.d.ts +26 -0
- package/dist/ai/prompts/code-generation.d.ts.map +1 -0
- package/dist/ai/prompts/code-generation.js +143 -0
- package/dist/ai/prompts/code-generation.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +10 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/spec-creation.d.ts +29 -0
- package/dist/ai/prompts/spec-creation.d.ts.map +1 -0
- package/dist/ai/prompts/spec-creation.js +111 -0
- package/dist/ai/prompts/spec-creation.js.map +1 -0
- package/dist/ai/providers.d.ts +29 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +39 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/formatters/index.d.ts +11 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +19 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json.d.ts +89 -0
- package/dist/formatters/json.d.ts.map +1 -0
- package/dist/formatters/json.js +72 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/sarif.d.ts +101 -0
- package/dist/formatters/sarif.d.ts.map +1 -0
- package/dist/formatters/sarif.js +163 -0
- package/dist/formatters/sarif.js.map +1 -0
- package/dist/formatters/text.d.ts +35 -0
- package/dist/formatters/text.d.ts.map +1 -0
- package/dist/formatters/text.js +209 -0
- package/dist/formatters/text.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +204 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/ai.d.ts +59 -0
- package/dist/ports/ai.d.ts.map +1 -0
- package/dist/ports/fs.d.ts +81 -0
- package/dist/ports/fs.d.ts.map +1 -0
- package/dist/ports/git.d.ts +33 -0
- package/dist/ports/git.d.ts.map +1 -0
- package/dist/ports/index.d.ts +5 -0
- package/dist/ports/logger.d.ts +88 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/watcher.d.ts +52 -0
- package/dist/ports/watcher.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.d.ts +35 -0
- package/dist/services/agent-guide/adapters/claude-code.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.js +144 -0
- package/dist/services/agent-guide/adapters/claude-code.js.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.ts +39 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.js +135 -0
- package/dist/services/agent-guide/adapters/cursor-cli.js.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.ts +53 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.js +159 -0
- package/dist/services/agent-guide/adapters/generic-mcp.js.map +1 -0
- package/dist/services/agent-guide/adapters/index.d.ts +23 -0
- package/dist/services/agent-guide/adapters/index.d.ts.map +1 -0
- package/dist/services/agent-guide/adapters/index.js +31 -0
- package/dist/services/agent-guide/adapters/index.js.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.d.ts +56 -0
- package/dist/services/agent-guide/agent-guide-service.d.ts.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.js +147 -0
- package/dist/services/agent-guide/agent-guide-service.js.map +1 -0
- package/dist/services/agent-guide/index.d.ts +6 -0
- package/dist/services/agent-guide/index.js +5 -0
- package/dist/services/agent-guide/types.d.ts +58 -0
- package/dist/services/agent-guide/types.d.ts.map +1 -0
- package/dist/services/build.d.ts +59 -0
- package/dist/services/build.d.ts.map +1 -0
- package/dist/services/build.js +140 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/ci-check/ci-check-service.d.ts +16 -0
- package/dist/services/ci-check/ci-check-service.d.ts.map +1 -0
- package/dist/services/ci-check/ci-check-service.js +392 -0
- package/dist/services/ci-check/ci-check-service.js.map +1 -0
- package/dist/services/ci-check/index.d.ts +2 -0
- package/dist/services/ci-check/index.js +2 -0
- package/dist/services/ci-check/types.d.ts +143 -0
- package/dist/services/ci-check/types.d.ts.map +1 -0
- package/dist/services/ci-check/types.js +29 -0
- package/dist/services/ci-check/types.js.map +1 -0
- package/dist/services/clean.d.ts +41 -0
- package/dist/services/clean.d.ts.map +1 -0
- package/dist/services/clean.js +72 -0
- package/dist/services/clean.js.map +1 -0
- package/dist/services/config.d.ts +26 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +77 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/deps.d.ts +53 -0
- package/dist/services/deps.d.ts.map +1 -0
- package/dist/services/deps.js +62 -0
- package/dist/services/deps.js.map +1 -0
- package/dist/services/diff.d.ts +34 -0
- package/dist/services/diff.d.ts.map +1 -0
- package/dist/services/diff.js +34 -0
- package/dist/services/diff.js.map +1 -0
- package/dist/services/doctor/checks/ai.js +119 -0
- package/dist/services/doctor/checks/ai.js.map +1 -0
- package/dist/services/doctor/checks/cli.js +147 -0
- package/dist/services/doctor/checks/cli.js.map +1 -0
- package/dist/services/doctor/checks/config.js +171 -0
- package/dist/services/doctor/checks/config.js.map +1 -0
- package/dist/services/doctor/checks/deps.js +247 -0
- package/dist/services/doctor/checks/deps.js.map +1 -0
- package/dist/services/doctor/checks/index.js +6 -0
- package/dist/services/doctor/checks/mcp.js +145 -0
- package/dist/services/doctor/checks/mcp.js.map +1 -0
- package/dist/services/doctor/checks/workspace.js +244 -0
- package/dist/services/doctor/checks/workspace.js.map +1 -0
- package/dist/services/doctor/doctor-service.d.ts +24 -0
- package/dist/services/doctor/doctor-service.d.ts.map +1 -0
- package/dist/services/doctor/doctor-service.js +116 -0
- package/dist/services/doctor/doctor-service.js.map +1 -0
- package/dist/services/doctor/index.d.ts +2 -0
- package/dist/services/doctor/index.js +2 -0
- package/dist/services/doctor/types.d.ts +118 -0
- package/dist/services/doctor/types.d.ts.map +1 -0
- package/dist/services/doctor/types.js +27 -0
- package/dist/services/doctor/types.js.map +1 -0
- package/dist/services/impact/formatters.d.ts +27 -0
- package/dist/services/impact/formatters.d.ts.map +1 -0
- package/dist/services/impact/formatters.js +111 -0
- package/dist/services/impact/formatters.js.map +1 -0
- package/dist/services/impact/impact-detection-service.d.ts +22 -0
- package/dist/services/impact/impact-detection-service.d.ts.map +1 -0
- package/dist/services/impact/impact-detection-service.js +96 -0
- package/dist/services/impact/impact-detection-service.js.map +1 -0
- package/dist/services/impact/index.d.ts +11 -0
- package/dist/services/impact/index.d.ts.map +1 -0
- package/dist/services/impact/index.js +16 -0
- package/dist/services/impact/index.js.map +1 -0
- package/dist/services/impact/types.d.ts +58 -0
- package/dist/services/impact/types.d.ts.map +1 -0
- package/dist/services/implementation/discovery.d.ts +30 -0
- package/dist/services/implementation/discovery.d.ts.map +1 -0
- package/dist/services/implementation/discovery.js +144 -0
- package/dist/services/implementation/discovery.js.map +1 -0
- package/dist/services/implementation/index.d.ts +3 -0
- package/dist/services/implementation/index.js +2 -0
- package/dist/services/implementation/resolver.d.ts +44 -0
- package/dist/services/implementation/resolver.d.ts.map +1 -0
- package/dist/services/implementation/resolver.js +224 -0
- package/dist/services/implementation/resolver.js.map +1 -0
- package/dist/services/implementation/types.d.ts +79 -0
- package/dist/services/implementation/types.d.ts.map +1 -0
- package/dist/services/index.d.ts +60 -0
- package/dist/services/index.js +57 -0
- package/dist/services/integrity-diagram.d.ts +36 -0
- package/dist/services/integrity-diagram.d.ts.map +1 -0
- package/dist/services/integrity-diagram.js +275 -0
- package/dist/services/integrity-diagram.js.map +1 -0
- package/dist/services/integrity.d.ts +134 -0
- package/dist/services/integrity.d.ts.map +1 -0
- package/dist/services/integrity.js +272 -0
- package/dist/services/integrity.js.map +1 -0
- package/dist/services/list.d.ts +31 -0
- package/dist/services/list.d.ts.map +1 -0
- package/dist/services/list.js +36 -0
- package/dist/services/list.js.map +1 -0
- package/dist/services/openapi/export-service.d.ts +53 -0
- package/dist/services/openapi/export-service.d.ts.map +1 -0
- package/dist/services/openapi/export-service.js +50 -0
- package/dist/services/openapi/export-service.js.map +1 -0
- package/dist/services/openapi/import-service.d.ts +17 -0
- package/dist/services/openapi/import-service.d.ts.map +1 -0
- package/dist/services/openapi/import-service.js +74 -0
- package/dist/services/openapi/import-service.js.map +1 -0
- package/dist/services/openapi/index.d.ts +5 -0
- package/dist/services/openapi/index.js +4 -0
- package/dist/services/openapi/sync-service.d.ts +17 -0
- package/dist/services/openapi/sync-service.d.ts.map +1 -0
- package/dist/services/openapi/sync-service.js +120 -0
- package/dist/services/openapi/sync-service.js.map +1 -0
- package/dist/services/openapi/types.d.ts +162 -0
- package/dist/services/openapi/types.d.ts.map +1 -0
- package/dist/services/openapi/validate-service.d.ts +16 -0
- package/dist/services/openapi/validate-service.d.ts.map +1 -0
- package/dist/services/openapi/validate-service.js +130 -0
- package/dist/services/openapi/validate-service.js.map +1 -0
- package/dist/services/quickstart/dependencies.d.ts +31 -0
- package/dist/services/quickstart/dependencies.d.ts.map +1 -0
- package/dist/services/quickstart/dependencies.js +57 -0
- package/dist/services/quickstart/dependencies.js.map +1 -0
- package/dist/services/quickstart/index.js +2 -0
- package/dist/services/quickstart/quickstart-service.d.ts +20 -0
- package/dist/services/quickstart/quickstart-service.d.ts.map +1 -0
- package/dist/services/quickstart/quickstart-service.js +196 -0
- package/dist/services/quickstart/quickstart-service.js.map +1 -0
- package/dist/services/quickstart/types.d.ts +81 -0
- package/dist/services/quickstart/types.d.ts.map +1 -0
- package/dist/services/regenerator.d.ts +18 -0
- package/dist/services/regenerator.d.ts.map +1 -0
- package/dist/services/regenerator.js +23 -0
- package/dist/services/regenerator.js.map +1 -0
- package/dist/services/registry.d.ts +53 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +74 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/setup/config-generators.d.ts +42 -0
- package/dist/services/setup/config-generators.d.ts.map +1 -0
- package/dist/services/setup/config-generators.js +238 -0
- package/dist/services/setup/config-generators.js.map +1 -0
- package/dist/services/setup/file-merger.d.ts +27 -0
- package/dist/services/setup/file-merger.d.ts.map +1 -0
- package/dist/services/setup/file-merger.js +61 -0
- package/dist/services/setup/file-merger.js.map +1 -0
- package/dist/services/setup/index.js +4 -0
- package/dist/services/setup/setup-service.d.ts +12 -0
- package/dist/services/setup/setup-service.d.ts.map +1 -0
- package/dist/services/setup/setup-service.js +96 -0
- package/dist/services/setup/setup-service.js.map +1 -0
- package/dist/services/setup/targets/agents-md.js +47 -0
- package/dist/services/setup/targets/agents-md.js.map +1 -0
- package/dist/services/setup/targets/cli-config.js +60 -0
- package/dist/services/setup/targets/cli-config.js.map +1 -0
- package/dist/services/setup/targets/cursor-rules.js +48 -0
- package/dist/services/setup/targets/cursor-rules.js.map +1 -0
- package/dist/services/setup/targets/mcp-claude.js +60 -0
- package/dist/services/setup/targets/mcp-claude.js.map +1 -0
- package/dist/services/setup/targets/mcp-cursor.js +59 -0
- package/dist/services/setup/targets/mcp-cursor.js.map +1 -0
- package/dist/services/setup/targets/vscode-settings.js +63 -0
- package/dist/services/setup/targets/vscode-settings.js.map +1 -0
- package/dist/services/setup/types.d.ts +85 -0
- package/dist/services/setup/types.d.ts.map +1 -0
- package/dist/services/setup/types.js +27 -0
- package/dist/services/setup/types.js.map +1 -0
- package/dist/services/sync.d.ts +41 -0
- package/dist/services/sync.d.ts.map +1 -0
- package/dist/services/sync.js +63 -0
- package/dist/services/sync.js.map +1 -0
- package/dist/services/test.d.ts +15 -0
- package/dist/services/test.d.ts.map +1 -0
- package/dist/services/test.js +30 -0
- package/dist/services/test.js.map +1 -0
- package/dist/services/validate-implementation.d.ts +32 -0
- package/dist/services/validate-implementation.d.ts.map +1 -0
- package/dist/services/validate-implementation.js +64 -0
- package/dist/services/validate-implementation.js.map +1 -0
- package/dist/services/validate.d.ts +41 -0
- package/dist/services/validate.d.ts.map +1 -0
- package/dist/services/validate.js +48 -0
- package/dist/services/validate.js.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.d.ts +46 -0
- package/dist/services/verification-cache/adapters/filesystem.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.js +120 -0
- package/dist/services/verification-cache/adapters/filesystem.js.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.d.ts +27 -0
- package/dist/services/verification-cache/adapters/in-memory.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.js +46 -0
- package/dist/services/verification-cache/adapters/in-memory.js.map +1 -0
- package/dist/services/verification-cache/adapters/index.d.ts +3 -0
- package/dist/services/verification-cache/adapters/index.js +3 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.ts +49 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.ts.map +1 -0
- package/dist/services/verification-cache/adapters/workspace-state.js +91 -0
- package/dist/services/verification-cache/adapters/workspace-state.js.map +1 -0
- package/dist/services/verification-cache/cache-service.d.ts +70 -0
- package/dist/services/verification-cache/cache-service.d.ts.map +1 -0
- package/dist/services/verification-cache/cache-service.js +256 -0
- package/dist/services/verification-cache/cache-service.js.map +1 -0
- package/dist/services/verification-cache/index.d.ts +6 -0
- package/dist/services/verification-cache/index.js +6 -0
- package/dist/services/verification-cache/types.d.ts +124 -0
- package/dist/services/verification-cache/types.d.ts.map +1 -0
- package/dist/services/verification-cache/types.js +16 -0
- package/dist/services/verification-cache/types.js.map +1 -0
- package/dist/services/verify/ai-verifier.d.ts +25 -0
- package/dist/services/verify/ai-verifier.d.ts.map +1 -0
- package/dist/services/verify/ai-verifier.js +403 -0
- package/dist/services/verify/ai-verifier.js.map +1 -0
- package/dist/services/verify/behavior-verifier.d.ts +12 -0
- package/dist/services/verify/behavior-verifier.d.ts.map +1 -0
- package/dist/services/verify/behavior-verifier.js +186 -0
- package/dist/services/verify/behavior-verifier.js.map +1 -0
- package/dist/services/verify/index.d.ts +5 -0
- package/dist/services/verify/index.js +4 -0
- package/dist/services/verify/structure-verifier.d.ts +12 -0
- package/dist/services/verify/structure-verifier.d.ts.map +1 -0
- package/dist/services/verify/structure-verifier.js +196 -0
- package/dist/services/verify/structure-verifier.js.map +1 -0
- package/dist/services/verify/types.d.ts +137 -0
- package/dist/services/verify/types.d.ts.map +1 -0
- package/dist/services/verify/verify-service.d.ts +60 -0
- package/dist/services/verify/verify-service.d.ts.map +1 -0
- package/dist/services/verify/verify-service.js +204 -0
- package/dist/services/verify/verify-service.js.map +1 -0
- package/dist/services/watch.d.ts +25 -0
- package/dist/services/watch.d.ts.map +1 -0
- package/dist/services/watch.js +32 -0
- package/dist/services/watch.js.map +1 -0
- package/dist/services/workspace-info.d.ts +62 -0
- package/dist/services/workspace-info.d.ts.map +1 -0
- package/dist/services/workspace-info.js +103 -0
- package/dist/services/workspace-info.js.map +1 -0
- package/dist/templates/app-config.template.d.ts +7 -0
- package/dist/templates/app-config.template.d.ts.map +1 -0
- package/dist/templates/app-config.template.js +107 -0
- package/dist/templates/app-config.template.js.map +1 -0
- package/dist/templates/data-view.template.d.ts +7 -0
- package/dist/templates/data-view.template.d.ts.map +1 -0
- package/dist/templates/data-view.template.js +70 -0
- package/dist/templates/data-view.template.js.map +1 -0
- package/dist/templates/event.template.d.ts +11 -0
- package/dist/templates/event.template.d.ts.map +1 -0
- package/dist/templates/event.template.js +40 -0
- package/dist/templates/event.template.js.map +1 -0
- package/dist/templates/experiment.template.d.ts +7 -0
- package/dist/templates/experiment.template.d.ts.map +1 -0
- package/dist/templates/experiment.template.js +89 -0
- package/dist/templates/experiment.template.js.map +1 -0
- package/dist/templates/handler.template.d.ts +16 -0
- package/dist/templates/handler.template.d.ts.map +1 -0
- package/dist/templates/handler.template.js +100 -0
- package/dist/templates/handler.template.js.map +1 -0
- package/dist/templates/index.d.ts +21 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +37 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/integration.template.d.ts +7 -0
- package/dist/templates/integration.template.d.ts.map +1 -0
- package/dist/templates/integration.template.js +160 -0
- package/dist/templates/integration.template.js.map +1 -0
- package/dist/templates/knowledge.template.d.ts +7 -0
- package/dist/templates/knowledge.template.d.ts.map +1 -0
- package/dist/templates/knowledge.template.js +75 -0
- package/dist/templates/knowledge.template.js.map +1 -0
- package/dist/templates/migration.template.d.ts +7 -0
- package/dist/templates/migration.template.d.ts.map +1 -0
- package/dist/templates/migration.template.js +62 -0
- package/dist/templates/migration.template.js.map +1 -0
- package/dist/templates/operation.template.d.ts +11 -0
- package/dist/templates/operation.template.d.ts.map +1 -0
- package/dist/templates/operation.template.js +105 -0
- package/dist/templates/operation.template.js.map +1 -0
- package/dist/templates/presentation.template.d.ts +11 -0
- package/dist/templates/presentation.template.d.ts.map +1 -0
- package/dist/templates/presentation.template.js +80 -0
- package/dist/templates/presentation.template.js.map +1 -0
- package/dist/templates/telemetry.template.d.ts +7 -0
- package/dist/templates/telemetry.template.d.ts.map +1 -0
- package/dist/templates/telemetry.template.js +91 -0
- package/dist/templates/telemetry.template.js.map +1 -0
- package/dist/templates/workflow-runner.template.d.ts +16 -0
- package/dist/templates/workflow-runner.template.d.ts.map +1 -0
- package/dist/templates/workflow-runner.template.js +50 -0
- package/dist/templates/workflow-runner.template.js.map +1 -0
- package/dist/templates/workflow.template.d.ts +7 -0
- package/dist/templates/workflow.template.d.ts.map +1 -0
- package/dist/templates/workflow.template.js +69 -0
- package/dist/templates/workflow.template.js.map +1 -0
- package/dist/types/config.d.ts +34 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types.d.ts +324 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { generateCursorRules } from "../config-generators.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/setup/targets/cursor-rules.ts
|
|
4
|
+
/**
|
|
5
|
+
* Setup .cursor/rules/contractspec.mdc
|
|
6
|
+
*/
|
|
7
|
+
async function setupCursorRules(fs, options, prompts) {
|
|
8
|
+
const rulesDir = fs.join(options.workspaceRoot, ".cursor", "rules");
|
|
9
|
+
const filePath = fs.join(rulesDir, "contractspec.mdc");
|
|
10
|
+
try {
|
|
11
|
+
const cursorDir = fs.join(options.workspaceRoot, ".cursor");
|
|
12
|
+
if (!await fs.exists(cursorDir)) await fs.mkdir(cursorDir);
|
|
13
|
+
if (!await fs.exists(rulesDir)) await fs.mkdir(rulesDir);
|
|
14
|
+
const exists = await fs.exists(filePath);
|
|
15
|
+
const content = generateCursorRules(options);
|
|
16
|
+
if (exists) if (options.interactive) {
|
|
17
|
+
if (!await prompts.confirm(`${filePath} exists. Overwrite with latest rules?`)) return {
|
|
18
|
+
target: "cursor-rules",
|
|
19
|
+
filePath,
|
|
20
|
+
action: "skipped",
|
|
21
|
+
message: "User kept existing rules"
|
|
22
|
+
};
|
|
23
|
+
} else return {
|
|
24
|
+
target: "cursor-rules",
|
|
25
|
+
filePath,
|
|
26
|
+
action: "skipped",
|
|
27
|
+
message: "File already exists"
|
|
28
|
+
};
|
|
29
|
+
await fs.writeFile(filePath, content);
|
|
30
|
+
return {
|
|
31
|
+
target: "cursor-rules",
|
|
32
|
+
filePath,
|
|
33
|
+
action: exists ? "merged" : "created",
|
|
34
|
+
message: exists ? "Updated Cursor rules" : "Created Cursor rules"
|
|
35
|
+
};
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return {
|
|
38
|
+
target: "cursor-rules",
|
|
39
|
+
filePath,
|
|
40
|
+
action: "error",
|
|
41
|
+
message: error instanceof Error ? error.message : "Unknown error"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { setupCursorRules };
|
|
48
|
+
//# sourceMappingURL=cursor-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-rules.js","names":[],"sources":["../../../../src/services/setup/targets/cursor-rules.ts"],"sourcesContent":["/**\n * Cursor rules setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateCursorRules } from '../config-generators';\n\n/**\n * Setup .cursor/rules/contractspec.mdc\n */\nexport async function setupCursorRules(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const rulesDir = fs.join(options.workspaceRoot, '.cursor', 'rules');\n const filePath = fs.join(rulesDir, 'contractspec.mdc');\n\n try {\n // Ensure .cursor/rules directory exists\n const cursorDir = fs.join(options.workspaceRoot, '.cursor');\n if (!(await fs.exists(cursorDir))) {\n await fs.mkdir(cursorDir);\n }\n if (!(await fs.exists(rulesDir))) {\n await fs.mkdir(rulesDir);\n }\n\n const exists = await fs.exists(filePath);\n const content = generateCursorRules(options);\n\n if (exists) {\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Overwrite with latest rules?`\n );\n if (!proceed) {\n return {\n target: 'cursor-rules',\n filePath,\n action: 'skipped',\n message: 'User kept existing rules',\n };\n }\n } else {\n // Non-interactive: skip existing file\n return {\n target: 'cursor-rules',\n filePath,\n action: 'skipped',\n message: 'File already exists',\n };\n }\n }\n\n await fs.writeFile(filePath, content);\n return {\n target: 'cursor-rules',\n filePath,\n action: exists ? 'merged' : 'created',\n message: exists ? 'Updated Cursor rules' : 'Created Cursor rules',\n };\n } catch (error) {\n return {\n target: 'cursor-rules',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;AAeA,eAAsB,iBACpB,IACA,SACA,SAC0B;CAC1B,MAAM,WAAW,GAAG,KAAK,QAAQ,eAAe,WAAW,QAAQ;CACnE,MAAM,WAAW,GAAG,KAAK,UAAU,mBAAmB;AAEtD,KAAI;EAEF,MAAM,YAAY,GAAG,KAAK,QAAQ,eAAe,UAAU;AAC3D,MAAI,CAAE,MAAM,GAAG,OAAO,UAAU,CAC9B,OAAM,GAAG,MAAM,UAAU;AAE3B,MAAI,CAAE,MAAM,GAAG,OAAO,SAAS,CAC7B,OAAM,GAAG,MAAM,SAAS;EAG1B,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,UAAU,oBAAoB,QAAQ;AAE5C,MAAI,OACF,KAAI,QAAQ,aAIV;OAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,uCACb,CAEC,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;QAIH,QAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;AAIL,QAAM,GAAG,UAAU,UAAU,QAAQ;AACrC,SAAO;GACL,QAAQ;GACR;GACA,QAAQ,SAAS,WAAW;GAC5B,SAAS,SAAS,yBAAyB;GAC5C;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { generateClaudeMcpConfig, getClaudeDesktopConfigPath } from "../config-generators.js";
|
|
2
|
+
import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.js";
|
|
3
|
+
|
|
4
|
+
//#region src/services/setup/targets/mcp-claude.ts
|
|
5
|
+
/**
|
|
6
|
+
* Setup Claude Desktop MCP config.
|
|
7
|
+
* This modifies the user's global Claude config, so we're extra careful.
|
|
8
|
+
*/
|
|
9
|
+
async function setupMcpClaude(fs, options, prompts) {
|
|
10
|
+
const filePath = getClaudeDesktopConfigPath();
|
|
11
|
+
try {
|
|
12
|
+
const exists = await fs.exists(filePath);
|
|
13
|
+
const defaults = generateClaudeMcpConfig();
|
|
14
|
+
if (options.interactive) {
|
|
15
|
+
if (!await prompts.confirm(`Configure Claude Desktop at ${filePath}?`)) return {
|
|
16
|
+
target: "mcp-claude",
|
|
17
|
+
filePath,
|
|
18
|
+
action: "skipped",
|
|
19
|
+
message: "User skipped Claude Desktop configuration"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (exists) {
|
|
23
|
+
const existing = safeParseJson(await fs.readFile(filePath));
|
|
24
|
+
if (!existing) return {
|
|
25
|
+
target: "mcp-claude",
|
|
26
|
+
filePath,
|
|
27
|
+
action: "error",
|
|
28
|
+
message: "Existing file is not valid JSON"
|
|
29
|
+
};
|
|
30
|
+
const merged = deepMergePreserve(existing, defaults);
|
|
31
|
+
await fs.writeFile(filePath, formatJson(merged));
|
|
32
|
+
return {
|
|
33
|
+
target: "mcp-claude",
|
|
34
|
+
filePath,
|
|
35
|
+
action: "merged",
|
|
36
|
+
message: "Added ContractSpec to Claude Desktop"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const parentDir = filePath.substring(0, filePath.lastIndexOf("/"));
|
|
40
|
+
if (!await fs.exists(parentDir)) await fs.mkdir(parentDir);
|
|
41
|
+
await fs.writeFile(filePath, formatJson(defaults));
|
|
42
|
+
return {
|
|
43
|
+
target: "mcp-claude",
|
|
44
|
+
filePath,
|
|
45
|
+
action: "created",
|
|
46
|
+
message: "Created Claude Desktop configuration"
|
|
47
|
+
};
|
|
48
|
+
} catch (error) {
|
|
49
|
+
return {
|
|
50
|
+
target: "mcp-claude",
|
|
51
|
+
filePath,
|
|
52
|
+
action: "error",
|
|
53
|
+
message: error instanceof Error ? error.message : "Unknown error"
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { setupMcpClaude };
|
|
60
|
+
//# sourceMappingURL=mcp-claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-claude.js","names":[],"sources":["../../../../src/services/setup/targets/mcp-claude.ts"],"sourcesContent":["/**\n * Claude Desktop MCP setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport {\n generateClaudeMcpConfig,\n getClaudeDesktopConfigPath,\n} from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup Claude Desktop MCP config.\n * This modifies the user's global Claude config, so we're extra careful.\n */\nexport async function setupMcpClaude(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const filePath = getClaudeDesktopConfigPath();\n\n try {\n const exists = await fs.exists(filePath);\n const defaults = generateClaudeMcpConfig();\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `Configure Claude Desktop at ${filePath}?`\n );\n if (!proceed) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'skipped',\n message: 'User skipped Claude Desktop configuration',\n };\n }\n }\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'mcp-claude',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec to Claude Desktop',\n };\n }\n\n // Ensure parent directory exists\n const parentDir = filePath.substring(0, filePath.lastIndexOf('/'));\n const parentExists = await fs.exists(parentDir);\n if (!parentExists) {\n await fs.mkdir(parentDir);\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'mcp-claude',\n filePath,\n action: 'created',\n message: 'Created Claude Desktop configuration',\n };\n } catch (error) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;AAoBA,eAAsB,eACpB,IACA,SACA,SAC0B;CAC1B,MAAM,WAAW,4BAA4B;AAE7C,KAAI;EACF,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,yBAAyB;AAE1C,MAAI,QAAQ,aAIV;OAAI,CAHY,MAAM,QAAQ,QAC5B,+BAA+B,SAAS,GACzC,CAEC,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAIL,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;GAGH,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;EAIH,MAAM,YAAY,SAAS,UAAU,GAAG,SAAS,YAAY,IAAI,CAAC;AAElE,MAAI,CADiB,MAAM,GAAG,OAAO,UAAU,CAE7C,OAAM,GAAG,MAAM,UAAU;AAG3B,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { generateCursorMcpConfig } from "../config-generators.js";
|
|
2
|
+
import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.js";
|
|
3
|
+
|
|
4
|
+
//#region src/services/setup/targets/mcp-cursor.ts
|
|
5
|
+
/**
|
|
6
|
+
* Setup .cursor/mcp.json
|
|
7
|
+
*/
|
|
8
|
+
async function setupMcpCursor(fs, options, prompts) {
|
|
9
|
+
const dirPath = fs.join(options.workspaceRoot, ".cursor");
|
|
10
|
+
const filePath = fs.join(dirPath, "mcp.json");
|
|
11
|
+
try {
|
|
12
|
+
if (!await fs.exists(dirPath)) await fs.mkdir(dirPath);
|
|
13
|
+
const exists = await fs.exists(filePath);
|
|
14
|
+
const defaults = generateCursorMcpConfig();
|
|
15
|
+
if (exists) {
|
|
16
|
+
const existing = safeParseJson(await fs.readFile(filePath));
|
|
17
|
+
if (!existing) return {
|
|
18
|
+
target: "mcp-cursor",
|
|
19
|
+
filePath,
|
|
20
|
+
action: "error",
|
|
21
|
+
message: "Existing file is not valid JSON"
|
|
22
|
+
};
|
|
23
|
+
if (options.interactive) {
|
|
24
|
+
if (!await prompts.confirm(`${filePath} exists. Add ContractSpec MCP server?`)) return {
|
|
25
|
+
target: "mcp-cursor",
|
|
26
|
+
filePath,
|
|
27
|
+
action: "skipped",
|
|
28
|
+
message: "User skipped merge"
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const merged = deepMergePreserve(existing, defaults);
|
|
32
|
+
await fs.writeFile(filePath, formatJson(merged));
|
|
33
|
+
return {
|
|
34
|
+
target: "mcp-cursor",
|
|
35
|
+
filePath,
|
|
36
|
+
action: "merged",
|
|
37
|
+
message: "Added ContractSpec MCP server"
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
await fs.writeFile(filePath, formatJson(defaults));
|
|
41
|
+
return {
|
|
42
|
+
target: "mcp-cursor",
|
|
43
|
+
filePath,
|
|
44
|
+
action: "created",
|
|
45
|
+
message: "Created Cursor MCP configuration"
|
|
46
|
+
};
|
|
47
|
+
} catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
target: "mcp-cursor",
|
|
50
|
+
filePath,
|
|
51
|
+
action: "error",
|
|
52
|
+
message: error instanceof Error ? error.message : "Unknown error"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { setupMcpCursor };
|
|
59
|
+
//# sourceMappingURL=mcp-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-cursor.js","names":[],"sources":["../../../../src/services/setup/targets/mcp-cursor.ts"],"sourcesContent":["/**\n * Cursor MCP setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateCursorMcpConfig } from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup .cursor/mcp.json\n */\nexport async function setupMcpCursor(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const dirPath = fs.join(options.workspaceRoot, '.cursor');\n const filePath = fs.join(dirPath, 'mcp.json');\n\n try {\n // Ensure .cursor directory exists\n const dirExists = await fs.exists(dirPath);\n if (!dirExists) {\n await fs.mkdir(dirPath);\n }\n\n const exists = await fs.exists(filePath);\n const defaults = generateCursorMcpConfig();\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Add ContractSpec MCP server?`\n );\n if (!proceed) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'skipped',\n message: 'User skipped merge',\n };\n }\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec MCP server',\n };\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'created',\n message: 'Created Cursor MCP configuration',\n };\n } catch (error) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;AAgBA,eAAsB,eACpB,IACA,SACA,SAC0B;CAC1B,MAAM,UAAU,GAAG,KAAK,QAAQ,eAAe,UAAU;CACzD,MAAM,WAAW,GAAG,KAAK,SAAS,WAAW;AAE7C,KAAI;AAGF,MAAI,CADc,MAAM,GAAG,OAAO,QAAQ,CAExC,OAAM,GAAG,MAAM,QAAQ;EAGzB,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,yBAAyB;AAE1C,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;AAGH,OAAI,QAAQ,aAIV;QAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,uCACb,CAEC,QAAO;KACL,QAAQ;KACR;KACA,QAAQ;KACR,SAAS;KACV;;GAIL,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAGH,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { generateVscodeSettings } from "../config-generators.js";
|
|
2
|
+
import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.js";
|
|
3
|
+
|
|
4
|
+
//#region src/services/setup/targets/vscode-settings.ts
|
|
5
|
+
/**
|
|
6
|
+
* Setup .vscode/settings.json
|
|
7
|
+
*
|
|
8
|
+
* VS Code settings are typically at workspace root, but in monorepo
|
|
9
|
+
* with package scope, can be at package root.
|
|
10
|
+
*/
|
|
11
|
+
async function setupVscodeSettings(fs, options, prompts) {
|
|
12
|
+
const targetRoot = options.isMonorepo && options.scope === "package" ? options.packageRoot ?? options.workspaceRoot : options.workspaceRoot;
|
|
13
|
+
const dirPath = fs.join(targetRoot, ".vscode");
|
|
14
|
+
const filePath = fs.join(dirPath, "settings.json");
|
|
15
|
+
try {
|
|
16
|
+
if (!await fs.exists(dirPath)) await fs.mkdir(dirPath);
|
|
17
|
+
const exists = await fs.exists(filePath);
|
|
18
|
+
const defaults = generateVscodeSettings();
|
|
19
|
+
if (exists) {
|
|
20
|
+
const existing = safeParseJson(await fs.readFile(filePath));
|
|
21
|
+
if (!existing) return {
|
|
22
|
+
target: "vscode-settings",
|
|
23
|
+
filePath,
|
|
24
|
+
action: "error",
|
|
25
|
+
message: "Existing file is not valid JSON"
|
|
26
|
+
};
|
|
27
|
+
if (options.interactive) {
|
|
28
|
+
if (!await prompts.confirm(`${filePath} exists. Add ContractSpec settings?`)) return {
|
|
29
|
+
target: "vscode-settings",
|
|
30
|
+
filePath,
|
|
31
|
+
action: "skipped",
|
|
32
|
+
message: "User skipped merge"
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const merged = deepMergePreserve(existing, defaults);
|
|
36
|
+
await fs.writeFile(filePath, formatJson(merged));
|
|
37
|
+
return {
|
|
38
|
+
target: "vscode-settings",
|
|
39
|
+
filePath,
|
|
40
|
+
action: "merged",
|
|
41
|
+
message: "Added ContractSpec settings"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
await fs.writeFile(filePath, formatJson(defaults));
|
|
45
|
+
return {
|
|
46
|
+
target: "vscode-settings",
|
|
47
|
+
filePath,
|
|
48
|
+
action: "created",
|
|
49
|
+
message: "Created VS Code settings"
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
return {
|
|
53
|
+
target: "vscode-settings",
|
|
54
|
+
filePath,
|
|
55
|
+
action: "error",
|
|
56
|
+
message: error instanceof Error ? error.message : "Unknown error"
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { setupVscodeSettings };
|
|
63
|
+
//# sourceMappingURL=vscode-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode-settings.js","names":[],"sources":["../../../../src/services/setup/targets/vscode-settings.ts"],"sourcesContent":["/**\n * VS Code settings setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateVscodeSettings } from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup .vscode/settings.json\n *\n * VS Code settings are typically at workspace root, but in monorepo\n * with package scope, can be at package root.\n */\nexport async function setupVscodeSettings(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n // VS Code settings typically stay at workspace root\n // but can be at package root if specifically requested\n const targetRoot =\n options.isMonorepo && options.scope === 'package'\n ? (options.packageRoot ?? options.workspaceRoot)\n : options.workspaceRoot;\n\n const dirPath = fs.join(targetRoot, '.vscode');\n const filePath = fs.join(dirPath, 'settings.json');\n\n try {\n // Ensure .vscode directory exists\n const dirExists = await fs.exists(dirPath);\n if (!dirExists) {\n await fs.mkdir(dirPath);\n }\n\n const exists = await fs.exists(filePath);\n const defaults = generateVscodeSettings();\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Add ContractSpec settings?`\n );\n if (!proceed) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'skipped',\n message: 'User skipped merge',\n };\n }\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'vscode-settings',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec settings',\n };\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'vscode-settings',\n filePath,\n action: 'created',\n message: 'Created VS Code settings',\n };\n } catch (error) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAmBA,eAAsB,oBACpB,IACA,SACA,SAC0B;CAG1B,MAAM,aACJ,QAAQ,cAAc,QAAQ,UAAU,YACnC,QAAQ,eAAe,QAAQ,gBAChC,QAAQ;CAEd,MAAM,UAAU,GAAG,KAAK,YAAY,UAAU;CAC9C,MAAM,WAAW,GAAG,KAAK,SAAS,gBAAgB;AAElD,KAAI;AAGF,MAAI,CADc,MAAM,GAAG,OAAO,QAAQ,CAExC,OAAM,GAAG,MAAM,QAAQ;EAGzB,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,wBAAwB;AAEzC,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;AAGH,OAAI,QAAQ,aAIV;QAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,qCACb,CAEC,QAAO;KACL,QAAQ;KACR;KACA,QAAQ;KACR,SAAS;KACV;;GAIL,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAGH,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//#region src/services/setup/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Setup service types.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Target components that can be configured during setup.
|
|
7
|
+
*/
|
|
8
|
+
type SetupTarget = 'cli-config' | 'vscode-settings' | 'mcp-cursor' | 'mcp-claude' | 'cursor-rules' | 'agents-md';
|
|
9
|
+
/**
|
|
10
|
+
* All available setup targets.
|
|
11
|
+
*/
|
|
12
|
+
declare const ALL_SETUP_TARGETS: SetupTarget[];
|
|
13
|
+
/**
|
|
14
|
+
* Human-readable labels for setup targets.
|
|
15
|
+
*/
|
|
16
|
+
declare const SETUP_TARGET_LABELS: Record<SetupTarget, string>;
|
|
17
|
+
/**
|
|
18
|
+
* Scope of configuration in a monorepo.
|
|
19
|
+
*/
|
|
20
|
+
type SetupScope = 'workspace' | 'package';
|
|
21
|
+
/**
|
|
22
|
+
* Options for the setup service.
|
|
23
|
+
*/
|
|
24
|
+
interface SetupOptions {
|
|
25
|
+
/** Root directory of the workspace (monorepo root or single project root). */
|
|
26
|
+
workspaceRoot: string;
|
|
27
|
+
/** Current package root (may differ from workspaceRoot in monorepos). */
|
|
28
|
+
packageRoot?: string;
|
|
29
|
+
/** Whether this is a monorepo. */
|
|
30
|
+
isMonorepo?: boolean;
|
|
31
|
+
/** Where to create config: workspace level or package level. */
|
|
32
|
+
scope?: SetupScope;
|
|
33
|
+
/** Current package name (if in a monorepo package). */
|
|
34
|
+
packageName?: string;
|
|
35
|
+
/** If true, skip prompts and use defaults. */
|
|
36
|
+
interactive: boolean;
|
|
37
|
+
/** Specific targets to configure (defaults to all). */
|
|
38
|
+
targets: SetupTarget[];
|
|
39
|
+
/** Project name (defaults to directory name). */
|
|
40
|
+
projectName?: string;
|
|
41
|
+
/** Default code owners. */
|
|
42
|
+
defaultOwners?: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of a single file setup operation.
|
|
46
|
+
*/
|
|
47
|
+
interface SetupFileResult {
|
|
48
|
+
/** Target that was configured. */
|
|
49
|
+
target: SetupTarget;
|
|
50
|
+
/** File path that was created or modified. */
|
|
51
|
+
filePath: string;
|
|
52
|
+
/** Action taken. */
|
|
53
|
+
action: 'created' | 'merged' | 'skipped' | 'error';
|
|
54
|
+
/** Message describing what happened. */
|
|
55
|
+
message: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Full result of the setup operation.
|
|
59
|
+
*/
|
|
60
|
+
interface SetupResult {
|
|
61
|
+
/** Whether all operations succeeded. */
|
|
62
|
+
success: boolean;
|
|
63
|
+
/** Results for each file. */
|
|
64
|
+
files: SetupFileResult[];
|
|
65
|
+
/** Summary message. */
|
|
66
|
+
summary: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Callback for interactive prompts during setup.
|
|
70
|
+
*/
|
|
71
|
+
interface SetupPromptCallbacks {
|
|
72
|
+
/** Confirm an action. */
|
|
73
|
+
confirm: (message: string) => Promise<boolean>;
|
|
74
|
+
/** Select multiple options. */
|
|
75
|
+
multiSelect: <T extends string>(message: string, options: {
|
|
76
|
+
value: T;
|
|
77
|
+
label: string;
|
|
78
|
+
selected?: boolean;
|
|
79
|
+
}[]) => Promise<T[]>;
|
|
80
|
+
/** Input a string value. */
|
|
81
|
+
input: (message: string, defaultValue?: string) => Promise<string>;
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget };
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/setup/types.ts"],"sourcesContent":[],"mappings":";;AAOA;AAWA;AAYA;AAYA;AAKA;AAwBiB,KAhEL,WAAA,GAgEoB,YAEtB,GAAA,iBAAW,GAAA,YAAA,GAAA,YAAA,GAAA,cAAA,GAAA,WAAA;AAYrB;AAYA;;AAMsB,cArFT,iBAqFS,EArFU,WAqFV,EAAA;;;;AAGsC,cA5E/C,mBA4E+C,EA5E1B,MA4E0B,CA5EnB,WA4EmB,EAAA,MAAA,CAAA;;;;KAhEhD,UAAA;;;;UAKK,YAAA;;;;;;;;UAQP;;;;;;WAMC;;;;;;;;;UAUM,eAAA;;UAEP;;;;;;;;;;;UAYO,WAAA;;;;SAIR;;;;;;;UAQQ,oBAAA;;gCAEe;;;WAIV;;;UACf,QAAQ;;qDAEsC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/services/setup/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* All available setup targets.
|
|
4
|
+
*/
|
|
5
|
+
const ALL_SETUP_TARGETS = [
|
|
6
|
+
"cli-config",
|
|
7
|
+
"vscode-settings",
|
|
8
|
+
"mcp-cursor",
|
|
9
|
+
"mcp-claude",
|
|
10
|
+
"cursor-rules",
|
|
11
|
+
"agents-md"
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Human-readable labels for setup targets.
|
|
15
|
+
*/
|
|
16
|
+
const SETUP_TARGET_LABELS = {
|
|
17
|
+
"cli-config": "CLI Configuration (.contractsrc.json)",
|
|
18
|
+
"vscode-settings": "VS Code Settings (.vscode/settings.json)",
|
|
19
|
+
"mcp-cursor": "MCP for Cursor (.cursor/mcp.json)",
|
|
20
|
+
"mcp-claude": "MCP for Claude Desktop",
|
|
21
|
+
"cursor-rules": "Cursor AI Rules (.cursor/rules/)",
|
|
22
|
+
"agents-md": "Project AI Guide (AGENTS.md)"
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS };
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":["ALL_SETUP_TARGETS: SetupTarget[]","SETUP_TARGET_LABELS: Record<SetupTarget, string>"],"sources":["../../../src/services/setup/types.ts"],"sourcesContent":["/**\n * Setup service types.\n */\n\n/**\n * Target components that can be configured during setup.\n */\nexport type SetupTarget =\n | 'cli-config'\n | 'vscode-settings'\n | 'mcp-cursor'\n | 'mcp-claude'\n | 'cursor-rules'\n | 'agents-md';\n\n/**\n * All available setup targets.\n */\nexport const ALL_SETUP_TARGETS: SetupTarget[] = [\n 'cli-config',\n 'vscode-settings',\n 'mcp-cursor',\n 'mcp-claude',\n 'cursor-rules',\n 'agents-md',\n];\n\n/**\n * Human-readable labels for setup targets.\n */\nexport const SETUP_TARGET_LABELS: Record<SetupTarget, string> = {\n 'cli-config': 'CLI Configuration (.contractsrc.json)',\n 'vscode-settings': 'VS Code Settings (.vscode/settings.json)',\n 'mcp-cursor': 'MCP for Cursor (.cursor/mcp.json)',\n 'mcp-claude': 'MCP for Claude Desktop',\n 'cursor-rules': 'Cursor AI Rules (.cursor/rules/)',\n 'agents-md': 'Project AI Guide (AGENTS.md)',\n};\n\n/**\n * Scope of configuration in a monorepo.\n */\nexport type SetupScope = 'workspace' | 'package';\n\n/**\n * Options for the setup service.\n */\nexport interface SetupOptions {\n /** Root directory of the workspace (monorepo root or single project root). */\n workspaceRoot: string;\n /** Current package root (may differ from workspaceRoot in monorepos). */\n packageRoot?: string;\n /** Whether this is a monorepo. */\n isMonorepo?: boolean;\n /** Where to create config: workspace level or package level. */\n scope?: SetupScope;\n /** Current package name (if in a monorepo package). */\n packageName?: string;\n /** If true, skip prompts and use defaults. */\n interactive: boolean;\n /** Specific targets to configure (defaults to all). */\n targets: SetupTarget[];\n /** Project name (defaults to directory name). */\n projectName?: string;\n /** Default code owners. */\n defaultOwners?: string[];\n}\n\n/**\n * Result of a single file setup operation.\n */\nexport interface SetupFileResult {\n /** Target that was configured. */\n target: SetupTarget;\n /** File path that was created or modified. */\n filePath: string;\n /** Action taken. */\n action: 'created' | 'merged' | 'skipped' | 'error';\n /** Message describing what happened. */\n message: string;\n}\n\n/**\n * Full result of the setup operation.\n */\nexport interface SetupResult {\n /** Whether all operations succeeded. */\n success: boolean;\n /** Results for each file. */\n files: SetupFileResult[];\n /** Summary message. */\n summary: string;\n}\n\n/**\n * Callback for interactive prompts during setup.\n */\nexport interface SetupPromptCallbacks {\n /** Confirm an action. */\n confirm: (message: string) => Promise<boolean>;\n /** Select multiple options. */\n multiSelect: <T extends string>(\n message: string,\n options: { value: T; label: string; selected?: boolean }[]\n ) => Promise<T[]>;\n /** Input a string value. */\n input: (message: string, defaultValue?: string) => Promise<string>;\n}\n"],"mappings":";;;;AAkBA,MAAaA,oBAAmC;CAC9C;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAaC,sBAAmD;CAC9D,cAAc;CACd,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,aAAa;CACd"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.js";
|
|
2
|
+
import { LoggerAdapter } from "../ports/logger.js";
|
|
3
|
+
import { ValidateSpecResult } from "./validate.js";
|
|
4
|
+
import { BuildSpecOptions } from "./build.js";
|
|
5
|
+
import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
6
|
+
|
|
7
|
+
//#region src/services/sync.d.ts
|
|
8
|
+
|
|
9
|
+
interface SyncSpecsOptions {
|
|
10
|
+
pattern?: string;
|
|
11
|
+
outputDirs?: (string | undefined)[];
|
|
12
|
+
validate?: boolean;
|
|
13
|
+
buildOptions?: Omit<BuildSpecOptions, 'outputDir'>;
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface SyncSpecsRunResult {
|
|
17
|
+
specPath: string;
|
|
18
|
+
outputDir?: string;
|
|
19
|
+
validation?: ValidateSpecResult;
|
|
20
|
+
build?: unknown;
|
|
21
|
+
error?: {
|
|
22
|
+
phase: 'validate' | 'build';
|
|
23
|
+
message: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
interface SyncSpecsResult {
|
|
27
|
+
specs: string[];
|
|
28
|
+
runs: SyncSpecsRunResult[];
|
|
29
|
+
}
|
|
30
|
+
type SyncBuildFn<B> = (specPath: string, outputDir: string | undefined) => Promise<B>;
|
|
31
|
+
type SyncValidateFn = (specPath: string) => Promise<ValidateSpecResult>;
|
|
32
|
+
declare function syncSpecs(adapters: {
|
|
33
|
+
fs: FsAdapter;
|
|
34
|
+
logger: LoggerAdapter;
|
|
35
|
+
}, config: WorkspaceConfig, options?: SyncSpecsOptions, overrides?: {
|
|
36
|
+
build?: SyncBuildFn<unknown>;
|
|
37
|
+
validate?: SyncValidateFn;
|
|
38
|
+
}): Promise<SyncSpecsResult>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, syncSpecs };
|
|
41
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","names":[],"sources":["../../src/services/sync.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA0CY,UA7BK,gBAAA,CA6B0C;EAErC,OAAA,CAAA,EAAA,MAAS;EACb,UAAA,CAAA,EAAA,CAAA,MAAA,GAAA,SAAA,CAAA,EAAA;EAAmB,QAAA,CAAA,EAAA,OAAA;EAC3B,YAAA,CAAA,EA7BO,IA6BP,CA7BY,gBA6BZ,EAAA,WAAA,CAAA;EACC,MAAA,CAAA,EAAA,OAAA;;AAGI,UA7BE,kBAAA,CA6BF;EAEJ,QAAA,EAAA,MAAA;EAAR,SAAA,CAAA,EAAA,MAAA;EAAO,UAAA,CAAA,EA5BK,kBA4BL;;;;;;;UApBO,eAAA;;QAET;;KAGI,sEAGP,QAAQ;KAED,cAAA,yBAAuC,QAAQ;iBAErC,SAAA;MACJ;UAAmB;WAC3B,2BACC;UAEC;aACG;IAEZ,QAAQ"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { validateSpec } from "./validate.js";
|
|
2
|
+
import { buildSpec } from "./build.js";
|
|
3
|
+
|
|
4
|
+
//#region src/services/sync.ts
|
|
5
|
+
async function syncSpecs(adapters, config, options = {}, overrides) {
|
|
6
|
+
const { fs, logger } = adapters;
|
|
7
|
+
const specs = await fs.glob({ pattern: options.pattern });
|
|
8
|
+
const outputDirs = options.outputDirs?.length ? options.outputDirs : [void 0];
|
|
9
|
+
const runs = [];
|
|
10
|
+
const validateFn = overrides?.validate ?? ((specPath) => validateSpec(specPath, {
|
|
11
|
+
fs,
|
|
12
|
+
logger
|
|
13
|
+
}));
|
|
14
|
+
const buildFn = overrides?.build ?? ((specPath, outputDir) => buildSpec(specPath, {
|
|
15
|
+
fs,
|
|
16
|
+
logger
|
|
17
|
+
}, outputDir ? {
|
|
18
|
+
...config,
|
|
19
|
+
outputDir
|
|
20
|
+
} : config, {
|
|
21
|
+
...options.buildOptions ?? {},
|
|
22
|
+
outputDir
|
|
23
|
+
}));
|
|
24
|
+
for (const specPath of specs) for (const outputDir of outputDirs) {
|
|
25
|
+
const run = {
|
|
26
|
+
specPath,
|
|
27
|
+
outputDir
|
|
28
|
+
};
|
|
29
|
+
if (options.validate) try {
|
|
30
|
+
run.validation = await validateFn(specPath);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
run.error = {
|
|
33
|
+
phase: "validate",
|
|
34
|
+
message: error instanceof Error ? error.message : String(error)
|
|
35
|
+
};
|
|
36
|
+
runs.push(run);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!options.dryRun) try {
|
|
40
|
+
run.build = await buildFn(specPath, outputDir);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
run.error = {
|
|
43
|
+
phase: "build",
|
|
44
|
+
message: error instanceof Error ? error.message : String(error)
|
|
45
|
+
};
|
|
46
|
+
runs.push(run);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
else logger.info("[dry-run] syncSpecs skipped build", {
|
|
50
|
+
specPath,
|
|
51
|
+
outputDir
|
|
52
|
+
});
|
|
53
|
+
runs.push(run);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
specs,
|
|
57
|
+
runs
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { syncSpecs };
|
|
63
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","names":["runs: SyncSpecsRunResult[]","validateFn: SyncValidateFn","buildFn: SyncBuildFn<unknown>","run: SyncSpecsRunResult"],"sources":["../../src/services/sync.ts"],"sourcesContent":["/**\n * Sync service.\n *\n * Build (and optionally validate) all discovered specs, optionally repeating into\n * multiple output buckets (./generated/<bucket>/ or any output dir).\n */\n\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\nimport type { LoggerAdapter } from '../ports/logger';\nimport { buildSpec, type BuildSpecOptions } from './build';\nimport { validateSpec, type ValidateSpecResult } from './validate';\n\nexport interface SyncSpecsOptions {\n pattern?: string;\n outputDirs?: (string | undefined)[];\n validate?: boolean;\n buildOptions?: Omit<BuildSpecOptions, 'outputDir'>;\n dryRun?: boolean;\n}\n\nexport interface SyncSpecsRunResult {\n specPath: string;\n outputDir?: string;\n validation?: ValidateSpecResult;\n build?: unknown;\n error?: {\n phase: 'validate' | 'build';\n message: string;\n };\n}\n\nexport interface SyncSpecsResult {\n specs: string[];\n runs: SyncSpecsRunResult[];\n}\n\nexport type SyncBuildFn<B> = (\n specPath: string,\n outputDir: string | undefined\n) => Promise<B>;\n\nexport type SyncValidateFn = (specPath: string) => Promise<ValidateSpecResult>;\n\nexport async function syncSpecs(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n config: WorkspaceConfig,\n options: SyncSpecsOptions = {},\n overrides?: {\n build?: SyncBuildFn<unknown>;\n validate?: SyncValidateFn;\n }\n): Promise<SyncSpecsResult> {\n const { fs, logger } = adapters;\n\n const specs = await fs.glob({ pattern: options.pattern });\n const outputDirs = options.outputDirs?.length\n ? options.outputDirs\n : [undefined];\n\n const runs: SyncSpecsRunResult[] = [];\n\n const validateFn: SyncValidateFn =\n overrides?.validate ??\n ((specPath) => validateSpec(specPath, { fs, logger }));\n\n const buildFn: SyncBuildFn<unknown> =\n overrides?.build ??\n ((specPath, outputDir) =>\n buildSpec(\n specPath,\n { fs, logger },\n outputDir ? { ...config, outputDir } : config,\n { ...(options.buildOptions ?? {}), outputDir }\n ));\n\n for (const specPath of specs) {\n for (const outputDir of outputDirs) {\n const run: SyncSpecsRunResult = { specPath, outputDir };\n\n if (options.validate) {\n try {\n run.validation = await validateFn(specPath);\n } catch (error) {\n run.error = {\n phase: 'validate',\n message: error instanceof Error ? error.message : String(error),\n };\n runs.push(run);\n continue;\n }\n }\n\n if (!options.dryRun) {\n try {\n run.build = await buildFn(specPath, outputDir);\n } catch (error) {\n run.error = {\n phase: 'build',\n message: error instanceof Error ? error.message : String(error),\n };\n runs.push(run);\n continue;\n }\n } else {\n logger.info('[dry-run] syncSpecs skipped build', {\n specPath,\n outputDir,\n });\n }\n\n runs.push(run);\n }\n }\n\n return { specs, runs };\n}\n"],"mappings":";;;;AA4CA,eAAsB,UACpB,UACA,QACA,UAA4B,EAAE,EAC9B,WAI0B;CAC1B,MAAM,EAAE,IAAI,WAAW;CAEvB,MAAM,QAAQ,MAAM,GAAG,KAAK,EAAE,SAAS,QAAQ,SAAS,CAAC;CACzD,MAAM,aAAa,QAAQ,YAAY,SACnC,QAAQ,aACR,CAAC,OAAU;CAEf,MAAMA,OAA6B,EAAE;CAErC,MAAMC,aACJ,WAAW,cACT,aAAa,aAAa,UAAU;EAAE;EAAI;EAAQ,CAAC;CAEvD,MAAMC,UACJ,WAAW,WACT,UAAU,cACV,UACE,UACA;EAAE;EAAI;EAAQ,EACd,YAAY;EAAE,GAAG;EAAQ;EAAW,GAAG,QACvC;EAAE,GAAI,QAAQ,gBAAgB,EAAE;EAAG;EAAW,CAC/C;AAEL,MAAK,MAAM,YAAY,MACrB,MAAK,MAAM,aAAa,YAAY;EAClC,MAAMC,MAA0B;GAAE;GAAU;GAAW;AAEvD,MAAI,QAAQ,SACV,KAAI;AACF,OAAI,aAAa,MAAM,WAAW,SAAS;WACpC,OAAO;AACd,OAAI,QAAQ;IACV,OAAO;IACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAChE;AACD,QAAK,KAAK,IAAI;AACd;;AAIJ,MAAI,CAAC,QAAQ,OACX,KAAI;AACF,OAAI,QAAQ,MAAM,QAAQ,UAAU,UAAU;WACvC,OAAO;AACd,OAAI,QAAQ;IACV,OAAO;IACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAChE;AACD,QAAK,KAAK,IAAI;AACd;;MAGF,QAAO,KAAK,qCAAqC;GAC/C;GACA;GACD,CAAC;AAGJ,OAAK,KAAK,IAAI;;AAIlB,QAAO;EAAE;EAAO;EAAM"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OperationSpecRegistry } from "@contractspec/lib.contracts";
|
|
2
|
+
import { TestRunner, TestSpec } from "@contractspec/lib.contracts/tests";
|
|
3
|
+
|
|
4
|
+
//#region src/services/test.d.ts
|
|
5
|
+
|
|
6
|
+
type TestRunResult = Awaited<ReturnType<TestRunner['run']>>;
|
|
7
|
+
interface RunTestsResult {
|
|
8
|
+
results: TestRunResult[];
|
|
9
|
+
passed: number;
|
|
10
|
+
failed: number;
|
|
11
|
+
}
|
|
12
|
+
declare function runTests(specs: TestSpec[], registry: OperationSpecRegistry): Promise<RunTestsResult>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { RunTestsResult, TestRunResult, runTests };
|
|
15
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","names":[],"sources":["../../src/services/test.ts"],"sourcesContent":[],"mappings":";;;;;AAUmC,KAAvB,aAAA,GAAgB,OAAO,CAAC,UAAD,CAAY,UAAZ,CAAA,KAAA,CAAA,CAAA,CAAA;AAElB,UAAA,cAAA,CAAc;EAMT,OAAA,EALX,aAKmB,EAAA;EACrB,MAAA,EAAA,MAAA;EACG,MAAA,EAAA,MAAA;;AACT,iBAHmB,QAAA,CAGnB,KAAA,EAFM,QAEN,EAAA,EAAA,QAAA,EADS,qBACT,CAAA,EAAA,OAAA,CAAQ,cAAR,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { TestRunner } from "@contractspec/lib.contracts/tests";
|
|
2
|
+
|
|
3
|
+
//#region src/services/test.ts
|
|
4
|
+
/**
|
|
5
|
+
* Test service.
|
|
6
|
+
*
|
|
7
|
+
* Pure runner wrapper that executes TestSpec scenarios against a OperationSpecRegistry.
|
|
8
|
+
* Loading/compiling spec modules (TS/ESM) is intentionally left to the caller.
|
|
9
|
+
*/
|
|
10
|
+
async function runTests(specs, registry) {
|
|
11
|
+
const runner = new TestRunner({ registry });
|
|
12
|
+
const results = [];
|
|
13
|
+
let passed = 0;
|
|
14
|
+
let failed = 0;
|
|
15
|
+
for (const spec of specs) {
|
|
16
|
+
const result = await runner.run(spec);
|
|
17
|
+
results.push(result);
|
|
18
|
+
passed += result.passed;
|
|
19
|
+
failed += result.failed;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
results,
|
|
23
|
+
passed,
|
|
24
|
+
failed
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { runTests };
|
|
30
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","names":["results: TestRunResult[]"],"sources":["../../src/services/test.ts"],"sourcesContent":["/**\n * Test service.\n *\n * Pure runner wrapper that executes TestSpec scenarios against a OperationSpecRegistry.\n * Loading/compiling spec modules (TS/ESM) is intentionally left to the caller.\n */\n\nimport { TestRunner, type TestSpec } from '@contractspec/lib.contracts/tests';\nimport type { OperationSpecRegistry } from '@contractspec/lib.contracts';\n\nexport type TestRunResult = Awaited<ReturnType<TestRunner['run']>>;\n\nexport interface RunTestsResult {\n results: TestRunResult[];\n passed: number;\n failed: number;\n}\n\nexport async function runTests(\n specs: TestSpec[],\n registry: OperationSpecRegistry\n): Promise<RunTestsResult> {\n const runner = new TestRunner({ registry });\n\n const results: TestRunResult[] = [];\n let passed = 0;\n let failed = 0;\n\n for (const spec of specs) {\n const result = await runner.run(spec);\n results.push(result);\n passed += result.passed;\n failed += result.failed;\n }\n\n return { results, passed, failed };\n}\n"],"mappings":";;;;;;;;;AAkBA,eAAsB,SACpB,OACA,UACyB;CACzB,MAAM,SAAS,IAAI,WAAW,EAAE,UAAU,CAAC;CAE3C,MAAMA,UAA2B,EAAE;CACnC,IAAI,SAAS;CACb,IAAI,SAAS;AAEb,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,MAAM,OAAO,IAAI,KAAK;AACrC,UAAQ,KAAK,OAAO;AACpB,YAAU,OAAO;AACjB,YAAU,OAAO;;AAGnB,QAAO;EAAE;EAAS;EAAQ;EAAQ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.js";
|
|
2
|
+
import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
3
|
+
|
|
4
|
+
//#region src/services/validate-implementation.d.ts
|
|
5
|
+
|
|
6
|
+
interface ValidateImplementationOptions {
|
|
7
|
+
checkHandlers?: boolean;
|
|
8
|
+
checkTests?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Override workspace outputDir (defaults to config.outputDir).
|
|
11
|
+
*/
|
|
12
|
+
outputDir?: string;
|
|
13
|
+
}
|
|
14
|
+
interface ValidateImplementationResult {
|
|
15
|
+
valid: boolean;
|
|
16
|
+
errors: string[];
|
|
17
|
+
warnings: string[];
|
|
18
|
+
expected: {
|
|
19
|
+
handlerPath?: string;
|
|
20
|
+
handlerTestPath?: string;
|
|
21
|
+
componentPath?: string;
|
|
22
|
+
componentTestPath?: string;
|
|
23
|
+
formPath?: string;
|
|
24
|
+
formTestPath?: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
declare function validateImplementationFiles(specFile: string, adapters: {
|
|
28
|
+
fs: FsAdapter;
|
|
29
|
+
}, config: WorkspaceConfig, options?: ValidateImplementationOptions): Promise<ValidateImplementationResult>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ValidateImplementationOptions, ValidateImplementationResult, validateImplementationFiles };
|
|
32
|
+
//# sourceMappingURL=validate-implementation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-implementation.d.ts","names":[],"sources":["../../src/services/validate-implementation.ts"],"sourcesContent":[],"mappings":";;;;;AAoDU,UAzCO,6BAAA,CAyCP;EACC,aAAA,CAAA,EAAA,OAAA;EACA,UAAA,CAAA,EAAA,OAAA;EAAR;;;;;UAlCc,4BAAA;;;;;;;;;;;;;iBA6BK,2BAAA;MAEJ;WACR,2BACC,gCACR,QAAQ"}
|