@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,81 @@
|
|
|
1
|
+
//#region src/adapters/logger.ts
|
|
2
|
+
/**
|
|
3
|
+
* Create a console-based logger adapter.
|
|
4
|
+
* This is a basic implementation - CLI apps should inject their own
|
|
5
|
+
* logger with chalk/ora for better terminal output.
|
|
6
|
+
*/
|
|
7
|
+
function createConsoleLoggerAdapter() {
|
|
8
|
+
return {
|
|
9
|
+
debug(message, data) {
|
|
10
|
+
if (process.env["DEBUG"]) console.debug(`[DEBUG] ${message}`, data ?? "");
|
|
11
|
+
},
|
|
12
|
+
info(message, data) {
|
|
13
|
+
console.info(`[INFO] ${message}`, data ?? "");
|
|
14
|
+
},
|
|
15
|
+
warn(message, data) {
|
|
16
|
+
console.warn(`[WARN] ${message}`, data ?? "");
|
|
17
|
+
},
|
|
18
|
+
error(message, data) {
|
|
19
|
+
console.error(`[ERROR] ${message}`, data ?? "");
|
|
20
|
+
},
|
|
21
|
+
createProgress() {
|
|
22
|
+
return createConsoleProgressReporter();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a no-op logger adapter.
|
|
28
|
+
* Useful for testing or when logging is not desired.
|
|
29
|
+
*/
|
|
30
|
+
function createNoopLoggerAdapter() {
|
|
31
|
+
const noop = () => {};
|
|
32
|
+
return {
|
|
33
|
+
debug: noop,
|
|
34
|
+
info: noop,
|
|
35
|
+
warn: noop,
|
|
36
|
+
error: noop,
|
|
37
|
+
createProgress: createNoopProgressReporter
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a console-based progress reporter.
|
|
42
|
+
*/
|
|
43
|
+
function createConsoleProgressReporter() {
|
|
44
|
+
return {
|
|
45
|
+
start(message) {
|
|
46
|
+
console.warn(`⏳ ${message}`);
|
|
47
|
+
},
|
|
48
|
+
update(update) {
|
|
49
|
+
const progress = update.current !== void 0 && update.total !== void 0 ? ` (${update.current}/${update.total})` : "";
|
|
50
|
+
console.warn(` ${update.message}${progress}`);
|
|
51
|
+
},
|
|
52
|
+
succeed(message) {
|
|
53
|
+
console.warn(`✅ ${message ?? "Done"}`);
|
|
54
|
+
},
|
|
55
|
+
fail(message) {
|
|
56
|
+
console.error(`❌ ${message ?? "Failed"}`);
|
|
57
|
+
},
|
|
58
|
+
warn(message) {
|
|
59
|
+
console.warn(`⚠️ ${message ?? "Warning"}`);
|
|
60
|
+
},
|
|
61
|
+
stop() {}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a no-op progress reporter.
|
|
66
|
+
*/
|
|
67
|
+
function createNoopProgressReporter() {
|
|
68
|
+
const noop = () => {};
|
|
69
|
+
return {
|
|
70
|
+
start: noop,
|
|
71
|
+
update: noop,
|
|
72
|
+
succeed: noop,
|
|
73
|
+
fail: noop,
|
|
74
|
+
warn: noop,
|
|
75
|
+
stop: noop
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { createConsoleLoggerAdapter, createNoopLoggerAdapter };
|
|
81
|
+
//# sourceMappingURL=logger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.mjs","names":[],"sources":["../../src/adapters/logger.ts"],"sourcesContent":["/**\n * Logger adapter implementations.\n * Note: This provides a no-op default logger. CLI apps should inject\n * their own chalk/ora-based logger for rich terminal output.\n */\n\nimport type { LoggerAdapter, ProgressReporter } from '../ports/logger';\n\n/**\n * Create a console-based logger adapter.\n * This is a basic implementation - CLI apps should inject their own\n * logger with chalk/ora for better terminal output.\n */\nexport function createConsoleLoggerAdapter(): LoggerAdapter {\n return {\n debug(message: string, data?: Record<string, unknown>): void {\n if (process.env['DEBUG']) {\n console.debug(`[DEBUG] ${message}`, data ?? '');\n }\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n console.info(`[INFO] ${message}`, data ?? '');\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n console.warn(`[WARN] ${message}`, data ?? '');\n },\n\n error(message: string, data?: Record<string, unknown>): void {\n console.error(`[ERROR] ${message}`, data ?? '');\n },\n\n createProgress(): ProgressReporter {\n return createConsoleProgressReporter();\n },\n };\n}\n\n/**\n * Create a no-op logger adapter.\n * Useful for testing or when logging is not desired.\n */\nexport function createNoopLoggerAdapter(): LoggerAdapter {\n const noop = () => {\n // Intentional no-op\n };\n\n return {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop,\n createProgress: createNoopProgressReporter,\n };\n}\n\n/**\n * Create a console-based progress reporter.\n */\nfunction createConsoleProgressReporter(): ProgressReporter {\n return {\n start(message: string): void {\n console.warn(`⏳ ${message}`);\n },\n\n update(update: {\n message: string;\n current?: number;\n total?: number;\n }): void {\n const progress =\n update.current !== undefined && update.total !== undefined\n ? ` (${update.current}/${update.total})`\n : '';\n\n console.warn(` ${update.message}${progress}`);\n },\n\n succeed(message?: string): void {\n console.warn(`✅ ${message ?? 'Done'}`);\n },\n\n fail(message?: string): void {\n console.error(`❌ ${message ?? 'Failed'}`);\n },\n\n warn(message?: string): void {\n console.warn(`⚠️ ${message ?? 'Warning'}`);\n },\n\n stop(): void {\n // No-op for console logger\n },\n };\n}\n\n/**\n * Create a no-op progress reporter.\n */\nfunction createNoopProgressReporter(): ProgressReporter {\n const noop = () => {\n // Intentional no-op\n };\n\n return {\n start: noop,\n update: noop,\n succeed: noop,\n fail: noop,\n warn: noop,\n stop: noop,\n };\n}\n"],"mappings":";;;;;;AAaA,SAAgB,6BAA4C;AAC1D,QAAO;EACL,MAAM,SAAiB,MAAsC;AAC3D,OAAI,QAAQ,IAAI,SACd,SAAQ,MAAM,WAAW,WAAW,QAAQ,GAAG;;EAInD,KAAK,SAAiB,MAAsC;AAC1D,WAAQ,KAAK,UAAU,WAAW,QAAQ,GAAG;;EAG/C,KAAK,SAAiB,MAAsC;AAC1D,WAAQ,KAAK,UAAU,WAAW,QAAQ,GAAG;;EAG/C,MAAM,SAAiB,MAAsC;AAC3D,WAAQ,MAAM,WAAW,WAAW,QAAQ,GAAG;;EAGjD,iBAAmC;AACjC,UAAO,+BAA+B;;EAEzC;;;;;;AAOH,SAAgB,0BAAyC;CACvD,MAAM,aAAa;AAInB,QAAO;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,gBAAgB;EACjB;;;;;AAMH,SAAS,gCAAkD;AACzD,QAAO;EACL,MAAM,SAAuB;AAC3B,WAAQ,KAAK,KAAK,UAAU;;EAG9B,OAAO,QAIE;GACP,MAAM,WACJ,OAAO,YAAY,UAAa,OAAO,UAAU,SAC7C,KAAK,OAAO,QAAQ,GAAG,OAAO,MAAM,KACpC;AAEN,WAAQ,KAAK,MAAM,OAAO,UAAU,WAAW;;EAGjD,QAAQ,SAAwB;AAC9B,WAAQ,KAAK,KAAK,WAAW,SAAS;;EAGxC,KAAK,SAAwB;AAC3B,WAAQ,MAAM,KAAK,WAAW,WAAW;;EAG3C,KAAK,SAAwB;AAC3B,WAAQ,KAAK,OAAO,WAAW,YAAY;;EAG7C,OAAa;EAGd;;;;;AAMH,SAAS,6BAA+C;CACtD,MAAM,aAAa;AAInB,QAAO;EACL,OAAO;EACP,QAAQ;EACR,SAAS;EACT,MAAM;EACN,MAAM;EACN,MAAM;EACP"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WatcherAdapter } from "../ports/watcher.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/watcher.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create a Node.js file watcher adapter using chokidar.
|
|
7
|
+
*/
|
|
8
|
+
declare function createNodeWatcherAdapter(cwd?: string): WatcherAdapter;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createNodeWatcherAdapter };
|
|
11
|
+
//# sourceMappingURL=watcher.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.mts","names":[],"sources":["../../src/adapters/watcher.ts"],"sourcesContent":[],"mappings":";;;;;;;iBA0BgB,wBAAA,gBAAwC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import chokidar from "chokidar";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/watcher.ts
|
|
4
|
+
/**
|
|
5
|
+
* Node.js file watcher adapter implementation using chokidar.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_IGNORES = [
|
|
8
|
+
"**/node_modules/**",
|
|
9
|
+
"**/dist/**",
|
|
10
|
+
"**/.turbo/**",
|
|
11
|
+
"**/.next/**",
|
|
12
|
+
"**/build/**",
|
|
13
|
+
"**/coverage/**",
|
|
14
|
+
"**/*.d.ts"
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Create a Node.js file watcher adapter using chokidar.
|
|
18
|
+
*/
|
|
19
|
+
function createNodeWatcherAdapter(cwd) {
|
|
20
|
+
const baseCwd = cwd ?? process.cwd();
|
|
21
|
+
return { watch(options) {
|
|
22
|
+
const handlers = [];
|
|
23
|
+
let debounceTimer;
|
|
24
|
+
const watcher = chokidar.watch(options.pattern, {
|
|
25
|
+
cwd: baseCwd,
|
|
26
|
+
ignored: options.ignore ?? DEFAULT_IGNORES,
|
|
27
|
+
persistent: true,
|
|
28
|
+
ignoreInitial: true,
|
|
29
|
+
awaitWriteFinish: {
|
|
30
|
+
stabilityThreshold: 250,
|
|
31
|
+
pollInterval: 50
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const emitEvent = (event) => {
|
|
35
|
+
if (options.debounceMs && options.debounceMs > 0) {
|
|
36
|
+
clearTimeout(debounceTimer);
|
|
37
|
+
debounceTimer = setTimeout(() => {
|
|
38
|
+
handlers.forEach((handler) => handler(event));
|
|
39
|
+
}, options.debounceMs);
|
|
40
|
+
} else handlers.forEach((handler) => handler(event));
|
|
41
|
+
};
|
|
42
|
+
watcher.on("add", (path) => {
|
|
43
|
+
emitEvent({
|
|
44
|
+
type: "add",
|
|
45
|
+
path
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
watcher.on("change", (path) => {
|
|
49
|
+
emitEvent({
|
|
50
|
+
type: "change",
|
|
51
|
+
path
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
watcher.on("unlink", (path) => {
|
|
55
|
+
emitEvent({
|
|
56
|
+
type: "unlink",
|
|
57
|
+
path
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
on(handler) {
|
|
62
|
+
handlers.push(handler);
|
|
63
|
+
},
|
|
64
|
+
async close() {
|
|
65
|
+
clearTimeout(debounceTimer);
|
|
66
|
+
await watcher.close();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
} };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
export { createNodeWatcherAdapter };
|
|
74
|
+
//# sourceMappingURL=watcher.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.mjs","names":[],"sources":["../../src/adapters/watcher.ts"],"sourcesContent":["/**\n * Node.js file watcher adapter implementation using chokidar.\n */\n\nimport chokidar from 'chokidar';\nimport type {\n WatcherAdapter,\n WatchOptions,\n Watcher,\n WatchEventHandler,\n WatchEvent,\n} from '../ports/watcher';\n\nconst DEFAULT_IGNORES = [\n '**/node_modules/**',\n '**/dist/**',\n '**/.turbo/**',\n '**/.next/**',\n '**/build/**',\n '**/coverage/**',\n '**/*.d.ts',\n];\n\n/**\n * Create a Node.js file watcher adapter using chokidar.\n */\nexport function createNodeWatcherAdapter(cwd?: string): WatcherAdapter {\n const baseCwd = cwd ?? process.cwd();\n\n return {\n watch(options: WatchOptions): Watcher {\n const handlers: WatchEventHandler[] = [];\n let debounceTimer: NodeJS.Timeout | undefined;\n\n const watcher = chokidar.watch(options.pattern, {\n cwd: baseCwd,\n ignored: options.ignore ?? DEFAULT_IGNORES,\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 250,\n pollInterval: 50,\n },\n });\n\n const emitEvent = (event: WatchEvent) => {\n if (options.debounceMs && options.debounceMs > 0) {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n handlers.forEach((handler) => handler(event));\n }, options.debounceMs);\n } else {\n handlers.forEach((handler) => handler(event));\n }\n };\n\n watcher.on('add', (path) => {\n emitEvent({ type: 'add', path });\n });\n\n watcher.on('change', (path) => {\n emitEvent({ type: 'change', path });\n });\n\n watcher.on('unlink', (path) => {\n emitEvent({ type: 'unlink', path });\n });\n\n return {\n on(handler: WatchEventHandler): void {\n handlers.push(handler);\n },\n\n async close(): Promise<void> {\n clearTimeout(debounceTimer);\n await watcher.close();\n },\n };\n },\n };\n}\n"],"mappings":";;;;;;AAaA,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,SAAgB,yBAAyB,KAA8B;CACrE,MAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,QAAO,EACL,MAAM,SAAgC;EACpC,MAAM,WAAgC,EAAE;EACxC,IAAI;EAEJ,MAAM,UAAU,SAAS,MAAM,QAAQ,SAAS;GAC9C,KAAK;GACL,SAAS,QAAQ,UAAU;GAC3B,YAAY;GACZ,eAAe;GACf,kBAAkB;IAChB,oBAAoB;IACpB,cAAc;IACf;GACF,CAAC;EAEF,MAAM,aAAa,UAAsB;AACvC,OAAI,QAAQ,cAAc,QAAQ,aAAa,GAAG;AAChD,iBAAa,cAAc;AAC3B,oBAAgB,iBAAiB;AAC/B,cAAS,SAAS,YAAY,QAAQ,MAAM,CAAC;OAC5C,QAAQ,WAAW;SAEtB,UAAS,SAAS,YAAY,QAAQ,MAAM,CAAC;;AAIjD,UAAQ,GAAG,QAAQ,SAAS;AAC1B,aAAU;IAAE,MAAM;IAAO;IAAM,CAAC;IAChC;AAEF,UAAQ,GAAG,WAAW,SAAS;AAC7B,aAAU;IAAE,MAAM;IAAU;IAAM,CAAC;IACnC;AAEF,UAAQ,GAAG,WAAW,SAAS;AAC7B,aAAU;IAAE,MAAM;IAAU;IAAM,CAAC;IACnC;AAEF,SAAO;GACL,GAAG,SAAkC;AACnC,aAAS,KAAK,QAAQ;;GAGxB,MAAM,QAAuB;AAC3B,iBAAa,cAAc;AAC3B,UAAM,QAAQ,OAAO;;GAExB;IAEJ"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
//#region src/adapters/workspace.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Workspace and monorepo detection utilities.
|
|
4
|
+
*
|
|
5
|
+
* Provides utilities for detecting workspace roots, package managers,
|
|
6
|
+
* and monorepo configurations across Bun, pnpm, Yarn, and npm.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Supported package managers.
|
|
10
|
+
*/
|
|
11
|
+
type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm';
|
|
12
|
+
/**
|
|
13
|
+
* Repository structure type.
|
|
14
|
+
*/
|
|
15
|
+
type RepositoryType = 'classic' | 'monorepo' | 'meta-repo';
|
|
16
|
+
/**
|
|
17
|
+
* Git submodule information.
|
|
18
|
+
*/
|
|
19
|
+
interface SubmoduleInfo {
|
|
20
|
+
/** Submodule name (from .gitmodules) */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Relative path from meta-repo root */
|
|
23
|
+
path: string;
|
|
24
|
+
/** Git remote URL */
|
|
25
|
+
url: string;
|
|
26
|
+
/** Absolute path to submodule root */
|
|
27
|
+
absolutePath: string;
|
|
28
|
+
/** Whether submodule has its own workspaces */
|
|
29
|
+
hasWorkspaces: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Meta-repo information.
|
|
33
|
+
*/
|
|
34
|
+
interface MetaRepoInfo {
|
|
35
|
+
/** Absolute path to meta-repo root (containing .gitmodules) */
|
|
36
|
+
root: string;
|
|
37
|
+
/** All detected git submodules */
|
|
38
|
+
submodules: SubmoduleInfo[];
|
|
39
|
+
/** Currently active submodule (if in a submodule context) */
|
|
40
|
+
activeSubmodule?: SubmoduleInfo;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Workspace detection result.
|
|
44
|
+
*/
|
|
45
|
+
interface WorkspaceInfo {
|
|
46
|
+
/**
|
|
47
|
+
* The detected package manager.
|
|
48
|
+
*/
|
|
49
|
+
packageManager: PackageManager;
|
|
50
|
+
/**
|
|
51
|
+
* Root of the workspace (monorepo root or single package root).
|
|
52
|
+
*/
|
|
53
|
+
workspaceRoot: string;
|
|
54
|
+
/**
|
|
55
|
+
* Root of the current package (may differ from workspaceRoot in monorepos).
|
|
56
|
+
*/
|
|
57
|
+
packageRoot: string;
|
|
58
|
+
/**
|
|
59
|
+
* Whether this is a monorepo.
|
|
60
|
+
*/
|
|
61
|
+
isMonorepo: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* List of package paths in monorepo (relative to workspaceRoot).
|
|
64
|
+
*/
|
|
65
|
+
packages?: string[];
|
|
66
|
+
/**
|
|
67
|
+
* Name of the current package (from package.json).
|
|
68
|
+
*/
|
|
69
|
+
packageName?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Repository structure type.
|
|
72
|
+
*/
|
|
73
|
+
repositoryType: RepositoryType;
|
|
74
|
+
/**
|
|
75
|
+
* Meta-repo information (if in a meta-repo context).
|
|
76
|
+
*/
|
|
77
|
+
metaRepo?: MetaRepoInfo;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find the nearest directory containing a package.json.
|
|
81
|
+
*/
|
|
82
|
+
declare function findPackageRoot(startDir?: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Find the workspace root (monorepo root or single package root).
|
|
85
|
+
*
|
|
86
|
+
* Walks up the directory tree looking for:
|
|
87
|
+
* 1. pnpm-workspace.yaml (pnpm monorepo)
|
|
88
|
+
* 2. package.json with "workspaces" field (yarn/npm/bun monorepo)
|
|
89
|
+
* 3. Lock files (bun.lockb, pnpm-lock.yaml, yarn.lock, package-lock.json)
|
|
90
|
+
*/
|
|
91
|
+
declare function findWorkspaceRoot(startDir?: string): string;
|
|
92
|
+
/**
|
|
93
|
+
* Detect the package manager in use.
|
|
94
|
+
*
|
|
95
|
+
* Priority:
|
|
96
|
+
* 1. Lock file presence (most reliable)
|
|
97
|
+
* 2. packageManager field in package.json
|
|
98
|
+
* 3. COREPACK_ROOT environment variable
|
|
99
|
+
* 4. Default to npm
|
|
100
|
+
*/
|
|
101
|
+
declare function detectPackageManager(workspaceRoot?: string): PackageManager;
|
|
102
|
+
/**
|
|
103
|
+
* Check if the workspace is a monorepo.
|
|
104
|
+
*/
|
|
105
|
+
declare function isMonorepo(workspaceRoot?: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Get workspace package patterns from package.json or pnpm-workspace.yaml.
|
|
108
|
+
*/
|
|
109
|
+
declare function getWorkspacePackages(workspaceRoot: string): string[] | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* Get package name from package.json.
|
|
112
|
+
*/
|
|
113
|
+
declare function getPackageName(packageRoot: string): string | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Parse .gitmodules file to extract submodule information.
|
|
116
|
+
*/
|
|
117
|
+
declare function parseGitModules(metaRepoRoot: string): SubmoduleInfo[];
|
|
118
|
+
/**
|
|
119
|
+
* Find the meta-repo root by looking for .gitmodules.
|
|
120
|
+
*/
|
|
121
|
+
declare function findMetaRepoRoot(startDir: string): string | undefined;
|
|
122
|
+
/**
|
|
123
|
+
* Get meta-repo information if in a meta-repo context.
|
|
124
|
+
*/
|
|
125
|
+
declare function getMetaRepoInfo(startDir: string): MetaRepoInfo | undefined;
|
|
126
|
+
/**
|
|
127
|
+
* Detect the repository structure type.
|
|
128
|
+
*/
|
|
129
|
+
declare function detectRepositoryType(startDir: string, isMonorepoFlag: boolean): RepositoryType;
|
|
130
|
+
/**
|
|
131
|
+
* Get complete workspace information.
|
|
132
|
+
*/
|
|
133
|
+
declare function getWorkspaceInfo(startDir?: string): WorkspaceInfo;
|
|
134
|
+
/**
|
|
135
|
+
* Get the run command for the detected package manager.
|
|
136
|
+
*/
|
|
137
|
+
declare function getRunCommand(packageManager: PackageManager, script: string): string;
|
|
138
|
+
/**
|
|
139
|
+
* Get the exec command for the detected package manager.
|
|
140
|
+
*/
|
|
141
|
+
declare function getExecCommand(packageManager: PackageManager, command: string): string;
|
|
142
|
+
/**
|
|
143
|
+
* Get the install command for the detected package manager.
|
|
144
|
+
*/
|
|
145
|
+
declare function getInstallCommand(packageManager: PackageManager, isDev?: boolean): string;
|
|
146
|
+
//#endregion
|
|
147
|
+
export { MetaRepoInfo, PackageManager, RepositoryType, SubmoduleInfo, WorkspaceInfo, detectPackageManager, detectRepositoryType, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, getExecCommand, getInstallCommand, getMetaRepoInfo, getPackageName, getRunCommand, getWorkspaceInfo, getWorkspacePackages, isMonorepo, parseGitModules };
|
|
148
|
+
//# sourceMappingURL=workspace.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.mts","names":[],"sources":["../../src/adapters/workspace.ts"],"sourcesContent":[],"mappings":";;AAaA;AAKA;AAKA;AAgBA;AAYA;;;;AAuCyB,KA7Eb,cAAA,GA6Ea,KAAA,GAAA,MAAA,GAAA,MAAA,GAAA,KAAA;AA4BzB;AA6BA;AAwDA;AAiDgB,KA1OJ,cAAA,GA0Oc,SAAA,GAAA,UAAA,GAAA,WAAA;AA2B1B;AA8CA;AAgBA;AAwDgB,UAtXC,aAAA,CAsXe;EAqBhB;EA2BA,IAAA,EAAA,MAAA;EAsBA;EA8BA,IAAA,EAAA,MAAA;EAmBA;EAmBA,GAAA,EAAA,MAAA;;;;;;;;;UAhfC,YAAA;;;;cAIH;;oBAEM;;;;;UAMH,aAAA;;;;kBAIC;;;;;;;;;;;;;;;;;;;;;;;;kBA8BA;;;;aAKL;;;;;iBA4BG,eAAA;;;;;;;;;iBA6BA,iBAAA;;;;;;;;;;iBAwDA,oBAAA,0BAEb;;;;iBA+Ca,UAAA;;;;iBA2BA,oBAAA;;;;iBA8CA,cAAA;;;;iBAgBA,eAAA,wBAAuC;;;;iBAwDvC,gBAAA;;;;iBAqBA,eAAA,oBAAmC;;;;iBA2BnC,oBAAA,6CAGb;;;;iBAmBa,gBAAA,qBAEb;;;;iBA4Ba,aAAA,iBACE;;;;iBAkBF,cAAA,iBACE;;;;iBAkBF,iBAAA,iBACE"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { dirname, join, resolve } from "node:path";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/workspace.ts
|
|
5
|
+
/**
|
|
6
|
+
* Workspace and monorepo detection utilities.
|
|
7
|
+
*
|
|
8
|
+
* Provides utilities for detecting workspace roots, package managers,
|
|
9
|
+
* and monorepo configurations across Bun, pnpm, Yarn, and npm.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Lock files and their corresponding package managers.
|
|
13
|
+
*/
|
|
14
|
+
const LOCK_FILES = {
|
|
15
|
+
"bun.lockb": "bun",
|
|
16
|
+
"bun.lock": "bun",
|
|
17
|
+
"pnpm-lock.yaml": "pnpm",
|
|
18
|
+
"yarn.lock": "yarn",
|
|
19
|
+
"package-lock.json": "npm"
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Monorepo indicator files.
|
|
23
|
+
*/
|
|
24
|
+
const MONOREPO_FILES = [
|
|
25
|
+
"pnpm-workspace.yaml",
|
|
26
|
+
"lerna.json",
|
|
27
|
+
"nx.json",
|
|
28
|
+
"turbo.json",
|
|
29
|
+
"rush.json"
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Find the nearest directory containing a package.json.
|
|
33
|
+
*/
|
|
34
|
+
function findPackageRoot(startDir = process.cwd()) {
|
|
35
|
+
let current = resolve(startDir);
|
|
36
|
+
while (true) {
|
|
37
|
+
if (existsSync(join(current, "package.json"))) return current;
|
|
38
|
+
const parent = dirname(current);
|
|
39
|
+
if (parent === current) break;
|
|
40
|
+
current = parent;
|
|
41
|
+
}
|
|
42
|
+
return startDir;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find the workspace root (monorepo root or single package root).
|
|
46
|
+
*
|
|
47
|
+
* Walks up the directory tree looking for:
|
|
48
|
+
* 1. pnpm-workspace.yaml (pnpm monorepo)
|
|
49
|
+
* 2. package.json with "workspaces" field (yarn/npm/bun monorepo)
|
|
50
|
+
* 3. Lock files (bun.lockb, pnpm-lock.yaml, yarn.lock, package-lock.json)
|
|
51
|
+
*/
|
|
52
|
+
function findWorkspaceRoot(startDir = process.cwd()) {
|
|
53
|
+
let current = resolve(startDir);
|
|
54
|
+
let lastPackageJson = null;
|
|
55
|
+
while (true) {
|
|
56
|
+
for (const file of MONOREPO_FILES) if (existsSync(join(current, file))) return current;
|
|
57
|
+
const pkgPath = join(current, "package.json");
|
|
58
|
+
if (existsSync(pkgPath)) {
|
|
59
|
+
lastPackageJson = current;
|
|
60
|
+
try {
|
|
61
|
+
if (JSON.parse(readFileSync(pkgPath, "utf-8")).workspaces) return current;
|
|
62
|
+
} catch {}
|
|
63
|
+
}
|
|
64
|
+
for (const lockFile of Object.keys(LOCK_FILES)) if (existsSync(join(current, lockFile))) return current;
|
|
65
|
+
const parent = dirname(current);
|
|
66
|
+
if (parent === current) break;
|
|
67
|
+
current = parent;
|
|
68
|
+
}
|
|
69
|
+
return lastPackageJson ?? startDir;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect the package manager in use.
|
|
73
|
+
*
|
|
74
|
+
* Priority:
|
|
75
|
+
* 1. Lock file presence (most reliable)
|
|
76
|
+
* 2. packageManager field in package.json
|
|
77
|
+
* 3. COREPACK_ROOT environment variable
|
|
78
|
+
* 4. Default to npm
|
|
79
|
+
*/
|
|
80
|
+
function detectPackageManager(workspaceRoot = process.cwd()) {
|
|
81
|
+
for (const pm of [
|
|
82
|
+
"bun",
|
|
83
|
+
"pnpm",
|
|
84
|
+
"yarn",
|
|
85
|
+
"npm"
|
|
86
|
+
]) {
|
|
87
|
+
const lockFiles = Object.entries(LOCK_FILES).filter(([, manager]) => manager === pm);
|
|
88
|
+
for (const [lockFile] of lockFiles) if (existsSync(join(workspaceRoot, lockFile))) return pm;
|
|
89
|
+
}
|
|
90
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
91
|
+
if (existsSync(pkgPath)) try {
|
|
92
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
93
|
+
if (pkg.packageManager) {
|
|
94
|
+
const match = pkg.packageManager.match(/^(bun|pnpm|yarn|npm)@/);
|
|
95
|
+
if (match) return match[1];
|
|
96
|
+
}
|
|
97
|
+
} catch {}
|
|
98
|
+
if (process.env.BUN_INSTALL || typeof globalThis.Bun !== "undefined") return "bun";
|
|
99
|
+
return "npm";
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if the workspace is a monorepo.
|
|
103
|
+
*/
|
|
104
|
+
function isMonorepo(workspaceRoot = process.cwd()) {
|
|
105
|
+
for (const file of MONOREPO_FILES) if (existsSync(join(workspaceRoot, file))) return true;
|
|
106
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
107
|
+
if (existsSync(pkgPath)) try {
|
|
108
|
+
if (JSON.parse(readFileSync(pkgPath, "utf-8")).workspaces) return true;
|
|
109
|
+
} catch {}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get workspace package patterns from package.json or pnpm-workspace.yaml.
|
|
114
|
+
*/
|
|
115
|
+
function getWorkspacePackages(workspaceRoot) {
|
|
116
|
+
const pnpmWorkspacePath = join(workspaceRoot, "pnpm-workspace.yaml");
|
|
117
|
+
if (existsSync(pnpmWorkspacePath)) try {
|
|
118
|
+
const match = readFileSync(pnpmWorkspacePath, "utf-8").match(/packages:\s*\n((?:\s+-\s+['"]?[^\n]+['"]?\n?)+)/);
|
|
119
|
+
if (match?.[1]) return match[1].split("\n").map((line) => line.replace(/^\s+-\s+['"]?|['"]?\s*$/g, "")).filter(Boolean);
|
|
120
|
+
} catch {}
|
|
121
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
122
|
+
if (existsSync(pkgPath)) try {
|
|
123
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
124
|
+
if (Array.isArray(pkg.workspaces)) return pkg.workspaces;
|
|
125
|
+
if (pkg.workspaces?.packages && Array.isArray(pkg.workspaces.packages)) return pkg.workspaces.packages;
|
|
126
|
+
} catch {}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get package name from package.json.
|
|
130
|
+
*/
|
|
131
|
+
function getPackageName(packageRoot) {
|
|
132
|
+
const pkgPath = join(packageRoot, "package.json");
|
|
133
|
+
if (existsSync(pkgPath)) try {
|
|
134
|
+
return JSON.parse(readFileSync(pkgPath, "utf-8")).name;
|
|
135
|
+
} catch {}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Parse .gitmodules file to extract submodule information.
|
|
139
|
+
*/
|
|
140
|
+
function parseGitModules(metaRepoRoot) {
|
|
141
|
+
const gitmodulesPath = join(metaRepoRoot, ".gitmodules");
|
|
142
|
+
if (!existsSync(gitmodulesPath)) return [];
|
|
143
|
+
try {
|
|
144
|
+
const content = readFileSync(gitmodulesPath, "utf-8");
|
|
145
|
+
const submodules = [];
|
|
146
|
+
const submoduleRegex = /\[submodule\s+"([^"]+)"\]\s*\n\s*path\s*=\s*(\S+)\s*\n\s*url\s*=\s*(\S+)/g;
|
|
147
|
+
let match;
|
|
148
|
+
while ((match = submoduleRegex.exec(content)) !== null) {
|
|
149
|
+
const [, name, path$1, url] = match;
|
|
150
|
+
if (name && path$1 && url) {
|
|
151
|
+
const absolutePath = join(metaRepoRoot, path$1);
|
|
152
|
+
const hasWorkspaces = existsSync(join(absolutePath, "package.json")) && checkHasWorkspaces(absolutePath);
|
|
153
|
+
submodules.push({
|
|
154
|
+
name,
|
|
155
|
+
path: path$1,
|
|
156
|
+
url,
|
|
157
|
+
absolutePath,
|
|
158
|
+
hasWorkspaces
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return submodules;
|
|
163
|
+
} catch {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Check if a directory has workspace configuration.
|
|
169
|
+
*/
|
|
170
|
+
function checkHasWorkspaces(dir) {
|
|
171
|
+
const pkgPath = join(dir, "package.json");
|
|
172
|
+
if (existsSync(pkgPath)) try {
|
|
173
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
174
|
+
return Boolean(pkg.workspaces);
|
|
175
|
+
} catch {}
|
|
176
|
+
return existsSync(join(dir, "pnpm-workspace.yaml"));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Find the meta-repo root by looking for .gitmodules.
|
|
180
|
+
*/
|
|
181
|
+
function findMetaRepoRoot(startDir) {
|
|
182
|
+
let current = resolve(startDir);
|
|
183
|
+
while (true) {
|
|
184
|
+
if (existsSync(join(current, ".gitmodules"))) return current;
|
|
185
|
+
const parent = dirname(current);
|
|
186
|
+
if (parent === current) break;
|
|
187
|
+
current = parent;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get meta-repo information if in a meta-repo context.
|
|
192
|
+
*/
|
|
193
|
+
function getMetaRepoInfo(startDir) {
|
|
194
|
+
const metaRoot = findMetaRepoRoot(startDir);
|
|
195
|
+
if (!metaRoot) return;
|
|
196
|
+
const submodules = parseGitModules(metaRoot);
|
|
197
|
+
if (submodules.length === 0) return;
|
|
198
|
+
const resolvedStart = resolve(startDir);
|
|
199
|
+
return {
|
|
200
|
+
root: metaRoot,
|
|
201
|
+
submodules,
|
|
202
|
+
activeSubmodule: submodules.find((sub) => resolvedStart.startsWith(sub.absolutePath))
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Detect the repository structure type.
|
|
207
|
+
*/
|
|
208
|
+
function detectRepositoryType(startDir, isMonorepoFlag) {
|
|
209
|
+
const metaRoot = findMetaRepoRoot(startDir);
|
|
210
|
+
if (metaRoot) {
|
|
211
|
+
if (parseGitModules(metaRoot).length > 0) return "meta-repo";
|
|
212
|
+
}
|
|
213
|
+
if (isMonorepoFlag) return "monorepo";
|
|
214
|
+
return "classic";
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get complete workspace information.
|
|
218
|
+
*/
|
|
219
|
+
function getWorkspaceInfo(startDir = process.cwd()) {
|
|
220
|
+
const packageRoot = findPackageRoot(startDir);
|
|
221
|
+
const workspaceRoot = findWorkspaceRoot(startDir);
|
|
222
|
+
const packageManager = detectPackageManager(workspaceRoot);
|
|
223
|
+
const isMonorepoWorkspace = isMonorepo(workspaceRoot);
|
|
224
|
+
const packages = isMonorepoWorkspace ? getWorkspacePackages(workspaceRoot) : void 0;
|
|
225
|
+
const packageName = getPackageName(packageRoot);
|
|
226
|
+
const repositoryType = detectRepositoryType(startDir, isMonorepoWorkspace);
|
|
227
|
+
return {
|
|
228
|
+
packageManager,
|
|
229
|
+
workspaceRoot,
|
|
230
|
+
packageRoot,
|
|
231
|
+
isMonorepo: isMonorepoWorkspace,
|
|
232
|
+
packages,
|
|
233
|
+
packageName,
|
|
234
|
+
repositoryType,
|
|
235
|
+
metaRepo: repositoryType === "meta-repo" ? getMetaRepoInfo(startDir) : void 0
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get the run command for the detected package manager.
|
|
240
|
+
*/
|
|
241
|
+
function getRunCommand(packageManager, script) {
|
|
242
|
+
switch (packageManager) {
|
|
243
|
+
case "bun": return `bun run ${script}`;
|
|
244
|
+
case "pnpm": return `pnpm run ${script}`;
|
|
245
|
+
case "yarn": return `yarn ${script}`;
|
|
246
|
+
case "npm": return `npm run ${script}`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the exec command for the detected package manager.
|
|
251
|
+
*/
|
|
252
|
+
function getExecCommand(packageManager, command) {
|
|
253
|
+
switch (packageManager) {
|
|
254
|
+
case "bun": return `bunx ${command}`;
|
|
255
|
+
case "pnpm": return `pnpm exec ${command}`;
|
|
256
|
+
case "yarn": return `yarn ${command}`;
|
|
257
|
+
case "npm": return `npx ${command}`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get the install command for the detected package manager.
|
|
262
|
+
*/
|
|
263
|
+
function getInstallCommand(packageManager, isDev = false) {
|
|
264
|
+
const devFlag = isDev ? packageManager === "npm" ? "--save-dev" : "-D" : "";
|
|
265
|
+
switch (packageManager) {
|
|
266
|
+
case "bun": return `bun add ${devFlag}`.trim();
|
|
267
|
+
case "pnpm": return `pnpm add ${devFlag}`.trim();
|
|
268
|
+
case "yarn": return `yarn add ${devFlag}`.trim();
|
|
269
|
+
case "npm": return `npm install ${devFlag}`.trim();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
//#endregion
|
|
274
|
+
export { detectPackageManager, detectRepositoryType, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, getExecCommand, getInstallCommand, getMetaRepoInfo, getPackageName, getRunCommand, getWorkspaceInfo, getWorkspacePackages, isMonorepo, parseGitModules };
|
|
275
|
+
//# sourceMappingURL=workspace.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.mjs","names":["path"],"sources":["../../src/adapters/workspace.ts"],"sourcesContent":["/**\n * Workspace and monorepo detection utilities.\n *\n * Provides utilities for detecting workspace roots, package managers,\n * and monorepo configurations across Bun, pnpm, Yarn, and npm.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\n/**\n * Supported package managers.\n */\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm';\n\n/**\n * Repository structure type.\n */\nexport type RepositoryType = 'classic' | 'monorepo' | 'meta-repo';\n\n/**\n * Git submodule information.\n */\nexport interface SubmoduleInfo {\n /** Submodule name (from .gitmodules) */\n name: string;\n /** Relative path from meta-repo root */\n path: string;\n /** Git remote URL */\n url: string;\n /** Absolute path to submodule root */\n absolutePath: string;\n /** Whether submodule has its own workspaces */\n hasWorkspaces: boolean;\n}\n\n/**\n * Meta-repo information.\n */\nexport interface MetaRepoInfo {\n /** Absolute path to meta-repo root (containing .gitmodules) */\n root: string;\n /** All detected git submodules */\n submodules: SubmoduleInfo[];\n /** Currently active submodule (if in a submodule context) */\n activeSubmodule?: SubmoduleInfo;\n}\n\n/**\n * Workspace detection result.\n */\nexport interface WorkspaceInfo {\n /**\n * The detected package manager.\n */\n packageManager: PackageManager;\n\n /**\n * Root of the workspace (monorepo root or single package root).\n */\n workspaceRoot: string;\n\n /**\n * Root of the current package (may differ from workspaceRoot in monorepos).\n */\n packageRoot: string;\n\n /**\n * Whether this is a monorepo.\n */\n isMonorepo: boolean;\n\n /**\n * List of package paths in monorepo (relative to workspaceRoot).\n */\n packages?: string[];\n\n /**\n * Name of the current package (from package.json).\n */\n packageName?: string;\n\n /**\n * Repository structure type.\n */\n repositoryType: RepositoryType;\n\n /**\n * Meta-repo information (if in a meta-repo context).\n */\n metaRepo?: MetaRepoInfo;\n}\n\n/**\n * Lock files and their corresponding package managers.\n */\nconst LOCK_FILES: Record<string, PackageManager> = {\n 'bun.lockb': 'bun',\n 'bun.lock': 'bun',\n 'pnpm-lock.yaml': 'pnpm',\n 'yarn.lock': 'yarn',\n 'package-lock.json': 'npm',\n};\n\n/**\n * Monorepo indicator files.\n */\nconst MONOREPO_FILES = [\n 'pnpm-workspace.yaml',\n 'lerna.json',\n 'nx.json',\n 'turbo.json',\n 'rush.json',\n];\n\n/**\n * Find the nearest directory containing a package.json.\n */\nexport function findPackageRoot(startDir: string = process.cwd()): string {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, 'package.json'))) {\n return current;\n }\n\n // Move up to parent\n const parent = dirname(current);\n if (parent === current) {\n // Reached filesystem root\n break;\n }\n current = parent;\n }\n\n // Fallback to start directory\n return startDir;\n}\n\n/**\n * Find the workspace root (monorepo root or single package root).\n *\n * Walks up the directory tree looking for:\n * 1. pnpm-workspace.yaml (pnpm monorepo)\n * 2. package.json with \"workspaces\" field (yarn/npm/bun monorepo)\n * 3. Lock files (bun.lockb, pnpm-lock.yaml, yarn.lock, package-lock.json)\n */\nexport function findWorkspaceRoot(startDir: string = process.cwd()): string {\n let current = resolve(startDir);\n let lastPackageJson: string | null = null;\n\n while (true) {\n // Check for monorepo indicators\n for (const file of MONOREPO_FILES) {\n if (existsSync(join(current, file))) {\n return current;\n }\n }\n\n // Check for package.json with workspaces\n const pkgPath = join(current, 'package.json');\n if (existsSync(pkgPath)) {\n lastPackageJson = current;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.workspaces) {\n return current;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Check for lock files at this level\n for (const lockFile of Object.keys(LOCK_FILES)) {\n if (existsSync(join(current, lockFile))) {\n return current;\n }\n }\n\n // Move up to parent\n const parent = dirname(current);\n if (parent === current) {\n // Reached filesystem root\n break;\n }\n current = parent;\n }\n\n // Return last found package.json location, or start dir\n return lastPackageJson ?? startDir;\n}\n\n/**\n * Detect the package manager in use.\n *\n * Priority:\n * 1. Lock file presence (most reliable)\n * 2. packageManager field in package.json\n * 3. COREPACK_ROOT environment variable\n * 4. Default to npm\n */\nexport function detectPackageManager(\n workspaceRoot: string = process.cwd()\n): PackageManager {\n // Check for lock files (in priority order)\n const lockFilePriority: PackageManager[] = ['bun', 'pnpm', 'yarn', 'npm'];\n\n for (const pm of lockFilePriority) {\n const lockFiles = Object.entries(LOCK_FILES).filter(\n ([, manager]) => manager === pm\n );\n for (const [lockFile] of lockFiles) {\n if (existsSync(join(workspaceRoot, lockFile))) {\n return pm;\n }\n }\n }\n\n // Check package.json for packageManager field\n const pkgPath = join(workspaceRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.packageManager) {\n const match = pkg.packageManager.match(/^(bun|pnpm|yarn|npm)@/);\n if (match) {\n return match[1] as PackageManager;\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Check environment\n if (\n process.env.BUN_INSTALL ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (globalThis as any).Bun !== 'undefined'\n ) {\n return 'bun';\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Check if the workspace is a monorepo.\n */\nexport function isMonorepo(workspaceRoot: string = process.cwd()): boolean {\n // Check for monorepo indicator files\n for (const file of MONOREPO_FILES) {\n if (existsSync(join(workspaceRoot, file))) {\n return true;\n }\n }\n\n // Check package.json for workspaces\n const pkgPath = join(workspaceRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.workspaces) {\n return true;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return false;\n}\n\n/**\n * Get workspace package patterns from package.json or pnpm-workspace.yaml.\n */\nexport function getWorkspacePackages(\n workspaceRoot: string\n): string[] | undefined {\n // Check pnpm-workspace.yaml\n const pnpmWorkspacePath = join(workspaceRoot, 'pnpm-workspace.yaml');\n if (existsSync(pnpmWorkspacePath)) {\n try {\n const content = readFileSync(pnpmWorkspacePath, 'utf-8');\n // Simple YAML parsing for packages array\n const match = content.match(\n /packages:\\s*\\n((?:\\s+-\\s+['\"]?[^\\n]+['\"]?\\n?)+)/\n );\n if (match?.[1]) {\n const packages = match[1]\n .split('\\n')\n .map((line) => line.replace(/^\\s+-\\s+['\"]?|['\"]?\\s*$/g, ''))\n .filter(Boolean);\n return packages;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Check package.json workspaces\n const pkgPath = join(workspaceRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (Array.isArray(pkg.workspaces)) {\n return pkg.workspaces;\n }\n if (pkg.workspaces?.packages && Array.isArray(pkg.workspaces.packages)) {\n return pkg.workspaces.packages;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return undefined;\n}\n\n/**\n * Get package name from package.json.\n */\nexport function getPackageName(packageRoot: string): string | undefined {\n const pkgPath = join(packageRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.name;\n } catch {\n // Ignore parse errors\n }\n }\n return undefined;\n}\n\n/**\n * Parse .gitmodules file to extract submodule information.\n */\nexport function parseGitModules(metaRepoRoot: string): SubmoduleInfo[] {\n const gitmodulesPath = join(metaRepoRoot, '.gitmodules');\n if (!existsSync(gitmodulesPath)) {\n return [];\n }\n\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const submodules: SubmoduleInfo[] = [];\n const submoduleRegex =\n /\\[submodule\\s+\"([^\"]+)\"\\]\\s*\\n\\s*path\\s*=\\s*(\\S+)\\s*\\n\\s*url\\s*=\\s*(\\S+)/g;\n\n let match: RegExpExecArray | null;\n while ((match = submoduleRegex.exec(content)) !== null) {\n const [, name, path, url] = match;\n if (name && path && url) {\n const absolutePath = join(metaRepoRoot, path);\n const hasWorkspaces =\n existsSync(join(absolutePath, 'package.json')) &&\n checkHasWorkspaces(absolutePath);\n\n submodules.push({\n name,\n path,\n url,\n absolutePath,\n hasWorkspaces,\n });\n }\n }\n\n return submodules;\n } catch {\n return [];\n }\n}\n\n/**\n * Check if a directory has workspace configuration.\n */\nfunction checkHasWorkspaces(dir: string): boolean {\n const pkgPath = join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return Boolean(pkg.workspaces);\n } catch {\n // Ignore\n }\n }\n return existsSync(join(dir, 'pnpm-workspace.yaml'));\n}\n\n/**\n * Find the meta-repo root by looking for .gitmodules.\n */\nexport function findMetaRepoRoot(startDir: string): string | undefined {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, '.gitmodules'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return undefined;\n}\n\n/**\n * Get meta-repo information if in a meta-repo context.\n */\nexport function getMetaRepoInfo(startDir: string): MetaRepoInfo | undefined {\n const metaRoot = findMetaRepoRoot(startDir);\n if (!metaRoot) {\n return undefined;\n }\n\n const submodules = parseGitModules(metaRoot);\n if (submodules.length === 0) {\n return undefined;\n }\n\n // Determine active submodule based on current directory\n const resolvedStart = resolve(startDir);\n const activeSubmodule = submodules.find((sub) =>\n resolvedStart.startsWith(sub.absolutePath)\n );\n\n return {\n root: metaRoot,\n submodules,\n activeSubmodule,\n };\n}\n\n/**\n * Detect the repository structure type.\n */\nexport function detectRepositoryType(\n startDir: string,\n isMonorepoFlag: boolean\n): RepositoryType {\n const metaRoot = findMetaRepoRoot(startDir);\n if (metaRoot) {\n const submodules = parseGitModules(metaRoot);\n if (submodules.length > 0) {\n return 'meta-repo';\n }\n }\n\n if (isMonorepoFlag) {\n return 'monorepo';\n }\n\n return 'classic';\n}\n\n/**\n * Get complete workspace information.\n */\nexport function getWorkspaceInfo(\n startDir: string = process.cwd()\n): WorkspaceInfo {\n const packageRoot = findPackageRoot(startDir);\n const workspaceRoot = findWorkspaceRoot(startDir);\n const packageManager = detectPackageManager(workspaceRoot);\n const isMonorepoWorkspace = isMonorepo(workspaceRoot);\n const packages = isMonorepoWorkspace\n ? getWorkspacePackages(workspaceRoot)\n : undefined;\n const packageName = getPackageName(packageRoot);\n const repositoryType = detectRepositoryType(startDir, isMonorepoWorkspace);\n const metaRepo =\n repositoryType === 'meta-repo' ? getMetaRepoInfo(startDir) : undefined;\n\n return {\n packageManager,\n workspaceRoot,\n packageRoot,\n isMonorepo: isMonorepoWorkspace,\n packages,\n packageName,\n repositoryType,\n metaRepo,\n };\n}\n\n/**\n * Get the run command for the detected package manager.\n */\nexport function getRunCommand(\n packageManager: PackageManager,\n script: string\n): string {\n switch (packageManager) {\n case 'bun':\n return `bun run ${script}`;\n case 'pnpm':\n return `pnpm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'npm':\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get the exec command for the detected package manager.\n */\nexport function getExecCommand(\n packageManager: PackageManager,\n command: string\n): string {\n switch (packageManager) {\n case 'bun':\n return `bunx ${command}`;\n case 'pnpm':\n return `pnpm exec ${command}`;\n case 'yarn':\n return `yarn ${command}`;\n case 'npm':\n return `npx ${command}`;\n }\n}\n\n/**\n * Get the install command for the detected package manager.\n */\nexport function getInstallCommand(\n packageManager: PackageManager,\n isDev = false\n): string {\n const devFlag = isDev ? (packageManager === 'npm' ? '--save-dev' : '-D') : '';\n\n switch (packageManager) {\n case 'bun':\n return `bun add ${devFlag}`.trim();\n case 'pnpm':\n return `pnpm add ${devFlag}`.trim();\n case 'yarn':\n return `yarn add ${devFlag}`.trim();\n case 'npm':\n return `npm install ${devFlag}`.trim();\n }\n}\n"],"mappings":"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"}
|