@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
package/dist/services/config.js
CHANGED
|
@@ -1,76 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as z$1 from "zod";
|
|
3
|
-
|
|
4
|
-
//#region src/services/config.ts
|
|
5
|
-
/**
|
|
6
|
-
* Workspace configuration service.
|
|
7
|
-
*/
|
|
8
|
-
const ConfigSchema = z$1.object({
|
|
9
|
-
aiProvider: z$1.enum([
|
|
10
|
-
"claude",
|
|
11
|
-
"openai",
|
|
12
|
-
"ollama",
|
|
13
|
-
"custom"
|
|
14
|
-
]).default("claude"),
|
|
15
|
-
aiModel: z$1.string().optional(),
|
|
16
|
-
agentMode: z$1.enum([
|
|
17
|
-
"simple",
|
|
18
|
-
"cursor",
|
|
19
|
-
"claude-code",
|
|
20
|
-
"openai-codex"
|
|
21
|
-
]).default("simple"),
|
|
22
|
-
customEndpoint: z$1.string().url().nullable().optional(),
|
|
23
|
-
customApiKey: z$1.string().nullable().optional(),
|
|
24
|
-
outputDir: z$1.string().default("./src"),
|
|
25
|
-
conventions: z$1.object({
|
|
26
|
-
operations: z$1.string().default("interactions/commands|queries"),
|
|
27
|
-
events: z$1.string().default("events"),
|
|
28
|
-
presentations: z$1.string().default("presentations"),
|
|
29
|
-
forms: z$1.string().default("forms")
|
|
30
|
-
}),
|
|
31
|
-
defaultOwners: z$1.array(z$1.string()).default([]),
|
|
32
|
-
defaultTags: z$1.array(z$1.string()).default([])
|
|
33
|
-
});
|
|
34
|
-
/**
|
|
35
|
-
* Load workspace configuration from .contractsrc.json.
|
|
36
|
-
*/
|
|
37
|
-
async function loadWorkspaceConfig(fs, cwd) {
|
|
38
|
-
const configPath = fs.join(cwd ?? ".", ".contractsrc.json");
|
|
39
|
-
if (!await fs.exists(configPath)) return DEFAULT_WORKSPACE_CONFIG;
|
|
40
|
-
try {
|
|
41
|
-
const content = await fs.readFile(configPath);
|
|
42
|
-
const parsed = JSON.parse(content);
|
|
43
|
-
return ConfigSchema.parse(parsed);
|
|
44
|
-
} catch {
|
|
45
|
-
return DEFAULT_WORKSPACE_CONFIG;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Merge config with CLI options and environment variables.
|
|
50
|
-
*/
|
|
51
|
-
function mergeWorkspaceConfig(config, options) {
|
|
52
|
-
return {
|
|
53
|
-
...config,
|
|
54
|
-
aiProvider: options.provider ?? process.env["CONTRACTSPEC_AI_PROVIDER"] ?? config.aiProvider,
|
|
55
|
-
aiModel: options.model ?? process.env["CONTRACTSPEC_AI_MODEL"] ?? config.aiModel,
|
|
56
|
-
agentMode: options.agentMode ?? process.env["CONTRACTSPEC_AGENT_MODE"] ?? config.agentMode,
|
|
57
|
-
customEndpoint: options.endpoint ?? process.env["CONTRACTSPEC_LLM_ENDPOINT"] ?? config.customEndpoint ?? void 0,
|
|
58
|
-
customApiKey: process.env["CONTRACTSPEC_LLM_API_KEY"] ?? config.customApiKey ?? void 0,
|
|
59
|
-
outputDir: options.outputDir ?? config.outputDir
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get API key for the configured provider.
|
|
64
|
-
*/
|
|
65
|
-
function getApiKey(provider) {
|
|
66
|
-
switch (provider) {
|
|
67
|
-
case "claude": return process.env["ANTHROPIC_API_KEY"];
|
|
68
|
-
case "openai": return process.env["OPENAI_API_KEY"];
|
|
69
|
-
case "custom": return process.env["CONTRACTSPEC_LLM_API_KEY"];
|
|
70
|
-
case "ollama": return;
|
|
71
|
-
default: return;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
//#endregion
|
|
76
|
-
export { getApiKey, loadWorkspaceConfig, mergeWorkspaceConfig };
|
|
1
|
+
import{DEFAULT_WORKSPACE_CONFIG as e}from"@lssm/module.contractspec-workspace";import*as t from"zod";const n=t.object({aiProvider:t.enum([`claude`,`openai`,`ollama`,`custom`]).default(`claude`),aiModel:t.string().optional(),agentMode:t.enum([`simple`,`cursor`,`claude-code`,`openai-codex`]).default(`simple`),customEndpoint:t.string().url().nullable().optional(),customApiKey:t.string().nullable().optional(),outputDir:t.string().default(`./src`),conventions:t.object({operations:t.string().default(`interactions/commands|queries`),events:t.string().default(`events`),presentations:t.string().default(`presentations`),forms:t.string().default(`forms`)}),defaultOwners:t.array(t.string()).default([]),defaultTags:t.array(t.string()).default([])});async function r(t,r){let i=t.join(r??`.`,`.contractsrc.json`);if(!await t.exists(i))return e;try{let e=await t.readFile(i),r=JSON.parse(e);return n.parse(r)}catch{return e}}function i(e,t){return{...e,aiProvider:t.provider??process.env.CONTRACTSPEC_AI_PROVIDER??e.aiProvider,aiModel:t.model??process.env.CONTRACTSPEC_AI_MODEL??e.aiModel,agentMode:t.agentMode??process.env.CONTRACTSPEC_AGENT_MODE??e.agentMode,customEndpoint:t.endpoint??process.env.CONTRACTSPEC_LLM_ENDPOINT??e.customEndpoint??void 0,customApiKey:process.env.CONTRACTSPEC_LLM_API_KEY??e.customApiKey??void 0,outputDir:t.outputDir??e.outputDir}}function a(e){switch(e){case`claude`:return process.env.ANTHROPIC_API_KEY;case`openai`:return process.env.OPENAI_API_KEY;case`custom`:return process.env.CONTRACTSPEC_LLM_API_KEY;case`ollama`:return;default:return}}export{a as getApiKey,r as loadWorkspaceConfig,i as mergeWorkspaceConfig};
|
package/dist/services/deps.js
CHANGED
|
@@ -1,62 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { parseImportedSpecNames } from "../modules/contractspec-workspace/dist/analysis/deps/parse-imports.js";
|
|
3
|
-
|
|
4
|
-
//#region src/services/deps.ts
|
|
5
|
-
/**
|
|
6
|
-
* Dependency analysis service.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Analyze contract dependencies.
|
|
10
|
-
*/
|
|
11
|
-
async function analyzeDeps(adapters, options = {}) {
|
|
12
|
-
const { fs } = adapters;
|
|
13
|
-
const files = await fs.glob({ pattern: options.pattern });
|
|
14
|
-
const graph = createContractGraph();
|
|
15
|
-
for (const file of files) {
|
|
16
|
-
const content = await fs.readFile(file);
|
|
17
|
-
const relativePath = fs.relative(".", file);
|
|
18
|
-
const nameMatch = content.match(/name:\s*['"]([^'"]+)['"]/);
|
|
19
|
-
addContractNode(graph, (nameMatch?.[1] ? nameMatch[1] : fs.basename(file).replace(/\.[jt]s$/, "").replace(/\.(contracts|event|presentation|workflow|data-view|migration|telemetry|experiment|app-config|integration|knowledge)$/, "")) || "unknown", relativePath, parseImportedSpecNames(content, file));
|
|
20
|
-
}
|
|
21
|
-
buildReverseEdges(graph);
|
|
22
|
-
const cycles = detectCycles(graph);
|
|
23
|
-
const missing = findMissingDependencies(graph);
|
|
24
|
-
return {
|
|
25
|
-
graph,
|
|
26
|
-
total: graph.size,
|
|
27
|
-
cycles,
|
|
28
|
-
missing
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get contract node by name.
|
|
33
|
-
*/
|
|
34
|
-
function getContractNode(graph, name) {
|
|
35
|
-
return graph.get(name);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Export graph as DOT format.
|
|
39
|
-
*/
|
|
40
|
-
function exportGraphAsDot(graph) {
|
|
41
|
-
return toDot(graph);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Get graph statistics.
|
|
45
|
-
*/
|
|
46
|
-
function getGraphStats(graph) {
|
|
47
|
-
const all = Array.from(graph.values());
|
|
48
|
-
const withDeps = all.filter((c) => c.dependencies.length > 0);
|
|
49
|
-
const withoutDeps = all.filter((c) => c.dependencies.length === 0);
|
|
50
|
-
const used = all.filter((c) => c.dependents.length > 0);
|
|
51
|
-
const unused = all.filter((c) => c.dependents.length === 0);
|
|
52
|
-
return {
|
|
53
|
-
total: graph.size,
|
|
54
|
-
withDeps: withDeps.length,
|
|
55
|
-
withoutDeps: withoutDeps.length,
|
|
56
|
-
used: used.length,
|
|
57
|
-
unused: unused.length
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
//#endregion
|
|
62
|
-
export { analyzeDeps, exportGraphAsDot, getContractNode, getGraphStats };
|
|
1
|
+
import{addContractNode as e,buildReverseEdges as t,createContractGraph as n,detectCycles as r,findMissingDependencies as i,parseImportedSpecNames as a,toDot as o}from"@lssm/module.contractspec-workspace";async function s(o,s={}){let{fs:c}=o,l=await c.glob({pattern:s.pattern}),u=n();for(let t of l){let n=await c.readFile(t),r=c.relative(`.`,t),i=n.match(/name:\s*['"]([^'"]+)['"]/);e(u,(i?.[1]?i[1]:c.basename(t).replace(/\.[jt]s$/,``).replace(/\.(contracts|event|presentation|workflow|data-view|migration|telemetry|experiment|app-config|integration|knowledge)$/,``))||`unknown`,r,a(n,t))}t(u);let d=r(u),f=i(u);return{graph:u,total:u.size,cycles:d,missing:f}}function c(e,t){return e.get(t)}function l(e){return o(e)}function u(e){let t=Array.from(e.values()),n=t.filter(e=>e.dependencies.length>0),r=t.filter(e=>e.dependencies.length===0),i=t.filter(e=>e.dependents.length>0),a=t.filter(e=>e.dependents.length===0);return{total:e.size,withDeps:n.length,withoutDeps:r.length,used:i.length,unused:a.length}}export{s as analyzeDeps,l as exportGraphAsDot,c as getContractNode,u as getGraphStats};
|
package/dist/services/diff.js
CHANGED
|
@@ -1,33 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
//#region src/services/diff.ts
|
|
4
|
-
/**
|
|
5
|
-
* Diff service.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Compare two spec files semantically.
|
|
9
|
-
*/
|
|
10
|
-
async function compareSpecs(spec1Path, spec2Path, adapters, options = {}) {
|
|
11
|
-
const { fs, git } = adapters;
|
|
12
|
-
if (!await fs.exists(spec1Path)) throw new Error(`Spec file not found: ${spec1Path}`);
|
|
13
|
-
const spec1Code = await fs.readFile(spec1Path);
|
|
14
|
-
let spec2Code;
|
|
15
|
-
let spec2Label;
|
|
16
|
-
if (options.baseline) {
|
|
17
|
-
spec2Code = await git.showFile(options.baseline, spec1Path);
|
|
18
|
-
spec2Label = `${options.baseline}:${spec1Path}`;
|
|
19
|
-
} else {
|
|
20
|
-
if (!await fs.exists(spec2Path)) throw new Error(`Spec file not found: ${spec2Path}`);
|
|
21
|
-
spec2Code = await fs.readFile(spec2Path);
|
|
22
|
-
spec2Label = spec2Path;
|
|
23
|
-
}
|
|
24
|
-
const differences = computeSemanticDiff(spec1Code, spec1Path, spec2Code, spec2Label, { breakingOnly: options.breakingOnly });
|
|
25
|
-
return {
|
|
26
|
-
spec1: spec1Path,
|
|
27
|
-
spec2: spec2Label,
|
|
28
|
-
differences
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
//#endregion
|
|
33
|
-
export { compareSpecs };
|
|
1
|
+
import{computeSemanticDiff as e}from"@lssm/module.contractspec-workspace";async function t(t,n,r,i={}){let{fs:a,git:o}=r;if(!await a.exists(t))throw Error(`Spec file not found: ${t}`);let s=await a.readFile(t),c,l;if(i.baseline)c=await o.showFile(i.baseline,t),l=`${i.baseline}:${t}`;else{if(!await a.exists(n))throw Error(`Spec file not found: ${n}`);c=await a.readFile(n),l=n}let u=e(s,t,c,l,{breakingOnly:i.breakingOnly});return{spec1:t,spec2:l,differences:u}}export{t as compareSpecs};
|
|
@@ -1,118 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Run AI provider-related health checks.
|
|
4
|
-
*/
|
|
5
|
-
async function runAiChecks(fs, ctx, prompts) {
|
|
6
|
-
const results = [];
|
|
7
|
-
const providerResult = await checkAiProvider(fs, ctx);
|
|
8
|
-
results.push(providerResult);
|
|
9
|
-
if (providerResult.status === "pass") results.push(await checkApiKey(fs, ctx, prompts));
|
|
10
|
-
return results;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Check which AI provider is configured.
|
|
14
|
-
*/
|
|
15
|
-
async function checkAiProvider(fs, ctx) {
|
|
16
|
-
const configPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
17
|
-
try {
|
|
18
|
-
if (!await fs.exists(configPath)) return {
|
|
19
|
-
category: "ai",
|
|
20
|
-
name: "AI Provider",
|
|
21
|
-
status: "skip",
|
|
22
|
-
message: "No config file found"
|
|
23
|
-
};
|
|
24
|
-
const content = await fs.readFile(configPath);
|
|
25
|
-
const config = JSON.parse(content);
|
|
26
|
-
return {
|
|
27
|
-
category: "ai",
|
|
28
|
-
name: "AI Provider",
|
|
29
|
-
status: "pass",
|
|
30
|
-
message: `Provider: ${config.aiProvider ?? "claude"}, Model: ${config.aiModel ?? "default"}`
|
|
31
|
-
};
|
|
32
|
-
} catch {
|
|
33
|
-
return {
|
|
34
|
-
category: "ai",
|
|
35
|
-
name: "AI Provider",
|
|
36
|
-
status: "skip",
|
|
37
|
-
message: "Could not read AI config"
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Check if API key is set for the configured provider.
|
|
43
|
-
*/
|
|
44
|
-
async function checkApiKey(fs, ctx, prompts) {
|
|
45
|
-
const configPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
46
|
-
try {
|
|
47
|
-
const content = await fs.readFile(configPath);
|
|
48
|
-
const provider = JSON.parse(content).aiProvider ?? "claude";
|
|
49
|
-
const envVar = {
|
|
50
|
-
claude: "ANTHROPIC_API_KEY",
|
|
51
|
-
openai: "OPENAI_API_KEY",
|
|
52
|
-
ollama: "",
|
|
53
|
-
custom: "CONTRACTSPEC_LLM_API_KEY"
|
|
54
|
-
}[provider];
|
|
55
|
-
if (!envVar) return {
|
|
56
|
-
category: "ai",
|
|
57
|
-
name: "API Key",
|
|
58
|
-
status: "pass",
|
|
59
|
-
message: `${provider} does not require an API key`
|
|
60
|
-
};
|
|
61
|
-
if (!!process.env[envVar]) return {
|
|
62
|
-
category: "ai",
|
|
63
|
-
name: "API Key",
|
|
64
|
-
status: "pass",
|
|
65
|
-
message: `${envVar} is set`
|
|
66
|
-
};
|
|
67
|
-
return {
|
|
68
|
-
category: "ai",
|
|
69
|
-
name: "API Key",
|
|
70
|
-
status: "warn",
|
|
71
|
-
message: `${envVar} not set`,
|
|
72
|
-
details: `Set ${envVar} in your environment to use AI features`,
|
|
73
|
-
fix: prompts ? {
|
|
74
|
-
description: `Set ${envVar} environment variable`,
|
|
75
|
-
apply: async () => {
|
|
76
|
-
const key = await prompts.input(`Enter your ${provider} API key:`, { password: true });
|
|
77
|
-
if (!key) return {
|
|
78
|
-
success: false,
|
|
79
|
-
message: "No API key provided"
|
|
80
|
-
};
|
|
81
|
-
const envPath = fs.join(ctx.workspaceRoot, ".env");
|
|
82
|
-
try {
|
|
83
|
-
let envContent = "";
|
|
84
|
-
if (await fs.exists(envPath)) {
|
|
85
|
-
envContent = await fs.readFile(envPath);
|
|
86
|
-
if (envContent.includes(`${envVar}=`)) return {
|
|
87
|
-
success: false,
|
|
88
|
-
message: `${envVar} already in .env, update manually`
|
|
89
|
-
};
|
|
90
|
-
envContent += "\n";
|
|
91
|
-
}
|
|
92
|
-
envContent += `${envVar}=${key}\n`;
|
|
93
|
-
await fs.writeFile(envPath, envContent);
|
|
94
|
-
return {
|
|
95
|
-
success: true,
|
|
96
|
-
message: `Added ${envVar} to .env (restart required)`
|
|
97
|
-
};
|
|
98
|
-
} catch (error) {
|
|
99
|
-
return {
|
|
100
|
-
success: false,
|
|
101
|
-
message: `Failed: ${error instanceof Error ? error.message : String(error)}`
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
} : void 0
|
|
106
|
-
};
|
|
107
|
-
} catch {
|
|
108
|
-
return {
|
|
109
|
-
category: "ai",
|
|
110
|
-
name: "API Key",
|
|
111
|
-
status: "skip",
|
|
112
|
-
message: "Could not check API key"
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
//#endregion
|
|
118
|
-
export { runAiChecks };
|
|
1
|
+
async function e(e,r,i){let a=[],o=await t(e,r);return a.push(o),o.status===`pass`&&a.push(await n(e,r,i)),a}async function t(e,t){let n=e.join(t.workspaceRoot,`.contractsrc.json`);try{if(!await e.exists(n))return{category:`ai`,name:`AI Provider`,status:`skip`,message:`No config file found`};let t=await e.readFile(n),r=JSON.parse(t);return{category:`ai`,name:`AI Provider`,status:`pass`,message:`Provider: ${r.aiProvider??`claude`}, Model: ${r.aiModel??`default`}`}}catch{return{category:`ai`,name:`AI Provider`,status:`skip`,message:`Could not read AI config`}}}async function n(e,t,n){let r=e.join(t.workspaceRoot,`.contractsrc.json`);try{let i=await e.readFile(r),a=JSON.parse(i).aiProvider??`claude`,o={claude:`ANTHROPIC_API_KEY`,openai:`OPENAI_API_KEY`,ollama:``,custom:`CONTRACTSPEC_LLM_API_KEY`}[a];return o?process.env[o]?{category:`ai`,name:`API Key`,status:`pass`,message:`${o} is set`}:{category:`ai`,name:`API Key`,status:`warn`,message:`${o} not set`,details:`Set ${o} in your environment to use AI features`,fix:n?{description:`Set ${o} environment variable`,apply:async()=>{let r=await n.input(`Enter your ${a} API key:`,{password:!0});if(!r)return{success:!1,message:`No API key provided`};let i=e.join(t.workspaceRoot,`.env`);try{let t=``;if(await e.exists(i)){if(t=await e.readFile(i),t.includes(`${o}=`))return{success:!1,message:`${o} already in .env, update manually`};t+=`
|
|
2
|
+
`}return t+=`${o}=${r}\n`,await e.writeFile(i,t),{success:!0,message:`Added ${o} to .env (restart required)`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}:void 0}:{category:`ai`,name:`API Key`,status:`pass`,message:`${a} does not require an API key`}}catch{return{category:`ai`,name:`API Key`,status:`skip`,message:`Could not check API key`}}}export{e as runAiChecks};
|
|
@@ -1,146 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { promisify } from "node:util";
|
|
3
|
-
|
|
4
|
-
//#region src/services/doctor/checks/cli.ts
|
|
5
|
-
/**
|
|
6
|
-
* CLI installation health checks.
|
|
7
|
-
*/
|
|
8
|
-
const execAsync = promisify(exec);
|
|
9
|
-
/**
|
|
10
|
-
* Run CLI-related health checks.
|
|
11
|
-
*/
|
|
12
|
-
async function runCliChecks(fs, ctx) {
|
|
13
|
-
const results = [];
|
|
14
|
-
results.push(await checkCliAccessible(ctx));
|
|
15
|
-
results.push(await checkCliVersion(ctx));
|
|
16
|
-
results.push(await checkCliInstallLocation(fs, ctx));
|
|
17
|
-
return results;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Check if the CLI is accessible.
|
|
21
|
-
*/
|
|
22
|
-
async function checkCliAccessible(ctx) {
|
|
23
|
-
try {
|
|
24
|
-
await execAsync("npx contractspec --version", {
|
|
25
|
-
cwd: ctx.workspaceRoot,
|
|
26
|
-
timeout: 1e4
|
|
27
|
-
});
|
|
28
|
-
return {
|
|
29
|
-
category: "cli",
|
|
30
|
-
name: "CLI Accessible",
|
|
31
|
-
status: "pass",
|
|
32
|
-
message: "ContractSpec CLI is accessible"
|
|
33
|
-
};
|
|
34
|
-
} catch {
|
|
35
|
-
return {
|
|
36
|
-
category: "cli",
|
|
37
|
-
name: "CLI Accessible",
|
|
38
|
-
status: "fail",
|
|
39
|
-
message: "ContractSpec CLI is not accessible",
|
|
40
|
-
details: "Could not run \"npx contractspec --version\"",
|
|
41
|
-
fix: {
|
|
42
|
-
description: "Install ContractSpec CLI globally",
|
|
43
|
-
apply: async () => {
|
|
44
|
-
try {
|
|
45
|
-
await execAsync("npm install -g @lssm/app.cli-contracts", {
|
|
46
|
-
cwd: ctx.workspaceRoot,
|
|
47
|
-
timeout: 6e4
|
|
48
|
-
});
|
|
49
|
-
return {
|
|
50
|
-
success: true,
|
|
51
|
-
message: "CLI installed globally"
|
|
52
|
-
};
|
|
53
|
-
} catch (error) {
|
|
54
|
-
return {
|
|
55
|
-
success: false,
|
|
56
|
-
message: `Failed to install: ${error instanceof Error ? error.message : String(error)}`
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check CLI version.
|
|
66
|
-
*/
|
|
67
|
-
async function checkCliVersion(ctx) {
|
|
68
|
-
try {
|
|
69
|
-
const { stdout } = await execAsync("npx contractspec --version", {
|
|
70
|
-
cwd: ctx.workspaceRoot,
|
|
71
|
-
timeout: 1e4
|
|
72
|
-
});
|
|
73
|
-
return {
|
|
74
|
-
category: "cli",
|
|
75
|
-
name: "CLI Version",
|
|
76
|
-
status: "pass",
|
|
77
|
-
message: `CLI version: ${stdout.trim()}`
|
|
78
|
-
};
|
|
79
|
-
} catch {
|
|
80
|
-
return {
|
|
81
|
-
category: "cli",
|
|
82
|
-
name: "CLI Version",
|
|
83
|
-
status: "skip",
|
|
84
|
-
message: "Could not determine CLI version"
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Check if CLI is installed locally in the project.
|
|
90
|
-
*/
|
|
91
|
-
async function checkCliInstallLocation(fs, ctx) {
|
|
92
|
-
const packageJsonPath = fs.join(ctx.workspaceRoot, "package.json");
|
|
93
|
-
try {
|
|
94
|
-
if (!await fs.exists(packageJsonPath)) return {
|
|
95
|
-
category: "cli",
|
|
96
|
-
name: "Local Installation",
|
|
97
|
-
status: "skip",
|
|
98
|
-
message: "No package.json found"
|
|
99
|
-
};
|
|
100
|
-
const content = await fs.readFile(packageJsonPath);
|
|
101
|
-
const pkg = JSON.parse(content);
|
|
102
|
-
if (pkg.dependencies?.["@lssm/app.cli-contracts"] !== void 0 || pkg.devDependencies?.["@lssm/app.cli-contracts"] !== void 0) return {
|
|
103
|
-
category: "cli",
|
|
104
|
-
name: "Local Installation",
|
|
105
|
-
status: "pass",
|
|
106
|
-
message: "CLI is installed as a project dependency"
|
|
107
|
-
};
|
|
108
|
-
return {
|
|
109
|
-
category: "cli",
|
|
110
|
-
name: "Local Installation",
|
|
111
|
-
status: "warn",
|
|
112
|
-
message: "CLI is not installed as a project dependency",
|
|
113
|
-
details: "Consider adding @lssm/app.cli-contracts to devDependencies",
|
|
114
|
-
fix: {
|
|
115
|
-
description: "Add CLI as a dev dependency",
|
|
116
|
-
apply: async () => {
|
|
117
|
-
try {
|
|
118
|
-
await execAsync("npm install -D @lssm/app.cli-contracts", {
|
|
119
|
-
cwd: ctx.workspaceRoot,
|
|
120
|
-
timeout: 6e4
|
|
121
|
-
});
|
|
122
|
-
return {
|
|
123
|
-
success: true,
|
|
124
|
-
message: "CLI added as dev dependency"
|
|
125
|
-
};
|
|
126
|
-
} catch (error) {
|
|
127
|
-
return {
|
|
128
|
-
success: false,
|
|
129
|
-
message: `Failed to install: ${error instanceof Error ? error.message : String(error)}`
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
} catch {
|
|
136
|
-
return {
|
|
137
|
-
category: "cli",
|
|
138
|
-
name: "Local Installation",
|
|
139
|
-
status: "skip",
|
|
140
|
-
message: "Could not check local installation"
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
//#endregion
|
|
146
|
-
export { runCliChecks };
|
|
1
|
+
import{exec as e}from"node:child_process";import{promisify as t}from"node:util";const n=t(e);async function r(e,t){let n=[];return n.push(await i(t)),n.push(await a(t)),n.push(await o(e,t)),n}async function i(e){try{return await n(`npx contractspec --version`,{cwd:e.workspaceRoot,timeout:1e4}),{category:`cli`,name:`CLI Accessible`,status:`pass`,message:`ContractSpec CLI is accessible`}}catch{return{category:`cli`,name:`CLI Accessible`,status:`fail`,message:`ContractSpec CLI is not accessible`,details:`Could not run "npx contractspec --version"`,fix:{description:`Install ContractSpec CLI globally`,apply:async()=>{try{return await n(`npm install -g @lssm/app.cli-contracts`,{cwd:e.workspaceRoot,timeout:6e4}),{success:!0,message:`CLI installed globally`}}catch(e){return{success:!1,message:`Failed to install: ${e instanceof Error?e.message:String(e)}`}}}}}}}async function a(e){try{let{stdout:t}=await n(`npx contractspec --version`,{cwd:e.workspaceRoot,timeout:1e4});return{category:`cli`,name:`CLI Version`,status:`pass`,message:`CLI version: ${t.trim()}`}}catch{return{category:`cli`,name:`CLI Version`,status:`skip`,message:`Could not determine CLI version`}}}async function o(e,t){let r=e.join(t.workspaceRoot,`package.json`);try{if(!await e.exists(r))return{category:`cli`,name:`Local Installation`,status:`skip`,message:`No package.json found`};let i=await e.readFile(r),a=JSON.parse(i);return a.dependencies?.[`@lssm/app.cli-contracts`]!==void 0||a.devDependencies?.[`@lssm/app.cli-contracts`]!==void 0?{category:`cli`,name:`Local Installation`,status:`pass`,message:`CLI is installed as a project dependency`}:{category:`cli`,name:`Local Installation`,status:`warn`,message:`CLI is not installed as a project dependency`,details:`Consider adding @lssm/app.cli-contracts to devDependencies`,fix:{description:`Add CLI as a dev dependency`,apply:async()=>{try{return await n(`npm install -D @lssm/app.cli-contracts`,{cwd:t.workspaceRoot,timeout:6e4}),{success:!0,message:`CLI added as dev dependency`}}catch(e){return{success:!1,message:`Failed to install: ${e instanceof Error?e.message:String(e)}`}}}}}}catch{return{category:`cli`,name:`Local Installation`,status:`skip`,message:`Could not check local installation`}}}export{r as runCliChecks};
|
|
@@ -1,170 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { formatJson } from "../../setup/file-merger.js";
|
|
3
|
-
|
|
4
|
-
//#region src/services/doctor/checks/config.ts
|
|
5
|
-
/**
|
|
6
|
-
* Run configuration-related health checks.
|
|
7
|
-
*/
|
|
8
|
-
async function runConfigChecks(fs, ctx) {
|
|
9
|
-
const results = [];
|
|
10
|
-
results.push(await checkContractsrcExists(fs, ctx));
|
|
11
|
-
results.push(await checkContractsrcValid(fs, ctx));
|
|
12
|
-
results.push(await checkContractsrcFields(fs, ctx));
|
|
13
|
-
return results;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Check if .contractsrc.json exists.
|
|
17
|
-
*/
|
|
18
|
-
async function checkContractsrcExists(fs, ctx) {
|
|
19
|
-
const configPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
20
|
-
if (await fs.exists(configPath)) return {
|
|
21
|
-
category: "config",
|
|
22
|
-
name: "Config File Exists",
|
|
23
|
-
status: "pass",
|
|
24
|
-
message: ".contractsrc.json found"
|
|
25
|
-
};
|
|
26
|
-
return {
|
|
27
|
-
category: "config",
|
|
28
|
-
name: "Config File Exists",
|
|
29
|
-
status: "fail",
|
|
30
|
-
message: ".contractsrc.json not found",
|
|
31
|
-
fix: {
|
|
32
|
-
description: "Create .contractsrc.json with defaults",
|
|
33
|
-
apply: async () => {
|
|
34
|
-
try {
|
|
35
|
-
const defaults = generateContractsrcConfig({
|
|
36
|
-
workspaceRoot: ctx.workspaceRoot,
|
|
37
|
-
interactive: false,
|
|
38
|
-
targets: []
|
|
39
|
-
});
|
|
40
|
-
await fs.writeFile(configPath, formatJson(defaults));
|
|
41
|
-
return {
|
|
42
|
-
success: true,
|
|
43
|
-
message: "Created .contractsrc.json"
|
|
44
|
-
};
|
|
45
|
-
} catch (error) {
|
|
46
|
-
return {
|
|
47
|
-
success: false,
|
|
48
|
-
message: `Failed to create: ${error instanceof Error ? error.message : String(error)}`
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Check if .contractsrc.json is valid JSON.
|
|
57
|
-
*/
|
|
58
|
-
async function checkContractsrcValid(fs, ctx) {
|
|
59
|
-
const configPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
60
|
-
if (!await fs.exists(configPath)) return {
|
|
61
|
-
category: "config",
|
|
62
|
-
name: "Config Valid JSON",
|
|
63
|
-
status: "skip",
|
|
64
|
-
message: "Config file does not exist"
|
|
65
|
-
};
|
|
66
|
-
try {
|
|
67
|
-
const content = await fs.readFile(configPath);
|
|
68
|
-
JSON.parse(content);
|
|
69
|
-
return {
|
|
70
|
-
category: "config",
|
|
71
|
-
name: "Config Valid JSON",
|
|
72
|
-
status: "pass",
|
|
73
|
-
message: ".contractsrc.json is valid JSON"
|
|
74
|
-
};
|
|
75
|
-
} catch (error) {
|
|
76
|
-
return {
|
|
77
|
-
category: "config",
|
|
78
|
-
name: "Config Valid JSON",
|
|
79
|
-
status: "fail",
|
|
80
|
-
message: ".contractsrc.json is not valid JSON",
|
|
81
|
-
details: error instanceof Error ? error.message : String(error),
|
|
82
|
-
fix: {
|
|
83
|
-
description: "Replace with valid default config",
|
|
84
|
-
apply: async () => {
|
|
85
|
-
try {
|
|
86
|
-
const defaults = generateContractsrcConfig({
|
|
87
|
-
workspaceRoot: ctx.workspaceRoot,
|
|
88
|
-
interactive: false,
|
|
89
|
-
targets: []
|
|
90
|
-
});
|
|
91
|
-
await fs.writeFile(configPath, formatJson(defaults));
|
|
92
|
-
return {
|
|
93
|
-
success: true,
|
|
94
|
-
message: "Replaced with valid config"
|
|
95
|
-
};
|
|
96
|
-
} catch (err) {
|
|
97
|
-
return {
|
|
98
|
-
success: false,
|
|
99
|
-
message: `Failed: ${err instanceof Error ? err.message : String(err)}`
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Check required fields in .contractsrc.json.
|
|
109
|
-
*/
|
|
110
|
-
async function checkContractsrcFields(fs, ctx) {
|
|
111
|
-
const configPath = fs.join(ctx.workspaceRoot, ".contractsrc.json");
|
|
112
|
-
if (!await fs.exists(configPath)) return {
|
|
113
|
-
category: "config",
|
|
114
|
-
name: "Config Fields",
|
|
115
|
-
status: "skip",
|
|
116
|
-
message: "Config file does not exist"
|
|
117
|
-
};
|
|
118
|
-
try {
|
|
119
|
-
const content = await fs.readFile(configPath);
|
|
120
|
-
const config = JSON.parse(content);
|
|
121
|
-
const missingFields = [];
|
|
122
|
-
if (!config["outputDir"]) missingFields.push("outputDir");
|
|
123
|
-
if (!config["conventions"]) missingFields.push("conventions");
|
|
124
|
-
if (missingFields.length === 0) return {
|
|
125
|
-
category: "config",
|
|
126
|
-
name: "Config Fields",
|
|
127
|
-
status: "pass",
|
|
128
|
-
message: "All recommended fields present"
|
|
129
|
-
};
|
|
130
|
-
return {
|
|
131
|
-
category: "config",
|
|
132
|
-
name: "Config Fields",
|
|
133
|
-
status: "warn",
|
|
134
|
-
message: `Missing recommended fields: ${missingFields.join(", ")}`,
|
|
135
|
-
fix: {
|
|
136
|
-
description: "Add missing fields with defaults",
|
|
137
|
-
apply: async () => {
|
|
138
|
-
try {
|
|
139
|
-
const defaults = generateContractsrcConfig({
|
|
140
|
-
workspaceRoot: ctx.workspaceRoot,
|
|
141
|
-
interactive: false,
|
|
142
|
-
targets: []
|
|
143
|
-
});
|
|
144
|
-
for (const field of missingFields) if (defaults[field] !== void 0) config[field] = defaults[field];
|
|
145
|
-
await fs.writeFile(configPath, formatJson(config));
|
|
146
|
-
return {
|
|
147
|
-
success: true,
|
|
148
|
-
message: "Added missing fields"
|
|
149
|
-
};
|
|
150
|
-
} catch (err) {
|
|
151
|
-
return {
|
|
152
|
-
success: false,
|
|
153
|
-
message: `Failed: ${err instanceof Error ? err.message : String(err)}`
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
} catch {
|
|
160
|
-
return {
|
|
161
|
-
category: "config",
|
|
162
|
-
name: "Config Fields",
|
|
163
|
-
status: "skip",
|
|
164
|
-
message: "Could not parse config"
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
//#endregion
|
|
170
|
-
export { runConfigChecks };
|
|
1
|
+
import{generateContractsrcConfig as e}from"../../setup/config-generators.js";import{formatJson as t}from"../../setup/file-merger.js";async function n(e,t){let n=[];return n.push(await r(e,t)),n.push(await i(e,t)),n.push(await a(e,t)),n}async function r(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);return await n.exists(i)?{category:`config`,name:`Config File Exists`,status:`pass`,message:`.contractsrc.json found`}:{category:`config`,name:`Config File Exists`,status:`fail`,message:`.contractsrc.json not found`,fix:{description:`Create .contractsrc.json with defaults`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});return await n.writeFile(i,t(a)),{success:!0,message:`Created .contractsrc.json`}}catch(e){return{success:!1,message:`Failed to create: ${e instanceof Error?e.message:String(e)}`}}}}}}async function i(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);if(!await n.exists(i))return{category:`config`,name:`Config Valid JSON`,status:`skip`,message:`Config file does not exist`};try{let e=await n.readFile(i);return JSON.parse(e),{category:`config`,name:`Config Valid JSON`,status:`pass`,message:`.contractsrc.json is valid JSON`}}catch(a){return{category:`config`,name:`Config Valid JSON`,status:`fail`,message:`.contractsrc.json is not valid JSON`,details:a instanceof Error?a.message:String(a),fix:{description:`Replace with valid default config`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});return await n.writeFile(i,t(a)),{success:!0,message:`Replaced with valid config`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}}async function a(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);if(!await n.exists(i))return{category:`config`,name:`Config Fields`,status:`skip`,message:`Config file does not exist`};try{let a=await n.readFile(i),o=JSON.parse(a),s=[];return o.outputDir||s.push(`outputDir`),o.conventions||s.push(`conventions`),s.length===0?{category:`config`,name:`Config Fields`,status:`pass`,message:`All recommended fields present`}:{category:`config`,name:`Config Fields`,status:`warn`,message:`Missing recommended fields: ${s.join(`, `)}`,fix:{description:`Add missing fields with defaults`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});for(let e of s)a[e]!==void 0&&(o[e]=a[e]);return await n.writeFile(i,t(o)),{success:!0,message:`Added missing fields`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}catch{return{category:`config`,name:`Config Fields`,status:`skip`,message:`Could not parse config`}}}export{n as runConfigChecks};
|