@contractspec/bundle.workspace 1.56.0 → 1.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/{rolldown_runtime.mjs → _rolldown/runtime.mjs} +3 -3
- package/dist/adapters/ai.d.mts +0 -1
- package/dist/adapters/ai.d.mts.map +1 -1
- package/dist/adapters/factory.d.mts +0 -1
- package/dist/adapters/factory.d.mts.map +1 -1
- package/dist/adapters/fs.bun.d.mts +0 -1
- package/dist/adapters/fs.bun.d.mts.map +1 -1
- package/dist/adapters/fs.bun.mjs +18 -18
- package/dist/adapters/fs.bun.mjs.map +1 -1
- package/dist/adapters/fs.d.mts.map +1 -1
- package/dist/adapters/fs.node.d.mts +0 -1
- package/dist/adapters/fs.node.d.mts.map +1 -1
- package/dist/adapters/fs.node.mjs +18 -18
- package/dist/adapters/fs.node.mjs.map +1 -1
- package/dist/adapters/git.d.mts +0 -1
- package/dist/adapters/git.d.mts.map +1 -1
- package/dist/adapters/git.mjs +2 -2
- package/dist/adapters/git.mjs.map +1 -1
- package/dist/adapters/logger.d.mts +0 -1
- package/dist/adapters/logger.d.mts.map +1 -1
- package/dist/adapters/watcher.d.mts +0 -1
- package/dist/adapters/watcher.d.mts.map +1 -1
- package/dist/adapters/workspace.d.mts.map +1 -1
- package/dist/adapters/workspace.mjs +4 -4
- package/dist/adapters/workspace.mjs.map +1 -1
- package/dist/ai/agents/claude-code-agent.d.mts +0 -1
- package/dist/ai/agents/claude-code-agent.d.mts.map +1 -1
- package/dist/ai/agents/cursor-agent.d.mts +0 -1
- package/dist/ai/agents/cursor-agent.d.mts.map +1 -1
- package/dist/ai/agents/cursor-agent.mjs +5 -5
- package/dist/ai/agents/cursor-agent.mjs.map +1 -1
- package/dist/ai/agents/openai-codex-agent.d.mts +0 -1
- package/dist/ai/agents/openai-codex-agent.d.mts.map +1 -1
- package/dist/ai/agents/orchestrator.d.mts +0 -1
- package/dist/ai/agents/orchestrator.d.mts.map +1 -1
- package/dist/ai/agents/simple-agent.d.mts +0 -1
- package/dist/ai/agents/simple-agent.d.mts.map +1 -1
- package/dist/ai/agents/types.d.mts +0 -1
- package/dist/ai/agents/types.d.mts.map +1 -1
- package/dist/ai/prompts/code-generation.d.mts.map +1 -1
- package/dist/ai/prompts/code-generation.mjs +1 -1
- package/dist/ai/prompts/index.d.mts.map +1 -1
- package/dist/ai/prompts/index.mjs +1 -1
- package/dist/ai/prompts/spec-creation.d.mts.map +1 -1
- package/dist/ai/prompts/spec-creation.mjs +1 -1
- package/dist/ai/providers.d.mts +0 -1
- package/dist/ai/providers.d.mts.map +1 -1
- package/dist/formatters/index.d.mts.map +1 -1
- package/dist/formatters/index.mjs +1 -1
- package/dist/formatters/json.d.mts +0 -1
- package/dist/formatters/json.d.mts.map +1 -1
- package/dist/formatters/sarif.d.mts +0 -1
- package/dist/formatters/sarif.d.mts.map +1 -1
- package/dist/formatters/text.d.mts +0 -1
- package/dist/formatters/text.d.mts.map +1 -1
- package/dist/ports/ai.d.mts +0 -1
- package/dist/ports/ai.d.mts.map +1 -1
- package/dist/ports/fs.d.mts.map +1 -1
- package/dist/ports/git.d.mts.map +1 -1
- package/dist/ports/logger.d.mts.map +1 -1
- package/dist/ports/rulesync.d.mts +0 -1
- package/dist/ports/rulesync.d.mts.map +1 -1
- package/dist/ports/watcher.d.mts.map +1 -1
- package/dist/registry.d.mts +0 -1
- package/dist/registry.d.mts.map +1 -1
- package/dist/services/action-drift/service.d.mts.map +1 -1
- package/dist/services/action-drift/types.d.mts.map +1 -1
- package/dist/services/action-pr/service.d.mts.map +1 -1
- package/dist/services/action-pr/service.mjs +1 -1
- package/dist/services/action-pr/service.mjs.map +1 -1
- package/dist/services/action-pr/types.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/claude-code.d.mts +0 -1
- package/dist/services/agent-guide/adapters/claude-code.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts +0 -1
- package/dist/services/agent-guide/adapters/cursor-cli.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts +0 -1
- package/dist/services/agent-guide/adapters/generic-mcp.d.mts.map +1 -1
- package/dist/services/agent-guide/adapters/index.d.mts +0 -1
- package/dist/services/agent-guide/adapters/index.d.mts.map +1 -1
- package/dist/services/agent-guide/agent-guide-service.d.mts +0 -1
- package/dist/services/agent-guide/agent-guide-service.d.mts.map +1 -1
- package/dist/services/agent-guide/types.d.mts +0 -1
- package/dist/services/agent-guide/types.d.mts.map +1 -1
- package/dist/services/build.d.mts +0 -1
- package/dist/services/build.d.mts.map +1 -1
- package/dist/services/ci-check/ci-check-service.d.mts +0 -1
- package/dist/services/ci-check/ci-check-service.d.mts.map +1 -1
- package/dist/services/ci-check/types.d.mts +3 -8
- package/dist/services/ci-check/types.d.mts.map +1 -1
- package/dist/services/clean.d.mts +0 -1
- package/dist/services/clean.d.mts.map +1 -1
- package/dist/services/config.d.mts +0 -1
- package/dist/services/config.d.mts.map +1 -1
- package/dist/services/create/ai-generator.d.mts +0 -1
- package/dist/services/create/ai-generator.d.mts.map +1 -1
- package/dist/services/create/index.d.mts.map +1 -1
- package/dist/services/create/templates.d.mts.map +1 -1
- package/dist/services/create/templates.mjs +1 -1
- package/dist/services/deps.d.mts +0 -1
- package/dist/services/deps.d.mts.map +1 -1
- package/dist/services/diff.d.mts +0 -1
- package/dist/services/diff.d.mts.map +1 -1
- package/dist/services/docs/docs-service.d.mts.map +1 -1
- package/dist/services/doctor/doctor-service.d.mts +0 -1
- package/dist/services/doctor/doctor-service.d.mts.map +1 -1
- package/dist/services/doctor/types.d.mts.map +1 -1
- package/dist/services/extract.d.mts.map +1 -1
- package/dist/services/features/completion.d.mts +0 -1
- package/dist/services/features/completion.d.mts.map +1 -1
- package/dist/services/features/completion.mjs +1 -1
- package/dist/services/features/completion.mjs.map +1 -1
- package/dist/services/features/feature-editor.d.mts.map +1 -1
- package/dist/services/features/index.d.mts.map +1 -1
- package/dist/services/features/index.mjs +1 -1
- package/dist/services/features/validation.d.mts +0 -1
- package/dist/services/features/validation.d.mts.map +1 -1
- package/dist/services/fix/fix-link-formatter.d.mts +0 -1
- package/dist/services/fix/fix-link-formatter.d.mts.map +1 -1
- package/dist/services/fix/fix-service.d.mts +0 -1
- package/dist/services/fix/fix-service.d.mts.map +1 -1
- package/dist/services/fix/index.d.mts.map +1 -1
- package/dist/services/fix/index.mjs +1 -1
- package/dist/services/fix/schemas.d.mts +0 -1
- package/dist/services/fix/schemas.d.mts.map +1 -1
- package/dist/services/fix/strategies/implement-ai.d.mts +0 -1
- package/dist/services/fix/strategies/implement-ai.d.mts.map +1 -1
- package/dist/services/fix/strategies/implement-skeleton.d.mts +0 -1
- package/dist/services/fix/strategies/implement-skeleton.d.mts.map +1 -1
- package/dist/services/fix/strategies/remove-reference.d.mts +0 -1
- package/dist/services/fix/strategies/remove-reference.d.mts.map +1 -1
- package/dist/services/fix/types.d.mts +0 -1
- package/dist/services/fix/types.d.mts.map +1 -1
- package/dist/services/formatter.d.mts.map +1 -1
- package/dist/services/gap.d.mts.map +1 -1
- package/dist/services/generate-artifacts.d.mts.map +1 -1
- package/dist/services/hooks/hooks-service.d.mts +0 -1
- package/dist/services/hooks/hooks-service.d.mts.map +1 -1
- package/dist/services/hooks/index.d.mts.map +1 -1
- package/dist/services/hooks/index.mjs +1 -1
- package/dist/services/hooks/types.d.mts.map +1 -1
- package/dist/services/impact/formatters.d.mts +0 -1
- package/dist/services/impact/formatters.d.mts.map +1 -1
- package/dist/services/impact/impact-detection-service.d.mts +0 -1
- package/dist/services/impact/impact-detection-service.d.mts.map +1 -1
- package/dist/services/impact/index.d.mts.map +1 -1
- package/dist/services/impact/index.mjs +1 -1
- package/dist/services/impact/types.d.mts +0 -1
- package/dist/services/impact/types.d.mts.map +1 -1
- package/dist/services/implementation/discovery.d.mts +0 -1
- package/dist/services/implementation/discovery.d.mts.map +1 -1
- package/dist/services/implementation/resolver/conventions.d.mts +0 -1
- package/dist/services/implementation/resolver/conventions.d.mts.map +1 -1
- package/dist/services/implementation/resolver/index.d.mts +0 -1
- package/dist/services/implementation/resolver/index.d.mts.map +1 -1
- package/dist/services/implementation/resolver/index.mjs +7 -7
- package/dist/services/implementation/resolver/index.mjs.map +1 -1
- package/dist/services/implementation/resolver/parsers.d.mts +0 -1
- package/dist/services/implementation/resolver/parsers.d.mts.map +1 -1
- package/dist/services/implementation/resolver/parsers.mjs +6 -6
- package/dist/services/implementation/resolver/parsers.mjs.map +1 -1
- package/dist/services/implementation/resolver/status.d.mts +0 -1
- package/dist/services/implementation/resolver/status.d.mts.map +1 -1
- package/dist/services/implementation/types.d.mts +0 -1
- package/dist/services/implementation/types.d.mts.map +1 -1
- package/dist/services/import/import-service.d.mts +0 -1
- package/dist/services/import/import-service.d.mts.map +1 -1
- package/dist/services/import/import-service.mjs +3 -3
- package/dist/services/import/import-service.mjs.map +1 -1
- package/dist/services/import/report-service.d.mts +0 -1
- package/dist/services/import/report-service.d.mts.map +1 -1
- package/dist/services/import/verify-service.d.mts +0 -1
- package/dist/services/import/verify-service.d.mts.map +1 -1
- package/dist/services/integrity-diagram.d.mts +0 -1
- package/dist/services/integrity-diagram.d.mts.map +1 -1
- package/dist/services/integrity.d.mts +0 -1
- package/dist/services/integrity.d.mts.map +1 -1
- package/dist/services/layer-discovery.d.mts +0 -1
- package/dist/services/layer-discovery.d.mts.map +1 -1
- package/dist/services/list.d.mts +0 -1
- package/dist/services/list.d.mts.map +1 -1
- package/dist/services/llm/index.d.mts +0 -1
- package/dist/services/llm/index.d.mts.map +1 -1
- package/dist/services/llm/index.mjs +0 -1
- package/dist/services/llm/index.mjs.map +1 -1
- package/dist/services/llm/verify-static.d.mts +0 -1
- package/dist/services/llm/verify-static.d.mts.map +1 -1
- package/dist/services/openapi/export-service.d.mts +0 -1
- package/dist/services/openapi/export-service.d.mts.map +1 -1
- package/dist/services/openapi/import-service.d.mts +0 -1
- package/dist/services/openapi/import-service.d.mts.map +1 -1
- package/dist/services/openapi/import-service.mjs +1 -1
- package/dist/services/openapi/import-service.mjs.map +1 -1
- package/dist/services/openapi/sync-service.d.mts +0 -1
- package/dist/services/openapi/sync-service.d.mts.map +1 -1
- package/dist/services/openapi/sync-service.mjs +1 -1
- package/dist/services/openapi/sync-service.mjs.map +1 -1
- package/dist/services/openapi/types.d.mts +0 -1
- package/dist/services/openapi/types.d.mts.map +1 -1
- package/dist/services/openapi/validate-service.d.mts +0 -1
- package/dist/services/openapi/validate-service.d.mts.map +1 -1
- package/dist/services/openapi/validate-service.mjs +3 -3
- package/dist/services/openapi/validate-service.mjs.map +1 -1
- package/dist/services/quickstart/dependencies.d.mts +0 -1
- package/dist/services/quickstart/dependencies.d.mts.map +1 -1
- package/dist/services/quickstart/quickstart-service.d.mts +0 -1
- package/dist/services/quickstart/quickstart-service.d.mts.map +1 -1
- package/dist/services/quickstart/types.d.mts.map +1 -1
- package/dist/services/regenerator.d.mts +0 -1
- package/dist/services/regenerator.d.mts.map +1 -1
- package/dist/services/registry.d.mts +0 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/rulesync.d.mts +0 -1
- package/dist/services/rulesync.d.mts.map +1 -1
- package/dist/services/setup/config-generators.d.mts +0 -1
- package/dist/services/setup/config-generators.d.mts.map +1 -1
- package/dist/services/setup/file-merger.d.mts.map +1 -1
- package/dist/services/setup/setup-service.d.mts +0 -1
- package/dist/services/setup/setup-service.d.mts.map +1 -1
- package/dist/services/setup/types.d.mts.map +1 -1
- package/dist/services/sync.d.mts +0 -1
- package/dist/services/sync.d.mts.map +1 -1
- package/dist/services/test/test-generator-service.d.mts +1 -2
- package/dist/services/test/test-generator-service.d.mts.map +1 -1
- package/dist/services/test/test-service.d.mts.map +1 -1
- package/dist/services/test-link/index.d.mts +0 -1
- package/dist/services/test-link/index.d.mts.map +1 -1
- package/dist/services/upgrade/index.d.mts.map +1 -1
- package/dist/services/upgrade/index.mjs +1 -1
- package/dist/services/upgrade/types.d.mts.map +1 -1
- package/dist/services/upgrade/upgrade-service.d.mts +0 -1
- package/dist/services/upgrade/upgrade-service.d.mts.map +1 -1
- package/dist/services/validate/blueprint-validator.d.mts +0 -1
- package/dist/services/validate/blueprint-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-agent-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-agent-validator.mjs +2 -2
- package/dist/services/validate/implementation-agent-validator.mjs.map +1 -1
- package/dist/services/validate/implementation-validator.d.mts +0 -1
- package/dist/services/validate/implementation-validator.d.mts.map +1 -1
- package/dist/services/validate/implementation-validator.mjs +1 -1
- package/dist/services/validate/implementation-validator.mjs.map +1 -1
- package/dist/services/validate/spec-validator.d.mts +0 -1
- package/dist/services/validate/spec-validator.d.mts.map +1 -1
- package/dist/services/validate/tenant-validator.d.mts.map +1 -1
- package/dist/services/validate/tenant-validator.mjs +5 -5
- package/dist/services/validate/tenant-validator.mjs.map +1 -1
- package/dist/services/verification-cache/adapters/filesystem.d.mts +0 -1
- package/dist/services/verification-cache/adapters/filesystem.d.mts.map +1 -1
- package/dist/services/verification-cache/adapters/in-memory.d.mts +0 -1
- package/dist/services/verification-cache/adapters/in-memory.d.mts.map +1 -1
- package/dist/services/verification-cache/adapters/workspace-state.d.mts +0 -1
- package/dist/services/verification-cache/adapters/workspace-state.d.mts.map +1 -1
- package/dist/services/verification-cache/cache-service.d.mts +0 -1
- package/dist/services/verification-cache/cache-service.d.mts.map +1 -1
- package/dist/services/verification-cache/types.d.mts +0 -1
- package/dist/services/verification-cache/types.d.mts.map +1 -1
- package/dist/services/verify/ai-verifier.d.mts +0 -1
- package/dist/services/verify/ai-verifier.d.mts.map +1 -1
- package/dist/services/verify/behavior-verifier.d.mts +0 -1
- package/dist/services/verify/behavior-verifier.d.mts.map +1 -1
- package/dist/services/verify/structure-verifier.d.mts +0 -1
- package/dist/services/verify/structure-verifier.d.mts.map +1 -1
- package/dist/services/verify/types.d.mts +0 -1
- package/dist/services/verify/types.d.mts.map +1 -1
- package/dist/services/verify/verify-service.d.mts +0 -1
- package/dist/services/verify/verify-service.d.mts.map +1 -1
- package/dist/services/versioning/changelog-formatter.d.mts +0 -1
- package/dist/services/versioning/changelog-formatter.d.mts.map +1 -1
- package/dist/services/versioning/conventional-commits.d.mts +0 -1
- package/dist/services/versioning/conventional-commits.d.mts.map +1 -1
- package/dist/services/versioning/index.d.mts.map +1 -1
- package/dist/services/versioning/index.mjs +1 -1
- package/dist/services/versioning/types.d.mts +0 -1
- package/dist/services/versioning/types.d.mts.map +1 -1
- package/dist/services/versioning/versioning-service.d.mts +0 -1
- package/dist/services/versioning/versioning-service.d.mts.map +1 -1
- package/dist/services/versioning/versioning-service.mjs +1 -1
- package/dist/services/versioning/versioning-service.mjs.map +1 -1
- package/dist/services/vibe/config.d.mts +0 -1
- package/dist/services/vibe/config.d.mts.map +1 -1
- package/dist/services/vibe/context.d.mts.map +1 -1
- package/dist/services/vibe/definitions.d.mts +0 -1
- package/dist/services/vibe/definitions.d.mts.map +1 -1
- package/dist/services/vibe/engine.d.mts +0 -1
- package/dist/services/vibe/engine.d.mts.map +1 -1
- package/dist/services/vibe/index.d.mts.map +1 -1
- package/dist/services/vibe/index.mjs +1 -1
- package/dist/services/vibe/loader.d.mts +0 -1
- package/dist/services/vibe/loader.d.mts.map +1 -1
- package/dist/services/vibe/pack.d.mts.map +1 -1
- package/dist/services/vibe/types.d.mts.map +1 -1
- package/dist/services/view/index.d.mts.map +1 -1
- package/dist/services/watch.d.mts +0 -1
- package/dist/services/watch.d.mts.map +1 -1
- package/dist/services/workspace-info.d.mts +0 -1
- package/dist/services/workspace-info.d.mts.map +1 -1
- package/dist/templates/app-config.template.d.mts.map +1 -1
- package/dist/templates/data-view.template.d.mts.map +1 -1
- package/dist/templates/event.template.d.mts +0 -1
- package/dist/templates/event.template.d.mts.map +1 -1
- package/dist/templates/experiment.template.d.mts.map +1 -1
- package/dist/templates/feature.template.d.mts.map +1 -1
- package/dist/templates/handler.template.d.mts.map +1 -1
- package/dist/templates/index.d.mts.map +1 -1
- package/dist/templates/index.mjs +1 -1
- package/dist/templates/integration.template.d.mts.map +1 -1
- package/dist/templates/integration.template.mjs +0 -3
- package/dist/templates/integration.template.mjs.map +1 -1
- package/dist/templates/knowledge.template.d.mts.map +1 -1
- package/dist/templates/knowledge.template.mjs +0 -1
- package/dist/templates/knowledge.template.mjs.map +1 -1
- package/dist/templates/migration.template.d.mts.map +1 -1
- package/dist/templates/migration.template.mjs +0 -1
- package/dist/templates/migration.template.mjs.map +1 -1
- package/dist/templates/operation.template.d.mts +0 -1
- package/dist/templates/operation.template.d.mts.map +1 -1
- package/dist/templates/presentation.template.d.mts +0 -1
- package/dist/templates/presentation.template.d.mts.map +1 -1
- package/dist/templates/telemetry.template.d.mts.map +1 -1
- package/dist/templates/workflow-runner.template.d.mts.map +1 -1
- package/dist/templates/workflow.template.d.mts.map +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/utils/filter.d.mts +0 -1
- package/dist/utils/filter.d.mts.map +1 -1
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/module-loader.d.mts.map +1 -1
- package/dist/utils/validation.d.mts +0 -1
- package/dist/utils/validation.d.mts.map +1 -1
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventions.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/conventions.ts"],"
|
|
1
|
+
{"version":3,"file":"conventions.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/conventions.ts"],"mappings":";;;;;;iBASgB,WAAA,CAAY,KAAA;AAU5B;;;AAAA,iBAAgB,kBAAA,CACd,QAAA,UACA,OAAA,UACA,SAAA;EACG,IAAA;EAAc,IAAA,EAAM,kBAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/index.ts"],"mappings":";;;;;;;;;;;;;iBAmDsB,sBAAA,CACpB,QAAA,EAAU,cAAA,EACV,QAAA;EAAY,EAAA,EAAI,SAAA;AAAA,GAChB,MAAA,EAAQ,yBAAA,EACR,OAAA,GAAS,eAAA,EACT,OAAA,GAAU,GAAA,GACT,OAAA,CAAQ,wBAAA;;;;iBAiHW,yBAAA,CACpB,SAAA,EAAW,cAAA,IACX,QAAA;EAAY,EAAA,EAAI,SAAA;AAAA,GAChB,MAAA,EAAQ,yBAAA,EACR,OAAA,GAAS,eAAA,EACT,OAAA,GAAU,GAAA,GACT,OAAA,CAAQ,wBAAA"}
|
|
@@ -40,18 +40,18 @@ async function resolveImplementations(specFile, adapters, config, options = {},
|
|
|
40
40
|
const { fs } = adapters;
|
|
41
41
|
const implementations = [];
|
|
42
42
|
const seenPaths = /* @__PURE__ */ new Set();
|
|
43
|
-
const addImpl = async (path
|
|
44
|
-
if (seenPaths.has(path
|
|
45
|
-
seenPaths.add(path
|
|
46
|
-
const exists = await fs.exists(path
|
|
43
|
+
const addImpl = async (path, type, source, description) => {
|
|
44
|
+
if (seenPaths.has(path)) return;
|
|
45
|
+
seenPaths.add(path);
|
|
46
|
+
const exists = await fs.exists(path);
|
|
47
47
|
let implementationSourceContent = void 0;
|
|
48
48
|
let implementationSourceHash = void 0;
|
|
49
49
|
if (exists && opts.computeHashes) try {
|
|
50
|
-
implementationSourceContent = await fs.readFile(path
|
|
50
|
+
implementationSourceContent = await fs.readFile(path);
|
|
51
51
|
implementationSourceHash = computeHash(implementationSourceContent);
|
|
52
52
|
} catch {}
|
|
53
53
|
implementations.push({
|
|
54
|
-
path
|
|
54
|
+
path,
|
|
55
55
|
type,
|
|
56
56
|
source,
|
|
57
57
|
exists,
|
|
@@ -77,7 +77,7 @@ async function resolveImplementations(specFile, adapters, config, options = {},
|
|
|
77
77
|
if (spinner) spinner.suffixText = `Discover implementations based on conventions`;
|
|
78
78
|
const outputDir = opts.outputDir ?? config.outputDir ?? "./src";
|
|
79
79
|
const conventionPaths = getConventionPaths(specFile.specType, specKey, outputDir);
|
|
80
|
-
for (const { path
|
|
80
|
+
for (const { path, type } of conventionPaths) await addImpl(path, type, "convention");
|
|
81
81
|
}
|
|
82
82
|
if (spinner) spinner.suffixText = `Determine implementation status`;
|
|
83
83
|
const status = determineStatus(implementations);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/implementation/resolver/index.ts"],"sourcesContent":["/**\n * Implementation resolver service.\n *\n * Resolves all implementations for a spec by merging:\n * 1. Explicit mappings from spec.implementations\n * 2. Auto-discovered references from workspace scanning\n * 3. Convention-based paths (naming conventions)\n */\n\nimport { createHash } from 'crypto';\n\nimport type { SpecScanResult } from '@contractspec/module.workspace';\nimport type {\n ImplementationType,\n ResolvedContractsrcConfig,\n} from '@contractspec/lib.contracts';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n ResolvedImplementation,\n ResolverOptions,\n SpecImplementationResult,\n} from '../types';\nimport { discoverImplementationsForSpec } from '../discovery';\n\nimport { getConventionPaths } from './conventions';\nimport { parseExplicitImplementations } from './parsers';\nimport { determineStatus } from './status';\nimport path from 'path';\nimport type { Ora } from 'ora';\n\nexport * from './parsers';\nexport * from './conventions';\nexport * from './status';\n\nconst DEFAULT_OPTIONS: ResolverOptions = {\n includeExplicit: true,\n includeDiscovered: true,\n includeConvention: true,\n computeHashes: true,\n};\n\n/**\n * Compute SHA256 hash of content.\n */\nfunction computeHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Resolve all implementations for a spec file.\n */\nexport async function resolveImplementations(\n specFile: SpecScanResult,\n adapters: { fs: FsAdapter },\n config: ResolvedContractsrcConfig,\n options: ResolverOptions = {},\n spinner?: Ora\n): Promise<SpecImplementationResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const specHash = opts.computeHashes\n ? computeHash(specFile.sourceBlock || '')\n : undefined;\n\n const specKey =\n specFile.key ?? path.basename(specFile.filePath).replace(/\\.[jt]s$/, '');\n const specVersion = specFile.version ?? '1.0.0';\n\n const { fs } = adapters;\n\n const implementations: ResolvedImplementation[] = [];\n const seenPaths = new Set<string>();\n\n // Helper to add unique implementations\n const addImpl = async (\n path: string,\n type: ImplementationType,\n source: ResolvedImplementation['source'],\n description?: string\n ) => {\n if (seenPaths.has(path)) return;\n seenPaths.add(path);\n\n const exists = await fs.exists(path);\n let implementationSourceContent: string | undefined = undefined;\n let implementationSourceHash: string | undefined = undefined;\n\n if (exists && opts.computeHashes) {\n try {\n implementationSourceContent = await fs.readFile(path);\n implementationSourceHash = computeHash(implementationSourceContent);\n } catch {\n // Ignore hash computation errors\n }\n }\n\n implementations.push({\n path,\n type,\n source,\n exists,\n implementationSourceContent,\n implementationSourceHash,\n description,\n });\n };\n\n // 1. Add explicit implementations from spec\n if (opts.includeExplicit && specFile.sourceBlock) {\n if (spinner) spinner.suffixText = `Discover explicit implementations`;\n\n // Parse explicit implementations from spec source\n const explicitImpls = parseExplicitImplementations(specFile.sourceBlock);\n for (const impl of explicitImpls) {\n await addImpl(impl.path, impl.type, 'explicit', impl.description);\n }\n }\n\n // 2. Add auto-discovered implementations\n if (opts.includeDiscovered) {\n if (spinner) spinner.suffixText = `Discover implementations`;\n\n const discovered = await discoverImplementationsForSpec(\n specKey,\n adapters,\n opts\n );\n\n for (const ref of discovered) {\n // Skip the spec file itself\n if (ref.filePath === specFile.filePath) continue;\n\n await addImpl(ref.filePath, ref.inferredType, 'discovered');\n }\n }\n\n // 3. Add convention-based implementations\n if (opts.includeConvention) {\n if (spinner)\n spinner.suffixText = `Discover implementations based on conventions`;\n\n const outputDir = opts.outputDir ?? config.outputDir ?? './src';\n const conventionPaths = getConventionPaths(\n specFile.specType,\n specKey,\n outputDir\n );\n\n for (const { path, type } of conventionPaths) {\n await addImpl(path, type, 'convention');\n }\n }\n\n if (spinner) spinner.suffixText = `Determine implementation status`;\n // Determine overall status\n const status = determineStatus(implementations);\n\n return {\n specKey,\n specVersion,\n specPath: specFile.filePath,\n specType: specFile.specType,\n implementations,\n status,\n specHash,\n };\n}\n\n/**\n * Resolve implementations for multiple spec files.\n */\nexport async function resolveAllImplementations(\n specFiles: SpecScanResult[],\n adapters: { fs: FsAdapter },\n config: ResolvedContractsrcConfig,\n options: ResolverOptions = {},\n spinner?: Ora\n): Promise<SpecImplementationResult[]> {\n const results: SpecImplementationResult[] = [];\n\n for (const specFile of specFiles) {\n if (spinner)\n spinner.text = `Resolving implementation... (${results.length}/${specFiles.length})`;\n\n try {\n const result = await resolveImplementations(\n specFile,\n adapters,\n config,\n options,\n spinner\n );\n results.push(result);\n } catch (error) {\n // Log error but continue with other specs\n console.error(\n `Failed to resolve implementations for ${specFile}:`,\n error\n );\n }\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM,kBAAmC;CACvC,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB,eAAe;CAChB;;;;AAKD,SAAS,YAAY,SAAyB;AAC5C,QAAO,WAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAM;;;;;AAM3D,eAAsB,uBACpB,UACA,UACA,QACA,UAA2B,EAAE,EAC7B,SACmC;CACnC,MAAM,OAAO;EAAE,GAAG;EAAiB,GAAG;EAAS;CAC/C,MAAM,WAAW,KAAK,gBAClB,YAAY,SAAS,eAAe,GAAG,GACvC;CAEJ,MAAM,UACJ,SAAS,OAAO,KAAK,SAAS,SAAS,SAAS,CAAC,QAAQ,YAAY,GAAG;CAC1E,MAAM,cAAc,SAAS,WAAW;CAExC,MAAM,EAAE,OAAO;CAEf,MAAM,kBAA4C,EAAE;CACpD,MAAM,4BAAY,IAAI,KAAa;CAGnC,MAAM,UAAU,OACd,MACA,MACA,QACA,gBACG;AACH,MAAI,UAAU,IAAI,KAAK,CAAE;AACzB,YAAU,IAAI,KAAK;EAEnB,MAAM,SAAS,MAAM,GAAG,OAAO,KAAK;EACpC,IAAI,8BAAkD;EACtD,IAAI,2BAA+C;AAEnD,MAAI,UAAU,KAAK,cACjB,KAAI;AACF,iCAA8B,MAAM,GAAG,SAAS,KAAK;AACrD,8BAA2B,YAAY,4BAA4B;UAC7D;AAKV,kBAAgB,KAAK;GACnB;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;;AAIJ,KAAI,KAAK,mBAAmB,SAAS,aAAa;AAChD,MAAI,QAAS,SAAQ,aAAa;EAGlC,MAAM,gBAAgB,6BAA6B,SAAS,YAAY;AACxE,OAAK,MAAM,QAAQ,cACjB,OAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,YAAY,KAAK,YAAY;;AAKrE,KAAI,KAAK,mBAAmB;AAC1B,MAAI,QAAS,SAAQ,aAAa;EAElC,MAAM,aAAa,MAAM,+BACvB,SACA,UACA,KACD;AAED,OAAK,MAAM,OAAO,YAAY;AAE5B,OAAI,IAAI,aAAa,SAAS,SAAU;AAExC,SAAM,QAAQ,IAAI,UAAU,IAAI,cAAc,aAAa;;;AAK/D,KAAI,KAAK,mBAAmB;AAC1B,MAAI,QACF,SAAQ,aAAa;EAEvB,MAAM,YAAY,KAAK,aAAa,OAAO,aAAa;EACxD,MAAM,kBAAkB,mBACtB,SAAS,UACT,SACA,UACD;AAED,OAAK,MAAM,EAAE,MAAM,UAAU,gBAC3B,OAAM,QAAQ,MAAM,MAAM,aAAa;;AAI3C,KAAI,QAAS,SAAQ,aAAa;CAElC,MAAM,SAAS,gBAAgB,gBAAgB;AAE/C,QAAO;EACL;EACA;EACA,UAAU,SAAS;EACnB,UAAU,SAAS;EACnB;EACA;EACA;EACD;;;;;AAMH,eAAsB,0BACpB,WACA,UACA,QACA,UAA2B,EAAE,EAC7B,SACqC;CACrC,MAAM,UAAsC,EAAE;AAE9C,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,QACF,SAAQ,OAAO,gCAAgC,QAAQ,OAAO,GAAG,UAAU,OAAO;AAEpF,MAAI;GACF,MAAM,SAAS,MAAM,uBACnB,UACA,UACA,QACA,SACA,QACD;AACD,WAAQ,KAAK,OAAO;WACb,OAAO;AAEd,WAAQ,MACN,yCAAyC,SAAS,IAClD,MACD;;;AAIL,QAAO"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ImplementationRef } from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/services/implementation/resolver/parsers.d.ts
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
5
|
* Parse explicit implementations from spec source code using ts-morph.
|
|
7
6
|
* Looks for: implementations: [{ path: '...', type: '...' }] inside the main spec object.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/parsers.ts"],"
|
|
1
|
+
{"version":3,"file":"parsers.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/parsers.ts"],"mappings":";;;;;;;iBAcgB,4BAAA,CACd,IAAA,WACC,iBAAA"}
|
|
@@ -20,18 +20,18 @@ function parseExplicitImplementations(code) {
|
|
|
20
20
|
let descVal;
|
|
21
21
|
const pathProp = elem.getProperty("path");
|
|
22
22
|
if (pathProp && Node.isPropertyAssignment(pathProp)) {
|
|
23
|
-
const init
|
|
24
|
-
if (Node.isStringLiteral(init
|
|
23
|
+
const init = pathProp.getInitializer();
|
|
24
|
+
if (Node.isStringLiteral(init)) pathVal = init.getLiteralText();
|
|
25
25
|
}
|
|
26
26
|
const typeProp = elem.getProperty("type");
|
|
27
27
|
if (typeProp && Node.isPropertyAssignment(typeProp)) {
|
|
28
|
-
const init
|
|
29
|
-
if (Node.isStringLiteral(init
|
|
28
|
+
const init = typeProp.getInitializer();
|
|
29
|
+
if (Node.isStringLiteral(init)) typeVal = init.getLiteralText();
|
|
30
30
|
}
|
|
31
31
|
const descProp = elem.getProperty("description");
|
|
32
32
|
if (descProp && Node.isPropertyAssignment(descProp)) {
|
|
33
|
-
const init
|
|
34
|
-
if (Node.isStringLiteral(init
|
|
33
|
+
const init = descProp.getInitializer();
|
|
34
|
+
if (Node.isStringLiteral(init)) descVal = init.getLiteralText();
|
|
35
35
|
}
|
|
36
36
|
if (pathVal && typeVal) implementations.push({
|
|
37
37
|
path: pathVal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.mjs","names":[
|
|
1
|
+
{"version":3,"file":"parsers.mjs","names":[],"sources":["../../../../src/services/implementation/resolver/parsers.ts"],"sourcesContent":["/**\n * Parser utilities for extracting implementation references from source code.\n */\n\nimport type {\n ImplementationRef,\n ImplementationType,\n} from '@contractspec/lib.contracts';\nimport { Node, Project, SyntaxKind } from 'ts-morph';\n\n/**\n * Parse explicit implementations from spec source code using ts-morph.\n * Looks for: implementations: [{ path: '...', type: '...' }] inside the main spec object.\n */\nexport function parseExplicitImplementations(\n code: string\n): ImplementationRef[] {\n const implementations: ImplementationRef[] = [];\n const project = new Project({ useInMemoryFileSystem: true });\n // Create a SourceFile\n const sourceFile = project.createSourceFile('spec.ts', code);\n\n // Helper to extract fields from an object literal\n const extractImpls = (obj: Node) => {\n if (!Node.isObjectLiteralExpression(obj)) return;\n const prop = obj.getProperty('implementations');\n if (prop && Node.isPropertyAssignment(prop)) {\n const init = prop.getInitializer();\n if (init && Node.isArrayLiteralExpression(init)) {\n for (const elem of init.getElements()) {\n if (Node.isObjectLiteralExpression(elem)) {\n let pathVal: string | undefined;\n let typeVal: ImplementationType | undefined;\n let descVal: string | undefined;\n\n const pathProp = elem.getProperty('path');\n if (pathProp && Node.isPropertyAssignment(pathProp)) {\n const init = pathProp.getInitializer();\n if (Node.isStringLiteral(init)) {\n pathVal = init.getLiteralText();\n }\n }\n\n const typeProp = elem.getProperty('type');\n if (typeProp && Node.isPropertyAssignment(typeProp)) {\n const init = typeProp.getInitializer();\n if (Node.isStringLiteral(init)) {\n typeVal = init.getLiteralText() as ImplementationType;\n }\n }\n\n const descProp = elem.getProperty('description');\n if (descProp && Node.isPropertyAssignment(descProp)) {\n const init = descProp.getInitializer();\n if (Node.isStringLiteral(init)) {\n descVal = init.getLiteralText();\n }\n }\n\n if (pathVal && typeVal) {\n implementations.push({\n path: pathVal,\n type: typeVal,\n description: descVal,\n });\n }\n }\n }\n }\n }\n };\n\n // Find the spec object\n // 1. defineCommand/Event/etc CallExpression\n // 2. Exported object literal or variable\n\n const callExpressions = sourceFile.getDescendantsOfKind(\n SyntaxKind.CallExpression\n );\n for (const call of callExpressions) {\n const expr = call.getExpression().getText();\n if (\n ['defineCommand', 'defineQuery', 'defineEvent', 'defineFeature'].includes(\n expr\n )\n ) {\n const args = call.getArguments();\n if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {\n extractImpls(args[0]);\n return implementations; // Assume only one main definition per file\n }\n }\n }\n\n // Fallback: search exported variables\n const varStmts = sourceFile.getVariableStatements();\n for (const stmt of varStmts) {\n if (stmt.isExported()) {\n for (const decl of stmt.getDeclarations()) {\n const init = decl.getInitializer();\n if (init && Node.isObjectLiteralExpression(init)) {\n // Check if it has 'implementations'\n if (init.getProperty('implementations')) {\n extractImpls(init);\n return implementations;\n }\n }\n }\n }\n }\n\n // Fallback: default export\n const exportAssign = sourceFile.getExportAssignment(\n (d) => !d.isExportEquals()\n );\n if (exportAssign) {\n const expr = exportAssign.getExpression();\n if (Node.isObjectLiteralExpression(expr)) {\n extractImpls(expr);\n } else if (\n Node.isAsExpression(expr) &&\n Node.isObjectLiteralExpression(expr.getExpression())\n ) {\n extractImpls(expr.getExpression());\n }\n }\n\n return implementations;\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,6BACd,MACqB;CACrB,MAAM,kBAAuC,EAAE;CAG/C,MAAM,aAFU,IAAI,QAAQ,EAAE,uBAAuB,MAAM,CAAC,CAEjC,iBAAiB,WAAW,KAAK;CAG5D,MAAM,gBAAgB,QAAc;AAClC,MAAI,CAAC,KAAK,0BAA0B,IAAI,CAAE;EAC1C,MAAM,OAAO,IAAI,YAAY,kBAAkB;AAC/C,MAAI,QAAQ,KAAK,qBAAqB,KAAK,EAAE;GAC3C,MAAM,OAAO,KAAK,gBAAgB;AAClC,OAAI,QAAQ,KAAK,yBAAyB,KAAK,EAC7C;SAAK,MAAM,QAAQ,KAAK,aAAa,CACnC,KAAI,KAAK,0BAA0B,KAAK,EAAE;KACxC,IAAI;KACJ,IAAI;KACJ,IAAI;KAEJ,MAAM,WAAW,KAAK,YAAY,OAAO;AACzC,SAAI,YAAY,KAAK,qBAAqB,SAAS,EAAE;MACnD,MAAM,OAAO,SAAS,gBAAgB;AACtC,UAAI,KAAK,gBAAgB,KAAK,CAC5B,WAAU,KAAK,gBAAgB;;KAInC,MAAM,WAAW,KAAK,YAAY,OAAO;AACzC,SAAI,YAAY,KAAK,qBAAqB,SAAS,EAAE;MACnD,MAAM,OAAO,SAAS,gBAAgB;AACtC,UAAI,KAAK,gBAAgB,KAAK,CAC5B,WAAU,KAAK,gBAAgB;;KAInC,MAAM,WAAW,KAAK,YAAY,cAAc;AAChD,SAAI,YAAY,KAAK,qBAAqB,SAAS,EAAE;MACnD,MAAM,OAAO,SAAS,gBAAgB;AACtC,UAAI,KAAK,gBAAgB,KAAK,CAC5B,WAAU,KAAK,gBAAgB;;AAInC,SAAI,WAAW,QACb,iBAAgB,KAAK;MACnB,MAAM;MACN,MAAM;MACN,aAAa;MACd,CAAC;;;;;CAYd,MAAM,kBAAkB,WAAW,qBACjC,WAAW,eACZ;AACD,MAAK,MAAM,QAAQ,iBAAiB;EAClC,MAAM,OAAO,KAAK,eAAe,CAAC,SAAS;AAC3C,MACE;GAAC;GAAiB;GAAe;GAAe;GAAgB,CAAC,SAC/D,KACD,EACD;GACA,MAAM,OAAO,KAAK,cAAc;AAChC,OAAI,KAAK,SAAS,KAAK,KAAK,0BAA0B,KAAK,GAAG,EAAE;AAC9D,iBAAa,KAAK,GAAG;AACrB,WAAO;;;;CAMb,MAAM,WAAW,WAAW,uBAAuB;AACnD,MAAK,MAAM,QAAQ,SACjB,KAAI,KAAK,YAAY,CACnB,MAAK,MAAM,QAAQ,KAAK,iBAAiB,EAAE;EACzC,MAAM,OAAO,KAAK,gBAAgB;AAClC,MAAI,QAAQ,KAAK,0BAA0B,KAAK,EAE9C;OAAI,KAAK,YAAY,kBAAkB,EAAE;AACvC,iBAAa,KAAK;AAClB,WAAO;;;;CAQjB,MAAM,eAAe,WAAW,qBAC7B,MAAM,CAAC,EAAE,gBAAgB,CAC3B;AACD,KAAI,cAAc;EAChB,MAAM,OAAO,aAAa,eAAe;AACzC,MAAI,KAAK,0BAA0B,KAAK,CACtC,cAAa,KAAK;WAElB,KAAK,eAAe,KAAK,IACzB,KAAK,0BAA0B,KAAK,eAAe,CAAC,CAEpD,cAAa,KAAK,eAAe,CAAC;;AAItC,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/status.ts"],"
|
|
1
|
+
{"version":3,"file":"status.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/status.ts"],"mappings":";;;;;;iBAagB,eAAA,CACd,eAAA,EAAiB,sBAAA,KAChB,oBAAA;;;;iBA0Ba,wBAAA,CAAyB,OAAA,EAAS,wBAAA;EAChD,KAAA;EACA,WAAA;EACA,OAAA;EACA,OAAA;EACA,QAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/implementation/types.ts"],"
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/implementation/types.ts"],"mappings":";;;;;;KASY,oBAAA;AAKZ;;;AAAA,KAAY,oBAAA;;AAKZ;;UAAiB,sBAAA;EAMa;EAJ5B,IAAA;EAEA;EAAA,IAAA,EAAM,kBAAA;EAEN;EAAA,MAAA,EAAQ,oBAAA;EAER;EAAA,MAAA;EAIA;EAFA,2BAAA;EAIW;EAFX,wBAAA;EAQe;EANf,WAAA;AAAA;;;;UAMe,wBAAA;EAQf;EANA,OAAA;EAQiB;EANjB,WAAA;EAQQ;EANR,QAAA;EAQQ;EANR,QAAA;EAYe;EAVf,eAAA,EAAiB,sBAAA;;EAEjB,MAAA,EAAQ,oBAAA;EAUR;EARA,QAAA;AAAA;;;;UAMe,gBAAA;EAce;EAZ9B,aAAA;EAY8B;EAV9B,eAAA;EAYA;EAVA,eAAA;EAYA;EAVA,aAAA;AAAA;;AAiBF;;UAXiB,eAAA;EACf,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,aAAA;EACA,SAAA;AAAA;;;;UAMe,kBAAA;;EAEf,QAAA;;EAEA,OAAA;;EAEA,aAAA;;EAEA,UAAA;;EAEA,YAAA,EAAc,kBAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-service.d.mts","names":[],"sources":["../../../src/services/import/import-service.ts"],"
|
|
1
|
+
{"version":3,"file":"import-service.d.mts","names":[],"sources":["../../../src/services/import/import-service.ts"],"mappings":";;;;;;;;;;UA+BiB,oBAAA;EAQf;EANA,KAAA;EAQS;EANT,SAAA;EAYe;EAVf,MAAA;;EAEA,WAAA;EASA;EAPA,SAAA;AAAA;;;;UAMe,mBAAA;EACf,OAAA;EACA,EAAA,GAAK,QAAA;EACL,UAAA,GAAa,gBAAA;EACb,MAAA;EACA,MAAA;AAAA;;;;UAMe,qBAAA;EACf,EAAA,EAAI,SAAA;EACJ,MAAA,EAAQ,aAAA;AAAA;;;;iBAMY,uBAAA,CACpB,MAAA,EAAQ,yBAAA,EACR,OAAA,EAAS,oBAAA,EACT,QAAA,EAAU,qBAAA,EACV,GAAA,YACC,OAAA,CAAQ,mBAAA"}
|
|
@@ -13,15 +13,15 @@ async function importFromSourceService(config, options, adapters, cwd) {
|
|
|
13
13
|
registerAllExtractors();
|
|
14
14
|
logger.info(`Scanning source code in ${rootPath}...`);
|
|
15
15
|
const extractorFs = {
|
|
16
|
-
readFile: (path
|
|
16
|
+
readFile: (path) => fs.readFile(path),
|
|
17
17
|
glob: (pattern, opts) => fs.glob({
|
|
18
18
|
pattern,
|
|
19
19
|
cwd: opts?.cwd
|
|
20
20
|
}),
|
|
21
|
-
exists: (path
|
|
21
|
+
exists: (path) => fs.exists(path)
|
|
22
22
|
};
|
|
23
23
|
const project = await detectFramework(rootPath, {
|
|
24
|
-
readFile: (path
|
|
24
|
+
readFile: (path) => fs.readFile(path),
|
|
25
25
|
glob: (pattern) => fs.glob({ pattern })
|
|
26
26
|
});
|
|
27
27
|
if (project.frameworks.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-service.mjs","names":["path"],"sources":["../../../src/services/import/import-service.ts"],"sourcesContent":["/**\n * Import service for source-extractors.\n *\n * Integrates source extraction into the workspace bundle.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type { ResolvedContractsrcConfig } from '@contractspec/lib.contracts';\nimport {\n detectFramework,\n extractFromProject,\n type ExtractOptions,\n type ImportIR,\n} from '@contractspec/lib.source-extractors';\nimport {\n type ExtractorFsAdapter,\n registerAllExtractors,\n} from '@contractspec/lib.source-extractors/extractors';\nimport {\n generateOperations,\n generateRegistry,\n generateSchemas,\n type GenerationOptions,\n type GenerationResult,\n} from '@contractspec/lib.source-extractors/codegen';\nimport { dirname, join } from 'path';\n\n/**\n * Options for the import service.\n */\nexport interface ImportServiceOptions {\n /** Limit extraction to specific paths */\n scope?: string[];\n /** Force specific framework */\n framework?: string;\n /** Dry run mode - don't write files */\n dryRun?: boolean;\n /** Analysis only - extract IR without generating code */\n analyzeOnly?: boolean;\n /** Output directory for generated contracts */\n outputDir?: string;\n}\n\n/**\n * Result of the import service.\n */\nexport interface ImportServiceResult {\n success: boolean;\n ir?: ImportIR;\n generation?: GenerationResult;\n report: string;\n errors?: string[];\n}\n\n/**\n * Adapters needed by the import service.\n */\nexport interface ImportServiceAdapters {\n fs: FsAdapter;\n logger: LoggerAdapter;\n}\n\n/**\n * Import contracts from source code.\n */\nexport async function importFromSourceService(\n config: ResolvedContractsrcConfig,\n options: ImportServiceOptions,\n adapters: ImportServiceAdapters,\n cwd?: string\n): Promise<ImportServiceResult> {\n const { fs, logger } = adapters;\n const rootPath = cwd ?? process.cwd();\n\n // Register all extractors\n registerAllExtractors();\n\n logger.info(`Scanning source code in ${rootPath}...`);\n\n // Create adapter bridge\n const extractorFs: ExtractorFsAdapter = {\n readFile: (path) => fs.readFile(path),\n glob: (pattern, opts) => fs.glob({ pattern, cwd: opts?.cwd }),\n exists: (path) => fs.exists(path),\n };\n\n // Detect frameworks\n const project = await detectFramework(rootPath, {\n readFile: (path) => fs.readFile(path),\n glob: (pattern) => fs.glob({ pattern }),\n });\n\n if (project.frameworks.length === 0) {\n logger.warn('No supported frameworks detected');\n return {\n success: false,\n report: generateNoFrameworkReport(),\n errors: ['No supported frameworks detected in project'],\n };\n }\n\n logger.info(\n `Detected frameworks: ${project.frameworks.map((f) => f.name).join(', ')}`\n );\n\n // Set up extractors with fs adapter\n const { extractorRegistry } =\n await import('@contractspec/lib.source-extractors');\n for (const extractor of extractorRegistry.getAll()) {\n if ('setFs' in extractor && typeof extractor.setFs === 'function') {\n extractor.setFs(extractorFs);\n }\n }\n\n // Extract contracts\n const extractOptions: ExtractOptions = {\n scope: options.scope,\n framework: options.framework,\n };\n\n const extractResult = await extractFromProject(project, extractOptions);\n\n if (!extractResult.success || !extractResult.ir) {\n return {\n success: false,\n report: generateErrorReport(extractResult.errors ?? []),\n errors: extractResult.errors?.map((e) => e.message),\n };\n }\n\n const ir = extractResult.ir;\n\n logger.info(\n `Extracted ${ir.endpoints.length} endpoints, ${ir.schemas.length} schemas`\n );\n\n // If analyze-only mode, just return the IR\n if (options.analyzeOnly) {\n return {\n success: true,\n ir,\n report: generateAnalysisReport(ir),\n };\n }\n\n // Generate code\n const outputDir = options.outputDir ?? join(config.outputDir, 'generated');\n const generationOptions: GenerationOptions = {\n outputDir,\n defaultAuth: 'user',\n };\n\n const operationFiles = generateOperations(ir, generationOptions);\n const schemaFiles = generateSchemas(ir, generationOptions);\n const registryFile = generateRegistry(operationFiles);\n\n const allFiles = [...operationFiles, ...schemaFiles, registryFile];\n\n // Write files if not dry-run\n if (!options.dryRun) {\n for (const file of allFiles) {\n const fullPath = join(outputDir, file.path);\n const dir = dirname(fullPath);\n\n if (!(await fs.exists(dir))) {\n await fs.mkdir(dir);\n }\n\n await fs.writeFile(fullPath, file.content);\n logger.info(`Created: ${fullPath}`);\n }\n } else {\n for (const file of allFiles) {\n logger.info(`[DRY RUN] Would create: ${join(outputDir, file.path)}`);\n }\n }\n\n const generationResult: GenerationResult = {\n files: allFiles,\n operationsGenerated: operationFiles.length,\n schemasGenerated: schemaFiles.length,\n warnings: [],\n };\n\n return {\n success: true,\n ir,\n generation: generationResult,\n report: generateSuccessReport(ir, generationResult, options),\n };\n}\n\n/**\n * Generate report when no frameworks are detected.\n */\nfunction generateNoFrameworkReport(): string {\n return `# Import Report\n\n## ❌ No Supported Frameworks Detected\n\nNo supported frameworks were detected in the project.\n\n### Supported Frameworks\n\n- NestJS\n- Express\n- Fastify\n- Hono\n- Elysia\n- tRPC\n- Next.js API Routes\n\nPlease ensure your project uses one of these frameworks and has the appropriate dependencies installed.\n`;\n}\n\n/**\n * Generate error report.\n */\nfunction generateErrorReport(errors: { message: string }[]): string {\n return `# Import Report\n\n## ❌ Extraction Failed\n\n${errors.map((e) => `- ${e.message}`).join('\\n')}\n`;\n}\n\n/**\n * Generate analysis-only report.\n */\nfunction generateAnalysisReport(ir: ImportIR): string {\n return `# Import Analysis Report\n\n## Summary\n\n- **Files Scanned**: ${ir.stats.filesScanned}\n- **Endpoints Found**: ${ir.stats.endpointsFound}\n- **Schemas Found**: ${ir.stats.schemasFound}\n- **Errors Found**: ${ir.stats.errorsFound}\n- **Events Found**: ${ir.stats.eventsFound}\n\n## Confidence Breakdown\n\n| Level | Count |\n|-------|-------|\n| High | ${ir.stats.highConfidence} |\n| Medium | ${ir.stats.mediumConfidence} |\n| Low/Ambiguous | ${ir.stats.lowConfidence} |\n\n## Detected Frameworks\n\n${ir.project.frameworks.map((f) => `- ${f.name} (${f.confidence})`).join('\\n')}\n\n## Endpoints\n\n${ir.endpoints.map((e) => `- \\`${e.method} ${e.path}\\` - ${e.confidence.level}`).join('\\n')}\n\n## Ambiguities (Require Review)\n\n${ir.ambiguities.length > 0 ? ir.ambiguities.map((a) => `- ${a.description}`).join('\\n') : 'None'}\n`;\n}\n\n/**\n * Generate success report.\n */\nfunction generateSuccessReport(\n ir: ImportIR,\n gen: GenerationResult,\n options: ImportServiceOptions\n): string {\n const mode = options.dryRun ? ' (Dry Run)' : '';\n return `# Import Report${mode}\n\n## ✅ Import Successful\n\n### Extraction Summary\n\n- **Files Scanned**: ${ir.stats.filesScanned}\n- **Endpoints Found**: ${ir.stats.endpointsFound}\n- **Schemas Found**: ${ir.stats.schemasFound}\n\n### Generation Summary\n\n- **Operations Generated**: ${gen.operationsGenerated}\n- **Schemas Generated**: ${gen.schemasGenerated}\n- **Total Files**: ${gen.files.length}\n\n### Confidence Breakdown\n\n| Level | Count |\n|-------|-------|\n| High | ${ir.stats.highConfidence} |\n| Medium | ${ir.stats.mediumConfidence} |\n| Low/Ambiguous | ${ir.stats.lowConfidence} |\n\n### Next Steps\n\n1. Review generated contracts in \\`${options.outputDir ?? 'generated/'}\\`\n2. Fill in TODO placeholders with business context\n3. Run \\`contractspec validate\\` to verify contracts\n4. Move stable contracts from \\`generated/\\` to \\`curated/\\`\n`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"import-service.mjs","names":[],"sources":["../../../src/services/import/import-service.ts"],"sourcesContent":["/**\n * Import service for source-extractors.\n *\n * Integrates source extraction into the workspace bundle.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type { ResolvedContractsrcConfig } from '@contractspec/lib.contracts';\nimport {\n detectFramework,\n extractFromProject,\n type ExtractOptions,\n type ImportIR,\n} from '@contractspec/lib.source-extractors';\nimport {\n type ExtractorFsAdapter,\n registerAllExtractors,\n} from '@contractspec/lib.source-extractors/extractors';\nimport {\n generateOperations,\n generateRegistry,\n generateSchemas,\n type GenerationOptions,\n type GenerationResult,\n} from '@contractspec/lib.source-extractors/codegen';\nimport { dirname, join } from 'path';\n\n/**\n * Options for the import service.\n */\nexport interface ImportServiceOptions {\n /** Limit extraction to specific paths */\n scope?: string[];\n /** Force specific framework */\n framework?: string;\n /** Dry run mode - don't write files */\n dryRun?: boolean;\n /** Analysis only - extract IR without generating code */\n analyzeOnly?: boolean;\n /** Output directory for generated contracts */\n outputDir?: string;\n}\n\n/**\n * Result of the import service.\n */\nexport interface ImportServiceResult {\n success: boolean;\n ir?: ImportIR;\n generation?: GenerationResult;\n report: string;\n errors?: string[];\n}\n\n/**\n * Adapters needed by the import service.\n */\nexport interface ImportServiceAdapters {\n fs: FsAdapter;\n logger: LoggerAdapter;\n}\n\n/**\n * Import contracts from source code.\n */\nexport async function importFromSourceService(\n config: ResolvedContractsrcConfig,\n options: ImportServiceOptions,\n adapters: ImportServiceAdapters,\n cwd?: string\n): Promise<ImportServiceResult> {\n const { fs, logger } = adapters;\n const rootPath = cwd ?? process.cwd();\n\n // Register all extractors\n registerAllExtractors();\n\n logger.info(`Scanning source code in ${rootPath}...`);\n\n // Create adapter bridge\n const extractorFs: ExtractorFsAdapter = {\n readFile: (path) => fs.readFile(path),\n glob: (pattern, opts) => fs.glob({ pattern, cwd: opts?.cwd }),\n exists: (path) => fs.exists(path),\n };\n\n // Detect frameworks\n const project = await detectFramework(rootPath, {\n readFile: (path) => fs.readFile(path),\n glob: (pattern) => fs.glob({ pattern }),\n });\n\n if (project.frameworks.length === 0) {\n logger.warn('No supported frameworks detected');\n return {\n success: false,\n report: generateNoFrameworkReport(),\n errors: ['No supported frameworks detected in project'],\n };\n }\n\n logger.info(\n `Detected frameworks: ${project.frameworks.map((f) => f.name).join(', ')}`\n );\n\n // Set up extractors with fs adapter\n const { extractorRegistry } =\n await import('@contractspec/lib.source-extractors');\n for (const extractor of extractorRegistry.getAll()) {\n if ('setFs' in extractor && typeof extractor.setFs === 'function') {\n extractor.setFs(extractorFs);\n }\n }\n\n // Extract contracts\n const extractOptions: ExtractOptions = {\n scope: options.scope,\n framework: options.framework,\n };\n\n const extractResult = await extractFromProject(project, extractOptions);\n\n if (!extractResult.success || !extractResult.ir) {\n return {\n success: false,\n report: generateErrorReport(extractResult.errors ?? []),\n errors: extractResult.errors?.map((e) => e.message),\n };\n }\n\n const ir = extractResult.ir;\n\n logger.info(\n `Extracted ${ir.endpoints.length} endpoints, ${ir.schemas.length} schemas`\n );\n\n // If analyze-only mode, just return the IR\n if (options.analyzeOnly) {\n return {\n success: true,\n ir,\n report: generateAnalysisReport(ir),\n };\n }\n\n // Generate code\n const outputDir = options.outputDir ?? join(config.outputDir, 'generated');\n const generationOptions: GenerationOptions = {\n outputDir,\n defaultAuth: 'user',\n };\n\n const operationFiles = generateOperations(ir, generationOptions);\n const schemaFiles = generateSchemas(ir, generationOptions);\n const registryFile = generateRegistry(operationFiles);\n\n const allFiles = [...operationFiles, ...schemaFiles, registryFile];\n\n // Write files if not dry-run\n if (!options.dryRun) {\n for (const file of allFiles) {\n const fullPath = join(outputDir, file.path);\n const dir = dirname(fullPath);\n\n if (!(await fs.exists(dir))) {\n await fs.mkdir(dir);\n }\n\n await fs.writeFile(fullPath, file.content);\n logger.info(`Created: ${fullPath}`);\n }\n } else {\n for (const file of allFiles) {\n logger.info(`[DRY RUN] Would create: ${join(outputDir, file.path)}`);\n }\n }\n\n const generationResult: GenerationResult = {\n files: allFiles,\n operationsGenerated: operationFiles.length,\n schemasGenerated: schemaFiles.length,\n warnings: [],\n };\n\n return {\n success: true,\n ir,\n generation: generationResult,\n report: generateSuccessReport(ir, generationResult, options),\n };\n}\n\n/**\n * Generate report when no frameworks are detected.\n */\nfunction generateNoFrameworkReport(): string {\n return `# Import Report\n\n## ❌ No Supported Frameworks Detected\n\nNo supported frameworks were detected in the project.\n\n### Supported Frameworks\n\n- NestJS\n- Express\n- Fastify\n- Hono\n- Elysia\n- tRPC\n- Next.js API Routes\n\nPlease ensure your project uses one of these frameworks and has the appropriate dependencies installed.\n`;\n}\n\n/**\n * Generate error report.\n */\nfunction generateErrorReport(errors: { message: string }[]): string {\n return `# Import Report\n\n## ❌ Extraction Failed\n\n${errors.map((e) => `- ${e.message}`).join('\\n')}\n`;\n}\n\n/**\n * Generate analysis-only report.\n */\nfunction generateAnalysisReport(ir: ImportIR): string {\n return `# Import Analysis Report\n\n## Summary\n\n- **Files Scanned**: ${ir.stats.filesScanned}\n- **Endpoints Found**: ${ir.stats.endpointsFound}\n- **Schemas Found**: ${ir.stats.schemasFound}\n- **Errors Found**: ${ir.stats.errorsFound}\n- **Events Found**: ${ir.stats.eventsFound}\n\n## Confidence Breakdown\n\n| Level | Count |\n|-------|-------|\n| High | ${ir.stats.highConfidence} |\n| Medium | ${ir.stats.mediumConfidence} |\n| Low/Ambiguous | ${ir.stats.lowConfidence} |\n\n## Detected Frameworks\n\n${ir.project.frameworks.map((f) => `- ${f.name} (${f.confidence})`).join('\\n')}\n\n## Endpoints\n\n${ir.endpoints.map((e) => `- \\`${e.method} ${e.path}\\` - ${e.confidence.level}`).join('\\n')}\n\n## Ambiguities (Require Review)\n\n${ir.ambiguities.length > 0 ? ir.ambiguities.map((a) => `- ${a.description}`).join('\\n') : 'None'}\n`;\n}\n\n/**\n * Generate success report.\n */\nfunction generateSuccessReport(\n ir: ImportIR,\n gen: GenerationResult,\n options: ImportServiceOptions\n): string {\n const mode = options.dryRun ? ' (Dry Run)' : '';\n return `# Import Report${mode}\n\n## ✅ Import Successful\n\n### Extraction Summary\n\n- **Files Scanned**: ${ir.stats.filesScanned}\n- **Endpoints Found**: ${ir.stats.endpointsFound}\n- **Schemas Found**: ${ir.stats.schemasFound}\n\n### Generation Summary\n\n- **Operations Generated**: ${gen.operationsGenerated}\n- **Schemas Generated**: ${gen.schemasGenerated}\n- **Total Files**: ${gen.files.length}\n\n### Confidence Breakdown\n\n| Level | Count |\n|-------|-------|\n| High | ${ir.stats.highConfidence} |\n| Medium | ${ir.stats.mediumConfidence} |\n| Low/Ambiguous | ${ir.stats.lowConfidence} |\n\n### Next Steps\n\n1. Review generated contracts in \\`${options.outputDir ?? 'generated/'}\\`\n2. Fill in TODO placeholders with business context\n3. Run \\`contractspec validate\\` to verify contracts\n4. Move stable contracts from \\`generated/\\` to \\`curated/\\`\n`;\n}\n"],"mappings":";;;;;;;;;AAkEA,eAAsB,wBACpB,QACA,SACA,UACA,KAC8B;CAC9B,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,WAAW,OAAO,QAAQ,KAAK;AAGrC,wBAAuB;AAEvB,QAAO,KAAK,2BAA2B,SAAS,KAAK;CAGrD,MAAM,cAAkC;EACtC,WAAW,SAAS,GAAG,SAAS,KAAK;EACrC,OAAO,SAAS,SAAS,GAAG,KAAK;GAAE;GAAS,KAAK,MAAM;GAAK,CAAC;EAC7D,SAAS,SAAS,GAAG,OAAO,KAAK;EAClC;CAGD,MAAM,UAAU,MAAM,gBAAgB,UAAU;EAC9C,WAAW,SAAS,GAAG,SAAS,KAAK;EACrC,OAAO,YAAY,GAAG,KAAK,EAAE,SAAS,CAAC;EACxC,CAAC;AAEF,KAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,SAAO,KAAK,mCAAmC;AAC/C,SAAO;GACL,SAAS;GACT,QAAQ,2BAA2B;GACnC,QAAQ,CAAC,8CAA8C;GACxD;;AAGH,QAAO,KACL,wBAAwB,QAAQ,WAAW,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,GACzE;CAGD,MAAM,EAAE,sBACN,MAAM,OAAO;AACf,MAAK,MAAM,aAAa,kBAAkB,QAAQ,CAChD,KAAI,WAAW,aAAa,OAAO,UAAU,UAAU,WACrD,WAAU,MAAM,YAAY;CAUhC,MAAM,gBAAgB,MAAM,mBAAmB,SALR;EACrC,OAAO,QAAQ;EACf,WAAW,QAAQ;EACpB,CAEsE;AAEvE,KAAI,CAAC,cAAc,WAAW,CAAC,cAAc,GAC3C,QAAO;EACL,SAAS;EACT,QAAQ,oBAAoB,cAAc,UAAU,EAAE,CAAC;EACvD,QAAQ,cAAc,QAAQ,KAAK,MAAM,EAAE,QAAQ;EACpD;CAGH,MAAM,KAAK,cAAc;AAEzB,QAAO,KACL,aAAa,GAAG,UAAU,OAAO,cAAc,GAAG,QAAQ,OAAO,UAClE;AAGD,KAAI,QAAQ,YACV,QAAO;EACL,SAAS;EACT;EACA,QAAQ,uBAAuB,GAAG;EACnC;CAIH,MAAM,YAAY,QAAQ,aAAa,KAAK,OAAO,WAAW,YAAY;CAC1E,MAAM,oBAAuC;EAC3C;EACA,aAAa;EACd;CAED,MAAM,iBAAiB,mBAAmB,IAAI,kBAAkB;CAChE,MAAM,cAAc,gBAAgB,IAAI,kBAAkB;CAC1D,MAAM,eAAe,iBAAiB,eAAe;CAErD,MAAM,WAAW;EAAC,GAAG;EAAgB,GAAG;EAAa;EAAa;AAGlE,KAAI,CAAC,QAAQ,OACX,MAAK,MAAM,QAAQ,UAAU;EAC3B,MAAM,WAAW,KAAK,WAAW,KAAK,KAAK;EAC3C,MAAM,MAAM,QAAQ,SAAS;AAE7B,MAAI,CAAE,MAAM,GAAG,OAAO,IAAI,CACxB,OAAM,GAAG,MAAM,IAAI;AAGrB,QAAM,GAAG,UAAU,UAAU,KAAK,QAAQ;AAC1C,SAAO,KAAK,YAAY,WAAW;;KAGrC,MAAK,MAAM,QAAQ,SACjB,QAAO,KAAK,2BAA2B,KAAK,WAAW,KAAK,KAAK,GAAG;CAIxE,MAAM,mBAAqC;EACzC,OAAO;EACP,qBAAqB,eAAe;EACpC,kBAAkB,YAAY;EAC9B,UAAU,EAAE;EACb;AAED,QAAO;EACL,SAAS;EACT;EACA,YAAY;EACZ,QAAQ,sBAAsB,IAAI,kBAAkB,QAAQ;EAC7D;;;;;AAMH,SAAS,4BAAoC;AAC3C,QAAO;;;;;;;;;;;;;;;;;;;;;;AAuBT,SAAS,oBAAoB,QAAuC;AAClE,QAAO;;;;EAIP,OAAO,KAAK,MAAM,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,CAAC;;;;;;AAOjD,SAAS,uBAAuB,IAAsB;AACpD,QAAO;;;;uBAIc,GAAG,MAAM,aAAa;yBACpB,GAAG,MAAM,eAAe;uBAC1B,GAAG,MAAM,aAAa;sBACvB,GAAG,MAAM,YAAY;sBACrB,GAAG,MAAM,YAAY;;;;;;WAMhC,GAAG,MAAM,eAAe;aACtB,GAAG,MAAM,iBAAiB;oBACnB,GAAG,MAAM,cAAc;;;;EAIzC,GAAG,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,CAAC,KAAK,KAAK,CAAC;;;;EAI7E,GAAG,UAAU,KAAK,MAAM,OAAO,EAAE,OAAO,GAAG,EAAE,KAAK,OAAO,EAAE,WAAW,QAAQ,CAAC,KAAK,KAAK,CAAC;;;;EAI1F,GAAG,YAAY,SAAS,IAAI,GAAG,YAAY,KAAK,MAAM,KAAK,EAAE,cAAc,CAAC,KAAK,KAAK,GAAG,OAAO;;;;;;AAOlG,SAAS,sBACP,IACA,KACA,SACQ;AAER,QAAO,kBADM,QAAQ,SAAS,eAAe,GACf;;;;;;uBAMT,GAAG,MAAM,aAAa;yBACpB,GAAG,MAAM,eAAe;uBAC1B,GAAG,MAAM,aAAa;;;;8BAIf,IAAI,oBAAoB;2BAC3B,IAAI,iBAAiB;qBAC3B,IAAI,MAAM,OAAO;;;;;;WAM3B,GAAG,MAAM,eAAe;aACtB,GAAG,MAAM,iBAAiB;oBACnB,GAAG,MAAM,cAAc;;;;qCAIN,QAAQ,aAAa,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-service.d.mts","names":[],"sources":["../../../src/services/import/report-service.ts"],"
|
|
1
|
+
{"version":3,"file":"report-service.d.mts","names":[],"sources":["../../../src/services/import/report-service.ts"],"mappings":";;;;;;;UAYiB,aAAA;EAQf;EANA,gBAAA;EAQY;EANZ,cAAA;EAYc;EAVd,aAAA;;EAEA,kBAAA;EAUe;EARf,YAAA;AAAA;;;;iBAMc,sBAAA,CACd,EAAA,EAAI,QAAA,EACJ,YAAA,GAAe,YAAA,EACf,OAAA,GAAS,aAAA;;;;iBAqIK,iBAAA,CACd,EAAA,EAAI,QAAA,EACJ,YAAA,GAAe,YAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-service.d.mts","names":[],"sources":["../../../src/services/import/verify-service.ts"],"
|
|
1
|
+
{"version":3,"file":"verify-service.d.mts","names":[],"sources":["../../../src/services/import/verify-service.ts"],"mappings":";;;;;;;;UAiBiB,oBAAA;EACf,QAAA,EAAU,iBAAA;EACV,MAAA;EACA,MAAA,EAAQ,iBAAA;AAAA;AAMV;;;AAAA,UAAiB,iBAAA;EACf,IAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;AAAA;;AAMF;;UAAiB,aAAA;EAAa;EAE5B,eAAA;EAEA;EAAA,cAAA;EAIA;EAFA,eAAA;EAIiB;EAFjB,eAAA;EAQe;EANf,iBAAA;AAAA;;;;UAMe,YAAA;EACf,KAAA;EACA,eAAA,EAAiB,oBAAA;EACjB,WAAA,EAAa,SAAA;EACb,OAAA;IACE,cAAA;IACA,cAAA;IACA,gBAAA;IACA,cAAA;IACA,WAAA;EAAA;AAAA;;;;UAOa,qBAAA;EACf,EAAA,EAAI,SAAA;EACJ,MAAA,EAAQ,aAAA;AAAA;;;AAMV;iBAAsB,uBAAA,CACpB,EAAA,EAAI,QAAA,EACJ,OAAA,EAAS,aAAA,EACT,QAAA,EAAU,qBAAA,GACT,OAAA,CAAQ,YAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity-diagram.d.mts","names":[],"sources":["../../src/services/integrity-diagram.ts"],"
|
|
1
|
+
{"version":3,"file":"integrity-diagram.d.mts","names":[],"sources":["../../src/services/integrity-diagram.ts"],"mappings":";;;;;;KAeY,WAAA;;;;UAKK,cAAA;EAmBN;AAMX;;EArBE,QAAA;EAsBQ;;;EAjBR,WAAA;EAmB4B;;;EAd5B,YAAA;EAaA;;;EARA,SAAA;AAAA;;;;iBAMc,sBAAA,CACd,MAAA,EAAQ,uBAAA,EACR,IAAA,GAAM,WAAA,EACN,OAAA,GAAS,cAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity.d.mts","names":[],"sources":["../../src/services/integrity.ts"],"
|
|
1
|
+
{"version":3,"file":"integrity.d.mts","names":[],"sources":["../../src/services/integrity.ts"],"mappings":";;;;;;;;;UA4BiB,wBAAA;EA4Bf;;;EAxBA,OAAA;EA8Be;;;EA1Bf,GAAA;EA2BA;;;EAtBA,GAAA;EAyBM;;;EApBN,UAAA;EAyBA;;;EApBA,QAAA,GAAW,gBAAA;EAoBmC;AAMhD;;EArBE,eAAA,GAAkB,gBAAA;AAAA;;;;UAMH,YAAA;EACf,GAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA,EAAM,gBAAA;EACN,SAAA;EAgBuB;EAdvB,UAAA,GAAa,mBAAA;EAeM;EAbnB,YAAA;IAAiB,UAAA;IAAqB,QAAA;EAAA;AAAA;;;;UAMvB,aAAA;EACf,UAAA,EAAY,GAAA,SAAY,YAAA;EACxB,MAAA,EAAQ,GAAA,SAAY,YAAA;EACpB,aAAA,EAAe,GAAA,SAAY,YAAA;EAC3B,YAAA,EAAc,GAAA,SAAY,YAAA;EAC1B,SAAA,EAAW,GAAA,SAAY,YAAA;EACvB,SAAA,EAAW,GAAA,SAAY,YAAA;EACvB,KAAA,EAAO,GAAA,SAAY,YAAA;EACnB,UAAA,EAAY,GAAA,SAAY,YAAA;EACxB,WAAA,EAAa,GAAA,SAAY,YAAA;EACzB,YAAA,EAAc,GAAA,SAAY,YAAA;EAC1B,SAAA,EAAW,GAAA,SAAY,YAAA;EACvB,SAAA,EAAW,GAAA,SAAY,YAAA;EACvB,UAAA,EAAY,GAAA,SAAY,YAAA;EACxB,QAAA,EAAU,GAAA,SAAY,YAAA;EACtB,SAAA,EAAW,GAAA,SAAY,YAAA;AAAA;;;;UAMR,cAAA;EACf,QAAA;EACA,IAAA;EAOA,OAAA;EACA,IAAA;EACA,OAAA;EACA,QAAA,GAAW,gBAAA;EACX,GAAA,GAAM,OAAA;EACN,UAAA;AAAA;;;;UAMe,cAAA;EACf,KAAA;EACA,OAAA;EACA,QAAA;EACA,WAAA;AAAA;;;;UAMe,uBAAA;EAxCQ;;;EA4CvB,SAAA,EAAW,aAAA;EA1CX;;;EA+CA,QAAA,EAAU,iBAAA;EA9CA;;;EAmDV,QAAA;IACE,KAAA;IACA,eAAA;IACA,QAAA;IACA,WAAA;IACA,MAAA,EAAQ,MAAA,SAAe,cAAA;EAAA;EApCZ;;;EA0Cb,MAAA,EAAQ,cAAA;EA7CR;;;EAkDA,aAAA,EAAe,YAAA;EA/Cf;;;EAoDA,OAAA;AAAA;AA7CF;;;AAAA,iBA6GsB,gBAAA,CACpB,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,GACnC,OAAA,GAAS,wBAAA,GACR,OAAA,CAAQ,uBAAA;;;;iBAiYK,WAAA,CAAY,SAAA,EAAW,aAAA,GAAgB,YAAA;;;;iBAevC,kBAAA,CACd,MAAA,EAAQ,cAAA,IACR,IAAA,EAAM,cAAA,WACL,cAAA;;;;iBAOa,sBAAA,CACd,MAAA,EAAQ,cAAA,IACR,QAAA,EAAU,cAAA,eACT,cAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer-discovery.d.mts","names":[],"sources":["../../src/services/layer-discovery.ts"],"
|
|
1
|
+
{"version":3,"file":"layer-discovery.d.mts","names":[],"sources":["../../src/services/layer-discovery.ts"],"mappings":";;;;;;;;UA0BiB,aAAA;EACf,GAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;AAAA;;;;UAMe,cAAA;EAQG;EANlB,QAAA,EAAU,GAAA,SAAY,iBAAA;EAMD;EAJrB,QAAA,EAAU,GAAA,SAAY,iBAAA;EAFZ;EAIV,UAAA,EAAY,GAAA,SAAY,cAAA;EAFxB;EAIA,gBAAA,EAAkB,GAAA,SAAY,mBAAA;AAAA;;;;UAMf,mBAAA;EACf,IAAA;EACA,MAAA,EAAQ,MAAA;EACR,KAAA;EACA,MAAA;AAAA;;;;UAMe,qBAAA;EARf;EAUA,OAAA;EATA;EAWA,GAAA;AAAA;;AAJF;;UAUiB,oBAAA;EACf,SAAA,EAAW,cAAA;EACX,KAAA;IACE,QAAA;IACA,QAAA;IACA,UAAA;IACA,gBAAA;IACA,KAAA;EAAA;AAAA;;;;iBAOY,yBAAA,CAAA,GAA6B,cAAA;;;;iBAYvB,cAAA,CACpB,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,GACnC,OAAA,GAAS,qBAAA,GACR,OAAA,CAAQ,oBAAA;;AAHX;;iBAuGgB,oBAAA,CACd,SAAA,EAAW,cAAA,GACV,aAAA"}
|
package/dist/services/list.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.mts","names":[],"sources":["../../src/services/list.ts"],"
|
|
1
|
+
{"version":3,"file":"list.d.mts","names":[],"sources":["../../src/services/list.ts"],"mappings":";;;;;;;;;UAiBiB,gBAAA;EASf;;;EALA,OAAA;EAUkC;;AAMpC;EAXE,IAAA,GAAO,UAAA;;;;EAKP,MAAA,GAAS,yBAAA;AAAA;;;;iBAMW,SAAA,CACpB,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,IAAA,UAAc,cAAA;AAAA,GACzC,OAAA,GAAS,gBAAA,GACR,OAAA,CAAQ,cAAA;;;;iBA8DK,gBAAA,CACd,KAAA,EAAO,cAAA,KACN,GAAA,SAAY,cAAA"}
|
|
@@ -3,7 +3,6 @@ import { VerificationIssue, formatVerificationReport, verifyImplementationAgains
|
|
|
3
3
|
import { AgentType, ParsedSpec } from "@contractspec/module.workspace";
|
|
4
4
|
|
|
5
5
|
//#region src/services/llm/index.d.ts
|
|
6
|
-
|
|
7
6
|
/**
|
|
8
7
|
* Generate full markdown context for a feature, including referenced specs.
|
|
9
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/llm/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/llm/index.ts"],"mappings":";;;;;;;;iBAqBsB,8BAAA,CACpB,OAAA,EAAS,UAAA,EACT,QAAA;EAAY,EAAA,EAAI,SAAA;AAAA,IACf,OAAA;;;;;iBAwEa,2BAAA,CACd,IAAA,EAAM,UAAA,EACN,KAAA,EAAO,SAAA;;AAFT;;iBAiIgB,iCAAA,CAAkC,IAAA,EAAM,UAAA;;;;iBAqCxC,gBAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,qDACA,KAAA,GAAO,SAAA"}
|
|
@@ -177,7 +177,6 @@ function exportSpecForLLM(spec, format, agent = "generic-mcp") {
|
|
|
177
177
|
case "rules": return generateCursorRulesFromParsedSpec(spec);
|
|
178
178
|
case "prompt": return specToMarkdown(spec, "prompt");
|
|
179
179
|
case "context": return specToMarkdown(spec, "context");
|
|
180
|
-
case "full":
|
|
181
180
|
default: return specToMarkdown(spec, "full");
|
|
182
181
|
}
|
|
183
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/llm/index.ts"],"sourcesContent":["/**\n * LLM Service\n *\n * Provides services for generating LLM-friendly content from specs.\n * Primarily used by VSCode and CLI for \"Ask AI\" features.\n */\n\nimport {\n type AgentType,\n loadSpecFromSource,\n type ParsedSpec,\n specToMarkdown,\n} from '@contractspec/module.workspace';\nimport { listSpecs } from '../list';\nimport type { FsAdapter } from '../../ports/fs';\n\nexport * from './verify-static';\n\n/**\n * Generate full markdown context for a feature, including referenced specs.\n */\nexport async function generateFeatureContextMarkdown(\n feature: ParsedSpec,\n adapters: { fs: FsAdapter }\n): Promise<string> {\n const parts: string[] = [];\n\n // 1. Render feature header/context\n parts.push(specToMarkdown(feature, 'context'));\n\n // 2. Find all referenced specs\n // We need to scan the workspace to find them\n // Optimization: In a real app we might have a pre-built index\n const allSpecs = await listSpecs(adapters);\n\n // Helper to find and load a spec\n const loadChild = async (ref: { name: string; version: string }) => {\n const found = allSpecs.find(\n (s) => s.key === ref.name && s.version === ref.version\n );\n if (!found) return null;\n\n // Load full parsed spec\n const specs = await loadSpecFromSource(found.filePath);\n return specs.find((s) => s.meta.key === ref.name) ?? null;\n };\n\n // 3. Render operations\n if (feature.operations?.length) {\n parts.push(`\\n## Operations (${feature.operations.length})\\n`);\n for (const op of feature.operations) {\n const child = await loadChild(op);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${op.name} (v${op.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n // 4. Render events\n if (feature.events?.length) {\n parts.push(`\\n## Events (${feature.events.length})\\n`);\n for (const ev of feature.events) {\n const child = await loadChild(ev);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${ev.name} (v${ev.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n // 5. Render presentations\n if (feature.presentations?.length) {\n parts.push(`\\n## Presentations (${feature.presentations.length})\\n`);\n for (const pres of feature.presentations) {\n const child = await loadChild(pres);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${pres.name} (v${pres.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Generate an implementation guide for a parsed spec.\n * This logic was extracted from VSCode extension.\n */\nexport function generateGuideFromParsedSpec(\n spec: ParsedSpec,\n agent: AgentType\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Implementation Guide: ${spec.meta.key}`);\n lines.push('');\n lines.push(`**Target Agent**: ${agent}`);\n lines.push(\n `**Spec Type**: ${spec.specType}${spec.kind ? ` (${spec.kind})` : ''}`\n );\n lines.push('');\n\n // Description\n if (spec.meta.description) {\n lines.push('## Overview');\n lines.push('');\n lines.push(spec.meta.description);\n lines.push('');\n }\n\n // Goal and Context\n if (spec.meta.goal) {\n lines.push('## Goal');\n lines.push('');\n lines.push(spec.meta.goal);\n lines.push('');\n }\n\n if (spec.meta.context) {\n lines.push('## Context');\n lines.push('');\n lines.push(spec.meta.context);\n lines.push('');\n }\n\n // Implementation Steps\n lines.push('## Implementation Steps');\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push(`1. Create the ${spec.kind ?? 'operation'} handler function`);\n if (spec.hasIo) {\n lines.push('2. Implement input validation according to the schema');\n lines.push('3. Implement the core business logic');\n lines.push('4. Return output matching the expected schema');\n }\n if (spec.hasPolicy) {\n lines.push('5. Enforce authorization and policies');\n }\n if (spec.emittedEvents && spec.emittedEvents.length > 0) {\n lines.push('6. Emit events on success:');\n for (const ev of spec.emittedEvents) {\n lines.push(` - \\`${ev.name}\\` (v${ev.version})`);\n }\n }\n lines.push('7. Add error handling for expected failure cases');\n lines.push('8. Write tests covering success and error scenarios');\n } else if (spec.specType === 'feature') {\n lines.push('1. Set up the feature module structure');\n if (spec.operations && spec.operations.length > 0) {\n lines.push('2. Implement operations:');\n for (const op of spec.operations) {\n lines.push(` - \\`${op.name}\\` (v${op.version})`);\n }\n }\n if (spec.presentations && spec.presentations.length > 0) {\n lines.push('3. Implement presentations:');\n for (const pres of spec.presentations) {\n lines.push(` - \\`${pres.name}\\` (v${pres.version})`);\n }\n }\n lines.push('4. Wire up feature exports');\n lines.push('5. Add integration tests');\n } else {\n lines.push('1. Review the spec requirements');\n lines.push('2. Implement the core logic');\n lines.push('3. Add tests');\n lines.push('4. Document the implementation');\n }\n\n lines.push('');\n\n // Constraints\n lines.push('## Constraints');\n lines.push('');\n lines.push(`- Stability: ${spec.meta.stability ?? 'experimental'}`);\n if (spec.meta.owners && spec.meta.owners.length > 0) {\n lines.push(`- Owners: ${spec.meta.owners.join(', ')}`);\n }\n if (spec.meta.tags && spec.meta.tags.length > 0) {\n lines.push(`- Tags: ${spec.meta.tags.join(', ')}`);\n }\n lines.push('');\n\n // Agent-specific notes\n if (agent === 'cursor-cli') {\n lines.push('## Cursor Notes');\n lines.push('');\n lines.push('- Use Composer mode for multi-file changes');\n lines.push('- Reference this guide in your cursor rules');\n lines.push('- Break implementation into small, focused commits');\n } else if (agent === 'claude-code') {\n lines.push('## Claude Code Notes');\n lines.push('');\n lines.push('- Use extended thinking for complex logic');\n lines.push('- Ask for clarification on ambiguous requirements');\n lines.push('- Provide step-by-step reasoning');\n } else if (agent === 'generic-mcp') {\n lines.push('## General Notes');\n lines.push('');\n lines.push('- Use inline comments to guide generation');\n lines.push('- Review generated code carefully');\n }\n\n // Append context formatted spec\n lines.push('');\n lines.push('## Spec Definition');\n lines.push('');\n lines.push(specToMarkdown(spec, 'full'));\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Cursor rules from parsed spec.\n */\nexport function generateCursorRulesFromParsedSpec(spec: ParsedSpec): string {\n const lines: string[] = [];\n\n lines.push(`# ${spec.meta.key}`);\n lines.push('');\n lines.push(`Description: ${spec.meta.description ?? 'No description'}`);\n lines.push('');\n lines.push('## Rules');\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push(`- This is a ${spec.kind ?? 'operation'} spec`);\n if (spec.hasIo) {\n lines.push('- Validate input and output against schemas');\n }\n if (spec.hasPolicy) {\n lines.push('- Enforce authorization policies');\n }\n if (spec.emittedEvents && spec.emittedEvents.length > 0) {\n lines.push('- Emit documented events');\n }\n } else if (spec.specType === 'feature') {\n lines.push('- Implement all operations and presentations');\n lines.push('- Follow modular architecture');\n } else {\n lines.push(`- Follow ${spec.specType} patterns`);\n }\n\n lines.push('- Follow project code quality standards');\n lines.push('- Write tests for new functionality');\n\n return lines.join('\\n');\n}\n\n/**\n * Export spec to clipboard format suitable for pasting into LLM.\n */\nexport function exportSpecForLLM(\n spec: ParsedSpec,\n format: 'guide' | 'rules' | 'prompt' | 'context' | 'full',\n agent: AgentType = 'generic-mcp'\n): string {\n switch (format) {\n case 'guide':\n return generateGuideFromParsedSpec(spec, agent);\n case 'rules':\n return generateCursorRulesFromParsedSpec(spec);\n case 'prompt':\n return specToMarkdown(spec, 'prompt');\n case 'context':\n return specToMarkdown(spec, 'context');\n case 'full':\n default:\n return specToMarkdown(spec, 'full');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/llm/index.ts"],"sourcesContent":["/**\n * LLM Service\n *\n * Provides services for generating LLM-friendly content from specs.\n * Primarily used by VSCode and CLI for \"Ask AI\" features.\n */\n\nimport {\n type AgentType,\n loadSpecFromSource,\n type ParsedSpec,\n specToMarkdown,\n} from '@contractspec/module.workspace';\nimport { listSpecs } from '../list';\nimport type { FsAdapter } from '../../ports/fs';\n\nexport * from './verify-static';\n\n/**\n * Generate full markdown context for a feature, including referenced specs.\n */\nexport async function generateFeatureContextMarkdown(\n feature: ParsedSpec,\n adapters: { fs: FsAdapter }\n): Promise<string> {\n const parts: string[] = [];\n\n // 1. Render feature header/context\n parts.push(specToMarkdown(feature, 'context'));\n\n // 2. Find all referenced specs\n // We need to scan the workspace to find them\n // Optimization: In a real app we might have a pre-built index\n const allSpecs = await listSpecs(adapters);\n\n // Helper to find and load a spec\n const loadChild = async (ref: { name: string; version: string }) => {\n const found = allSpecs.find(\n (s) => s.key === ref.name && s.version === ref.version\n );\n if (!found) return null;\n\n // Load full parsed spec\n const specs = await loadSpecFromSource(found.filePath);\n return specs.find((s) => s.meta.key === ref.name) ?? null;\n };\n\n // 3. Render operations\n if (feature.operations?.length) {\n parts.push(`\\n## Operations (${feature.operations.length})\\n`);\n for (const op of feature.operations) {\n const child = await loadChild(op);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${op.name} (v${op.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n // 4. Render events\n if (feature.events?.length) {\n parts.push(`\\n## Events (${feature.events.length})\\n`);\n for (const ev of feature.events) {\n const child = await loadChild(ev);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${ev.name} (v${ev.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n // 5. Render presentations\n if (feature.presentations?.length) {\n parts.push(`\\n## Presentations (${feature.presentations.length})\\n`);\n for (const pres of feature.presentations) {\n const child = await loadChild(pres);\n if (child) {\n parts.push(specToMarkdown(child, 'full'));\n } else {\n parts.push(`### ${pres.name} (v${pres.version})\\n\\n*Spec not found*`);\n }\n parts.push('---');\n }\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Generate an implementation guide for a parsed spec.\n * This logic was extracted from VSCode extension.\n */\nexport function generateGuideFromParsedSpec(\n spec: ParsedSpec,\n agent: AgentType\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Implementation Guide: ${spec.meta.key}`);\n lines.push('');\n lines.push(`**Target Agent**: ${agent}`);\n lines.push(\n `**Spec Type**: ${spec.specType}${spec.kind ? ` (${spec.kind})` : ''}`\n );\n lines.push('');\n\n // Description\n if (spec.meta.description) {\n lines.push('## Overview');\n lines.push('');\n lines.push(spec.meta.description);\n lines.push('');\n }\n\n // Goal and Context\n if (spec.meta.goal) {\n lines.push('## Goal');\n lines.push('');\n lines.push(spec.meta.goal);\n lines.push('');\n }\n\n if (spec.meta.context) {\n lines.push('## Context');\n lines.push('');\n lines.push(spec.meta.context);\n lines.push('');\n }\n\n // Implementation Steps\n lines.push('## Implementation Steps');\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push(`1. Create the ${spec.kind ?? 'operation'} handler function`);\n if (spec.hasIo) {\n lines.push('2. Implement input validation according to the schema');\n lines.push('3. Implement the core business logic');\n lines.push('4. Return output matching the expected schema');\n }\n if (spec.hasPolicy) {\n lines.push('5. Enforce authorization and policies');\n }\n if (spec.emittedEvents && spec.emittedEvents.length > 0) {\n lines.push('6. Emit events on success:');\n for (const ev of spec.emittedEvents) {\n lines.push(` - \\`${ev.name}\\` (v${ev.version})`);\n }\n }\n lines.push('7. Add error handling for expected failure cases');\n lines.push('8. Write tests covering success and error scenarios');\n } else if (spec.specType === 'feature') {\n lines.push('1. Set up the feature module structure');\n if (spec.operations && spec.operations.length > 0) {\n lines.push('2. Implement operations:');\n for (const op of spec.operations) {\n lines.push(` - \\`${op.name}\\` (v${op.version})`);\n }\n }\n if (spec.presentations && spec.presentations.length > 0) {\n lines.push('3. Implement presentations:');\n for (const pres of spec.presentations) {\n lines.push(` - \\`${pres.name}\\` (v${pres.version})`);\n }\n }\n lines.push('4. Wire up feature exports');\n lines.push('5. Add integration tests');\n } else {\n lines.push('1. Review the spec requirements');\n lines.push('2. Implement the core logic');\n lines.push('3. Add tests');\n lines.push('4. Document the implementation');\n }\n\n lines.push('');\n\n // Constraints\n lines.push('## Constraints');\n lines.push('');\n lines.push(`- Stability: ${spec.meta.stability ?? 'experimental'}`);\n if (spec.meta.owners && spec.meta.owners.length > 0) {\n lines.push(`- Owners: ${spec.meta.owners.join(', ')}`);\n }\n if (spec.meta.tags && spec.meta.tags.length > 0) {\n lines.push(`- Tags: ${spec.meta.tags.join(', ')}`);\n }\n lines.push('');\n\n // Agent-specific notes\n if (agent === 'cursor-cli') {\n lines.push('## Cursor Notes');\n lines.push('');\n lines.push('- Use Composer mode for multi-file changes');\n lines.push('- Reference this guide in your cursor rules');\n lines.push('- Break implementation into small, focused commits');\n } else if (agent === 'claude-code') {\n lines.push('## Claude Code Notes');\n lines.push('');\n lines.push('- Use extended thinking for complex logic');\n lines.push('- Ask for clarification on ambiguous requirements');\n lines.push('- Provide step-by-step reasoning');\n } else if (agent === 'generic-mcp') {\n lines.push('## General Notes');\n lines.push('');\n lines.push('- Use inline comments to guide generation');\n lines.push('- Review generated code carefully');\n }\n\n // Append context formatted spec\n lines.push('');\n lines.push('## Spec Definition');\n lines.push('');\n lines.push(specToMarkdown(spec, 'full'));\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Cursor rules from parsed spec.\n */\nexport function generateCursorRulesFromParsedSpec(spec: ParsedSpec): string {\n const lines: string[] = [];\n\n lines.push(`# ${spec.meta.key}`);\n lines.push('');\n lines.push(`Description: ${spec.meta.description ?? 'No description'}`);\n lines.push('');\n lines.push('## Rules');\n lines.push('');\n\n if (spec.specType === 'operation') {\n lines.push(`- This is a ${spec.kind ?? 'operation'} spec`);\n if (spec.hasIo) {\n lines.push('- Validate input and output against schemas');\n }\n if (spec.hasPolicy) {\n lines.push('- Enforce authorization policies');\n }\n if (spec.emittedEvents && spec.emittedEvents.length > 0) {\n lines.push('- Emit documented events');\n }\n } else if (spec.specType === 'feature') {\n lines.push('- Implement all operations and presentations');\n lines.push('- Follow modular architecture');\n } else {\n lines.push(`- Follow ${spec.specType} patterns`);\n }\n\n lines.push('- Follow project code quality standards');\n lines.push('- Write tests for new functionality');\n\n return lines.join('\\n');\n}\n\n/**\n * Export spec to clipboard format suitable for pasting into LLM.\n */\nexport function exportSpecForLLM(\n spec: ParsedSpec,\n format: 'guide' | 'rules' | 'prompt' | 'context' | 'full',\n agent: AgentType = 'generic-mcp'\n): string {\n switch (format) {\n case 'guide':\n return generateGuideFromParsedSpec(spec, agent);\n case 'rules':\n return generateCursorRulesFromParsedSpec(spec);\n case 'prompt':\n return specToMarkdown(spec, 'prompt');\n case 'context':\n return specToMarkdown(spec, 'context');\n case 'full':\n default:\n return specToMarkdown(spec, 'full');\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-static.d.mts","names":[],"sources":["../../../src/services/llm/verify-static.ts"],"
|
|
1
|
+
{"version":3,"file":"verify-static.d.mts","names":[],"sources":["../../../src/services/llm/verify-static.ts"],"mappings":";;;;;;;UAaiB,mBAAA;EACf,QAAA;EACA,OAAA;EACA,QAAA;EACA,IAAA;AAAA;;;;;iBAOc,qCAAA,CACd,IAAA,EAAM,UAAA,EACN,kBAAA,UACA,KAAA,EAAO,gBAAA,KACN,mBAAA;;;;iBA6Ea,wBAAA,CACd,IAAA,EAAM,UAAA,EACN,MAAA,EAAQ,mBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-service.d.mts","names":[],"sources":["../../../src/services/openapi/export-service.ts"],"
|
|
1
|
+
{"version":3,"file":"export-service.d.mts","names":[],"sources":["../../../src/services/openapi/export-service.ts"],"mappings":";;;;;;;;UAgBiB,oBAAA;EASf;;;EALA,YAAA;EAyBA;;;EApBA,UAAA;EA0Be;;;EArBf,KAAA;EAsBA;;;EAjBA,OAAA;EAmBI;;AAeN;EA7BE,WAAA;;;;EAKA,OAAA,GAAU,aAAA;AAAA;;;;UAMK,mBAAA;EACf,QAAA,EAAU,eAAA;EACV,UAAA;EACA,IAAA;AAAA;;;;iBAeoB,aAAA,CACpB,OAAA,EAAS,oBAAA,EACT,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,IAClC,OAAA,CAAQ,mBAAA"}
|
|
@@ -4,7 +4,6 @@ import { OpenApiImportServiceOptions, OpenApiImportServiceResult } from "./types
|
|
|
4
4
|
import { ResolvedContractsrcConfig } from "@contractspec/lib.contracts";
|
|
5
5
|
|
|
6
6
|
//#region src/services/openapi/import-service.d.ts
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* Import ContractSpec specs from an OpenAPI document.
|
|
10
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-service.d.mts","names":[],"sources":["../../../src/services/openapi/import-service.ts"],"
|
|
1
|
+
{"version":3,"file":"import-service.d.mts","names":[],"sources":["../../../src/services/openapi/import-service.ts"],"mappings":";;;;;;;;;iBAqDsB,wBAAA,CACpB,mBAAA,EAAqB,yBAAA,EACrB,OAAA,EAAS,2BAAA,EACT,QAAA;EAAY,EAAA,EAAI,SAAA;EAAW,MAAA,EAAQ,aAAA;AAAA,IAClC,OAAA,CAAQ,0BAAA"}
|
|
@@ -28,7 +28,7 @@ async function importFromOpenApiService(contractspecOptions, options, adapters)
|
|
|
28
28
|
logger.info(`Importing from OpenAPI: ${source}`);
|
|
29
29
|
const parseResult = await parseOpenApi(source, {
|
|
30
30
|
fetch: globalThis.fetch,
|
|
31
|
-
readFile: (path
|
|
31
|
+
readFile: (path) => fs.readFile(path)
|
|
32
32
|
});
|
|
33
33
|
if (parseResult.warnings.length > 0) for (const warning of parseResult.warnings) logger.warn(`Parse warning: ${warning}`);
|
|
34
34
|
logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title} v${parseResult.info.version}`);
|