@contractspec/bundle.workspace 1.56.0 → 1.57.0
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/dist/_virtual/{rolldown_runtime.mjs → _rolldown/runtime.mjs} +3 -3
- package/dist/adapters/ai.d.mts +0 -1
- package/dist/adapters/ai.d.mts.map +1 -1
- package/dist/adapters/factory.d.mts +0 -1
- package/dist/adapters/factory.d.mts.map +1 -1
- package/dist/adapters/fs.bun.d.mts +0 -1
- package/dist/adapters/fs.bun.d.mts.map +1 -1
- package/dist/adapters/fs.bun.mjs +18 -18
- package/dist/adapters/fs.bun.mjs.map +1 -1
- package/dist/adapters/fs.d.mts.map +1 -1
- package/dist/adapters/fs.node.d.mts +0 -1
- package/dist/adapters/fs.node.d.mts.map +1 -1
- package/dist/adapters/fs.node.mjs +18 -18
- package/dist/adapters/fs.node.mjs.map +1 -1
- package/dist/adapters/git.d.mts +0 -1
- package/dist/adapters/git.d.mts.map +1 -1
- package/dist/adapters/git.mjs +2 -2
- package/dist/adapters/git.mjs.map +1 -1
- package/dist/adapters/logger.d.mts +0 -1
- package/dist/adapters/logger.d.mts.map +1 -1
- package/dist/adapters/watcher.d.mts +0 -1
- package/dist/adapters/watcher.d.mts.map +1 -1
- package/dist/adapters/workspace.d.mts.map +1 -1
- package/dist/adapters/workspace.mjs +4 -4
- package/dist/adapters/workspace.mjs.map +1 -1
- package/dist/ai/agents/claude-code-agent.d.mts +0 -1
- package/dist/ai/agents/claude-code-agent.d.mts.map +1 -1
- package/dist/ai/agents/cursor-agent.d.mts +0 -1
- package/dist/ai/agents/cursor-agent.d.mts.map +1 -1
- package/dist/ai/agents/cursor-agent.mjs +5 -5
- package/dist/ai/agents/cursor-agent.mjs.map +1 -1
- package/dist/ai/agents/openai-codex-agent.d.mts +0 -1
- package/dist/ai/agents/openai-codex-agent.d.mts.map +1 -1
- package/dist/ai/agents/orchestrator.d.mts +0 -1
- package/dist/ai/agents/orchestrator.d.mts.map +1 -1
- package/dist/ai/agents/simple-agent.d.mts +0 -1
- package/dist/ai/agents/simple-agent.d.mts.map +1 -1
- package/dist/ai/agents/types.d.mts +0 -1
- package/dist/ai/agents/types.d.mts.map +1 -1
- package/dist/ai/prompts/code-generation.d.mts.map +1 -1
- package/dist/ai/prompts/code-generation.mjs +1 -1
- package/dist/ai/prompts/index.d.mts.map +1 -1
- package/dist/ai/prompts/index.mjs +1 -1
- package/dist/ai/prompts/spec-creation.d.mts.map +1 -1
- package/dist/ai/prompts/spec-creation.mjs +1 -1
- package/dist/ai/providers.d.mts +0 -1
- package/dist/ai/providers.d.mts.map +1 -1
- package/dist/formatters/index.d.mts.map +1 -1
- package/dist/formatters/index.mjs +1 -1
- package/dist/formatters/json.d.mts +0 -1
- package/dist/formatters/json.d.mts.map +1 -1
- package/dist/formatters/sarif.d.mts +0 -1
- package/dist/formatters/sarif.d.mts.map +1 -1
- package/dist/formatters/text.d.mts +0 -1
- package/dist/formatters/text.d.mts.map +1 -1
- package/dist/ports/ai.d.mts +0 -1
- package/dist/ports/ai.d.mts.map +1 -1
- package/dist/ports/fs.d.mts.map +1 -1
- package/dist/ports/git.d.mts.map +1 -1
- package/dist/ports/logger.d.mts.map +1 -1
- package/dist/ports/rulesync.d.mts +0 -1
- package/dist/ports/rulesync.d.mts.map +1 -1
- package/dist/ports/watcher.d.mts.map +1 -1
- package/dist/registry.d.mts +0 -1
- package/dist/registry.d.mts.map +1 -1
- package/dist/services/action-drift/service.d.mts.map +1 -1
- package/dist/services/action-drift/types.d.mts.map +1 -1
- package/dist/services/action-pr/service.d.mts.map +1 -1
- package/dist/services/action-pr/service.mjs +1 -1
- package/dist/services/action-pr/service.mjs.map +1 -1
- package/dist/services/action-pr/types.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/claude-code.d.mts +0 -1
- package/dist/services/agent-guide/adapters/claude-code.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts +0 -1
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts +0 -1
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/index.d.mts +0 -1
- package/dist/services/agent-guide/adapters/index.d.mts.map +1 -1
- package/dist/services/agent-guide/agent-guide-service.d.mts +0 -1
- package/dist/services/agent-guide/agent-guide-service.d.mts.map +1 -1
- package/dist/services/agent-guide/types.d.mts +0 -1
- package/dist/services/agent-guide/types.d.mts.map +1 -1
- package/dist/services/build.d.mts +0 -1
- package/dist/services/build.d.mts.map +1 -1
- package/dist/services/ci-check/ci-check-service.d.mts +0 -1
- package/dist/services/ci-check/ci-check-service.d.mts.map +1 -1
- package/dist/services/ci-check/types.d.mts +3 -8
- package/dist/services/ci-check/types.d.mts.map +1 -1
- package/dist/services/clean.d.mts +0 -1
- package/dist/services/clean.d.mts.map +1 -1
- package/dist/services/config.d.mts +0 -1
- package/dist/services/config.d.mts.map +1 -1
- package/dist/services/create/ai-generator.d.mts +0 -1
- package/dist/services/create/ai-generator.d.mts.map +1 -1
- package/dist/services/create/index.d.mts.map +1 -1
- package/dist/services/create/templates.d.mts.map +1 -1
- package/dist/services/create/templates.mjs +1 -1
- package/dist/services/deps.d.mts +0 -1
- package/dist/services/deps.d.mts.map +1 -1
- package/dist/services/diff.d.mts +0 -1
- package/dist/services/diff.d.mts.map +1 -1
- package/dist/services/docs/docs-service.d.mts.map +1 -1
- package/dist/services/doctor/doctor-service.d.mts +0 -1
- package/dist/services/doctor/doctor-service.d.mts.map +1 -1
- package/dist/services/doctor/types.d.mts.map +1 -1
- package/dist/services/extract.d.mts.map +1 -1
- package/dist/services/features/completion.d.mts +0 -1
- package/dist/services/features/completion.d.mts.map +1 -1
- package/dist/services/features/completion.mjs +1 -1
- package/dist/services/features/completion.mjs.map +1 -1
- package/dist/services/features/feature-editor.d.mts.map +1 -1
- package/dist/services/features/index.d.mts.map +1 -1
- package/dist/services/features/index.mjs +1 -1
- package/dist/services/features/validation.d.mts +0 -1
- package/dist/services/features/validation.d.mts.map +1 -1
- package/dist/services/fix/fix-link-formatter.d.mts +0 -1
- package/dist/services/fix/fix-link-formatter.d.mts.map +1 -1
- package/dist/services/fix/fix-service.d.mts +0 -1
- package/dist/services/fix/fix-service.d.mts.map +1 -1
- package/dist/services/fix/index.d.mts.map +1 -1
- package/dist/services/fix/index.mjs +1 -1
- package/dist/services/fix/schemas.d.mts +0 -1
- package/dist/services/fix/schemas.d.mts.map +1 -1
- package/dist/services/fix/strategies/implement-ai.d.mts +0 -1
- package/dist/services/fix/strategies/implement-ai.d.mts.map +1 -1
- package/dist/services/fix/strategies/implement-skeleton.d.mts +0 -1
- package/dist/services/fix/strategies/implement-skeleton.d.mts.map +1 -1
- package/dist/services/fix/strategies/remove-reference.d.mts +0 -1
- package/dist/services/fix/strategies/remove-reference.d.mts.map +1 -1
- package/dist/services/fix/types.d.mts +0 -1
- package/dist/services/fix/types.d.mts.map +1 -1
- package/dist/services/formatter.d.mts.map +1 -1
- package/dist/services/gap.d.mts.map +1 -1
- package/dist/services/generate-artifacts.d.mts.map +1 -1
- package/dist/services/hooks/hooks-service.d.mts +0 -1
- package/dist/services/hooks/hooks-service.d.mts.map +1 -1
- package/dist/services/hooks/index.d.mts.map +1 -1
- package/dist/services/hooks/index.mjs +1 -1
- package/dist/services/hooks/types.d.mts.map +1 -1
- package/dist/services/impact/formatters.d.mts +0 -1
- package/dist/services/impact/formatters.d.mts.map +1 -1
- package/dist/services/impact/impact-detection-service.d.mts +0 -1
- package/dist/services/impact/impact-detection-service.d.mts.map +1 -1
- package/dist/services/impact/index.d.mts.map +1 -1
- package/dist/services/impact/index.mjs +1 -1
- package/dist/services/impact/types.d.mts +0 -1
- package/dist/services/impact/types.d.mts.map +1 -1
- package/dist/services/implementation/discovery.d.mts +0 -1
- package/dist/services/implementation/discovery.d.mts.map +1 -1
- package/dist/services/implementation/resolver/conventions.d.mts +0 -1
- package/dist/services/implementation/resolver/conventions.d.mts.map +1 -1
- package/dist/services/implementation/resolver/index.d.mts +0 -1
- package/dist/services/implementation/resolver/index.d.mts.map +1 -1
- package/dist/services/implementation/resolver/index.mjs +7 -7
- package/dist/services/implementation/resolver/index.mjs.map +1 -1
- package/dist/services/implementation/resolver/parsers.d.mts +0 -1
- package/dist/services/implementation/resolver/parsers.d.mts.map +1 -1
- package/dist/services/implementation/resolver/parsers.mjs +6 -6
- package/dist/services/implementation/resolver/parsers.mjs.map +1 -1
- package/dist/services/implementation/resolver/status.d.mts +0 -1
- package/dist/services/implementation/resolver/status.d.mts.map +1 -1
- package/dist/services/implementation/types.d.mts +0 -1
- package/dist/services/implementation/types.d.mts.map +1 -1
- package/dist/services/import/import-service.d.mts +0 -1
- package/dist/services/import/import-service.d.mts.map +1 -1
- package/dist/services/import/import-service.mjs +3 -3
- package/dist/services/import/import-service.mjs.map +1 -1
- package/dist/services/import/report-service.d.mts +0 -1
- package/dist/services/import/report-service.d.mts.map +1 -1
- package/dist/services/import/verify-service.d.mts +0 -1
- package/dist/services/import/verify-service.d.mts.map +1 -1
- package/dist/services/integrity-diagram.d.mts +0 -1
- package/dist/services/integrity-diagram.d.mts.map +1 -1
- package/dist/services/integrity.d.mts +0 -1
- package/dist/services/integrity.d.mts.map +1 -1
- package/dist/services/layer-discovery.d.mts +0 -1
- package/dist/services/layer-discovery.d.mts.map +1 -1
- package/dist/services/list.d.mts +0 -1
- package/dist/services/list.d.mts.map +1 -1
- package/dist/services/llm/index.d.mts +0 -1
- package/dist/services/llm/index.d.mts.map +1 -1
- package/dist/services/llm/index.mjs +0 -1
- package/dist/services/llm/index.mjs.map +1 -1
- package/dist/services/llm/verify-static.d.mts +0 -1
- package/dist/services/llm/verify-static.d.mts.map +1 -1
- package/dist/services/openapi/export-service.d.mts +0 -1
- package/dist/services/openapi/export-service.d.mts.map +1 -1
- package/dist/services/openapi/import-service.d.mts +0 -1
- package/dist/services/openapi/import-service.d.mts.map +1 -1
- package/dist/services/openapi/import-service.mjs +1 -1
- package/dist/services/openapi/import-service.mjs.map +1 -1
- package/dist/services/openapi/sync-service.d.mts +0 -1
- package/dist/services/openapi/sync-service.d.mts.map +1 -1
- package/dist/services/openapi/sync-service.mjs +1 -1
- package/dist/services/openapi/sync-service.mjs.map +1 -1
- package/dist/services/openapi/types.d.mts +0 -1
- package/dist/services/openapi/types.d.mts.map +1 -1
- package/dist/services/openapi/validate-service.d.mts +0 -1
- package/dist/services/openapi/validate-service.d.mts.map +1 -1
- package/dist/services/openapi/validate-service.mjs +3 -3
- package/dist/services/openapi/validate-service.mjs.map +1 -1
- package/dist/services/quickstart/dependencies.d.mts +0 -1
- package/dist/services/quickstart/dependencies.d.mts.map +1 -1
- package/dist/services/quickstart/quickstart-service.d.mts +0 -1
- package/dist/services/quickstart/quickstart-service.d.mts.map +1 -1
- package/dist/services/quickstart/types.d.mts.map +1 -1
- package/dist/services/regenerator.d.mts +0 -1
- package/dist/services/regenerator.d.mts.map +1 -1
- package/dist/services/registry.d.mts +0 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/rulesync.d.mts +0 -1
- package/dist/services/rulesync.d.mts.map +1 -1
- package/dist/services/setup/config-generators.d.mts +0 -1
- package/dist/services/setup/config-generators.d.mts.map +1 -1
- package/dist/services/setup/file-merger.d.mts.map +1 -1
- package/dist/services/setup/setup-service.d.mts +0 -1
- package/dist/services/setup/setup-service.d.mts.map +1 -1
- package/dist/services/setup/types.d.mts.map +1 -1
- package/dist/services/sync.d.mts +0 -1
- package/dist/services/sync.d.mts.map +1 -1
- package/dist/services/test/test-generator-service.d.mts +1 -2
- package/dist/services/test/test-generator-service.d.mts.map +1 -1
- package/dist/services/test/test-service.d.mts.map +1 -1
- package/dist/services/test-link/index.d.mts +0 -1
- package/dist/services/test-link/index.d.mts.map +1 -1
- package/dist/services/upgrade/index.d.mts.map +1 -1
- package/dist/services/upgrade/index.mjs +1 -1
- package/dist/services/upgrade/types.d.mts.map +1 -1
- package/dist/services/upgrade/upgrade-service.d.mts +0 -1
- package/dist/services/upgrade/upgrade-service.d.mts.map +1 -1
- package/dist/services/validate/blueprint-validator.d.mts +0 -1
- package/dist/services/validate/blueprint-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-agent-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-agent-validator.mjs +2 -2
- package/dist/services/validate/implementation-agent-validator.mjs.map +1 -1
- package/dist/services/validate/implementation-validator.d.mts +0 -1
- package/dist/services/validate/implementation-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-validator.mjs +1 -1
- package/dist/services/validate/implementation-validator.mjs.map +1 -1
- package/dist/services/validate/spec-validator.d.mts +0 -1
- package/dist/services/validate/spec-validator.d.mts.map +1 -1
- package/dist/services/validate/tenant-validator.d.mts.map +1 -1
- package/dist/services/validate/tenant-validator.mjs +5 -5
- package/dist/services/validate/tenant-validator.mjs.map +1 -1
- package/dist/services/verification-cache/adapters/filesystem.d.mts +0 -1
- package/dist/services/verification-cache/adapters/filesystem.d.mts.map +1 -1
- package/dist/services/verification-cache/adapters/in-memory.d.mts +0 -1
- package/dist/services/verification-cache/adapters/in-memory.d.mts.map +1 -1
- package/dist/services/verification-cache/adapters/workspace-state.d.mts +0 -1
- package/dist/services/verification-cache/adapters/workspace-state.d.mts.map +1 -1
- package/dist/services/verification-cache/cache-service.d.mts +0 -1
- package/dist/services/verification-cache/cache-service.d.mts.map +1 -1
- package/dist/services/verification-cache/types.d.mts +0 -1
- package/dist/services/verification-cache/types.d.mts.map +1 -1
- package/dist/services/verify/ai-verifier.d.mts +0 -1
- package/dist/services/verify/ai-verifier.d.mts.map +1 -1
- package/dist/services/verify/behavior-verifier.d.mts +0 -1
- package/dist/services/verify/behavior-verifier.d.mts.map +1 -1
- package/dist/services/verify/structure-verifier.d.mts +0 -1
- package/dist/services/verify/structure-verifier.d.mts.map +1 -1
- package/dist/services/verify/types.d.mts +0 -1
- package/dist/services/verify/types.d.mts.map +1 -1
- package/dist/services/verify/verify-service.d.mts +0 -1
- package/dist/services/verify/verify-service.d.mts.map +1 -1
- package/dist/services/versioning/changelog-formatter.d.mts +0 -1
- package/dist/services/versioning/changelog-formatter.d.mts.map +1 -1
- package/dist/services/versioning/conventional-commits.d.mts +0 -1
- package/dist/services/versioning/conventional-commits.d.mts.map +1 -1
- package/dist/services/versioning/index.d.mts.map +1 -1
- package/dist/services/versioning/index.mjs +1 -1
- package/dist/services/versioning/types.d.mts +0 -1
- package/dist/services/versioning/types.d.mts.map +1 -1
- package/dist/services/versioning/versioning-service.d.mts +0 -1
- package/dist/services/versioning/versioning-service.d.mts.map +1 -1
- package/dist/services/versioning/versioning-service.mjs +1 -1
- package/dist/services/versioning/versioning-service.mjs.map +1 -1
- package/dist/services/vibe/config.d.mts +0 -1
- package/dist/services/vibe/config.d.mts.map +1 -1
- package/dist/services/vibe/context.d.mts.map +1 -1
- package/dist/services/vibe/definitions.d.mts +0 -1
- package/dist/services/vibe/definitions.d.mts.map +1 -1
- package/dist/services/vibe/engine.d.mts +0 -1
- package/dist/services/vibe/engine.d.mts.map +1 -1
- package/dist/services/vibe/index.d.mts.map +1 -1
- package/dist/services/vibe/index.mjs +1 -1
- package/dist/services/vibe/loader.d.mts +0 -1
- package/dist/services/vibe/loader.d.mts.map +1 -1
- package/dist/services/vibe/pack.d.mts.map +1 -1
- package/dist/services/vibe/types.d.mts.map +1 -1
- package/dist/services/view/index.d.mts.map +1 -1
- package/dist/services/watch.d.mts +0 -1
- package/dist/services/watch.d.mts.map +1 -1
- package/dist/services/workspace-info.d.mts +0 -1
- package/dist/services/workspace-info.d.mts.map +1 -1
- package/dist/templates/app-config.template.d.mts.map +1 -1
- package/dist/templates/data-view.template.d.mts.map +1 -1
- package/dist/templates/event.template.d.mts +0 -1
- package/dist/templates/event.template.d.mts.map +1 -1
- package/dist/templates/experiment.template.d.mts.map +1 -1
- package/dist/templates/feature.template.d.mts.map +1 -1
- package/dist/templates/handler.template.d.mts.map +1 -1
- package/dist/templates/index.d.mts.map +1 -1
- package/dist/templates/index.mjs +1 -1
- package/dist/templates/integration.template.d.mts.map +1 -1
- package/dist/templates/integration.template.mjs +0 -3
- package/dist/templates/integration.template.mjs.map +1 -1
- package/dist/templates/knowledge.template.d.mts.map +1 -1
- package/dist/templates/knowledge.template.mjs +0 -1
- package/dist/templates/knowledge.template.mjs.map +1 -1
- package/dist/templates/migration.template.d.mts.map +1 -1
- package/dist/templates/migration.template.mjs +0 -1
- package/dist/templates/migration.template.mjs.map +1 -1
- package/dist/templates/operation.template.d.mts +0 -1
- package/dist/templates/operation.template.d.mts.map +1 -1
- package/dist/templates/presentation.template.d.mts +0 -1
- package/dist/templates/presentation.template.d.mts.map +1 -1
- package/dist/templates/telemetry.template.d.mts.map +1 -1
- package/dist/templates/workflow-runner.template.d.mts.map +1 -1
- package/dist/templates/workflow.template.d.mts.map +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/utils/filter.d.mts +0 -1
- package/dist/utils/filter.d.mts.map +1 -1
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/module-loader.d.mts.map +1 -1
- package/dist/utils/validation.d.mts +0 -1
- package/dist/utils/validation.d.mts.map +1 -1
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-validator.d.mts","names":[],"sources":["../../../src/services/validate/spec-validator.ts"],"
|
|
1
|
+
{"version":3,"file":"spec-validator.d.mts","names":[],"sources":["../../../src/services/validate/spec-validator.ts"],"mappings":";;;;;;;;UAeiB,mBAAA;EAUA;;;EANf,aAAA;AAAA;;;;UAMe,kBAAA;EACf,KAAA;EACA,eAAA,GAAkB,gBAAA;EAClB,MAAA;EACA,QAAA;EACA,IAAA;AAAA;;;;iBAMoB,YAAA,CACpB,YAAA,UACA,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,GACnC,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,kBAAA;;;;iBA0CW,aAAA,CACpB,SAAA,YACA,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,GACnC,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,GAAA,SAAY,kBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-validator.d.mts","names":[],"sources":["../../../src/services/validate/tenant-validator.ts"],"
|
|
1
|
+
{"version":3,"file":"tenant-validator.d.mts","names":[],"sources":["../../../src/services/validate/tenant-validator.ts"],"mappings":";;;;UAaiB,sBAAA;EACf,MAAA,GAAS,eAAA;EACT,MAAA,GAAS,UAAA,QAAkB,cAAA;EAC3B,KAAA;EACA,MAAA;AAAA;AAAA,UAGe,uBAAA;EACf,WAAA;EACA,qBAAA;EACA,kBAAA;AAAA;AAAA,iBAGoB,oBAAA,CACpB,SAAA,EAAW,gBAAA,EACX,UAAA,UACA,cAAA,EAAgB,uBAAA,EAChB,QAAA;EAAY,EAAA,EAAI,SAAA;AAAA,IACf,OAAA,CAAQ,sBAAA"}
|
|
@@ -67,8 +67,8 @@ async function loadIntegrationConnections(value, fs) {
|
|
|
67
67
|
const paths = normalizePathOption(value);
|
|
68
68
|
if (!paths.length) return [];
|
|
69
69
|
const results = [];
|
|
70
|
-
for (const path
|
|
71
|
-
const resolved = resolve(process.cwd(), path
|
|
70
|
+
for (const path of paths) {
|
|
71
|
+
const resolved = resolve(process.cwd(), path);
|
|
72
72
|
if (!await fs.exists(resolved)) {
|
|
73
73
|
console.warn(`Warning: Connection file not found: ${resolved}`);
|
|
74
74
|
continue;
|
|
@@ -99,9 +99,9 @@ function collectConnections(value) {
|
|
|
99
99
|
function isIntegrationConnection(value) {
|
|
100
100
|
return typeof value === "object" && value !== null && "meta" in value && typeof value.meta?.id === "string" && typeof value.secretRef === "string";
|
|
101
101
|
}
|
|
102
|
-
async function loadTranslationCatalog(path
|
|
103
|
-
if (!path
|
|
104
|
-
const resolved = resolve(process.cwd(), path
|
|
102
|
+
async function loadTranslationCatalog(path, fs) {
|
|
103
|
+
if (!path) return void 0;
|
|
104
|
+
const resolved = resolve(process.cwd(), path);
|
|
105
105
|
if (!await fs.exists(resolved)) return void 0;
|
|
106
106
|
if (resolved.endsWith(".json")) {
|
|
107
107
|
const raw = await readFile(resolved, "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-validator.mjs","names":["validateTenantConfigSpecs","path"],"sources":["../../../src/services/validate/tenant-validator.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { readFile } from 'fs/promises';\nimport { pathToFileURL } from 'url';\nimport {\n validateConfig as validateTenantConfigSpecs,\n type AppBlueprintSpec,\n type TenantAppConfig,\n type IntegrationSpecRegistry,\n type BlueprintTranslationCatalog,\n type IntegrationConnection,\n} from '@contractspec/lib.contracts';\nimport type { FsAdapter } from '../../ports/fs';\n\nexport interface TenantValidationResult {\n config?: TenantAppConfig;\n report?: ReturnType<typeof validateTenantConfigSpecs>;\n valid: boolean;\n errors: string[];\n}\n\nexport interface TenantValidationContext {\n connections?: string[] | string;\n integrationRegistrars?: string[] | string;\n translationCatalog?: string;\n}\n\nexport async function validateTenantConfig(\n blueprint: AppBlueprintSpec,\n tenantPath: string,\n contextOptions: TenantValidationContext,\n adapters: { fs: FsAdapter }\n): Promise<TenantValidationResult> {\n const { fs } = adapters;\n const resolvedPath = resolve(process.cwd(), tenantPath);\n\n if (!(await fs.exists(resolvedPath))) {\n return {\n valid: false,\n errors: [`Tenant config file not found: ${resolvedPath}`],\n };\n }\n\n try {\n const tenant = await loadTenantConfig(resolvedPath);\n const connections = await loadIntegrationConnections(\n contextOptions.connections,\n fs\n );\n const catalog = await loadTranslationCatalog(\n contextOptions.translationCatalog,\n fs\n );\n const integrationSpecs = await loadIntegrationRegistrars(\n contextOptions.integrationRegistrars\n );\n\n const context: Parameters<typeof validateTenantConfigSpecs>[2] = {};\n if (connections.length > 0) {\n context.tenantConnections = connections;\n }\n if (catalog) {\n context.translationCatalogs = {\n blueprint: [catalog],\n platform: [],\n };\n }\n if (integrationSpecs) {\n context.integrationSpecs = integrationSpecs;\n }\n\n const report = validateTenantConfigSpecs(blueprint, tenant, context);\n\n return {\n config: tenant,\n report,\n valid: report.valid,\n errors: report.errors.map((e) => `[${e.code}] ${e.path}: ${e.message}`),\n };\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n}\n\n// Helpers\n\nasync function loadTenantConfig(tenantPath: string): Promise<TenantAppConfig> {\n if (tenantPath.endsWith('.json')) {\n const raw = await readFile(tenantPath, 'utf-8');\n const json = JSON.parse(raw);\n if (!isTenantConfig(json)) {\n throw new Error(\n 'Tenant config JSON does not match the expected structure (missing meta).'\n );\n }\n return json;\n }\n\n const mod = await loadModule(tenantPath);\n const candidates = Object.values(mod).filter(isTenantConfig);\n if (candidates.length === 0) {\n throw new Error('Tenant config module does not export a TenantAppConfig.');\n }\n return candidates[0] as TenantAppConfig;\n}\n\nfunction isTenantConfig(value: unknown): value is TenantAppConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as TenantAppConfig).meta?.tenantId === 'string'\n );\n}\n\n// Basic module loader\nasync function loadModule(\n modulePath: string\n): Promise<Record<string, unknown>> {\n try {\n const url = pathToFileURL(modulePath).href;\n const mod = await import(url);\n return mod;\n } catch (error) {\n throw new Error(`Failed to load module at ${modulePath}: ${error}`);\n }\n}\n\n// --- Connection Loaders ---\n\nfunction normalizePathOption(value?: string | string[]): string[] {\n if (!value) return [];\n const values = Array.isArray(value) ? value : value.split(',');\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nasync function loadIntegrationConnections(\n value: string | string[] | undefined,\n fs: FsAdapter\n): Promise<IntegrationConnection[]> {\n const paths = normalizePathOption(value);\n if (!paths.length) return [];\n\n const results: IntegrationConnection[] = [];\n for (const path of paths) {\n const resolved = resolve(process.cwd(), path);\n if (!(await fs.exists(resolved))) {\n console.warn(`Warning: Connection file not found: ${resolved}`);\n continue;\n }\n\n if (resolved.endsWith('.json')) {\n const raw = await readFile(resolved, 'utf-8');\n const parsed = JSON.parse(raw);\n results.push(...collectConnections(parsed));\n continue;\n }\n\n const mod = await loadModule(resolved);\n results.push(...collectConnections(mod));\n }\n return results;\n}\n\nfunction collectConnections(value: unknown): IntegrationConnection[] {\n if (Array.isArray(value)) {\n const connections = value.filter(isIntegrationConnection);\n if (connections.length) return connections;\n }\n if (isIntegrationConnection(value)) {\n return [value];\n }\n if (value && typeof value === 'object') {\n const entries = Object.values(value as Record<string, unknown>);\n const collected = entries.flatMap((entry) => collectConnections(entry));\n if (collected.length) return collected;\n }\n return [];\n}\n\nfunction isIntegrationConnection(\n value: unknown\n): value is IntegrationConnection {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as IntegrationConnection).meta?.id === 'string' &&\n typeof (value as IntegrationConnection).secretRef === 'string'\n );\n}\n\n// --- Translation Catalog Loaders ---\n\nasync function loadTranslationCatalog(\n path: string | undefined,\n fs: FsAdapter\n): Promise<BlueprintTranslationCatalog | undefined> {\n if (!path) return undefined;\n const resolved = resolve(process.cwd(), path);\n if (!(await fs.exists(resolved))) return undefined;\n\n if (resolved.endsWith('.json')) {\n const raw = await readFile(resolved, 'utf-8');\n const parsed = JSON.parse(raw);\n if (isBlueprintTranslationCatalog(parsed)) {\n return normaliseTranslationCatalog(parsed);\n }\n return undefined;\n }\n\n const mod = await loadModule(resolved);\n const catalogs = Object.values(mod).filter(isBlueprintTranslationCatalog);\n if (catalogs.length === 0) return undefined;\n return normaliseTranslationCatalog(\n catalogs[0] as BlueprintTranslationCatalog\n );\n}\n\nfunction isBlueprintTranslationCatalog(\n value: unknown\n): value is BlueprintTranslationCatalog {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as BlueprintTranslationCatalog).meta?.key === 'string' &&\n typeof (value as BlueprintTranslationCatalog).meta?.version === 'string' &&\n Array.isArray((value as BlueprintTranslationCatalog).entries)\n );\n}\n\nfunction normaliseTranslationCatalog(\n catalog: BlueprintTranslationCatalog\n): BlueprintTranslationCatalog {\n const supportedLocales =\n catalog.supportedLocales && catalog.supportedLocales.length > 0\n ? catalog.supportedLocales\n : [catalog.defaultLocale];\n return {\n ...catalog,\n supportedLocales,\n };\n}\n\n// --- Registrar Loaders ---\n// Important: This needs IntegrationSpecRegistry which is a Class.\n// We only import type in signature, but need constructor.\n// Imports fixed at top.\n\nasync function loadIntegrationRegistrars(\n value?: string | string[]\n): Promise<IntegrationSpecRegistry | undefined> {\n const entries = normalizePathOption(value);\n if (!entries.length) return undefined;\n\n // We need to import the Class dynamically or have it available.\n // It is imported from @contractspec/lib.contracts\n const { IntegrationSpecRegistry } =\n await import('@contractspec/lib.contracts');\n const registry = new IntegrationSpecRegistry();\n\n for (const entry of entries) {\n const { modulePath, exportName } = parseRegistrarEntry(entry);\n if (!modulePath) continue;\n const resolved = resolve(process.cwd(), modulePath);\n // Logic simplified for brevity, assume module exists or handled by catch in loadModule\n try {\n const mod = await loadModule(resolved);\n const registrar = pickRegistrar(mod, exportName);\n if (registrar) {\n await registrar(registry);\n }\n } catch (e) {\n console.warn(`Failed to load registrar from ${resolved}: ${e}`);\n }\n }\n return registry;\n}\n\nfunction parseRegistrarEntry(entry: string): {\n modulePath: string | null;\n exportName?: string;\n} {\n if (!entry) return { modulePath: null };\n const [modulePathRaw, exportNameRaw] = entry.split('#');\n const modulePath = modulePathRaw?.trim() ?? null;\n const exportName = exportNameRaw?.trim();\n return { modulePath, exportName };\n}\n\nfunction pickRegistrar(\n mod: Record<string, unknown>,\n exportName?: string\n): ((registry: IntegrationSpecRegistry) => void | Promise<void>) | undefined {\n if (exportName) {\n const candidate = mod[exportName];\n if (typeof candidate === 'function') {\n return candidate as (\n registry: IntegrationSpecRegistry\n ) => void | Promise<void>;\n }\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (mod as any).default === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (mod as any).default;\n }\n for (const value of Object.values(mod)) {\n if (typeof value === 'function') {\n return value as (\n registry: IntegrationSpecRegistry\n ) => void | Promise<void>;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tenant-validator.mjs","names":["validateTenantConfigSpecs"],"sources":["../../../src/services/validate/tenant-validator.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { readFile } from 'fs/promises';\nimport { pathToFileURL } from 'url';\nimport {\n validateConfig as validateTenantConfigSpecs,\n type AppBlueprintSpec,\n type TenantAppConfig,\n type IntegrationSpecRegistry,\n type BlueprintTranslationCatalog,\n type IntegrationConnection,\n} from '@contractspec/lib.contracts';\nimport type { FsAdapter } from '../../ports/fs';\n\nexport interface TenantValidationResult {\n config?: TenantAppConfig;\n report?: ReturnType<typeof validateTenantConfigSpecs>;\n valid: boolean;\n errors: string[];\n}\n\nexport interface TenantValidationContext {\n connections?: string[] | string;\n integrationRegistrars?: string[] | string;\n translationCatalog?: string;\n}\n\nexport async function validateTenantConfig(\n blueprint: AppBlueprintSpec,\n tenantPath: string,\n contextOptions: TenantValidationContext,\n adapters: { fs: FsAdapter }\n): Promise<TenantValidationResult> {\n const { fs } = adapters;\n const resolvedPath = resolve(process.cwd(), tenantPath);\n\n if (!(await fs.exists(resolvedPath))) {\n return {\n valid: false,\n errors: [`Tenant config file not found: ${resolvedPath}`],\n };\n }\n\n try {\n const tenant = await loadTenantConfig(resolvedPath);\n const connections = await loadIntegrationConnections(\n contextOptions.connections,\n fs\n );\n const catalog = await loadTranslationCatalog(\n contextOptions.translationCatalog,\n fs\n );\n const integrationSpecs = await loadIntegrationRegistrars(\n contextOptions.integrationRegistrars\n );\n\n const context: Parameters<typeof validateTenantConfigSpecs>[2] = {};\n if (connections.length > 0) {\n context.tenantConnections = connections;\n }\n if (catalog) {\n context.translationCatalogs = {\n blueprint: [catalog],\n platform: [],\n };\n }\n if (integrationSpecs) {\n context.integrationSpecs = integrationSpecs;\n }\n\n const report = validateTenantConfigSpecs(blueprint, tenant, context);\n\n return {\n config: tenant,\n report,\n valid: report.valid,\n errors: report.errors.map((e) => `[${e.code}] ${e.path}: ${e.message}`),\n };\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n}\n\n// Helpers\n\nasync function loadTenantConfig(tenantPath: string): Promise<TenantAppConfig> {\n if (tenantPath.endsWith('.json')) {\n const raw = await readFile(tenantPath, 'utf-8');\n const json = JSON.parse(raw);\n if (!isTenantConfig(json)) {\n throw new Error(\n 'Tenant config JSON does not match the expected structure (missing meta).'\n );\n }\n return json;\n }\n\n const mod = await loadModule(tenantPath);\n const candidates = Object.values(mod).filter(isTenantConfig);\n if (candidates.length === 0) {\n throw new Error('Tenant config module does not export a TenantAppConfig.');\n }\n return candidates[0] as TenantAppConfig;\n}\n\nfunction isTenantConfig(value: unknown): value is TenantAppConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as TenantAppConfig).meta?.tenantId === 'string'\n );\n}\n\n// Basic module loader\nasync function loadModule(\n modulePath: string\n): Promise<Record<string, unknown>> {\n try {\n const url = pathToFileURL(modulePath).href;\n const mod = await import(url);\n return mod;\n } catch (error) {\n throw new Error(`Failed to load module at ${modulePath}: ${error}`);\n }\n}\n\n// --- Connection Loaders ---\n\nfunction normalizePathOption(value?: string | string[]): string[] {\n if (!value) return [];\n const values = Array.isArray(value) ? value : value.split(',');\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nasync function loadIntegrationConnections(\n value: string | string[] | undefined,\n fs: FsAdapter\n): Promise<IntegrationConnection[]> {\n const paths = normalizePathOption(value);\n if (!paths.length) return [];\n\n const results: IntegrationConnection[] = [];\n for (const path of paths) {\n const resolved = resolve(process.cwd(), path);\n if (!(await fs.exists(resolved))) {\n console.warn(`Warning: Connection file not found: ${resolved}`);\n continue;\n }\n\n if (resolved.endsWith('.json')) {\n const raw = await readFile(resolved, 'utf-8');\n const parsed = JSON.parse(raw);\n results.push(...collectConnections(parsed));\n continue;\n }\n\n const mod = await loadModule(resolved);\n results.push(...collectConnections(mod));\n }\n return results;\n}\n\nfunction collectConnections(value: unknown): IntegrationConnection[] {\n if (Array.isArray(value)) {\n const connections = value.filter(isIntegrationConnection);\n if (connections.length) return connections;\n }\n if (isIntegrationConnection(value)) {\n return [value];\n }\n if (value && typeof value === 'object') {\n const entries = Object.values(value as Record<string, unknown>);\n const collected = entries.flatMap((entry) => collectConnections(entry));\n if (collected.length) return collected;\n }\n return [];\n}\n\nfunction isIntegrationConnection(\n value: unknown\n): value is IntegrationConnection {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as IntegrationConnection).meta?.id === 'string' &&\n typeof (value as IntegrationConnection).secretRef === 'string'\n );\n}\n\n// --- Translation Catalog Loaders ---\n\nasync function loadTranslationCatalog(\n path: string | undefined,\n fs: FsAdapter\n): Promise<BlueprintTranslationCatalog | undefined> {\n if (!path) return undefined;\n const resolved = resolve(process.cwd(), path);\n if (!(await fs.exists(resolved))) return undefined;\n\n if (resolved.endsWith('.json')) {\n const raw = await readFile(resolved, 'utf-8');\n const parsed = JSON.parse(raw);\n if (isBlueprintTranslationCatalog(parsed)) {\n return normaliseTranslationCatalog(parsed);\n }\n return undefined;\n }\n\n const mod = await loadModule(resolved);\n const catalogs = Object.values(mod).filter(isBlueprintTranslationCatalog);\n if (catalogs.length === 0) return undefined;\n return normaliseTranslationCatalog(\n catalogs[0] as BlueprintTranslationCatalog\n );\n}\n\nfunction isBlueprintTranslationCatalog(\n value: unknown\n): value is BlueprintTranslationCatalog {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n typeof (value as BlueprintTranslationCatalog).meta?.key === 'string' &&\n typeof (value as BlueprintTranslationCatalog).meta?.version === 'string' &&\n Array.isArray((value as BlueprintTranslationCatalog).entries)\n );\n}\n\nfunction normaliseTranslationCatalog(\n catalog: BlueprintTranslationCatalog\n): BlueprintTranslationCatalog {\n const supportedLocales =\n catalog.supportedLocales && catalog.supportedLocales.length > 0\n ? catalog.supportedLocales\n : [catalog.defaultLocale];\n return {\n ...catalog,\n supportedLocales,\n };\n}\n\n// --- Registrar Loaders ---\n// Important: This needs IntegrationSpecRegistry which is a Class.\n// We only import type in signature, but need constructor.\n// Imports fixed at top.\n\nasync function loadIntegrationRegistrars(\n value?: string | string[]\n): Promise<IntegrationSpecRegistry | undefined> {\n const entries = normalizePathOption(value);\n if (!entries.length) return undefined;\n\n // We need to import the Class dynamically or have it available.\n // It is imported from @contractspec/lib.contracts\n const { IntegrationSpecRegistry } =\n await import('@contractspec/lib.contracts');\n const registry = new IntegrationSpecRegistry();\n\n for (const entry of entries) {\n const { modulePath, exportName } = parseRegistrarEntry(entry);\n if (!modulePath) continue;\n const resolved = resolve(process.cwd(), modulePath);\n // Logic simplified for brevity, assume module exists or handled by catch in loadModule\n try {\n const mod = await loadModule(resolved);\n const registrar = pickRegistrar(mod, exportName);\n if (registrar) {\n await registrar(registry);\n }\n } catch (e) {\n console.warn(`Failed to load registrar from ${resolved}: ${e}`);\n }\n }\n return registry;\n}\n\nfunction parseRegistrarEntry(entry: string): {\n modulePath: string | null;\n exportName?: string;\n} {\n if (!entry) return { modulePath: null };\n const [modulePathRaw, exportNameRaw] = entry.split('#');\n const modulePath = modulePathRaw?.trim() ?? null;\n const exportName = exportNameRaw?.trim();\n return { modulePath, exportName };\n}\n\nfunction pickRegistrar(\n mod: Record<string, unknown>,\n exportName?: string\n): ((registry: IntegrationSpecRegistry) => void | Promise<void>) | undefined {\n if (exportName) {\n const candidate = mod[exportName];\n if (typeof candidate === 'function') {\n return candidate as (\n registry: IntegrationSpecRegistry\n ) => void | Promise<void>;\n }\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (mod as any).default === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (mod as any).default;\n }\n for (const value of Object.values(mod)) {\n if (typeof value === 'function') {\n return value as (\n registry: IntegrationSpecRegistry\n ) => void | Promise<void>;\n }\n }\n return undefined;\n}\n"],"mappings":";;;;;;AA0BA,eAAsB,qBACpB,WACA,YACA,gBACA,UACiC;CACjC,MAAM,EAAE,OAAO;CACf,MAAM,eAAe,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAEvD,KAAI,CAAE,MAAM,GAAG,OAAO,aAAa,CACjC,QAAO;EACL,OAAO;EACP,QAAQ,CAAC,iCAAiC,eAAe;EAC1D;AAGH,KAAI;EACF,MAAM,SAAS,MAAM,iBAAiB,aAAa;EACnD,MAAM,cAAc,MAAM,2BACxB,eAAe,aACf,GACD;EACD,MAAM,UAAU,MAAM,uBACpB,eAAe,oBACf,GACD;EACD,MAAM,mBAAmB,MAAM,0BAC7B,eAAe,sBAChB;EAED,MAAM,UAA2D,EAAE;AACnE,MAAI,YAAY,SAAS,EACvB,SAAQ,oBAAoB;AAE9B,MAAI,QACF,SAAQ,sBAAsB;GAC5B,WAAW,CAAC,QAAQ;GACpB,UAAU,EAAE;GACb;AAEH,MAAI,iBACF,SAAQ,mBAAmB;EAG7B,MAAM,SAASA,eAA0B,WAAW,QAAQ,QAAQ;AAEpE,SAAO;GACL,QAAQ;GACR;GACA,OAAO,OAAO;GACd,QAAQ,OAAO,OAAO,KAAK,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,UAAU;GACxE;UACM,OAAO;AACd,SAAO;GACL,OAAO;GACP,QAAQ,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;GACjE;;;AAML,eAAe,iBAAiB,YAA8C;AAC5E,KAAI,WAAW,SAAS,QAAQ,EAAE;EAChC,MAAM,MAAM,MAAM,SAAS,YAAY,QAAQ;EAC/C,MAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,MAAI,CAAC,eAAe,KAAK,CACvB,OAAM,IAAI,MACR,2EACD;AAEH,SAAO;;CAGT,MAAM,MAAM,MAAM,WAAW,WAAW;CACxC,MAAM,aAAa,OAAO,OAAO,IAAI,CAAC,OAAO,eAAe;AAC5D,KAAI,WAAW,WAAW,EACxB,OAAM,IAAI,MAAM,0DAA0D;AAE5E,QAAO,WAAW;;AAGpB,SAAS,eAAe,OAA0C;AAChE,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAA0B,MAAM,aAAa;;AAKzD,eAAe,WACb,YACkC;AAClC,KAAI;AAGF,SADY,MAAM,OADN,cAAc,WAAW,CAAC;UAG/B,OAAO;AACd,QAAM,IAAI,MAAM,4BAA4B,WAAW,IAAI,QAAQ;;;AAMvE,SAAS,oBAAoB,OAAqC;AAChE,KAAI,CAAC,MAAO,QAAO,EAAE;AAErB,SADe,MAAM,QAAQ,MAAM,GAAG,QAAQ,MAAM,MAAM,IAAI,EAChD,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,OAAO,QAAQ;;AAG5D,eAAe,2BACb,OACA,IACkC;CAClC,MAAM,QAAQ,oBAAoB,MAAM;AACxC,KAAI,CAAC,MAAM,OAAQ,QAAO,EAAE;CAE5B,MAAM,UAAmC,EAAE;AAC3C,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,QAAQ,QAAQ,KAAK,EAAE,KAAK;AAC7C,MAAI,CAAE,MAAM,GAAG,OAAO,SAAS,EAAG;AAChC,WAAQ,KAAK,uCAAuC,WAAW;AAC/D;;AAGF,MAAI,SAAS,SAAS,QAAQ,EAAE;GAC9B,MAAM,MAAM,MAAM,SAAS,UAAU,QAAQ;GAC7C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,WAAQ,KAAK,GAAG,mBAAmB,OAAO,CAAC;AAC3C;;EAGF,MAAM,MAAM,MAAM,WAAW,SAAS;AACtC,UAAQ,KAAK,GAAG,mBAAmB,IAAI,CAAC;;AAE1C,QAAO;;AAGT,SAAS,mBAAmB,OAAyC;AACnE,KAAI,MAAM,QAAQ,MAAM,EAAE;EACxB,MAAM,cAAc,MAAM,OAAO,wBAAwB;AACzD,MAAI,YAAY,OAAQ,QAAO;;AAEjC,KAAI,wBAAwB,MAAM,CAChC,QAAO,CAAC,MAAM;AAEhB,KAAI,SAAS,OAAO,UAAU,UAAU;EAEtC,MAAM,YADU,OAAO,OAAO,MAAiC,CACrC,SAAS,UAAU,mBAAmB,MAAM,CAAC;AACvE,MAAI,UAAU,OAAQ,QAAO;;AAE/B,QAAO,EAAE;;AAGX,SAAS,wBACP,OACgC;AAChC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAAgC,MAAM,OAAO,YACrD,OAAQ,MAAgC,cAAc;;AAM1D,eAAe,uBACb,MACA,IACkD;AAClD,KAAI,CAAC,KAAM,QAAO;CAClB,MAAM,WAAW,QAAQ,QAAQ,KAAK,EAAE,KAAK;AAC7C,KAAI,CAAE,MAAM,GAAG,OAAO,SAAS,CAAG,QAAO;AAEzC,KAAI,SAAS,SAAS,QAAQ,EAAE;EAC9B,MAAM,MAAM,MAAM,SAAS,UAAU,QAAQ;EAC7C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,8BAA8B,OAAO,CACvC,QAAO,4BAA4B,OAAO;AAE5C;;CAGF,MAAM,MAAM,MAAM,WAAW,SAAS;CACtC,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,OAAO,8BAA8B;AACzE,KAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAO,4BACL,SAAS,GACV;;AAGH,SAAS,8BACP,OACsC;AACtC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAAsC,MAAM,QAAQ,YAC5D,OAAQ,MAAsC,MAAM,YAAY,YAChE,MAAM,QAAS,MAAsC,QAAQ;;AAIjE,SAAS,4BACP,SAC6B;CAC7B,MAAM,mBACJ,QAAQ,oBAAoB,QAAQ,iBAAiB,SAAS,IAC1D,QAAQ,mBACR,CAAC,QAAQ,cAAc;AAC7B,QAAO;EACL,GAAG;EACH;EACD;;AAQH,eAAe,0BACb,OAC8C;CAC9C,MAAM,UAAU,oBAAoB,MAAM;AAC1C,KAAI,CAAC,QAAQ,OAAQ,QAAO;CAI5B,MAAM,EAAE,4BACN,MAAM,OAAO;CACf,MAAM,WAAW,IAAI,yBAAyB;AAE9C,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,EAAE,YAAY,eAAe,oBAAoB,MAAM;AAC7D,MAAI,CAAC,WAAY;EACjB,MAAM,WAAW,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAEnD,MAAI;GAEF,MAAM,YAAY,cADN,MAAM,WAAW,SAAS,EACD,WAAW;AAChD,OAAI,UACF,OAAM,UAAU,SAAS;WAEpB,GAAG;AACV,WAAQ,KAAK,iCAAiC,SAAS,IAAI,IAAI;;;AAGnE,QAAO;;AAGT,SAAS,oBAAoB,OAG3B;AACA,KAAI,CAAC,MAAO,QAAO,EAAE,YAAY,MAAM;CACvC,MAAM,CAAC,eAAe,iBAAiB,MAAM,MAAM,IAAI;AAGvD,QAAO;EAAE,YAFU,eAAe,MAAM,IAAI;EAEvB,YADF,eAAe,MAAM;EACP;;AAGnC,SAAS,cACP,KACA,YAC2E;AAC3E,KAAI,YAAY;EACd,MAAM,YAAY,IAAI;AACtB,MAAI,OAAO,cAAc,WACvB,QAAO;AAIT;;AAGF,KAAI,OAAQ,IAAY,YAAY,WAElC,QAAQ,IAAY;AAEtB,MAAK,MAAM,SAAS,OAAO,OAAO,IAAI,CACpC,KAAI,OAAO,UAAU,WACnB,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/filesystem.ts"],"
|
|
1
|
+
{"version":3,"file":"filesystem.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/filesystem.ts"],"mappings":";;;;;;cAwCa,sBAAA,YAAkC,mBAAA;EAAA,QACrC,QAAA;EAAA,QACA,KAAA;EAAA,QACA,OAAA;cAEI,QAAA,WAAmB,aAAA;EAoFC;;;EAAA,QA1ExB,QAAA;EAwFO;;;EAAA,QA7DP,QAAA;EA4BF,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA,CAAQ,sBAAA;EAIlC,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,sBAAA,GAAyB,OAAA;EAMzD,MAAA,CAAO,GAAA,EAAK,cAAA,GAAiB,OAAA;EAS7B,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA;EAI1B,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA;EAIhB,KAAA,CAAA,GAAS,OAAA;EAMT,KAAA,CAAA,GAAS,OAAA;IAAU,UAAA;IAAoB,WAAA;EAAA;EAjC9B;;;EAqDf,KAAA,CAAA;EAjDM;;;EAwDN,MAAA,CAAA;AAAA;;;;iBAUc,4BAAA,CACd,QAAA,WACA,aAAA,YACC,sBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/in-memory.ts"],"
|
|
1
|
+
{"version":3,"file":"in-memory.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/in-memory.ts"],"mappings":";;;;;;cAgBa,oBAAA,YAAgC,mBAAA;EAAA,QACnC,KAAA;EAEF,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA,CAAQ,sBAAA;EAIlC,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,sBAAA,GAAyB,OAAA;EAIzD,MAAA,CAAO,GAAA,EAAK,cAAA,GAAiB,OAAA;EAI7B,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA;EAI1B,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA;EAIhB,KAAA,CAAA,GAAS,OAAA;EAIT,KAAA,CAAA,GAAS,OAAA;IAAU,UAAA;IAAoB,WAAA;EAAA;AAAA;;;;iBAkB/B,0BAAA,CAAA,GAA8B,oBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-state.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/workspace-state.ts"],"
|
|
1
|
+
{"version":3,"file":"workspace-state.d.mts","names":[],"sources":["../../../../src/services/verification-cache/adapters/workspace-state.ts"],"mappings":";;;;;;UAgBiB,aAAA;EACf,GAAA,IAAO,GAAA,WAAc,CAAA;EACrB,MAAA,CAAO,GAAA,UAAa,KAAA,YAAiB,QAAA;EACrC,IAAA;AAAA;;;;cAgBW,0BAAA,YAAsC,mBAAA;EAAA,QACzC,KAAA;EAAA,QACA,QAAA;cAEI,KAAA,EAAO,aAAA;EA+BJ;;;EAAA,QAvBP,YAAA;EA6B8B;;;EAAA,QAjBxB,YAAA;EAwCC;;;EAAA,QAjCP,aAAA;EAIF,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA,CAAQ,sBAAA;EAMlC,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,sBAAA,GAAyB,OAAA;EAUzD,MAAA,CAAO,GAAA,EAAK,cAAA,GAAiB,OAAA;EAa7B,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA;EAI1B,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA;EAIhB,KAAA,CAAA,GAAS,OAAA;EAYT,KAAA,CAAA,GAAS,OAAA;IAAU,UAAA;IAAoB,WAAA;EAAA;AAAA;;;;iBAU/B,gCAAA,CACd,KAAA,EAAO,aAAA,GACN,0BAAA"}
|
|
@@ -2,7 +2,6 @@ import { CacheKeyString, CacheLookupResult, CacheStats, CacheStorageAdapter, Ver
|
|
|
2
2
|
import { VerificationReport, VerificationTier } from "@contractspec/lib.contracts/llm";
|
|
3
3
|
|
|
4
4
|
//#region src/services/verification-cache/cache-service.d.ts
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* Compute SHA256 hash of content.
|
|
8
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-service.d.mts","names":[],"sources":["../../../src/services/verification-cache/cache-service.ts"],"
|
|
1
|
+
{"version":3,"file":"cache-service.d.mts","names":[],"sources":["../../../src/services/verification-cache/cache-service.ts"],"mappings":";;;;;AAiCA;;iBAPgB,kBAAA,CAAmB,OAAA;;;;iBAOnB,gBAAA,CAAiB,GAAA,EAAK,oBAAA,GAAuB,cAAA;;;AAiB7D;iBAAgB,gBAAA,CACd,GAAA,EAAK,cAAA,GACJ,oBAAA;;;;cAqDU,wBAAA;EAAA,QACH,OAAA;EAAA,QACA,MAAA;EAAA,QACA,KAAA;cAGN,OAAA,EAAS,mBAAA,EACT,MAAA,GAAQ,OAAA,CAAQ,uBAAA;EAPiB;;;EAiBnC,SAAA,CACE,WAAA,UACA,WAAA,UACA,IAAA,EAAM,gBAAA,EACN,cAAA,YACC,oBAAA;EAfO;;;EA2BJ,MAAA,CAAO,GAAA,EAAK,oBAAA,GAAuB,OAAA,CAAQ,iBAAA;EAAA;;;EA+C3C,KAAA,CACJ,GAAA,EAAK,oBAAA,EACL,MAAA,EAAQ,kBAAA,EACR,OAAA;IACE,YAAA;IACA,QAAA;IACA,QAAA;EAAA,IAED,OAAA;EAsFuB;;;;EA5DpB,iBAAA,CAAkB,QAAA,WAAmB,OAAA;EAjHnC;;;EAmJF,iBAAA,CAAkB,QAAA,WAAmB,OAAA;EA/IzC;;;EAiKI,KAAA,CAAA,GAAS,OAAA;EAtJf;;;EA8JM,QAAA,CAAA,GAAY,OAAA,CAAQ,UAAA;EA3JxB;;;EAAA,QAgLY,aAAA;AAAA;;;;iBAqCA,8BAAA,CACd,OAAA,EAAS,mBAAA,EACT,MAAA,GAAS,OAAA,CAAQ,uBAAA,IAChB,wBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/verification-cache/types.ts"],"
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/verification-cache/types.ts"],"mappings":";;;;;;UAYiB,oBAAA;EAIf;EAFA,QAAA;EAIM;EAFN,QAAA;EAIc;EAFd,IAAA,EAAM,gBAAA;EAQI;EANV,cAAA;AAAA;;;AAWF;KALY,cAAA;;;;UAKK,cAAA;EAMf;EAJA,SAAA;EAQA;EANA,SAAA;EAMQ;EAJR,YAAA;EAUqC;EARrC,QAAA;EAUK;EARL,QAAA;AAAA;;;;UAMe,sBAAA;EAIf;EAFA,GAAA,EAAK,oBAAA;EAIL;EAFA,MAAA,EAAQ,kBAAA;EAEY;EAApB,IAAA,EAAM,cAAA;AAAA;;;;KAMI,iBAAA;EACN,GAAA;EAAW,KAAA,EAAO,sBAAA;AAAA;EAClB,GAAA;EAAY,MAAA,EAAQ,eAAA;AAAA;;AAK1B;;KAAY,eAAA;;;AAWZ;UAAiB,UAAA;;EAEf,YAAA;EAAA;EAEA,IAAA;EAEA;EAAA,MAAA;EAIA;EAFA,OAAA;EAIU;EAFV,WAAA;EAQe;EANf,UAAA;AAAA;;;;UAMe,uBAAA;EAQf;EANA,UAAA;EAUA;EARA,YAAA;EAQsB;EANtB,cAAA;EAmBD;EAjBC,aAAA;EAUiC;EARjC,OAAA;EAoBe;EAlBf,sBAAA;AAAA;;;;cAMW,oBAAA,EAAsB,QAAA,CAAS,uBAAA;;;;UAY3B,mBAAA;EAQN;EANT,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA,CAAQ,sBAAA;EAQlB;EANhB,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,sBAAA,GAAyB,OAAA;EAQhD;EANT,MAAA,CAAO,GAAA,EAAK,cAAA,GAAiB,OAAA;EAQZ;EANjB,GAAA,CAAI,GAAA,EAAK,cAAA,GAAiB,OAAA;EAN1B;EAQA,IAAA,IAAQ,OAAA,CAAQ,cAAA;EARZ;EAUJ,KAAA,IAAS,OAAA;EAVyB;EAYlC,KAAA,KAAU,OAAA;IAAU,UAAA;IAAoB,WAAA;EAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-verifier.d.mts","names":[],"sources":["../../../src/services/verify/ai-verifier.ts"],"
|
|
1
|
+
{"version":3,"file":"ai-verifier.d.mts","names":[],"sources":["../../../src/services/verify/ai-verifier.ts"],"mappings":";;;;;;;iBAmLsB,YAAA,CACpB,KAAA,EAAO,WAAA,EACP,MAAA,GAAQ,YAAA,GACP,OAAA,CAAQ,kBAAA;;;;;iBA4DK,mBAAA,CAAoB,KAAA,EAAO,WAAA,GAAc,kBAAA;;;;iBAsPnC,oBAAA,CACpB,KAAA,EAAO,WAAA,EACP,MAAA,GAAQ,YAAA,GACP,OAAA,CAAQ,0BAAA;AAzPX;;;AAAA,iBA4QsB,oBAAA,CACpB,KAAA,EAAO,WAAA,EACP,MAAA,GAAQ,YAAA,GACP,OAAA,CAAQ,kBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior-verifier.d.mts","names":[],"sources":["../../../src/services/verify/behavior-verifier.ts"],"
|
|
1
|
+
{"version":3,"file":"behavior-verifier.d.mts","names":[],"sources":["../../../src/services/verify/behavior-verifier.ts"],"mappings":";;;;;;;iBAoQgB,cAAA,CAAe,KAAA,EAAO,WAAA,GAAc,kBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure-verifier.d.mts","names":[],"sources":["../../../src/services/verify/structure-verifier.ts"],"
|
|
1
|
+
{"version":3,"file":"structure-verifier.d.mts","names":[],"sources":["../../../src/services/verify/structure-verifier.ts"],"mappings":";;;;;;;iBA0PgB,eAAA,CAAgB,KAAA,EAAO,WAAA,GAAc,kBAAA"}
|
|
@@ -2,7 +2,6 @@ import { AnyOperationSpec } from "@contractspec/lib.contracts";
|
|
|
2
2
|
import { VerificationIssue, VerificationReport, VerificationTier } from "@contractspec/lib.contracts/llm";
|
|
3
3
|
|
|
4
4
|
//#region src/services/verify/types.d.ts
|
|
5
|
-
|
|
6
5
|
/** Configuration for the verification service */
|
|
7
6
|
interface VerifyConfig {
|
|
8
7
|
/** Enable verbose logging */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/verify/types.ts"],"
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/verify/types.ts"],"mappings":";;;;;UAYiB,YAAA;EAAY;EAE3B,OAAA;EAEA;EAAA,QAAA;EAEU;EAAV,UAAA;AAAA;;UAIe,aAAA;EAES;EAAxB,KAAA,GAAQ,gBAAA;EAAA;EAER,QAAA;EAEA;EAAA,kBAAA;AAAA;AAIF;AAAA,UAAiB,WAAA;;EAEf,IAAA,EAAM,gBAAA;EAAN;EAEA,kBAAA;EAAA;EAEA,kBAAA;AAAA;;UAIe,YAAA;EAAY;EAE3B,MAAA;EAIa;EAFb,KAAA;EAES;EAAT,OAAA,EAAS,GAAA,CAAI,gBAAA,EAAkB,kBAAA;EAEH;EAA5B,SAAA,EAAW,iBAAA;EANX;EAQA,OAAA;EAJA;EAMA,QAAA;AAAA;;UAIe,cAAA;EARJ;EAUX,IAAA;EANA;EAQA,MAAA;EARQ;EAUR,OAAA;EAN6B;EAQ7B,UAAA;AAAA;;UAIe,aAAA;EANf;EAQA,IAAA;EANU;EAQV,IAAA;EAJe;EAMf,MAAA;;EAEA,QAAA;EANA;EAQA,MAAA;EAJA;EAMA,OAAA;AAAA;;UAIe,cAAA;EAJR;EAMP,SAAA;EAF6B;EAI7B,UAAA;EAJ6B;EAM7B,QAAA;IACE,QAAA;IACA,QAAA;IACA,OAAA;IACA,QAAA;IACA,UAAA;EAAA;EAAA;EAGF,WAAA;AAAA;;KAIU,cAAA;;UAGK,YAAA;EAHS;EAKxB,SAAA;EAFe;EAIf,QAAA;;EAEA,mBAAA;EAJA;EAMA,kBAAA;EAFA;EAIA,KAAA,EAAO,cAAA;EAAP;EAEA,YAAA;EAAA;EAEA,UAAA;AAAA;;UAIe,eAAA;EAAe;EAE9B,KAAA;EAF8B;EAI9B,MAAA;EAAA;EAEA,WAAA;AAAA;;UAIe,0BAAA;EAA0B;EAEzC,aAAA,EAAe,YAAA;EAEiB;EAAhC,eAAA,EAAiB,eAAA;EAFF;EAIf,cAAA;IACE,QAAA;IACA,QAAA;IACA,OAAA;IACA,UAAA;EAAA;EAAA;EAGF,WAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-service.d.mts","names":[],"sources":["../../../src/services/verify/verify-service.ts"],"
|
|
1
|
+
{"version":3,"file":"verify-service.d.mts","names":[],"sources":["../../../src/services/verify/verify-service.ts"],"mappings":";;;;;;;;;;cAkCa,aAAA;EAAA,QACH,MAAA;cAEI,MAAA,GAAQ,OAAA,CAAQ,YAAA;EAsGzB;;;EA/FG,MAAA,CACJ,IAAA,EAAM,gBAAA,EACN,kBAAA,UACA,OAAA,GAAS,aAAA,GACR,OAAA,CAAQ,YAAA;EA2HH;;;EAnDR,eAAA,CACE,IAAA,EAAM,gBAAA,EACN,kBAAA,UACA,kBAAA,YACC,kBAAA;EAiIe;;;EAtHlB,cAAA,CACE,IAAA,EAAM,gBAAA,EACN,kBAAA,UACA,kBAAA,YACC,kBAAA;;;;EAWG,QAAA,CACJ,IAAA,EAAM,gBAAA,EACN,kBAAA,UACA,kBAAA,YACC,OAAA,CAAQ,kBAAA;EA9GL;;;EA8HN,WAAA,CACE,IAAA,EAAM,gBAAA,EACN,kBAAA,WACC,kBAAA;EA9HQ;;;EAqIX,gBAAA,CAAiB,MAAA,EAAQ,YAAA;EA5DzB;;;EAqIA,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,YAAA;EAlIxB;;;EAAA,QAyIM,eAAA;EA5HN;;;EAAA,QA2KM,cAAA;AAAA;;;;iBAiBM,mBAAA,CACd,MAAA,GAAS,OAAA,CAAQ,YAAA,IAChB,aAAA;;cAKU,aAAA,EAAa,aAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changelog-formatter.d.mts","names":[],"sources":["../../../src/services/versioning/changelog-formatter.ts"],"
|
|
1
|
+
{"version":3,"file":"changelog-formatter.d.mts","names":[],"sources":["../../../src/services/versioning/changelog-formatter.ts"],"mappings":";;;;;AA+HA;;;;iBA5GgB,oBAAA,CAAqB,OAAA,EAAS,cAAA;AA+J9C;;;;;AAAA,iBAnDgB,2BAAA,CAA4B,OAAA,EAAS,cAAA;;;;iBAmDrC,mBAAA,CACd,QAAA,EAAU,oBAAA,EACV,QAAA,YACC,mBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventional-commits.d.mts","names":[],"sources":["../../../src/services/versioning/conventional-commits.ts"],"
|
|
1
|
+
{"version":3,"file":"conventional-commits.d.mts","names":[],"sources":["../../../src/services/versioning/conventional-commits.ts"],"mappings":";;;;;AA2CA;UApBiB,kBAAA;;EAEf,IAAA;EAkB4D;EAhB5D,KAAA;EAgDD;EA9CC,QAAA;EAkCoC;EAhCpC,WAAA;EAyEc;EAvEd,IAAA;;EAEA,mBAAA;EAuEmB;EArEnB,GAAA;AAAA;;;;KAMU,iBAAA,GAAoB,MAAA,SAAe,eAAA;;;;;;;;;;;;;;;cAoBlC,uBAAA,EAAyB,iBAAA;;;;;;;iBAyCtB,uBAAA,CACd,OAAA,WACC,kBAAA;;;;iBAwCa,oBAAA,CAAqB,OAAA;;;;AA2ErC;;;;iBA5DgB,qBAAA,CACd,MAAA,EAAQ,kBAAA,EACR,OAAA,GAAS,iBAAA,GACR,eAAA;;;;;AA6GH;;;iBA5FgB,kBAAA,CACd,OAAA,EAAS,kBAAA,IACT,OAAA,GAAS,iBAAA,GACR,eAAA;;;;;;AA0GH;iBArEgB,mBAAA,CAAoB,MAAA,EAAQ,kBAAA,GAAqB,WAAA;;;;iBAoDjD,sBAAA,CACd,OAAA,EAAS,kBAAA,KACR,WAAA;;;;;AAyBH;;;iBAVgB,oBAAA,CACd,OAAA,EAAS,kBAAA,IACT,KAAA,WACC,kBAAA;;;;iBAOa,qBAAA,CACd,OAAA,EAAS,kBAAA,IACT,OAAA,GAAS,iBAAA,GACR,kBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/versioning/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/versioning/index.ts"],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exportAll } from "../../_virtual/
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
|
|
2
2
|
import { formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog } from "./changelog-formatter.mjs";
|
|
3
3
|
import { DEFAULT_COMMIT_TYPE_MAP, commitToChangeEntry, commitsToChangeEntries, filterBumpableCommits, filterCommitsByScope, getBumpTypeFromCommit, getHighestBumpType, isConventionalCommit, parseConventionalCommit } from "./conventional-commits.mjs";
|
|
4
4
|
import { analyzeVersions, analyzeVersionsFromCommits, applyVersionBump, generateChangelogs } from "./versioning-service.mjs";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ChangeEntry as ChangeEntry$1, ChangelogDocBlock, ChangelogEntry as ChangelogEntry$1, ChangelogTier, VersionBumpType as VersionBumpType$1, VersioningConfig } from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/services/versioning/types.d.ts
|
|
4
|
-
|
|
5
4
|
/** Options for version analysis */
|
|
6
5
|
interface VersionAnalyzeOptions {
|
|
7
6
|
/** Git ref to compare against (branch, tag, commit) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/versioning/types.ts"],"
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/versioning/types.ts"],"mappings":";;;;UA8BiB,qBAAA;EAQf;EANA,QAAA;EAQO;EANP,OAAA;EAUe;EARf,aAAA;;EAEA,OAAA;EAcU;EAZV,OAAA;AAAA;;UAIe,kBAAA;EAIf;EAFA,QAAA;EAIA;EAFA,QAAA,GAAW,iBAAA;EAID;EAFV,iBAAA;EAMA;EAJA,OAAA,GAAU,aAAA;EAIe;EAFzB,MAAA;EAMe;EAJf,MAAA,GAAS,gBAAA;AAAA;;UAIM,wBAAA;EAIf;EAFA,QAAA;EAIQ;EAFR,aAAA;EAMA;EAJA,KAAA,GAAQ,aAAA;EAIA;EAFR,MAAA;EAUkC;EARlC,QAAA;AAAA;;UAQe,mBAAA;EAMf;EAJA,QAAA;EAQA;EANA,OAAA;EAQA;EANA,cAAA;EAQA;EANA,gBAAA;EAQS;EANT,QAAA,EAAU,iBAAA;EAUK;EARf,OAAA,EAAS,aAAA;;EAET,WAAA;EAQA;EANA,SAAA;AAAA;;UAIe,oBAAA;EAUf;EARA,QAAA,EAAU,mBAAA;EAUF;EARR,UAAA;EAYe;EAVf,gBAAA;;EAEA,aAAA;EAUA;EARA,gBAAA;EAYA;EAVA,QAAA;AAAA;;UAIe,iBAAA;EAcf;EAZA,OAAA;EAcA;EAZA,QAAA;EAYK;EAVL,OAAA;EAcsC;EAZtC,eAAA;EAcgB;EAZhB,UAAA;EAkBM;EAhBN,QAAA,EAAU,iBAAA;EAgBe;EAdzB,cAAA,EAAgB,gBAAA;EAQA;EANhB,KAAA;AAAA;;UAIe,uBAAA;EAQT;EANN,cAAA,EAAgB,iBAAA;EAQJ;EANZ,eAAA,EAAiB,GAAA;EAUF;EARf,gBAAA;;EAEA,IAAA,EAAM,mBAAA;EAON;EALA,YAAA;AAAA;;UAIe,mBAAA;EACf,WAAA;EACA,QAAA;EACA,KAAA,EAAO,iBAAA;EACP,SAAA,EAAW,oBAAA;AAAA;;UAII,iBAAA;EACf,GAAA;EACA,OAAA;EACA,IAAA;EACA,OAAA,EAAS,gBAAA;AAAA;;UAIM,oBAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;EACA,OAAA,EAAS,gBAAA;AAAA"}
|
|
@@ -5,7 +5,6 @@ import { ChangelogGenerateOptions, ChangelogGenerateResult, VersionAnalyzeOption
|
|
|
5
5
|
import { ChangeEntry, VersionBumpType } from "@contractspec/lib.contracts";
|
|
6
6
|
|
|
7
7
|
//#region src/services/versioning/versioning-service.d.ts
|
|
8
|
-
|
|
9
8
|
interface ServiceAdapters {
|
|
10
9
|
fs: FsAdapter;
|
|
11
10
|
git: GitAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versioning-service.d.mts","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"
|
|
1
|
+
{"version":3,"file":"versioning-service.d.mts","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"mappings":";;;;;;;UA0CU,eAAA;EACR,EAAA,EAAI,SAAA;EACJ,GAAA,EAAK,UAAA;EACL,MAAA,EAAQ,aAAA;AAAA;;;;;;;iBAaY,eAAA,CACpB,QAAA,EAAU,eAAA,EACV,OAAA,GAAS,qBAAA,GACR,OAAA,CAAQ,oBAAA;AAHX;;;AAAA,UAwGiB,oBAAA;EAtGN;EAwGT,QAAA;EAvGC;EAyGD,aAAA;EAzGQ;EA2GR,OAAA;EA7GA;EA+GA,OAAA;AAAA;;;;UAMe,mBAAA;EAdA;EAgBf,iBAAA,EAAmB,eAAA;;EAEnB,OAAA;IACE,IAAA;IACA,OAAA;IACA,IAAA;IACA,KAAA;IACA,QAAA;EAAA;EATa;EAYf,OAAA,EAAS,WAAA;;EAET,YAAA;EAZA;EAcA,eAAA;AAAA;;;;;;;iBASoB,0BAAA,CACpB,QAAA,EAAU,eAAA,EACV,OAAA,GAAS,oBAAA,GACR,OAAA,CAAQ,mBAAA;;;;;AAHX;iBAwEsB,gBAAA,CACpB,QAAA,EAAU,eAAA,EACV,OAAA,EAAS,kBAAA,GACR,OAAA,CAAQ,iBAAA;;;;iBA6GW,kBAAA,CACpB,QAAA,EAAU,eAAA,EACV,OAAA,GAAS,wBAAA,GACR,OAAA,CAAQ,uBAAA"}
|
|
@@ -351,7 +351,7 @@ function extractFields(code) {
|
|
|
351
351
|
* Update version in spec content.
|
|
352
352
|
*/
|
|
353
353
|
function updateSpecVersion(content, oldVersion, newVersion) {
|
|
354
|
-
return content.replace(
|
|
354
|
+
return content.replace(new RegExp(`version:\\s*['"\`]${oldVersion}['"\`]`), `version: '${newVersion}'`);
|
|
355
355
|
}
|
|
356
356
|
/**
|
|
357
357
|
* Create an empty changelog entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versioning-service.mjs","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"sourcesContent":["/**\n * Versioning service.\n *\n * Provides version analysis, version bumping, and changelog generation\n * for ContractSpec specs.\n */\n\nimport {\n bumpVersion,\n determineBumpType,\n type ChangeEntry,\n type ChangelogEntry,\n type ChangelogDocBlock,\n type VersionBumpType,\n} from '@contractspec/lib.contracts';\nimport { findPackageRoot, getPackageName } from '../../adapters/workspace';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { GitAdapter } from '../../ports/git';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n VersionAnalyzeOptions,\n VersionAnalyzeResult,\n VersionBumpOptions,\n VersionBumpResult,\n ChangelogGenerateOptions,\n ChangelogGenerateResult,\n SpecVersionAnalysis,\n} from './types';\nimport {\n formatKeepAChangelog,\n formatChangelogJson,\n} from './changelog-formatter';\nimport {\n parseConventionalCommit,\n getHighestBumpType,\n commitsToChangeEntries,\n} from './conventional-commits';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapters Type\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ServiceAdapters {\n fs: FsAdapter;\n git: GitAdapter;\n logger: LoggerAdapter;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Analyze specs and suggest version bumps based on changes.\n *\n * Compares the current state against a baseline (git ref) and determines\n * which specs need version bumps based on detected changes.\n */\nexport async function analyzeVersions(\n adapters: ServiceAdapters,\n options: VersionAnalyzeOptions = {}\n): Promise<VersionAnalyzeResult> {\n const { fs, git, logger } = adapters;\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n logger.info('Starting version analysis...', { baseline: options.baseline });\n\n // Discover spec files\n const pattern = options.pattern ?? '**/*.{operation,event,presentation}.ts';\n const files = await fs.glob({ pattern, cwd: workspaceRoot });\n\n const specFiles = files.filter(\n (f) =>\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('node_modules')\n );\n\n logger.debug(`Found ${specFiles.length} spec files`);\n\n const analyses: SpecVersionAnalysis[] = [];\n let totalBreaking = 0;\n let totalNonBreaking = 0;\n\n for (const specPath of specFiles) {\n try {\n // Read current spec\n const currentContent = await fs.readFile(specPath);\n const currentMeta = extractSpecMeta(currentContent);\n\n if (!currentMeta) {\n continue; // Skip files that don't have valid spec meta\n }\n\n // Get baseline content if baseline specified\n let baselineContent: string | null = null;\n if (options.baseline) {\n try {\n baselineContent = await git.showFile(options.baseline, specPath);\n } catch {\n // File doesn't exist in baseline (new file)\n baselineContent = null;\n }\n }\n\n // Analyze changes\n const changes = analyzeSpecChanges(currentContent, baselineContent);\n const hasBreaking = changes.some((c) => c.type === 'breaking');\n const hasNonBreaking = changes.length > 0 && !hasBreaking;\n const needsBump = changes.length > 0;\n\n if (hasBreaking) totalBreaking++;\n if (hasNonBreaking) totalNonBreaking++;\n\n const bumpType = determineBumpType(hasBreaking, hasNonBreaking);\n const suggestedVersion = needsBump\n ? bumpVersion(currentMeta.version, bumpType)\n : currentMeta.version;\n\n analyses.push({\n specPath,\n specKey: currentMeta.key,\n currentVersion: currentMeta.version,\n suggestedVersion,\n bumpType,\n changes,\n hasBreaking,\n needsBump,\n });\n } catch (error) {\n logger.warn(`Failed to analyze ${specPath}:`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const specsNeedingBump = analyses.filter((a) => a.needsBump).length;\n\n logger.info('Version analysis complete', {\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n });\n\n return {\n analyses,\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n baseline: options.baseline,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Commit-Based Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for commit-based version analysis.\n */\nexport interface CommitAnalyzeOptions {\n /** Git ref to compare against (branch, tag, commit) */\n baseline?: string;\n /** Workspace root directory */\n workspaceRoot?: string;\n /** Include commits matching these paths (glob patterns) */\n include?: string[];\n /** Exclude commits matching these paths (glob patterns) */\n exclude?: string[];\n}\n\n/**\n * Result of commit-based version analysis.\n */\nexport interface CommitAnalyzeResult {\n /** Suggested bump type based on commits */\n suggestedBumpType: VersionBumpType | null;\n /** Parsed conventional commits */\n commits: {\n hash: string;\n message: string;\n type: string;\n scope?: string;\n breaking: boolean;\n }[];\n /** Change entries for changelog */\n changes: ChangeEntry[];\n /** Total commits analyzed */\n totalCommits: number;\n /** Breaking commits count */\n breakingCommits: number;\n}\n\n/**\n * Analyze version bump based on git commits.\n *\n * Parses conventional commits since the baseline and determines\n * the appropriate version bump type.\n */\nexport async function analyzeVersionsFromCommits(\n adapters: ServiceAdapters,\n options: CommitAnalyzeOptions = {}\n): Promise<CommitAnalyzeResult> {\n const { git, logger } = adapters;\n const baseline = options.baseline ?? 'HEAD~10';\n\n logger.info('Analyzing commits for version bump...', { baseline });\n\n try {\n // Get commit messages since baseline\n const commitLog = await git.log(baseline);\n\n const parsedCommits: CommitAnalyzeResult['commits'] = [];\n const conventionalCommits = [];\n\n for (const commit of commitLog) {\n const parsed = parseConventionalCommit(commit.message);\n\n if (parsed) {\n parsedCommits.push({\n hash: commit.hash,\n message: commit.message,\n type: parsed.type,\n scope: parsed.scope,\n breaking: parsed.breaking,\n });\n conventionalCommits.push(parsed);\n }\n }\n\n const suggestedBumpType = getHighestBumpType(conventionalCommits);\n const changes = commitsToChangeEntries(conventionalCommits);\n const breakingCommits = parsedCommits.filter((c) => c.breaking).length;\n\n logger.info('Commit analysis complete', {\n totalCommits: parsedCommits.length,\n breakingCommits,\n suggestedBumpType,\n });\n\n return {\n suggestedBumpType,\n commits: parsedCommits,\n changes,\n totalCommits: parsedCommits.length,\n breakingCommits,\n };\n } catch (error) {\n logger.warn('Failed to analyze commits', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n suggestedBumpType: null,\n commits: [],\n changes: [],\n totalCommits: 0,\n breakingCommits: 0,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Bump\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Apply a version bump to a spec file.\n *\n * Updates the version in the spec file and creates a changelog entry.\n */\nexport async function applyVersionBump(\n adapters: ServiceAdapters,\n options: VersionBumpOptions\n): Promise<VersionBumpResult> {\n const { fs, logger } = adapters;\n const { specPath, dryRun = false, config } = options;\n\n logger.info('Applying version bump...', {\n specPath,\n bumpType: options.bumpType,\n });\n\n try {\n // Read current spec\n const content = await fs.readFile(specPath);\n const meta = extractSpecMeta(content);\n\n if (!meta) {\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: 'Could not extract spec metadata',\n };\n }\n\n // Determine bump type\n const bumpType = options.bumpType ?? 'patch';\n const newVersion = bumpVersion(meta.version, bumpType);\n\n // Create changelog entry\n const changes: ChangeEntry[] = options.changes ?? [];\n if (options.changeDescription) {\n changes.push({\n type: bumpType === 'major' ? 'breaking' : 'changed',\n description: options.changeDescription,\n });\n }\n\n const changelogEntry: ChangelogEntry = {\n version: newVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType,\n changes,\n breakingChanges: changes.filter((c) => c.type === 'breaking'),\n };\n\n // Update the spec file\n if (!dryRun) {\n const updatedContent = updateSpecVersion(\n content,\n meta.version,\n newVersion\n );\n await fs.writeFile(specPath, updatedContent);\n }\n\n logger.info('Version bump applied', {\n specPath,\n previousVersion: meta.version,\n newVersion,\n });\n\n // Generate changeset if enabled\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((config as any)?.integrateWithChangesets) {\n await generateChangeset(adapters, {\n specPath,\n bumpType,\n summary:\n options.changeDescription ?? `Bump ${meta.key} to ${newVersion}`,\n dryRun,\n });\n }\n\n return {\n success: true,\n specPath,\n specKey: meta.key,\n previousVersion: meta.version,\n newVersion,\n bumpType,\n changelogEntry,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('Version bump failed', { specPath, error: errorMessage });\n\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: options.bumpType ?? 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: errorMessage,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changelog Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate changelogs at all configured tiers.\n */\nexport async function generateChangelogs(\n adapters: ServiceAdapters,\n options: ChangelogGenerateOptions = {}\n): Promise<ChangelogGenerateResult> {\n const { logger } = adapters;\n const tiers = options.tiers ?? ['spec', 'library', 'monorepo'];\n const format = options.format ?? 'keep-a-changelog';\n\n logger.info('Generating changelogs...', { tiers, format });\n\n // First, analyze versions to get changes\n const analysis = await analyzeVersions(adapters, {\n baseline: options.baseline,\n workspaceRoot: options.workspaceRoot,\n });\n\n const specChangelogs: ChangelogDocBlock[] = [];\n const libraryMarkdown = new Map<string, string>();\n let monorepoMarkdown = '';\n let totalEntries = 0;\n\n // Generate per-spec changelogs\n if (tiers.includes('spec')) {\n for (const spec of analysis.analyses.filter((a) => a.needsBump)) {\n const docBlock: ChangelogDocBlock = {\n id: `changelog.${spec.specKey}`,\n title: `Changelog for ${spec.specKey}`,\n body: formatSpecChangelog(spec),\n kind: 'changelog',\n specKey: spec.specKey,\n specVersion: spec.suggestedVersion,\n entries: [\n {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n },\n ],\n };\n specChangelogs.push(docBlock);\n totalEntries++;\n }\n }\n\n // Generate library-level changelogs\n if (tiers.includes('library')) {\n const libraryGroups = groupByLibrary(analysis.analyses);\n for (const [libPath, specs] of libraryGroups) {\n const entries = specs.filter((s) => s.needsBump);\n if (entries.length > 0) {\n libraryMarkdown.set(\n libPath,\n formatKeepAChangelog(entries.map(specToChangelogEntry))\n );\n totalEntries += entries.length;\n }\n }\n }\n\n // Generate monorepo-level changelog\n if (tiers.includes('monorepo')) {\n const allEntries = analysis.analyses\n .filter((a) => a.needsBump)\n .map(specToChangelogEntry);\n monorepoMarkdown = formatKeepAChangelog(allEntries);\n }\n\n // Generate JSON export\n const json = formatChangelogJson(analysis, options.baseline);\n\n logger.info('Changelog generation complete', { totalEntries });\n\n return {\n specChangelogs,\n libraryMarkdown,\n monorepoMarkdown,\n json,\n totalEntries,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SpecMeta {\n key: string;\n version: string;\n}\n\n/**\n * Extract spec metadata from file content.\n */\nfunction extractSpecMeta(content: string): SpecMeta | null {\n // Match meta.key and meta.version patterns\n const keyMatch = content.match(/key:\\s*['\"`]([^'\"`]+)['\"`]/);\n const versionMatch = content.match(/version:\\s*['\"`]([^'\"`]+)['\"`]/);\n\n if (!keyMatch || !versionMatch) {\n return null;\n }\n\n const key = keyMatch[1];\n const version = versionMatch[1];\n\n // Type guard for regex capture groups\n if (!key || !version) {\n return null;\n }\n\n return {\n key,\n version,\n };\n}\n\n/**\n * Analyze changes between current and baseline spec content.\n */\nfunction analyzeSpecChanges(\n current: string,\n baseline: string | null\n): ChangeEntry[] {\n const changes: ChangeEntry[] = [];\n\n if (!baseline) {\n // New spec\n changes.push({\n type: 'added',\n description: 'New spec added',\n });\n return changes;\n }\n\n // Simple diff analysis - check for structural changes\n const currentMeta = extractSpecMeta(current);\n const baselineMeta = extractSpecMeta(baseline);\n\n if (!currentMeta || !baselineMeta) {\n return changes;\n }\n\n // Version change\n if (currentMeta.version !== baselineMeta.version) {\n changes.push({\n type: 'changed',\n description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,\n path: 'meta.version',\n });\n }\n\n // Check for io changes (simplified)\n const hasIoChanges = detectIoChanges(current, baseline);\n if (hasIoChanges.breaking) {\n changes.push({\n type: 'breaking',\n description: 'Breaking changes to input/output schema',\n path: 'io',\n });\n } else if (hasIoChanges.nonBreaking) {\n changes.push({\n type: 'changed',\n description: 'Non-breaking changes to input/output schema',\n path: 'io',\n });\n }\n\n return changes;\n}\n\n/**\n * Detect I/O changes between specs (simplified).\n */\nfunction detectIoChanges(\n current: string,\n baseline: string\n): { breaking: boolean; nonBreaking: boolean } {\n // Simple heuristic: check if io section differs\n const ioPattern = /io:\\s*\\{[\\s\\S]*?\\}/;\n const currentIo = current.match(ioPattern)?.[0] ?? '';\n const baselineIo = baseline.match(ioPattern)?.[0] ?? '';\n\n if (currentIo === baselineIo) {\n return { breaking: false, nonBreaking: false };\n }\n\n // Check for removed fields (breaking) vs added fields (non-breaking)\n const currentFields = extractFields(currentIo);\n const baselineFields = extractFields(baselineIo);\n\n const removedFields = baselineFields.filter(\n (f) => !currentFields.includes(f)\n );\n const addedFields = currentFields.filter((f) => !baselineFields.includes(f));\n\n return {\n breaking: removedFields.length > 0,\n nonBreaking: addedFields.length > 0 && removedFields.length === 0,\n };\n}\n\n/**\n * Extract field names from a code block (simplified).\n */\nfunction extractFields(code: string): string[] {\n const fieldPattern = /(\\w+):/g;\n const matches = [...code.matchAll(fieldPattern)];\n return matches.map((m) => m[1]).filter((field): field is string => !!field);\n}\n\n/**\n * Update version in spec content.\n */\nfunction updateSpecVersion(\n content: string,\n oldVersion: string,\n newVersion: string\n): string {\n return content.replace(\n new RegExp(`version:\\\\s*['\"\\`]${oldVersion}['\"\\`]`),\n `version: '${newVersion}'`\n );\n}\n\n/**\n * Create an empty changelog entry.\n */\nfunction createEmptyChangelogEntry(): ChangelogEntry {\n return {\n version: '0.0.0',\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: 'patch',\n changes: [],\n };\n}\n\n/**\n * Format a single spec's changelog.\n */\nfunction formatSpecChangelog(spec: SpecVersionAnalysis): string {\n const lines: string[] = [\n `## [${spec.suggestedVersion}] - ${new Date().toISOString().split('T')[0]}`,\n '',\n ];\n\n const breaking = spec.changes.filter((c) => c.type === 'breaking');\n const changed = spec.changes.filter((c) => c.type === 'changed');\n const added = spec.changes.filter((c) => c.type === 'added');\n\n if (breaking.length > 0) {\n lines.push('### Breaking Changes');\n breaking.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (added.length > 0) {\n lines.push('### Added');\n added.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (changed.length > 0) {\n lines.push('### Changed');\n changed.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Group specs by library (package path).\n */\nfunction groupByLibrary(\n analyses: SpecVersionAnalysis[]\n): Map<string, SpecVersionAnalysis[]> {\n const groups = new Map<string, SpecVersionAnalysis[]>();\n\n for (const analysis of analyses) {\n // Extract library path (up to src/)\n const libMatch = analysis.specPath.match(/(.+?\\/src\\/)/);\n const matchedPath = libMatch?.[1];\n const libPath = matchedPath ?? analysis.specPath;\n\n const existing = groups.get(libPath) ?? [];\n existing.push(analysis);\n groups.set(libPath, existing);\n }\n\n return groups;\n}\n\n/**\n * Convert SpecVersionAnalysis to ChangelogEntry.\n */\nfunction specToChangelogEntry(spec: SpecVersionAnalysis): ChangelogEntry {\n return {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changeset Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface GenerateChangesetOptions {\n specPath: string;\n bumpType: VersionBumpType;\n summary: string;\n dryRun?: boolean;\n}\n\n/**\n * Generate a changeset file for a spec update.\n */\nasync function generateChangeset(\n adapters: ServiceAdapters,\n options: GenerateChangesetOptions\n): Promise<void> {\n const { fs, logger } = adapters;\n const { specPath, bumpType, summary, dryRun } = options;\n\n try {\n const pkgRoot = findPackageRoot(specPath);\n const pkgName = getPackageName(pkgRoot);\n\n if (!pkgName) {\n logger.warn('Could not determine package name for changeset', {\n specPath,\n });\n return;\n }\n\n // Find git root to locate .changeset folder\n // This is a simplification; ideally we find the monorepo root\n // We'll walk up from pkgRoot until we find a .changeset folder or hit root\n let currentDir = pkgRoot;\n let changesetDir: string | null = null;\n\n while (true) {\n const candidate = fs.join(currentDir, '.changeset');\n if (await fs.exists(candidate)) {\n changesetDir = candidate;\n break;\n }\n const parent = fs.dirname(currentDir);\n if (parent === currentDir) break;\n currentDir = parent;\n }\n\n if (!changesetDir) {\n // Create .changeset in package root if not found elsewhere (fallback)\n // But typically it initiates in workspace root.\n // We will skip if we absolutely can't find it to avoid polluting non-monorepos unexpected\n logger.warn(\n 'No .changeset directory found, skipping changeset generation'\n );\n return;\n }\n\n const fileName = `${generateRandomName()}.md`;\n const filePath = fs.join(changesetDir, fileName);\n\n const content = `---\n\"${pkgName}\": ${bumpType}\n---\n\n${summary}\n`;\n\n if (!dryRun) {\n await fs.writeFile(filePath, content);\n logger.info('Generated changeset', { filePath });\n } else {\n logger.info('Would generate changeset', { filePath, content });\n }\n } catch (error) {\n logger.error('Failed to generate changeset', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Generate a random human-readable-ish name (simplified).\n */\nfunction generateRandomName(): string {\n const adjectives = ['neat', 'calm', 'wild', 'soft', 'bold', 'fair', 'cool'];\n const nouns = ['fox', 'cat', 'dog', 'bat', 'ant', 'elk', 'owl'];\n const verbs = ['run', 'fly', 'hop', 'eat', 'nap', 'cry', 'sing'];\n\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const verb = verbs[Math.floor(Math.random() * verbs.length)];\n const random = Math.floor(Math.random() * 1000);\n\n return `${adj}-${noun}-${verb}-${random}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0DA,eAAsB,gBACpB,UACA,UAAiC,EAAE,EACJ;CAC/B,MAAM,EAAE,IAAI,KAAK,WAAW;CAC5B,MAAM,gBAAgB,QAAQ,iBAAiB,QAAQ,KAAK;AAE5D,QAAO,KAAK,gCAAgC,EAAE,UAAU,QAAQ,UAAU,CAAC;CAG3E,MAAM,UAAU,QAAQ,WAAW;CAGnC,MAAM,aAFQ,MAAM,GAAG,KAAK;EAAE;EAAS,KAAK;EAAe,CAAC,EAEpC,QACrB,MACC,CAAC,EAAE,SAAS,SAAS,IACrB,CAAC,EAAE,SAAS,SAAS,IACrB,CAAC,EAAE,SAAS,eAAe,CAC9B;AAED,QAAO,MAAM,SAAS,UAAU,OAAO,aAAa;CAEpD,MAAM,WAAkC,EAAE;CAC1C,IAAI,gBAAgB;CACpB,IAAI,mBAAmB;AAEvB,MAAK,MAAM,YAAY,UACrB,KAAI;EAEF,MAAM,iBAAiB,MAAM,GAAG,SAAS,SAAS;EAClD,MAAM,cAAc,gBAAgB,eAAe;AAEnD,MAAI,CAAC,YACH;EAIF,IAAI,kBAAiC;AACrC,MAAI,QAAQ,SACV,KAAI;AACF,qBAAkB,MAAM,IAAI,SAAS,QAAQ,UAAU,SAAS;UAC1D;AAEN,qBAAkB;;EAKtB,MAAM,UAAU,mBAAmB,gBAAgB,gBAAgB;EACnE,MAAM,cAAc,QAAQ,MAAM,MAAM,EAAE,SAAS,WAAW;EAC9D,MAAM,iBAAiB,QAAQ,SAAS,KAAK,CAAC;EAC9C,MAAM,YAAY,QAAQ,SAAS;AAEnC,MAAI,YAAa;AACjB,MAAI,eAAgB;EAEpB,MAAM,WAAW,kBAAkB,aAAa,eAAe;EAC/D,MAAM,mBAAmB,YACrB,YAAY,YAAY,SAAS,SAAS,GAC1C,YAAY;AAEhB,WAAS,KAAK;GACZ;GACA,SAAS,YAAY;GACrB,gBAAgB,YAAY;GAC5B;GACA;GACA;GACA;GACA;GACD,CAAC;UACK,OAAO;AACd,SAAO,KAAK,qBAAqB,SAAS,IAAI,EAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAC9D,CAAC;;CAIN,MAAM,mBAAmB,SAAS,QAAQ,MAAM,EAAE,UAAU,CAAC;AAE7D,QAAO,KAAK,6BAA6B;EACvC,YAAY,SAAS;EACrB;EACA;EACA;EACD,CAAC;AAEF,QAAO;EACL;EACA,YAAY,SAAS;EACrB;EACA;EACA;EACA,UAAU,QAAQ;EACnB;;;;;;;;AAiDH,eAAsB,2BACpB,UACA,UAAgC,EAAE,EACJ;CAC9B,MAAM,EAAE,KAAK,WAAW;CACxB,MAAM,WAAW,QAAQ,YAAY;AAErC,QAAO,KAAK,yCAAyC,EAAE,UAAU,CAAC;AAElE,KAAI;EAEF,MAAM,YAAY,MAAM,IAAI,IAAI,SAAS;EAEzC,MAAM,gBAAgD,EAAE;EACxD,MAAM,sBAAsB,EAAE;AAE9B,OAAK,MAAM,UAAU,WAAW;GAC9B,MAAM,SAAS,wBAAwB,OAAO,QAAQ;AAEtD,OAAI,QAAQ;AACV,kBAAc,KAAK;KACjB,MAAM,OAAO;KACb,SAAS,OAAO;KAChB,MAAM,OAAO;KACb,OAAO,OAAO;KACd,UAAU,OAAO;KAClB,CAAC;AACF,wBAAoB,KAAK,OAAO;;;EAIpC,MAAM,oBAAoB,mBAAmB,oBAAoB;EACjE,MAAM,UAAU,uBAAuB,oBAAoB;EAC3D,MAAM,kBAAkB,cAAc,QAAQ,MAAM,EAAE,SAAS,CAAC;AAEhE,SAAO,KAAK,4BAA4B;GACtC,cAAc,cAAc;GAC5B;GACA;GACD,CAAC;AAEF,SAAO;GACL;GACA,SAAS;GACT;GACA,cAAc,cAAc;GAC5B;GACD;UACM,OAAO;AACd,SAAO,KAAK,6BAA6B,EACvC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAC9D,CAAC;AAEF,SAAO;GACL,mBAAmB;GACnB,SAAS,EAAE;GACX,SAAS,EAAE;GACX,cAAc;GACd,iBAAiB;GAClB;;;;;;;;AAaL,eAAsB,iBACpB,UACA,SAC4B;CAC5B,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,UAAU,SAAS,OAAO,WAAW;AAE7C,QAAO,KAAK,4BAA4B;EACtC;EACA,UAAU,QAAQ;EACnB,CAAC;AAEF,KAAI;EAEF,MAAM,UAAU,MAAM,GAAG,SAAS,SAAS;EAC3C,MAAM,OAAO,gBAAgB,QAAQ;AAErC,MAAI,CAAC,KACH,QAAO;GACL,SAAS;GACT;GACA,SAAS;GACT,iBAAiB;GACjB,YAAY;GACZ,UAAU;GACV,gBAAgB,2BAA2B;GAC3C,OAAO;GACR;EAIH,MAAM,WAAW,QAAQ,YAAY;EACrC,MAAM,aAAa,YAAY,KAAK,SAAS,SAAS;EAGtD,MAAM,UAAyB,QAAQ,WAAW,EAAE;AACpD,MAAI,QAAQ,kBACV,SAAQ,KAAK;GACX,MAAM,aAAa,UAAU,aAAa;GAC1C,aAAa,QAAQ;GACtB,CAAC;EAGJ,MAAM,iBAAiC;GACrC,SAAS;GACT,uBAAM,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM;GAChD;GACA;GACA,iBAAiB,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;GAC9D;AAGD,MAAI,CAAC,QAAQ;GACX,MAAM,iBAAiB,kBACrB,SACA,KAAK,SACL,WACD;AACD,SAAM,GAAG,UAAU,UAAU,eAAe;;AAG9C,SAAO,KAAK,wBAAwB;GAClC;GACA,iBAAiB,KAAK;GACtB;GACD,CAAC;AAIF,MAAK,QAAgB,wBACnB,OAAM,kBAAkB,UAAU;GAChC;GACA;GACA,SACE,QAAQ,qBAAqB,QAAQ,KAAK,IAAI,MAAM;GACtD;GACD,CAAC;AAGJ,SAAO;GACL,SAAS;GACT;GACA,SAAS,KAAK;GACd,iBAAiB,KAAK;GACtB;GACA;GACA;GACD;UACM,OAAO;EACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAO,MAAM,uBAAuB;GAAE;GAAU,OAAO;GAAc,CAAC;AAEtE,SAAO;GACL,SAAS;GACT;GACA,SAAS;GACT,iBAAiB;GACjB,YAAY;GACZ,UAAU,QAAQ,YAAY;GAC9B,gBAAgB,2BAA2B;GAC3C,OAAO;GACR;;;;;;AAWL,eAAsB,mBACpB,UACA,UAAoC,EAAE,EACJ;CAClC,MAAM,EAAE,WAAW;CACnB,MAAM,QAAQ,QAAQ,SAAS;EAAC;EAAQ;EAAW;EAAW;CAC9D,MAAM,SAAS,QAAQ,UAAU;AAEjC,QAAO,KAAK,4BAA4B;EAAE;EAAO;EAAQ,CAAC;CAG1D,MAAM,WAAW,MAAM,gBAAgB,UAAU;EAC/C,UAAU,QAAQ;EAClB,eAAe,QAAQ;EACxB,CAAC;CAEF,MAAM,iBAAsC,EAAE;CAC9C,MAAM,kCAAkB,IAAI,KAAqB;CACjD,IAAI,mBAAmB;CACvB,IAAI,eAAe;AAGnB,KAAI,MAAM,SAAS,OAAO,CACxB,MAAK,MAAM,QAAQ,SAAS,SAAS,QAAQ,MAAM,EAAE,UAAU,EAAE;EAC/D,MAAM,WAA8B;GAClC,IAAI,aAAa,KAAK;GACtB,OAAO,iBAAiB,KAAK;GAC7B,MAAM,oBAAoB,KAAK;GAC/B,MAAM;GACN,SAAS,KAAK;GACd,aAAa,KAAK;GAClB,SAAS,CACP;IACE,SAAS,KAAK;IACd,uBAAM,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM;IAChD,UAAU,KAAK;IACf,SAAS,KAAK;IACd,iBAAiB,KAAK,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;IACnE,CACF;GACF;AACD,iBAAe,KAAK,SAAS;AAC7B;;AAKJ,KAAI,MAAM,SAAS,UAAU,EAAE;EAC7B,MAAM,gBAAgB,eAAe,SAAS,SAAS;AACvD,OAAK,MAAM,CAAC,SAAS,UAAU,eAAe;GAC5C,MAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,UAAU;AAChD,OAAI,QAAQ,SAAS,GAAG;AACtB,oBAAgB,IACd,SACA,qBAAqB,QAAQ,IAAI,qBAAqB,CAAC,CACxD;AACD,oBAAgB,QAAQ;;;;AAM9B,KAAI,MAAM,SAAS,WAAW,CAI5B,oBAAmB,qBAHA,SAAS,SACzB,QAAQ,MAAM,EAAE,UAAU,CAC1B,IAAI,qBAAqB,CACuB;CAIrD,MAAM,OAAO,oBAAoB,UAAU,QAAQ,SAAS;AAE5D,QAAO,KAAK,iCAAiC,EAAE,cAAc,CAAC;AAE9D,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;AAeH,SAAS,gBAAgB,SAAkC;CAEzD,MAAM,WAAW,QAAQ,MAAM,6BAA6B;CAC5D,MAAM,eAAe,QAAQ,MAAM,iCAAiC;AAEpE,KAAI,CAAC,YAAY,CAAC,aAChB,QAAO;CAGT,MAAM,MAAM,SAAS;CACrB,MAAM,UAAU,aAAa;AAG7B,KAAI,CAAC,OAAO,CAAC,QACX,QAAO;AAGT,QAAO;EACL;EACA;EACD;;;;;AAMH,SAAS,mBACP,SACA,UACe;CACf,MAAM,UAAyB,EAAE;AAEjC,KAAI,CAAC,UAAU;AAEb,UAAQ,KAAK;GACX,MAAM;GACN,aAAa;GACd,CAAC;AACF,SAAO;;CAIT,MAAM,cAAc,gBAAgB,QAAQ;CAC5C,MAAM,eAAe,gBAAgB,SAAS;AAE9C,KAAI,CAAC,eAAe,CAAC,aACnB,QAAO;AAIT,KAAI,YAAY,YAAY,aAAa,QACvC,SAAQ,KAAK;EACX,MAAM;EACN,aAAa,wBAAwB,aAAa,QAAQ,MAAM,YAAY;EAC5E,MAAM;EACP,CAAC;CAIJ,MAAM,eAAe,gBAAgB,SAAS,SAAS;AACvD,KAAI,aAAa,SACf,SAAQ,KAAK;EACX,MAAM;EACN,aAAa;EACb,MAAM;EACP,CAAC;UACO,aAAa,YACtB,SAAQ,KAAK;EACX,MAAM;EACN,aAAa;EACb,MAAM;EACP,CAAC;AAGJ,QAAO;;;;;AAMT,SAAS,gBACP,SACA,UAC6C;CAE7C,MAAM,YAAY;CAClB,MAAM,YAAY,QAAQ,MAAM,UAAU,GAAG,MAAM;CACnD,MAAM,aAAa,SAAS,MAAM,UAAU,GAAG,MAAM;AAErD,KAAI,cAAc,WAChB,QAAO;EAAE,UAAU;EAAO,aAAa;EAAO;CAIhD,MAAM,gBAAgB,cAAc,UAAU;CAC9C,MAAM,iBAAiB,cAAc,WAAW;CAEhD,MAAM,gBAAgB,eAAe,QAClC,MAAM,CAAC,cAAc,SAAS,EAAE,CAClC;CACD,MAAM,cAAc,cAAc,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE,CAAC;AAE5E,QAAO;EACL,UAAU,cAAc,SAAS;EACjC,aAAa,YAAY,SAAS,KAAK,cAAc,WAAW;EACjE;;;;;AAMH,SAAS,cAAc,MAAwB;AAG7C,QADgB,CAAC,GAAG,KAAK,SADJ,UAC0B,CAAC,CACjC,KAAK,MAAM,EAAE,GAAG,CAAC,QAAQ,UAA2B,CAAC,CAAC,MAAM;;;;;AAM7E,SAAS,kBACP,SACA,YACA,YACQ;AACR,QAAO,QAAQ,wBACb,IAAI,OAAO,qBAAqB,WAAW,QAAQ,EACnD,aAAa,WAAW,GACzB;;;;;AAMH,SAAS,4BAA4C;AACnD,QAAO;EACL,SAAS;EACT,uBAAM,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM;EAChD,UAAU;EACV,SAAS,EAAE;EACZ;;;;;AAMH,SAAS,oBAAoB,MAAmC;CAC9D,MAAM,QAAkB,CACtB,OAAO,KAAK,iBAAiB,uBAAM,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,MACvE,GACD;CAED,MAAM,WAAW,KAAK,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;CAClE,MAAM,UAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE,SAAS,UAAU;CAChE,MAAM,QAAQ,KAAK,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ;AAE5D,KAAI,SAAS,SAAS,GAAG;AACvB,QAAM,KAAK,uBAAuB;AAClC,WAAS,SAAS,MAAM,MAAM,KAAK,KAAK,EAAE,cAAc,CAAC;AACzD,QAAM,KAAK,GAAG;;AAGhB,KAAI,MAAM,SAAS,GAAG;AACpB,QAAM,KAAK,YAAY;AACvB,QAAM,SAAS,MAAM,MAAM,KAAK,KAAK,EAAE,cAAc,CAAC;AACtD,QAAM,KAAK,GAAG;;AAGhB,KAAI,QAAQ,SAAS,GAAG;AACtB,QAAM,KAAK,cAAc;AACzB,UAAQ,SAAS,MAAM,MAAM,KAAK,KAAK,EAAE,cAAc,CAAC;AACxD,QAAM,KAAK,GAAG;;AAGhB,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAS,eACP,UACoC;CACpC,MAAM,yBAAS,IAAI,KAAoC;AAEvD,MAAK,MAAM,YAAY,UAAU;EAI/B,MAAM,UAFW,SAAS,SAAS,MAAM,eAAe,GACzB,MACA,SAAS;EAExC,MAAM,WAAW,OAAO,IAAI,QAAQ,IAAI,EAAE;AAC1C,WAAS,KAAK,SAAS;AACvB,SAAO,IAAI,SAAS,SAAS;;AAG/B,QAAO;;;;;AAMT,SAAS,qBAAqB,MAA2C;AACvE,QAAO;EACL,SAAS,KAAK;EACd,uBAAM,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM;EAChD,UAAU,KAAK;EACf,SAAS,KAAK;EACd,iBAAiB,KAAK,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;EACnE;;;;;AAiBH,eAAe,kBACb,UACA,SACe;CACf,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,UAAU,UAAU,SAAS,WAAW;AAEhD,KAAI;EACF,MAAM,UAAU,gBAAgB,SAAS;EACzC,MAAM,UAAU,eAAe,QAAQ;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAO,KAAK,kDAAkD,EAC5D,UACD,CAAC;AACF;;EAMF,IAAI,aAAa;EACjB,IAAI,eAA8B;AAElC,SAAO,MAAM;GACX,MAAM,YAAY,GAAG,KAAK,YAAY,aAAa;AACnD,OAAI,MAAM,GAAG,OAAO,UAAU,EAAE;AAC9B,mBAAe;AACf;;GAEF,MAAM,SAAS,GAAG,QAAQ,WAAW;AACrC,OAAI,WAAW,WAAY;AAC3B,gBAAa;;AAGf,MAAI,CAAC,cAAc;AAIjB,UAAO,KACL,+DACD;AACD;;EAGF,MAAM,WAAW,GAAG,oBAAoB,CAAC;EACzC,MAAM,WAAW,GAAG,KAAK,cAAc,SAAS;EAEhD,MAAM,UAAU;GACjB,QAAQ,KAAK,SAAS;;;EAGvB,QAAQ;;AAGN,MAAI,CAAC,QAAQ;AACX,SAAM,GAAG,UAAU,UAAU,QAAQ;AACrC,UAAO,KAAK,uBAAuB,EAAE,UAAU,CAAC;QAEhD,QAAO,KAAK,4BAA4B;GAAE;GAAU;GAAS,CAAC;UAEzD,OAAO;AACd,SAAO,MAAM,gCAAgC,EAC3C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAC9D,CAAC;;;;;;AAON,SAAS,qBAA6B;CACpC,MAAM,aAAa;EAAC;EAAQ;EAAQ;EAAQ;EAAQ;EAAQ;EAAQ;EAAO;CAC3E,MAAM,QAAQ;EAAC;EAAO;EAAO;EAAO;EAAO;EAAO;EAAO;EAAM;CAC/D,MAAM,QAAQ;EAAC;EAAO;EAAO;EAAO;EAAO;EAAO;EAAO;EAAO;AAOhE,QAAO,GALK,WAAW,KAAK,MAAM,KAAK,QAAQ,GAAG,WAAW,OAAO,EAKtD,GAJD,MAAM,KAAK,MAAM,KAAK,QAAQ,GAAG,MAAM,OAAO,EAIrC,GAHT,MAAM,KAAK,MAAM,KAAK,QAAQ,GAAG,MAAM,OAAO,EAG7B,GAFf,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAK"}
|
|
1
|
+
{"version":3,"file":"versioning-service.mjs","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"sourcesContent":["/**\n * Versioning service.\n *\n * Provides version analysis, version bumping, and changelog generation\n * for ContractSpec specs.\n */\n\nimport {\n bumpVersion,\n determineBumpType,\n type ChangeEntry,\n type ChangelogEntry,\n type ChangelogDocBlock,\n type VersionBumpType,\n} from '@contractspec/lib.contracts';\nimport { findPackageRoot, getPackageName } from '../../adapters/workspace';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { GitAdapter } from '../../ports/git';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n VersionAnalyzeOptions,\n VersionAnalyzeResult,\n VersionBumpOptions,\n VersionBumpResult,\n ChangelogGenerateOptions,\n ChangelogGenerateResult,\n SpecVersionAnalysis,\n} from './types';\nimport {\n formatKeepAChangelog,\n formatChangelogJson,\n} from './changelog-formatter';\nimport {\n parseConventionalCommit,\n getHighestBumpType,\n commitsToChangeEntries,\n} from './conventional-commits';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapters Type\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ServiceAdapters {\n fs: FsAdapter;\n git: GitAdapter;\n logger: LoggerAdapter;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Analyze specs and suggest version bumps based on changes.\n *\n * Compares the current state against a baseline (git ref) and determines\n * which specs need version bumps based on detected changes.\n */\nexport async function analyzeVersions(\n adapters: ServiceAdapters,\n options: VersionAnalyzeOptions = {}\n): Promise<VersionAnalyzeResult> {\n const { fs, git, logger } = adapters;\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n logger.info('Starting version analysis...', { baseline: options.baseline });\n\n // Discover spec files\n const pattern = options.pattern ?? '**/*.{operation,event,presentation}.ts';\n const files = await fs.glob({ pattern, cwd: workspaceRoot });\n\n const specFiles = files.filter(\n (f) =>\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('node_modules')\n );\n\n logger.debug(`Found ${specFiles.length} spec files`);\n\n const analyses: SpecVersionAnalysis[] = [];\n let totalBreaking = 0;\n let totalNonBreaking = 0;\n\n for (const specPath of specFiles) {\n try {\n // Read current spec\n const currentContent = await fs.readFile(specPath);\n const currentMeta = extractSpecMeta(currentContent);\n\n if (!currentMeta) {\n continue; // Skip files that don't have valid spec meta\n }\n\n // Get baseline content if baseline specified\n let baselineContent: string | null = null;\n if (options.baseline) {\n try {\n baselineContent = await git.showFile(options.baseline, specPath);\n } catch {\n // File doesn't exist in baseline (new file)\n baselineContent = null;\n }\n }\n\n // Analyze changes\n const changes = analyzeSpecChanges(currentContent, baselineContent);\n const hasBreaking = changes.some((c) => c.type === 'breaking');\n const hasNonBreaking = changes.length > 0 && !hasBreaking;\n const needsBump = changes.length > 0;\n\n if (hasBreaking) totalBreaking++;\n if (hasNonBreaking) totalNonBreaking++;\n\n const bumpType = determineBumpType(hasBreaking, hasNonBreaking);\n const suggestedVersion = needsBump\n ? bumpVersion(currentMeta.version, bumpType)\n : currentMeta.version;\n\n analyses.push({\n specPath,\n specKey: currentMeta.key,\n currentVersion: currentMeta.version,\n suggestedVersion,\n bumpType,\n changes,\n hasBreaking,\n needsBump,\n });\n } catch (error) {\n logger.warn(`Failed to analyze ${specPath}:`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const specsNeedingBump = analyses.filter((a) => a.needsBump).length;\n\n logger.info('Version analysis complete', {\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n });\n\n return {\n analyses,\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n baseline: options.baseline,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Commit-Based Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for commit-based version analysis.\n */\nexport interface CommitAnalyzeOptions {\n /** Git ref to compare against (branch, tag, commit) */\n baseline?: string;\n /** Workspace root directory */\n workspaceRoot?: string;\n /** Include commits matching these paths (glob patterns) */\n include?: string[];\n /** Exclude commits matching these paths (glob patterns) */\n exclude?: string[];\n}\n\n/**\n * Result of commit-based version analysis.\n */\nexport interface CommitAnalyzeResult {\n /** Suggested bump type based on commits */\n suggestedBumpType: VersionBumpType | null;\n /** Parsed conventional commits */\n commits: {\n hash: string;\n message: string;\n type: string;\n scope?: string;\n breaking: boolean;\n }[];\n /** Change entries for changelog */\n changes: ChangeEntry[];\n /** Total commits analyzed */\n totalCommits: number;\n /** Breaking commits count */\n breakingCommits: number;\n}\n\n/**\n * Analyze version bump based on git commits.\n *\n * Parses conventional commits since the baseline and determines\n * the appropriate version bump type.\n */\nexport async function analyzeVersionsFromCommits(\n adapters: ServiceAdapters,\n options: CommitAnalyzeOptions = {}\n): Promise<CommitAnalyzeResult> {\n const { git, logger } = adapters;\n const baseline = options.baseline ?? 'HEAD~10';\n\n logger.info('Analyzing commits for version bump...', { baseline });\n\n try {\n // Get commit messages since baseline\n const commitLog = await git.log(baseline);\n\n const parsedCommits: CommitAnalyzeResult['commits'] = [];\n const conventionalCommits = [];\n\n for (const commit of commitLog) {\n const parsed = parseConventionalCommit(commit.message);\n\n if (parsed) {\n parsedCommits.push({\n hash: commit.hash,\n message: commit.message,\n type: parsed.type,\n scope: parsed.scope,\n breaking: parsed.breaking,\n });\n conventionalCommits.push(parsed);\n }\n }\n\n const suggestedBumpType = getHighestBumpType(conventionalCommits);\n const changes = commitsToChangeEntries(conventionalCommits);\n const breakingCommits = parsedCommits.filter((c) => c.breaking).length;\n\n logger.info('Commit analysis complete', {\n totalCommits: parsedCommits.length,\n breakingCommits,\n suggestedBumpType,\n });\n\n return {\n suggestedBumpType,\n commits: parsedCommits,\n changes,\n totalCommits: parsedCommits.length,\n breakingCommits,\n };\n } catch (error) {\n logger.warn('Failed to analyze commits', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n suggestedBumpType: null,\n commits: [],\n changes: [],\n totalCommits: 0,\n breakingCommits: 0,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Bump\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Apply a version bump to a spec file.\n *\n * Updates the version in the spec file and creates a changelog entry.\n */\nexport async function applyVersionBump(\n adapters: ServiceAdapters,\n options: VersionBumpOptions\n): Promise<VersionBumpResult> {\n const { fs, logger } = adapters;\n const { specPath, dryRun = false, config } = options;\n\n logger.info('Applying version bump...', {\n specPath,\n bumpType: options.bumpType,\n });\n\n try {\n // Read current spec\n const content = await fs.readFile(specPath);\n const meta = extractSpecMeta(content);\n\n if (!meta) {\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: 'Could not extract spec metadata',\n };\n }\n\n // Determine bump type\n const bumpType = options.bumpType ?? 'patch';\n const newVersion = bumpVersion(meta.version, bumpType);\n\n // Create changelog entry\n const changes: ChangeEntry[] = options.changes ?? [];\n if (options.changeDescription) {\n changes.push({\n type: bumpType === 'major' ? 'breaking' : 'changed',\n description: options.changeDescription,\n });\n }\n\n const changelogEntry: ChangelogEntry = {\n version: newVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType,\n changes,\n breakingChanges: changes.filter((c) => c.type === 'breaking'),\n };\n\n // Update the spec file\n if (!dryRun) {\n const updatedContent = updateSpecVersion(\n content,\n meta.version,\n newVersion\n );\n await fs.writeFile(specPath, updatedContent);\n }\n\n logger.info('Version bump applied', {\n specPath,\n previousVersion: meta.version,\n newVersion,\n });\n\n // Generate changeset if enabled\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((config as any)?.integrateWithChangesets) {\n await generateChangeset(adapters, {\n specPath,\n bumpType,\n summary:\n options.changeDescription ?? `Bump ${meta.key} to ${newVersion}`,\n dryRun,\n });\n }\n\n return {\n success: true,\n specPath,\n specKey: meta.key,\n previousVersion: meta.version,\n newVersion,\n bumpType,\n changelogEntry,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('Version bump failed', { specPath, error: errorMessage });\n\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: options.bumpType ?? 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: errorMessage,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changelog Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate changelogs at all configured tiers.\n */\nexport async function generateChangelogs(\n adapters: ServiceAdapters,\n options: ChangelogGenerateOptions = {}\n): Promise<ChangelogGenerateResult> {\n const { logger } = adapters;\n const tiers = options.tiers ?? ['spec', 'library', 'monorepo'];\n const format = options.format ?? 'keep-a-changelog';\n\n logger.info('Generating changelogs...', { tiers, format });\n\n // First, analyze versions to get changes\n const analysis = await analyzeVersions(adapters, {\n baseline: options.baseline,\n workspaceRoot: options.workspaceRoot,\n });\n\n const specChangelogs: ChangelogDocBlock[] = [];\n const libraryMarkdown = new Map<string, string>();\n let monorepoMarkdown = '';\n let totalEntries = 0;\n\n // Generate per-spec changelogs\n if (tiers.includes('spec')) {\n for (const spec of analysis.analyses.filter((a) => a.needsBump)) {\n const docBlock: ChangelogDocBlock = {\n id: `changelog.${spec.specKey}`,\n title: `Changelog for ${spec.specKey}`,\n body: formatSpecChangelog(spec),\n kind: 'changelog',\n specKey: spec.specKey,\n specVersion: spec.suggestedVersion,\n entries: [\n {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n },\n ],\n };\n specChangelogs.push(docBlock);\n totalEntries++;\n }\n }\n\n // Generate library-level changelogs\n if (tiers.includes('library')) {\n const libraryGroups = groupByLibrary(analysis.analyses);\n for (const [libPath, specs] of libraryGroups) {\n const entries = specs.filter((s) => s.needsBump);\n if (entries.length > 0) {\n libraryMarkdown.set(\n libPath,\n formatKeepAChangelog(entries.map(specToChangelogEntry))\n );\n totalEntries += entries.length;\n }\n }\n }\n\n // Generate monorepo-level changelog\n if (tiers.includes('monorepo')) {\n const allEntries = analysis.analyses\n .filter((a) => a.needsBump)\n .map(specToChangelogEntry);\n monorepoMarkdown = formatKeepAChangelog(allEntries);\n }\n\n // Generate JSON export\n const json = formatChangelogJson(analysis, options.baseline);\n\n logger.info('Changelog generation complete', { totalEntries });\n\n return {\n specChangelogs,\n libraryMarkdown,\n monorepoMarkdown,\n json,\n totalEntries,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SpecMeta {\n key: string;\n version: string;\n}\n\n/**\n * Extract spec metadata from file content.\n */\nfunction extractSpecMeta(content: string): SpecMeta | null {\n // Match meta.key and meta.version patterns\n const keyMatch = content.match(/key:\\s*['\"`]([^'\"`]+)['\"`]/);\n const versionMatch = content.match(/version:\\s*['\"`]([^'\"`]+)['\"`]/);\n\n if (!keyMatch || !versionMatch) {\n return null;\n }\n\n const key = keyMatch[1];\n const version = versionMatch[1];\n\n // Type guard for regex capture groups\n if (!key || !version) {\n return null;\n }\n\n return {\n key,\n version,\n };\n}\n\n/**\n * Analyze changes between current and baseline spec content.\n */\nfunction analyzeSpecChanges(\n current: string,\n baseline: string | null\n): ChangeEntry[] {\n const changes: ChangeEntry[] = [];\n\n if (!baseline) {\n // New spec\n changes.push({\n type: 'added',\n description: 'New spec added',\n });\n return changes;\n }\n\n // Simple diff analysis - check for structural changes\n const currentMeta = extractSpecMeta(current);\n const baselineMeta = extractSpecMeta(baseline);\n\n if (!currentMeta || !baselineMeta) {\n return changes;\n }\n\n // Version change\n if (currentMeta.version !== baselineMeta.version) {\n changes.push({\n type: 'changed',\n description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,\n path: 'meta.version',\n });\n }\n\n // Check for io changes (simplified)\n const hasIoChanges = detectIoChanges(current, baseline);\n if (hasIoChanges.breaking) {\n changes.push({\n type: 'breaking',\n description: 'Breaking changes to input/output schema',\n path: 'io',\n });\n } else if (hasIoChanges.nonBreaking) {\n changes.push({\n type: 'changed',\n description: 'Non-breaking changes to input/output schema',\n path: 'io',\n });\n }\n\n return changes;\n}\n\n/**\n * Detect I/O changes between specs (simplified).\n */\nfunction detectIoChanges(\n current: string,\n baseline: string\n): { breaking: boolean; nonBreaking: boolean } {\n // Simple heuristic: check if io section differs\n const ioPattern = /io:\\s*\\{[\\s\\S]*?\\}/;\n const currentIo = current.match(ioPattern)?.[0] ?? '';\n const baselineIo = baseline.match(ioPattern)?.[0] ?? '';\n\n if (currentIo === baselineIo) {\n return { breaking: false, nonBreaking: false };\n }\n\n // Check for removed fields (breaking) vs added fields (non-breaking)\n const currentFields = extractFields(currentIo);\n const baselineFields = extractFields(baselineIo);\n\n const removedFields = baselineFields.filter(\n (f) => !currentFields.includes(f)\n );\n const addedFields = currentFields.filter((f) => !baselineFields.includes(f));\n\n return {\n breaking: removedFields.length > 0,\n nonBreaking: addedFields.length > 0 && removedFields.length === 0,\n };\n}\n\n/**\n * Extract field names from a code block (simplified).\n */\nfunction extractFields(code: string): string[] {\n const fieldPattern = /(\\w+):/g;\n const matches = [...code.matchAll(fieldPattern)];\n return matches.map((m) => m[1]).filter((field): field is string => !!field);\n}\n\n/**\n * Update version in spec content.\n */\nfunction updateSpecVersion(\n content: string,\n oldVersion: string,\n newVersion: string\n): string {\n return content.replace(\n new RegExp(`version:\\\\s*['\"\\`]${oldVersion}['\"\\`]`),\n `version: '${newVersion}'`\n );\n}\n\n/**\n * Create an empty changelog entry.\n */\nfunction createEmptyChangelogEntry(): ChangelogEntry {\n return {\n version: '0.0.0',\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: 'patch',\n changes: [],\n };\n}\n\n/**\n * Format a single spec's changelog.\n */\nfunction formatSpecChangelog(spec: SpecVersionAnalysis): string {\n const lines: string[] = [\n `## [${spec.suggestedVersion}] - ${new Date().toISOString().split('T')[0]}`,\n '',\n ];\n\n const breaking = spec.changes.filter((c) => c.type === 'breaking');\n const changed = spec.changes.filter((c) => c.type === 'changed');\n const added = spec.changes.filter((c) => c.type === 'added');\n\n if (breaking.length > 0) {\n lines.push('### Breaking Changes');\n breaking.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (added.length > 0) {\n lines.push('### Added');\n added.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (changed.length > 0) {\n lines.push('### Changed');\n changed.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Group specs by library (package path).\n */\nfunction groupByLibrary(\n analyses: SpecVersionAnalysis[]\n): Map<string, SpecVersionAnalysis[]> {\n const groups = new Map<string, SpecVersionAnalysis[]>();\n\n for (const analysis of analyses) {\n // Extract library path (up to src/)\n const libMatch = analysis.specPath.match(/(.+?\\/src\\/)/);\n const matchedPath = libMatch?.[1];\n const libPath = matchedPath ?? analysis.specPath;\n\n const existing = groups.get(libPath) ?? [];\n existing.push(analysis);\n groups.set(libPath, existing);\n }\n\n return groups;\n}\n\n/**\n * Convert SpecVersionAnalysis to ChangelogEntry.\n */\nfunction specToChangelogEntry(spec: SpecVersionAnalysis): ChangelogEntry {\n return {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changeset Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface GenerateChangesetOptions {\n specPath: string;\n bumpType: VersionBumpType;\n summary: string;\n dryRun?: boolean;\n}\n\n/**\n * Generate a changeset file for a spec update.\n */\nasync function generateChangeset(\n adapters: ServiceAdapters,\n options: GenerateChangesetOptions\n): Promise<void> {\n const { fs, logger } = adapters;\n const { specPath, bumpType, summary, dryRun } = options;\n\n try {\n const pkgRoot = findPackageRoot(specPath);\n const pkgName = getPackageName(pkgRoot);\n\n if (!pkgName) {\n logger.warn('Could not determine package name for changeset', {\n specPath,\n });\n return;\n }\n\n // Find git root to locate .changeset folder\n // This is a simplification; ideally we find the monorepo root\n // We'll walk up from pkgRoot until we find a .changeset folder or hit root\n let currentDir = pkgRoot;\n let changesetDir: string | null = null;\n\n while (true) {\n const candidate = fs.join(currentDir, '.changeset');\n if (await fs.exists(candidate)) {\n changesetDir = candidate;\n break;\n }\n const parent = fs.dirname(currentDir);\n if (parent === currentDir) break;\n currentDir = parent;\n }\n\n if (!changesetDir) {\n // Create .changeset in package root if not found elsewhere (fallback)\n // But typically it initiates in workspace root.\n // We will skip if we absolutely can't find it to avoid polluting non-monorepos unexpected\n logger.warn(\n 'No .changeset directory found, skipping changeset generation'\n );\n return;\n }\n\n const fileName = `${generateRandomName()}.md`;\n const filePath = fs.join(changesetDir, fileName);\n\n const content = `---\n\"${pkgName}\": ${bumpType}\n---\n\n${summary}\n`;\n\n if (!dryRun) {\n await fs.writeFile(filePath, content);\n logger.info('Generated changeset', { filePath });\n } else {\n logger.info('Would generate changeset', { filePath, content });\n }\n } catch (error) {\n logger.error('Failed to generate changeset', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Generate a random human-readable-ish name (simplified).\n */\nfunction generateRandomName(): string {\n const adjectives = ['neat', 'calm', 'wild', 'soft', 'bold', 'fair', 'cool'];\n const nouns = ['fox', 'cat', 'dog', 'bat', 'ant', 'elk', 'owl'];\n const verbs = ['run', 'fly', 'hop', 'eat', 'nap', 'cry', 'sing'];\n\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const verb = verbs[Math.floor(Math.random() * verbs.length)];\n const random = Math.floor(Math.random() * 1000);\n\n return `${adj}-${noun}-${verb}-${random}`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.mts","names":[],"sources":["../../../src/services/vibe/config.ts"],"
|
|
1
|
+
{"version":3,"file":"config.d.mts","names":[],"sources":["../../../src/services/vibe/config.ts"],"mappings":";;;;;;;iBAoBsB,cAAA,CAAe,GAAA,YAAe,OAAA,CAAQ,UAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.mts","names":[],"sources":["../../../src/services/vibe/context.ts"],"
|
|
1
|
+
{"version":3,"file":"context.d.mts","names":[],"sources":["../../../src/services/vibe/context.ts"],"mappings":";;AAwBA;;;;UAAiB,mBAAA;EACf,OAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;AAAA;AAMF;;;AAAA,iBAAsB,aAAA,CACpB,GAAA,YACC,OAAA,CAAQ,mBAAA"}
|