@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,169 @@
|
|
|
1
|
+
import { analyzeIntegrity } from "../integrity.mjs";
|
|
2
|
+
import { removeReferenceStrategy } from "./strategies/remove-reference.mjs";
|
|
3
|
+
import { implementSkeletonStrategy } from "./strategies/implement-skeleton.mjs";
|
|
4
|
+
import { implementAiStrategy } from "./strategies/implement-ai.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/services/fix/fix-service.ts
|
|
7
|
+
/**
|
|
8
|
+
* Service for fixing integrity issues.
|
|
9
|
+
*/
|
|
10
|
+
var FixService = class {
|
|
11
|
+
strategies;
|
|
12
|
+
constructor(adapters) {
|
|
13
|
+
this.adapters = adapters;
|
|
14
|
+
this.strategies = /* @__PURE__ */ new Map();
|
|
15
|
+
this.registerStrategy({
|
|
16
|
+
type: "remove-reference",
|
|
17
|
+
fix: (issue, opts) => removeReferenceStrategy(issue, opts, { fs: this.adapters.fs })
|
|
18
|
+
});
|
|
19
|
+
this.registerStrategy({
|
|
20
|
+
type: "implement-skeleton",
|
|
21
|
+
fix: (issue, opts) => implementSkeletonStrategy(issue, opts, { fs: this.adapters.fs })
|
|
22
|
+
});
|
|
23
|
+
this.registerStrategy({
|
|
24
|
+
type: "implement-ai",
|
|
25
|
+
fix: (issue, opts) => implementAiStrategy(issue, opts, this.adapters)
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Register a fix strategy.
|
|
30
|
+
*/
|
|
31
|
+
registerStrategy(strategy) {
|
|
32
|
+
this.strategies.set(strategy.type, strategy);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get available strategies for an issue.
|
|
36
|
+
*/
|
|
37
|
+
getStrategiesForIssue(issue) {
|
|
38
|
+
const strategies = [];
|
|
39
|
+
if (issue.type === "unresolved-ref") {
|
|
40
|
+
strategies.push("remove-reference");
|
|
41
|
+
strategies.push("implement-skeleton");
|
|
42
|
+
strategies.push("implement-ai");
|
|
43
|
+
} else if (issue.type === "broken-link") {
|
|
44
|
+
strategies.push("remove-reference");
|
|
45
|
+
strategies.push("implement-skeleton");
|
|
46
|
+
}
|
|
47
|
+
return strategies;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse CI issue into a fixable issue context.
|
|
51
|
+
*/
|
|
52
|
+
parseFixableIssue(issue) {
|
|
53
|
+
if (!issue.ref || !issue.featureKey || !issue.specType) return;
|
|
54
|
+
return {
|
|
55
|
+
issue,
|
|
56
|
+
ref: issue.ref,
|
|
57
|
+
specType: issue.specType,
|
|
58
|
+
featureFile: issue.file,
|
|
59
|
+
featureKey: issue.featureKey
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Fix a single issue.
|
|
64
|
+
*/
|
|
65
|
+
async fixIssue(issue, options) {
|
|
66
|
+
const strategy = this.strategies.get(options.strategy);
|
|
67
|
+
if (!strategy) return {
|
|
68
|
+
success: false,
|
|
69
|
+
strategy: options.strategy,
|
|
70
|
+
issue,
|
|
71
|
+
filesChanged: [],
|
|
72
|
+
error: `Strategy ${options.strategy} not found`
|
|
73
|
+
};
|
|
74
|
+
this.adapters.logger.info(`Applying fix ${options.strategy} for ${issue.ref.key}`, { dryRun: options.dryRun });
|
|
75
|
+
return strategy.fix(issue, options);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Batch fix multiple issues.
|
|
79
|
+
*/
|
|
80
|
+
async batchFix(request) {
|
|
81
|
+
const results = [];
|
|
82
|
+
let succeeded = 0;
|
|
83
|
+
let failed = 0;
|
|
84
|
+
for (const issue of request.issues) try {
|
|
85
|
+
const result = await this.fixIssue(issue, request.options);
|
|
86
|
+
results.push(result);
|
|
87
|
+
if (result.success) succeeded++;
|
|
88
|
+
else failed++;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
failed++;
|
|
91
|
+
results.push({
|
|
92
|
+
success: false,
|
|
93
|
+
strategy: request.options.strategy,
|
|
94
|
+
issue,
|
|
95
|
+
filesChanged: [],
|
|
96
|
+
error: error instanceof Error ? error.message : String(error)
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
total: request.issues.length,
|
|
101
|
+
succeeded,
|
|
102
|
+
failed,
|
|
103
|
+
results
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Scan for integrity issues and return fixable ones.
|
|
108
|
+
*/
|
|
109
|
+
async scanAndGetFixables(options = {}) {
|
|
110
|
+
return (await analyzeIntegrity(this.adapters, {
|
|
111
|
+
pattern: options.pattern,
|
|
112
|
+
cwd: options.cwd
|
|
113
|
+
})).issues.map((issue) => this.getToFix(issue)).filter((item) => item !== null);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert an integrity issue into a FixableIssue with strategies.
|
|
117
|
+
*/
|
|
118
|
+
getToFix(issue) {
|
|
119
|
+
const strategies = this.getStrategiesForIssue(issue);
|
|
120
|
+
if (strategies.length === 0) return null;
|
|
121
|
+
const fixable = this.parseFixableIssue(issue);
|
|
122
|
+
if (!fixable) return null;
|
|
123
|
+
return {
|
|
124
|
+
...fixable,
|
|
125
|
+
availableStrategies: strategies,
|
|
126
|
+
strategies: []
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Determine the best strategy for an issue.
|
|
131
|
+
*
|
|
132
|
+
* Logic moved from CLI to be shared.
|
|
133
|
+
*/
|
|
134
|
+
resolveStrategy(issue, options) {
|
|
135
|
+
const { forceStrategy, preferAi, select } = options;
|
|
136
|
+
if (forceStrategy) return Promise.resolve(forceStrategy);
|
|
137
|
+
if (preferAi && issue.availableStrategies.includes("implement-ai")) return Promise.resolve("implement-ai");
|
|
138
|
+
if (issue.availableStrategies.length === 1) return Promise.resolve(issue.availableStrategies[0]);
|
|
139
|
+
if (issue.availableStrategies.length > 1) {
|
|
140
|
+
if (typeof select === "function") return select(issue, issue.availableStrategies);
|
|
141
|
+
return Promise.resolve(issue.availableStrategies[0]);
|
|
142
|
+
}
|
|
143
|
+
return Promise.resolve(void 0);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Determine scan options based on input target.
|
|
147
|
+
*/
|
|
148
|
+
async determineScanOptions(target) {
|
|
149
|
+
try {
|
|
150
|
+
if ((await this.adapters.fs.stat(target)).isDirectory) return { cwd: target };
|
|
151
|
+
else return { pattern: target };
|
|
152
|
+
} catch {
|
|
153
|
+
return { pattern: target };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Parse CI output JSON into FixableIssues.
|
|
158
|
+
*/
|
|
159
|
+
parseIssuesFromCIResult(ciIssues) {
|
|
160
|
+
if (!Array.isArray(ciIssues)) return [];
|
|
161
|
+
return ciIssues.map((issue) => {
|
|
162
|
+
return this.getToFix(issue);
|
|
163
|
+
}).filter((item) => item !== null);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
//#endregion
|
|
168
|
+
export { FixService };
|
|
169
|
+
//# sourceMappingURL=fix-service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-service.mjs","names":[],"sources":["../../../src/services/fix/fix-service.ts"],"sourcesContent":["/**\n * Fix Service.\n *\n * Orchestrates the application of fixes for integrity issues.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type { IntegrityIssue } from '../integrity';\nimport {\n type BatchFixRequest,\n type BatchFixResult,\n type FixableIssue,\n type FixResult,\n type FixStrategy,\n type FixStrategyType,\n type FixOptions,\n} from './types';\nimport {\n removeReferenceStrategy,\n implementSkeletonStrategy,\n implementAiStrategy,\n} from './strategies';\nimport { analyzeIntegrity } from '../integrity';\n\n/**\n * Service for fixing integrity issues.\n */\nexport class FixService {\n private strategies: Map<FixStrategyType, FixStrategy>;\n\n constructor(\n private readonly adapters: { fs: FsAdapter; logger: LoggerAdapter }\n ) {\n this.strategies = new Map();\n this.registerStrategy({\n type: 'remove-reference',\n fix: (issue, opts) =>\n removeReferenceStrategy(issue, opts, { fs: this.adapters.fs }),\n });\n this.registerStrategy({\n type: 'implement-skeleton',\n fix: (issue, opts) =>\n implementSkeletonStrategy(issue, opts, { fs: this.adapters.fs }),\n });\n this.registerStrategy({\n type: 'implement-ai',\n fix: (issue, opts) => implementAiStrategy(issue, opts, this.adapters),\n });\n }\n\n /**\n * Register a fix strategy.\n */\n private registerStrategy(strategy: FixStrategy): void {\n this.strategies.set(strategy.type, strategy);\n }\n\n /**\n * Get available strategies for an issue.\n */\n getStrategiesForIssue(issue: IntegrityIssue): FixStrategyType[] {\n const strategies: FixStrategyType[] = [];\n\n if (issue.type === 'unresolved-ref') {\n strategies.push('remove-reference');\n strategies.push('implement-skeleton');\n strategies.push('implement-ai');\n } else if (issue.type === 'broken-link') {\n // Can usually only remove the link or implement the missng target\n strategies.push('remove-reference'); // Assuming generic removal works for links too\n strategies.push('implement-skeleton');\n }\n\n return strategies;\n }\n\n /**\n * Parse CI issue into a fixable issue context.\n */\n parseFixableIssue(\n issue: IntegrityIssue\n ): Omit<FixableIssue, 'availableStrategies' | 'strategies'> | undefined {\n if (!issue.ref || !issue.featureKey || !issue.specType) {\n return undefined;\n }\n\n return {\n issue,\n ref: issue.ref,\n specType: issue.specType,\n featureFile: issue.file,\n featureKey: issue.featureKey,\n };\n }\n\n /**\n * Fix a single issue.\n */\n async fixIssue(issue: FixableIssue, options: FixOptions): Promise<FixResult> {\n const strategy = this.strategies.get(options.strategy);\n\n if (!strategy) {\n return {\n success: false,\n strategy: options.strategy,\n issue,\n filesChanged: [],\n error: `Strategy ${options.strategy} not found`,\n };\n }\n\n this.adapters.logger.info(\n `Applying fix ${options.strategy} for ${issue.ref.key}`,\n {\n dryRun: options.dryRun,\n }\n );\n\n return strategy.fix(issue, options);\n }\n\n /**\n * Batch fix multiple issues.\n */\n async batchFix(request: BatchFixRequest): Promise<BatchFixResult> {\n const results: FixResult[] = [];\n let succeeded = 0;\n let failed = 0;\n\n for (const issue of request.issues) {\n try {\n const result = await this.fixIssue(issue, request.options);\n results.push(result);\n if (result.success) {\n succeeded++;\n } else {\n failed++;\n }\n } catch (error) {\n failed++;\n results.push({\n success: false,\n strategy: request.options.strategy,\n issue,\n filesChanged: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return {\n total: request.issues.length,\n succeeded,\n failed,\n results,\n };\n }\n\n /**\n * Scan for integrity issues and return fixable ones.\n */\n async scanAndGetFixables(\n options: { pattern?: string; cwd?: string } = {}\n ): Promise<FixableIssue[]> {\n const scanResult = await analyzeIntegrity(this.adapters, {\n pattern: options.pattern,\n cwd: options.cwd,\n });\n\n return scanResult.issues\n .map((issue) => this.getToFix(issue))\n .filter((item): item is FixableIssue => item !== null);\n }\n\n /**\n * Convert an integrity issue into a FixableIssue with strategies.\n */\n getToFix(issue: IntegrityIssue): FixableIssue | null {\n const strategies = this.getStrategiesForIssue(issue);\n if (strategies.length === 0) {\n return null;\n }\n\n const fixable = this.parseFixableIssue(issue);\n if (!fixable) {\n return null;\n }\n\n return {\n ...fixable,\n availableStrategies: strategies,\n strategies: [], // Strategies are managed by service, not attached to issue object in this implementation\n } as FixableIssue;\n }\n\n /**\n * Determine the best strategy for an issue.\n *\n * Logic moved from CLI to be shared.\n */\n resolveStrategy(\n issue: FixableIssue,\n options: {\n forceStrategy?: FixStrategyType;\n preferAi?: boolean;\n interactive?: boolean;\n // Optional callback for interactive selection if environment supports it\n select?: (\n issue: FixableIssue,\n strategies: FixStrategyType[]\n ) => Promise<FixStrategyType | undefined>;\n }\n ): Promise<FixStrategyType | undefined> {\n const { forceStrategy, preferAi, select } = options;\n\n // 1. Forced strategy\n if (forceStrategy) {\n // Validate it's available? Or trust caller?\n // For now, trust caller or checks downstream\n return Promise.resolve(forceStrategy);\n }\n\n // 2. AI Preference\n if (preferAi && issue.availableStrategies.includes('implement-ai')) {\n return Promise.resolve('implement-ai');\n }\n\n // 3. Single strategy available\n if (issue.availableStrategies.length === 1) {\n return Promise.resolve(issue.availableStrategies[0]);\n }\n\n // 4. Multiple strategies\n if (issue.availableStrategies.length > 1) {\n if (typeof select === 'function') {\n return select(issue, issue.availableStrategies);\n }\n // Default to first if non-interactive or no selector provided\n // Usually the most standard compliant/safest one is first\n return Promise.resolve(issue.availableStrategies[0]);\n }\n\n return Promise.resolve(undefined);\n }\n\n /**\n * Determine scan options based on input target.\n */\n async determineScanOptions(\n target: string\n ): Promise<{ pattern?: string; cwd?: string }> {\n try {\n const stats = await this.adapters.fs.stat(target);\n if (stats.isDirectory) {\n return { cwd: target };\n } else {\n return { pattern: target };\n }\n } catch {\n // Likely a glob pattern or non-existent path (treated as pattern)\n return { pattern: target };\n }\n }\n\n /**\n * Parse CI output JSON into FixableIssues.\n */\n parseIssuesFromCIResult(ciIssues: unknown[]): FixableIssue[] {\n // Check if input is array\n if (!Array.isArray(ciIssues)) return [];\n\n return ciIssues\n .map((issue) => {\n // CI issues might be wrapped or have different shape.\n // Assuming they are serialized IntegrityIssues.\n return this.getToFix(issue as IntegrityIssue);\n })\n .filter((item): item is FixableIssue => item !== null);\n }\n}\n"],"mappings":";;;;;;;;;AA4BA,IAAa,aAAb,MAAwB;CACtB,AAAQ;CAER,YACE,AAAiB,UACjB;EADiB;AAEjB,OAAK,6BAAa,IAAI,KAAK;AAC3B,OAAK,iBAAiB;GACpB,MAAM;GACN,MAAM,OAAO,SACX,wBAAwB,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC;GACjE,CAAC;AACF,OAAK,iBAAiB;GACpB,MAAM;GACN,MAAM,OAAO,SACX,0BAA0B,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC;GACnE,CAAC;AACF,OAAK,iBAAiB;GACpB,MAAM;GACN,MAAM,OAAO,SAAS,oBAAoB,OAAO,MAAM,KAAK,SAAS;GACtE,CAAC;;;;;CAMJ,AAAQ,iBAAiB,UAA6B;AACpD,OAAK,WAAW,IAAI,SAAS,MAAM,SAAS;;;;;CAM9C,sBAAsB,OAA0C;EAC9D,MAAM,aAAgC,EAAE;AAExC,MAAI,MAAM,SAAS,kBAAkB;AACnC,cAAW,KAAK,mBAAmB;AACnC,cAAW,KAAK,qBAAqB;AACrC,cAAW,KAAK,eAAe;aACtB,MAAM,SAAS,eAAe;AAEvC,cAAW,KAAK,mBAAmB;AACnC,cAAW,KAAK,qBAAqB;;AAGvC,SAAO;;;;;CAMT,kBACE,OACsE;AACtE,MAAI,CAAC,MAAM,OAAO,CAAC,MAAM,cAAc,CAAC,MAAM,SAC5C;AAGF,SAAO;GACL;GACA,KAAK,MAAM;GACX,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,YAAY,MAAM;GACnB;;;;;CAMH,MAAM,SAAS,OAAqB,SAAyC;EAC3E,MAAM,WAAW,KAAK,WAAW,IAAI,QAAQ,SAAS;AAEtD,MAAI,CAAC,SACH,QAAO;GACL,SAAS;GACT,UAAU,QAAQ;GAClB;GACA,cAAc,EAAE;GAChB,OAAO,YAAY,QAAQ,SAAS;GACrC;AAGH,OAAK,SAAS,OAAO,KACnB,gBAAgB,QAAQ,SAAS,OAAO,MAAM,IAAI,OAClD,EACE,QAAQ,QAAQ,QACjB,CACF;AAED,SAAO,SAAS,IAAI,OAAO,QAAQ;;;;;CAMrC,MAAM,SAAS,SAAmD;EAChE,MAAM,UAAuB,EAAE;EAC/B,IAAI,YAAY;EAChB,IAAI,SAAS;AAEb,OAAK,MAAM,SAAS,QAAQ,OAC1B,KAAI;GACF,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,QAAQ,QAAQ;AAC1D,WAAQ,KAAK,OAAO;AACpB,OAAI,OAAO,QACT;OAEA;WAEK,OAAO;AACd;AACA,WAAQ,KAAK;IACX,SAAS;IACT,UAAU,QAAQ,QAAQ;IAC1B;IACA,cAAc,EAAE;IAChB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;;AAIN,SAAO;GACL,OAAO,QAAQ,OAAO;GACtB;GACA;GACA;GACD;;;;;CAMH,MAAM,mBACJ,UAA8C,EAAE,EACvB;AAMzB,UALmB,MAAM,iBAAiB,KAAK,UAAU;GACvD,SAAS,QAAQ;GACjB,KAAK,QAAQ;GACd,CAAC,EAEgB,OACf,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC,CACpC,QAAQ,SAA+B,SAAS,KAAK;;;;;CAM1D,SAAS,OAA4C;EACnD,MAAM,aAAa,KAAK,sBAAsB,MAAM;AACpD,MAAI,WAAW,WAAW,EACxB,QAAO;EAGT,MAAM,UAAU,KAAK,kBAAkB,MAAM;AAC7C,MAAI,CAAC,QACH,QAAO;AAGT,SAAO;GACL,GAAG;GACH,qBAAqB;GACrB,YAAY,EAAE;GACf;;;;;;;CAQH,gBACE,OACA,SAUsC;EACtC,MAAM,EAAE,eAAe,UAAU,WAAW;AAG5C,MAAI,cAGF,QAAO,QAAQ,QAAQ,cAAc;AAIvC,MAAI,YAAY,MAAM,oBAAoB,SAAS,eAAe,CAChE,QAAO,QAAQ,QAAQ,eAAe;AAIxC,MAAI,MAAM,oBAAoB,WAAW,EACvC,QAAO,QAAQ,QAAQ,MAAM,oBAAoB,GAAG;AAItD,MAAI,MAAM,oBAAoB,SAAS,GAAG;AACxC,OAAI,OAAO,WAAW,WACpB,QAAO,OAAO,OAAO,MAAM,oBAAoB;AAIjD,UAAO,QAAQ,QAAQ,MAAM,oBAAoB,GAAG;;AAGtD,SAAO,QAAQ,QAAQ,OAAU;;;;;CAMnC,MAAM,qBACJ,QAC6C;AAC7C,MAAI;AAEF,QADc,MAAM,KAAK,SAAS,GAAG,KAAK,OAAO,EACvC,YACR,QAAO,EAAE,KAAK,QAAQ;OAEtB,QAAO,EAAE,SAAS,QAAQ;UAEtB;AAEN,UAAO,EAAE,SAAS,QAAQ;;;;;;CAO9B,wBAAwB,UAAqC;AAE3D,MAAI,CAAC,MAAM,QAAQ,SAAS,CAAE,QAAO,EAAE;AAEvC,SAAO,SACJ,KAAK,UAAU;AAGd,UAAO,KAAK,SAAS,MAAwB;IAC7C,CACD,QAAQ,SAA+B,SAAS,KAAK"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BatchFixRequest, BatchFixResult, CIIssueWithFixLinks, FIX_STRATEGY_LABELS, FIX_STRATEGY_STABILITY, FixAIConfig, FixFileChange, FixLink, FixLinkOptions, FixLinkType, FixOptions, FixResult, FixStrategy, FixStrategyType, FixableIssue, SpecGenerationContext } from "./types.mjs";
|
|
2
|
+
import { FixService } from "./fix-service.mjs";
|
|
3
|
+
import { CiOutput, CiOutputSchema } from "./schemas.mjs";
|
|
4
|
+
import { generateFixLinks } from "./fix-link-formatter.mjs";
|
|
5
|
+
import { removeReferenceStrategy } from "./strategies/remove-reference.mjs";
|
|
6
|
+
import { implementSkeletonStrategy } from "./strategies/implement-skeleton.mjs";
|
|
7
|
+
import { implementAiStrategy } from "./strategies/implement-ai.mjs";
|
|
8
|
+
import "./strategies/index.mjs";
|
|
9
|
+
|
|
10
|
+
//#region src/services/fix/index.d.ts
|
|
11
|
+
declare namespace index_d_exports {
|
|
12
|
+
export { BatchFixRequest, BatchFixResult, CIIssueWithFixLinks, CiOutput, CiOutputSchema, FIX_STRATEGY_LABELS, FIX_STRATEGY_STABILITY, FixAIConfig, FixFileChange, FixLink, FixLinkOptions, FixLinkType, FixOptions, FixResult, FixService, FixStrategy, FixStrategyType, FixableIssue, SpecGenerationContext, generateFixLinks, implementAiStrategy, implementSkeletonStrategy, removeReferenceStrategy };
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { index_d_exports };
|
|
16
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/fix/index.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/rolldown_runtime.mjs";
|
|
2
|
+
import { FIX_STRATEGY_LABELS, FIX_STRATEGY_STABILITY } from "./types.mjs";
|
|
3
|
+
import { removeReferenceStrategy } from "./strategies/remove-reference.mjs";
|
|
4
|
+
import { implementSkeletonStrategy } from "./strategies/implement-skeleton.mjs";
|
|
5
|
+
import { implementAiStrategy } from "./strategies/implement-ai.mjs";
|
|
6
|
+
import { FixService } from "./fix-service.mjs";
|
|
7
|
+
import { CiOutputSchema } from "./schemas.mjs";
|
|
8
|
+
import { generateFixLinks } from "./fix-link-formatter.mjs";
|
|
9
|
+
|
|
10
|
+
//#region src/services/fix/index.ts
|
|
11
|
+
var fix_exports = /* @__PURE__ */ __exportAll({
|
|
12
|
+
CiOutputSchema: () => CiOutputSchema,
|
|
13
|
+
FIX_STRATEGY_LABELS: () => FIX_STRATEGY_LABELS,
|
|
14
|
+
FIX_STRATEGY_STABILITY: () => FIX_STRATEGY_STABILITY,
|
|
15
|
+
FixService: () => FixService,
|
|
16
|
+
generateFixLinks: () => generateFixLinks,
|
|
17
|
+
implementAiStrategy: () => implementAiStrategy,
|
|
18
|
+
implementSkeletonStrategy: () => implementSkeletonStrategy,
|
|
19
|
+
removeReferenceStrategy: () => removeReferenceStrategy
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { fix_exports };
|
|
24
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/fix/index.ts"],"sourcesContent":["/**\n * Fix service exports.\n */\n\nexport * from './types';\nexport * from './fix-service';\nexport * from './schemas';\nexport * from './fix-link-formatter';\nexport * from './strategies';\n"],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
//#region src/services/fix/path-resolver.ts
|
|
4
|
+
/**
|
|
5
|
+
* Fix path resolution utilities.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the output file path for a new spec.
|
|
9
|
+
*
|
|
10
|
+
* Strategies:
|
|
11
|
+
* 1. If outputDir is provided in options, use it.
|
|
12
|
+
* 2. If featureFile is present, try to find the 'src' directory relative to it.
|
|
13
|
+
* 3. Fallback to workspaceRoot/specs/[type]/...
|
|
14
|
+
*/
|
|
15
|
+
function resolveOutputPath(issue, options) {
|
|
16
|
+
if (options.outputDir) return buildPath(options.outputDir, issue.ref.key, issue.specType);
|
|
17
|
+
if (issue.featureFile) {
|
|
18
|
+
const srcDir = findSrcDir(issue.featureFile);
|
|
19
|
+
if (srcDir) return buildPath(srcDir, issue.ref.key, issue.specType);
|
|
20
|
+
}
|
|
21
|
+
return buildPath(path.join(options.workspaceRoot, "specs"), issue.ref.key, issue.specType);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Find the 'src' directory by walking up from the file path.
|
|
25
|
+
*/
|
|
26
|
+
function findSrcDir(filePath) {
|
|
27
|
+
let current = path.dirname(filePath);
|
|
28
|
+
const root = path.parse(filePath).root;
|
|
29
|
+
let iterations = 0;
|
|
30
|
+
while (current !== root && iterations < 50) {
|
|
31
|
+
if (path.basename(current) === "src") return current;
|
|
32
|
+
current = path.dirname(current);
|
|
33
|
+
iterations++;
|
|
34
|
+
}
|
|
35
|
+
current = path.dirname(filePath);
|
|
36
|
+
iterations = 0;
|
|
37
|
+
while (current !== root && iterations < 50) {
|
|
38
|
+
current = path.dirname(current);
|
|
39
|
+
iterations++;
|
|
40
|
+
}
|
|
41
|
+
const srcIndex = filePath.lastIndexOf(`${path.sep}src${path.sep}`);
|
|
42
|
+
if (srcIndex !== -1) return filePath.substring(0, srcIndex + 5);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build the full file path.
|
|
47
|
+
*/
|
|
48
|
+
function buildPath(baseDir, key, specType) {
|
|
49
|
+
const fileName = key.replace(/\./g, "-").toLowerCase();
|
|
50
|
+
const extension = getFileExtension(specType);
|
|
51
|
+
const subDir = getSubDirectory(specType);
|
|
52
|
+
return path.join(baseDir, subDir, `${fileName}${extension}`);
|
|
53
|
+
}
|
|
54
|
+
function getFileExtension(specType) {
|
|
55
|
+
return {
|
|
56
|
+
operation: ".operation.ts",
|
|
57
|
+
event: ".event.ts",
|
|
58
|
+
presentation: ".presentation.ts",
|
|
59
|
+
workflow: ".workflow.ts",
|
|
60
|
+
"data-view": ".data-view.ts",
|
|
61
|
+
form: ".form.ts",
|
|
62
|
+
migration: ".migration.ts",
|
|
63
|
+
experiment: ".experiment.ts",
|
|
64
|
+
capability: ".capability.ts"
|
|
65
|
+
}[specType] || ".ts";
|
|
66
|
+
}
|
|
67
|
+
function getSubDirectory(specType) {
|
|
68
|
+
return {
|
|
69
|
+
operation: "operations",
|
|
70
|
+
event: "events",
|
|
71
|
+
presentation: "presentations",
|
|
72
|
+
workflow: "workflows",
|
|
73
|
+
"data-view": "data-views",
|
|
74
|
+
form: "forms",
|
|
75
|
+
migration: "migrations",
|
|
76
|
+
experiment: "experiments",
|
|
77
|
+
capability: "capabilities"
|
|
78
|
+
}[specType] || "specs";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//#endregion
|
|
82
|
+
export { resolveOutputPath };
|
|
83
|
+
//# sourceMappingURL=path-resolver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.mjs","names":[],"sources":["../../../src/services/fix/path-resolver.ts"],"sourcesContent":["/**\n * Fix path resolution utilities.\n */\n\nimport path from 'node:path';\nimport type { FixableIssue, FixOptions } from './types';\n\n/**\n * Resolve the output file path for a new spec.\n *\n * Strategies:\n * 1. If outputDir is provided in options, use it.\n * 2. If featureFile is present, try to find the 'src' directory relative to it.\n * 3. Fallback to workspaceRoot/specs/[type]/...\n */\nexport function resolveOutputPath(\n issue: FixableIssue,\n options: FixOptions\n): string {\n if (options.outputDir) {\n return buildPath(options.outputDir, issue.ref.key, issue.specType);\n }\n\n // Try to locate src directory from feature file\n if (issue.featureFile) {\n const srcDir = findSrcDir(issue.featureFile);\n if (srcDir) {\n return buildPath(srcDir, issue.ref.key, issue.specType);\n }\n }\n\n // Fallback to workspace root\n return buildPath(\n path.join(options.workspaceRoot, 'specs'),\n issue.ref.key,\n issue.specType\n );\n}\n\n/**\n * Find the 'src' directory by walking up from the file path.\n */\nfunction findSrcDir(filePath: string): string | null {\n let current = path.dirname(filePath);\n const root = path.parse(filePath).root;\n\n // Safety break to prevent infinite loops\n let iterations = 0;\n while (current !== root && iterations < 50) {\n if (path.basename(current) === 'src') {\n return current;\n }\n // If we hit a package.json, we might assume src is inside (or we are at root)\n // But checking for 'src' explicit is safer for monorepo structures\n current = path.dirname(current);\n iterations++;\n }\n\n // Second pass: look for package.json and append /src\n current = path.dirname(filePath);\n iterations = 0;\n while (current !== root && iterations < 50) {\n // We can't synchronously check for file existence easily here without FS adapter access\n // passing FS adapter everywhere is annoying.\n // relying on 'src' convention in URL path string is often enough for now.\n // Let's rely on the first pass for \"src\" segment presence.\n current = path.dirname(current);\n iterations++;\n }\n\n // If the file path itself contains '/src/', extract it\n const srcIndex = filePath.lastIndexOf(`${path.sep}src${path.sep}`);\n if (srcIndex !== -1) {\n return filePath.substring(0, srcIndex + 5); // include /src/\n }\n\n return null;\n}\n\n/**\n * Build the full file path.\n */\nfunction buildPath(baseDir: string, key: string, specType: string): string {\n // Convert key to file name\n // Logic:\n // - If key matches spec type (e.g. \"billing\" for a billing op), keep it simple\n // - Replace dots with dashes? Or keep dots? User mentioned \"docs.search\" -> \"search.ts\" or \"search.operation.ts\"\n // Let's try to be smart: if key namespace matches package/domain, simplify.\n\n // Simple for now: normalized key\n // \"docs.search\" -> \"docs-search\"\n // \"search\" -> \"search\"\n const fileName = key.replace(/\\./g, '-').toLowerCase();\n\n // Optimization: if the key has multiple parts (domain.name), and we are placing it inside a domain folder?\n // Current requirement: just place in src/[type]s/\n\n const extension = getFileExtension(specType);\n const subDir = getSubDirectory(specType);\n\n return path.join(baseDir, subDir, `${fileName}${extension}`);\n}\n\nfunction getFileExtension(specType: string): string {\n const extensions: Record<string, string> = {\n operation: '.operation.ts', // Explicit .operation.ts preferred by user guidelines\n event: '.event.ts',\n presentation: '.presentation.ts',\n workflow: '.workflow.ts',\n 'data-view': '.data-view.ts',\n form: '.form.ts',\n migration: '.migration.ts',\n experiment: '.experiment.ts',\n capability: '.capability.ts',\n };\n\n return extensions[specType] || '.ts';\n}\n\nfunction getSubDirectory(specType: string): string {\n const dirs: Record<string, string> = {\n operation: 'operations',\n event: 'events',\n presentation: 'presentations',\n workflow: 'workflows',\n 'data-view': 'data-views',\n form: 'forms',\n migration: 'migrations',\n experiment: 'experiments',\n capability: 'capabilities',\n };\n\n return dirs[specType] || 'specs';\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,kBACd,OACA,SACQ;AACR,KAAI,QAAQ,UACV,QAAO,UAAU,QAAQ,WAAW,MAAM,IAAI,KAAK,MAAM,SAAS;AAIpE,KAAI,MAAM,aAAa;EACrB,MAAM,SAAS,WAAW,MAAM,YAAY;AAC5C,MAAI,OACF,QAAO,UAAU,QAAQ,MAAM,IAAI,KAAK,MAAM,SAAS;;AAK3D,QAAO,UACL,KAAK,KAAK,QAAQ,eAAe,QAAQ,EACzC,MAAM,IAAI,KACV,MAAM,SACP;;;;;AAMH,SAAS,WAAW,UAAiC;CACnD,IAAI,UAAU,KAAK,QAAQ,SAAS;CACpC,MAAM,OAAO,KAAK,MAAM,SAAS,CAAC;CAGlC,IAAI,aAAa;AACjB,QAAO,YAAY,QAAQ,aAAa,IAAI;AAC1C,MAAI,KAAK,SAAS,QAAQ,KAAK,MAC7B,QAAO;AAIT,YAAU,KAAK,QAAQ,QAAQ;AAC/B;;AAIF,WAAU,KAAK,QAAQ,SAAS;AAChC,cAAa;AACb,QAAO,YAAY,QAAQ,aAAa,IAAI;AAK1C,YAAU,KAAK,QAAQ,QAAQ;AAC/B;;CAIF,MAAM,WAAW,SAAS,YAAY,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM;AAClE,KAAI,aAAa,GACf,QAAO,SAAS,UAAU,GAAG,WAAW,EAAE;AAG5C,QAAO;;;;;AAMT,SAAS,UAAU,SAAiB,KAAa,UAA0B;CAUzE,MAAM,WAAW,IAAI,QAAQ,OAAO,IAAI,CAAC,aAAa;CAKtD,MAAM,YAAY,iBAAiB,SAAS;CAC5C,MAAM,SAAS,gBAAgB,SAAS;AAExC,QAAO,KAAK,KAAK,SAAS,QAAQ,GAAG,WAAW,YAAY;;AAG9D,SAAS,iBAAiB,UAA0B;AAalD,QAZ2C;EACzC,WAAW;EACX,OAAO;EACP,cAAc;EACd,UAAU;EACV,aAAa;EACb,MAAM;EACN,WAAW;EACX,YAAY;EACZ,YAAY;EACb,CAEiB,aAAa;;AAGjC,SAAS,gBAAgB,UAA0B;AAajD,QAZqC;EACnC,WAAW;EACX,OAAO;EACP,cAAc;EACd,UAAU;EACV,aAAa;EACb,MAAM;EACN,WAAW;EACX,YAAY;EACZ,YAAY;EACb,CAEW,aAAa"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/services/fix/schemas.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Schema for parsing CI output JSON file.
|
|
7
|
+
* Handles both direct array and nested { issues: [...] } formats.
|
|
8
|
+
*/
|
|
9
|
+
declare const CiOutputSchema: z.ZodUnion<readonly [z.ZodArray<z.ZodUnknown>, z.ZodPipe<z.ZodObject<{
|
|
10
|
+
issues: z.ZodArray<z.ZodUnknown>;
|
|
11
|
+
}, z.core.$strip>, z.ZodTransform<unknown[], {
|
|
12
|
+
issues: unknown[];
|
|
13
|
+
}>>]>;
|
|
14
|
+
type CiOutput = z.infer<typeof CiOutputSchema>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { CiOutput, CiOutputSchema };
|
|
17
|
+
//# sourceMappingURL=schemas.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.mts","names":[],"sources":["../../../src/services/fix/schemas.ts"],"sourcesContent":[],"mappings":";;;;;;AAMA;;AAA2B,cAAd,cAAc,EAAA,CAAA,CAAA,QAAA,CAAA,SAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,UAAA,CAAA,EAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA,CAAA;;;;CAAA,CAAA,CAAA,CAAA,CAAA;KAKf,QAAA,GAAW,CAAA,CAAE,aAAa"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/services/fix/schemas.ts
|
|
4
|
+
/**
|
|
5
|
+
* Schema for parsing CI output JSON file.
|
|
6
|
+
* Handles both direct array and nested { issues: [...] } formats.
|
|
7
|
+
*/
|
|
8
|
+
const CiOutputSchema = z.union([z.array(z.unknown()), z.object({ issues: z.array(z.unknown()) }).transform((data) => data.issues)]);
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { CiOutputSchema };
|
|
12
|
+
//# sourceMappingURL=schemas.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.mjs","names":[],"sources":["../../../src/services/fix/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Schema for parsing CI output JSON file.\n * Handles both direct array and nested { issues: [...] } formats.\n */\nexport const CiOutputSchema = z.union([\n z.array(z.unknown()),\n z.object({ issues: z.array(z.unknown()) }).transform((data) => data.issues),\n]);\n\nexport type CiOutput = z.infer<typeof CiOutputSchema>;\n"],"mappings":";;;;;;;AAMA,MAAa,iBAAiB,EAAE,MAAM,CACpC,EAAE,MAAM,EAAE,SAAS,CAAC,EACpB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,WAAW,SAAS,KAAK,OAAO,CAC5E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FsAdapter } from "../../../ports/fs.mjs";
|
|
2
|
+
import { LoggerAdapter } from "../../../ports/logger.mjs";
|
|
3
|
+
import { FixOptions, FixResult, FixableIssue } from "../types.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/services/fix/strategies/implement-ai.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Create a spec with AI-generated content.
|
|
9
|
+
*
|
|
10
|
+
* Falls back to skeleton if AI is not available or fails.
|
|
11
|
+
*/
|
|
12
|
+
declare function implementAiStrategy(issue: FixableIssue, options: FixOptions, adapters: {
|
|
13
|
+
fs: FsAdapter;
|
|
14
|
+
logger: LoggerAdapter;
|
|
15
|
+
}): Promise<FixResult>;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { implementAiStrategy };
|
|
18
|
+
//# sourceMappingURL=implement-ai.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-ai.d.mts","names":[],"sources":["../../../../src/services/fix/strategies/implement-ai.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;iBA8BsB,mBAAA,QACb,uBACE;MACO;UAAmB;IAClC,QAAQ"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { FIX_STRATEGY_STABILITY } from "../types.mjs";
|
|
2
|
+
import { generateSkeletonOperation } from "../../../templates/fix/skeleton-operation.mjs";
|
|
3
|
+
import { generateSkeletonEvent } from "../../../templates/fix/skeleton-event.mjs";
|
|
4
|
+
import { generateSkeletonPresentation } from "../../../templates/fix/skeleton-presentation.mjs";
|
|
5
|
+
import { generateSkeletonCapability } from "../../../templates/fix/skeleton-capability.mjs";
|
|
6
|
+
import { resolveOutputPath } from "../path-resolver.mjs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
|
|
9
|
+
//#region src/services/fix/strategies/implement-ai.ts
|
|
10
|
+
/**
|
|
11
|
+
* Create a spec with AI-generated content.
|
|
12
|
+
*
|
|
13
|
+
* Falls back to skeleton if AI is not available or fails.
|
|
14
|
+
*/
|
|
15
|
+
async function implementAiStrategy(issue, options, adapters) {
|
|
16
|
+
const { fs, logger } = adapters;
|
|
17
|
+
const { ref, specType, featureKey } = issue;
|
|
18
|
+
try {
|
|
19
|
+
const ctx = {
|
|
20
|
+
key: ref.key,
|
|
21
|
+
version: ref.version,
|
|
22
|
+
specType,
|
|
23
|
+
stability: FIX_STRATEGY_STABILITY["implement-ai"],
|
|
24
|
+
featureKey
|
|
25
|
+
};
|
|
26
|
+
let enrichedCtx = ctx;
|
|
27
|
+
if (options.aiConfig) try {
|
|
28
|
+
enrichedCtx = await enrichWithAI(ctx, options, logger);
|
|
29
|
+
} catch (aiError) {
|
|
30
|
+
logger.warn("AI enrichment failed, falling back to skeleton", { error: aiError instanceof Error ? aiError.message : String(aiError) });
|
|
31
|
+
}
|
|
32
|
+
else logger.info("No AI config provided, using skeleton with experimental stability");
|
|
33
|
+
const code = generateSpecCode(enrichedCtx);
|
|
34
|
+
if (!code) return {
|
|
35
|
+
success: false,
|
|
36
|
+
strategy: "implement-ai",
|
|
37
|
+
issue,
|
|
38
|
+
filesChanged: [],
|
|
39
|
+
error: `Unsupported spec type: ${specType}`
|
|
40
|
+
};
|
|
41
|
+
const filePath = resolveOutputPath(issue, options);
|
|
42
|
+
const filesChanged = [];
|
|
43
|
+
if (!options.dryRun) {
|
|
44
|
+
const dir = path.dirname(filePath);
|
|
45
|
+
await fs.mkdir(dir);
|
|
46
|
+
await fs.writeFile(filePath, code);
|
|
47
|
+
filesChanged.push({
|
|
48
|
+
path: filePath,
|
|
49
|
+
action: "created"
|
|
50
|
+
});
|
|
51
|
+
} else filesChanged.push({
|
|
52
|
+
path: filePath,
|
|
53
|
+
action: "created"
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
strategy: "implement-ai",
|
|
58
|
+
issue,
|
|
59
|
+
filesChanged
|
|
60
|
+
};
|
|
61
|
+
} catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
strategy: "implement-ai",
|
|
65
|
+
issue,
|
|
66
|
+
filesChanged: [],
|
|
67
|
+
error: error instanceof Error ? error.message : String(error)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Enrich the generation context with AI-generated content.
|
|
73
|
+
*/
|
|
74
|
+
async function enrichWithAI(ctx, _options, logger) {
|
|
75
|
+
logger.info("Generating AI content for spec", {
|
|
76
|
+
key: ctx.key,
|
|
77
|
+
type: ctx.specType
|
|
78
|
+
});
|
|
79
|
+
const enrichment = inferEnrichmentFromKey(ctx.key, ctx.specType);
|
|
80
|
+
return {
|
|
81
|
+
...ctx,
|
|
82
|
+
description: enrichment.description,
|
|
83
|
+
enrichment: {
|
|
84
|
+
goal: enrichment.goal,
|
|
85
|
+
context: enrichment.context,
|
|
86
|
+
owners: ["@team"],
|
|
87
|
+
tags: enrichment.tags
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Infer enrichment content from the spec key.
|
|
93
|
+
*/
|
|
94
|
+
function inferEnrichmentFromKey(key, specType) {
|
|
95
|
+
const parts = key.split(".");
|
|
96
|
+
const domain = parts[0] || "unknown";
|
|
97
|
+
const action = parts.slice(1).join(" ").replace(/_/g, " ");
|
|
98
|
+
const domainTags = [domain];
|
|
99
|
+
const actionKeywords = action.toLowerCase().split(" ");
|
|
100
|
+
const matchedTags = [
|
|
101
|
+
"auth",
|
|
102
|
+
"user",
|
|
103
|
+
"admin",
|
|
104
|
+
"api",
|
|
105
|
+
"data",
|
|
106
|
+
"search",
|
|
107
|
+
"create",
|
|
108
|
+
"update",
|
|
109
|
+
"delete"
|
|
110
|
+
].filter((tag) => actionKeywords.some((kw) => kw.includes(tag)));
|
|
111
|
+
return {
|
|
112
|
+
description: `${capitalize(specType)} for ${domain} ${action}`,
|
|
113
|
+
goal: `Enable ${action} functionality in the ${domain} domain`,
|
|
114
|
+
context: `Part of the ${domain} feature set. Generated by ContractSpec AI fix.`,
|
|
115
|
+
tags: [...domainTags, ...matchedTags]
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate spec code based on type.
|
|
120
|
+
*/
|
|
121
|
+
function generateSpecCode(ctx) {
|
|
122
|
+
switch (ctx.specType) {
|
|
123
|
+
case "operation": return generateSkeletonOperation(ctx);
|
|
124
|
+
case "event": return generateSkeletonEvent(ctx);
|
|
125
|
+
case "presentation": return generateSkeletonPresentation(ctx);
|
|
126
|
+
case "capability": return generateSkeletonCapability(ctx);
|
|
127
|
+
default: return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Capitalize the first letter of a string.
|
|
132
|
+
*/
|
|
133
|
+
function capitalize(str) {
|
|
134
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
export { implementAiStrategy };
|
|
139
|
+
//# sourceMappingURL=implement-ai.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-ai.mjs","names":[],"sources":["../../../../src/services/fix/strategies/implement-ai.ts"],"sourcesContent":["/**\n * Implement AI strategy.\n *\n * Creates a spec with AI-generated content using experimental stability.\n */\n\nimport type {\n FixableIssue,\n FixOptions,\n FixResult,\n FixFileChange,\n SpecGenerationContext,\n} from '../types';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { LoggerAdapter } from '../../../ports/logger';\nimport { FIX_STRATEGY_STABILITY } from '../types';\nimport {\n generateSkeletonOperation,\n generateSkeletonEvent,\n generateSkeletonPresentation,\n generateSkeletonCapability,\n} from '../../../templates/fix';\nimport { resolveOutputPath } from '../path-resolver';\nimport path from 'node:path';\n\n/**\n * Create a spec with AI-generated content.\n *\n * Falls back to skeleton if AI is not available or fails.\n */\nexport async function implementAiStrategy(\n issue: FixableIssue,\n options: FixOptions,\n adapters: { fs: FsAdapter; logger: LoggerAdapter }\n): Promise<FixResult> {\n const { fs, logger } = adapters;\n const { ref, specType, featureKey } = issue;\n\n try {\n // Build generation context with AI enrichment\n const ctx: SpecGenerationContext = {\n key: ref.key,\n version: ref.version,\n specType,\n stability: FIX_STRATEGY_STABILITY['implement-ai'],\n featureKey,\n };\n\n // Try to get AI-generated content\n let enrichedCtx = ctx;\n if (options.aiConfig) {\n try {\n enrichedCtx = await enrichWithAI(ctx, options, logger);\n } catch (aiError) {\n logger.warn('AI enrichment failed, falling back to skeleton', {\n error: aiError instanceof Error ? aiError.message : String(aiError),\n });\n // Continue with unenriched context\n }\n } else {\n logger.info(\n 'No AI config provided, using skeleton with experimental stability'\n );\n }\n\n // Generate the spec code\n const code = generateSpecCode(enrichedCtx);\n if (!code) {\n return {\n success: false,\n strategy: 'implement-ai',\n issue,\n filesChanged: [],\n error: `Unsupported spec type: ${specType}`,\n };\n }\n\n // Determine output path\n const filePath = resolveOutputPath(issue, options);\n\n const filesChanged: FixFileChange[] = [];\n\n // Write the file (unless dry run)\n if (!options.dryRun) {\n // Ensure directory exists\n const dir = path.dirname(filePath);\n await fs.mkdir(dir);\n\n // Write the spec file\n await fs.writeFile(filePath, code);\n\n filesChanged.push({\n path: filePath,\n action: 'created',\n });\n } else {\n // For dry run, report what would be created\n filesChanged.push({\n path: filePath,\n action: 'created',\n });\n }\n\n return {\n success: true,\n strategy: 'implement-ai',\n issue,\n filesChanged,\n };\n } catch (error) {\n return {\n success: false,\n strategy: 'implement-ai',\n issue,\n filesChanged: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Enrich the generation context with AI-generated content.\n */\nasync function enrichWithAI(\n ctx: SpecGenerationContext,\n _options: FixOptions,\n logger: LoggerAdapter\n): Promise<SpecGenerationContext> {\n // TODO: Integrate with existing AIGenerator from services/create/ai-generator.ts\n // For now, generate reasonable defaults based on the key\n\n logger.info('Generating AI content for spec', {\n key: ctx.key,\n type: ctx.specType,\n });\n\n const enrichment = inferEnrichmentFromKey(ctx.key, ctx.specType);\n\n return {\n ...ctx,\n description: enrichment.description,\n enrichment: {\n goal: enrichment.goal,\n context: enrichment.context,\n owners: ['@team'],\n tags: enrichment.tags,\n },\n };\n}\n\n/**\n * Infer enrichment content from the spec key.\n */\nfunction inferEnrichmentFromKey(\n key: string,\n specType: string\n): {\n description: string;\n goal: string;\n context: string;\n tags: string[];\n} {\n const parts = key.split('.');\n const domain = parts[0] || 'unknown';\n const action = parts.slice(1).join(' ').replace(/_/g, ' ');\n\n const domainTags = [domain];\n const actionKeywords = action.toLowerCase().split(' ');\n\n // Add relevant tags based on action keywords\n const tagKeywords = [\n 'auth',\n 'user',\n 'admin',\n 'api',\n 'data',\n 'search',\n 'create',\n 'update',\n 'delete',\n ];\n const matchedTags = tagKeywords.filter((tag) =>\n actionKeywords.some((kw) => kw.includes(tag))\n );\n\n return {\n description: `${capitalize(specType)} for ${domain} ${action}`,\n goal: `Enable ${action} functionality in the ${domain} domain`,\n context: `Part of the ${domain} feature set. Generated by ContractSpec AI fix.`,\n tags: [...domainTags, ...matchedTags],\n };\n}\n\n/**\n * Generate spec code based on type.\n */\nfunction generateSpecCode(ctx: SpecGenerationContext): string | undefined {\n switch (ctx.specType) {\n case 'operation':\n return generateSkeletonOperation(ctx);\n case 'event':\n return generateSkeletonEvent(ctx);\n case 'presentation':\n return generateSkeletonPresentation(ctx);\n case 'capability':\n return generateSkeletonCapability(ctx);\n default:\n return undefined;\n }\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n"],"mappings":";;;;;;;;;;;;;;AA8BA,eAAsB,oBACpB,OACA,SACA,UACoB;CACpB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,KAAK,UAAU,eAAe;AAEtC,KAAI;EAEF,MAAM,MAA6B;GACjC,KAAK,IAAI;GACT,SAAS,IAAI;GACb;GACA,WAAW,uBAAuB;GAClC;GACD;EAGD,IAAI,cAAc;AAClB,MAAI,QAAQ,SACV,KAAI;AACF,iBAAc,MAAM,aAAa,KAAK,SAAS,OAAO;WAC/C,SAAS;AAChB,UAAO,KAAK,kDAAkD,EAC5D,OAAO,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,QAAQ,EACpE,CAAC;;MAIJ,QAAO,KACL,oEACD;EAIH,MAAM,OAAO,iBAAiB,YAAY;AAC1C,MAAI,CAAC,KACH,QAAO;GACL,SAAS;GACT,UAAU;GACV;GACA,cAAc,EAAE;GAChB,OAAO,0BAA0B;GAClC;EAIH,MAAM,WAAW,kBAAkB,OAAO,QAAQ;EAElD,MAAM,eAAgC,EAAE;AAGxC,MAAI,CAAC,QAAQ,QAAQ;GAEnB,MAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,SAAM,GAAG,MAAM,IAAI;AAGnB,SAAM,GAAG,UAAU,UAAU,KAAK;AAElC,gBAAa,KAAK;IAChB,MAAM;IACN,QAAQ;IACT,CAAC;QAGF,cAAa,KAAK;GAChB,MAAM;GACN,QAAQ;GACT,CAAC;AAGJ,SAAO;GACL,SAAS;GACT,UAAU;GACV;GACA;GACD;UACM,OAAO;AACd,SAAO;GACL,SAAS;GACT,UAAU;GACV;GACA,cAAc,EAAE;GAChB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC9D;;;;;;AAOL,eAAe,aACb,KACA,UACA,QACgC;AAIhC,QAAO,KAAK,kCAAkC;EAC5C,KAAK,IAAI;EACT,MAAM,IAAI;EACX,CAAC;CAEF,MAAM,aAAa,uBAAuB,IAAI,KAAK,IAAI,SAAS;AAEhE,QAAO;EACL,GAAG;EACH,aAAa,WAAW;EACxB,YAAY;GACV,MAAM,WAAW;GACjB,SAAS,WAAW;GACpB,QAAQ,CAAC,QAAQ;GACjB,MAAM,WAAW;GAClB;EACF;;;;;AAMH,SAAS,uBACP,KACA,UAMA;CACA,MAAM,QAAQ,IAAI,MAAM,IAAI;CAC5B,MAAM,SAAS,MAAM,MAAM;CAC3B,MAAM,SAAS,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI;CAE1D,MAAM,aAAa,CAAC,OAAO;CAC3B,MAAM,iBAAiB,OAAO,aAAa,CAAC,MAAM,IAAI;CActD,MAAM,cAXc;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAC+B,QAAQ,QACtC,eAAe,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,CAC9C;AAED,QAAO;EACL,aAAa,GAAG,WAAW,SAAS,CAAC,OAAO,OAAO,GAAG;EACtD,MAAM,UAAU,OAAO,wBAAwB,OAAO;EACtD,SAAS,eAAe,OAAO;EAC/B,MAAM,CAAC,GAAG,YAAY,GAAG,YAAY;EACtC;;;;;AAMH,SAAS,iBAAiB,KAAgD;AACxE,SAAQ,IAAI,UAAZ;EACE,KAAK,YACH,QAAO,0BAA0B,IAAI;EACvC,KAAK,QACH,QAAO,sBAAsB,IAAI;EACnC,KAAK,eACH,QAAO,6BAA6B,IAAI;EAC1C,KAAK,aACH,QAAO,2BAA2B,IAAI;EACxC,QACE;;;;;;AAON,SAAS,WAAW,KAAqB;AACvC,QAAO,IAAI,OAAO,EAAE,CAAC,aAAa,GAAG,IAAI,MAAM,EAAE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FsAdapter } from "../../../ports/fs.mjs";
|
|
2
|
+
import { FixOptions, FixResult, FixableIssue } from "../types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/fix/strategies/implement-skeleton.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a skeleton spec for a missing reference.
|
|
8
|
+
*/
|
|
9
|
+
declare function implementSkeletonStrategy(issue: FixableIssue, options: FixOptions, adapters: {
|
|
10
|
+
fs: FsAdapter;
|
|
11
|
+
}): Promise<FixResult>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { implementSkeletonStrategy };
|
|
14
|
+
//# sourceMappingURL=implement-skeleton.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-skeleton.d.mts","names":[],"sources":["../../../../src/services/fix/strategies/implement-skeleton.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA+BU,iBAJY,yBAAA,CAIZ,KAAA,EAHD,YAGC,EAAA,OAAA,EAFC,UAED,EAAA,QAAA,EAAA;MADQ;IACf,QAAQ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { FIX_STRATEGY_STABILITY } from "../types.mjs";
|
|
2
|
+
import { generateSkeletonOperation } from "../../../templates/fix/skeleton-operation.mjs";
|
|
3
|
+
import { generateSkeletonEvent } from "../../../templates/fix/skeleton-event.mjs";
|
|
4
|
+
import { generateSkeletonPresentation } from "../../../templates/fix/skeleton-presentation.mjs";
|
|
5
|
+
import { generateSkeletonCapability } from "../../../templates/fix/skeleton-capability.mjs";
|
|
6
|
+
import { resolveOutputPath } from "../path-resolver.mjs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
|
|
9
|
+
//#region src/services/fix/strategies/implement-skeleton.ts
|
|
10
|
+
/**
|
|
11
|
+
* Create a skeleton spec for a missing reference.
|
|
12
|
+
*/
|
|
13
|
+
async function implementSkeletonStrategy(issue, options, adapters) {
|
|
14
|
+
const { fs } = adapters;
|
|
15
|
+
const { ref, specType, featureKey } = issue;
|
|
16
|
+
try {
|
|
17
|
+
const code = generateSpecCode({
|
|
18
|
+
key: ref.key,
|
|
19
|
+
version: ref.version,
|
|
20
|
+
specType,
|
|
21
|
+
stability: FIX_STRATEGY_STABILITY["implement-skeleton"],
|
|
22
|
+
description: `Skeleton spec for ${ref.key}`,
|
|
23
|
+
featureKey
|
|
24
|
+
});
|
|
25
|
+
if (!code) return {
|
|
26
|
+
success: false,
|
|
27
|
+
strategy: "implement-skeleton",
|
|
28
|
+
issue,
|
|
29
|
+
filesChanged: [],
|
|
30
|
+
error: `Unsupported spec type: ${specType}`
|
|
31
|
+
};
|
|
32
|
+
const filePath = resolveOutputPath(issue, options);
|
|
33
|
+
const filesChanged = [];
|
|
34
|
+
if (!options.dryRun) {
|
|
35
|
+
const dir = path.dirname(filePath);
|
|
36
|
+
await fs.mkdir(dir);
|
|
37
|
+
await fs.writeFile(filePath, code);
|
|
38
|
+
filesChanged.push({
|
|
39
|
+
path: filePath,
|
|
40
|
+
action: "created"
|
|
41
|
+
});
|
|
42
|
+
} else filesChanged.push({
|
|
43
|
+
path: filePath,
|
|
44
|
+
action: "created"
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
success: true,
|
|
48
|
+
strategy: "implement-skeleton",
|
|
49
|
+
issue,
|
|
50
|
+
filesChanged
|
|
51
|
+
};
|
|
52
|
+
} catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
strategy: "implement-skeleton",
|
|
56
|
+
issue,
|
|
57
|
+
filesChanged: [],
|
|
58
|
+
error: error instanceof Error ? error.message : String(error)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate spec code based on type.
|
|
64
|
+
*/
|
|
65
|
+
function generateSpecCode(ctx) {
|
|
66
|
+
switch (ctx.specType) {
|
|
67
|
+
case "operation": return generateSkeletonOperation(ctx);
|
|
68
|
+
case "event": return generateSkeletonEvent(ctx);
|
|
69
|
+
case "presentation": return generateSkeletonPresentation(ctx);
|
|
70
|
+
case "capability": return generateSkeletonCapability(ctx);
|
|
71
|
+
default: return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { implementSkeletonStrategy };
|
|
77
|
+
//# sourceMappingURL=implement-skeleton.mjs.map
|