@lssm/bundle.contractspec-workspace 0.0.0-canary-20251217080011 → 1.41.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.js +1 -22
- package/dist/adapters/ai.js +1 -82
- package/dist/adapters/factory.js +1 -36
- package/dist/adapters/fs.js +1 -118
- package/dist/adapters/git.js +1 -54
- package/dist/adapters/index.js +1 -7
- package/dist/adapters/logger.js +1 -80
- package/dist/adapters/watcher.js +1 -69
- package/dist/adapters/workspace.js +2 -190
- package/dist/ai/agents/claude-code-agent.js +9 -146
- package/dist/ai/agents/cursor-agent.js +17 -286
- package/dist/ai/agents/index.js +1 -5
- package/dist/ai/agents/openai-codex-agent.js +8 -140
- package/dist/ai/agents/orchestrator.js +1 -142
- package/dist/ai/agents/simple-agent.js +4 -80
- package/dist/ai/client.js +1 -162
- package/dist/ai/index.js +1 -27
- package/dist/ai/prompts/code-generation.js +13 -55
- package/dist/ai/prompts/index.js +1 -12
- package/dist/ai/prompts/spec-creation.js +20 -61
- package/dist/ai/providers.js +1 -40
- package/dist/formatters/index.js +1 -18
- package/dist/formatters/json.js +1 -71
- package/dist/formatters/sarif.js +1 -163
- package/dist/formatters/text.js +2 -208
- package/dist/index.js +1 -81
- package/dist/node_modules/@ai-sdk/anthropic/dist/index.js +1 -0
- package/dist/node_modules/@ai-sdk/openai/dist/index.js +11 -0
- package/dist/node_modules/@ai-sdk/provider/dist/index.js +3 -0
- package/dist/node_modules/@ai-sdk/provider-utils/dist/index.js +5 -0
- package/dist/node_modules/chalk/source/index.js +2 -0
- package/dist/node_modules/chalk/source/utilities.js +4 -0
- package/dist/node_modules/chalk/source/vendor/ansi-styles/index.js +1 -0
- package/dist/node_modules/chalk/source/vendor/supports-color/browser.js +1 -0
- package/dist/node_modules/cli-cursor/index.js +1 -0
- package/dist/node_modules/cli-spinners/index.js +1 -0
- package/dist/node_modules/cli-spinners/spinners.js +1 -0
- package/dist/node_modules/eventsource-parser/dist/index.js +5 -0
- package/dist/node_modules/eventsource-parser/dist/stream.js +1 -0
- package/dist/node_modules/get-east-asian-width/index.js +1 -0
- package/dist/node_modules/get-east-asian-width/lookup.js +1 -0
- package/dist/node_modules/is-interactive/index.js +1 -0
- package/dist/node_modules/is-unicode-supported/index.js +1 -0
- package/dist/node_modules/log-symbols/browser-symbols.js +1 -0
- package/dist/node_modules/mimic-function/index.js +1 -0
- package/dist/node_modules/onetime/index.js +1 -0
- package/dist/node_modules/ora/index.js +6 -0
- package/dist/node_modules/restore-cursor/index.js +1 -0
- package/dist/node_modules/signal-exit/dist/mjs/index.js +1 -0
- package/dist/node_modules/signal-exit/dist/mjs/signals.js +1 -0
- package/dist/node_modules/stdin-discarder/index.js +1 -0
- package/dist/node_modules/string-width/index.js +1 -0
- package/dist/node_modules/strip-ansi/index.js +1 -0
- package/dist/node_modules/strip-ansi/node_modules/ansi-regex/index.js +1 -0
- package/dist/services/agent-guide/adapters/claude-code.js +3 -144
- package/dist/services/agent-guide/adapters/cursor-cli.js +3 -135
- package/dist/services/agent-guide/adapters/generic-mcp.js +3 -159
- package/dist/services/agent-guide/adapters/index.js +1 -30
- package/dist/services/agent-guide/agent-guide-service.js +1 -148
- package/dist/services/agent-guide/index.js +1 -5
- package/dist/services/build.js +1 -140
- package/dist/services/ci-check/ci-check-service.js +1 -393
- package/dist/services/ci-check/index.js +1 -2
- package/dist/services/ci-check/types.js +1 -28
- package/dist/services/clean.js +1 -71
- package/dist/services/config.js +1 -76
- package/dist/services/deps.js +1 -62
- package/dist/services/diff.js +1 -33
- package/dist/services/doctor/checks/ai.js +2 -118
- package/dist/services/doctor/checks/cli.js +1 -146
- package/dist/services/doctor/checks/config.js +1 -170
- package/dist/services/doctor/checks/deps.js +1 -180
- package/dist/services/doctor/checks/index.js +1 -6
- package/dist/services/doctor/checks/mcp.js +1 -144
- package/dist/services/doctor/checks/workspace.js +1 -243
- package/dist/services/doctor/doctor-service.js +2 -115
- package/dist/services/doctor/index.js +1 -2
- package/dist/services/doctor/types.js +1 -26
- package/dist/services/implementation/discovery.js +2 -143
- package/dist/services/implementation/index.js +1 -2
- package/dist/services/implementation/resolver.js +1 -223
- package/dist/services/index.js +1 -53
- package/dist/services/integrity-diagram.js +6 -274
- package/dist/services/integrity.js +1 -272
- package/dist/services/list.js +1 -35
- package/dist/services/openapi/export-service.js +2 -51
- package/dist/services/openapi/import-service.js +1 -75
- package/dist/services/openapi/index.js +1 -4
- package/dist/services/openapi/sync-service.js +1 -121
- package/dist/services/openapi/validate-service.js +1 -130
- package/dist/services/regenerator.js +1 -23
- package/dist/services/registry.js +1 -73
- package/dist/services/setup/config-generators.js +26 -113
- package/dist/services/setup/file-merger.js +2 -60
- package/dist/services/setup/index.js +1 -4
- package/dist/services/setup/setup-service.js +1 -95
- package/dist/services/setup/targets/agents-md.js +1 -46
- package/dist/services/setup/targets/cli-config.js +1 -59
- package/dist/services/setup/targets/cursor-rules.js +1 -47
- package/dist/services/setup/targets/mcp-claude.js +1 -59
- package/dist/services/setup/targets/mcp-cursor.js +1 -58
- package/dist/services/setup/targets/vscode-settings.js +1 -62
- package/dist/services/setup/types.js +1 -26
- package/dist/services/sync.js +1 -62
- package/dist/services/test.js +1 -30
- package/dist/services/validate-implementation.js +1 -69
- package/dist/services/validate.js +1 -47
- package/dist/services/verification-cache/adapters/filesystem.js +1 -121
- package/dist/services/verification-cache/adapters/in-memory.js +1 -45
- package/dist/services/verification-cache/adapters/index.js +1 -3
- package/dist/services/verification-cache/adapters/workspace-state.js +1 -90
- package/dist/services/verification-cache/cache-service.js +1 -255
- package/dist/services/verification-cache/index.js +1 -6
- package/dist/services/verification-cache/types.js +1 -15
- package/dist/services/verify/ai-verifier.js +9 -336
- package/dist/services/verify/behavior-verifier.js +1 -185
- package/dist/services/verify/index.js +1 -4
- package/dist/services/verify/structure-verifier.js +2 -195
- package/dist/services/verify/verify-service.js +3 -203
- package/dist/services/watch.js +1 -31
- package/dist/services/workspace-info.js +2 -102
- package/dist/templates/app-config.template.js +28 -101
- package/dist/templates/data-view.template.js +27 -42
- package/dist/templates/event.template.js +14 -29
- package/dist/templates/experiment.template.js +51 -77
- package/dist/templates/handler.template.js +17 -53
- package/dist/templates/index.js +1 -36
- package/dist/templates/integration.template.js +50 -134
- package/dist/templates/knowledge.template.js +21 -62
- package/dist/templates/migration.template.js +26 -50
- package/dist/templates/operation.template.js +28 -44
- package/dist/templates/presentation.template.js +20 -46
- package/dist/templates/telemetry.template.js +53 -74
- package/dist/templates/workflow-runner.template.js +6 -12
- package/dist/templates/workflow.template.js +24 -51
- package/package.json +10 -16
- package/dist/adapters/ai.d.ts +0 -11
- package/dist/adapters/factory.d.ts +0 -28
- package/dist/adapters/fs.d.ts +0 -10
- package/dist/adapters/git.d.ts +0 -10
- package/dist/adapters/logger.d.ts +0 -17
- package/dist/adapters/watcher.d.ts +0 -10
- package/dist/adapters/workspace.d.ts +0 -93
- package/dist/ai/agents/claude-code-agent.d.ts +0 -21
- package/dist/ai/agents/cursor-agent.d.ts +0 -67
- package/dist/ai/agents/openai-codex-agent.d.ts +0 -21
- package/dist/ai/agents/orchestrator.d.ts +0 -49
- package/dist/ai/agents/simple-agent.d.ts +0 -16
- package/dist/ai/agents/types.d.ts +0 -35
- package/dist/ai/client.d.ts +0 -82
- package/dist/ai/index.d.ts +0 -16
- package/dist/ai/prompts/code-generation.d.ts +0 -25
- package/dist/ai/prompts/index.d.ts +0 -9
- package/dist/ai/prompts/spec-creation.d.ts +0 -28
- package/dist/ai/providers.d.ts +0 -28
- package/dist/formatters/index.d.ts +0 -10
- package/dist/formatters/json.d.ts +0 -88
- package/dist/formatters/sarif.d.ts +0 -100
- package/dist/formatters/text.d.ts +0 -34
- package/dist/index.d.ts +0 -66
- package/dist/libs/ai-providers/dist/factory.js +0 -154
- package/dist/libs/ai-providers/dist/index.js +0 -4
- package/dist/libs/ai-providers/dist/legacy.js +0 -72
- package/dist/libs/ai-providers/dist/models.js +0 -287
- package/dist/libs/ai-providers/dist/validation.js +0 -1
- package/dist/libs/contracts/dist/capabilities/openbanking.js +0 -88
- package/dist/libs/contracts/dist/client/index.js +0 -5
- package/dist/libs/contracts/dist/client/react/feature-render.js +0 -2
- package/dist/libs/contracts/dist/client/react/form-render.js +0 -4
- package/dist/libs/contracts/dist/client/react/index.js +0 -4
- package/dist/libs/contracts/dist/contract-registry/index.js +0 -1
- package/dist/libs/contracts/dist/contract-registry/schemas.js +0 -60
- package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/index.js +0 -29
- package/dist/libs/contracts/dist/docs/presentations.js +0 -71
- package/dist/libs/contracts/dist/docs/registry.js +0 -44
- package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +0 -80
- package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +0 -57
- package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +0 -357
- package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +0 -37
- package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +0 -16
- package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +0 -20
- package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +0 -48
- package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +0 -79
- package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +0 -84
- package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +0 -45
- package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +0 -67
- package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +0 -40
- package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +0 -69
- package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +0 -47
- package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +0 -62
- package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +0 -155
- package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +0 -20
- package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +0 -101
- package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +0 -20
- package/dist/libs/contracts/dist/events.js +0 -8
- package/dist/libs/contracts/dist/experiments/evaluator.js +0 -1
- package/dist/libs/contracts/dist/index.js +0 -72
- package/dist/libs/contracts/dist/install.js +0 -2
- package/dist/libs/contracts/dist/integrations/contracts.js +0 -377
- package/dist/libs/contracts/dist/integrations/index.js +0 -18
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +0 -228
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +0 -159
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/index.js +0 -3
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +0 -210
- package/dist/libs/contracts/dist/integrations/openbanking/models.js +0 -242
- package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +0 -13
- package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +0 -52
- package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +0 -75
- package/dist/libs/contracts/dist/integrations/providers/gmail.js +0 -87
- package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +0 -66
- package/dist/libs/contracts/dist/integrations/providers/index.js +0 -11
- package/dist/libs/contracts/dist/integrations/providers/mistral.js +0 -68
- package/dist/libs/contracts/dist/integrations/providers/postmark.js +0 -68
- package/dist/libs/contracts/dist/integrations/providers/powens.js +0 -116
- package/dist/libs/contracts/dist/integrations/providers/qdrant.js +0 -73
- package/dist/libs/contracts/dist/integrations/providers/registry.js +0 -10
- package/dist/libs/contracts/dist/integrations/providers/stripe.js +0 -83
- package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +0 -61
- package/dist/libs/contracts/dist/jsonschema.js +0 -24
- package/dist/libs/contracts/dist/knowledge/contracts.js +0 -306
- package/dist/libs/contracts/dist/knowledge/index.js +0 -7
- package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +0 -34
- package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +0 -34
- package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +0 -38
- package/dist/libs/contracts/dist/knowledge/spaces/index.js +0 -6
- package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +0 -34
- package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +0 -37
- package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +0 -34
- package/dist/libs/contracts/dist/llm/exporters.js +0 -352
- package/dist/libs/contracts/dist/llm/index.js +0 -2
- package/dist/libs/contracts/dist/llm/prompts.js +0 -211
- package/dist/libs/contracts/dist/onboarding-base.js +0 -196
- package/dist/libs/contracts/dist/openapi.js +0 -75
- package/dist/libs/contracts/dist/ownership.js +0 -21
- package/dist/libs/contracts/dist/presentations.js +0 -1
- package/dist/libs/contracts/dist/presentations.v2.js +0 -11
- package/dist/libs/contracts/dist/prompt.js +0 -1
- package/dist/libs/contracts/dist/promptRegistry.js +0 -1
- package/dist/libs/contracts/dist/regenerator/index.js +0 -2
- package/dist/libs/contracts/dist/regenerator/service.js +0 -92
- package/dist/libs/contracts/dist/regenerator/utils.js +0 -51
- package/dist/libs/contracts/dist/registry.js +0 -208
- package/dist/libs/contracts/dist/resources.js +0 -1
- package/dist/libs/contracts/dist/schema/dist/EnumType.js +0 -2
- package/dist/libs/contracts/dist/schema/dist/FieldType.js +0 -49
- package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +0 -236
- package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +0 -34
- package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +0 -1
- package/dist/libs/contracts/dist/schema/dist/entity/index.js +0 -2
- package/dist/libs/contracts/dist/schema/dist/entity/types.js +0 -1
- package/dist/libs/contracts/dist/schema/dist/index.js +0 -6
- package/dist/libs/contracts/dist/server/graphql-pothos.js +0 -6
- package/dist/libs/contracts/dist/server/index.js +0 -8
- package/dist/libs/contracts/dist/server/mcp/createMcpServer.js +0 -4
- package/dist/libs/contracts/dist/server/mcp/registerPresentations.js +0 -2
- package/dist/libs/contracts/dist/server/mcp/registerPrompts.js +0 -1
- package/dist/libs/contracts/dist/server/mcp/registerResources.js +0 -2
- package/dist/libs/contracts/dist/server/mcp/registerTools.js +0 -1
- package/dist/libs/contracts/dist/server/provider-mcp.js +0 -1
- package/dist/libs/contracts/dist/server/rest-elysia.js +0 -1
- package/dist/libs/contracts/dist/server/rest-express.js +0 -1
- package/dist/libs/contracts/dist/server/rest-generic.js +0 -1
- package/dist/libs/contracts/dist/server/rest-next-app.js +0 -1
- package/dist/libs/contracts/dist/server/rest-next-pages.js +0 -1
- package/dist/libs/contracts/dist/spec.js +0 -35
- package/dist/libs/contracts/dist/telemetry/index.js +0 -1
- package/dist/libs/contracts/dist/telemetry/tracker.js +0 -1
- package/dist/libs/contracts/dist/tests/index.js +0 -1
- package/dist/libs/contracts/dist/tests/runner.js +0 -150
- package/dist/libs/contracts/dist/workflow/index.js +0 -1
- package/dist/libs/contracts/dist/workflow/runner.js +0 -1
- package/dist/libs/contracts-transformers/dist/common/utils.js +0 -47
- package/dist/libs/contracts-transformers/dist/openapi/exporter.js +0 -1
- package/dist/libs/contracts-transformers/dist/openapi/importer.js +0 -255
- package/dist/libs/contracts-transformers/dist/openapi/index.js +0 -4
- package/dist/libs/contracts-transformers/dist/openapi/parser.js +0 -231
- package/dist/libs/contracts-transformers/dist/openapi/schema-converter.js +0 -201
- package/dist/modules/contractspec-workspace/dist/ai/code-generation.js +0 -137
- package/dist/modules/contractspec-workspace/dist/ai/spec-creation.js +0 -101
- package/dist/modules/contractspec-workspace/dist/analysis/deps/graph.js +0 -84
- package/dist/modules/contractspec-workspace/dist/analysis/deps/parse-imports.js +0 -30
- package/dist/modules/contractspec-workspace/dist/analysis/diff/semantic.js +0 -96
- package/dist/modules/contractspec-workspace/dist/analysis/feature-scan.js +0 -151
- package/dist/modules/contractspec-workspace/dist/analysis/spec-scan.js +0 -344
- package/dist/modules/contractspec-workspace/dist/analysis/validate/spec-structure.js +0 -122
- package/dist/modules/contractspec-workspace/dist/templates/app-config.js +0 -105
- package/dist/modules/contractspec-workspace/dist/templates/data-view.js +0 -68
- package/dist/modules/contractspec-workspace/dist/templates/event.js +0 -38
- package/dist/modules/contractspec-workspace/dist/templates/experiment.js +0 -87
- package/dist/modules/contractspec-workspace/dist/templates/handler.js +0 -95
- package/dist/modules/contractspec-workspace/dist/templates/integration-utils.js +0 -104
- package/dist/modules/contractspec-workspace/dist/templates/integration.js +0 -62
- package/dist/modules/contractspec-workspace/dist/templates/knowledge.js +0 -68
- package/dist/modules/contractspec-workspace/dist/templates/migration.js +0 -60
- package/dist/modules/contractspec-workspace/dist/templates/operation.js +0 -100
- package/dist/modules/contractspec-workspace/dist/templates/presentation.js +0 -78
- package/dist/modules/contractspec-workspace/dist/templates/telemetry.js +0 -89
- package/dist/modules/contractspec-workspace/dist/templates/utils.js +0 -38
- package/dist/modules/contractspec-workspace/dist/templates/workflow-runner.js +0 -48
- package/dist/modules/contractspec-workspace/dist/templates/workflow.js +0 -67
- package/dist/modules/contractspec-workspace/dist/types/generation-types.js +0 -20
- package/dist/ports/ai.d.ts +0 -58
- package/dist/ports/fs.d.ts +0 -80
- package/dist/ports/git.d.ts +0 -32
- package/dist/ports/logger.d.ts +0 -87
- package/dist/ports/watcher.d.ts +0 -51
- package/dist/services/agent-guide/adapters/claude-code.d.ts +0 -34
- package/dist/services/agent-guide/adapters/cursor-cli.d.ts +0 -38
- package/dist/services/agent-guide/adapters/generic-mcp.d.ts +0 -52
- package/dist/services/agent-guide/adapters/index.d.ts +0 -22
- package/dist/services/agent-guide/agent-guide-service.d.ts +0 -55
- package/dist/services/agent-guide/types.d.ts +0 -57
- package/dist/services/build.d.ts +0 -58
- package/dist/services/ci-check/ci-check-service.d.ts +0 -15
- package/dist/services/ci-check/types.d.ts +0 -142
- package/dist/services/clean.d.ts +0 -40
- package/dist/services/config.d.ts +0 -25
- package/dist/services/deps.d.ts +0 -52
- package/dist/services/diff.d.ts +0 -33
- package/dist/services/doctor/doctor-service.d.ts +0 -23
- package/dist/services/doctor/types.d.ts +0 -117
- package/dist/services/implementation/discovery.d.ts +0 -29
- package/dist/services/implementation/resolver.d.ts +0 -43
- package/dist/services/implementation/types.d.ts +0 -78
- package/dist/services/integrity-diagram.d.ts +0 -35
- package/dist/services/integrity.d.ts +0 -133
- package/dist/services/list.d.ts +0 -30
- package/dist/services/openapi/export-service.d.ts +0 -52
- package/dist/services/openapi/import-service.d.ts +0 -15
- package/dist/services/openapi/sync-service.d.ts +0 -18
- package/dist/services/openapi/types.d.ts +0 -184
- package/dist/services/openapi/validate-service.d.ts +0 -15
- package/dist/services/regenerator.d.ts +0 -17
- package/dist/services/registry.d.ts +0 -52
- package/dist/services/setup/config-generators.d.ts +0 -41
- package/dist/services/setup/file-merger.d.ts +0 -26
- package/dist/services/setup/setup-service.d.ts +0 -11
- package/dist/services/setup/types.d.ts +0 -84
- package/dist/services/sync.d.ts +0 -40
- package/dist/services/test.d.ts +0 -14
- package/dist/services/validate-implementation.d.ts +0 -31
- package/dist/services/validate.d.ts +0 -40
- package/dist/services/verification-cache/adapters/filesystem.d.ts +0 -45
- package/dist/services/verification-cache/adapters/in-memory.d.ts +0 -26
- package/dist/services/verification-cache/adapters/workspace-state.d.ts +0 -48
- package/dist/services/verification-cache/cache-service.d.ts +0 -69
- package/dist/services/verification-cache/types.d.ts +0 -123
- package/dist/services/verify/ai-verifier.d.ts +0 -24
- package/dist/services/verify/behavior-verifier.d.ts +0 -11
- package/dist/services/verify/structure-verifier.d.ts +0 -11
- package/dist/services/verify/types.d.ts +0 -136
- package/dist/services/verify/verify-service.d.ts +0 -59
- package/dist/services/watch.d.ts +0 -24
- package/dist/services/workspace-info.d.ts +0 -61
- package/dist/templates/app-config.template.d.ts +0 -6
- package/dist/templates/data-view.template.d.ts +0 -6
- package/dist/templates/event.template.d.ts +0 -10
- package/dist/templates/experiment.template.d.ts +0 -6
- package/dist/templates/handler.template.d.ts +0 -15
- package/dist/templates/index.d.ts +0 -20
- package/dist/templates/integration.template.d.ts +0 -6
- package/dist/templates/knowledge.template.d.ts +0 -6
- package/dist/templates/migration.template.d.ts +0 -6
- package/dist/templates/operation.template.d.ts +0 -10
- package/dist/templates/presentation.template.d.ts +0 -10
- package/dist/templates/telemetry.template.d.ts +0 -6
- package/dist/templates/workflow-runner.template.d.ts +0 -15
- package/dist/templates/workflow.template.d.ts +0 -6
- package/dist/types/config.d.ts +0 -33
- package/dist/types.d.ts +0 -323
|
@@ -1,75 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { importFromOpenApi } from "../../libs/contracts-transformers/dist/openapi/importer.js";
|
|
3
|
-
import "../../libs/contracts-transformers/dist/openapi/index.js";
|
|
4
|
-
import { dirname, join } from "path";
|
|
5
|
-
|
|
6
|
-
//#region src/services/openapi/import-service.ts
|
|
7
|
-
/**
|
|
8
|
-
* OpenAPI import service - imports specs from OpenAPI documents.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Import ContractSpec specs from an OpenAPI document.
|
|
12
|
-
*/
|
|
13
|
-
async function importFromOpenApiService(options, adapters) {
|
|
14
|
-
const { fs, logger } = adapters;
|
|
15
|
-
const { source, outputDir, prefix, tags, exclude, defaultStability, defaultOwners, defaultAuth, dryRun = false } = options;
|
|
16
|
-
logger.info(`Importing from OpenAPI: ${source}`);
|
|
17
|
-
const parseResult = await parseOpenApi(source, {
|
|
18
|
-
fetch: globalThis.fetch,
|
|
19
|
-
readFile: (path) => fs.readFile(path)
|
|
20
|
-
});
|
|
21
|
-
if (parseResult.warnings.length > 0) for (const warning of parseResult.warnings) logger.warn(`Parse warning: ${warning}`);
|
|
22
|
-
logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title} v${parseResult.info.version}`);
|
|
23
|
-
const importResult = importFromOpenApi(parseResult, {
|
|
24
|
-
prefix,
|
|
25
|
-
tags,
|
|
26
|
-
exclude,
|
|
27
|
-
defaultStability,
|
|
28
|
-
defaultOwners,
|
|
29
|
-
defaultAuth
|
|
30
|
-
});
|
|
31
|
-
logger.info(`Import result: ${importResult.summary.imported} imported, ${importResult.summary.skipped} skipped, ${importResult.summary.errors} errors`);
|
|
32
|
-
const files = [];
|
|
33
|
-
const skippedOperations = [];
|
|
34
|
-
const errorMessages = [];
|
|
35
|
-
for (const spec of importResult.specs) {
|
|
36
|
-
const filePath = join(outputDir, spec.fileName);
|
|
37
|
-
if (dryRun) logger.info(`[DRY RUN] Would create: ${filePath}`);
|
|
38
|
-
else {
|
|
39
|
-
const dir = dirname(filePath);
|
|
40
|
-
await fs.mkdir(dir);
|
|
41
|
-
await fs.writeFile(filePath, spec.code);
|
|
42
|
-
logger.info(`Created: ${filePath}`);
|
|
43
|
-
}
|
|
44
|
-
files.push({
|
|
45
|
-
path: filePath,
|
|
46
|
-
operationId: spec.source.sourceId,
|
|
47
|
-
specName: spec.fileName.replace(".ts", "")
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
for (const skipped of importResult.skipped) {
|
|
51
|
-
skippedOperations.push({
|
|
52
|
-
operationId: skipped.sourceId,
|
|
53
|
-
reason: skipped.reason
|
|
54
|
-
});
|
|
55
|
-
logger.debug(`Skipped: ${skipped.sourceId} - ${skipped.reason}`);
|
|
56
|
-
}
|
|
57
|
-
for (const error of importResult.errors) {
|
|
58
|
-
errorMessages.push({
|
|
59
|
-
operationId: error.sourceId,
|
|
60
|
-
error: error.error
|
|
61
|
-
});
|
|
62
|
-
logger.error(`Error: ${error.sourceId} - ${error.error}`);
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
imported: importResult.summary.imported,
|
|
66
|
-
skipped: importResult.summary.skipped,
|
|
67
|
-
errors: importResult.summary.errors,
|
|
68
|
-
files,
|
|
69
|
-
skippedOperations,
|
|
70
|
-
errorMessages
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
//#endregion
|
|
75
|
-
export { importFromOpenApiService };
|
|
1
|
+
import{importFromOpenApi as e,parseOpenApi as t}from"@lssm/lib.contracts-transformers/openapi";import{dirname as n,join as r}from"path";async function i(i,a){let{fs:o,logger:s}=a,{source:c,outputDir:l,prefix:u,tags:d,exclude:f,defaultStability:p,defaultOwners:m,defaultAuth:h,dryRun:g=!1}=i;s.info(`Importing from OpenAPI: ${c}`);let _=await t(c,{fetch:globalThis.fetch,readFile:e=>o.readFile(e)});if(_.warnings.length>0)for(let e of _.warnings)s.warn(`Parse warning: ${e}`);s.info(`Parsed ${_.operations.length} operations from ${_.info.title} v${_.info.version}`);let v=e(_,{prefix:u,tags:d,exclude:f,defaultStability:p,defaultOwners:m,defaultAuth:h});s.info(`Import result: ${v.summary.imported} imported, ${v.summary.skipped} skipped, ${v.summary.errors} errors`);let y=[],b=[],x=[];for(let e of v.specs){let t=r(l,e.fileName);if(g)s.info(`[DRY RUN] Would create: ${t}`);else{let r=n(t);await o.mkdir(r),await o.writeFile(t,e.code),s.info(`Created: ${t}`)}y.push({path:t,operationId:e.source.sourceId,specName:e.fileName.replace(`.ts`,``)})}for(let e of v.skipped)b.push({operationId:e.sourceId,reason:e.reason}),s.debug(`Skipped: ${e.sourceId} - ${e.reason}`);for(let e of v.errors)x.push({operationId:e.sourceId,error:e.error}),s.error(`Error: ${e.sourceId} - ${e.error}`);return{imported:v.summary.imported,skipped:v.summary.skipped,errors:v.summary.errors,files:y,skippedOperations:b,errorMessages:x}}export{i as importFromOpenApiService};
|
|
@@ -1,4 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { syncWithOpenApiService } from "./sync-service.js";
|
|
3
|
-
import { validateAgainstOpenApiService } from "./validate-service.js";
|
|
4
|
-
import { exportOpenApi } from "./export-service.js";
|
|
1
|
+
import{importFromOpenApiService as e}from"./import-service.js";import{syncWithOpenApiService as t}from"./sync-service.js";import{validateAgainstOpenApiService as n}from"./validate-service.js";import{exportOpenApi as r}from"./export-service.js";
|
|
@@ -1,121 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { importFromOpenApi } from "../../libs/contracts-transformers/dist/openapi/importer.js";
|
|
3
|
-
import "../../libs/contracts-transformers/dist/openapi/index.js";
|
|
4
|
-
import { dirname, join } from "path";
|
|
5
|
-
|
|
6
|
-
//#region src/services/openapi/sync-service.ts
|
|
7
|
-
/**
|
|
8
|
-
* OpenAPI sync service - syncs specs with OpenAPI sources.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Sync ContractSpec specs with OpenAPI sources.
|
|
12
|
-
*/
|
|
13
|
-
async function syncWithOpenApiService(options, config, adapters) {
|
|
14
|
-
const { fs, logger } = adapters;
|
|
15
|
-
const { sources: optSources, sourceName, interactive, force, dryRun } = options;
|
|
16
|
-
const { sources: configSources, outputDir } = config;
|
|
17
|
-
let sourcesToSync = optSources ?? configSources ?? [];
|
|
18
|
-
if (sourceName) {
|
|
19
|
-
sourcesToSync = sourcesToSync.filter((s) => s.name === sourceName);
|
|
20
|
-
if (sourcesToSync.length === 0) throw new Error(`Source not found: ${sourceName}`);
|
|
21
|
-
}
|
|
22
|
-
if (sourcesToSync.length === 0) {
|
|
23
|
-
logger.warn("No OpenAPI sources configured. Add sources to .contractsrc.json");
|
|
24
|
-
return {
|
|
25
|
-
added: 0,
|
|
26
|
-
updated: 0,
|
|
27
|
-
unchanged: 0,
|
|
28
|
-
conflicts: 0,
|
|
29
|
-
changes: []
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
const result = {
|
|
33
|
-
added: 0,
|
|
34
|
-
updated: 0,
|
|
35
|
-
unchanged: 0,
|
|
36
|
-
conflicts: 0,
|
|
37
|
-
changes: []
|
|
38
|
-
};
|
|
39
|
-
for (const source of sourcesToSync) {
|
|
40
|
-
logger.info(`Syncing with source: ${source.name}`);
|
|
41
|
-
const sourceLocation = source.url ?? source.file;
|
|
42
|
-
if (!sourceLocation) {
|
|
43
|
-
logger.warn(`Source ${source.name} has no url or file configured`);
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
const parseResult = await parseOpenApi(sourceLocation, {
|
|
47
|
-
fetch: globalThis.fetch,
|
|
48
|
-
readFile: (path) => fs.readFile(path)
|
|
49
|
-
});
|
|
50
|
-
logger.info(`Parsed ${parseResult.operations.length} operations from ${source.name}`);
|
|
51
|
-
const importResult = importFromOpenApi(parseResult, {
|
|
52
|
-
prefix: source.prefix,
|
|
53
|
-
tags: source.tags,
|
|
54
|
-
exclude: source.exclude,
|
|
55
|
-
defaultStability: source.defaultStability,
|
|
56
|
-
defaultAuth: source.defaultAuth
|
|
57
|
-
});
|
|
58
|
-
for (const imported of importResult.specs) {
|
|
59
|
-
const filePath = join(outputDir, imported.fileName);
|
|
60
|
-
if (!await fs.exists(filePath)) {
|
|
61
|
-
if (!dryRun) {
|
|
62
|
-
const dir = dirname(filePath);
|
|
63
|
-
await fs.mkdir(dir);
|
|
64
|
-
await fs.writeFile(filePath, imported.code);
|
|
65
|
-
}
|
|
66
|
-
result.added++;
|
|
67
|
-
result.changes.push({
|
|
68
|
-
operationId: imported.source.sourceId,
|
|
69
|
-
action: "added",
|
|
70
|
-
path: filePath
|
|
71
|
-
});
|
|
72
|
-
logger.info(`Added: ${imported.source.sourceId}`);
|
|
73
|
-
} else if (await fs.readFile(filePath) === imported.code) {
|
|
74
|
-
result.unchanged++;
|
|
75
|
-
result.changes.push({
|
|
76
|
-
operationId: imported.source.sourceId,
|
|
77
|
-
action: "unchanged",
|
|
78
|
-
path: filePath
|
|
79
|
-
});
|
|
80
|
-
} else if (force === "openapi") {
|
|
81
|
-
if (!dryRun) await fs.writeFile(filePath, imported.code);
|
|
82
|
-
result.updated++;
|
|
83
|
-
result.changes.push({
|
|
84
|
-
operationId: imported.source.sourceId,
|
|
85
|
-
action: "updated",
|
|
86
|
-
path: filePath
|
|
87
|
-
});
|
|
88
|
-
logger.info(`Updated: ${imported.source.sourceId}`);
|
|
89
|
-
} else if (force === "contractspec") {
|
|
90
|
-
result.unchanged++;
|
|
91
|
-
result.changes.push({
|
|
92
|
-
operationId: imported.source.sourceId,
|
|
93
|
-
action: "unchanged",
|
|
94
|
-
path: filePath
|
|
95
|
-
});
|
|
96
|
-
logger.info(`Kept: ${imported.source.sourceId}`);
|
|
97
|
-
} else if (interactive) {
|
|
98
|
-
result.conflicts++;
|
|
99
|
-
result.changes.push({
|
|
100
|
-
operationId: imported.source.sourceId,
|
|
101
|
-
action: "conflict",
|
|
102
|
-
path: filePath
|
|
103
|
-
});
|
|
104
|
-
logger.warn(`Conflict: ${imported.source.sourceId} - needs resolution`);
|
|
105
|
-
} else {
|
|
106
|
-
result.conflicts++;
|
|
107
|
-
result.changes.push({
|
|
108
|
-
operationId: imported.source.sourceId,
|
|
109
|
-
action: "conflict",
|
|
110
|
-
path: filePath
|
|
111
|
-
});
|
|
112
|
-
logger.warn(`Conflict: ${imported.source.sourceId}`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
logger.info(`Sync complete: ${result.added} added, ${result.updated} updated, ${result.unchanged} unchanged, ${result.conflicts} conflicts`);
|
|
117
|
-
return result;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
//#endregion
|
|
121
|
-
export { syncWithOpenApiService };
|
|
1
|
+
import{importFromOpenApi as e,parseOpenApi as t}from"@lssm/lib.contracts-transformers/openapi";import{dirname as n,join as r}from"path";async function i(i,a,o){let{fs:s,logger:c}=o,{sources:l,sourceName:u,interactive:d,force:f,dryRun:p}=i,{sources:m,outputDir:h}=a,g=l??m??[];if(u&&(g=g.filter(e=>e.name===u),g.length===0))throw Error(`Source not found: ${u}`);if(g.length===0)return c.warn(`No OpenAPI sources configured. Add sources to .contractsrc.json`),{added:0,updated:0,unchanged:0,conflicts:0,changes:[]};let _={added:0,updated:0,unchanged:0,conflicts:0,changes:[]};for(let i of g){c.info(`Syncing with source: ${i.name}`);let a=i.url??i.file;if(!a){c.warn(`Source ${i.name} has no url or file configured`);continue}let o=await t(a,{fetch:globalThis.fetch,readFile:e=>s.readFile(e)});c.info(`Parsed ${o.operations.length} operations from ${i.name}`);let l=e(o,{prefix:i.prefix,tags:i.tags,exclude:i.exclude,defaultStability:i.defaultStability,defaultAuth:i.defaultAuth});for(let e of l.specs){let t=r(h,e.fileName);if(await s.exists(t))await s.readFile(t)===e.code?(_.unchanged++,_.changes.push({operationId:e.source.sourceId,action:`unchanged`,path:t})):f===`openapi`?(p||await s.writeFile(t,e.code),_.updated++,_.changes.push({operationId:e.source.sourceId,action:`updated`,path:t}),c.info(`Updated: ${e.source.sourceId}`)):f===`contractspec`?(_.unchanged++,_.changes.push({operationId:e.source.sourceId,action:`unchanged`,path:t}),c.info(`Kept: ${e.source.sourceId}`)):d?(_.conflicts++,_.changes.push({operationId:e.source.sourceId,action:`conflict`,path:t}),c.warn(`Conflict: ${e.source.sourceId} - needs resolution`)):(_.conflicts++,_.changes.push({operationId:e.source.sourceId,action:`conflict`,path:t}),c.warn(`Conflict: ${e.source.sourceId}`));else{if(!p){let r=n(t);await s.mkdir(r),await s.writeFile(t,e.code)}_.added++,_.changes.push({operationId:e.source.sourceId,action:`added`,path:t}),c.info(`Added: ${e.source.sourceId}`)}}}return c.info(`Sync complete: ${_.added} added, ${_.updated} updated, ${_.unchanged} unchanged, ${_.conflicts} conflicts`),_}export{i as syncWithOpenApiService};
|
|
@@ -1,130 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../../libs/contracts-transformers/dist/openapi/index.js";
|
|
3
|
-
|
|
4
|
-
//#region src/services/openapi/validate-service.ts
|
|
5
|
-
/**
|
|
6
|
-
* OpenAPI validation service - validates specs against OpenAPI sources.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Validate ContractSpec specs against an OpenAPI source.
|
|
10
|
-
*/
|
|
11
|
-
async function validateAgainstOpenApiService(options, adapters) {
|
|
12
|
-
const { fs, logger } = adapters;
|
|
13
|
-
const { specPath, openApiSource, ignoreDescriptions, ignoreTags, ignoreTransport } = options;
|
|
14
|
-
logger.info(`Validating specs against OpenAPI: ${openApiSource}`);
|
|
15
|
-
const parseResult = await parseOpenApi(openApiSource, {
|
|
16
|
-
fetch: globalThis.fetch,
|
|
17
|
-
readFile: (path) => fs.readFile(path)
|
|
18
|
-
});
|
|
19
|
-
logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title}`);
|
|
20
|
-
const operationsMap = /* @__PURE__ */ new Map();
|
|
21
|
-
for (const op of parseResult.operations) operationsMap.set(op.operationId, op);
|
|
22
|
-
const results = [];
|
|
23
|
-
let specsValidated = 0;
|
|
24
|
-
let specsWithDiffs = 0;
|
|
25
|
-
const stat = await fs.stat(specPath);
|
|
26
|
-
const specFiles = [];
|
|
27
|
-
if (stat.isDirectory) {
|
|
28
|
-
const files = await fs.glob({
|
|
29
|
-
pattern: "**/*.ts",
|
|
30
|
-
cwd: specPath,
|
|
31
|
-
ignore: [
|
|
32
|
-
"node_modules/**",
|
|
33
|
-
"dist/**",
|
|
34
|
-
"*.test.ts",
|
|
35
|
-
"*.spec.ts"
|
|
36
|
-
],
|
|
37
|
-
absolute: true
|
|
38
|
-
});
|
|
39
|
-
specFiles.push(...files);
|
|
40
|
-
} else specFiles.push(specPath);
|
|
41
|
-
logger.info(`Found ${specFiles.length} spec files to validate`);
|
|
42
|
-
for (const file of specFiles) try {
|
|
43
|
-
const content = await fs.readFile(file);
|
|
44
|
-
const operationIdMatch = content.match(/operationId:\s*['"]([^'"]+)['"]/) || content.match(/name:\s*['"]([^'"]+)['"]/) || content.match(/export\s+const\s+(\w+)Spec\s*=/);
|
|
45
|
-
if (!operationIdMatch || !operationIdMatch[1]) {
|
|
46
|
-
logger.debug(`Could not extract operationId from ${file}`);
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
const specName = operationIdMatch[1];
|
|
50
|
-
specsValidated++;
|
|
51
|
-
let matchingOp;
|
|
52
|
-
matchingOp = operationsMap.get(specName);
|
|
53
|
-
if (!matchingOp) {
|
|
54
|
-
const snakeName = specName.replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
55
|
-
matchingOp = operationsMap.get(snakeName);
|
|
56
|
-
}
|
|
57
|
-
if (!matchingOp) {
|
|
58
|
-
for (const [opId, op] of operationsMap) if (opId.toLowerCase().includes(specName.toLowerCase()) || specName.toLowerCase().includes(opId.toLowerCase())) {
|
|
59
|
-
matchingOp = op;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (!matchingOp) {
|
|
64
|
-
results.push({
|
|
65
|
-
specPath: file,
|
|
66
|
-
valid: false,
|
|
67
|
-
diffs: [{
|
|
68
|
-
path: "",
|
|
69
|
-
type: "removed",
|
|
70
|
-
description: `No matching operation found in OpenAPI for spec: ${specName}`
|
|
71
|
-
}]
|
|
72
|
-
});
|
|
73
|
-
specsWithDiffs++;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
const diffs = [];
|
|
77
|
-
if (matchingOp.deprecated && !content.includes("deprecated")) diffs.push({
|
|
78
|
-
path: "meta.stability",
|
|
79
|
-
type: "modified",
|
|
80
|
-
description: "OpenAPI operation is deprecated but spec does not indicate deprecation"
|
|
81
|
-
});
|
|
82
|
-
if (!ignoreTransport) {
|
|
83
|
-
const pathMatch = content.match(/path:\s*['"]([^'"]+)['"]/);
|
|
84
|
-
if (pathMatch && pathMatch[1] !== matchingOp.path) diffs.push({
|
|
85
|
-
path: "transport.rest.path",
|
|
86
|
-
type: "modified",
|
|
87
|
-
description: `Path mismatch: spec has "${pathMatch[1]}", OpenAPI has "${matchingOp.path}"`
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
if (!ignoreTransport) {
|
|
91
|
-
const methodMatch = content.match(/method:\s*['"]([^'"]+)['"]/);
|
|
92
|
-
if (methodMatch?.[1] && methodMatch[1].toLowerCase() !== matchingOp.method.toLowerCase()) diffs.push({
|
|
93
|
-
path: "transport.rest.method",
|
|
94
|
-
type: "modified",
|
|
95
|
-
description: `Method mismatch: spec has "${methodMatch[1]}", OpenAPI has "${matchingOp.method.toUpperCase()}"`
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
const valid$1 = diffs.length === 0;
|
|
99
|
-
if (!valid$1) specsWithDiffs++;
|
|
100
|
-
results.push({
|
|
101
|
-
specPath: file,
|
|
102
|
-
operationId: matchingOp.operationId,
|
|
103
|
-
valid: valid$1,
|
|
104
|
-
diffs
|
|
105
|
-
});
|
|
106
|
-
} catch (error) {
|
|
107
|
-
logger.error(`Error validating ${file}: ${error}`);
|
|
108
|
-
results.push({
|
|
109
|
-
specPath: file,
|
|
110
|
-
valid: false,
|
|
111
|
-
diffs: [{
|
|
112
|
-
path: "",
|
|
113
|
-
type: "modified",
|
|
114
|
-
description: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
115
|
-
}]
|
|
116
|
-
});
|
|
117
|
-
specsWithDiffs++;
|
|
118
|
-
}
|
|
119
|
-
const valid = specsWithDiffs === 0;
|
|
120
|
-
logger.info(`Validation ${valid ? "passed" : "failed"}: ${specsValidated} specs checked, ${specsWithDiffs} with differences`);
|
|
121
|
-
return {
|
|
122
|
-
valid,
|
|
123
|
-
specsValidated,
|
|
124
|
-
specsWithDiffs,
|
|
125
|
-
results
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
//#endregion
|
|
130
|
-
export { validateAgainstOpenApiService };
|
|
1
|
+
import{parseOpenApi as e}from"@lssm/lib.contracts-transformers/openapi";async function t(t,n){let{fs:r,logger:i}=n,{specPath:a,openApiSource:o,ignoreDescriptions:s,ignoreTags:c,ignoreTransport:l}=t;i.info(`Validating specs against OpenAPI: ${o}`);let u=await e(o,{fetch:globalThis.fetch,readFile:e=>r.readFile(e)});i.info(`Parsed ${u.operations.length} operations from ${u.info.title}`);let d=new Map;for(let e of u.operations)d.set(e.operationId,e);let f=[],p=0,m=0,h=await r.stat(a),g=[];if(h.isDirectory){let e=await r.glob({pattern:`**/*.ts`,cwd:a,ignore:[`node_modules/**`,`dist/**`,`*.test.ts`,`*.spec.ts`],absolute:!0});g.push(...e)}else g.push(a);i.info(`Found ${g.length} spec files to validate`);for(let e of g)try{let t=await r.readFile(e),n=t.match(/operationId:\s*['"]([^'"]+)['"]/)||t.match(/name:\s*['"]([^'"]+)['"]/)||t.match(/export\s+const\s+(\w+)Spec\s*=/);if(!n||!n[1]){i.debug(`Could not extract operationId from ${e}`);continue}let a=n[1];p++;let o;if(o=d.get(a),!o){let e=a.replace(/([A-Z])/g,`_$1`).toLowerCase();o=d.get(e)}if(!o){for(let[e,t]of d)if(e.toLowerCase().includes(a.toLowerCase())||a.toLowerCase().includes(e.toLowerCase())){o=t;break}}if(!o){f.push({specPath:e,valid:!1,diffs:[{path:``,type:`removed`,description:`No matching operation found in OpenAPI for spec: ${a}`}]}),m++;continue}let s=[];if(o.deprecated&&!t.includes(`deprecated`)&&s.push({path:`meta.stability`,type:`modified`,description:`OpenAPI operation is deprecated but spec does not indicate deprecation`}),!l){let e=t.match(/path:\s*['"]([^'"]+)['"]/);e&&e[1]!==o.path&&s.push({path:`transport.rest.path`,type:`modified`,description:`Path mismatch: spec has "${e[1]}", OpenAPI has "${o.path}"`})}if(!l){let e=t.match(/method:\s*['"]([^'"]+)['"]/);e?.[1]&&e[1].toLowerCase()!==o.method.toLowerCase()&&s.push({path:`transport.rest.method`,type:`modified`,description:`Method mismatch: spec has "${e[1]}", OpenAPI has "${o.method.toUpperCase()}"`})}let c=s.length===0;c||m++,f.push({specPath:e,operationId:o.operationId,valid:c,diffs:s})}catch(t){i.error(`Error validating ${e}: ${t}`),f.push({specPath:e,valid:!1,diffs:[{path:``,type:`modified`,description:`Error: ${t instanceof Error?t.message:String(t)}`}]}),m++}let _=m===0;return i.info(`Validation ${_?`passed`:`failed`}: ${p} specs checked, ${m} with differences`),{valid:_,specsValidated:p,specsWithDiffs:m,results:f}}export{t as validateAgainstOpenApiService};
|
|
@@ -1,23 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../libs/contracts/dist/regenerator/index.js";
|
|
3
|
-
|
|
4
|
-
//#region src/services/regenerator.ts
|
|
5
|
-
/**
|
|
6
|
-
* Regenerator service.
|
|
7
|
-
*
|
|
8
|
-
* Thin wrapper around `@lssm/lib.contracts/regenerator` for reuse across CLI/VSCode/web.
|
|
9
|
-
* This service does not perform module loading; callers provide resolved contexts/rules/sink.
|
|
10
|
-
*/
|
|
11
|
-
function createRegeneratorService(options) {
|
|
12
|
-
return new RegeneratorService({
|
|
13
|
-
contexts: options.contexts,
|
|
14
|
-
adapters: options.adapters ?? {},
|
|
15
|
-
rules: options.rules,
|
|
16
|
-
sink: options.sink,
|
|
17
|
-
pollIntervalMs: options.pollIntervalMs,
|
|
18
|
-
batchDurationMs: options.batchDurationMs
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
export { createRegeneratorService };
|
|
1
|
+
import{RegeneratorService as e}from"@lssm/lib.contracts/regenerator";function t(t){return new e({contexts:t.contexts,adapters:t.adapters??{},rules:t.rules,sink:t.sink,pollIntervalMs:t.pollIntervalMs,batchDurationMs:t.batchDurationMs})}export{t as createRegeneratorService};
|
|
@@ -1,73 +1 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Registry client for interacting with ContractSpec registry.
|
|
4
|
-
*/
|
|
5
|
-
var RegistryClient = class {
|
|
6
|
-
registryUrl;
|
|
7
|
-
constructor(opts) {
|
|
8
|
-
this.registryUrl = opts.registryUrl.replace(/\/+$/, "");
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Make GET request to registry.
|
|
12
|
-
*/
|
|
13
|
-
async getJson(path) {
|
|
14
|
-
const url = `${this.registryUrl}${path.startsWith("/") ? "" : "/"}${path}`;
|
|
15
|
-
let res;
|
|
16
|
-
try {
|
|
17
|
-
res = await fetch(url, {
|
|
18
|
-
method: "GET",
|
|
19
|
-
headers: { Accept: "application/json" }
|
|
20
|
-
});
|
|
21
|
-
} catch (error) {
|
|
22
|
-
throw new Error(`Registry request failed: ${url} (${error instanceof Error ? error.message : String(error)})`);
|
|
23
|
-
}
|
|
24
|
-
if (!res.ok) {
|
|
25
|
-
const text = await res.text().catch(() => "");
|
|
26
|
-
throw new Error(`Registry request failed: ${res.status} ${res.statusText} ${text}`);
|
|
27
|
-
}
|
|
28
|
-
return await res.json();
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Resolve registry URL from options or environment.
|
|
33
|
-
*/
|
|
34
|
-
function resolveRegistryUrl(cliRegistryUrl) {
|
|
35
|
-
return cliRegistryUrl || process.env.CONTRACTSPEC_REGISTRY_URL || "http://localhost:8090";
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Add spec to registry.
|
|
39
|
-
*/
|
|
40
|
-
async function addToRegistry(specPath, options, adapters) {
|
|
41
|
-
const { logger } = adapters;
|
|
42
|
-
const registryUrl = resolveRegistryUrl(options.registryUrl);
|
|
43
|
-
logger.info(`Adding spec to registry: ${specPath}`, { registryUrl });
|
|
44
|
-
await new RegistryClient({ registryUrl }).getJson(`/specs/add?path=${encodeURIComponent(specPath)}`);
|
|
45
|
-
logger.info("Spec added to registry successfully");
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* List specs from registry.
|
|
49
|
-
*/
|
|
50
|
-
async function listFromRegistry(options, adapters) {
|
|
51
|
-
const { logger } = adapters;
|
|
52
|
-
const registryUrl = resolveRegistryUrl(options.registryUrl);
|
|
53
|
-
logger.info("Listing specs from registry", { registryUrl });
|
|
54
|
-
const client = new RegistryClient({ registryUrl });
|
|
55
|
-
const filter = options.filter ? `?filter=${encodeURIComponent(options.filter)}` : "";
|
|
56
|
-
const specs = await client.getJson(`/specs${filter}`);
|
|
57
|
-
logger.info(`Found ${specs.length} specs`);
|
|
58
|
-
return specs;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Search registry for specs.
|
|
62
|
-
*/
|
|
63
|
-
async function searchRegistry(query, options, adapters) {
|
|
64
|
-
const { logger } = adapters;
|
|
65
|
-
const registryUrl = resolveRegistryUrl(options.registryUrl);
|
|
66
|
-
logger.info(`Searching registry: ${query}`, { registryUrl });
|
|
67
|
-
const results = await new RegistryClient({ registryUrl }).getJson(`/specs/search?q=${encodeURIComponent(query)}`);
|
|
68
|
-
logger.info(`Found ${results.length} results`);
|
|
69
|
-
return results;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
//#endregion
|
|
73
|
-
export { RegistryClient, addToRegistry, listFromRegistry, resolveRegistryUrl, searchRegistry };
|
|
1
|
+
var e=class{registryUrl;constructor(e){this.registryUrl=e.registryUrl.replace(/\/+$/,``)}async getJson(e){let t=`${this.registryUrl}${e.startsWith(`/`)?``:`/`}${e}`,n;try{n=await fetch(t,{method:`GET`,headers:{Accept:`application/json`}})}catch(e){throw Error(`Registry request failed: ${t} (${e instanceof Error?e.message:String(e)})`)}if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`Registry request failed: ${n.status} ${n.statusText} ${e}`)}return await n.json()}};function t(e){return e||process.env.CONTRACTSPEC_REGISTRY_URL||`http://localhost:8090`}async function n(n,r,i){let{logger:a}=i,o=t(r.registryUrl);a.info(`Adding spec to registry: ${n}`,{registryUrl:o}),await new e({registryUrl:o}).getJson(`/specs/add?path=${encodeURIComponent(n)}`),a.info(`Spec added to registry successfully`)}async function r(n,r){let{logger:i}=r,a=t(n.registryUrl);i.info(`Listing specs from registry`,{registryUrl:a});let o=new e({registryUrl:a}),s=n.filter?`?filter=${encodeURIComponent(n.filter)}`:``,c=await o.getJson(`/specs${s}`);return i.info(`Found ${c.length} specs`),c}async function i(n,r,i){let{logger:a}=i,o=t(r.registryUrl);a.info(`Searching registry: ${n}`,{registryUrl:o});let s=await new e({registryUrl:o}).getJson(`/specs/search?q=${encodeURIComponent(n)}`);return a.info(`Found ${s.length} results`),s}export{e as RegistryClient,n as addToRegistry,r as listFromRegistry,t as resolveRegistryUrl,i as searchRegistry};
|
|
@@ -1,72 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Generate .contractsrc.json content.
|
|
4
|
-
*
|
|
5
|
-
* Adapts defaults based on monorepo scope.
|
|
6
|
-
*/
|
|
7
|
-
function generateContractsrcConfig(options) {
|
|
8
|
-
const isPackageLevel = options.isMonorepo && options.scope === "package";
|
|
9
|
-
return {
|
|
10
|
-
$schema: "https://contractspec.dev/schemas/contractsrc.json",
|
|
11
|
-
aiProvider: "claude",
|
|
12
|
-
aiModel: "claude-sonnet-4-20250514",
|
|
13
|
-
agentMode: "claude-code",
|
|
14
|
-
outputDir: "./src",
|
|
15
|
-
conventions: {
|
|
16
|
-
operations: "contracts/operations",
|
|
17
|
-
events: "contracts/events",
|
|
18
|
-
presentations: "contracts/presentations",
|
|
19
|
-
forms: "contracts/forms",
|
|
20
|
-
features: "contracts/features"
|
|
21
|
-
},
|
|
22
|
-
defaultOwners: options.defaultOwners ?? ["@team"],
|
|
23
|
-
defaultTags: [],
|
|
24
|
-
...isPackageLevel && options.packageName ? { package: options.packageName } : {}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Generate .vscode/settings.json ContractSpec settings.
|
|
29
|
-
*/
|
|
30
|
-
function generateVscodeSettings() {
|
|
31
|
-
return {
|
|
32
|
-
"contractspec.validation.enabled": true,
|
|
33
|
-
"contractspec.validation.validateOnSave": true,
|
|
34
|
-
"contractspec.validation.validateOnOpen": true,
|
|
35
|
-
"contractspec.codeLens.enabled": true,
|
|
36
|
-
"contractspec.diagnostics.showWarnings": true,
|
|
37
|
-
"contractspec.diagnostics.showHints": true,
|
|
38
|
-
"contractspec.integrity.enabled": true,
|
|
39
|
-
"contractspec.integrity.checkOnSave": true
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Generate .cursor/mcp.json content.
|
|
44
|
-
*/
|
|
45
|
-
function generateCursorMcpConfig() {
|
|
46
|
-
return { mcpServers: { "contractspec-local": {
|
|
47
|
-
command: "bunx",
|
|
48
|
-
args: ["contractspec-mcp"]
|
|
49
|
-
} } };
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Generate Claude Desktop MCP config.
|
|
53
|
-
* Returns the mcpServers section to merge into claude_desktop_config.json.
|
|
54
|
-
*/
|
|
55
|
-
function generateClaudeMcpConfig() {
|
|
56
|
-
return { mcpServers: { "contractspec-local": {
|
|
57
|
-
command: "bunx",
|
|
58
|
-
args: ["contractspec-mcp"]
|
|
59
|
-
} } };
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Generate .cursor/rules/contractspec.mdc content.
|
|
63
|
-
*
|
|
64
|
-
* Adapts paths based on monorepo scope.
|
|
65
|
-
*/
|
|
66
|
-
function generateCursorRules(options) {
|
|
67
|
-
const projectName = options.projectName ?? "this project";
|
|
68
|
-
const basePath = options.isMonorepo && options.scope === "package" && options.packageRoot ? `${options.packageRoot.split("/").slice(-2).join("/")}/src/contracts` : "src/contracts";
|
|
69
|
-
return `# ContractSpec Development Rules
|
|
1
|
+
function e(e){let t=e.isMonorepo&&e.scope===`package`;return{$schema:`https://contractspec.dev/schemas/contractsrc.json`,aiProvider:`claude`,aiModel:`claude-sonnet-4-20250514`,agentMode:`claude-code`,outputDir:`./src`,conventions:{operations:`contracts/operations`,events:`contracts/events`,presentations:`contracts/presentations`,forms:`contracts/forms`,features:`contracts/features`},defaultOwners:e.defaultOwners??[`@team`],defaultTags:[],...t&&e.packageName?{package:e.packageName}:{}}}function t(){return{"contractspec.validation.enabled":!0,"contractspec.validation.validateOnSave":!0,"contractspec.validation.validateOnOpen":!0,"contractspec.codeLens.enabled":!0,"contractspec.diagnostics.showWarnings":!0,"contractspec.diagnostics.showHints":!0,"contractspec.integrity.enabled":!0,"contractspec.integrity.checkOnSave":!0}}function n(){return{mcpServers:{"contractspec-local":{command:`bunx`,args:[`contractspec-mcp`]}}}}function r(){return{mcpServers:{"contractspec-local":{command:`bunx`,args:[`contractspec-mcp`]}}}}function i(e){let t=e.projectName??`this project`,n=e.isMonorepo&&e.scope===`package`&&e.packageRoot?`${e.packageRoot.split(`/`).slice(-2).join(`/`)}/src/contracts`:`src/contracts`;return`# ContractSpec Development Rules
|
|
70
2
|
|
|
71
3
|
This project uses ContractSpec for spec-first development. Follow these guidelines when working with AI agents.
|
|
72
4
|
|
|
@@ -75,14 +7,22 @@ This project uses ContractSpec for spec-first development. Follow these guidelin
|
|
|
75
7
|
- **Always update contracts first** before changing implementation code.
|
|
76
8
|
- Contracts are the source of truth for operations, events, and presentations.
|
|
77
9
|
- Implementation code should be generated or derived from contracts.
|
|
78
|
-
${
|
|
10
|
+
${e.isMonorepo?`
|
|
11
|
+
## Monorepo Structure
|
|
12
|
+
|
|
13
|
+
This is a monorepo. Contracts may exist at:
|
|
14
|
+
- Package level: \`packages/*/src/contracts/\`
|
|
15
|
+
- Workspace level: \`src/contracts/\`
|
|
16
|
+
|
|
17
|
+
Check the appropriate level based on the feature scope.
|
|
18
|
+
`:``}
|
|
79
19
|
## Contract Locations
|
|
80
20
|
|
|
81
21
|
Contracts are located in:
|
|
82
|
-
- \`${
|
|
83
|
-
- \`${
|
|
84
|
-
- \`${
|
|
85
|
-
- \`${
|
|
22
|
+
- \`${n}/operations/\` - Command and query specs
|
|
23
|
+
- \`${n}/events/\` - Event specs
|
|
24
|
+
- \`${n}/presentations/\` - UI presentation specs
|
|
25
|
+
- \`${n}/features/\` - Feature module specs
|
|
86
26
|
|
|
87
27
|
## When Making Changes
|
|
88
28
|
|
|
@@ -110,28 +50,17 @@ defineCommand({
|
|
|
110
50
|
});
|
|
111
51
|
\`\`\`
|
|
112
52
|
|
|
113
|
-
## Rules for ${
|
|
53
|
+
## Rules for ${t}
|
|
114
54
|
|
|
115
55
|
- All API endpoints must have a corresponding operation contract.
|
|
116
56
|
- Events must be declared in contracts before being emitted.
|
|
117
57
|
- UI components should reference presentation contracts.
|
|
118
58
|
- Feature flags should be defined in feature modules.
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Generate AGENTS.md content.
|
|
123
|
-
*
|
|
124
|
-
* Adapts paths and instructions based on monorepo scope.
|
|
125
|
-
*/
|
|
126
|
-
function generateAgentsMd(options) {
|
|
127
|
-
const projectName = options.projectName ?? "This Project";
|
|
128
|
-
const isPackageLevel = options.isMonorepo && options.scope === "package";
|
|
129
|
-
const contractPath = "src/contracts/";
|
|
130
|
-
return `# AI Agent Guide
|
|
59
|
+
`}function a(e){let t=e.projectName??`This Project`,n=e.isMonorepo&&e.scope===`package`,r=`src/contracts/`;return`# AI Agent Guide
|
|
131
60
|
|
|
132
61
|
This repository uses **ContractSpec** for spec-first development. AI agents should follow these guidelines.
|
|
133
62
|
|
|
134
|
-
## Project: ${
|
|
63
|
+
## Project: ${t}
|
|
135
64
|
|
|
136
65
|
## ContractSpec Overview
|
|
137
66
|
|
|
@@ -142,7 +71,7 @@ ContractSpec is a deterministic, spec-first compiler that keeps AI-written softw
|
|
|
142
71
|
1. **Contracts are the source of truth** - Always check/update contracts before modifying implementation.
|
|
143
72
|
2. **Safe regeneration** - Code can be regenerated from specs without breaking invariants.
|
|
144
73
|
3. **Multi-surface consistency** - API, events, and UI stay in sync via shared contracts.
|
|
145
|
-
${
|
|
74
|
+
${e.isMonorepo?`
|
|
146
75
|
## Monorepo Structure
|
|
147
76
|
|
|
148
77
|
This is a monorepo. Contracts can exist at multiple levels:
|
|
@@ -158,13 +87,13 @@ When adding a contract, consider:
|
|
|
158
87
|
|
|
159
88
|
### Current Scope
|
|
160
89
|
|
|
161
|
-
${
|
|
162
|
-
|
|
90
|
+
${n?`You are working at the **package level**: \`${e.packageName??e.packageRoot}\``:`You are working at the **workspace level**.`}
|
|
91
|
+
`:``}
|
|
163
92
|
## Working in This Repository
|
|
164
93
|
|
|
165
94
|
### Before Making Changes
|
|
166
95
|
|
|
167
|
-
1. Check for existing contracts in \`${
|
|
96
|
+
1. Check for existing contracts in \`${r}\`
|
|
168
97
|
2. If a contract exists, update it first
|
|
169
98
|
3. Regenerate implementation with \`contractspec build\`
|
|
170
99
|
4. Validate with \`contractspec validate\`
|
|
@@ -180,10 +109,10 @@ ${isPackageLevel ? `You are working at the **package level**: \`${options.packag
|
|
|
180
109
|
|
|
181
110
|
| Type | Location |
|
|
182
111
|
|------|----------|
|
|
183
|
-
| Operations | \`${
|
|
184
|
-
| Events | \`${
|
|
185
|
-
| Presentations | \`${
|
|
186
|
-
| Features | \`${
|
|
112
|
+
| Operations | \`${r}operations/\` |
|
|
113
|
+
| Events | \`${r}events/\` |
|
|
114
|
+
| Presentations | \`${r}presentations/\` |
|
|
115
|
+
| Features | \`${r}features/\` |
|
|
187
116
|
|
|
188
117
|
## MCP Tools Available
|
|
189
118
|
|
|
@@ -218,20 +147,4 @@ contractspec integrity
|
|
|
218
147
|
## Nested AGENTS.md
|
|
219
148
|
|
|
220
149
|
More specific instructions may exist in subdirectories. Check for \`AGENTS.md\` files in the relevant package or module.
|
|
221
|
-
`;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Get the file path for Claude Desktop config based on platform.
|
|
225
|
-
*/
|
|
226
|
-
function getClaudeDesktopConfigPath() {
|
|
227
|
-
const platform = process.platform;
|
|
228
|
-
const homeDir = process.env["HOME"] ?? process.env["USERPROFILE"] ?? "";
|
|
229
|
-
switch (platform) {
|
|
230
|
-
case "darwin": return `${homeDir}/Library/Application Support/Claude/claude_desktop_config.json`;
|
|
231
|
-
case "win32": return `${process.env["APPDATA"] ?? homeDir}/Claude/claude_desktop_config.json`;
|
|
232
|
-
default: return `${homeDir}/.config/claude/claude_desktop_config.json`;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
//#endregion
|
|
237
|
-
export { generateAgentsMd, generateClaudeMcpConfig, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateVscodeSettings, getClaudeDesktopConfigPath };
|
|
150
|
+
`}function o(){let e=process.platform,t=process.env.HOME??process.env.USERPROFILE??``;switch(e){case`darwin`:return`${t}/Library/Application Support/Claude/claude_desktop_config.json`;case`win32`:return`${process.env.APPDATA??t}/Claude/claude_desktop_config.json`;default:return`${t}/.config/claude/claude_desktop_config.json`}}export{a as generateAgentsMd,r as generateClaudeMcpConfig,e as generateContractsrcConfig,n as generateCursorMcpConfig,i as generateCursorRules,t as generateVscodeSettings,o as getClaudeDesktopConfigPath};
|