@contractspec/bundle.workspace 0.0.0-canary-20260113162409
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/_virtual/rolldown_runtime.mjs +20 -0
- package/dist/adapters/ai.d.mts +12 -0
- package/dist/adapters/ai.d.mts.map +1 -0
- package/dist/adapters/ai.mjs +83 -0
- package/dist/adapters/ai.mjs.map +1 -0
- package/dist/adapters/factory.d.mts +29 -0
- package/dist/adapters/factory.d.mts.map +1 -0
- package/dist/adapters/factory.mjs +37 -0
- package/dist/adapters/factory.mjs.map +1 -0
- package/dist/adapters/fs.d.mts +12 -0
- package/dist/adapters/fs.d.mts.map +1 -0
- package/dist/adapters/fs.mjs +133 -0
- package/dist/adapters/fs.mjs.map +1 -0
- package/dist/adapters/git.d.mts +11 -0
- package/dist/adapters/git.d.mts.map +1 -0
- package/dist/adapters/git.mjs +84 -0
- package/dist/adapters/git.mjs.map +1 -0
- package/dist/adapters/index.d.mts +7 -0
- package/dist/adapters/index.mjs +9 -0
- package/dist/adapters/logger.d.mts +18 -0
- package/dist/adapters/logger.d.mts.map +1 -0
- package/dist/adapters/logger.mjs +81 -0
- package/dist/adapters/logger.mjs.map +1 -0
- package/dist/adapters/watcher.d.mts +11 -0
- package/dist/adapters/watcher.d.mts.map +1 -0
- package/dist/adapters/watcher.mjs +74 -0
- package/dist/adapters/watcher.mjs.map +1 -0
- package/dist/adapters/workspace.d.mts +148 -0
- package/dist/adapters/workspace.d.mts.map +1 -0
- package/dist/adapters/workspace.mjs +275 -0
- package/dist/adapters/workspace.mjs.map +1 -0
- package/dist/ai/agents/claude-code-agent.d.mts +22 -0
- package/dist/ai/agents/claude-code-agent.d.mts.map +1 -0
- package/dist/ai/agents/claude-code-agent.mjs +182 -0
- package/dist/ai/agents/claude-code-agent.mjs.map +1 -0
- package/dist/ai/agents/cursor-agent.d.mts +68 -0
- package/dist/ai/agents/cursor-agent.d.mts.map +1 -0
- package/dist/ai/agents/cursor-agent.mjs +436 -0
- package/dist/ai/agents/cursor-agent.mjs.map +1 -0
- package/dist/ai/agents/index.mjs +7 -0
- package/dist/ai/agents/openai-codex-agent.d.mts +22 -0
- package/dist/ai/agents/openai-codex-agent.d.mts.map +1 -0
- package/dist/ai/agents/openai-codex-agent.mjs +167 -0
- package/dist/ai/agents/openai-codex-agent.mjs.map +1 -0
- package/dist/ai/agents/orchestrator.d.mts +50 -0
- package/dist/ai/agents/orchestrator.d.mts.map +1 -0
- package/dist/ai/agents/orchestrator.mjs +143 -0
- package/dist/ai/agents/orchestrator.mjs.map +1 -0
- package/dist/ai/agents/simple-agent.d.mts +17 -0
- package/dist/ai/agents/simple-agent.d.mts.map +1 -0
- package/dist/ai/agents/simple-agent.mjs +92 -0
- package/dist/ai/agents/simple-agent.mjs.map +1 -0
- package/dist/ai/agents/types.d.mts +36 -0
- package/dist/ai/agents/types.d.mts.map +1 -0
- package/dist/ai/client.d.mts +97 -0
- package/dist/ai/client.d.mts.map +1 -0
- package/dist/ai/client.mjs +189 -0
- package/dist/ai/client.mjs.map +1 -0
- package/dist/ai/index.d.mts +9 -0
- package/dist/ai/index.mjs +11 -0
- package/dist/ai/prompts/code-generation.d.mts +26 -0
- package/dist/ai/prompts/code-generation.d.mts.map +1 -0
- package/dist/ai/prompts/code-generation.mjs +143 -0
- package/dist/ai/prompts/code-generation.mjs.map +1 -0
- package/dist/ai/prompts/index.d.mts +10 -0
- package/dist/ai/prompts/index.d.mts.map +1 -0
- package/dist/ai/prompts/index.mjs +13 -0
- package/dist/ai/prompts/index.mjs.map +1 -0
- package/dist/ai/prompts/spec-creation.d.mts +29 -0
- package/dist/ai/prompts/spec-creation.d.mts.map +1 -0
- package/dist/ai/prompts/spec-creation.mjs +111 -0
- package/dist/ai/prompts/spec-creation.mjs.map +1 -0
- package/dist/ai/providers.d.mts +29 -0
- package/dist/ai/providers.d.mts.map +1 -0
- package/dist/ai/providers.mjs +39 -0
- package/dist/ai/providers.mjs.map +1 -0
- package/dist/formatters/index.d.mts +11 -0
- package/dist/formatters/index.d.mts.map +1 -0
- package/dist/formatters/index.mjs +17 -0
- package/dist/formatters/index.mjs.map +1 -0
- package/dist/formatters/json.d.mts +56 -0
- package/dist/formatters/json.d.mts.map +1 -0
- package/dist/formatters/json.mjs +43 -0
- package/dist/formatters/json.mjs.map +1 -0
- package/dist/formatters/sarif.d.mts +101 -0
- package/dist/formatters/sarif.d.mts.map +1 -0
- package/dist/formatters/sarif.mjs +163 -0
- package/dist/formatters/sarif.mjs.map +1 -0
- package/dist/formatters/text.d.mts +35 -0
- package/dist/formatters/text.d.mts.map +1 -0
- package/dist/formatters/text.mjs +209 -0
- package/dist/formatters/text.mjs.map +1 -0
- package/dist/index.d.mts +125 -0
- package/dist/index.mjs +110 -0
- package/dist/ports/ai.d.mts +59 -0
- package/dist/ports/ai.d.mts.map +1 -0
- package/dist/ports/fs.d.mts +81 -0
- package/dist/ports/fs.d.mts.map +1 -0
- package/dist/ports/git.d.mts +46 -0
- package/dist/ports/git.d.mts.map +1 -0
- package/dist/ports/index.d.mts +6 -0
- package/dist/ports/logger.d.mts +88 -0
- package/dist/ports/logger.d.mts.map +1 -0
- package/dist/ports/rulesync.d.mts +38 -0
- package/dist/ports/rulesync.d.mts.map +1 -0
- package/dist/ports/watcher.d.mts +52 -0
- package/dist/ports/watcher.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.d.mts +35 -0
- package/dist/services/agent-guide/adapters/claude-code.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/claude-code.mjs +144 -0
- package/dist/services/agent-guide/adapters/claude-code.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts +39 -0
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/cursor-cli.mjs +135 -0
- package/dist/services/agent-guide/adapters/cursor-cli.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts +53 -0
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/generic-mcp.mjs +159 -0
- package/dist/services/agent-guide/adapters/generic-mcp.mjs.map +1 -0
- package/dist/services/agent-guide/adapters/index.d.mts +23 -0
- package/dist/services/agent-guide/adapters/index.d.mts.map +1 -0
- package/dist/services/agent-guide/adapters/index.mjs +31 -0
- package/dist/services/agent-guide/adapters/index.mjs.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.d.mts +56 -0
- package/dist/services/agent-guide/agent-guide-service.d.mts.map +1 -0
- package/dist/services/agent-guide/agent-guide-service.mjs +147 -0
- package/dist/services/agent-guide/agent-guide-service.mjs.map +1 -0
- package/dist/services/agent-guide/index.d.mts +6 -0
- package/dist/services/agent-guide/index.mjs +7 -0
- package/dist/services/agent-guide/types.d.mts +58 -0
- package/dist/services/agent-guide/types.d.mts.map +1 -0
- package/dist/services/build.d.mts +61 -0
- package/dist/services/build.d.mts.map +1 -0
- package/dist/services/build.mjs +151 -0
- package/dist/services/build.mjs.map +1 -0
- package/dist/services/ci-check/checks/coverage.mjs +77 -0
- package/dist/services/ci-check/checks/coverage.mjs.map +1 -0
- package/dist/services/ci-check/checks/deps.mjs +32 -0
- package/dist/services/ci-check/checks/deps.mjs.map +1 -0
- package/dist/services/ci-check/checks/doctor.mjs +38 -0
- package/dist/services/ci-check/checks/doctor.mjs.map +1 -0
- package/dist/services/ci-check/checks/drift.mjs +40 -0
- package/dist/services/ci-check/checks/drift.mjs.map +1 -0
- package/dist/services/ci-check/checks/handlers.mjs +38 -0
- package/dist/services/ci-check/checks/handlers.mjs.map +1 -0
- package/dist/services/ci-check/checks/implementation.mjs +73 -0
- package/dist/services/ci-check/checks/implementation.mjs.map +1 -0
- package/dist/services/ci-check/checks/index.mjs +13 -0
- package/dist/services/ci-check/checks/integrity.mjs +31 -0
- package/dist/services/ci-check/checks/integrity.mjs.map +1 -0
- package/dist/services/ci-check/checks/layers.mjs +66 -0
- package/dist/services/ci-check/checks/layers.mjs.map +1 -0
- package/dist/services/ci-check/checks/structure.mjs +35 -0
- package/dist/services/ci-check/checks/structure.mjs.map +1 -0
- package/dist/services/ci-check/checks/test-refs.mjs +63 -0
- package/dist/services/ci-check/checks/test-refs.mjs.map +1 -0
- package/dist/services/ci-check/checks/tests.mjs +38 -0
- package/dist/services/ci-check/checks/tests.mjs.map +1 -0
- package/dist/services/ci-check/ci-check-service.d.mts +16 -0
- package/dist/services/ci-check/ci-check-service.d.mts.map +1 -0
- package/dist/services/ci-check/ci-check-service.mjs +129 -0
- package/dist/services/ci-check/ci-check-service.mjs.map +1 -0
- package/dist/services/ci-check/index.d.mts +2 -0
- package/dist/services/ci-check/index.mjs +4 -0
- package/dist/services/ci-check/types.d.mts +147 -0
- package/dist/services/ci-check/types.d.mts.map +1 -0
- package/dist/services/ci-check/types.mjs +37 -0
- package/dist/services/ci-check/types.mjs.map +1 -0
- package/dist/services/ci-check/utils.mjs +76 -0
- package/dist/services/ci-check/utils.mjs.map +1 -0
- package/dist/services/clean.d.mts +41 -0
- package/dist/services/clean.d.mts.map +1 -0
- package/dist/services/clean.mjs +72 -0
- package/dist/services/clean.mjs.map +1 -0
- package/dist/services/config.d.mts +16 -0
- package/dist/services/config.d.mts.map +1 -0
- package/dist/services/config.mjs +63 -0
- package/dist/services/config.mjs.map +1 -0
- package/dist/services/coverage/parsers/index.mjs +34 -0
- package/dist/services/coverage/parsers/index.mjs.map +1 -0
- package/dist/services/coverage/parsers/istanbul-parser.mjs +108 -0
- package/dist/services/coverage/parsers/istanbul-parser.mjs.map +1 -0
- package/dist/services/coverage/validator.mjs +55 -0
- package/dist/services/coverage/validator.mjs.map +1 -0
- package/dist/services/create/ai-generator.d.mts +84 -0
- package/dist/services/create/ai-generator.d.mts.map +1 -0
- package/dist/services/create/ai-generator.mjs +178 -0
- package/dist/services/create/ai-generator.mjs.map +1 -0
- package/dist/services/create/index.d.mts +28 -0
- package/dist/services/create/index.d.mts.map +1 -0
- package/dist/services/create/index.mjs +37 -0
- package/dist/services/create/index.mjs.map +1 -0
- package/dist/services/create/templates.d.mts +22 -0
- package/dist/services/create/templates.d.mts.map +1 -0
- package/dist/services/create/templates.mjs +39 -0
- package/dist/services/create/templates.mjs.map +1 -0
- package/dist/services/deps.d.mts +53 -0
- package/dist/services/deps.d.mts.map +1 -0
- package/dist/services/deps.mjs +62 -0
- package/dist/services/deps.mjs.map +1 -0
- package/dist/services/diff.d.mts +34 -0
- package/dist/services/diff.d.mts.map +1 -0
- package/dist/services/diff.mjs +34 -0
- package/dist/services/diff.mjs.map +1 -0
- package/dist/services/docs/docs-service.d.mts +20 -0
- package/dist/services/docs/docs-service.d.mts.map +1 -0
- package/dist/services/docs/docs-service.mjs +59 -0
- package/dist/services/docs/docs-service.mjs.map +1 -0
- package/dist/services/docs/index.d.mts +1 -0
- package/dist/services/docs/index.mjs +3 -0
- package/dist/services/doctor/checks/ai.mjs +119 -0
- package/dist/services/doctor/checks/ai.mjs.map +1 -0
- package/dist/services/doctor/checks/cli.mjs +156 -0
- package/dist/services/doctor/checks/cli.mjs.map +1 -0
- package/dist/services/doctor/checks/config.mjs +303 -0
- package/dist/services/doctor/checks/config.mjs.map +1 -0
- package/dist/services/doctor/checks/deps.mjs +267 -0
- package/dist/services/doctor/checks/deps.mjs.map +1 -0
- package/dist/services/doctor/checks/index.mjs +9 -0
- package/dist/services/doctor/checks/layers.mjs +139 -0
- package/dist/services/doctor/checks/layers.mjs.map +1 -0
- package/dist/services/doctor/checks/mcp.mjs +145 -0
- package/dist/services/doctor/checks/mcp.mjs.map +1 -0
- package/dist/services/doctor/checks/workspace.mjs +263 -0
- package/dist/services/doctor/checks/workspace.mjs.map +1 -0
- package/dist/services/doctor/doctor-service.d.mts +24 -0
- package/dist/services/doctor/doctor-service.d.mts.map +1 -0
- package/dist/services/doctor/doctor-service.mjs +118 -0
- package/dist/services/doctor/doctor-service.mjs.map +1 -0
- package/dist/services/doctor/index.d.mts +2 -0
- package/dist/services/doctor/index.mjs +4 -0
- package/dist/services/doctor/types.d.mts +118 -0
- package/dist/services/doctor/types.d.mts.map +1 -0
- package/dist/services/doctor/types.mjs +29 -0
- package/dist/services/doctor/types.mjs.map +1 -0
- package/dist/services/drift.mjs +73 -0
- package/dist/services/drift.mjs.map +1 -0
- package/dist/services/extract.d.mts +12 -0
- package/dist/services/extract.d.mts.map +1 -0
- package/dist/services/extract.mjs +33 -0
- package/dist/services/extract.mjs.map +1 -0
- package/dist/services/features/completion.d.mts +21 -0
- package/dist/services/features/completion.d.mts.map +1 -0
- package/dist/services/features/completion.mjs +70 -0
- package/dist/services/features/completion.mjs.map +1 -0
- package/dist/services/features/feature-editor.d.mts +27 -0
- package/dist/services/features/feature-editor.d.mts.map +1 -0
- package/dist/services/features/feature-editor.mjs +37 -0
- package/dist/services/features/feature-editor.mjs.map +1 -0
- package/dist/services/features/index.d.mts +11 -0
- package/dist/services/features/index.d.mts.map +1 -0
- package/dist/services/features/index.mjs +16 -0
- package/dist/services/features/index.mjs.map +1 -0
- package/dist/services/features/validation.d.mts +21 -0
- package/dist/services/features/validation.d.mts.map +1 -0
- package/dist/services/features/validation.mjs +27 -0
- package/dist/services/features/validation.mjs.map +1 -0
- package/dist/services/fix/fix-link-formatter.d.mts +12 -0
- package/dist/services/fix/fix-link-formatter.d.mts.map +1 -0
- package/dist/services/fix/fix-link-formatter.mjs +38 -0
- package/dist/services/fix/fix-link-formatter.mjs.map +1 -0
- package/dist/services/fix/fix-service.d.mts +74 -0
- package/dist/services/fix/fix-service.d.mts.map +1 -0
- package/dist/services/fix/fix-service.mjs +169 -0
- package/dist/services/fix/fix-service.mjs.map +1 -0
- package/dist/services/fix/index.d.mts +16 -0
- package/dist/services/fix/index.d.mts.map +1 -0
- package/dist/services/fix/index.mjs +24 -0
- package/dist/services/fix/index.mjs.map +1 -0
- package/dist/services/fix/path-resolver.mjs +83 -0
- package/dist/services/fix/path-resolver.mjs.map +1 -0
- package/dist/services/fix/schemas.d.mts +17 -0
- package/dist/services/fix/schemas.d.mts.map +1 -0
- package/dist/services/fix/schemas.mjs +12 -0
- package/dist/services/fix/schemas.mjs.map +1 -0
- package/dist/services/fix/strategies/implement-ai.d.mts +18 -0
- package/dist/services/fix/strategies/implement-ai.d.mts.map +1 -0
- package/dist/services/fix/strategies/implement-ai.mjs +139 -0
- package/dist/services/fix/strategies/implement-ai.mjs.map +1 -0
- package/dist/services/fix/strategies/implement-skeleton.d.mts +14 -0
- package/dist/services/fix/strategies/implement-skeleton.d.mts.map +1 -0
- package/dist/services/fix/strategies/implement-skeleton.mjs +77 -0
- package/dist/services/fix/strategies/implement-skeleton.mjs.map +1 -0
- package/dist/services/fix/strategies/index.d.mts +3 -0
- package/dist/services/fix/strategies/remove-reference.d.mts +17 -0
- package/dist/services/fix/strategies/remove-reference.d.mts.map +1 -0
- package/dist/services/fix/strategies/remove-reference.mjs +98 -0
- package/dist/services/fix/strategies/remove-reference.mjs.map +1 -0
- package/dist/services/fix/types.d.mts +207 -0
- package/dist/services/fix/types.d.mts.map +1 -0
- package/dist/services/fix/types.mjs +20 -0
- package/dist/services/fix/types.mjs.map +1 -0
- package/dist/services/formatter.d.mts +15 -0
- package/dist/services/formatter.d.mts.map +1 -0
- package/dist/services/formatter.mjs +26 -0
- package/dist/services/formatter.mjs.map +1 -0
- package/dist/services/gap.d.mts +18 -0
- package/dist/services/gap.d.mts.map +1 -0
- package/dist/services/gap.mjs +44 -0
- package/dist/services/gap.mjs.map +1 -0
- package/dist/services/generate-artifacts.d.mts +11 -0
- package/dist/services/generate-artifacts.d.mts.map +1 -0
- package/dist/services/generate-artifacts.mjs +27 -0
- package/dist/services/generate-artifacts.mjs.map +1 -0
- package/dist/services/hooks/hooks-service.d.mts +24 -0
- package/dist/services/hooks/hooks-service.d.mts.map +1 -0
- package/dist/services/hooks/hooks-service.mjs +126 -0
- package/dist/services/hooks/hooks-service.mjs.map +1 -0
- package/dist/services/hooks/index.d.mts +10 -0
- package/dist/services/hooks/index.d.mts.map +1 -0
- package/dist/services/hooks/index.mjs +12 -0
- package/dist/services/hooks/index.mjs.map +1 -0
- package/dist/services/hooks/types.d.mts +56 -0
- package/dist/services/hooks/types.d.mts.map +1 -0
- package/dist/services/impact/formatters.d.mts +27 -0
- package/dist/services/impact/formatters.d.mts.map +1 -0
- package/dist/services/impact/formatters.mjs +139 -0
- package/dist/services/impact/formatters.mjs.map +1 -0
- package/dist/services/impact/impact-detection-service.d.mts +22 -0
- package/dist/services/impact/impact-detection-service.d.mts.map +1 -0
- package/dist/services/impact/impact-detection-service.mjs +96 -0
- package/dist/services/impact/impact-detection-service.mjs.map +1 -0
- package/dist/services/impact/index.d.mts +11 -0
- package/dist/services/impact/index.d.mts.map +1 -0
- package/dist/services/impact/index.mjs +16 -0
- package/dist/services/impact/index.mjs.map +1 -0
- package/dist/services/impact/types.d.mts +63 -0
- package/dist/services/impact/types.d.mts.map +1 -0
- package/dist/services/implementation/discovery.d.mts +30 -0
- package/dist/services/implementation/discovery.d.mts.map +1 -0
- package/dist/services/implementation/discovery.mjs +144 -0
- package/dist/services/implementation/discovery.mjs.map +1 -0
- package/dist/services/implementation/index.d.mts +6 -0
- package/dist/services/implementation/index.mjs +7 -0
- package/dist/services/implementation/resolver/conventions.d.mts +18 -0
- package/dist/services/implementation/resolver/conventions.d.mts.map +1 -0
- package/dist/services/implementation/resolver/conventions.mjs +59 -0
- package/dist/services/implementation/resolver/conventions.mjs.map +1 -0
- package/dist/services/implementation/resolver/index.d.mts +24 -0
- package/dist/services/implementation/resolver/index.d.mts.map +1 -0
- package/dist/services/implementation/resolver/index.mjs +111 -0
- package/dist/services/implementation/resolver/index.mjs.map +1 -0
- package/dist/services/implementation/resolver/parsers.d.mts +16 -0
- package/dist/services/implementation/resolver/parsers.d.mts.map +1 -0
- package/dist/services/implementation/resolver/parsers.mjs +100 -0
- package/dist/services/implementation/resolver/parsers.mjs.map +1 -0
- package/dist/services/implementation/resolver/status.d.mts +21 -0
- package/dist/services/implementation/resolver/status.d.mts.map +1 -0
- package/dist/services/implementation/resolver/status.mjs +31 -0
- package/dist/services/implementation/resolver/status.mjs.map +1 -0
- package/dist/services/implementation/types.d.mts +89 -0
- package/dist/services/implementation/types.d.mts.map +1 -0
- package/dist/services/index.d.mts +103 -0
- package/dist/services/index.mjs +100 -0
- package/dist/services/integrity-diagram.d.mts +36 -0
- package/dist/services/integrity-diagram.d.mts.map +1 -0
- package/dist/services/integrity-diagram.mjs +275 -0
- package/dist/services/integrity-diagram.mjs.map +1 -0
- package/dist/services/integrity.d.mts +152 -0
- package/dist/services/integrity.d.mts.map +1 -0
- package/dist/services/integrity.mjs +361 -0
- package/dist/services/integrity.mjs.map +1 -0
- package/dist/services/layer-discovery.d.mts +77 -0
- package/dist/services/layer-discovery.d.mts.map +1 -0
- package/dist/services/layer-discovery.mjs +121 -0
- package/dist/services/layer-discovery.mjs.map +1 -0
- package/dist/services/list.d.mts +37 -0
- package/dist/services/list.d.mts.map +1 -0
- package/dist/services/list.mjs +46 -0
- package/dist/services/list.mjs.map +1 -0
- package/dist/services/llm/index.d.mts +28 -0
- package/dist/services/llm/index.d.mts.map +1 -0
- package/dist/services/llm/index.mjs +187 -0
- package/dist/services/llm/index.mjs.map +1 -0
- package/dist/services/llm/verify-static.d.mts +26 -0
- package/dist/services/llm/verify-static.d.mts.map +1 -0
- package/dist/services/llm/verify-static.mjs +82 -0
- package/dist/services/llm/verify-static.mjs.map +1 -0
- package/dist/services/modules/module-resolver.mjs +61 -0
- package/dist/services/modules/module-resolver.mjs.map +1 -0
- package/dist/services/openapi/export-service.d.mts +53 -0
- package/dist/services/openapi/export-service.d.mts.map +1 -0
- package/dist/services/openapi/export-service.mjs +50 -0
- package/dist/services/openapi/export-service.mjs.map +1 -0
- package/dist/services/openapi/import-service.d.mts +17 -0
- package/dist/services/openapi/import-service.d.mts.map +1 -0
- package/dist/services/openapi/import-service.mjs +168 -0
- package/dist/services/openapi/import-service.mjs.map +1 -0
- package/dist/services/openapi/index.d.mts +5 -0
- package/dist/services/openapi/index.mjs +6 -0
- package/dist/services/openapi/sync-service.d.mts +17 -0
- package/dist/services/openapi/sync-service.d.mts.map +1 -0
- package/dist/services/openapi/sync-service.mjs +120 -0
- package/dist/services/openapi/sync-service.mjs.map +1 -0
- package/dist/services/openapi/types.d.mts +162 -0
- package/dist/services/openapi/types.d.mts.map +1 -0
- package/dist/services/openapi/validate-service.d.mts +16 -0
- package/dist/services/openapi/validate-service.d.mts.map +1 -0
- package/dist/services/openapi/validate-service.mjs +130 -0
- package/dist/services/openapi/validate-service.mjs.map +1 -0
- package/dist/services/quickstart/dependencies.d.mts +31 -0
- package/dist/services/quickstart/dependencies.d.mts.map +1 -0
- package/dist/services/quickstart/dependencies.mjs +57 -0
- package/dist/services/quickstart/dependencies.mjs.map +1 -0
- package/dist/services/quickstart/index.mjs +4 -0
- package/dist/services/quickstart/quickstart-service.d.mts +20 -0
- package/dist/services/quickstart/quickstart-service.d.mts.map +1 -0
- package/dist/services/quickstart/quickstart-service.mjs +196 -0
- package/dist/services/quickstart/quickstart-service.mjs.map +1 -0
- package/dist/services/quickstart/types.d.mts +81 -0
- package/dist/services/quickstart/types.d.mts.map +1 -0
- package/dist/services/regenerator.d.mts +18 -0
- package/dist/services/regenerator.d.mts.map +1 -0
- package/dist/services/regenerator.mjs +23 -0
- package/dist/services/regenerator.mjs.map +1 -0
- package/dist/services/registry.d.mts +53 -0
- package/dist/services/registry.d.mts.map +1 -0
- package/dist/services/registry.mjs +74 -0
- package/dist/services/registry.mjs.map +1 -0
- package/dist/services/rulesync.d.mts +17 -0
- package/dist/services/rulesync.d.mts.map +1 -0
- package/dist/services/rulesync.mjs +71 -0
- package/dist/services/rulesync.mjs.map +1 -0
- package/dist/services/setup/config-generators.d.mts +42 -0
- package/dist/services/setup/config-generators.d.mts.map +1 -0
- package/dist/services/setup/config-generators.mjs +252 -0
- package/dist/services/setup/config-generators.mjs.map +1 -0
- package/dist/services/setup/file-merger.d.mts +27 -0
- package/dist/services/setup/file-merger.d.mts.map +1 -0
- package/dist/services/setup/file-merger.mjs +61 -0
- package/dist/services/setup/file-merger.mjs.map +1 -0
- package/dist/services/setup/setup-service.d.mts +12 -0
- package/dist/services/setup/setup-service.d.mts.map +1 -0
- package/dist/services/setup/setup-service.mjs +96 -0
- package/dist/services/setup/setup-service.mjs.map +1 -0
- package/dist/services/setup/targets/agents-md.mjs +47 -0
- package/dist/services/setup/targets/agents-md.mjs.map +1 -0
- package/dist/services/setup/targets/cli-config.mjs +60 -0
- package/dist/services/setup/targets/cli-config.mjs.map +1 -0
- package/dist/services/setup/targets/cursor-rules.mjs +48 -0
- package/dist/services/setup/targets/cursor-rules.mjs.map +1 -0
- package/dist/services/setup/targets/mcp-claude.mjs +60 -0
- package/dist/services/setup/targets/mcp-claude.mjs.map +1 -0
- package/dist/services/setup/targets/mcp-cursor.mjs +59 -0
- package/dist/services/setup/targets/mcp-cursor.mjs.map +1 -0
- package/dist/services/setup/targets/vscode-settings.mjs +63 -0
- package/dist/services/setup/targets/vscode-settings.mjs.map +1 -0
- package/dist/services/setup/types.d.mts +85 -0
- package/dist/services/setup/types.d.mts.map +1 -0
- package/dist/services/setup/types.mjs +27 -0
- package/dist/services/setup/types.mjs.map +1 -0
- package/dist/services/sync.d.mts +42 -0
- package/dist/services/sync.d.mts.map +1 -0
- package/dist/services/sync.mjs +64 -0
- package/dist/services/sync.mjs.map +1 -0
- package/dist/services/test/index.d.mts +2 -0
- package/dist/services/test/index.mjs +4 -0
- package/dist/services/test/test-generator-service.d.mts +24 -0
- package/dist/services/test/test-generator-service.d.mts.map +1 -0
- package/dist/services/test/test-generator-service.mjs +92 -0
- package/dist/services/test/test-generator-service.mjs.map +1 -0
- package/dist/services/test/test-service.d.mts +27 -0
- package/dist/services/test/test-service.d.mts.map +1 -0
- package/dist/services/test/test-service.mjs +94 -0
- package/dist/services/test/test-service.mjs.map +1 -0
- package/dist/services/test-link/index.d.mts +18 -0
- package/dist/services/test-link/index.d.mts.map +1 -0
- package/dist/services/test-link/index.mjs +60 -0
- package/dist/services/test-link/index.mjs.map +1 -0
- package/dist/services/test-link/test-ref-validator.d.mts +2 -0
- package/dist/services/test-link/test-ref-validator.mjs +50 -0
- package/dist/services/test-link/test-ref-validator.mjs.map +1 -0
- package/dist/services/upgrade/index.d.mts +10 -0
- package/dist/services/upgrade/index.d.mts.map +1 -0
- package/dist/services/upgrade/index.mjs +15 -0
- package/dist/services/upgrade/index.mjs.map +1 -0
- package/dist/services/upgrade/types.d.mts +78 -0
- package/dist/services/upgrade/types.d.mts.map +1 -0
- package/dist/services/upgrade/upgrade-service.d.mts +38 -0
- package/dist/services/upgrade/upgrade-service.d.mts.map +1 -0
- package/dist/services/upgrade/upgrade-service.mjs +201 -0
- package/dist/services/upgrade/upgrade-service.mjs.map +1 -0
- package/dist/services/validate/blueprint-validator.d.mts +23 -0
- package/dist/services/validate/blueprint-validator.d.mts.map +1 -0
- package/dist/services/validate/blueprint-validator.mjs +50 -0
- package/dist/services/validate/blueprint-validator.mjs.map +1 -0
- package/dist/services/validate/implementation-agent-validator.d.mts +20 -0
- package/dist/services/validate/implementation-agent-validator.d.mts.map +1 -0
- package/dist/services/validate/implementation-agent-validator.mjs +42 -0
- package/dist/services/validate/implementation-agent-validator.mjs.map +1 -0
- package/dist/services/validate/implementation-validator.d.mts +32 -0
- package/dist/services/validate/implementation-validator.d.mts.map +1 -0
- package/dist/services/validate/implementation-validator.mjs +64 -0
- package/dist/services/validate/implementation-validator.mjs.map +1 -0
- package/dist/services/validate/index.d.mts +5 -0
- package/dist/services/validate/index.mjs +7 -0
- package/dist/services/validate/spec-validator.d.mts +42 -0
- package/dist/services/validate/spec-validator.d.mts.map +1 -0
- package/dist/services/validate/spec-validator.mjs +49 -0
- package/dist/services/validate/spec-validator.mjs.map +1 -0
- package/dist/services/validate/tenant-validator.d.mts +21 -0
- package/dist/services/validate/tenant-validator.d.mts.map +1 -0
- package/dist/services/validate/tenant-validator.mjs +165 -0
- package/dist/services/validate/tenant-validator.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.d.mts +46 -0
- package/dist/services/verification-cache/adapters/filesystem.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/filesystem.mjs +120 -0
- package/dist/services/verification-cache/adapters/filesystem.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.d.mts +27 -0
- package/dist/services/verification-cache/adapters/in-memory.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/in-memory.mjs +46 -0
- package/dist/services/verification-cache/adapters/in-memory.mjs.map +1 -0
- package/dist/services/verification-cache/adapters/index.d.mts +3 -0
- package/dist/services/verification-cache/adapters/index.mjs +5 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.mts +49 -0
- package/dist/services/verification-cache/adapters/workspace-state.d.mts.map +1 -0
- package/dist/services/verification-cache/adapters/workspace-state.mjs +91 -0
- package/dist/services/verification-cache/adapters/workspace-state.mjs.map +1 -0
- package/dist/services/verification-cache/cache-service.d.mts +70 -0
- package/dist/services/verification-cache/cache-service.d.mts.map +1 -0
- package/dist/services/verification-cache/cache-service.mjs +256 -0
- package/dist/services/verification-cache/cache-service.mjs.map +1 -0
- package/dist/services/verification-cache/index.d.mts +6 -0
- package/dist/services/verification-cache/index.mjs +8 -0
- package/dist/services/verification-cache/types.d.mts +124 -0
- package/dist/services/verification-cache/types.d.mts.map +1 -0
- package/dist/services/verification-cache/types.mjs +16 -0
- package/dist/services/verification-cache/types.mjs.map +1 -0
- package/dist/services/verify/ai-verifier.d.mts +25 -0
- package/dist/services/verify/ai-verifier.d.mts.map +1 -0
- package/dist/services/verify/ai-verifier.mjs +403 -0
- package/dist/services/verify/ai-verifier.mjs.map +1 -0
- package/dist/services/verify/behavior-verifier.d.mts +12 -0
- package/dist/services/verify/behavior-verifier.d.mts.map +1 -0
- package/dist/services/verify/behavior-verifier.mjs +186 -0
- package/dist/services/verify/behavior-verifier.mjs.map +1 -0
- package/dist/services/verify/index.d.mts +5 -0
- package/dist/services/verify/index.mjs +6 -0
- package/dist/services/verify/structure-verifier.d.mts +12 -0
- package/dist/services/verify/structure-verifier.d.mts.map +1 -0
- package/dist/services/verify/structure-verifier.mjs +196 -0
- package/dist/services/verify/structure-verifier.mjs.map +1 -0
- package/dist/services/verify/types.d.mts +137 -0
- package/dist/services/verify/types.d.mts.map +1 -0
- package/dist/services/verify/verify-service.d.mts +60 -0
- package/dist/services/verify/verify-service.d.mts.map +1 -0
- package/dist/services/verify/verify-service.mjs +204 -0
- package/dist/services/verify/verify-service.mjs.map +1 -0
- package/dist/services/versioning/changelog-formatter.d.mts +24 -0
- package/dist/services/versioning/changelog-formatter.d.mts.map +1 -0
- package/dist/services/versioning/changelog-formatter.mjs +155 -0
- package/dist/services/versioning/changelog-formatter.mjs.map +1 -0
- package/dist/services/versioning/conventional-commits.d.mts +95 -0
- package/dist/services/versioning/conventional-commits.d.mts.map +1 -0
- package/dist/services/versioning/conventional-commits.mjs +184 -0
- package/dist/services/versioning/conventional-commits.mjs.map +1 -0
- package/dist/services/versioning/index.d.mts +12 -0
- package/dist/services/versioning/index.d.mts.map +1 -0
- package/dist/services/versioning/index.mjs +28 -0
- package/dist/services/versioning/index.mjs.map +1 -0
- package/dist/services/versioning/types.d.mts +135 -0
- package/dist/services/versioning/types.d.mts.map +1 -0
- package/dist/services/versioning/versioning-service.d.mts +74 -0
- package/dist/services/versioning/versioning-service.d.mts.map +1 -0
- package/dist/services/versioning/versioning-service.mjs +501 -0
- package/dist/services/versioning/versioning-service.mjs.map +1 -0
- package/dist/services/vibe/config.d.mts +12 -0
- package/dist/services/vibe/config.d.mts.map +1 -0
- package/dist/services/vibe/config.mjs +43 -0
- package/dist/services/vibe/config.mjs.map +1 -0
- package/dist/services/vibe/context.d.mts +19 -0
- package/dist/services/vibe/context.d.mts.map +1 -0
- package/dist/services/vibe/context.mjs +92 -0
- package/dist/services/vibe/context.mjs.map +1 -0
- package/dist/services/vibe/definitions.d.mts +8 -0
- package/dist/services/vibe/definitions.d.mts.map +1 -0
- package/dist/services/vibe/definitions.mjs +129 -0
- package/dist/services/vibe/definitions.mjs.map +1 -0
- package/dist/services/vibe/engine.d.mts +44 -0
- package/dist/services/vibe/engine.d.mts.map +1 -0
- package/dist/services/vibe/engine.mjs +147 -0
- package/dist/services/vibe/engine.mjs.map +1 -0
- package/dist/services/vibe/index.d.mts +15 -0
- package/dist/services/vibe/index.d.mts.map +1 -0
- package/dist/services/vibe/index.mjs +26 -0
- package/dist/services/vibe/index.mjs.map +1 -0
- package/dist/services/vibe/loader.d.mts +15 -0
- package/dist/services/vibe/loader.d.mts.map +1 -0
- package/dist/services/vibe/loader.mjs +48 -0
- package/dist/services/vibe/loader.mjs.map +1 -0
- package/dist/services/vibe/pack.d.mts +19 -0
- package/dist/services/vibe/pack.d.mts.map +1 -0
- package/dist/services/vibe/pack.mjs +66 -0
- package/dist/services/vibe/pack.mjs.map +1 -0
- package/dist/services/vibe/types.d.mts +59 -0
- package/dist/services/vibe/types.d.mts.map +1 -0
- package/dist/services/vibe/types.mjs +12 -0
- package/dist/services/vibe/types.mjs.map +1 -0
- package/dist/services/view/index.d.mts +11 -0
- package/dist/services/view/index.d.mts.map +1 -0
- package/dist/services/view/index.mjs +119 -0
- package/dist/services/view/index.mjs.map +1 -0
- package/dist/services/watch.d.mts +25 -0
- package/dist/services/watch.d.mts.map +1 -0
- package/dist/services/watch.mjs +33 -0
- package/dist/services/watch.mjs.map +1 -0
- package/dist/services/workspace-info.d.mts +62 -0
- package/dist/services/workspace-info.d.mts.map +1 -0
- package/dist/services/workspace-info.mjs +103 -0
- package/dist/services/workspace-info.mjs.map +1 -0
- package/dist/templates/app-config.template.d.mts +7 -0
- package/dist/templates/app-config.template.d.mts.map +1 -0
- package/dist/templates/app-config.template.mjs +107 -0
- package/dist/templates/app-config.template.mjs.map +1 -0
- package/dist/templates/data-view.template.d.mts +7 -0
- package/dist/templates/data-view.template.d.mts.map +1 -0
- package/dist/templates/data-view.template.mjs +70 -0
- package/dist/templates/data-view.template.mjs.map +1 -0
- package/dist/templates/event.template.d.mts +11 -0
- package/dist/templates/event.template.d.mts.map +1 -0
- package/dist/templates/event.template.mjs +42 -0
- package/dist/templates/event.template.mjs.map +1 -0
- package/dist/templates/experiment.template.d.mts +7 -0
- package/dist/templates/experiment.template.d.mts.map +1 -0
- package/dist/templates/experiment.template.mjs +89 -0
- package/dist/templates/experiment.template.mjs.map +1 -0
- package/dist/templates/feature.template.d.mts +33 -0
- package/dist/templates/feature.template.d.mts.map +1 -0
- package/dist/templates/feature.template.mjs +52 -0
- package/dist/templates/feature.template.mjs.map +1 -0
- package/dist/templates/fix/skeleton-capability.mjs +49 -0
- package/dist/templates/fix/skeleton-capability.mjs.map +1 -0
- package/dist/templates/fix/skeleton-event.mjs +56 -0
- package/dist/templates/fix/skeleton-event.mjs.map +1 -0
- package/dist/templates/fix/skeleton-operation.mjs +122 -0
- package/dist/templates/fix/skeleton-operation.mjs.map +1 -0
- package/dist/templates/fix/skeleton-presentation.mjs +65 -0
- package/dist/templates/fix/skeleton-presentation.mjs.map +1 -0
- package/dist/templates/fix/utils.mjs +34 -0
- package/dist/templates/fix/utils.mjs.map +1 -0
- package/dist/templates/handler.template.d.mts +16 -0
- package/dist/templates/handler.template.d.mts.map +1 -0
- package/dist/templates/handler.template.mjs +100 -0
- package/dist/templates/handler.template.mjs.map +1 -0
- package/dist/templates/index.d.mts +22 -0
- package/dist/templates/index.d.mts.map +1 -0
- package/dist/templates/index.mjs +39 -0
- package/dist/templates/index.mjs.map +1 -0
- package/dist/templates/integration.template.d.mts +7 -0
- package/dist/templates/integration.template.d.mts.map +1 -0
- package/dist/templates/integration.template.mjs +160 -0
- package/dist/templates/integration.template.mjs.map +1 -0
- package/dist/templates/knowledge.template.d.mts +7 -0
- package/dist/templates/knowledge.template.d.mts.map +1 -0
- package/dist/templates/knowledge.template.mjs +75 -0
- package/dist/templates/knowledge.template.mjs.map +1 -0
- package/dist/templates/migration.template.d.mts +7 -0
- package/dist/templates/migration.template.d.mts.map +1 -0
- package/dist/templates/migration.template.mjs +62 -0
- package/dist/templates/migration.template.mjs.map +1 -0
- package/dist/templates/operation.template.d.mts +11 -0
- package/dist/templates/operation.template.d.mts.map +1 -0
- package/dist/templates/operation.template.mjs +107 -0
- package/dist/templates/operation.template.mjs.map +1 -0
- package/dist/templates/presentation.template.d.mts +11 -0
- package/dist/templates/presentation.template.d.mts.map +1 -0
- package/dist/templates/presentation.template.mjs +80 -0
- package/dist/templates/presentation.template.mjs.map +1 -0
- package/dist/templates/telemetry.template.d.mts +7 -0
- package/dist/templates/telemetry.template.d.mts.map +1 -0
- package/dist/templates/telemetry.template.mjs +91 -0
- package/dist/templates/telemetry.template.mjs.map +1 -0
- package/dist/templates/workflow-runner.template.d.mts +16 -0
- package/dist/templates/workflow-runner.template.d.mts.map +1 -0
- package/dist/templates/workflow-runner.template.mjs +50 -0
- package/dist/templates/workflow-runner.template.mjs.map +1 -0
- package/dist/templates/workflow.template.d.mts +7 -0
- package/dist/templates/workflow.template.d.mts.map +1 -0
- package/dist/templates/workflow.template.mjs +69 -0
- package/dist/templates/workflow.template.mjs.map +1 -0
- package/dist/types/config.d.mts +34 -0
- package/dist/types/config.d.mts.map +1 -0
- package/dist/types.d.mts +324 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/utils/filter.d.mts +16 -0
- package/dist/utils/filter.d.mts.map +1 -0
- package/dist/utils/filter.mjs +22 -0
- package/dist/utils/filter.mjs.map +1 -0
- package/dist/utils/index.d.mts +11 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +20 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/module-loader.d.mts +5 -0
- package/dist/utils/module-loader.d.mts.map +1 -0
- package/dist/utils/module-loader.mjs +41 -0
- package/dist/utils/module-loader.mjs.map +1 -0
- package/dist/utils/validation.d.mts +37 -0
- package/dist/utils/validation.d.mts.map +1 -0
- package/dist/utils/validation.mjs +43 -0
- package/dist/utils/validation.mjs.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
//#region src/services/doctor/checks/workspace.ts
|
|
2
|
+
/**
|
|
3
|
+
* Common contract directory paths to check.
|
|
4
|
+
*/
|
|
5
|
+
const CONTRACT_PATHS = [
|
|
6
|
+
"src/contracts",
|
|
7
|
+
"contracts",
|
|
8
|
+
"src/specs",
|
|
9
|
+
"specs"
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Run workspace-related health checks.
|
|
13
|
+
*/
|
|
14
|
+
async function runWorkspaceChecks(fs, ctx) {
|
|
15
|
+
const results = [];
|
|
16
|
+
results.push(checkMonorepoStatus(ctx));
|
|
17
|
+
results.push(await checkValidWorkspace(fs, ctx));
|
|
18
|
+
results.push(await checkContractsDirectory(fs, ctx));
|
|
19
|
+
results.push(await checkContractFiles(fs, ctx));
|
|
20
|
+
results.push(await checkOutputDirectory(fs, ctx));
|
|
21
|
+
return results;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Report monorepo detection status.
|
|
25
|
+
*/
|
|
26
|
+
function checkMonorepoStatus(ctx) {
|
|
27
|
+
if (ctx.isMonorepo) {
|
|
28
|
+
const pkgInfo = ctx.packageName ? ` in package "${ctx.packageName}"` : "";
|
|
29
|
+
const locationInfo = ctx.packageRoot !== ctx.workspaceRoot ? ` (package root: ${ctx.packageRoot})` : "";
|
|
30
|
+
return {
|
|
31
|
+
category: "workspace",
|
|
32
|
+
name: "Monorepo Detection",
|
|
33
|
+
status: "pass",
|
|
34
|
+
message: `Monorepo detected${pkgInfo}`,
|
|
35
|
+
details: ctx.verbose ? `Workspace root: ${ctx.workspaceRoot}${locationInfo}` : void 0
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
category: "workspace",
|
|
40
|
+
name: "Monorepo Detection",
|
|
41
|
+
status: "pass",
|
|
42
|
+
message: "Single project (not a monorepo)"
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if this is a valid workspace.
|
|
47
|
+
*/
|
|
48
|
+
async function checkValidWorkspace(fs, ctx) {
|
|
49
|
+
const pathsToCheck = ctx.isMonorepo ? [ctx.packageRoot, ctx.workspaceRoot] : [ctx.workspaceRoot];
|
|
50
|
+
for (const root of pathsToCheck) {
|
|
51
|
+
const packageJsonPath = fs.join(root, "package.json");
|
|
52
|
+
if (await fs.exists(packageJsonPath)) return {
|
|
53
|
+
category: "workspace",
|
|
54
|
+
name: "Valid Workspace",
|
|
55
|
+
status: "pass",
|
|
56
|
+
message: "package.json found",
|
|
57
|
+
details: ctx.verbose && ctx.isMonorepo ? `Found at: ${root}` : void 0
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
category: "workspace",
|
|
62
|
+
name: "Valid Workspace",
|
|
63
|
+
status: "fail",
|
|
64
|
+
message: "No package.json found",
|
|
65
|
+
details: "This does not appear to be a Node.js/TypeScript project"
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if contracts directory exists.
|
|
70
|
+
*
|
|
71
|
+
* In monorepo: checks current package first, then workspace root.
|
|
72
|
+
*/
|
|
73
|
+
async function checkContractsDirectory(fs, ctx) {
|
|
74
|
+
const searchRoots = ctx.isMonorepo ? [ctx.packageRoot, ctx.workspaceRoot] : [ctx.workspaceRoot];
|
|
75
|
+
const targetRoot = ctx.isMonorepo ? ctx.packageRoot : ctx.workspaceRoot;
|
|
76
|
+
for (const root of searchRoots) for (const path of CONTRACT_PATHS) {
|
|
77
|
+
const fullPath = fs.join(root, path);
|
|
78
|
+
if (await fs.exists(fullPath)) {
|
|
79
|
+
const relativeTo = root === ctx.packageRoot ? "package" : "workspace";
|
|
80
|
+
return {
|
|
81
|
+
category: "workspace",
|
|
82
|
+
name: "Contracts Directory",
|
|
83
|
+
status: "pass",
|
|
84
|
+
message: `Contracts directory found: ${path}`,
|
|
85
|
+
details: ctx.isMonorepo ? `Found at ${relativeTo} level` : void 0
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) return {
|
|
90
|
+
category: "workspace",
|
|
91
|
+
name: "Contracts Directory",
|
|
92
|
+
status: "pass",
|
|
93
|
+
message: "Monorepo root detected (contracts expected in packages)"
|
|
94
|
+
};
|
|
95
|
+
const createPath = ctx.isMonorepo ? "src/contracts" : "src/contracts";
|
|
96
|
+
const locationHint = ctx.isMonorepo ? ` in package "${ctx.packageName ?? ctx.packageRoot}"` : "";
|
|
97
|
+
return {
|
|
98
|
+
category: "workspace",
|
|
99
|
+
name: "Contracts Directory",
|
|
100
|
+
status: "warn",
|
|
101
|
+
message: "No contracts directory found",
|
|
102
|
+
details: `Create ${createPath}/${locationHint} to organize your specs`,
|
|
103
|
+
fix: {
|
|
104
|
+
description: `Create ${createPath}/ directory${locationHint}`,
|
|
105
|
+
apply: async () => {
|
|
106
|
+
try {
|
|
107
|
+
const contractsDir = fs.join(targetRoot, "src", "contracts");
|
|
108
|
+
await fs.mkdir(contractsDir);
|
|
109
|
+
return {
|
|
110
|
+
success: true,
|
|
111
|
+
message: `Created ${createPath}/`
|
|
112
|
+
};
|
|
113
|
+
} catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
message: `Failed: ${error instanceof Error ? error.message : String(error)}`
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if any contract files exist.
|
|
125
|
+
*
|
|
126
|
+
* In monorepo: searches from current package root.
|
|
127
|
+
*/
|
|
128
|
+
async function checkContractFiles(fs, ctx) {
|
|
129
|
+
try {
|
|
130
|
+
const patterns = [
|
|
131
|
+
"**/*.operation.ts",
|
|
132
|
+
"**/*.event.ts",
|
|
133
|
+
"**/*.presentation.ts",
|
|
134
|
+
"**/*.feature.ts"
|
|
135
|
+
];
|
|
136
|
+
const searchRoot = ctx.isMonorepo ? ctx.packageRoot : ctx.workspaceRoot;
|
|
137
|
+
const files = await fs.glob({
|
|
138
|
+
patterns,
|
|
139
|
+
ignore: ["node_modules/**", "dist/**"],
|
|
140
|
+
cwd: searchRoot
|
|
141
|
+
});
|
|
142
|
+
if (files.length > 0) {
|
|
143
|
+
const locationInfo = ctx.isMonorepo ? " (in current package)" : "";
|
|
144
|
+
return {
|
|
145
|
+
category: "workspace",
|
|
146
|
+
name: "Contract Files",
|
|
147
|
+
status: "pass",
|
|
148
|
+
message: `Found ${files.length} contract file(s)${locationInfo}`,
|
|
149
|
+
details: ctx.verbose ? files.slice(0, 5).join(", ") : void 0
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) return {
|
|
153
|
+
category: "workspace",
|
|
154
|
+
name: "Contract Files",
|
|
155
|
+
status: "pass",
|
|
156
|
+
message: "No contract files in root (expected in packages)"
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
category: "workspace",
|
|
160
|
+
name: "Contract Files",
|
|
161
|
+
status: "warn",
|
|
162
|
+
message: ctx.isMonorepo ? `No contract files found in package "${ctx.packageName ?? "current"}"` : "No contract files found",
|
|
163
|
+
details: "Create specs using \"contractspec create\" or VS Code command"
|
|
164
|
+
};
|
|
165
|
+
} catch {
|
|
166
|
+
return {
|
|
167
|
+
category: "workspace",
|
|
168
|
+
name: "Contract Files",
|
|
169
|
+
status: "skip",
|
|
170
|
+
message: "Could not search for contract files"
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Find the config file, checking package level first in monorepos.
|
|
176
|
+
*/
|
|
177
|
+
async function findConfigFile(fs, ctx) {
|
|
178
|
+
if (ctx.isMonorepo && ctx.packageRoot !== ctx.workspaceRoot) {
|
|
179
|
+
const pkgConfigPath = fs.join(ctx.packageRoot, ".contractsrc.json");
|
|
180
|
+
if (await fs.exists(pkgConfigPath)) return {
|
|
181
|
+
path: pkgConfigPath,
|
|
182
|
+
root: ctx.packageRoot,
|
|
183
|
+
level: "package"
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const wsConfigPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
187
|
+
if (await fs.exists(wsConfigPath)) return {
|
|
188
|
+
path: wsConfigPath,
|
|
189
|
+
root: ctx.workspaceRoot,
|
|
190
|
+
level: "workspace"
|
|
191
|
+
};
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if output directory is configured and exists.
|
|
196
|
+
*
|
|
197
|
+
* In monorepo: checks package-level config first, then workspace-level.
|
|
198
|
+
* Resolves outputDir relative to the config file location.
|
|
199
|
+
*/
|
|
200
|
+
async function checkOutputDirectory(fs, ctx) {
|
|
201
|
+
try {
|
|
202
|
+
const configInfo = await findConfigFile(fs, ctx);
|
|
203
|
+
if (!configInfo) return {
|
|
204
|
+
category: "workspace",
|
|
205
|
+
name: "Output Directory",
|
|
206
|
+
status: "skip",
|
|
207
|
+
message: ctx.isMonorepo ? "No config file found at package or workspace level" : "No config file to check output directory"
|
|
208
|
+
};
|
|
209
|
+
const content = await fs.readFile(configInfo.path);
|
|
210
|
+
const config = JSON.parse(content);
|
|
211
|
+
const outputDir = config.outputDir ?? "./src";
|
|
212
|
+
const outputPath = fs.join(configInfo.root, outputDir);
|
|
213
|
+
const levelInfo = ctx.isMonorepo ? ` (${configInfo.level} level)` : "";
|
|
214
|
+
if (await fs.exists(outputPath)) return {
|
|
215
|
+
category: "workspace",
|
|
216
|
+
name: "Output Directory",
|
|
217
|
+
status: "pass",
|
|
218
|
+
message: `Output directory exists: ${outputDir}${levelInfo}`,
|
|
219
|
+
details: ctx.verbose ? `Resolved to: ${outputPath}` : void 0
|
|
220
|
+
};
|
|
221
|
+
if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot && !config.outputDir) return {
|
|
222
|
+
category: "workspace",
|
|
223
|
+
name: "Output Directory",
|
|
224
|
+
status: "pass",
|
|
225
|
+
message: "Monorepo root detected (using package directories)"
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
category: "workspace",
|
|
229
|
+
name: "Output Directory",
|
|
230
|
+
status: "warn",
|
|
231
|
+
message: `Output directory not found: ${outputDir}${levelInfo}`,
|
|
232
|
+
details: ctx.verbose ? `Expected at: ${outputPath}` : void 0,
|
|
233
|
+
fix: {
|
|
234
|
+
description: `Create ${outputDir} directory`,
|
|
235
|
+
apply: async () => {
|
|
236
|
+
try {
|
|
237
|
+
await fs.mkdir(outputPath);
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
message: `Created ${outputDir}`
|
|
241
|
+
};
|
|
242
|
+
} catch (error) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
message: `Failed: ${error instanceof Error ? error.message : String(error)}`
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
} catch {
|
|
252
|
+
return {
|
|
253
|
+
category: "workspace",
|
|
254
|
+
name: "Output Directory",
|
|
255
|
+
status: "skip",
|
|
256
|
+
message: "Could not check output directory"
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
//#endregion
|
|
262
|
+
export { runWorkspaceChecks };
|
|
263
|
+
//# sourceMappingURL=workspace.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.mjs","names":[],"sources":["../../../../src/services/doctor/checks/workspace.ts"],"sourcesContent":["/**\n * Workspace structure health checks.\n *\n * Monorepo-aware checks for contracts and output directories.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { CheckContext, CheckResult, FixResult } from '../types';\n\n/**\n * Common contract directory paths to check.\n */\nconst CONTRACT_PATHS = ['src/contracts', 'contracts', 'src/specs', 'specs'];\n\n/**\n * Run workspace-related health checks.\n */\nexport async function runWorkspaceChecks(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n // Check monorepo status first (informational)\n results.push(checkMonorepoStatus(ctx));\n\n // Check if this is a valid workspace (has package.json)\n results.push(await checkValidWorkspace(fs, ctx));\n\n // Check if contracts directory exists (monorepo-aware)\n results.push(await checkContractsDirectory(fs, ctx));\n\n // Check if any contract files exist\n results.push(await checkContractFiles(fs, ctx));\n\n // Check output directory (monorepo-aware)\n results.push(await checkOutputDirectory(fs, ctx));\n\n return results;\n}\n\n/**\n * Report monorepo detection status.\n */\nfunction checkMonorepoStatus(ctx: CheckContext): CheckResult {\n if (ctx.isMonorepo) {\n const pkgInfo = ctx.packageName ? ` in package \"${ctx.packageName}\"` : '';\n const locationInfo =\n ctx.packageRoot !== ctx.workspaceRoot\n ? ` (package root: ${ctx.packageRoot})`\n : '';\n return {\n category: 'workspace',\n name: 'Monorepo Detection',\n status: 'pass',\n message: `Monorepo detected${pkgInfo}`,\n details: ctx.verbose\n ? `Workspace root: ${ctx.workspaceRoot}${locationInfo}`\n : undefined,\n };\n }\n\n return {\n category: 'workspace',\n name: 'Monorepo Detection',\n status: 'pass',\n message: 'Single project (not a monorepo)',\n };\n}\n\n/**\n * Check if this is a valid workspace.\n */\nasync function checkValidWorkspace(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n // In monorepo, check both workspace root and package root\n const pathsToCheck = ctx.isMonorepo\n ? [ctx.packageRoot, ctx.workspaceRoot]\n : [ctx.workspaceRoot];\n\n for (const root of pathsToCheck) {\n const packageJsonPath = fs.join(root, 'package.json');\n if (await fs.exists(packageJsonPath)) {\n return {\n category: 'workspace',\n name: 'Valid Workspace',\n status: 'pass',\n message: 'package.json found',\n details:\n ctx.verbose && ctx.isMonorepo ? `Found at: ${root}` : undefined,\n };\n }\n }\n\n return {\n category: 'workspace',\n name: 'Valid Workspace',\n status: 'fail',\n message: 'No package.json found',\n details: 'This does not appear to be a Node.js/TypeScript project',\n };\n}\n\n/**\n * Check if contracts directory exists.\n *\n * In monorepo: checks current package first, then workspace root.\n */\nasync function checkContractsDirectory(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n // Determine where to look and where to create\n const searchRoots = ctx.isMonorepo\n ? [ctx.packageRoot, ctx.workspaceRoot]\n : [ctx.workspaceRoot];\n\n // Prefer creating in package root for monorepos\n const targetRoot = ctx.isMonorepo ? ctx.packageRoot : ctx.workspaceRoot;\n\n // Check each possible location\n for (const root of searchRoots) {\n for (const path of CONTRACT_PATHS) {\n const fullPath = fs.join(root, path);\n if (await fs.exists(fullPath)) {\n const relativeTo = root === ctx.packageRoot ? 'package' : 'workspace';\n return {\n category: 'workspace',\n name: 'Contracts Directory',\n status: 'pass',\n message: `Contracts directory found: ${path}`,\n details: ctx.isMonorepo ? `Found at ${relativeTo} level` : undefined,\n };\n }\n }\n }\n\n // Not found - check if we are at monorepo root\n if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) {\n return {\n category: 'workspace',\n name: 'Contracts Directory',\n status: 'pass',\n message: 'Monorepo root detected (contracts expected in packages)',\n };\n }\n\n // Not found - suggest creating in appropriate location\n const createPath = ctx.isMonorepo ? 'src/contracts' : 'src/contracts';\n const locationHint = ctx.isMonorepo\n ? ` in package \"${ctx.packageName ?? ctx.packageRoot}\"`\n : '';\n\n return {\n category: 'workspace',\n name: 'Contracts Directory',\n status: 'warn',\n message: 'No contracts directory found',\n details: `Create ${createPath}/${locationHint} to organize your specs`,\n fix: {\n description: `Create ${createPath}/ directory${locationHint}`,\n apply: async (): Promise<FixResult> => {\n try {\n const contractsDir = fs.join(targetRoot, 'src', 'contracts');\n await fs.mkdir(contractsDir);\n return { success: true, message: `Created ${createPath}/` };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n}\n\n/**\n * Check if any contract files exist.\n *\n * In monorepo: searches from current package root.\n */\nasync function checkContractFiles(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n try {\n const patterns = [\n '**/*.operation.ts',\n '**/*.event.ts',\n '**/*.presentation.ts',\n '**/*.feature.ts',\n ];\n\n // In monorepo, search from package root; otherwise workspace root\n const searchRoot = ctx.isMonorepo ? ctx.packageRoot : ctx.workspaceRoot;\n\n const files = await fs.glob({\n patterns,\n ignore: ['node_modules/**', 'dist/**'],\n cwd: searchRoot,\n });\n\n if (files.length > 0) {\n const locationInfo = ctx.isMonorepo ? ' (in current package)' : '';\n return {\n category: 'workspace',\n name: 'Contract Files',\n status: 'pass',\n message: `Found ${files.length} contract file(s)${locationInfo}`,\n details: ctx.verbose ? files.slice(0, 5).join(', ') : undefined,\n };\n }\n\n // Pass if monorepo root and no files (likely empty root)\n if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) {\n return {\n category: 'workspace',\n name: 'Contract Files',\n status: 'pass',\n message: 'No contract files in root (expected in packages)',\n };\n }\n\n const hint = ctx.isMonorepo\n ? `No contract files found in package \"${ctx.packageName ?? 'current'}\"`\n : 'No contract files found';\n\n return {\n category: 'workspace',\n name: 'Contract Files',\n status: 'warn',\n message: hint,\n details: 'Create specs using \"contractspec create\" or VS Code command',\n };\n } catch {\n return {\n category: 'workspace',\n name: 'Contract Files',\n status: 'skip',\n message: 'Could not search for contract files',\n };\n }\n}\n\n/**\n * Find the config file, checking package level first in monorepos.\n */\nasync function findConfigFile(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<{\n path: string;\n root: string;\n level: 'package' | 'workspace';\n} | null> {\n // In monorepo, check package level first\n if (ctx.isMonorepo && ctx.packageRoot !== ctx.workspaceRoot) {\n const pkgConfigPath = fs.join(ctx.packageRoot, '.contractsrc.json');\n if (await fs.exists(pkgConfigPath)) {\n return { path: pkgConfigPath, root: ctx.packageRoot, level: 'package' };\n }\n }\n\n // Check workspace level\n const wsConfigPath = fs.join(ctx.workspaceRoot, '.contractsrc.json');\n if (await fs.exists(wsConfigPath)) {\n return { path: wsConfigPath, root: ctx.workspaceRoot, level: 'workspace' };\n }\n\n return null;\n}\n\n/**\n * Check if output directory is configured and exists.\n *\n * In monorepo: checks package-level config first, then workspace-level.\n * Resolves outputDir relative to the config file location.\n */\nasync function checkOutputDirectory(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n try {\n const configInfo = await findConfigFile(fs, ctx);\n\n if (!configInfo) {\n const hint = ctx.isMonorepo\n ? 'No config file found at package or workspace level'\n : 'No config file to check output directory';\n return {\n category: 'workspace',\n name: 'Output Directory',\n status: 'skip',\n message: hint,\n };\n }\n\n const content = await fs.readFile(configInfo.path);\n const config = JSON.parse(content) as { outputDir?: string };\n\n const outputDir = config.outputDir ?? './src';\n // Resolve outputDir relative to the config file's directory\n const outputPath = fs.join(configInfo.root, outputDir);\n\n const levelInfo = ctx.isMonorepo ? ` (${configInfo.level} level)` : '';\n\n const exists = await fs.exists(outputPath);\n if (exists) {\n return {\n category: 'workspace',\n name: 'Output Directory',\n status: 'pass',\n message: `Output directory exists: ${outputDir}${levelInfo}`,\n details: ctx.verbose ? `Resolved to: ${outputPath}` : undefined,\n };\n }\n\n // If default output directory is missing in monorepo root, it's fine\n if (\n ctx.isMonorepo &&\n ctx.packageRoot === ctx.workspaceRoot &&\n !config.outputDir\n ) {\n return {\n category: 'workspace',\n name: 'Output Directory',\n status: 'pass',\n message: 'Monorepo root detected (using package directories)',\n };\n }\n\n return {\n category: 'workspace',\n name: 'Output Directory',\n status: 'warn',\n message: `Output directory not found: ${outputDir}${levelInfo}`,\n details: ctx.verbose ? `Expected at: ${outputPath}` : undefined,\n fix: {\n description: `Create ${outputDir} directory`,\n apply: async (): Promise<FixResult> => {\n try {\n await fs.mkdir(outputPath);\n return { success: true, message: `Created ${outputDir}` };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n } catch {\n return {\n category: 'workspace',\n name: 'Output Directory',\n status: 'skip',\n message: 'Could not check output directory',\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { FsAdapter } from "../../ports/fs.mjs";
|
|
2
|
+
import { LoggerAdapter } from "../../ports/logger.mjs";
|
|
3
|
+
import { CheckResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult } from "./types.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/services/doctor/doctor-service.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Run all health checks and optionally apply fixes.
|
|
9
|
+
*/
|
|
10
|
+
declare function runDoctor(adapters: {
|
|
11
|
+
fs: FsAdapter;
|
|
12
|
+
logger: LoggerAdapter;
|
|
13
|
+
}, options: DoctorOptions, prompts?: DoctorPromptCallbacks): Promise<DoctorResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a summary string for the doctor result.
|
|
16
|
+
*/
|
|
17
|
+
declare function formatDoctorSummary(result: DoctorResult): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format a single check result for display.
|
|
20
|
+
*/
|
|
21
|
+
declare function formatCheckResult(result: CheckResult): string;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { formatCheckResult, formatDoctorSummary, runDoctor };
|
|
24
|
+
//# sourceMappingURL=doctor-service.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-service.d.mts","names":[],"sources":["../../../src/services/doctor/doctor-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAgDG,iBAJmB,SAAA,CAInB,QAAA,EAAA;EAAO,EAAA,EAHQ,SAGR;EAoHM,MAAA,EAvHqB,aAuHrB;AAyBhB,CAAA,EAAA,OAAgB,EA/IL,aA+IsB,EAAA,OAAoB,CAApB,EA9ItB,qBA8I0C,CAAA,EA7IlD,OA6IkD,CA7I1C,YA6I0C,CAAA;;;;iBAzBrC,mBAAA,SAA4B;;;;iBAyB5B,iBAAA,SAA0B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { findPackageRoot, findWorkspaceRoot, getPackageName, isMonorepo } from "../../adapters/workspace.mjs";
|
|
2
|
+
import { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS } from "./types.mjs";
|
|
3
|
+
import { runCliChecks } from "./checks/cli.mjs";
|
|
4
|
+
import { runConfigChecks } from "./checks/config.mjs";
|
|
5
|
+
import { runMcpChecks } from "./checks/mcp.mjs";
|
|
6
|
+
import { runDepsChecks } from "./checks/deps.mjs";
|
|
7
|
+
import { runWorkspaceChecks } from "./checks/workspace.mjs";
|
|
8
|
+
import { runAiChecks } from "./checks/ai.mjs";
|
|
9
|
+
import { runLayerChecks } from "./checks/layers.mjs";
|
|
10
|
+
import "./checks/index.mjs";
|
|
11
|
+
|
|
12
|
+
//#region src/services/doctor/doctor-service.ts
|
|
13
|
+
/**
|
|
14
|
+
* Default prompt callbacks that always decline fixes.
|
|
15
|
+
*/
|
|
16
|
+
const defaultPrompts = {
|
|
17
|
+
confirm: async () => false,
|
|
18
|
+
input: async () => ""
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Run all health checks and optionally apply fixes.
|
|
22
|
+
*/
|
|
23
|
+
async function runDoctor(adapters, options, prompts = defaultPrompts) {
|
|
24
|
+
const { fs, logger } = adapters;
|
|
25
|
+
const categories = options.categories ?? ALL_CHECK_CATEGORIES;
|
|
26
|
+
const workspaceRoot = findWorkspaceRoot(options.workspaceRoot);
|
|
27
|
+
const packageRoot = findPackageRoot(options.workspaceRoot);
|
|
28
|
+
const monorepo = isMonorepo(workspaceRoot);
|
|
29
|
+
const packageName = monorepo ? getPackageName(packageRoot) : void 0;
|
|
30
|
+
const ctx = {
|
|
31
|
+
workspaceRoot,
|
|
32
|
+
packageRoot,
|
|
33
|
+
isMonorepo: monorepo,
|
|
34
|
+
packageName,
|
|
35
|
+
verbose: options.verbose ?? false
|
|
36
|
+
};
|
|
37
|
+
if (monorepo) {
|
|
38
|
+
const pkgInfo = packageName ? ` (package: ${packageName})` : "";
|
|
39
|
+
logger.info(`Detected monorepo${pkgInfo}`);
|
|
40
|
+
}
|
|
41
|
+
const allResults = [];
|
|
42
|
+
for (const category of categories) {
|
|
43
|
+
if (options.skipAi && category === "ai") continue;
|
|
44
|
+
logger.info(`Checking ${CHECK_CATEGORY_LABELS[category]}...`);
|
|
45
|
+
const categoryResults = await runCategoryChecks(category, fs, ctx, prompts);
|
|
46
|
+
for (const result of categoryResults) {
|
|
47
|
+
if (result.fix && (result.status === "fail" || result.status === "warn")) {
|
|
48
|
+
if (options.autoFix ? true : await prompts.confirm(`Fix "${result.name}"? ${result.fix.description}`)) {
|
|
49
|
+
logger.info(`Applying fix: ${result.fix.description}`);
|
|
50
|
+
const fixResult = await result.fix.apply();
|
|
51
|
+
if (fixResult.success) {
|
|
52
|
+
logger.info(`✓ ${fixResult.message}`);
|
|
53
|
+
result.status = "pass";
|
|
54
|
+
result.message = `Fixed: ${fixResult.message}`;
|
|
55
|
+
result.fix = void 0;
|
|
56
|
+
} else logger.warn(`✗ ${fixResult.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
allResults.push(result);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const passed = allResults.filter((r) => r.status === "pass").length;
|
|
63
|
+
const warnings = allResults.filter((r) => r.status === "warn").length;
|
|
64
|
+
const failures = allResults.filter((r) => r.status === "fail").length;
|
|
65
|
+
return {
|
|
66
|
+
checks: allResults,
|
|
67
|
+
passed,
|
|
68
|
+
warnings,
|
|
69
|
+
failures,
|
|
70
|
+
skipped: allResults.filter((r) => r.status === "skip").length,
|
|
71
|
+
healthy: failures === 0
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Run checks for a specific category.
|
|
76
|
+
*/
|
|
77
|
+
async function runCategoryChecks(category, fs, ctx, prompts) {
|
|
78
|
+
switch (category) {
|
|
79
|
+
case "cli": return runCliChecks(fs, ctx);
|
|
80
|
+
case "config": return runConfigChecks(fs, ctx);
|
|
81
|
+
case "mcp": return runMcpChecks(fs, ctx);
|
|
82
|
+
case "deps": return runDepsChecks(fs, ctx);
|
|
83
|
+
case "workspace": return runWorkspaceChecks(fs, ctx);
|
|
84
|
+
case "ai": return runAiChecks(fs, ctx, prompts);
|
|
85
|
+
case "layers": return runLayerChecks(fs, ctx);
|
|
86
|
+
default: return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get a summary string for the doctor result.
|
|
91
|
+
*/
|
|
92
|
+
function formatDoctorSummary(result) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("=== Health Check Summary ===");
|
|
96
|
+
lines.push("");
|
|
97
|
+
if (result.healthy) lines.push("✓ All checks passed!");
|
|
98
|
+
else lines.push("✗ Some issues found");
|
|
99
|
+
lines.push("");
|
|
100
|
+
lines.push(` Passed: ${result.passed}`);
|
|
101
|
+
lines.push(` Warnings: ${result.warnings}`);
|
|
102
|
+
lines.push(` Failures: ${result.failures}`);
|
|
103
|
+
lines.push(` Skipped: ${result.skipped}`);
|
|
104
|
+
return lines.join("\n");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Format a single check result for display.
|
|
108
|
+
*/
|
|
109
|
+
function formatCheckResult(result) {
|
|
110
|
+
let line = `${result.status === "pass" ? "✓" : result.status === "warn" ? "⚠" : result.status === "fail" ? "✗" : "○"} ${result.name}: ${result.message}`;
|
|
111
|
+
if (result.details) line += `\n ${result.details}`;
|
|
112
|
+
if (result.fix) line += `\n Fix available: ${result.fix.description}`;
|
|
113
|
+
return line;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
export { formatCheckResult, formatDoctorSummary, runDoctor };
|
|
118
|
+
//# sourceMappingURL=doctor-service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-service.mjs","names":[],"sources":["../../../src/services/doctor/doctor-service.ts"],"sourcesContent":["/**\n * Doctor service.\n *\n * Orchestrates health checks and applies fixes.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n CheckCategory,\n CheckResult,\n CheckContext,\n DoctorOptions,\n DoctorResult,\n DoctorPromptCallbacks,\n} from './types';\nimport { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS } from './types';\nimport {\n runCliChecks,\n runConfigChecks,\n runMcpChecks,\n runDepsChecks,\n runWorkspaceChecks,\n runAiChecks,\n runLayerChecks,\n} from './checks/index';\nimport {\n findPackageRoot,\n findWorkspaceRoot,\n isMonorepo,\n getPackageName,\n} from '../../adapters/workspace';\n\n/**\n * Default prompt callbacks that always decline fixes.\n */\nconst defaultPrompts: DoctorPromptCallbacks = {\n confirm: async () => false,\n input: async () => '',\n};\n\n/**\n * Run all health checks and optionally apply fixes.\n */\nexport async function runDoctor(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: DoctorOptions,\n prompts: DoctorPromptCallbacks = defaultPrompts\n): Promise<DoctorResult> {\n const { fs, logger } = adapters;\n const categories = options.categories ?? ALL_CHECK_CATEGORIES;\n\n // Detect monorepo context\n const workspaceRoot = findWorkspaceRoot(options.workspaceRoot);\n const packageRoot = findPackageRoot(options.workspaceRoot);\n const monorepo = isMonorepo(workspaceRoot);\n const packageName = monorepo ? getPackageName(packageRoot) : undefined;\n\n const ctx: CheckContext = {\n workspaceRoot,\n packageRoot,\n isMonorepo: monorepo,\n packageName,\n verbose: options.verbose ?? false,\n };\n\n // Log monorepo context if detected\n if (monorepo) {\n const pkgInfo = packageName ? ` (package: ${packageName})` : '';\n logger.info(`Detected monorepo${pkgInfo}`);\n }\n\n const allResults: CheckResult[] = [];\n\n // Run checks for each category\n for (const category of categories) {\n if (options.skipAi && category === 'ai') {\n continue;\n }\n\n logger.info(`Checking ${CHECK_CATEGORY_LABELS[category]}...`);\n\n const categoryResults = await runCategoryChecks(category, fs, ctx, prompts);\n\n // Apply fixes if enabled\n for (const result of categoryResults) {\n if (\n result.fix &&\n (result.status === 'fail' || result.status === 'warn')\n ) {\n const shouldFix = options.autoFix\n ? true\n : await prompts.confirm(\n `Fix \"${result.name}\"? ${result.fix.description}`\n );\n\n if (shouldFix) {\n logger.info(`Applying fix: ${result.fix.description}`);\n const fixResult = await result.fix.apply();\n\n if (fixResult.success) {\n logger.info(`✓ ${fixResult.message}`);\n // Update status to pass after successful fix\n result.status = 'pass';\n result.message = `Fixed: ${fixResult.message}`;\n result.fix = undefined;\n } else {\n logger.warn(`✗ ${fixResult.message}`);\n }\n }\n }\n\n allResults.push(result);\n }\n }\n\n // Calculate summary\n const passed = allResults.filter((r) => r.status === 'pass').length;\n const warnings = allResults.filter((r) => r.status === 'warn').length;\n const failures = allResults.filter((r) => r.status === 'fail').length;\n const skipped = allResults.filter((r) => r.status === 'skip').length;\n\n return {\n checks: allResults,\n passed,\n warnings,\n failures,\n skipped,\n healthy: failures === 0,\n };\n}\n\n/**\n * Run checks for a specific category.\n */\nasync function runCategoryChecks(\n category: CheckCategory,\n fs: FsAdapter,\n ctx: CheckContext,\n prompts: DoctorPromptCallbacks\n): Promise<CheckResult[]> {\n switch (category) {\n case 'cli':\n return runCliChecks(fs, ctx);\n case 'config':\n return runConfigChecks(fs, ctx);\n case 'mcp':\n return runMcpChecks(fs, ctx);\n case 'deps':\n return runDepsChecks(fs, ctx);\n case 'workspace':\n return runWorkspaceChecks(fs, ctx);\n case 'ai':\n return runAiChecks(fs, ctx, prompts);\n case 'layers':\n return runLayerChecks(fs, ctx);\n default:\n return [];\n }\n}\n\n/**\n * Get a summary string for the doctor result.\n */\nexport function formatDoctorSummary(result: DoctorResult): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('=== Health Check Summary ===');\n lines.push('');\n\n if (result.healthy) {\n lines.push('✓ All checks passed!');\n } else {\n lines.push('✗ Some issues found');\n }\n\n lines.push('');\n lines.push(` Passed: ${result.passed}`);\n lines.push(` Warnings: ${result.warnings}`);\n lines.push(` Failures: ${result.failures}`);\n lines.push(` Skipped: ${result.skipped}`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format a single check result for display.\n */\nexport function formatCheckResult(result: CheckResult): string {\n const icon =\n result.status === 'pass'\n ? '✓'\n : result.status === 'warn'\n ? '⚠'\n : result.status === 'fail'\n ? '✗'\n : '○';\n\n let line = `${icon} ${result.name}: ${result.message}`;\n\n if (result.details) {\n line += `\\n ${result.details}`;\n }\n\n if (result.fix) {\n line += `\\n Fix available: ${result.fix.description}`;\n }\n\n return line;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS, CheckCategory, CheckContext, CheckResult, CheckStatus, DoctorOptions, DoctorPromptCallbacks, DoctorResult, FixAction, FixResult } from "./types.mjs";
|
|
2
|
+
import { formatCheckResult, formatDoctorSummary, runDoctor } from "./doctor-service.mjs";
|
|
@@ -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' | 'layers';
|
|
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.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/doctor/types.ts"],"sourcesContent":[],"mappings":";;AASA;AAYA;AAaA;AAaA;AAKA;AAUA;AAUA;AAEY,KAjEA,aAAA,GAiEA,KAAA,GAAA,QAAA,GAAA,KAAA,GAAA,MAAA,GAAA,WAAA,GAAA,IAAA,GAAA,QAAA;;;;AAgBK,cArEJ,oBAyEE,EAzEoB,aAyEP,EAAA;AAY5B;AAkBA;AAUA;cApGa,uBAAuB,OAAO;;;;KAa/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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
"layers"
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Human-readable labels for check categories.
|
|
16
|
+
*/
|
|
17
|
+
const CHECK_CATEGORY_LABELS = {
|
|
18
|
+
cli: "CLI Installation",
|
|
19
|
+
config: "Configuration Files",
|
|
20
|
+
mcp: "MCP Server",
|
|
21
|
+
deps: "Dependencies",
|
|
22
|
+
workspace: "Workspace Structure",
|
|
23
|
+
ai: "AI Provider",
|
|
24
|
+
layers: "Contract Layers"
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ALL_CHECK_CATEGORIES, CHECK_CATEGORY_LABELS };
|
|
29
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"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 | 'layers';\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 'layers',\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 layers: 'Contract Layers',\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":";;;;AAqBA,MAAa,uBAAwC;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAa,wBAAuD;CAClE,KAAK;CACL,QAAQ;CACR,KAAK;CACL,MAAM;CACN,WAAW;CACX,IAAI;CACJ,QAAQ;CACT"}
|