@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,66 @@
|
|
|
1
|
+
import { findWorkspaceRoot } from "../../adapters/workspace.mjs";
|
|
2
|
+
import { copyFile, mkdir, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
|
|
6
|
+
//#region src/services/vibe/pack.ts
|
|
7
|
+
/**
|
|
8
|
+
* Pack installation service.
|
|
9
|
+
*
|
|
10
|
+
* Install vibe packs from local paths or registry.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Install a vibe pack from a local path.
|
|
14
|
+
*/
|
|
15
|
+
async function installPack(packPath, cwd) {
|
|
16
|
+
const workingDir = cwd ?? process.cwd();
|
|
17
|
+
const root = findWorkspaceRoot(workingDir) ?? workingDir;
|
|
18
|
+
if (packPath.startsWith("registry:")) return {
|
|
19
|
+
success: false,
|
|
20
|
+
workflowsInstalled: 0,
|
|
21
|
+
templatesInstalled: 0,
|
|
22
|
+
error: "Registry pack install not yet implemented. Use local path."
|
|
23
|
+
};
|
|
24
|
+
const absPackPath = resolve(workingDir, packPath);
|
|
25
|
+
if (!existsSync(absPackPath)) return {
|
|
26
|
+
success: false,
|
|
27
|
+
workflowsInstalled: 0,
|
|
28
|
+
templatesInstalled: 0,
|
|
29
|
+
error: `Pack path not found: ${absPackPath}`
|
|
30
|
+
};
|
|
31
|
+
let workflowsCount = 0;
|
|
32
|
+
let templatesCount = 0;
|
|
33
|
+
const workflowsSrc = join(absPackPath, "workflows");
|
|
34
|
+
if (existsSync(workflowsSrc)) {
|
|
35
|
+
const workflowsDest = join(root, ".contractspec", "vibe", "workflows");
|
|
36
|
+
await mkdir(workflowsDest, { recursive: true });
|
|
37
|
+
const files = await readdir(workflowsSrc);
|
|
38
|
+
for (const file of files) if (file.endsWith(".json") || file.endsWith(".yaml") || file.endsWith(".yml")) {
|
|
39
|
+
await copyFile(join(workflowsSrc, file), join(workflowsDest, file));
|
|
40
|
+
workflowsCount++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const templatesSrc = join(absPackPath, "templates");
|
|
44
|
+
if (existsSync(templatesSrc)) {
|
|
45
|
+
const templatesDest = join(root, ".contractspec", "vibe", "templates");
|
|
46
|
+
await mkdir(templatesDest, { recursive: true });
|
|
47
|
+
const files = await readdir(templatesSrc);
|
|
48
|
+
for (const file of files) {
|
|
49
|
+
const srcFile = join(templatesSrc, file);
|
|
50
|
+
const destFile = join(templatesDest, file);
|
|
51
|
+
if ((await stat(srcFile)).isFile()) {
|
|
52
|
+
await copyFile(srcFile, destFile);
|
|
53
|
+
templatesCount++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
workflowsInstalled: workflowsCount,
|
|
60
|
+
templatesInstalled: templatesCount
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
export { installPack };
|
|
66
|
+
//# sourceMappingURL=pack.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.mjs","names":[],"sources":["../../../src/services/vibe/pack.ts"],"sourcesContent":["/**\n * Pack installation service.\n *\n * Install vibe packs from local paths or registry.\n */\n\nimport { mkdir, copyFile, readdir, stat } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { findWorkspaceRoot } from '../../adapters/workspace';\n\nexport interface PackInstallResult {\n success: boolean;\n workflowsInstalled: number;\n templatesInstalled: number;\n error?: string;\n}\n\n/**\n * Install a vibe pack from a local path.\n */\nexport async function installPack(\n packPath: string,\n cwd?: string\n): Promise<PackInstallResult> {\n const workingDir = cwd ?? process.cwd();\n const root = findWorkspaceRoot(workingDir) ?? workingDir;\n\n // Handle registry packs (future)\n if (packPath.startsWith('registry:')) {\n return {\n success: false,\n workflowsInstalled: 0,\n templatesInstalled: 0,\n error: 'Registry pack install not yet implemented. Use local path.',\n };\n }\n\n const absPackPath = resolve(workingDir, packPath);\n if (!existsSync(absPackPath)) {\n return {\n success: false,\n workflowsInstalled: 0,\n templatesInstalled: 0,\n error: `Pack path not found: ${absPackPath}`,\n };\n }\n\n let workflowsCount = 0;\n let templatesCount = 0;\n\n // Install workflows\n const workflowsSrc = join(absPackPath, 'workflows');\n if (existsSync(workflowsSrc)) {\n const workflowsDest = join(root, '.contractspec', 'vibe', 'workflows');\n await mkdir(workflowsDest, { recursive: true });\n\n const files = await readdir(workflowsSrc);\n for (const file of files) {\n if (\n file.endsWith('.json') ||\n file.endsWith('.yaml') ||\n file.endsWith('.yml')\n ) {\n await copyFile(join(workflowsSrc, file), join(workflowsDest, file));\n workflowsCount++;\n }\n }\n }\n\n // Install templates\n const templatesSrc = join(absPackPath, 'templates');\n if (existsSync(templatesSrc)) {\n const templatesDest = join(root, '.contractspec', 'vibe', 'templates');\n await mkdir(templatesDest, { recursive: true });\n\n const files = await readdir(templatesSrc);\n for (const file of files) {\n const srcFile = join(templatesSrc, file);\n const destFile = join(templatesDest, file);\n const stats = await stat(srcFile);\n if (stats.isFile()) {\n await copyFile(srcFile, destFile);\n templatesCount++;\n }\n }\n }\n\n return {\n success: true,\n workflowsInstalled: workflowsCount,\n templatesInstalled: templatesCount,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,eAAsB,YACpB,UACA,KAC4B;CAC5B,MAAM,aAAa,OAAO,QAAQ,KAAK;CACvC,MAAM,OAAO,kBAAkB,WAAW,IAAI;AAG9C,KAAI,SAAS,WAAW,YAAY,CAClC,QAAO;EACL,SAAS;EACT,oBAAoB;EACpB,oBAAoB;EACpB,OAAO;EACR;CAGH,MAAM,cAAc,QAAQ,YAAY,SAAS;AACjD,KAAI,CAAC,WAAW,YAAY,CAC1B,QAAO;EACL,SAAS;EACT,oBAAoB;EACpB,oBAAoB;EACpB,OAAO,wBAAwB;EAChC;CAGH,IAAI,iBAAiB;CACrB,IAAI,iBAAiB;CAGrB,MAAM,eAAe,KAAK,aAAa,YAAY;AACnD,KAAI,WAAW,aAAa,EAAE;EAC5B,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,QAAQ,YAAY;AACtE,QAAM,MAAM,eAAe,EAAE,WAAW,MAAM,CAAC;EAE/C,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,OAAK,MAAM,QAAQ,MACjB,KACE,KAAK,SAAS,QAAQ,IACtB,KAAK,SAAS,QAAQ,IACtB,KAAK,SAAS,OAAO,EACrB;AACA,SAAM,SAAS,KAAK,cAAc,KAAK,EAAE,KAAK,eAAe,KAAK,CAAC;AACnE;;;CAMN,MAAM,eAAe,KAAK,aAAa,YAAY;AACnD,KAAI,WAAW,aAAa,EAAE;EAC5B,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,QAAQ,YAAY;AACtE,QAAM,MAAM,eAAe,EAAE,WAAW,MAAM,CAAC;EAE/C,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,UAAU,KAAK,cAAc,KAAK;GACxC,MAAM,WAAW,KAAK,eAAe,KAAK;AAE1C,QADc,MAAM,KAAK,QAAQ,EACvB,QAAQ,EAAE;AAClB,UAAM,SAAS,SAAS,SAAS;AACjC;;;;AAKN,QAAO;EACL,SAAS;EACT,oBAAoB;EACpB,oBAAoB;EACrB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//#region src/services/vibe/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Vibe workflow types.
|
|
4
|
+
*
|
|
5
|
+
* Platform-agnostic types for workflow execution.
|
|
6
|
+
*/
|
|
7
|
+
type Track = 'quick' | 'product' | 'regulated';
|
|
8
|
+
interface WorkflowContext {
|
|
9
|
+
root: string;
|
|
10
|
+
config: Record<string, unknown>;
|
|
11
|
+
dryRun: boolean;
|
|
12
|
+
track: Track;
|
|
13
|
+
json: boolean;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
interface WorkflowStep {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
command?: string;
|
|
20
|
+
args?: string[];
|
|
21
|
+
manualCheckpoint?: boolean;
|
|
22
|
+
manualMessage?: string;
|
|
23
|
+
condition?: (ctx: WorkflowContext) => boolean | Promise<boolean>;
|
|
24
|
+
execute?: (ctx: WorkflowContext) => Promise<void>;
|
|
25
|
+
tracks?: Track[];
|
|
26
|
+
}
|
|
27
|
+
interface WorkflowStepResult {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
status: 'pass' | 'fail' | 'skip';
|
|
31
|
+
command?: string;
|
|
32
|
+
artifactsTouched?: string[];
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
interface Workflow {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
steps: WorkflowStep[];
|
|
40
|
+
}
|
|
41
|
+
interface WorkflowResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
steps: WorkflowStepResult[];
|
|
44
|
+
stepsExecuted: string[];
|
|
45
|
+
artifactsTouched: string[];
|
|
46
|
+
error?: Error;
|
|
47
|
+
}
|
|
48
|
+
interface VibeConfig {
|
|
49
|
+
canonicalRoot: string;
|
|
50
|
+
workRoot: string;
|
|
51
|
+
generatedRoot: string;
|
|
52
|
+
alwaysInjectFiles: string[];
|
|
53
|
+
contextExportAllowlist: string[];
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
}
|
|
56
|
+
declare const DEFAULT_VIBE_CONFIG: VibeConfig;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { DEFAULT_VIBE_CONFIG, Track, VibeConfig, Workflow, WorkflowContext, WorkflowResult, WorkflowStep, WorkflowStepResult };
|
|
59
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/vibe/types.ts"],"sourcesContent":[],"mappings":";;AAMA;AAEA;AASA;;AAOkD,KAlBtC,KAAA,GAkBsC,OAAA,GAAA,SAAA,GAAA,WAAA;AAChC,UAjBD,eAAA,CAiBC;EAAoB,IAAA,EAAA,MAAA;EAC3B,MAAA,EAhBD,MAgBC,CAAA,MAAA,EAAA,OAAA,CAAA;EAAK,MAAA,EAAA,OAAA;EAGC,KAAA,EAjBR,KAiBQ;EASA,IAAA,EAAA,OAAQ;EAOR,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAc;AAQ/B;AASa,UA7CI,YAAA,CAmDhB;;;;;;;oBA5CmB,8BAA8B;kBAChC,oBAAoB;WAC3B;;UAGM,kBAAA;;;;;;;;UASA,QAAA;;;;SAIR;;UAGQ,cAAA;;SAER;;;UAGC;;UAGO,UAAA;;;;;;;;cASJ,qBAAqB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/services/vibe/types.ts
|
|
2
|
+
const DEFAULT_VIBE_CONFIG = {
|
|
3
|
+
canonicalRoot: "contracts",
|
|
4
|
+
workRoot: ".contractspec/work",
|
|
5
|
+
generatedRoot: "src/generated",
|
|
6
|
+
alwaysInjectFiles: [],
|
|
7
|
+
contextExportAllowlist: []
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { DEFAULT_VIBE_CONFIG };
|
|
12
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"sources":["../../../src/services/vibe/types.ts"],"sourcesContent":["/**\n * Vibe workflow types.\n *\n * Platform-agnostic types for workflow execution.\n */\n\nexport type Track = 'quick' | 'product' | 'regulated';\n\nexport interface WorkflowContext {\n root: string;\n config: Record<string, unknown>;\n dryRun: boolean;\n track: Track;\n json: boolean;\n [key: string]: unknown;\n}\n\nexport interface WorkflowStep {\n id: string;\n label: string;\n command?: string;\n args?: string[];\n manualCheckpoint?: boolean;\n manualMessage?: string;\n condition?: (ctx: WorkflowContext) => boolean | Promise<boolean>;\n execute?: (ctx: WorkflowContext) => Promise<void>;\n tracks?: Track[];\n}\n\nexport interface WorkflowStepResult {\n id: string;\n name: string;\n status: 'pass' | 'fail' | 'skip';\n command?: string;\n artifactsTouched?: string[];\n error?: string;\n}\n\nexport interface Workflow {\n id: string;\n name: string;\n description: string;\n steps: WorkflowStep[];\n}\n\nexport interface WorkflowResult {\n success: boolean;\n steps: WorkflowStepResult[];\n stepsExecuted: string[];\n artifactsTouched: string[];\n error?: Error;\n}\n\nexport interface VibeConfig {\n canonicalRoot: string;\n workRoot: string;\n generatedRoot: string;\n alwaysInjectFiles: string[];\n contextExportAllowlist: string[];\n [key: string]: unknown;\n}\n\nexport const DEFAULT_VIBE_CONFIG: VibeConfig = {\n canonicalRoot: 'contracts',\n workRoot: '.contractspec/work',\n generatedRoot: 'src/generated',\n alwaysInjectFiles: [],\n contextExportAllowlist: [],\n};\n"],"mappings":";AA8DA,MAAa,sBAAkC;CAC7C,eAAe;CACf,UAAU;CACV,eAAe;CACf,mBAAmB,EAAE;CACrB,wBAAwB,EAAE;CAC3B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WorkspaceAdapters } from "../../ports/logger.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/view/index.d.ts
|
|
4
|
+
type ViewAudience = 'product' | 'eng' | 'qa';
|
|
5
|
+
/**
|
|
6
|
+
* Generate an audience-specific view of a spec file.
|
|
7
|
+
*/
|
|
8
|
+
declare function generateView(specFile: string, audience: ViewAudience, adapters: WorkspaceAdapters): Promise<string>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { ViewAudience, generateView };
|
|
11
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":[],"mappings":";;;KAMY,YAAA;;AAAZ;AAKA;AAEY,iBAFU,YAAA,CAEV,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EACA,iBADA,CAAA,EAET,OAFS,CAAA,MAAA,CAAA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { loadSpecFromSource } from "@contractspec/module.workspace";
|
|
2
|
+
|
|
3
|
+
//#region src/services/view/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Generate an audience-specific view of a spec file.
|
|
6
|
+
*/
|
|
7
|
+
async function generateView(specFile, audience, adapters) {
|
|
8
|
+
if (!await adapters.fs.exists(specFile)) throw new Error(`File not found: ${specFile}`);
|
|
9
|
+
const specs = await loadSpecFromSource(specFile);
|
|
10
|
+
if (specs.length === 0) return `No specs found in ${specFile} (Parse result empty)`;
|
|
11
|
+
return specs.map((spec) => formatSpecForAudience(spec, audience)).join("\n\n---\n\n");
|
|
12
|
+
}
|
|
13
|
+
function formatSpecForAudience(spec, audience) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
switch (audience) {
|
|
16
|
+
case "product":
|
|
17
|
+
formatProductView(spec, lines);
|
|
18
|
+
break;
|
|
19
|
+
case "eng":
|
|
20
|
+
formatEngView(spec, lines);
|
|
21
|
+
break;
|
|
22
|
+
case "qa":
|
|
23
|
+
formatQaView(spec, lines);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
return lines.join("\n");
|
|
27
|
+
}
|
|
28
|
+
function formatProductView(spec, lines) {
|
|
29
|
+
lines.push(`# ${spec.meta.key}`);
|
|
30
|
+
lines.push("**View**: Product (User Flow & Capabilities)");
|
|
31
|
+
lines.push("");
|
|
32
|
+
if (spec.meta.goal) lines.push(`### Goal\n${spec.meta.goal}\n`);
|
|
33
|
+
if (spec.meta.context) lines.push(`### Context\n${spec.meta.context}\n`);
|
|
34
|
+
if (spec.specType === "feature") {
|
|
35
|
+
if (spec.operations?.length) {
|
|
36
|
+
lines.push("### Capabilities (Operations)");
|
|
37
|
+
spec.operations.forEach((op) => lines.push(`- **${op.name}**`));
|
|
38
|
+
lines.push("");
|
|
39
|
+
}
|
|
40
|
+
if (spec.presentations?.length) {
|
|
41
|
+
lines.push("### User Interfaces (Presentations)");
|
|
42
|
+
spec.presentations.forEach((p) => lines.push(`- **${p.name}**`));
|
|
43
|
+
lines.push("");
|
|
44
|
+
}
|
|
45
|
+
} else if (spec.specType === "operation") {
|
|
46
|
+
lines.push("### Behavior");
|
|
47
|
+
if (spec.hasPolicy) lines.push("- ✅ Enforces Business Policies");
|
|
48
|
+
if (spec.hasIo) lines.push("- ✅ Validates Inputs/Outputs");
|
|
49
|
+
if (spec.emittedEvents?.length) {
|
|
50
|
+
lines.push("### Triggers");
|
|
51
|
+
spec.emittedEvents.forEach((ev) => lines.push(`- **${ev.name}** (Event)`));
|
|
52
|
+
}
|
|
53
|
+
} else lines.push(`Type: ${spec.specType}`);
|
|
54
|
+
}
|
|
55
|
+
function formatEngView(spec, lines) {
|
|
56
|
+
lines.push(`# ${spec.meta.key}`);
|
|
57
|
+
lines.push("**View**: Engineering (API, Schemas, Constraints)");
|
|
58
|
+
lines.push("");
|
|
59
|
+
lines.push(`- **Type**: \`${spec.specType}\``);
|
|
60
|
+
lines.push(`- **Version**: \`${spec.meta.version}\``);
|
|
61
|
+
if (spec.meta.stability) lines.push(`- **Stability**: \`${spec.meta.stability}\``);
|
|
62
|
+
lines.push("");
|
|
63
|
+
if (spec.specType === "operation") {
|
|
64
|
+
lines.push("### Contract Details");
|
|
65
|
+
lines.push(`- **I/O Schema**: ${spec.hasIo ? "✅ Defined" : "❌ Missing"}`);
|
|
66
|
+
lines.push(`- **Policy Config**: ${spec.hasPolicy ? "✅ Defined" : "❌ None"}`);
|
|
67
|
+
lines.push("");
|
|
68
|
+
if (spec.emittedEvents?.length) {
|
|
69
|
+
lines.push("### Emitted Events");
|
|
70
|
+
spec.emittedEvents.forEach((ev) => lines.push(`- \`${ev.name}\``));
|
|
71
|
+
lines.push("");
|
|
72
|
+
}
|
|
73
|
+
} else if (spec.specType === "feature") {
|
|
74
|
+
if (spec.operations?.length) {
|
|
75
|
+
lines.push("### Operations");
|
|
76
|
+
spec.operations.forEach((op) => lines.push(`- \`${op.name}\``));
|
|
77
|
+
lines.push("");
|
|
78
|
+
}
|
|
79
|
+
if (spec.events?.length) {
|
|
80
|
+
lines.push("### Events");
|
|
81
|
+
spec.events.forEach((ev) => lines.push(`- \`${ev.name}\``));
|
|
82
|
+
lines.push("");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (spec.sourceBlock) {
|
|
86
|
+
lines.push("### Source Signature");
|
|
87
|
+
lines.push("```typescript");
|
|
88
|
+
lines.push(spec.sourceBlock);
|
|
89
|
+
lines.push("```");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function formatQaView(spec, lines) {
|
|
93
|
+
lines.push(`# ${spec.meta.key}`);
|
|
94
|
+
lines.push("**View**: QA (Scenarios, Test Coverage)");
|
|
95
|
+
lines.push("");
|
|
96
|
+
if (spec.meta.goal) lines.push(`**Goal**: ${spec.meta.goal}\n`);
|
|
97
|
+
if (spec.testRefs?.length) {
|
|
98
|
+
lines.push("### Linked Scenarios");
|
|
99
|
+
spec.testRefs.forEach((test) => lines.push(`- 🧪 \`${test.name}\``));
|
|
100
|
+
lines.push("");
|
|
101
|
+
} else {
|
|
102
|
+
lines.push("### Linked Scenarios");
|
|
103
|
+
lines.push("_(No explicit test refs found)_");
|
|
104
|
+
lines.push("");
|
|
105
|
+
}
|
|
106
|
+
lines.push("### Verification Checklist");
|
|
107
|
+
if (spec.specType === "operation") {
|
|
108
|
+
lines.push(`- [ ] Verify input validation for \`${spec.meta.key}\` (Success/Fail cases)`);
|
|
109
|
+
if (spec.hasPolicy) lines.push(`- [ ] Verify policy enforcement rules`);
|
|
110
|
+
if (spec.emittedEvents?.length) spec.emittedEvents.forEach((ev) => lines.push(`- [ ] Verify event \`${ev.name}\` is emitted`));
|
|
111
|
+
} else if (spec.specType === "feature") {
|
|
112
|
+
if (spec.operations?.length) spec.operations.forEach((op) => lines.push(`- [ ] Test Operation flow: \`${op.name}\``));
|
|
113
|
+
if (spec.presentations?.length) spec.presentations.forEach((p) => lines.push(`- [ ] Test UI Component: \`${p.name}\``));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
//#endregion
|
|
118
|
+
export { generateView };
|
|
119
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/view/index.ts"],"sourcesContent":["import {\n loadSpecFromSource,\n type ParsedSpec,\n} from '@contractspec/module.workspace';\nimport type { WorkspaceAdapters } from '../../ports/logger';\n\nexport type ViewAudience = 'product' | 'eng' | 'qa';\n\n/**\n * Generate an audience-specific view of a spec file.\n */\nexport async function generateView(\n specFile: string,\n audience: ViewAudience,\n adapters: WorkspaceAdapters\n): Promise<string> {\n // Using the module's static analysis, which uses node:fs internally\n // We check existence first using adapters for better error handling\n if (!(await adapters.fs.exists(specFile))) {\n throw new Error(`File not found: ${specFile}`);\n }\n\n const specs = await loadSpecFromSource(specFile);\n\n if (specs.length === 0) {\n return `No specs found in ${specFile} (Parse result empty)`;\n }\n\n return specs\n .map((spec) => formatSpecForAudience(spec, audience))\n .join('\\n\\n---\\n\\n');\n}\n\nfunction formatSpecForAudience(\n spec: ParsedSpec,\n audience: ViewAudience\n): string {\n const lines: string[] = [];\n\n switch (audience) {\n case 'product':\n formatProductView(spec, lines);\n break;\n case 'eng':\n formatEngView(spec, lines);\n break;\n case 'qa':\n formatQaView(spec, lines);\n break;\n }\n\n return lines.join('\\n');\n}\n\nfunction formatProductView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Product (User Flow & Capabilities)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`### Goal\\n${spec.meta.goal}\\n`);\n }\n if (spec.meta.context) {\n lines.push(`### Context\\n${spec.meta.context}\\n`);\n }\n\n if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Capabilities (Operations)');\n spec.operations.forEach((op) => lines.push(`- **${op.name}**`));\n lines.push('');\n }\n if (spec.presentations?.length) {\n lines.push('### User Interfaces (Presentations)');\n spec.presentations.forEach((p) => lines.push(`- **${p.name}**`));\n lines.push('');\n }\n } else if (spec.specType === 'operation') {\n lines.push('### Behavior');\n if (spec.hasPolicy) lines.push('- ✅ Enforces Business Policies');\n if (spec.hasIo) lines.push('- ✅ Validates Inputs/Outputs');\n if (spec.emittedEvents?.length) {\n lines.push('### Triggers');\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- **${ev.name}** (Event)`)\n );\n }\n } else {\n lines.push(`Type: ${spec.specType}`);\n }\n}\n\nfunction formatEngView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: Engineering (API, Schemas, Constraints)');\n lines.push('');\n\n lines.push(`- **Type**: \\`${spec.specType}\\``);\n lines.push(`- **Version**: \\`${spec.meta.version}\\``);\n if (spec.meta.stability)\n lines.push(`- **Stability**: \\`${spec.meta.stability}\\``);\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push('### Contract Details');\n lines.push(`- **I/O Schema**: ${spec.hasIo ? '✅ Defined' : '❌ Missing'}`);\n lines.push(\n `- **Policy Config**: ${spec.hasPolicy ? '✅ Defined' : '❌ None'}`\n );\n lines.push('');\n\n if (spec.emittedEvents?.length) {\n lines.push('### Emitted Events');\n spec.emittedEvents.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n lines.push('### Operations');\n spec.operations.forEach((op) => lines.push(`- \\`${op.name}\\``));\n lines.push('');\n }\n if (spec.events?.length) {\n lines.push('### Events');\n spec.events.forEach((ev) => lines.push(`- \\`${ev.name}\\``));\n lines.push('');\n }\n }\n\n if (spec.sourceBlock) {\n lines.push('### Source Signature');\n lines.push('```typescript');\n lines.push(spec.sourceBlock);\n lines.push('```');\n }\n}\n\nfunction formatQaView(spec: ParsedSpec, lines: string[]) {\n lines.push(`# ${spec.meta.key}`);\n lines.push('**View**: QA (Scenarios, Test Coverage)');\n lines.push('');\n\n if (spec.meta.goal) {\n lines.push(`**Goal**: ${spec.meta.goal}\\n`);\n }\n\n if (spec.testRefs?.length) {\n lines.push('### Linked Scenarios');\n spec.testRefs.forEach((test) => lines.push(`- 🧪 \\`${test.name}\\``));\n lines.push('');\n } else {\n lines.push('### Linked Scenarios');\n lines.push('_(No explicit test refs found)_');\n lines.push('');\n }\n\n lines.push('### Verification Checklist');\n if (spec.specType === 'operation') {\n lines.push(\n `- [ ] Verify input validation for \\`${spec.meta.key}\\` (Success/Fail cases)`\n );\n if (spec.hasPolicy) lines.push(`- [ ] Verify policy enforcement rules`);\n if (spec.emittedEvents?.length) {\n spec.emittedEvents.forEach((ev) =>\n lines.push(`- [ ] Verify event \\`${ev.name}\\` is emitted`)\n );\n }\n } else if (spec.specType === 'feature') {\n if (spec.operations?.length) {\n spec.operations.forEach((op) =>\n lines.push(`- [ ] Test Operation flow: \\`${op.name}\\``)\n );\n }\n if (spec.presentations?.length) {\n spec.presentations.forEach((p) =>\n lines.push(`- [ ] Test UI Component: \\`${p.name}\\``)\n );\n }\n }\n}\n"],"mappings":";;;;;;AAWA,eAAsB,aACpB,UACA,UACA,UACiB;AAGjB,KAAI,CAAE,MAAM,SAAS,GAAG,OAAO,SAAS,CACtC,OAAM,IAAI,MAAM,mBAAmB,WAAW;CAGhD,MAAM,QAAQ,MAAM,mBAAmB,SAAS;AAEhD,KAAI,MAAM,WAAW,EACnB,QAAO,qBAAqB,SAAS;AAGvC,QAAO,MACJ,KAAK,SAAS,sBAAsB,MAAM,SAAS,CAAC,CACpD,KAAK,cAAc;;AAGxB,SAAS,sBACP,MACA,UACQ;CACR,MAAM,QAAkB,EAAE;AAE1B,SAAQ,UAAR;EACE,KAAK;AACH,qBAAkB,MAAM,MAAM;AAC9B;EACF,KAAK;AACH,iBAAc,MAAM,MAAM;AAC1B;EACF,KAAK;AACH,gBAAa,MAAM,MAAM;AACzB;;AAGJ,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAS,kBAAkB,MAAkB,OAAiB;AAC5D,OAAM,KAAK,KAAK,KAAK,KAAK,MAAM;AAChC,OAAM,KAAK,+CAA+C;AAC1D,OAAM,KAAK,GAAG;AAEd,KAAI,KAAK,KAAK,KACZ,OAAM,KAAK,aAAa,KAAK,KAAK,KAAK,IAAI;AAE7C,KAAI,KAAK,KAAK,QACZ,OAAM,KAAK,gBAAgB,KAAK,KAAK,QAAQ,IAAI;AAGnD,KAAI,KAAK,aAAa,WAAW;AAC/B,MAAI,KAAK,YAAY,QAAQ;AAC3B,SAAM,KAAK,gCAAgC;AAC3C,QAAK,WAAW,SAAS,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK,IAAI,CAAC;AAC/D,SAAM,KAAK,GAAG;;AAEhB,MAAI,KAAK,eAAe,QAAQ;AAC9B,SAAM,KAAK,sCAAsC;AACjD,QAAK,cAAc,SAAS,MAAM,MAAM,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC;AAChE,SAAM,KAAK,GAAG;;YAEP,KAAK,aAAa,aAAa;AACxC,QAAM,KAAK,eAAe;AAC1B,MAAI,KAAK,UAAW,OAAM,KAAK,iCAAiC;AAChE,MAAI,KAAK,MAAO,OAAM,KAAK,+BAA+B;AAC1D,MAAI,KAAK,eAAe,QAAQ;AAC9B,SAAM,KAAK,eAAe;AAC1B,QAAK,cAAc,SAAS,OAC1B,MAAM,KAAK,OAAO,GAAG,KAAK,YAAY,CACvC;;OAGH,OAAM,KAAK,SAAS,KAAK,WAAW;;AAIxC,SAAS,cAAc,MAAkB,OAAiB;AACxD,OAAM,KAAK,KAAK,KAAK,KAAK,MAAM;AAChC,OAAM,KAAK,oDAAoD;AAC/D,OAAM,KAAK,GAAG;AAEd,OAAM,KAAK,iBAAiB,KAAK,SAAS,IAAI;AAC9C,OAAM,KAAK,oBAAoB,KAAK,KAAK,QAAQ,IAAI;AACrD,KAAI,KAAK,KAAK,UACZ,OAAM,KAAK,sBAAsB,KAAK,KAAK,UAAU,IAAI;AAC3D,OAAM,KAAK,GAAG;AAEd,KAAI,KAAK,aAAa,aAAa;AACjC,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,qBAAqB,KAAK,QAAQ,cAAc,cAAc;AACzE,QAAM,KACJ,wBAAwB,KAAK,YAAY,cAAc,WACxD;AACD,QAAM,KAAK,GAAG;AAEd,MAAI,KAAK,eAAe,QAAQ;AAC9B,SAAM,KAAK,qBAAqB;AAChC,QAAK,cAAc,SAAS,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK,IAAI,CAAC;AAClE,SAAM,KAAK,GAAG;;YAEP,KAAK,aAAa,WAAW;AACtC,MAAI,KAAK,YAAY,QAAQ;AAC3B,SAAM,KAAK,iBAAiB;AAC5B,QAAK,WAAW,SAAS,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK,IAAI,CAAC;AAC/D,SAAM,KAAK,GAAG;;AAEhB,MAAI,KAAK,QAAQ,QAAQ;AACvB,SAAM,KAAK,aAAa;AACxB,QAAK,OAAO,SAAS,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK,IAAI,CAAC;AAC3D,SAAM,KAAK,GAAG;;;AAIlB,KAAI,KAAK,aAAa;AACpB,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,gBAAgB;AAC3B,QAAM,KAAK,KAAK,YAAY;AAC5B,QAAM,KAAK,MAAM;;;AAIrB,SAAS,aAAa,MAAkB,OAAiB;AACvD,OAAM,KAAK,KAAK,KAAK,KAAK,MAAM;AAChC,OAAM,KAAK,0CAA0C;AACrD,OAAM,KAAK,GAAG;AAEd,KAAI,KAAK,KAAK,KACZ,OAAM,KAAK,aAAa,KAAK,KAAK,KAAK,IAAI;AAG7C,KAAI,KAAK,UAAU,QAAQ;AACzB,QAAM,KAAK,uBAAuB;AAClC,OAAK,SAAS,SAAS,SAAS,MAAM,KAAK,UAAU,KAAK,KAAK,IAAI,CAAC;AACpE,QAAM,KAAK,GAAG;QACT;AACL,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,GAAG;;AAGhB,OAAM,KAAK,6BAA6B;AACxC,KAAI,KAAK,aAAa,aAAa;AACjC,QAAM,KACJ,uCAAuC,KAAK,KAAK,IAAI,yBACtD;AACD,MAAI,KAAK,UAAW,OAAM,KAAK,wCAAwC;AACvE,MAAI,KAAK,eAAe,OACtB,MAAK,cAAc,SAAS,OAC1B,MAAM,KAAK,wBAAwB,GAAG,KAAK,eAAe,CAC3D;YAEM,KAAK,aAAa,WAAW;AACtC,MAAI,KAAK,YAAY,OACnB,MAAK,WAAW,SAAS,OACvB,MAAM,KAAK,gCAAgC,GAAG,KAAK,IAAI,CACxD;AAEH,MAAI,KAAK,eAAe,OACtB,MAAK,cAAc,SAAS,MAC1B,MAAM,KAAK,8BAA8B,EAAE,KAAK,IAAI,CACrD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.mjs";
|
|
2
|
+
import { WatchOptions, Watcher, WatcherAdapter } from "../ports/watcher.mjs";
|
|
3
|
+
import { LoggerAdapter } from "../ports/logger.mjs";
|
|
4
|
+
import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
5
|
+
|
|
6
|
+
//#region src/services/watch.d.ts
|
|
7
|
+
|
|
8
|
+
interface WatchSpecsOptions extends WatchOptions {
|
|
9
|
+
runValidate?: boolean;
|
|
10
|
+
runBuild?: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
}
|
|
13
|
+
type WatchBuildFn = (specPath: string) => Promise<void>;
|
|
14
|
+
type WatchValidateFn = (specPath: string) => Promise<void>;
|
|
15
|
+
declare function watchSpecs(adapters: {
|
|
16
|
+
watcher: WatcherAdapter;
|
|
17
|
+
fs: FsAdapter;
|
|
18
|
+
logger: LoggerAdapter;
|
|
19
|
+
}, config: WorkspaceConfig, options: WatchSpecsOptions, overrides?: {
|
|
20
|
+
validate?: WatchValidateFn;
|
|
21
|
+
build?: WatchBuildFn;
|
|
22
|
+
}): Watcher;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { WatchBuildFn, WatchSpecsOptions, WatchValidateFn, watchSpecs };
|
|
25
|
+
//# sourceMappingURL=watch.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.mts","names":[],"sources":["../../src/services/watch.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsBgB,UATC,iBAAA,SAA0B,YASjB,CAAA;EACH,WAAA,CAAA,EAAA,OAAA;EAAoB,QAAA,CAAA,EAAA,OAAA;EAAmB,MAAA,CAAA,EAAA,OAAA;;AAEnD,KANC,YAAA,GAMD,CAAA,QAAA,EAAA,MAAA,EAAA,GANsC,OAMtC,CAAA,IAAA,CAAA;AAEI,KAPH,eAAA,GAOG,CAAA,QAAA,EAAA,MAAA,EAAA,GAPqC,OAOrC,CAAA,IAAA,CAAA;AACH,iBANI,UAAA,CAMJ,QAAA,EAAA;EAET,OAAA,EAPoB,cAOpB;EAAO,EAAA,EAPiC,SAOjC;UAPoD;WACpD,0BACC;aAEI;UACH;IAET"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { validateSpec } from "./validate/spec-validator.mjs";
|
|
2
|
+
import "./validate/index.mjs";
|
|
3
|
+
import { buildSpec } from "./build.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/services/watch.ts
|
|
6
|
+
function watchSpecs(adapters, config, options, overrides) {
|
|
7
|
+
const { watcher, fs, logger } = adapters;
|
|
8
|
+
const w = watcher.watch(options);
|
|
9
|
+
const validateFn = overrides?.validate ?? (async (specPath) => {
|
|
10
|
+
await validateSpec(specPath, {
|
|
11
|
+
fs,
|
|
12
|
+
logger
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
const buildFn = overrides?.build ?? (async (specPath) => {
|
|
16
|
+
await buildSpec(specPath, {
|
|
17
|
+
fs,
|
|
18
|
+
logger
|
|
19
|
+
}, config);
|
|
20
|
+
});
|
|
21
|
+
w.on(async (event) => {
|
|
22
|
+
if (event.type !== "change") return;
|
|
23
|
+
logger.info("watchSpecs.changed", { path: event.path });
|
|
24
|
+
if (options.runValidate) await validateFn(event.path);
|
|
25
|
+
if (options.runBuild) if (options.dryRun) logger.info("[dry-run] watchSpecs skipped build", { path: event.path });
|
|
26
|
+
else await buildFn(event.path);
|
|
27
|
+
});
|
|
28
|
+
return w;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { watchSpecs };
|
|
33
|
+
//# sourceMappingURL=watch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.mjs","names":[],"sources":["../../src/services/watch.ts"],"sourcesContent":["/**\n * Watch service.\n *\n * Provides a reusable watcher that can trigger validate/build on spec changes.\n */\n\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport type { LoggerAdapter } from '../ports/logger';\nimport type { Watcher, WatcherAdapter, WatchOptions } from '../ports/watcher';\nimport type { FsAdapter } from '../ports/fs';\nimport { buildSpec } from './build';\nimport { validateSpec } from './validate';\n\nexport interface WatchSpecsOptions extends WatchOptions {\n runValidate?: boolean;\n runBuild?: boolean;\n dryRun?: boolean;\n}\n\nexport type WatchBuildFn = (specPath: string) => Promise<void>;\nexport type WatchValidateFn = (specPath: string) => Promise<void>;\n\nexport function watchSpecs(\n adapters: { watcher: WatcherAdapter; fs: FsAdapter; logger: LoggerAdapter },\n config: WorkspaceConfig,\n options: WatchSpecsOptions,\n overrides?: {\n validate?: WatchValidateFn;\n build?: WatchBuildFn;\n }\n): Watcher {\n const { watcher, fs, logger } = adapters;\n const w = watcher.watch(options);\n\n const validateFn: WatchValidateFn =\n overrides?.validate ??\n (async (specPath) => {\n await validateSpec(specPath, { fs, logger });\n });\n\n const buildFn: WatchBuildFn =\n overrides?.build ??\n (async (specPath) => {\n await buildSpec(specPath, { fs, logger }, config);\n });\n\n w.on(async (event) => {\n if (event.type !== 'change') return;\n\n logger.info('watchSpecs.changed', { path: event.path });\n\n if (options.runValidate) {\n await validateFn(event.path);\n }\n\n if (options.runBuild) {\n if (options.dryRun) {\n logger.info('[dry-run] watchSpecs skipped build', { path: event.path });\n } else {\n await buildFn(event.path);\n }\n }\n });\n\n return w;\n}\n"],"mappings":";;;;;AAsBA,SAAgB,WACd,UACA,QACA,SACA,WAIS;CACT,MAAM,EAAE,SAAS,IAAI,WAAW;CAChC,MAAM,IAAI,QAAQ,MAAM,QAAQ;CAEhC,MAAM,aACJ,WAAW,aACV,OAAO,aAAa;AACnB,QAAM,aAAa,UAAU;GAAE;GAAI;GAAQ,CAAC;;CAGhD,MAAM,UACJ,WAAW,UACV,OAAO,aAAa;AACnB,QAAM,UAAU,UAAU;GAAE;GAAI;GAAQ,EAAE,OAAO;;AAGrD,GAAE,GAAG,OAAO,UAAU;AACpB,MAAI,MAAM,SAAS,SAAU;AAE7B,SAAO,KAAK,sBAAsB,EAAE,MAAM,MAAM,MAAM,CAAC;AAEvD,MAAI,QAAQ,YACV,OAAM,WAAW,MAAM,KAAK;AAG9B,MAAI,QAAQ,SACV,KAAI,QAAQ,OACV,QAAO,KAAK,sCAAsC,EAAE,MAAM,MAAM,MAAM,CAAC;MAEvE,OAAM,QAAQ,MAAM,KAAK;GAG7B;AAEF,QAAO"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { FsAdapter } from "../ports/fs.mjs";
|
|
2
|
+
import { PackageManager, WorkspaceInfo, detectPackageManager, findPackageRoot, findWorkspaceRoot, getWorkspaceInfo } from "../adapters/workspace.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/workspace-info.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Monorepo configuration options.
|
|
8
|
+
*/
|
|
9
|
+
interface MonorepoConfig {
|
|
10
|
+
/**
|
|
11
|
+
* Package patterns to include (glob).
|
|
12
|
+
*/
|
|
13
|
+
packages?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Package patterns to exclude (glob).
|
|
16
|
+
*/
|
|
17
|
+
excludePackages?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Whether to search recursively in all packages.
|
|
20
|
+
*/
|
|
21
|
+
recursive?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extended workspace info with configuration.
|
|
25
|
+
*/
|
|
26
|
+
interface ExtendedWorkspaceInfo extends WorkspaceInfo {
|
|
27
|
+
/**
|
|
28
|
+
* Monorepo-specific configuration.
|
|
29
|
+
*/
|
|
30
|
+
monorepoConfig?: MonorepoConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Path to workspace .contractsrc.json (if exists).
|
|
33
|
+
*/
|
|
34
|
+
workspaceConfigPath?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Path to package .contractsrc.json (if exists).
|
|
37
|
+
*/
|
|
38
|
+
packageConfigPath?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get extended workspace information including config paths.
|
|
42
|
+
*/
|
|
43
|
+
declare function getExtendedWorkspaceInfo(fs: FsAdapter, startDir?: string): Promise<ExtendedWorkspaceInfo>;
|
|
44
|
+
/**
|
|
45
|
+
* Find all .contractsrc.json files in a monorepo.
|
|
46
|
+
*
|
|
47
|
+
* Returns paths in order of priority (workspace first, then packages).
|
|
48
|
+
*/
|
|
49
|
+
declare function findAllConfigFiles(fs: FsAdapter, workspaceRoot: string): Promise<string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Merge workspace and package configurations.
|
|
52
|
+
*
|
|
53
|
+
* Package config overrides workspace config.
|
|
54
|
+
*/
|
|
55
|
+
declare function mergeMonorepoConfigs(fs: FsAdapter, workspaceConfigPath: string | undefined, packageConfigPath: string | undefined): Promise<Record<string, unknown>>;
|
|
56
|
+
/**
|
|
57
|
+
* Format workspace info for display.
|
|
58
|
+
*/
|
|
59
|
+
declare function formatWorkspaceInfo(info: ExtendedWorkspaceInfo): string;
|
|
60
|
+
//#endregion
|
|
61
|
+
export { ExtendedWorkspaceInfo, MonorepoConfig, findAllConfigFiles, formatWorkspaceInfo, getExtendedWorkspaceInfo, mergeMonorepoConfigs };
|
|
62
|
+
//# sourceMappingURL=workspace-info.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-info.d.mts","names":[],"sources":["../../src/services/workspace-info.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA+GsB,UA3FL,cAAA,CA2FuB;EAgClB;;;EAInB,QAAA,CAAA,EAAA,MAAA,EAAA;EAAO;AAiEV;;;;;;;;;;;UA5KiB,qBAAA,SAA8B;;;;mBAI5B;;;;;;;;;;;;;iBAgBG,wBAAA,KAChB,+BAEH,QAAQ;;;;;;iBAgDW,kBAAA,KAChB,mCAEH;;;;;;iBA6BmB,oBAAA,KAChB,4FAGH,QAAQ;;;;iBAiEK,mBAAA,OAA0B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { detectPackageManager, findPackageRoot, findWorkspaceRoot, getWorkspaceInfo } from "../adapters/workspace.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/workspace-info.ts
|
|
4
|
+
/**
|
|
5
|
+
* Workspace info service.
|
|
6
|
+
*
|
|
7
|
+
* Provides workspace detection and configuration loading
|
|
8
|
+
* with support for monorepos.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get extended workspace information including config paths.
|
|
12
|
+
*/
|
|
13
|
+
async function getExtendedWorkspaceInfo(fs, startDir) {
|
|
14
|
+
const baseInfo = getWorkspaceInfo(startDir);
|
|
15
|
+
const workspaceConfigPath = fs.join(baseInfo.workspaceRoot, ".contractsrc.json");
|
|
16
|
+
const packageConfigPath = fs.join(baseInfo.packageRoot, ".contractsrc.json");
|
|
17
|
+
const hasWorkspaceConfig = await fs.exists(workspaceConfigPath);
|
|
18
|
+
const hasPackageConfig = baseInfo.workspaceRoot !== baseInfo.packageRoot ? await fs.exists(packageConfigPath) : false;
|
|
19
|
+
let monorepoConfig;
|
|
20
|
+
if (hasWorkspaceConfig) try {
|
|
21
|
+
const content = await fs.readFile(workspaceConfigPath);
|
|
22
|
+
const config = JSON.parse(content);
|
|
23
|
+
if (config.packages || config.excludePackages || config.recursive) monorepoConfig = {
|
|
24
|
+
packages: config.packages,
|
|
25
|
+
excludePackages: config.excludePackages,
|
|
26
|
+
recursive: config.recursive
|
|
27
|
+
};
|
|
28
|
+
} catch {}
|
|
29
|
+
return {
|
|
30
|
+
...baseInfo,
|
|
31
|
+
monorepoConfig,
|
|
32
|
+
workspaceConfigPath: hasWorkspaceConfig ? workspaceConfigPath : void 0,
|
|
33
|
+
packageConfigPath: hasPackageConfig ? packageConfigPath : void 0
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Find all .contractsrc.json files in a monorepo.
|
|
38
|
+
*
|
|
39
|
+
* Returns paths in order of priority (workspace first, then packages).
|
|
40
|
+
*/
|
|
41
|
+
async function findAllConfigFiles(fs, workspaceRoot) {
|
|
42
|
+
const configFiles = [];
|
|
43
|
+
const rootConfig = fs.join(workspaceRoot, ".contractsrc.json");
|
|
44
|
+
if (await fs.exists(rootConfig)) configFiles.push(rootConfig);
|
|
45
|
+
const packageConfigs = await fs.glob({
|
|
46
|
+
pattern: "**/.contractsrc.json",
|
|
47
|
+
ignore: ["node_modules/**", ".git/**"]
|
|
48
|
+
});
|
|
49
|
+
for (const config of packageConfigs) if (config !== rootConfig) configFiles.push(config);
|
|
50
|
+
return configFiles;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Merge workspace and package configurations.
|
|
54
|
+
*
|
|
55
|
+
* Package config overrides workspace config.
|
|
56
|
+
*/
|
|
57
|
+
async function mergeMonorepoConfigs(fs, workspaceConfigPath, packageConfigPath) {
|
|
58
|
+
let merged = {};
|
|
59
|
+
if (workspaceConfigPath && await fs.exists(workspaceConfigPath)) try {
|
|
60
|
+
const content = await fs.readFile(workspaceConfigPath);
|
|
61
|
+
merged = JSON.parse(content);
|
|
62
|
+
} catch {}
|
|
63
|
+
if (packageConfigPath && await fs.exists(packageConfigPath)) try {
|
|
64
|
+
const content = await fs.readFile(packageConfigPath);
|
|
65
|
+
const packageConfig = JSON.parse(content);
|
|
66
|
+
merged = deepMerge(merged, packageConfig);
|
|
67
|
+
} catch {}
|
|
68
|
+
return merged;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Deep merge two objects.
|
|
72
|
+
*/
|
|
73
|
+
function deepMerge(base, override) {
|
|
74
|
+
const result = { ...base };
|
|
75
|
+
for (const key of Object.keys(override)) {
|
|
76
|
+
const baseValue = base[key];
|
|
77
|
+
const overrideValue = override[key];
|
|
78
|
+
if (typeof baseValue === "object" && baseValue !== null && !Array.isArray(baseValue) && typeof overrideValue === "object" && overrideValue !== null && !Array.isArray(overrideValue)) result[key] = deepMerge(baseValue, overrideValue);
|
|
79
|
+
else result[key] = overrideValue;
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format workspace info for display.
|
|
85
|
+
*/
|
|
86
|
+
function formatWorkspaceInfo(info) {
|
|
87
|
+
const lines = [];
|
|
88
|
+
lines.push(`Package Manager: ${info.packageManager}`);
|
|
89
|
+
lines.push(`Workspace Root: ${info.workspaceRoot}`);
|
|
90
|
+
if (info.isMonorepo) {
|
|
91
|
+
lines.push(`Monorepo: Yes`);
|
|
92
|
+
lines.push(`Package Root: ${info.packageRoot}`);
|
|
93
|
+
if (info.packageName) lines.push(`Current Package: ${info.packageName}`);
|
|
94
|
+
if (info.packages && info.packages.length > 0) lines.push(`Package Patterns: ${info.packages.join(", ")}`);
|
|
95
|
+
} else lines.push(`Monorepo: No`);
|
|
96
|
+
if (info.workspaceConfigPath) lines.push(`Workspace Config: ${info.workspaceConfigPath}`);
|
|
97
|
+
if (info.packageConfigPath) lines.push(`Package Config: ${info.packageConfigPath}`);
|
|
98
|
+
return lines.join("\n");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//#endregion
|
|
102
|
+
export { findAllConfigFiles, formatWorkspaceInfo, getExtendedWorkspaceInfo, mergeMonorepoConfigs };
|
|
103
|
+
//# sourceMappingURL=workspace-info.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-info.mjs","names":[],"sources":["../../src/services/workspace-info.ts"],"sourcesContent":["/**\n * Workspace info service.\n *\n * Provides workspace detection and configuration loading\n * with support for monorepos.\n */\n\nimport {\n getWorkspaceInfo,\n findWorkspaceRoot,\n findPackageRoot,\n detectPackageManager,\n type WorkspaceInfo,\n type PackageManager,\n} from '../adapters/workspace';\nimport type { FsAdapter } from '../ports/fs';\n\n/**\n * Monorepo configuration options.\n */\nexport interface MonorepoConfig {\n /**\n * Package patterns to include (glob).\n */\n packages?: string[];\n\n /**\n * Package patterns to exclude (glob).\n */\n excludePackages?: string[];\n\n /**\n * Whether to search recursively in all packages.\n */\n recursive?: boolean;\n}\n\n/**\n * Extended workspace info with configuration.\n */\nexport interface ExtendedWorkspaceInfo extends WorkspaceInfo {\n /**\n * Monorepo-specific configuration.\n */\n monorepoConfig?: MonorepoConfig;\n\n /**\n * Path to workspace .contractsrc.json (if exists).\n */\n workspaceConfigPath?: string;\n\n /**\n * Path to package .contractsrc.json (if exists).\n */\n packageConfigPath?: string;\n}\n\n/**\n * Get extended workspace information including config paths.\n */\nexport async function getExtendedWorkspaceInfo(\n fs: FsAdapter,\n startDir?: string\n): Promise<ExtendedWorkspaceInfo> {\n const baseInfo = getWorkspaceInfo(startDir);\n\n // Check for config files\n const workspaceConfigPath = fs.join(\n baseInfo.workspaceRoot,\n '.contractsrc.json'\n );\n const packageConfigPath = fs.join(baseInfo.packageRoot, '.contractsrc.json');\n\n const hasWorkspaceConfig = await fs.exists(workspaceConfigPath);\n const hasPackageConfig =\n baseInfo.workspaceRoot !== baseInfo.packageRoot\n ? await fs.exists(packageConfigPath)\n : false;\n\n // Load monorepo config from workspace config if exists\n let monorepoConfig: MonorepoConfig | undefined;\n\n if (hasWorkspaceConfig) {\n try {\n const content = await fs.readFile(workspaceConfigPath);\n const config = JSON.parse(content);\n if (config.packages || config.excludePackages || config.recursive) {\n monorepoConfig = {\n packages: config.packages,\n excludePackages: config.excludePackages,\n recursive: config.recursive,\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return {\n ...baseInfo,\n monorepoConfig,\n workspaceConfigPath: hasWorkspaceConfig ? workspaceConfigPath : undefined,\n packageConfigPath: hasPackageConfig ? packageConfigPath : undefined,\n };\n}\n\n/**\n * Find all .contractsrc.json files in a monorepo.\n *\n * Returns paths in order of priority (workspace first, then packages).\n */\nexport async function findAllConfigFiles(\n fs: FsAdapter,\n workspaceRoot: string\n): Promise<string[]> {\n const configFiles: string[] = [];\n\n // Workspace root config (highest priority for defaults)\n const rootConfig = fs.join(workspaceRoot, '.contractsrc.json');\n if (await fs.exists(rootConfig)) {\n configFiles.push(rootConfig);\n }\n\n // Find configs in packages\n const packageConfigs = await fs.glob({\n pattern: '**/.contractsrc.json',\n ignore: ['node_modules/**', '.git/**'],\n });\n\n for (const config of packageConfigs) {\n if (config !== rootConfig) {\n configFiles.push(config);\n }\n }\n\n return configFiles;\n}\n\n/**\n * Merge workspace and package configurations.\n *\n * Package config overrides workspace config.\n */\nexport async function mergeMonorepoConfigs(\n fs: FsAdapter,\n workspaceConfigPath: string | undefined,\n packageConfigPath: string | undefined\n): Promise<Record<string, unknown>> {\n let merged: Record<string, unknown> = {};\n\n // Load workspace config as base\n if (workspaceConfigPath && (await fs.exists(workspaceConfigPath))) {\n try {\n const content = await fs.readFile(workspaceConfigPath);\n merged = JSON.parse(content);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Overlay package config\n if (packageConfigPath && (await fs.exists(packageConfigPath))) {\n try {\n const content = await fs.readFile(packageConfigPath);\n const packageConfig = JSON.parse(content);\n\n // Deep merge (package overrides workspace)\n merged = deepMerge(merged, packageConfig);\n } catch {\n // Ignore parse errors\n }\n }\n\n return merged;\n}\n\n/**\n * Deep merge two objects.\n */\nfunction deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...base };\n\n for (const key of Object.keys(override)) {\n const baseValue = base[key];\n const overrideValue = override[key];\n\n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n !Array.isArray(baseValue) &&\n typeof overrideValue === 'object' &&\n overrideValue !== null &&\n !Array.isArray(overrideValue)\n ) {\n result[key] = deepMerge(\n baseValue as Record<string, unknown>,\n overrideValue as Record<string, unknown>\n );\n } else {\n result[key] = overrideValue;\n }\n }\n\n return result;\n}\n\n/**\n * Format workspace info for display.\n */\nexport function formatWorkspaceInfo(info: ExtendedWorkspaceInfo): string {\n const lines: string[] = [];\n\n lines.push(`Package Manager: ${info.packageManager}`);\n lines.push(`Workspace Root: ${info.workspaceRoot}`);\n\n if (info.isMonorepo) {\n lines.push(`Monorepo: Yes`);\n lines.push(`Package Root: ${info.packageRoot}`);\n\n if (info.packageName) {\n lines.push(`Current Package: ${info.packageName}`);\n }\n\n if (info.packages && info.packages.length > 0) {\n lines.push(`Package Patterns: ${info.packages.join(', ')}`);\n }\n } else {\n lines.push(`Monorepo: No`);\n }\n\n if (info.workspaceConfigPath) {\n lines.push(`Workspace Config: ${info.workspaceConfigPath}`);\n }\n\n if (info.packageConfigPath) {\n lines.push(`Package Config: ${info.packageConfigPath}`);\n }\n\n return lines.join('\\n');\n}\n\n// Re-export types and utilities\nexport {\n getWorkspaceInfo,\n findWorkspaceRoot,\n findPackageRoot,\n detectPackageManager,\n type WorkspaceInfo,\n type PackageManager,\n};\n"],"mappings":";;;;;;;;;;;;AA4DA,eAAsB,yBACpB,IACA,UACgC;CAChC,MAAM,WAAW,iBAAiB,SAAS;CAG3C,MAAM,sBAAsB,GAAG,KAC7B,SAAS,eACT,oBACD;CACD,MAAM,oBAAoB,GAAG,KAAK,SAAS,aAAa,oBAAoB;CAE5E,MAAM,qBAAqB,MAAM,GAAG,OAAO,oBAAoB;CAC/D,MAAM,mBACJ,SAAS,kBAAkB,SAAS,cAChC,MAAM,GAAG,OAAO,kBAAkB,GAClC;CAGN,IAAI;AAEJ,KAAI,mBACF,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,oBAAoB;EACtD,MAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,MAAI,OAAO,YAAY,OAAO,mBAAmB,OAAO,UACtD,kBAAiB;GACf,UAAU,OAAO;GACjB,iBAAiB,OAAO;GACxB,WAAW,OAAO;GACnB;SAEG;AAKV,QAAO;EACL,GAAG;EACH;EACA,qBAAqB,qBAAqB,sBAAsB;EAChE,mBAAmB,mBAAmB,oBAAoB;EAC3D;;;;;;;AAQH,eAAsB,mBACpB,IACA,eACmB;CACnB,MAAM,cAAwB,EAAE;CAGhC,MAAM,aAAa,GAAG,KAAK,eAAe,oBAAoB;AAC9D,KAAI,MAAM,GAAG,OAAO,WAAW,CAC7B,aAAY,KAAK,WAAW;CAI9B,MAAM,iBAAiB,MAAM,GAAG,KAAK;EACnC,SAAS;EACT,QAAQ,CAAC,mBAAmB,UAAU;EACvC,CAAC;AAEF,MAAK,MAAM,UAAU,eACnB,KAAI,WAAW,WACb,aAAY,KAAK,OAAO;AAI5B,QAAO;;;;;;;AAQT,eAAsB,qBACpB,IACA,qBACA,mBACkC;CAClC,IAAI,SAAkC,EAAE;AAGxC,KAAI,uBAAwB,MAAM,GAAG,OAAO,oBAAoB,CAC9D,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,oBAAoB;AACtD,WAAS,KAAK,MAAM,QAAQ;SACtB;AAMV,KAAI,qBAAsB,MAAM,GAAG,OAAO,kBAAkB,CAC1D,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,kBAAkB;EACpD,MAAM,gBAAgB,KAAK,MAAM,QAAQ;AAGzC,WAAS,UAAU,QAAQ,cAAc;SACnC;AAKV,QAAO;;;;;AAMT,SAAS,UACP,MACA,UACyB;CACzB,MAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,MAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;EACvC,MAAM,YAAY,KAAK;EACvB,MAAM,gBAAgB,SAAS;AAE/B,MACE,OAAO,cAAc,YACrB,cAAc,QACd,CAAC,MAAM,QAAQ,UAAU,IACzB,OAAO,kBAAkB,YACzB,kBAAkB,QAClB,CAAC,MAAM,QAAQ,cAAc,CAE7B,QAAO,OAAO,UACZ,WACA,cACD;MAED,QAAO,OAAO;;AAIlB,QAAO;;;;;AAMT,SAAgB,oBAAoB,MAAqC;CACvE,MAAM,QAAkB,EAAE;AAE1B,OAAM,KAAK,oBAAoB,KAAK,iBAAiB;AACrD,OAAM,KAAK,mBAAmB,KAAK,gBAAgB;AAEnD,KAAI,KAAK,YAAY;AACnB,QAAM,KAAK,gBAAgB;AAC3B,QAAM,KAAK,iBAAiB,KAAK,cAAc;AAE/C,MAAI,KAAK,YACP,OAAM,KAAK,oBAAoB,KAAK,cAAc;AAGpD,MAAI,KAAK,YAAY,KAAK,SAAS,SAAS,EAC1C,OAAM,KAAK,qBAAqB,KAAK,SAAS,KAAK,KAAK,GAAG;OAG7D,OAAM,KAAK,eAAe;AAG5B,KAAI,KAAK,oBACP,OAAM,KAAK,qBAAqB,KAAK,sBAAsB;AAG7D,KAAI,KAAK,kBACP,OAAM,KAAK,mBAAmB,KAAK,oBAAoB;AAGzD,QAAO,MAAM,KAAK,KAAK"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AppBlueprintSpecData } from "../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/templates/app-config.template.d.ts
|
|
4
|
+
declare function generateAppBlueprintSpec(data: AppBlueprintSpecData): string;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { generateAppBlueprintSpec };
|
|
7
|
+
//# sourceMappingURL=app-config.template.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.template.d.mts","names":[],"sources":["../../src/templates/app-config.template.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,wBAAA,OAA+B"}
|