@lssm/bundle.contractspec-workspace 1.41.1 → 1.42.1
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 +5 -2
- package/dist/_virtual/rolldown_runtime.js +36 -1
- package/dist/adapters/ai.d.ts +12 -0
- package/dist/adapters/ai.d.ts.map +1 -0
- package/dist/adapters/ai.js +83 -1
- 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 -1
- 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 -1
- 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 -1
- package/dist/adapters/git.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.js +7 -1
- package/dist/adapters/logger.d.ts +18 -0
- package/dist/adapters/logger.d.ts.map +1 -0
- package/dist/adapters/logger.js +81 -1
- 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 -1
- 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 -2
- 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 +147 -9
- 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 +285 -17
- package/dist/ai/agents/cursor-agent.js.map +1 -0
- package/dist/ai/agents/index.js +5 -1
- 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 +141 -8
- 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 -1
- 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 +81 -4
- 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 -1
- 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 -1
- 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 +56 -13
- 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 -1
- 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 +62 -20
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -2
- 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 -1
- 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 -3
- 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 -3
- 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 -3
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- package/dist/services/diff.js.map +1 -0
- package/dist/services/doctor/checks/ai.js +119 -2
- package/dist/services/doctor/checks/ai.js.map +1 -0
- package/dist/services/doctor/checks/cli.js +147 -1
- package/dist/services/doctor/checks/cli.js.map +1 -0
- package/dist/services/doctor/checks/config.js +171 -1
- package/dist/services/doctor/checks/config.js.map +1 -0
- package/dist/services/doctor/checks/deps.js +247 -1
- package/dist/services/doctor/checks/deps.js.map +1 -0
- package/dist/services/doctor/checks/index.js +6 -1
- package/dist/services/doctor/checks/mcp.js +145 -1
- package/dist/services/doctor/checks/mcp.js.map +1 -0
- package/dist/services/doctor/checks/workspace.js +244 -1
- 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 -2
- 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 -1
- 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 -1
- 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 -2
- 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 -1
- 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 -1
- 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 -1
- 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 -6
- 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 -1
- 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 -1
- 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 -2
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 +114 -26
- 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 -2
- package/dist/services/setup/file-merger.js.map +1 -0
- package/dist/services/setup/index.js +4 -1
- 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 -1
- package/dist/services/setup/setup-service.js.map +1 -0
- package/dist/services/setup/targets/agents-md.js +47 -1
- package/dist/services/setup/targets/agents-md.js.map +1 -0
- package/dist/services/setup/targets/cli-config.js +60 -1
- package/dist/services/setup/targets/cli-config.js.map +1 -0
- package/dist/services/setup/targets/cursor-rules.js +48 -1
- package/dist/services/setup/targets/cursor-rules.js.map +1 -0
- package/dist/services/setup/targets/mcp-claude.js +60 -1
- package/dist/services/setup/targets/mcp-claude.js.map +1 -0
- package/dist/services/setup/targets/mcp-cursor.js +59 -1
- package/dist/services/setup/targets/mcp-cursor.js.map +1 -0
- package/dist/services/setup/targets/vscode-settings.js +63 -1
- 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 -1
- 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 -1
- 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 -1
- 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 +70 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 -1
- 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 +336 -9
- 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 -1
- 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 -1
- 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 -2
- 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 -3
- 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 -1
- 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 -2
- 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 +102 -28
- 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 +43 -27
- 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 +30 -14
- 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 +78 -51
- 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 +54 -17
- 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 -1
- 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 +135 -50
- 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 +63 -21
- 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 +51 -26
- 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 +45 -28
- 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 +47 -20
- 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 +75 -53
- 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 +13 -6
- 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 +52 -24
- 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 +27 -15
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
//#region src/services/doctor/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Doctor service types.
|
|
4
|
+
*
|
|
5
|
+
* Types for health checks and auto-fix functionality.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Categories of health checks.
|
|
9
|
+
*/
|
|
10
|
+
type CheckCategory = 'cli' | 'config' | 'mcp' | 'deps' | 'workspace' | 'ai';
|
|
11
|
+
/**
|
|
12
|
+
* All available check categories.
|
|
13
|
+
*/
|
|
14
|
+
declare const ALL_CHECK_CATEGORIES: CheckCategory[];
|
|
15
|
+
/**
|
|
16
|
+
* Human-readable labels for check categories.
|
|
17
|
+
*/
|
|
18
|
+
declare const CHECK_CATEGORY_LABELS: Record<CheckCategory, string>;
|
|
19
|
+
/**
|
|
20
|
+
* Status of a health check.
|
|
21
|
+
*/
|
|
22
|
+
type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip';
|
|
23
|
+
/**
|
|
24
|
+
* Result of applying a fix.
|
|
25
|
+
*/
|
|
26
|
+
interface FixResult {
|
|
27
|
+
/** Whether the fix was successful. */
|
|
28
|
+
success: boolean;
|
|
29
|
+
/** Message describing the result. */
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* An action that can fix a failed check.
|
|
34
|
+
*/
|
|
35
|
+
interface FixAction {
|
|
36
|
+
/** Description of what the fix will do. */
|
|
37
|
+
description: string;
|
|
38
|
+
/** Function to apply the fix. */
|
|
39
|
+
apply: () => Promise<FixResult>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Result of a single health check.
|
|
43
|
+
*/
|
|
44
|
+
interface CheckResult {
|
|
45
|
+
/** Category of the check. */
|
|
46
|
+
category: CheckCategory;
|
|
47
|
+
/** Name of the specific check. */
|
|
48
|
+
name: string;
|
|
49
|
+
/** Status of the check. */
|
|
50
|
+
status: CheckStatus;
|
|
51
|
+
/** Human-readable message. */
|
|
52
|
+
message: string;
|
|
53
|
+
/** Optional fix action if status is 'fail' or 'warn'. */
|
|
54
|
+
fix?: FixAction;
|
|
55
|
+
/** Additional details for debugging. */
|
|
56
|
+
details?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Options for running the doctor.
|
|
60
|
+
*/
|
|
61
|
+
interface DoctorOptions {
|
|
62
|
+
/** Root directory of the workspace. */
|
|
63
|
+
workspaceRoot: string;
|
|
64
|
+
/** Categories to check (defaults to all). */
|
|
65
|
+
categories?: CheckCategory[];
|
|
66
|
+
/** If true, auto-apply fixes without prompting. */
|
|
67
|
+
autoFix?: boolean;
|
|
68
|
+
/** Skip AI provider checks. */
|
|
69
|
+
skipAi?: boolean;
|
|
70
|
+
/** Verbose output. */
|
|
71
|
+
verbose?: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Summary of doctor results.
|
|
75
|
+
*/
|
|
76
|
+
interface DoctorResult {
|
|
77
|
+
/** All check results. */
|
|
78
|
+
checks: CheckResult[];
|
|
79
|
+
/** Number of passing checks. */
|
|
80
|
+
passed: number;
|
|
81
|
+
/** Number of warnings. */
|
|
82
|
+
warnings: number;
|
|
83
|
+
/** Number of failures. */
|
|
84
|
+
failures: number;
|
|
85
|
+
/** Number of skipped checks. */
|
|
86
|
+
skipped: number;
|
|
87
|
+
/** Overall health status. */
|
|
88
|
+
healthy: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Callback for interactive prompts during doctor.
|
|
92
|
+
*/
|
|
93
|
+
interface DoctorPromptCallbacks {
|
|
94
|
+
/** Confirm a fix action. */
|
|
95
|
+
confirm: (message: string) => Promise<boolean>;
|
|
96
|
+
/** Input a value (e.g., API key). */
|
|
97
|
+
input: (message: string, options?: {
|
|
98
|
+
password?: boolean;
|
|
99
|
+
}) => Promise<string>;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Context passed to check functions.
|
|
103
|
+
*/
|
|
104
|
+
interface CheckContext {
|
|
105
|
+
/** Workspace root path (monorepo root or single project root). */
|
|
106
|
+
workspaceRoot: string;
|
|
107
|
+
/** Current package root (may differ from workspaceRoot in monorepos). */
|
|
108
|
+
packageRoot: string;
|
|
109
|
+
/** Whether this is a monorepo. */
|
|
110
|
+
isMonorepo: boolean;
|
|
111
|
+
/** Current package name (if in a monorepo package). */
|
|
112
|
+
packageName?: string;
|
|
113
|
+
/** Whether verbose output is enabled. */
|
|
114
|
+
verbose: boolean;
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS, CheckCategory, CheckContext, CheckResult, CheckStatus, DoctorOptions, DoctorPromptCallbacks, DoctorResult, FixAction, FixResult };
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/doctor/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAWA;AAYA;AAYA;AAKA;AAUA;AAUA;AAEY,KA9DA,aAAA,GA8DA,KAAA,GAAA,QAAA,GAAA,KAAA,GAAA,MAAA,GAAA,WAAA,GAAA,IAAA;;;;AAgBK,cAnEJ,oBAuEE,EAvEoB,aAuEP,EAAA;AAY5B;AAkBA;AAUA;cAnGa,uBAAuB,OAAO;;;;KAY/B,WAAA;;;;UAKK,SAAA;;;;;;;;;UAUA,SAAA;;;;eAIF,QAAQ;;;;;UAMN,WAAA;;YAEL;;;;UAIF;;;;QAIF;;;;;;;UAQS,aAAA;;;;eAIF;;;;;;;;;;;UAYE,YAAA;;UAEP;;;;;;;;;;;;;;;UAgBO,qBAAA;;gCAEe;;;;QAEgC;;;;;UAM/C,YAAA"}
|
|
@@ -1 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/services/doctor/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* All available check categories.
|
|
4
|
+
*/
|
|
5
|
+
const ALL_CHECK_CATEGORIES = [
|
|
6
|
+
"cli",
|
|
7
|
+
"config",
|
|
8
|
+
"mcp",
|
|
9
|
+
"deps",
|
|
10
|
+
"workspace",
|
|
11
|
+
"ai"
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Human-readable labels for check categories.
|
|
15
|
+
*/
|
|
16
|
+
const CHECK_CATEGORY_LABELS = {
|
|
17
|
+
cli: "CLI Installation",
|
|
18
|
+
config: "Configuration Files",
|
|
19
|
+
mcp: "MCP Server",
|
|
20
|
+
deps: "Dependencies",
|
|
21
|
+
workspace: "Workspace Structure",
|
|
22
|
+
ai: "AI Provider"
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS };
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":["ALL_CHECK_CATEGORIES: CheckCategory[]","CHECK_CATEGORY_LABELS: Record<CheckCategory, string>"],"sources":["../../../src/services/doctor/types.ts"],"sourcesContent":["/**\n * Doctor service types.\n *\n * Types for health checks and auto-fix functionality.\n */\n\n/**\n * Categories of health checks.\n */\nexport type CheckCategory =\n | 'cli'\n | 'config'\n | 'mcp'\n | 'deps'\n | 'workspace'\n | 'ai';\n\n/**\n * All available check categories.\n */\nexport const ALL_CHECK_CATEGORIES: CheckCategory[] = [\n 'cli',\n 'config',\n 'mcp',\n 'deps',\n 'workspace',\n 'ai',\n];\n\n/**\n * Human-readable labels for check categories.\n */\nexport const CHECK_CATEGORY_LABELS: Record<CheckCategory, string> = {\n cli: 'CLI Installation',\n config: 'Configuration Files',\n mcp: 'MCP Server',\n deps: 'Dependencies',\n workspace: 'Workspace Structure',\n ai: 'AI Provider',\n};\n\n/**\n * Status of a health check.\n */\nexport type CheckStatus = 'pass' | 'warn' | 'fail' | 'skip';\n\n/**\n * Result of applying a fix.\n */\nexport interface FixResult {\n /** Whether the fix was successful. */\n success: boolean;\n /** Message describing the result. */\n message: string;\n}\n\n/**\n * An action that can fix a failed check.\n */\nexport interface FixAction {\n /** Description of what the fix will do. */\n description: string;\n /** Function to apply the fix. */\n apply: () => Promise<FixResult>;\n}\n\n/**\n * Result of a single health check.\n */\nexport interface CheckResult {\n /** Category of the check. */\n category: CheckCategory;\n /** Name of the specific check. */\n name: string;\n /** Status of the check. */\n status: CheckStatus;\n /** Human-readable message. */\n message: string;\n /** Optional fix action if status is 'fail' or 'warn'. */\n fix?: FixAction;\n /** Additional details for debugging. */\n details?: string;\n}\n\n/**\n * Options for running the doctor.\n */\nexport interface DoctorOptions {\n /** Root directory of the workspace. */\n workspaceRoot: string;\n /** Categories to check (defaults to all). */\n categories?: CheckCategory[];\n /** If true, auto-apply fixes without prompting. */\n autoFix?: boolean;\n /** Skip AI provider checks. */\n skipAi?: boolean;\n /** Verbose output. */\n verbose?: boolean;\n}\n\n/**\n * Summary of doctor results.\n */\nexport interface DoctorResult {\n /** All check results. */\n checks: CheckResult[];\n /** Number of passing checks. */\n passed: number;\n /** Number of warnings. */\n warnings: number;\n /** Number of failures. */\n failures: number;\n /** Number of skipped checks. */\n skipped: number;\n /** Overall health status. */\n healthy: boolean;\n}\n\n/**\n * Callback for interactive prompts during doctor.\n */\nexport interface DoctorPromptCallbacks {\n /** Confirm a fix action. */\n confirm: (message: string) => Promise<boolean>;\n /** Input a value (e.g., API key). */\n input: (message: string, options?: { password?: boolean }) => Promise<string>;\n}\n\n/**\n * Context passed to check functions.\n */\nexport interface CheckContext {\n /** Workspace root path (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 /** Current package name (if in a monorepo package). */\n packageName?: string;\n /** Whether verbose output is enabled. */\n verbose: boolean;\n}\n"],"mappings":";;;;AAoBA,MAAaA,uBAAwC;CACnD;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAaC,wBAAuD;CAClE,KAAK;CACL,QAAQ;CACR,KAAK;CACL,MAAM;CACN,WAAW;CACX,IAAI;CACL"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CheckRunPayload, PrCommentOptions } from "./types.js";
|
|
2
|
+
import { index_d_exports } from "../../index.js";
|
|
3
|
+
|
|
4
|
+
//#region src/services/impact/formatters.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Format impact result as a PR comment (markdown).
|
|
8
|
+
*/
|
|
9
|
+
declare function formatPrComment(result: index_d_exports.ImpactResult, options?: PrCommentOptions): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format impact result for minimal PR comment.
|
|
12
|
+
*/
|
|
13
|
+
declare function formatMinimalComment(result: index_d_exports.ImpactResult): string;
|
|
14
|
+
/**
|
|
15
|
+
* Format impact result as GitHub check run payload.
|
|
16
|
+
*/
|
|
17
|
+
declare function formatCheckRun(result: index_d_exports.ImpactResult, headSha: string, options?: {
|
|
18
|
+
key?: string;
|
|
19
|
+
failOnBreaking?: boolean;
|
|
20
|
+
}): CheckRunPayload;
|
|
21
|
+
/**
|
|
22
|
+
* Format impact result as JSON.
|
|
23
|
+
*/
|
|
24
|
+
declare function formatJson(result: index_d_exports.ImpactResult): string;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { formatCheckRun, formatJson, formatMinimalComment, formatPrComment };
|
|
27
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","names":[],"sources":["../../../src/services/impact/formatters.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAegB,eAAA,SACN,eAAA,CAAA,wBACC;;;;iBAyGK,oBAAA,SAA6B,eAAA,CAAA;;;;iBAa7B,cAAA,SACN,eAAA,CAAA;;;IAGP;;;;iBA2Ca,UAAA,SAAmB,eAAA,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
//#region src/services/impact/formatters.ts
|
|
2
|
+
/**
|
|
3
|
+
* Format impact result as a PR comment (markdown).
|
|
4
|
+
*/
|
|
5
|
+
function formatPrComment(result, options = { template: "detailed" }) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push("## 📋 ContractSpec Impact Analysis");
|
|
8
|
+
lines.push("");
|
|
9
|
+
if (result.hasBreaking) lines.push("❌ **Breaking changes detected**");
|
|
10
|
+
else if (result.hasNonBreaking) lines.push("⚠️ **Contract changed (non-breaking)**");
|
|
11
|
+
else lines.push("✅ **No contract impact**");
|
|
12
|
+
lines.push("");
|
|
13
|
+
if (result.summary.breaking > 0 || result.summary.nonBreaking > 0 || result.summary.info > 0) {
|
|
14
|
+
lines.push("### Summary");
|
|
15
|
+
lines.push("");
|
|
16
|
+
lines.push(`| Type | Count |`);
|
|
17
|
+
lines.push(`|------|-------|`);
|
|
18
|
+
if (result.summary.breaking > 0) lines.push(`| 🔴 Breaking | ${result.summary.breaking} |`);
|
|
19
|
+
if (result.summary.nonBreaking > 0) lines.push(`| 🟡 Non-breaking | ${result.summary.nonBreaking} |`);
|
|
20
|
+
if (result.summary.info > 0) lines.push(`| 🔵 Info | ${result.summary.info} |`);
|
|
21
|
+
if (result.summary.added > 0) lines.push(`| ➕ Added | ${result.summary.added} |`);
|
|
22
|
+
if (result.summary.removed > 0) lines.push(`| ➖ Removed | ${result.summary.removed} |`);
|
|
23
|
+
lines.push("");
|
|
24
|
+
}
|
|
25
|
+
if (options.template === "detailed" && result.deltas.length > 0) {
|
|
26
|
+
lines.push("### Changes");
|
|
27
|
+
lines.push("");
|
|
28
|
+
const breaking = result.deltas.filter((d) => d.severity === "breaking");
|
|
29
|
+
const nonBreaking = result.deltas.filter((d) => d.severity === "non_breaking");
|
|
30
|
+
if (breaking.length > 0) {
|
|
31
|
+
lines.push("#### 🔴 Breaking Changes");
|
|
32
|
+
lines.push("");
|
|
33
|
+
for (const delta of breaking) lines.push(`- **${delta.specKey}**: ${delta.description}`);
|
|
34
|
+
lines.push("");
|
|
35
|
+
}
|
|
36
|
+
if (nonBreaking.length > 0) {
|
|
37
|
+
lines.push("#### 🟡 Non-breaking Changes");
|
|
38
|
+
lines.push("");
|
|
39
|
+
for (const delta of nonBreaking) lines.push(`- **${delta.specKey}**: ${delta.description}`);
|
|
40
|
+
lines.push("");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (result.addedSpecs.length > 0) {
|
|
44
|
+
lines.push("### Added Specs");
|
|
45
|
+
lines.push("");
|
|
46
|
+
for (const spec of result.addedSpecs) lines.push(`- \`${spec.key}\` v${spec.version} (${spec.type})`);
|
|
47
|
+
lines.push("");
|
|
48
|
+
}
|
|
49
|
+
if (result.removedSpecs.length > 0) {
|
|
50
|
+
lines.push("### Removed Specs");
|
|
51
|
+
lines.push("");
|
|
52
|
+
for (const spec of result.removedSpecs) lines.push(`- \`${spec.key}\` v${spec.version} (${spec.type})`);
|
|
53
|
+
lines.push("");
|
|
54
|
+
}
|
|
55
|
+
lines.push("---");
|
|
56
|
+
lines.push(`*Generated by ContractSpec at ${result.timestamp}*`);
|
|
57
|
+
return lines.join("\n");
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Format impact result for minimal PR comment.
|
|
61
|
+
*/
|
|
62
|
+
function formatMinimalComment(result) {
|
|
63
|
+
if (result.hasBreaking) return `❌ **Breaking changes detected** (${result.summary.breaking} breaking, ${result.summary.nonBreaking} non-breaking)`;
|
|
64
|
+
if (result.hasNonBreaking) return `⚠️ **Contract changed** (${result.summary.nonBreaking} non-breaking changes)`;
|
|
65
|
+
return "✅ **No contract impact**";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format impact result as GitHub check run payload.
|
|
69
|
+
*/
|
|
70
|
+
function formatCheckRun(result, headSha, options = {}) {
|
|
71
|
+
const name = options.key ?? "ContractSpec Impact";
|
|
72
|
+
const failOnBreaking = options.failOnBreaking ?? true;
|
|
73
|
+
let conclusion;
|
|
74
|
+
let title;
|
|
75
|
+
if (result.hasBreaking) {
|
|
76
|
+
conclusion = failOnBreaking ? "failure" : "neutral";
|
|
77
|
+
title = `Breaking changes detected (${result.summary.breaking})`;
|
|
78
|
+
} else if (result.hasNonBreaking) {
|
|
79
|
+
conclusion = "success";
|
|
80
|
+
title = `Non-breaking changes (${result.summary.nonBreaking})`;
|
|
81
|
+
} else {
|
|
82
|
+
conclusion = "success";
|
|
83
|
+
title = "No contract impact";
|
|
84
|
+
}
|
|
85
|
+
const summary = formatMinimalComment(result);
|
|
86
|
+
return {
|
|
87
|
+
name,
|
|
88
|
+
headSha,
|
|
89
|
+
conclusion,
|
|
90
|
+
title,
|
|
91
|
+
summary,
|
|
92
|
+
annotations: result.deltas.filter((d) => d.severity === "breaking").slice(0, 50).map((d) => ({
|
|
93
|
+
path: d.path,
|
|
94
|
+
startLine: 1,
|
|
95
|
+
endLine: 1,
|
|
96
|
+
annotationLevel: "failure",
|
|
97
|
+
message: d.description,
|
|
98
|
+
title: `Breaking: ${d.rule}`
|
|
99
|
+
}))
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Format impact result as JSON.
|
|
104
|
+
*/
|
|
105
|
+
function formatJson(result) {
|
|
106
|
+
return JSON.stringify(result, null, 2);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
export { formatCheckRun, formatJson, formatMinimalComment, formatPrComment };
|
|
111
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","names":["lines: string[]","conclusion: 'success' | 'failure' | 'neutral'","title: string"],"sources":["../../../src/services/impact/formatters.ts"],"sourcesContent":["/**\n * Impact result formatters.\n *\n * Formats impact detection results for various outputs:\n * - PR comments (markdown)\n * - GitHub check runs\n * - JSON output\n */\n\nimport type { ImpactResult } from '../../index';\nimport type { CheckRunPayload, PrCommentOptions } from './types';\n\n/**\n * Format impact result as a PR comment (markdown).\n */\nexport function formatPrComment(\n result: ImpactResult,\n options: PrCommentOptions = { template: 'detailed' }\n): string {\n const lines: string[] = [];\n\n // Header with status\n lines.push('## 📋 ContractSpec Impact Analysis');\n lines.push('');\n\n // Status badge\n if (result.hasBreaking) {\n lines.push('❌ **Breaking changes detected**');\n } else if (result.hasNonBreaking) {\n lines.push('⚠️ **Contract changed (non-breaking)**');\n } else {\n lines.push('✅ **No contract impact**');\n }\n lines.push('');\n\n // Summary\n if (\n result.summary.breaking > 0 ||\n result.summary.nonBreaking > 0 ||\n result.summary.info > 0\n ) {\n lines.push('### Summary');\n lines.push('');\n lines.push(`| Type | Count |`);\n lines.push(`|------|-------|`);\n if (result.summary.breaking > 0) {\n lines.push(`| 🔴 Breaking | ${result.summary.breaking} |`);\n }\n if (result.summary.nonBreaking > 0) {\n lines.push(`| 🟡 Non-breaking | ${result.summary.nonBreaking} |`);\n }\n if (result.summary.info > 0) {\n lines.push(`| 🔵 Info | ${result.summary.info} |`);\n }\n if (result.summary.added > 0) {\n lines.push(`| ➕ Added | ${result.summary.added} |`);\n }\n if (result.summary.removed > 0) {\n lines.push(`| ➖ Removed | ${result.summary.removed} |`);\n }\n lines.push('');\n }\n\n // Detailed changes (if detailed template)\n if (options.template === 'detailed' && result.deltas.length > 0) {\n lines.push('### Changes');\n lines.push('');\n\n // Group by severity\n const breaking = result.deltas.filter((d) => d.severity === 'breaking');\n const nonBreaking = result.deltas.filter(\n (d) => d.severity === 'non_breaking'\n );\n\n if (breaking.length > 0) {\n lines.push('#### 🔴 Breaking Changes');\n lines.push('');\n for (const delta of breaking) {\n lines.push(`- **${delta.specKey}**: ${delta.description}`);\n }\n lines.push('');\n }\n\n if (nonBreaking.length > 0) {\n lines.push('#### 🟡 Non-breaking Changes');\n lines.push('');\n for (const delta of nonBreaking) {\n lines.push(`- **${delta.specKey}**: ${delta.description}`);\n }\n lines.push('');\n }\n }\n\n // Added/removed specs\n if (result.addedSpecs.length > 0) {\n lines.push('### Added Specs');\n lines.push('');\n for (const spec of result.addedSpecs) {\n lines.push(`- \\`${spec.key}\\` v${spec.version} (${spec.type})`);\n }\n lines.push('');\n }\n\n if (result.removedSpecs.length > 0) {\n lines.push('### Removed Specs');\n lines.push('');\n for (const spec of result.removedSpecs) {\n lines.push(`- \\`${spec.key}\\` v${spec.version} (${spec.type})`);\n }\n lines.push('');\n }\n\n // Footer\n lines.push('---');\n lines.push(`*Generated by ContractSpec at ${result.timestamp}*`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format impact result for minimal PR comment.\n */\nexport function formatMinimalComment(result: ImpactResult): string {\n if (result.hasBreaking) {\n return `❌ **Breaking changes detected** (${result.summary.breaking} breaking, ${result.summary.nonBreaking} non-breaking)`;\n }\n if (result.hasNonBreaking) {\n return `⚠️ **Contract changed** (${result.summary.nonBreaking} non-breaking changes)`;\n }\n return '✅ **No contract impact**';\n}\n\n/**\n * Format impact result as GitHub check run payload.\n */\nexport function formatCheckRun(\n result: ImpactResult,\n headSha: string,\n options: { key?: string; failOnBreaking?: boolean } = {}\n): CheckRunPayload {\n const name = options.key ?? 'ContractSpec Impact';\n const failOnBreaking = options.failOnBreaking ?? true;\n\n let conclusion: 'success' | 'failure' | 'neutral';\n let title: string;\n\n if (result.hasBreaking) {\n conclusion = failOnBreaking ? 'failure' : 'neutral';\n title = `Breaking changes detected (${result.summary.breaking})`;\n } else if (result.hasNonBreaking) {\n conclusion = 'success';\n title = `Non-breaking changes (${result.summary.nonBreaking})`;\n } else {\n conclusion = 'success';\n title = 'No contract impact';\n }\n\n const summary = formatMinimalComment(result);\n\n return {\n name,\n headSha,\n conclusion,\n title,\n summary,\n annotations: result.deltas\n .filter((d) => d.severity === 'breaking')\n .slice(0, 50) // GitHub limit\n .map((d) => ({\n path: d.path,\n startLine: 1,\n endLine: 1,\n annotationLevel: 'failure' as const,\n message: d.description,\n title: `Breaking: ${d.rule}`,\n })),\n };\n}\n\n/**\n * Format impact result as JSON.\n */\nexport function formatJson(result: ImpactResult): string {\n return JSON.stringify(result, null, 2);\n}\n"],"mappings":";;;;AAeA,SAAgB,gBACd,QACA,UAA4B,EAAE,UAAU,YAAY,EAC5C;CACR,MAAMA,QAAkB,EAAE;AAG1B,OAAM,KAAK,qCAAqC;AAChD,OAAM,KAAK,GAAG;AAGd,KAAI,OAAO,YACT,OAAM,KAAK,kCAAkC;UACpC,OAAO,eAChB,OAAM,KAAK,yCAAyC;KAEpD,OAAM,KAAK,2BAA2B;AAExC,OAAM,KAAK,GAAG;AAGd,KACE,OAAO,QAAQ,WAAW,KAC1B,OAAO,QAAQ,cAAc,KAC7B,OAAO,QAAQ,OAAO,GACtB;AACA,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,mBAAmB;AAC9B,MAAI,OAAO,QAAQ,WAAW,EAC5B,OAAM,KAAK,mBAAmB,OAAO,QAAQ,SAAS,IAAI;AAE5D,MAAI,OAAO,QAAQ,cAAc,EAC/B,OAAM,KAAK,uBAAuB,OAAO,QAAQ,YAAY,IAAI;AAEnE,MAAI,OAAO,QAAQ,OAAO,EACxB,OAAM,KAAK,eAAe,OAAO,QAAQ,KAAK,IAAI;AAEpD,MAAI,OAAO,QAAQ,QAAQ,EACzB,OAAM,KAAK,eAAe,OAAO,QAAQ,MAAM,IAAI;AAErD,MAAI,OAAO,QAAQ,UAAU,EAC3B,OAAM,KAAK,iBAAiB,OAAO,QAAQ,QAAQ,IAAI;AAEzD,QAAM,KAAK,GAAG;;AAIhB,KAAI,QAAQ,aAAa,cAAc,OAAO,OAAO,SAAS,GAAG;AAC/D,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,GAAG;EAGd,MAAM,WAAW,OAAO,OAAO,QAAQ,MAAM,EAAE,aAAa,WAAW;EACvE,MAAM,cAAc,OAAO,OAAO,QAC/B,MAAM,EAAE,aAAa,eACvB;AAED,MAAI,SAAS,SAAS,GAAG;AACvB,SAAM,KAAK,2BAA2B;AACtC,SAAM,KAAK,GAAG;AACd,QAAK,MAAM,SAAS,SAClB,OAAM,KAAK,OAAO,MAAM,QAAQ,MAAM,MAAM,cAAc;AAE5D,SAAM,KAAK,GAAG;;AAGhB,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAM,KAAK,+BAA+B;AAC1C,SAAM,KAAK,GAAG;AACd,QAAK,MAAM,SAAS,YAClB,OAAM,KAAK,OAAO,MAAM,QAAQ,MAAM,MAAM,cAAc;AAE5D,SAAM,KAAK,GAAG;;;AAKlB,KAAI,OAAO,WAAW,SAAS,GAAG;AAChC,QAAM,KAAK,kBAAkB;AAC7B,QAAM,KAAK,GAAG;AACd,OAAK,MAAM,QAAQ,OAAO,WACxB,OAAM,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG;AAEjE,QAAM,KAAK,GAAG;;AAGhB,KAAI,OAAO,aAAa,SAAS,GAAG;AAClC,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,GAAG;AACd,OAAK,MAAM,QAAQ,OAAO,aACxB,OAAM,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG;AAEjE,QAAM,KAAK,GAAG;;AAIhB,OAAM,KAAK,MAAM;AACjB,OAAM,KAAK,iCAAiC,OAAO,UAAU,GAAG;AAEhE,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,qBAAqB,QAA8B;AACjE,KAAI,OAAO,YACT,QAAO,oCAAoC,OAAO,QAAQ,SAAS,aAAa,OAAO,QAAQ,YAAY;AAE7G,KAAI,OAAO,eACT,QAAO,4BAA4B,OAAO,QAAQ,YAAY;AAEhE,QAAO;;;;;AAMT,SAAgB,eACd,QACA,SACA,UAAsD,EAAE,EACvC;CACjB,MAAM,OAAO,QAAQ,OAAO;CAC5B,MAAM,iBAAiB,QAAQ,kBAAkB;CAEjD,IAAIC;CACJ,IAAIC;AAEJ,KAAI,OAAO,aAAa;AACtB,eAAa,iBAAiB,YAAY;AAC1C,UAAQ,8BAA8B,OAAO,QAAQ,SAAS;YACrD,OAAO,gBAAgB;AAChC,eAAa;AACb,UAAQ,yBAAyB,OAAO,QAAQ,YAAY;QACvD;AACL,eAAa;AACb,UAAQ;;CAGV,MAAM,UAAU,qBAAqB,OAAO;AAE5C,QAAO;EACL;EACA;EACA;EACA;EACA;EACA,aAAa,OAAO,OACjB,QAAQ,MAAM,EAAE,aAAa,WAAW,CACxC,MAAM,GAAG,GAAG,CACZ,KAAK,OAAO;GACX,MAAM,EAAE;GACR,WAAW;GACX,SAAS;GACT,iBAAiB;GACjB,SAAS,EAAE;GACX,OAAO,aAAa,EAAE;GACvB,EAAE;EACN;;;;;AAMH,SAAgB,WAAW,QAA8B;AACvD,QAAO,KAAK,UAAU,QAAQ,MAAM,EAAE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { FsAdapter } from "../../ports/fs.js";
|
|
2
|
+
import { GitAdapter } from "../../ports/git.js";
|
|
3
|
+
import { LoggerAdapter } from "../../ports/logger.js";
|
|
4
|
+
import { ImpactDetectionOptions, ImpactDetectionResult } from "./types.js";
|
|
5
|
+
|
|
6
|
+
//#region src/services/impact/impact-detection-service.d.ts
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Detect the impact of contract changes between baseline and current state.
|
|
10
|
+
*
|
|
11
|
+
* @param adapters - Required adapters (fs, git, logger)
|
|
12
|
+
* @param options - Detection options
|
|
13
|
+
* @returns Impact detection result
|
|
14
|
+
*/
|
|
15
|
+
declare function detectImpact(adapters: {
|
|
16
|
+
fs: FsAdapter;
|
|
17
|
+
git: GitAdapter;
|
|
18
|
+
logger: LoggerAdapter;
|
|
19
|
+
}, options?: ImpactDetectionOptions): Promise<ImpactDetectionResult>;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { detectImpact };
|
|
22
|
+
//# sourceMappingURL=impact-detection-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-detection-service.d.ts","names":[],"sources":["../../../src/services/impact/impact-detection-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;iBA2BsB,YAAA;MACJ;OAAgB;UAAoB;aAC3C,yBACR,QAAQ"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { src_exports } from "../../index.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/impact/impact-detection-service.ts
|
|
4
|
+
/**
|
|
5
|
+
* Impact detection service.
|
|
6
|
+
*
|
|
7
|
+
* Orchestrates contract snapshot generation, diff computation,
|
|
8
|
+
* and impact classification for CI/CD pipelines.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Detect the impact of contract changes between baseline and current state.
|
|
12
|
+
*
|
|
13
|
+
* @param adapters - Required adapters (fs, git, logger)
|
|
14
|
+
* @param options - Detection options
|
|
15
|
+
* @returns Impact detection result
|
|
16
|
+
*/
|
|
17
|
+
async function detectImpact(adapters, options = {}) {
|
|
18
|
+
const { fs, git, logger } = adapters;
|
|
19
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
20
|
+
logger.info("Starting impact detection...", { baseline: options.baseline });
|
|
21
|
+
const specFiles = (await fs.glob({
|
|
22
|
+
pattern: options.pattern ?? "**/*.{operation,event}.ts",
|
|
23
|
+
cwd: workspaceRoot
|
|
24
|
+
})).filter((f) => !f.includes(".test.") && !f.includes(".spec.") && !f.includes("node_modules"));
|
|
25
|
+
logger.debug(`Found ${specFiles.length} spec files`);
|
|
26
|
+
const headSnapshot = (0, src_exports.generateSnapshot)(await loadSpecs(fs, specFiles, workspaceRoot));
|
|
27
|
+
let baseSnapshot;
|
|
28
|
+
if (options.baseline) baseSnapshot = (0, src_exports.generateSnapshot)(await loadBaselineSpecs(fs, git, specFiles, options.baseline, workspaceRoot));
|
|
29
|
+
else baseSnapshot = {
|
|
30
|
+
version: 1,
|
|
31
|
+
generatedAt: "",
|
|
32
|
+
specs: [],
|
|
33
|
+
hash: ""
|
|
34
|
+
};
|
|
35
|
+
const diffs = computeSnapshotDiffs(baseSnapshot.specs, headSnapshot.specs);
|
|
36
|
+
const impactResult = (0, src_exports.classifyImpact)(baseSnapshot.specs, headSnapshot.specs, diffs);
|
|
37
|
+
logger.info("Impact detection complete", {
|
|
38
|
+
status: impactResult.status,
|
|
39
|
+
breaking: impactResult.summary.breaking,
|
|
40
|
+
nonBreaking: impactResult.summary.nonBreaking
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
...impactResult,
|
|
44
|
+
workspaceRoot,
|
|
45
|
+
specsAnalyzed: specFiles.length,
|
|
46
|
+
baseRef: options.baseline
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load specs from current filesystem.
|
|
51
|
+
*/
|
|
52
|
+
async function loadSpecs(fs, files, _workspaceRoot) {
|
|
53
|
+
const specs = [];
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
const content = await fs.readFile(file);
|
|
56
|
+
specs.push({
|
|
57
|
+
path: file,
|
|
58
|
+
content
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return specs;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Load specs from git baseline.
|
|
65
|
+
*/
|
|
66
|
+
async function loadBaselineSpecs(_fs, git, files, baseline, _workspaceRoot) {
|
|
67
|
+
const specs = [];
|
|
68
|
+
for (const file of files) try {
|
|
69
|
+
const content = await git.showFile(baseline, file);
|
|
70
|
+
specs.push({
|
|
71
|
+
path: file,
|
|
72
|
+
content
|
|
73
|
+
});
|
|
74
|
+
} catch {}
|
|
75
|
+
return specs;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Compute diffs between two sets of spec snapshots.
|
|
79
|
+
*/
|
|
80
|
+
function computeSnapshotDiffs(baseSpecs, headSpecs) {
|
|
81
|
+
const diffs = [];
|
|
82
|
+
const baseMap = new Map(baseSpecs.map((s) => [`${s.key}@${s.version}`, s]));
|
|
83
|
+
const headMap = new Map(headSpecs.map((s) => [`${s.key}@${s.version}`, s]));
|
|
84
|
+
for (const [key, headSpec] of headMap) {
|
|
85
|
+
const baseSpec = baseMap.get(key);
|
|
86
|
+
if (baseSpec && headSpec.type === "operation" && baseSpec.type === "operation") {
|
|
87
|
+
const ioDiffs = (0, src_exports.computeIoDiff)(baseSpec.io, headSpec.io);
|
|
88
|
+
diffs.push(...ioDiffs);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return diffs;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { detectImpact };
|
|
96
|
+
//# sourceMappingURL=impact-detection-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-detection-service.js","names":["baseSnapshot: ContractSnapshot","specs: { path: string; content: string }[]","diffs: ReturnType<typeof computeIoDiff>"],"sources":["../../../src/services/impact/impact-detection-service.ts"],"sourcesContent":["/**\n * Impact detection service.\n *\n * Orchestrates contract snapshot generation, diff computation,\n * and impact classification for CI/CD pipelines.\n */\n\n// Note: Using internal imports from the bundle which re-exports from module\nimport {\n classifyImpact,\n computeIoDiff,\n generateSnapshot,\n type ContractSnapshot,\n type SpecSnapshot,\n} from '../../index';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { GitAdapter } from '../../ports/git';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type { ImpactDetectionOptions, ImpactDetectionResult } from './types';\n\n/**\n * Detect the impact of contract changes between baseline and current state.\n *\n * @param adapters - Required adapters (fs, git, logger)\n * @param options - Detection options\n * @returns Impact detection result\n */\nexport async function detectImpact(\n adapters: { fs: FsAdapter; git: GitAdapter; logger: LoggerAdapter },\n options: ImpactDetectionOptions = {}\n): Promise<ImpactDetectionResult> {\n const { fs, git, logger } = adapters;\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n logger.info('Starting impact detection...', { baseline: options.baseline });\n\n // Discover spec files\n const files = await fs.glob({\n pattern: options.pattern ?? '**/*.{operation,event}.ts',\n cwd: workspaceRoot,\n });\n\n const specFiles = files.filter(\n (f) =>\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('node_modules')\n );\n\n logger.debug(`Found ${specFiles.length} spec files`);\n\n // Load current (head) specs\n const headSpecs = await loadSpecs(fs, specFiles, workspaceRoot);\n const headSnapshot = generateSnapshot(headSpecs);\n\n // Load baseline specs if specified\n let baseSnapshot: ContractSnapshot;\n if (options.baseline) {\n const baseSpecs = await loadBaselineSpecs(\n fs,\n git,\n specFiles,\n options.baseline,\n workspaceRoot\n );\n baseSnapshot = generateSnapshot(baseSpecs);\n } else {\n // No baseline means all specs are \"new\"\n baseSnapshot = { version: 1, generatedAt: '', specs: [], hash: '' };\n }\n\n // Compute diffs between snapshots\n const diffs = computeSnapshotDiffs(baseSnapshot.specs, headSnapshot.specs);\n\n // Classify the impact\n const impactResult = classifyImpact(\n baseSnapshot.specs,\n headSnapshot.specs,\n diffs\n );\n\n logger.info('Impact detection complete', {\n status: impactResult.status,\n breaking: impactResult.summary.breaking,\n nonBreaking: impactResult.summary.nonBreaking,\n });\n\n return {\n ...impactResult,\n workspaceRoot,\n specsAnalyzed: specFiles.length,\n baseRef: options.baseline,\n };\n}\n\n/**\n * Load specs from current filesystem.\n */\nasync function loadSpecs(\n fs: FsAdapter,\n files: string[],\n _workspaceRoot: string\n): Promise<{ path: string; content: string }[]> {\n const specs: { path: string; content: string }[] = [];\n\n for (const file of files) {\n const content = await fs.readFile(file);\n specs.push({ path: file, content });\n }\n\n return specs;\n}\n\n/**\n * Load specs from git baseline.\n */\nasync function loadBaselineSpecs(\n _fs: FsAdapter,\n git: GitAdapter,\n files: string[],\n baseline: string,\n _workspaceRoot: string\n): Promise<{ path: string; content: string }[]> {\n const specs: { path: string; content: string }[] = [];\n\n for (const file of files) {\n try {\n const content = await git.showFile(baseline, file);\n specs.push({ path: file, content });\n } catch {\n // File doesn't exist in baseline - skip (it's new)\n }\n }\n\n return specs;\n}\n\n/**\n * Compute diffs between two sets of spec snapshots.\n */\nfunction computeSnapshotDiffs(\n baseSpecs: SpecSnapshot[],\n headSpecs: SpecSnapshot[]\n): ReturnType<typeof computeIoDiff> {\n const diffs: ReturnType<typeof computeIoDiff> = [];\n\n const baseMap = new Map(baseSpecs.map((s) => [`${s.key}@${s.version}`, s]));\n const headMap = new Map(headSpecs.map((s) => [`${s.key}@${s.version}`, s]));\n\n // Compare specs that exist in both\n for (const [key, headSpec] of headMap) {\n const baseSpec = baseMap.get(key);\n if (\n baseSpec &&\n headSpec.type === 'operation' &&\n baseSpec.type === 'operation'\n ) {\n const ioDiffs = computeIoDiff(baseSpec.io, headSpec.io);\n diffs.push(...ioDiffs);\n }\n }\n\n return diffs;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA2BA,eAAsB,aACpB,UACA,UAAkC,EAAE,EACJ;CAChC,MAAM,EAAE,IAAI,KAAK,WAAW;CAC5B,MAAM,gBAAgB,QAAQ,iBAAiB,QAAQ,KAAK;AAE5D,QAAO,KAAK,gCAAgC,EAAE,UAAU,QAAQ,UAAU,CAAC;CAQ3E,MAAM,aALQ,MAAM,GAAG,KAAK;EAC1B,SAAS,QAAQ,WAAW;EAC5B,KAAK;EACN,CAAC,EAEsB,QACrB,MACC,CAAC,EAAE,SAAS,SAAS,IACrB,CAAC,EAAE,SAAS,SAAS,IACrB,CAAC,EAAE,SAAS,eAAe,CAC9B;AAED,QAAO,MAAM,SAAS,UAAU,OAAO,aAAa;CAIpD,MAAM,iDADY,MAAM,UAAU,IAAI,WAAW,cAAc,CACf;CAGhD,IAAIA;AACJ,KAAI,QAAQ,SAQV,kDAPkB,MAAM,kBACtB,IACA,KACA,WACA,QAAQ,UACR,cACD,CACyC;KAG1C,gBAAe;EAAE,SAAS;EAAG,aAAa;EAAI,OAAO,EAAE;EAAE,MAAM;EAAI;CAIrE,MAAM,QAAQ,qBAAqB,aAAa,OAAO,aAAa,MAAM;CAG1E,MAAM,+CACJ,aAAa,OACb,aAAa,OACb,MACD;AAED,QAAO,KAAK,6BAA6B;EACvC,QAAQ,aAAa;EACrB,UAAU,aAAa,QAAQ;EAC/B,aAAa,aAAa,QAAQ;EACnC,CAAC;AAEF,QAAO;EACL,GAAG;EACH;EACA,eAAe,UAAU;EACzB,SAAS,QAAQ;EAClB;;;;;AAMH,eAAe,UACb,IACA,OACA,gBAC8C;CAC9C,MAAMC,QAA6C,EAAE;AAErD,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,MAAM,GAAG,SAAS,KAAK;AACvC,QAAM,KAAK;GAAE,MAAM;GAAM;GAAS,CAAC;;AAGrC,QAAO;;;;;AAMT,eAAe,kBACb,KACA,KACA,OACA,UACA,gBAC8C;CAC9C,MAAMA,QAA6C,EAAE;AAErD,MAAK,MAAM,QAAQ,MACjB,KAAI;EACF,MAAM,UAAU,MAAM,IAAI,SAAS,UAAU,KAAK;AAClD,QAAM,KAAK;GAAE,MAAM;GAAM;GAAS,CAAC;SAC7B;AAKV,QAAO;;;;;AAMT,SAAS,qBACP,WACA,WACkC;CAClC,MAAMC,QAA0C,EAAE;CAElD,MAAM,UAAU,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;CAC3E,MAAM,UAAU,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;AAG3E,MAAK,MAAM,CAAC,KAAK,aAAa,SAAS;EACrC,MAAM,WAAW,QAAQ,IAAI,IAAI;AACjC,MACE,YACA,SAAS,SAAS,eAClB,SAAS,SAAS,aAClB;GACA,MAAM,yCAAwB,SAAS,IAAI,SAAS,GAAG;AACvD,SAAM,KAAK,GAAG,QAAQ;;;AAI1B,QAAO"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CheckRunAnnotation, CheckRunPayload, ImpactDetectionOptions, ImpactDetectionResult, ImpactResult, PrCommentOptions } from "./types.js";
|
|
2
|
+
import { detectImpact } from "./impact-detection-service.js";
|
|
3
|
+
import { formatCheckRun, formatJson, formatMinimalComment, formatPrComment } from "./formatters.js";
|
|
4
|
+
|
|
5
|
+
//#region src/services/impact/index.d.ts
|
|
6
|
+
declare namespace index_d_exports {
|
|
7
|
+
export { CheckRunAnnotation, CheckRunPayload, ImpactDetectionOptions, ImpactDetectionResult, ImpactResult, PrCommentOptions, detectImpact, formatCheckRun, formatJson, formatMinimalComment, formatPrComment };
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { index_d_exports };
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/services/impact/index.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { detectImpact } from "./impact-detection-service.js";
|
|
3
|
+
import { formatCheckRun, formatJson, formatMinimalComment, formatPrComment } from "./formatters.js";
|
|
4
|
+
|
|
5
|
+
//#region src/services/impact/index.ts
|
|
6
|
+
var impact_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
detectImpact: () => detectImpact,
|
|
8
|
+
formatCheckRun: () => formatCheckRun,
|
|
9
|
+
formatJson: () => formatJson,
|
|
10
|
+
formatMinimalComment: () => formatMinimalComment,
|
|
11
|
+
formatPrComment: () => formatPrComment
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { impact_exports };
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/services/impact/index.ts"],"sourcesContent":["/**\n * Impact detection service module.\n */\n\nexport * from './types';\nexport { detectImpact } from './impact-detection-service';\nexport {\n formatPrComment,\n formatMinimalComment,\n formatCheckRun,\n formatJson,\n} from './formatters';\n"],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ImpactResult } from "@lssm/module.contractspec-workspace";
|
|
2
|
+
|
|
3
|
+
//#region src/services/impact/types.d.ts
|
|
4
|
+
|
|
5
|
+
/** Options for impact detection */
|
|
6
|
+
interface ImpactDetectionOptions {
|
|
7
|
+
/** Git ref to compare against (branch, tag, commit) */
|
|
8
|
+
baseline?: string;
|
|
9
|
+
/** Glob pattern for spec discovery */
|
|
10
|
+
pattern?: string;
|
|
11
|
+
/** Workspace root directory */
|
|
12
|
+
workspaceRoot?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Impact detection result with additional context */
|
|
15
|
+
interface ImpactDetectionResult extends ImpactResult {
|
|
16
|
+
/** Working directory */
|
|
17
|
+
workspaceRoot: string;
|
|
18
|
+
/** Number of specs analyzed */
|
|
19
|
+
specsAnalyzed: number;
|
|
20
|
+
}
|
|
21
|
+
/** PR comment options */
|
|
22
|
+
interface PrCommentOptions {
|
|
23
|
+
/** Template style */
|
|
24
|
+
template: 'minimal' | 'detailed';
|
|
25
|
+
/** Include links to files */
|
|
26
|
+
includeLinks?: boolean;
|
|
27
|
+
/** Repository URL for links */
|
|
28
|
+
repositoryUrl?: string;
|
|
29
|
+
/** Commit SHA for links */
|
|
30
|
+
commitSha?: string;
|
|
31
|
+
}
|
|
32
|
+
/** GitHub check run payload */
|
|
33
|
+
interface CheckRunPayload {
|
|
34
|
+
/** Check run name */
|
|
35
|
+
name: string;
|
|
36
|
+
/** Head SHA */
|
|
37
|
+
headSha: string;
|
|
38
|
+
/** Conclusion */
|
|
39
|
+
conclusion: 'success' | 'failure' | 'neutral';
|
|
40
|
+
/** Output title */
|
|
41
|
+
title: string;
|
|
42
|
+
/** Output summary */
|
|
43
|
+
summary: string;
|
|
44
|
+
/** Annotations */
|
|
45
|
+
annotations?: CheckRunAnnotation[];
|
|
46
|
+
}
|
|
47
|
+
/** Check run annotation */
|
|
48
|
+
interface CheckRunAnnotation {
|
|
49
|
+
path: string;
|
|
50
|
+
startLine: number;
|
|
51
|
+
endLine: number;
|
|
52
|
+
annotationLevel: 'notice' | 'warning' | 'failure';
|
|
53
|
+
message: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { CheckRunAnnotation, CheckRunPayload, ImpactDetectionOptions, ImpactDetectionResult, type ImpactResult, PrCommentOptions };
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/impact/types.ts"],"sourcesContent":[],"mappings":";;;;AA4BA;AAYiB,UA9BA,sBAAA,CA0CD;EAIC;;;;;;;;UApCA,qBAAA,SAA8B;;;;;;;UAQ9B,gBAAA;;;;;;;;;;;UAYA,eAAA;;;;;;;;;;;;gBAYD;;;UAIC,kBAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FsAdapter } from "../../ports/fs.js";
|
|
2
|
+
import { DiscoveryOptions, SpecReferenceMatch } from "./types.js";
|
|
3
|
+
import { ImplementationType } from "@lssm/lib.contracts";
|
|
4
|
+
|
|
5
|
+
//#region src/services/implementation/discovery.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Infer implementation type from file path.
|
|
9
|
+
*/
|
|
10
|
+
declare function inferImplementationType(filePath: string): ImplementationType;
|
|
11
|
+
/**
|
|
12
|
+
* Extract spec references from source code.
|
|
13
|
+
*/
|
|
14
|
+
declare function extractSpecReferences(code: string, filePath: string): SpecReferenceMatch[];
|
|
15
|
+
/**
|
|
16
|
+
* Discover implementations that reference a specific spec.
|
|
17
|
+
*/
|
|
18
|
+
declare function discoverImplementationsForSpec(specKey: string, adapters: {
|
|
19
|
+
fs: FsAdapter;
|
|
20
|
+
}, options?: DiscoveryOptions): Promise<SpecReferenceMatch[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Discover all spec references in the workspace.
|
|
23
|
+
* Returns a map of spec key to implementation references.
|
|
24
|
+
*/
|
|
25
|
+
declare function discoverAllImplementations(adapters: {
|
|
26
|
+
fs: FsAdapter;
|
|
27
|
+
}, options?: DiscoveryOptions): Promise<Map<string, SpecReferenceMatch[]>>;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { discoverAllImplementations, discoverImplementationsForSpec, extractSpecReferences, inferImplementationType };
|
|
30
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","names":[],"sources":["../../../src/services/implementation/discovery.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsLU,iBAnIM,uBAAA,CAmIN,QAAA,EAAA,MAAA,CAAA,EAnIiD,kBAmIjD;AAkCV;;;AAGuB,iBAhJP,qBAAA,CAgJO,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EA7IpB,kBA6IoB,EAAA;;;;iBAzCD,8BAAA;MAEJ;aACP,mBACR,QAAQ;;;;;iBAkCW,0BAAA;MACJ;aACP,mBACR,QAAQ,YAAY"}
|