@contractspec/bundle.workspace 1.44.1 → 1.45.1
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/README.md +5 -1
- package/dist/_virtual/rolldown_runtime.js +1 -19
- package/dist/ai/agents/cursor-agent.js +4 -4
- package/dist/ai/agents/cursor-agent.js.map +1 -1
- package/dist/ai/client.d.ts +14 -0
- package/dist/ai/client.d.ts.map +1 -1
- package/dist/ai/client.js +27 -1
- package/dist/ai/client.js.map +1 -1
- package/dist/ai/index.d.ts +1 -9
- package/dist/ai/index.js +1 -20
- package/dist/ai/prompts/index.js +1 -1
- package/dist/index.d.ts +42 -19
- package/dist/index.js +39 -150
- package/dist/services/agent-guide/agent-guide-service.js +3 -3
- package/dist/services/agent-guide/agent-guide-service.js.map +1 -1
- package/dist/services/ci-check/ci-check-service.d.ts.map +1 -1
- package/dist/services/ci-check/ci-check-service.js +69 -2
- package/dist/services/ci-check/ci-check-service.js.map +1 -1
- package/dist/services/ci-check/types.d.ts +1 -1
- package/dist/services/ci-check/types.d.ts.map +1 -1
- package/dist/services/ci-check/types.js +4 -2
- package/dist/services/ci-check/types.js.map +1 -1
- package/dist/services/config.d.ts +1 -11
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +2 -16
- package/dist/services/config.js.map +1 -1
- package/dist/services/create/ai-generator.d.ts +84 -0
- package/dist/services/create/ai-generator.d.ts.map +1 -0
- package/dist/services/create/ai-generator.js +178 -0
- package/dist/services/create/ai-generator.js.map +1 -0
- package/dist/services/create/index.d.ts +27 -0
- package/dist/services/create/index.d.ts.map +1 -0
- package/dist/services/create/index.js +36 -0
- package/dist/services/create/index.js.map +1 -0
- package/dist/services/create/templates.d.ts +21 -0
- package/dist/services/create/templates.d.ts.map +1 -0
- package/dist/services/create/templates.js +37 -0
- package/dist/services/create/templates.js.map +1 -0
- package/dist/services/docs/docs-service.d.ts +19 -0
- package/dist/services/docs/docs-service.d.ts.map +1 -0
- package/dist/services/docs/docs-service.js +41 -0
- package/dist/services/docs/docs-service.js.map +1 -0
- package/dist/services/docs/index.d.ts +1 -0
- package/dist/services/docs/index.js +1 -0
- package/dist/services/doctor/checks/cli.js +3 -3
- package/dist/services/doctor/checks/cli.js.map +1 -1
- package/dist/services/doctor/checks/index.js +1 -0
- package/dist/services/doctor/checks/layers.js +139 -0
- package/dist/services/doctor/checks/layers.js.map +1 -0
- package/dist/services/doctor/doctor-service.d.ts.map +1 -1
- package/dist/services/doctor/doctor-service.js +2 -0
- package/dist/services/doctor/doctor-service.js.map +1 -1
- package/dist/services/doctor/types.d.ts +1 -1
- package/dist/services/doctor/types.d.ts.map +1 -1
- package/dist/services/doctor/types.js +4 -2
- package/dist/services/doctor/types.js.map +1 -1
- package/dist/services/formatter.d.ts +15 -0
- package/dist/services/formatter.d.ts.map +1 -0
- package/dist/services/formatter.js +26 -0
- package/dist/services/formatter.js.map +1 -0
- package/dist/services/impact/formatters.d.ts +5 -5
- package/dist/services/impact/formatters.d.ts.map +1 -1
- package/dist/services/impact/formatters.js.map +1 -1
- package/dist/services/impact/impact-detection-service.js +6 -6
- package/dist/services/impact/impact-detection-service.js.map +1 -1
- package/dist/services/impact/types.d.ts +3 -3
- package/dist/services/implementation/resolver.js +1 -1
- package/dist/services/implementation/resolver.js.map +1 -1
- package/dist/services/implementation/types.d.ts +1 -1
- package/dist/services/index.d.ts +31 -5
- package/dist/services/index.js +30 -4
- package/dist/services/integrity-diagram.js +1 -1
- package/dist/services/integrity-diagram.js.map +1 -1
- package/dist/services/integrity.d.ts +1 -1
- package/dist/services/integrity.js.map +1 -1
- package/dist/services/layer-discovery.d.ts +77 -0
- package/dist/services/layer-discovery.d.ts.map +1 -0
- package/dist/services/layer-discovery.js +121 -0
- package/dist/services/layer-discovery.js.map +1 -0
- package/dist/services/llm/index.d.ts +28 -0
- package/dist/services/llm/index.d.ts.map +1 -0
- package/dist/services/llm/index.js +187 -0
- package/dist/services/llm/index.js.map +1 -0
- package/dist/services/llm/verify-static.d.ts +26 -0
- package/dist/services/llm/verify-static.d.ts.map +1 -0
- package/dist/services/llm/verify-static.js +82 -0
- package/dist/services/llm/verify-static.js.map +1 -0
- package/dist/services/openapi/import-service.d.ts.map +1 -1
- package/dist/services/openapi/import-service.js +98 -4
- package/dist/services/openapi/import-service.js.map +1 -1
- package/dist/services/openapi/sync-service.js +1 -1
- package/dist/services/setup/config-generators.js +1 -1
- package/dist/services/setup/config-generators.js.map +1 -1
- package/dist/services/sync.d.ts +2 -1
- package/dist/services/sync.d.ts.map +1 -1
- package/dist/services/sync.js +2 -1
- package/dist/services/sync.js.map +1 -1
- package/dist/services/test/index.d.ts +1 -0
- package/dist/services/test/index.js +1 -0
- package/dist/services/test/test-service.d.ts +22 -0
- package/dist/services/test/test-service.d.ts.map +1 -0
- package/dist/services/test/test-service.js +81 -0
- package/dist/services/test/test-service.js.map +1 -0
- package/dist/services/validate/blueprint-validator.d.ts +23 -0
- package/dist/services/validate/blueprint-validator.d.ts.map +1 -0
- package/dist/services/validate/blueprint-validator.js +50 -0
- package/dist/services/validate/blueprint-validator.js.map +1 -0
- package/dist/services/validate/implementation-agent-validator.d.ts +20 -0
- package/dist/services/validate/implementation-agent-validator.d.ts.map +1 -0
- package/dist/services/validate/implementation-agent-validator.js +42 -0
- package/dist/services/validate/implementation-agent-validator.js.map +1 -0
- package/dist/services/{validate-implementation.d.ts → validate/implementation-validator.d.ts} +3 -3
- package/dist/services/validate/implementation-validator.d.ts.map +1 -0
- package/dist/services/{validate-implementation.js → validate/implementation-validator.js} +2 -2
- package/dist/services/validate/implementation-validator.js.map +1 -0
- package/dist/services/validate/index.d.ts +5 -0
- package/dist/services/validate/index.js +5 -0
- package/dist/services/{validate.d.ts → validate/spec-validator.d.ts} +5 -4
- package/dist/services/validate/spec-validator.d.ts.map +1 -0
- package/dist/services/{validate.js → validate/spec-validator.js} +6 -4
- package/dist/services/validate/spec-validator.js.map +1 -0
- package/dist/services/validate/tenant-validator.d.ts +21 -0
- package/dist/services/validate/tenant-validator.d.ts.map +1 -0
- package/dist/services/validate/tenant-validator.js +165 -0
- package/dist/services/validate/tenant-validator.js.map +1 -0
- package/dist/services/watch.js +2 -1
- package/dist/services/watch.js.map +1 -1
- package/dist/templates/data-view.template.js +3 -3
- package/dist/templates/data-view.template.js.map +1 -1
- package/dist/templates/event.template.js +3 -1
- package/dist/templates/event.template.js.map +1 -1
- package/dist/templates/operation.template.js +3 -1
- package/dist/templates/operation.template.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/module-loader.js +41 -0
- package/dist/utils/module-loader.js.map +1 -0
- package/package.json +9 -9
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/services/test.d.ts +0 -15
- package/dist/services/test.d.ts.map +0 -1
- package/dist/services/test.js +0 -30
- package/dist/services/test.js.map +0 -1
- package/dist/services/validate-implementation.d.ts.map +0 -1
- package/dist/services/validate-implementation.js.map +0 -1
- package/dist/services/validate.d.ts.map +0 -1
- package/dist/services/validate.js.map +0 -1
package/README.md
CHANGED
|
@@ -29,7 +29,11 @@ bundle.contractspec-workspace
|
|
|
29
29
|
│ ├── watch.ts # Watch specs and trigger validate/build
|
|
30
30
|
│ ├── clean.ts # Safe-by-default cleanup of generated artifacts
|
|
31
31
|
│ ├── test.ts # Run TestSpec scenarios (pure runner wrapper)
|
|
32
|
-
│
|
|
32
|
+
│ ├── regenerator.ts # Regenerator service wrapper (no module loading)
|
|
33
|
+
│ ├── integrity.ts # Analyze spec/feature integrity and coverage
|
|
34
|
+
│ ├── layer-discovery.ts # Discover features, examples, app-configs
|
|
35
|
+
│ ├── doctor/ # Health checks and auto-fixes
|
|
36
|
+
│ └── ci-check/ # CI/CD validation checks
|
|
33
37
|
├── adapters/ # Runtime adapters (Node defaults)
|
|
34
38
|
│ ├── fs.ts # Filesystem operations
|
|
35
39
|
│ ├── git.ts # Git operations
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
//#region rolldown:runtime
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
3
|
var __exportAll = (all, symbols) => {
|
|
7
4
|
let target = {};
|
|
8
5
|
for (var name in all) {
|
|
@@ -16,21 +13,6 @@ var __exportAll = (all, symbols) => {
|
|
|
16
13
|
}
|
|
17
14
|
return target;
|
|
18
15
|
};
|
|
19
|
-
var __copyProps = (to, from, except, desc) => {
|
|
20
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
|
-
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
22
|
-
key = keys[i];
|
|
23
|
-
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
24
|
-
__defProp(to, key, {
|
|
25
|
-
get: ((k) => from[k]).bind(null, key),
|
|
26
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return to;
|
|
32
|
-
};
|
|
33
|
-
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
34
16
|
|
|
35
17
|
//#endregion
|
|
36
|
-
export { __exportAll
|
|
18
|
+
export { __exportAll };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { join } from "path";
|
|
2
|
-
import { existsSync } from "fs";
|
|
3
|
-
import { spawn } from "child_process";
|
|
4
2
|
import { mkdir, readFile, rm, writeFile } from "fs/promises";
|
|
3
|
+
import { spawn } from "child_process";
|
|
5
4
|
import { homedir, tmpdir } from "os";
|
|
5
|
+
import { existsSync } from "fs";
|
|
6
6
|
|
|
7
7
|
//#region src/ai/agents/cursor-agent.ts
|
|
8
8
|
/**
|
|
@@ -126,7 +126,7 @@ var CursorAgent = class {
|
|
|
126
126
|
await writeFile(specPath, task.specCode);
|
|
127
127
|
await writeFile(instructionsPath, this.buildDetailedPrompt(task));
|
|
128
128
|
if (task.existingCode) await writeFile(join(workDir, "existing.ts"), task.existingCode);
|
|
129
|
-
return new Promise((resolve, reject) => {
|
|
129
|
+
return new Promise((resolve$1, reject) => {
|
|
130
130
|
const args = [
|
|
131
131
|
"--wait",
|
|
132
132
|
"--new-window",
|
|
@@ -150,7 +150,7 @@ var CursorAgent = class {
|
|
|
150
150
|
});
|
|
151
151
|
cursor.on("close", async (code) => {
|
|
152
152
|
if (existsSync(outputPath)) try {
|
|
153
|
-
resolve({
|
|
153
|
+
resolve$1({
|
|
154
154
|
success: true,
|
|
155
155
|
code: await readFile(outputPath, "utf-8"),
|
|
156
156
|
metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-agent.js","names":[],"sources":["../../../src/ai/agents/cursor-agent.ts"],"sourcesContent":["/**\n * Cursor/Windsurf Agent - Fully Implemented\n * Leverages Windsurf AI capabilities and Cursor IDE integration for code generation and validation\n */\n\nimport { spawn } from 'child_process';\nimport { mkdir, readFile, rm, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir, tmpdir } from 'os';\nimport { existsSync } from 'fs';\nimport type { AgentProvider, AgentResult, AgentTask } from './types';\n\nexport class CursorAgent implements AgentProvider {\n name = 'cursor' as const;\n private cursorPath: string | null = null;\n private isWindsurf = false;\n private composerPort: string;\n\n constructor() {\n this.composerPort = process.env.CURSOR_COMPOSER_PORT || '3000';\n this.detectEnvironment();\n }\n\n canHandle(_task: AgentTask): boolean {\n return this.isCursorAvailable();\n }\n\n async generate(task: AgentTask): Promise<AgentResult> {\n try {\n const workDir = join(tmpdir(), `cursor-agent-${Date.now()}`);\n await mkdir(workDir, { recursive: true });\n\n const result = await this.executeWithBestMethod(task, workDir);\n\n // Cleanup\n await this.cleanupWorkDir(workDir);\n\n return result;\n } catch (error) {\n return {\n success: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n async validate(task: AgentTask): Promise<AgentResult> {\n try {\n const workDir = join(tmpdir(), `cursor-validate-${Date.now()}`);\n await mkdir(workDir, { recursive: true });\n\n // Create validation context\n await this.setupValidationWorkspace(task, workDir);\n\n const result = await this.executeWithBestMethod(\n {\n ...task,\n type: 'validate',\n },\n workDir\n );\n\n // Cleanup\n await this.cleanupWorkDir(workDir);\n\n return result;\n } catch (error) {\n return {\n success: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n /**\n * Detect if running in Cursor/Windsurf environment\n */\n private detectEnvironment(): void {\n // Check for Windsurf/Cursor environment variables\n this.isWindsurf = !!(\n process.env.WINDSURF_SESSION ||\n process.env.CURSOR_USER_DATA ||\n process.env.VSCODE_CWD?.includes('Cursor') ||\n process.env.VSCODE_CWD?.includes('Windsurf')\n );\n\n // Try to locate cursor executable\n const possiblePaths = [\n '/usr/local/bin/cursor',\n '/Applications/Cursor.app/Contents/MacOS/Cursor',\n '/Applications/Windsurf.app/Contents/MacOS/Windsurf',\n join(homedir(), '.cursor', 'cursor'),\n join(homedir(), 'AppData', 'Local', 'Programs', 'cursor', 'Cursor.exe'),\n join(\n homedir(),\n 'AppData',\n 'Local',\n 'Programs',\n 'windsurf',\n 'Windsurf.exe'\n ),\n 'cursor', // In PATH\n 'windsurf', // In PATH\n ];\n\n for (const path of possiblePaths) {\n if (\n path.includes('cursor') ||\n path.includes('Cursor') ||\n path.includes('windsurf') ||\n path.includes('Windsurf')\n ) {\n try {\n if (existsSync(path)) {\n this.cursorPath = path;\n break;\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n /**\n * Execute task using the best available method\n */\n private async executeWithBestMethod(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n // Try methods in order of preference\n const methods = [\n // { name: 'windsurf-api', fn: () => this.useWindsurfAPI(task, workDir) },\n // { name: 'composer-api', fn: () => this.useComposerAPI(task, workDir) },\n { name: 'cursor-cli', fn: () => this.useCursorCLI(task, workDir) },\n {\n name: 'file-based',\n fn: () => this.useFileBasedApproach(task, workDir),\n },\n ];\n\n for (const method of methods) {\n try {\n const result = await method.fn();\n if (result.success) {\n return result;\n }\n } catch (_error) {\n // Try next method\n continue;\n }\n }\n\n // All methods failed\n return {\n success: false,\n warnings: [\n 'Cursor agent could not connect to IDE.',\n 'Ensure Cursor/Windsurf is running with API enabled.',\n 'Falling back to simple agent mode is recommended.',\n ],\n errors: ['All Cursor integration methods failed'],\n metadata: {\n agentMode: 'cursor',\n status: 'unavailable',\n suggestion: 'Use --agent-mode claude-code or --agent-mode simple',\n },\n };\n }\n\n /**\n * Use Windsurf's native API\n */\n // private async useWindsurfAPI(\n // task: AgentTask,\n // workDir: string\n // ): Promise<AgentResult> {\n // if (!this.isWindsurf) {\n // throw new Error('Not in Windsurf environment');\n // }\n //\n // const apiUrl = `http://localhost:${this.composerPort}/api/ai/generate`;\n //\n // try {\n // const response = await fetch(apiUrl, {\n // method: 'POST',\n // headers: {\n // 'Content-Type': 'application/json',\n // 'X-Windsurf-Session': process.env.WINDSURF_SESSION || '',\n // },\n // body: JSON.stringify({\n // task: task.type,\n // specification: task.specCode,\n // existingCode: task.existingCode,\n // targetPath: task.targetPath,\n // instructions: this.buildDetailedPrompt(task),\n // }),\n // signal: AbortSignal.timeout(30000), // 30 second timeout\n // });\n //\n // if (!response.ok) {\n // throw new Error(`Windsurf API returned ${response.status}`);\n // }\n //\n // const data = await response.json();\n //\n // return {\n // success: true,\n // code: data.code || data.output || data.result,\n // warnings: data.warnings,\n // suggestions: data.suggestions,\n // metadata: {\n // agentMode: 'cursor',\n // method: 'windsurf-api',\n // model: data.model,\n // },\n // };\n // } catch (error) {\n // throw new Error(\n // `Windsurf API failed: ${error instanceof Error ? error.message : String(error)}`\n // );\n // }\n // }\n\n /**\n * Use Cursor Composer API\n */\n // private async useComposerAPI(\n // task: AgentTask,\n // workDir: string\n // ): Promise<AgentResult> {\n // const apiUrl = `http://localhost:${this.composerPort}/api/compose`;\n //\n // try {\n // const response = await fetch(apiUrl, {\n // method: 'POST',\n // headers: {\n // 'Content-Type': 'application/json',\n // Accept: 'application/json',\n // },\n // body: JSON.stringify({\n // instruction: this.buildDetailedPrompt(task),\n // files: await this.prepareFilesForAPI(task, workDir),\n // workDir,\n // options: {\n // type: task.type,\n // streaming: false,\n // },\n // }),\n // signal: AbortSignal.timeout(30000),\n // });\n //\n // if (!response.ok) {\n // throw new Error(`Composer API returned ${response.status}`);\n // }\n //\n // const result = await response.json();\n //\n // return {\n // success: true,\n // code: result.code || result.output || result.content,\n // metadata: {\n // agentMode: 'cursor',\n // method: 'composer-api',\n // },\n // };\n // } catch (error) {\n // throw new Error(\n // `Composer API failed: ${error instanceof Error ? error.message : String(error)}`\n // );\n // }\n // }\n\n /**\n * Use Cursor CLI directly\n */\n private async useCursorCLI(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n if (!this.cursorPath) {\n throw new Error('Cursor executable not found');\n }\n\n // Prepare workspace\n const specPath = join(workDir, 'spec.ts');\n const outputPath = join(workDir, 'output.ts');\n const instructionsPath = join(workDir, 'INSTRUCTIONS.md');\n\n await writeFile(specPath, task.specCode);\n await writeFile(instructionsPath, this.buildDetailedPrompt(task));\n\n if (task.existingCode) {\n await writeFile(join(workDir, 'existing.ts'), task.existingCode);\n }\n\n return new Promise((resolve, reject) => {\n // Launch Cursor with the workspace\n const args = ['--wait', '--new-window', workDir];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const cursor = spawn(this.cursorPath!, args, {\n cwd: workDir,\n stdio: 'pipe',\n detached: false,\n });\n\n let _stdout = '';\n let _stderr = '';\n\n cursor.stdout?.on('data', (data) => {\n _stdout += data.toString();\n });\n\n cursor.stderr?.on('data', (data) => {\n _stderr += data.toString();\n });\n\n cursor.on('error', (error) => {\n reject(error);\n });\n\n cursor.on('close', async (code) => {\n // Check if output file was created\n if (existsSync(outputPath)) {\n try {\n const generatedCode = await readFile(outputPath, 'utf-8');\n resolve({\n success: true,\n code: generatedCode,\n metadata: {\n agentMode: 'cursor',\n method: 'cli',\n exitCode: code,\n },\n });\n } catch (_error) {\n reject(new Error('Failed to read generated output'));\n }\n } else {\n reject(\n new Error(\n `Cursor CLI exited with code ${code}. No output generated.`\n )\n );\n }\n });\n\n // Timeout after 60 seconds\n setTimeout(() => {\n cursor.kill();\n reject(new Error('Cursor CLI timeout'));\n }, 60000);\n });\n }\n\n /**\n * File-based approach - create workspace and instructions for manual completion\n */\n private async useFileBasedApproach(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n // Create comprehensive workspace with instructions\n const specPath = join(workDir, 'SPECIFICATION.ts');\n const instructionsPath = join(workDir, 'INSTRUCTIONS.md');\n const templatePath = join(workDir, 'template.ts');\n\n await writeFile(specPath, task.specCode);\n await writeFile(instructionsPath, this.buildDetailedPrompt(task));\n await writeFile(templatePath, this.generateTemplate(task));\n\n // Create a README for the workspace\n await writeFile(\n join(workDir, 'README.md'),\n `# Cursor Agent Workspace\n\nThis workspace was prepared for Cursor AI code generation.\n\n## Files:\n- **SPECIFICATION.ts**: The contract specification\n- **INSTRUCTIONS.md**: Detailed instructions for the AI\n- **template.ts**: Starting template\n\n## To Complete:\n1. Open this folder in Cursor\n2. Review INSTRUCTIONS.md\n3. Use Cursor AI to generate code based on the spec\n4. Save the result as output.ts\n\nWorkspace path: ${workDir}\n`\n );\n\n return {\n success: false,\n warnings: [\n 'Cursor agent created workspace but cannot auto-execute.',\n `Workspace prepared at: ${workDir}`,\n 'Open this folder in Cursor IDE to complete code generation.',\n ],\n code: this.generateTemplate(task),\n metadata: {\n agentMode: 'cursor',\n method: 'file-based',\n workDir,\n },\n };\n }\n\n /**\n * Setup workspace for validation\n */\n private async setupValidationWorkspace(\n task: AgentTask,\n workDir: string\n ): Promise<void> {\n await writeFile(join(workDir, 'specification.ts'), task.specCode);\n await writeFile(\n join(workDir, 'implementation.ts'),\n task.existingCode || '// No implementation'\n );\n await writeFile(\n join(workDir, 'VALIDATION_INSTRUCTIONS.md'),\n this.buildValidationPrompt(task)\n );\n }\n\n /**\n * Prepare files for API submission\n */\n private async prepareFilesForAPI(\n task: AgentTask,\n _workDir: string\n ): Promise<{ path: string; content: string }[]> {\n const files = [{ path: 'spec.ts', content: task.specCode }];\n\n if (task.existingCode) {\n files.push({ path: 'existing.ts', content: task.existingCode });\n }\n\n return files;\n }\n\n /**\n * Build detailed prompt for cursor\n */\n private buildDetailedPrompt(task: AgentTask): string {\n const header = `# AI Code Generation Task - Cursor Agent\\n\\n**Task Type:** ${task.type}\\n**Generated:** ${new Date().toISOString()}\\n\\n`;\n\n const specification = `## Specification\\n\\n\\`\\`\\`typescript\\n${task.specCode}\\n\\`\\`\\`\\n\\n`;\n\n const taskInstructions = {\n generate: `## Task: Generate Implementation\n\n### Requirements:\n1. **Type Safety**: Use strict TypeScript with comprehensive types\n2. **Error Handling**: Implement robust error handling and validation\n3. **Documentation**: Add JSDoc comments for all public APIs\n4. **Best Practices**: Follow SOLID principles and clean code practices\n5. **Testing**: Design code to be easily testable\n6. **Production Ready**: Code should be ready for production use\n\n### Implementation Guidelines:\n- Parse and validate all inputs according to the specification\n- Handle all edge cases and error scenarios\n- Use modern TypeScript features appropriately\n- Ensure proper async/await usage if needed\n- Add meaningful variable and function names\n- Keep functions focused and single-purpose\n\n### Output Format:\nProvide complete, executable TypeScript code that fully implements the specification.\nInclude all necessary imports and type definitions.`,\n\n validate: `## Task: Validate Implementation\n\n### Current Implementation:\n\\`\\`\\`typescript\n${task.existingCode || '// No implementation provided'}\n\\`\\`\\`\n\n### Validation Criteria:\n1. **Specification Compliance**: Does it match all requirements?\n2. **Type Safety**: Are all types correct and complete?\n3. **Error Handling**: Is error handling adequate?\n4. **Code Quality**: Does it follow best practices?\n5. **Completeness**: Are there missing features?\n\n### Review Checklist:\n- [ ] All specified inputs/outputs are handled\n- [ ] Types match the specification exactly\n- [ ] Error cases are properly handled\n- [ ] Code is production-ready\n- [ ] No obvious bugs or issues\n- [ ] Performance is acceptable\n- [ ] Code is maintainable\n\n### Output Format:\nProvide a detailed validation report with:\n- **Status**: Pass/Fail\n- **Issues Found**: List all problems\n- **Recommendations**: Specific improvements needed\n- **Code Quality Score**: Rate the implementation`,\n\n test: `## Task: Generate Tests\n\n### Implementation to Test:\n\\`\\`\\`typescript\n${task.existingCode || ''}\n\\`\\`\\`\n\n### Test Requirements:\n1. **Coverage**: Test all code paths and edge cases\n2. **Framework**: Use Vitest\n3. **Structure**: Organize tests logically (describe/it blocks)\n4. **Assertions**: Use clear, meaningful assertions\n5. **Mocking**: Mock external dependencies appropriately\n\n### Test Categories Needed:\n- Unit tests for individual functions\n- Integration tests for workflows\n- Edge case tests\n- Error handling tests\n- Performance tests (if applicable)\n\n### Output Format:\nComplete Vitest test file with comprehensive test coverage.`,\n\n refactor: `## Task: Refactor Code\n\n### Current Code:\n\\`\\`\\`typescript\n${task.existingCode || ''}\n\\`\\`\\`\n\n### Refactoring Goals:\n1. **Maintainability**: Improve code organization and readability\n2. **Performance**: Optimize where beneficial\n3. **Type Safety**: Enhance type definitions\n4. **Error Handling**: Improve error handling robustness\n5. **Documentation**: Add missing documentation\n\n### Refactoring Guidelines:\n- Preserve all existing functionality\n- Extract reusable components\n- Eliminate code duplication\n- Improve naming and structure\n- Add type guards where beneficial\n- Enhance error messages\n\n### Output Format:\nRefactored code that maintains functionality while improving quality.`,\n };\n\n return (\n header +\n specification +\n (taskInstructions[task.type] || taskInstructions.generate)\n );\n }\n\n /**\n * Build validation-specific prompt\n */\n private buildValidationPrompt(task: AgentTask): string {\n return `# Implementation Validation Report\n\n## Specification\n\\`\\`\\`typescript\n${task.specCode}\n\\`\\`\\`\n\n## Implementation\n\\`\\`\\`typescript\n${task.existingCode || '// No implementation'}\n\\`\\`\\`\n\n## Validation Checklist\n\n### 1. Specification Compliance\n- [ ] All required features implemented\n- [ ] Input/output types match specification\n- [ ] Behavior matches documented requirements\n\n### 2. Code Quality\n- [ ] Follows TypeScript best practices\n- [ ] Proper error handling\n- [ ] Meaningful variable names\n- [ ] Appropriate code organization\n\n### 3. Type Safety\n- [ ] No type assertions (as) unless necessary\n- [ ] Proper generic usage\n- [ ] Complete type coverage\n\n### 4. Production Readiness\n- [ ] No console.log statements\n- [ ] Proper error handling\n- [ ] Edge cases covered\n- [ ] Performance considerations\n\n### 5. Maintainability\n- [ ] Clear documentation\n- [ ] Testable code structure\n- [ ] No code smells\n- [ ] SOLID principles followed\n\n## Instructions\nReview the implementation against the specification and complete the checklist.\nProvide detailed feedback for each failed item.\nSuggest specific improvements with code examples where applicable.`;\n }\n\n /**\n * Generate basic template for task\n */\n private generateTemplate(task: AgentTask): string {\n return `// Auto-generated template for ${task.type} task\n// Specification:\n${task.specCode\n .split('\\n')\n .map((line) => `// ${line}`)\n .join('\\n')}\n\n// TODO: Implement according to specification\n// Use Cursor AI to complete this implementation\n\nexport function implementation() {\n // Implementation goes here\n throw new Error('Not implemented');\n}\n`;\n }\n\n /**\n * Cleanup temporary work directory\n */\n private async cleanupWorkDir(workDir: string): Promise<void> {\n try {\n await rm(workDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n private isCursorAvailable(): boolean {\n return this.isWindsurf || this.cursorPath !== null || this.hasComposerAPI();\n }\n\n /**\n * Check if Cursor Composer API might be available\n */\n private hasComposerAPI(): boolean {\n return !!(\n process.env.CURSOR_COMPOSER_PORT ||\n process.env.CURSOR_API_ENABLED ||\n this.isWindsurf\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cursor-agent.js","names":[],"sources":["../../../src/ai/agents/cursor-agent.ts"],"sourcesContent":["/**\n * Cursor/Windsurf Agent - Fully Implemented\n * Leverages Windsurf AI capabilities and Cursor IDE integration for code generation and validation\n */\n\nimport { spawn } from 'child_process';\nimport { mkdir, readFile, rm, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir, tmpdir } from 'os';\nimport { existsSync } from 'fs';\nimport type { AgentProvider, AgentResult, AgentTask } from './types';\n\nexport class CursorAgent implements AgentProvider {\n name = 'cursor' as const;\n private cursorPath: string | null = null;\n private isWindsurf = false;\n private composerPort: string;\n\n constructor() {\n this.composerPort = process.env.CURSOR_COMPOSER_PORT || '3000';\n this.detectEnvironment();\n }\n\n canHandle(_task: AgentTask): boolean {\n return this.isCursorAvailable();\n }\n\n async generate(task: AgentTask): Promise<AgentResult> {\n try {\n const workDir = join(tmpdir(), `cursor-agent-${Date.now()}`);\n await mkdir(workDir, { recursive: true });\n\n const result = await this.executeWithBestMethod(task, workDir);\n\n // Cleanup\n await this.cleanupWorkDir(workDir);\n\n return result;\n } catch (error) {\n return {\n success: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n async validate(task: AgentTask): Promise<AgentResult> {\n try {\n const workDir = join(tmpdir(), `cursor-validate-${Date.now()}`);\n await mkdir(workDir, { recursive: true });\n\n // Create validation context\n await this.setupValidationWorkspace(task, workDir);\n\n const result = await this.executeWithBestMethod(\n {\n ...task,\n type: 'validate',\n },\n workDir\n );\n\n // Cleanup\n await this.cleanupWorkDir(workDir);\n\n return result;\n } catch (error) {\n return {\n success: false,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n /**\n * Detect if running in Cursor/Windsurf environment\n */\n private detectEnvironment(): void {\n // Check for Windsurf/Cursor environment variables\n this.isWindsurf = !!(\n process.env.WINDSURF_SESSION ||\n process.env.CURSOR_USER_DATA ||\n process.env.VSCODE_CWD?.includes('Cursor') ||\n process.env.VSCODE_CWD?.includes('Windsurf')\n );\n\n // Try to locate cursor executable\n const possiblePaths = [\n '/usr/local/bin/cursor',\n '/Applications/Cursor.app/Contents/MacOS/Cursor',\n '/Applications/Windsurf.app/Contents/MacOS/Windsurf',\n join(homedir(), '.cursor', 'cursor'),\n join(homedir(), 'AppData', 'Local', 'Programs', 'cursor', 'Cursor.exe'),\n join(\n homedir(),\n 'AppData',\n 'Local',\n 'Programs',\n 'windsurf',\n 'Windsurf.exe'\n ),\n 'cursor', // In PATH\n 'windsurf', // In PATH\n ];\n\n for (const path of possiblePaths) {\n if (\n path.includes('cursor') ||\n path.includes('Cursor') ||\n path.includes('windsurf') ||\n path.includes('Windsurf')\n ) {\n try {\n if (existsSync(path)) {\n this.cursorPath = path;\n break;\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n /**\n * Execute task using the best available method\n */\n private async executeWithBestMethod(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n // Try methods in order of preference\n const methods = [\n // { name: 'windsurf-api', fn: () => this.useWindsurfAPI(task, workDir) },\n // { name: 'composer-api', fn: () => this.useComposerAPI(task, workDir) },\n { name: 'cursor-cli', fn: () => this.useCursorCLI(task, workDir) },\n {\n name: 'file-based',\n fn: () => this.useFileBasedApproach(task, workDir),\n },\n ];\n\n for (const method of methods) {\n try {\n const result = await method.fn();\n if (result.success) {\n return result;\n }\n } catch (_error) {\n // Try next method\n continue;\n }\n }\n\n // All methods failed\n return {\n success: false,\n warnings: [\n 'Cursor agent could not connect to IDE.',\n 'Ensure Cursor/Windsurf is running with API enabled.',\n 'Falling back to simple agent mode is recommended.',\n ],\n errors: ['All Cursor integration methods failed'],\n metadata: {\n agentMode: 'cursor',\n status: 'unavailable',\n suggestion: 'Use --agent-mode claude-code or --agent-mode simple',\n },\n };\n }\n\n /**\n * Use Windsurf's native API\n */\n // private async useWindsurfAPI(\n // task: AgentTask,\n // workDir: string\n // ): Promise<AgentResult> {\n // if (!this.isWindsurf) {\n // throw new Error('Not in Windsurf environment');\n // }\n //\n // const apiUrl = `http://localhost:${this.composerPort}/api/ai/generate`;\n //\n // try {\n // const response = await fetch(apiUrl, {\n // method: 'POST',\n // headers: {\n // 'Content-Type': 'application/json',\n // 'X-Windsurf-Session': process.env.WINDSURF_SESSION || '',\n // },\n // body: JSON.stringify({\n // task: task.type,\n // specification: task.specCode,\n // existingCode: task.existingCode,\n // targetPath: task.targetPath,\n // instructions: this.buildDetailedPrompt(task),\n // }),\n // signal: AbortSignal.timeout(30000), // 30 second timeout\n // });\n //\n // if (!response.ok) {\n // throw new Error(`Windsurf API returned ${response.status}`);\n // }\n //\n // const data = await response.json();\n //\n // return {\n // success: true,\n // code: data.code || data.output || data.result,\n // warnings: data.warnings,\n // suggestions: data.suggestions,\n // metadata: {\n // agentMode: 'cursor',\n // method: 'windsurf-api',\n // model: data.model,\n // },\n // };\n // } catch (error) {\n // throw new Error(\n // `Windsurf API failed: ${error instanceof Error ? error.message : String(error)}`\n // );\n // }\n // }\n\n /**\n * Use Cursor Composer API\n */\n // private async useComposerAPI(\n // task: AgentTask,\n // workDir: string\n // ): Promise<AgentResult> {\n // const apiUrl = `http://localhost:${this.composerPort}/api/compose`;\n //\n // try {\n // const response = await fetch(apiUrl, {\n // method: 'POST',\n // headers: {\n // 'Content-Type': 'application/json',\n // Accept: 'application/json',\n // },\n // body: JSON.stringify({\n // instruction: this.buildDetailedPrompt(task),\n // files: await this.prepareFilesForAPI(task, workDir),\n // workDir,\n // options: {\n // type: task.type,\n // streaming: false,\n // },\n // }),\n // signal: AbortSignal.timeout(30000),\n // });\n //\n // if (!response.ok) {\n // throw new Error(`Composer API returned ${response.status}`);\n // }\n //\n // const result = await response.json();\n //\n // return {\n // success: true,\n // code: result.code || result.output || result.content,\n // metadata: {\n // agentMode: 'cursor',\n // method: 'composer-api',\n // },\n // };\n // } catch (error) {\n // throw new Error(\n // `Composer API failed: ${error instanceof Error ? error.message : String(error)}`\n // );\n // }\n // }\n\n /**\n * Use Cursor CLI directly\n */\n private async useCursorCLI(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n if (!this.cursorPath) {\n throw new Error('Cursor executable not found');\n }\n\n // Prepare workspace\n const specPath = join(workDir, 'spec.ts');\n const outputPath = join(workDir, 'output.ts');\n const instructionsPath = join(workDir, 'INSTRUCTIONS.md');\n\n await writeFile(specPath, task.specCode);\n await writeFile(instructionsPath, this.buildDetailedPrompt(task));\n\n if (task.existingCode) {\n await writeFile(join(workDir, 'existing.ts'), task.existingCode);\n }\n\n return new Promise((resolve, reject) => {\n // Launch Cursor with the workspace\n const args = ['--wait', '--new-window', workDir];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const cursor = spawn(this.cursorPath!, args, {\n cwd: workDir,\n stdio: 'pipe',\n detached: false,\n });\n\n let _stdout = '';\n let _stderr = '';\n\n cursor.stdout?.on('data', (data) => {\n _stdout += data.toString();\n });\n\n cursor.stderr?.on('data', (data) => {\n _stderr += data.toString();\n });\n\n cursor.on('error', (error) => {\n reject(error);\n });\n\n cursor.on('close', async (code) => {\n // Check if output file was created\n if (existsSync(outputPath)) {\n try {\n const generatedCode = await readFile(outputPath, 'utf-8');\n resolve({\n success: true,\n code: generatedCode,\n metadata: {\n agentMode: 'cursor',\n method: 'cli',\n exitCode: code,\n },\n });\n } catch (_error) {\n reject(new Error('Failed to read generated output'));\n }\n } else {\n reject(\n new Error(\n `Cursor CLI exited with code ${code}. No output generated.`\n )\n );\n }\n });\n\n // Timeout after 60 seconds\n setTimeout(() => {\n cursor.kill();\n reject(new Error('Cursor CLI timeout'));\n }, 60000);\n });\n }\n\n /**\n * File-based approach - create workspace and instructions for manual completion\n */\n private async useFileBasedApproach(\n task: AgentTask,\n workDir: string\n ): Promise<AgentResult> {\n // Create comprehensive workspace with instructions\n const specPath = join(workDir, 'SPECIFICATION.ts');\n const instructionsPath = join(workDir, 'INSTRUCTIONS.md');\n const templatePath = join(workDir, 'template.ts');\n\n await writeFile(specPath, task.specCode);\n await writeFile(instructionsPath, this.buildDetailedPrompt(task));\n await writeFile(templatePath, this.generateTemplate(task));\n\n // Create a README for the workspace\n await writeFile(\n join(workDir, 'README.md'),\n `# Cursor Agent Workspace\n\nThis workspace was prepared for Cursor AI code generation.\n\n## Files:\n- **SPECIFICATION.ts**: The contract specification\n- **INSTRUCTIONS.md**: Detailed instructions for the AI\n- **template.ts**: Starting template\n\n## To Complete:\n1. Open this folder in Cursor\n2. Review INSTRUCTIONS.md\n3. Use Cursor AI to generate code based on the spec\n4. Save the result as output.ts\n\nWorkspace path: ${workDir}\n`\n );\n\n return {\n success: false,\n warnings: [\n 'Cursor agent created workspace but cannot auto-execute.',\n `Workspace prepared at: ${workDir}`,\n 'Open this folder in Cursor IDE to complete code generation.',\n ],\n code: this.generateTemplate(task),\n metadata: {\n agentMode: 'cursor',\n method: 'file-based',\n workDir,\n },\n };\n }\n\n /**\n * Setup workspace for validation\n */\n private async setupValidationWorkspace(\n task: AgentTask,\n workDir: string\n ): Promise<void> {\n await writeFile(join(workDir, 'specification.ts'), task.specCode);\n await writeFile(\n join(workDir, 'implementation.ts'),\n task.existingCode || '// No implementation'\n );\n await writeFile(\n join(workDir, 'VALIDATION_INSTRUCTIONS.md'),\n this.buildValidationPrompt(task)\n );\n }\n\n /**\n * Prepare files for API submission\n */\n private async prepareFilesForAPI(\n task: AgentTask,\n _workDir: string\n ): Promise<{ path: string; content: string }[]> {\n const files = [{ path: 'spec.ts', content: task.specCode }];\n\n if (task.existingCode) {\n files.push({ path: 'existing.ts', content: task.existingCode });\n }\n\n return files;\n }\n\n /**\n * Build detailed prompt for cursor\n */\n private buildDetailedPrompt(task: AgentTask): string {\n const header = `# AI Code Generation Task - Cursor Agent\\n\\n**Task Type:** ${task.type}\\n**Generated:** ${new Date().toISOString()}\\n\\n`;\n\n const specification = `## Specification\\n\\n\\`\\`\\`typescript\\n${task.specCode}\\n\\`\\`\\`\\n\\n`;\n\n const taskInstructions = {\n generate: `## Task: Generate Implementation\n\n### Requirements:\n1. **Type Safety**: Use strict TypeScript with comprehensive types\n2. **Error Handling**: Implement robust error handling and validation\n3. **Documentation**: Add JSDoc comments for all public APIs\n4. **Best Practices**: Follow SOLID principles and clean code practices\n5. **Testing**: Design code to be easily testable\n6. **Production Ready**: Code should be ready for production use\n\n### Implementation Guidelines:\n- Parse and validate all inputs according to the specification\n- Handle all edge cases and error scenarios\n- Use modern TypeScript features appropriately\n- Ensure proper async/await usage if needed\n- Add meaningful variable and function names\n- Keep functions focused and single-purpose\n\n### Output Format:\nProvide complete, executable TypeScript code that fully implements the specification.\nInclude all necessary imports and type definitions.`,\n\n validate: `## Task: Validate Implementation\n\n### Current Implementation:\n\\`\\`\\`typescript\n${task.existingCode || '// No implementation provided'}\n\\`\\`\\`\n\n### Validation Criteria:\n1. **Specification Compliance**: Does it match all requirements?\n2. **Type Safety**: Are all types correct and complete?\n3. **Error Handling**: Is error handling adequate?\n4. **Code Quality**: Does it follow best practices?\n5. **Completeness**: Are there missing features?\n\n### Review Checklist:\n- [ ] All specified inputs/outputs are handled\n- [ ] Types match the specification exactly\n- [ ] Error cases are properly handled\n- [ ] Code is production-ready\n- [ ] No obvious bugs or issues\n- [ ] Performance is acceptable\n- [ ] Code is maintainable\n\n### Output Format:\nProvide a detailed validation report with:\n- **Status**: Pass/Fail\n- **Issues Found**: List all problems\n- **Recommendations**: Specific improvements needed\n- **Code Quality Score**: Rate the implementation`,\n\n test: `## Task: Generate Tests\n\n### Implementation to Test:\n\\`\\`\\`typescript\n${task.existingCode || ''}\n\\`\\`\\`\n\n### Test Requirements:\n1. **Coverage**: Test all code paths and edge cases\n2. **Framework**: Use Vitest\n3. **Structure**: Organize tests logically (describe/it blocks)\n4. **Assertions**: Use clear, meaningful assertions\n5. **Mocking**: Mock external dependencies appropriately\n\n### Test Categories Needed:\n- Unit tests for individual functions\n- Integration tests for workflows\n- Edge case tests\n- Error handling tests\n- Performance tests (if applicable)\n\n### Output Format:\nComplete Vitest test file with comprehensive test coverage.`,\n\n refactor: `## Task: Refactor Code\n\n### Current Code:\n\\`\\`\\`typescript\n${task.existingCode || ''}\n\\`\\`\\`\n\n### Refactoring Goals:\n1. **Maintainability**: Improve code organization and readability\n2. **Performance**: Optimize where beneficial\n3. **Type Safety**: Enhance type definitions\n4. **Error Handling**: Improve error handling robustness\n5. **Documentation**: Add missing documentation\n\n### Refactoring Guidelines:\n- Preserve all existing functionality\n- Extract reusable components\n- Eliminate code duplication\n- Improve naming and structure\n- Add type guards where beneficial\n- Enhance error messages\n\n### Output Format:\nRefactored code that maintains functionality while improving quality.`,\n };\n\n return (\n header +\n specification +\n (taskInstructions[task.type] || taskInstructions.generate)\n );\n }\n\n /**\n * Build validation-specific prompt\n */\n private buildValidationPrompt(task: AgentTask): string {\n return `# Implementation Validation Report\n\n## Specification\n\\`\\`\\`typescript\n${task.specCode}\n\\`\\`\\`\n\n## Implementation\n\\`\\`\\`typescript\n${task.existingCode || '// No implementation'}\n\\`\\`\\`\n\n## Validation Checklist\n\n### 1. Specification Compliance\n- [ ] All required features implemented\n- [ ] Input/output types match specification\n- [ ] Behavior matches documented requirements\n\n### 2. Code Quality\n- [ ] Follows TypeScript best practices\n- [ ] Proper error handling\n- [ ] Meaningful variable names\n- [ ] Appropriate code organization\n\n### 3. Type Safety\n- [ ] No type assertions (as) unless necessary\n- [ ] Proper generic usage\n- [ ] Complete type coverage\n\n### 4. Production Readiness\n- [ ] No console.log statements\n- [ ] Proper error handling\n- [ ] Edge cases covered\n- [ ] Performance considerations\n\n### 5. Maintainability\n- [ ] Clear documentation\n- [ ] Testable code structure\n- [ ] No code smells\n- [ ] SOLID principles followed\n\n## Instructions\nReview the implementation against the specification and complete the checklist.\nProvide detailed feedback for each failed item.\nSuggest specific improvements with code examples where applicable.`;\n }\n\n /**\n * Generate basic template for task\n */\n private generateTemplate(task: AgentTask): string {\n return `// Auto-generated template for ${task.type} task\n// Specification:\n${task.specCode\n .split('\\n')\n .map((line) => `// ${line}`)\n .join('\\n')}\n\n// TODO: Implement according to specification\n// Use Cursor AI to complete this implementation\n\nexport function implementation() {\n // Implementation goes here\n throw new Error('Not implemented');\n}\n`;\n }\n\n /**\n * Cleanup temporary work directory\n */\n private async cleanupWorkDir(workDir: string): Promise<void> {\n try {\n await rm(workDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n private isCursorAvailable(): boolean {\n return this.isWindsurf || this.cursorPath !== null || this.hasComposerAPI();\n }\n\n /**\n * Check if Cursor Composer API might be available\n */\n private hasComposerAPI(): boolean {\n return !!(\n process.env.CURSOR_COMPOSER_PORT ||\n process.env.CURSOR_API_ENABLED ||\n this.isWindsurf\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/ai/client.d.ts
CHANGED
|
@@ -77,6 +77,20 @@ declare class AIClient {
|
|
|
77
77
|
* Stream code generation for better UX
|
|
78
78
|
*/
|
|
79
79
|
streamCodeGeneration(prompt: string, onChunk: (text: string) => void): Promise<string>;
|
|
80
|
+
/**
|
|
81
|
+
* Chat with the AI model
|
|
82
|
+
*/
|
|
83
|
+
chat(messages: {
|
|
84
|
+
role: 'system' | 'user' | 'assistant';
|
|
85
|
+
content: string;
|
|
86
|
+
}[], system?: string): Promise<string>;
|
|
87
|
+
/**
|
|
88
|
+
* Stream chat with the AI model
|
|
89
|
+
*/
|
|
90
|
+
streamChat(messages: {
|
|
91
|
+
role: 'system' | 'user' | 'assistant';
|
|
92
|
+
content: string;
|
|
93
|
+
}[], onChunk: (text: string) => void, system?: string): Promise<string>;
|
|
80
94
|
}
|
|
81
95
|
//#endregion
|
|
82
96
|
export { AIClient };
|
package/dist/ai/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/ai/client.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsBA;AAC8B,cADjB,QAAA,CACiB;EAK2B,QAAA,MAAA;EAAM,WAAA,CAAA,MAAA,EALjC,MAKiC;EA6ClB;;;EAiEF,qBAAA,CAAA,WAAA,EAAA,MAAA,EAAA,IAAA,EA9Gc,MA8Gd,CAAA,EA9GoB,OA8GpB,CAAA;IAeE,IAAA,EAAA,MAAA;IAeL,OAAA,EAAA,MAAA;IAmBnC,WAAA,EAAA,MAAA;IAkBA,IAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/ai/client.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsBA;AAC8B,cADjB,QAAA,CACiB;EAK2B,QAAA,MAAA;EAAM,WAAA,CAAA,MAAA,EALjC,MAKiC;EA6ClB;;;EAiEF,qBAAA,CAAA,WAAA,EAAA,MAAA,EAAA,IAAA,EA9Gc,MA8Gd,CAAA,EA9GoB,OA8GpB,CAAA;IAeE,IAAA,EAAA,MAAA;IAeL,OAAA,EAAA,MAAA;IAmBnC,WAAA,EAAA,MAAA;IAkBA,IAAA,EAAA,MAAA;IAyBA,OAAA,EAAA,MAAA;IAmBA,SAAA,EAAA,cAAA,GAAA,MAAA,GAAA,QAAA,GAAA,YAAA;IAAO,MAAA,EAAA,MAAA,EAAA;;;;;;;;;;;;0CAhLiC;;;;;;;;;;;;;sDA+Be,mBAAgB;;;;;;;;;;;;;;;;qCAkCjC;;;;uCAeE;;;;kCAeL;;;;kGAmBnC;;;;yEAkBA;;;;;;;yBAyBA;;;;;;;0DAmBA"}
|
package/dist/ai/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getAIProvider } from "./providers.js";
|
|
2
|
-
import { buildEventSpecPrompt, buildOperationSpecPrompt, buildPresentationSpecPrompt, getSystemPrompt } from "./prompts/spec-creation.js";
|
|
3
2
|
import { buildComponentPrompt, buildFormPrompt, buildHandlerPrompt, buildTestPrompt, getCodeGenSystemPrompt } from "./prompts/code-generation.js";
|
|
3
|
+
import { buildEventSpecPrompt, buildOperationSpecPrompt, buildPresentationSpecPrompt, getSystemPrompt } from "./prompts/spec-creation.js";
|
|
4
4
|
import { generateObject, generateText, streamText } from "ai";
|
|
5
5
|
import * as z from "zod";
|
|
6
6
|
|
|
@@ -156,6 +156,32 @@ var AIClient = class {
|
|
|
156
156
|
}
|
|
157
157
|
return fullText;
|
|
158
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Chat with the AI model
|
|
161
|
+
*/
|
|
162
|
+
async chat(messages, system) {
|
|
163
|
+
return (await generateText({
|
|
164
|
+
model: getAIProvider(this.config),
|
|
165
|
+
messages,
|
|
166
|
+
system: system || getSystemPrompt()
|
|
167
|
+
})).text;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Stream chat with the AI model
|
|
171
|
+
*/
|
|
172
|
+
async streamChat(messages, onChunk, system) {
|
|
173
|
+
const result = await streamText({
|
|
174
|
+
model: getAIProvider(this.config),
|
|
175
|
+
messages,
|
|
176
|
+
system: system || getSystemPrompt()
|
|
177
|
+
});
|
|
178
|
+
let fullText = "";
|
|
179
|
+
for await (const chunk of result.textStream) {
|
|
180
|
+
fullText += chunk;
|
|
181
|
+
onChunk(chunk);
|
|
182
|
+
}
|
|
183
|
+
return fullText;
|
|
184
|
+
}
|
|
159
185
|
};
|
|
160
186
|
|
|
161
187
|
//#endregion
|
package/dist/ai/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["config: Config"],"sources":["../../src/ai/client.ts"],"sourcesContent":["import { generateObject, generateText, streamText } from 'ai';\nimport * as z from 'zod';\nimport { getAIProvider } from './providers';\nimport type { Config } from '../types/config';\nimport {\n buildEventSpecPrompt,\n buildOperationSpecPrompt,\n buildPresentationSpecPrompt,\n getSystemPrompt,\n} from './prompts/spec-creation';\nimport {\n buildComponentPrompt,\n buildFormPrompt,\n buildHandlerPrompt,\n buildTestPrompt,\n getCodeGenSystemPrompt,\n} from './prompts/code-generation';\nimport type { OpKind, PresentationKind } from '../types';\n\n/**\n * AI Client for spec creation and code generation\n */\nexport class AIClient {\n constructor(private config: Config) {}\n\n /**\n * Generate operation spec from natural language description\n */\n async generateOperationSpec(description: string, kind: OpKind) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string().describe('Dot notation name like \"domain.operation\"'),\n version: z.number().int().positive().default(1),\n description: z.string().describe('Clear, concise summary'),\n goal: z.string().describe('Business purpose'),\n context: z.string().describe('Background and constraints'),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).describe('Team/person owners with @ prefix'),\n tags: z.array(z.string()).describe('Categorization tags'),\n auth: z\n .enum(['anonymous', 'user', 'admin'])\n .describe('Required auth level'),\n inputShape: z.string().describe('Description of input structure'),\n outputShape: z.string().describe('Description of output structure'),\n flags: z.array(z.string()).describe('Feature flags').default([]),\n possibleEvents: z\n .array(z.string())\n .describe('Events this may emit')\n .default([]),\n analytics: z\n .array(z.string())\n .describe('Analytics events to track')\n .default([]),\n });\n\n const prompt = buildOperationSpecPrompt(description, kind);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate event spec from description\n */\n async generateEventSpec(description: string) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string().describe('Dot notation name like \"domain.event_name\"'),\n version: z.number().int().positive().default(1),\n description: z.string().describe('When this event is emitted'),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n payloadShape: z.string().describe('Description of event payload'),\n piiFields: z.array(z.string()).describe('PII field paths').default([]),\n });\n\n const prompt = buildEventSpecPrompt(description);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate presentation spec from description\n */\n async generatePresentationSpec(description: string, kind: PresentationKind) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string(),\n version: z.number().int().positive().default(1),\n description: z.string(),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n componentKey: z.string().optional(),\n propsShape: z.string().optional(),\n content: z.string().optional(),\n mimeType: z.string().optional(),\n dataShape: z.string().optional(),\n });\n\n const prompt = buildPresentationSpecPrompt(description, kind);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate handler implementation from spec\n */\n async generateHandler(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildHandlerPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate React component from presentation spec\n */\n async generateComponent(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildComponentPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate form component from form spec\n */\n async generateForm(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildFormPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate tests for implementation\n */\n async generateTests(\n specCode: string,\n implementationCode: string,\n testType: 'handler' | 'component'\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildTestPrompt(specCode, implementationCode, testType),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Stream code generation for better UX\n */\n async streamCodeGeneration(\n prompt: string,\n onChunk: (text: string) => void\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await streamText({\n model,\n prompt,\n system: getCodeGenSystemPrompt(),\n });\n\n let fullText = '';\n\n for await (const chunk of result.textStream) {\n fullText += chunk;\n onChunk(chunk);\n }\n\n return fullText;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["config: Config"],"sources":["../../src/ai/client.ts"],"sourcesContent":["import { generateObject, generateText, streamText } from 'ai';\nimport * as z from 'zod';\nimport { getAIProvider } from './providers';\nimport type { Config } from '../types/config';\nimport {\n buildEventSpecPrompt,\n buildOperationSpecPrompt,\n buildPresentationSpecPrompt,\n getSystemPrompt,\n} from './prompts/spec-creation';\nimport {\n buildComponentPrompt,\n buildFormPrompt,\n buildHandlerPrompt,\n buildTestPrompt,\n getCodeGenSystemPrompt,\n} from './prompts/code-generation';\nimport type { OpKind, PresentationKind } from '../types';\n\n/**\n * AI Client for spec creation and code generation\n */\nexport class AIClient {\n constructor(private config: Config) {}\n\n /**\n * Generate operation spec from natural language description\n */\n async generateOperationSpec(description: string, kind: OpKind) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string().describe('Dot notation name like \"domain.operation\"'),\n version: z.number().int().positive().default(1),\n description: z.string().describe('Clear, concise summary'),\n goal: z.string().describe('Business purpose'),\n context: z.string().describe('Background and constraints'),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).describe('Team/person owners with @ prefix'),\n tags: z.array(z.string()).describe('Categorization tags'),\n auth: z\n .enum(['anonymous', 'user', 'admin'])\n .describe('Required auth level'),\n inputShape: z.string().describe('Description of input structure'),\n outputShape: z.string().describe('Description of output structure'),\n flags: z.array(z.string()).describe('Feature flags').default([]),\n possibleEvents: z\n .array(z.string())\n .describe('Events this may emit')\n .default([]),\n analytics: z\n .array(z.string())\n .describe('Analytics events to track')\n .default([]),\n });\n\n const prompt = buildOperationSpecPrompt(description, kind);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate event spec from description\n */\n async generateEventSpec(description: string) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string().describe('Dot notation name like \"domain.event_name\"'),\n version: z.number().int().positive().default(1),\n description: z.string().describe('When this event is emitted'),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n payloadShape: z.string().describe('Description of event payload'),\n piiFields: z.array(z.string()).describe('PII field paths').default([]),\n });\n\n const prompt = buildEventSpecPrompt(description);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate presentation spec from description\n */\n async generatePresentationSpec(description: string, kind: PresentationKind) {\n const model = getAIProvider(this.config);\n\n const schema = z.object({\n name: z.string(),\n version: z.number().int().positive().default(1),\n description: z.string(),\n stability: z\n .enum(['experimental', 'beta', 'stable', 'deprecated'])\n .default('beta'),\n owners: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n componentKey: z.string().optional(),\n propsShape: z.string().optional(),\n content: z.string().optional(),\n mimeType: z.string().optional(),\n dataShape: z.string().optional(),\n });\n\n const prompt = buildPresentationSpecPrompt(description, kind);\n\n const result = await generateObject({\n model,\n schema,\n prompt,\n system: getSystemPrompt(),\n });\n\n return result.object;\n }\n\n /**\n * Generate handler implementation from spec\n */\n async generateHandler(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildHandlerPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate React component from presentation spec\n */\n async generateComponent(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildComponentPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate form component from form spec\n */\n async generateForm(specCode: string): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildFormPrompt(specCode),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Generate tests for implementation\n */\n async generateTests(\n specCode: string,\n implementationCode: string,\n testType: 'handler' | 'component'\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n prompt: buildTestPrompt(specCode, implementationCode, testType),\n system: getCodeGenSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Stream code generation for better UX\n */\n async streamCodeGeneration(\n prompt: string,\n onChunk: (text: string) => void\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await streamText({\n model,\n prompt,\n system: getCodeGenSystemPrompt(),\n });\n\n let fullText = '';\n\n for await (const chunk of result.textStream) {\n fullText += chunk;\n onChunk(chunk);\n }\n\n return fullText;\n }\n\n /**\n * Chat with the AI model\n */\n async chat(\n messages: { role: 'system' | 'user' | 'assistant'; content: string }[],\n system?: string\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await generateText({\n model,\n messages,\n system: system || getSystemPrompt(),\n });\n\n return result.text;\n }\n\n /**\n * Stream chat with the AI model\n */\n async streamChat(\n messages: { role: 'system' | 'user' | 'assistant'; content: string }[],\n onChunk: (text: string) => void,\n system?: string\n ): Promise<string> {\n const model = getAIProvider(this.config);\n\n const result = await streamText({\n model,\n messages,\n system: system || getSystemPrompt(),\n });\n\n let fullText = '';\n\n for await (const chunk of result.textStream) {\n fullText += chunk;\n onChunk(chunk);\n }\n\n return fullText;\n }\n}\n"],"mappings":"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"}
|
package/dist/ai/index.d.ts
CHANGED
|
@@ -6,12 +6,4 @@ import { SimpleAgent } from "./agents/simple-agent.js";
|
|
|
6
6
|
import { CursorAgent } from "./agents/cursor-agent.js";
|
|
7
7
|
import { ClaudeCodeAgent } from "./agents/claude-code-agent.js";
|
|
8
8
|
import { OpenAICodexAgent } from "./agents/openai-codex-agent.js";
|
|
9
|
-
import { index_d_exports
|
|
10
|
-
|
|
11
|
-
//#region src/ai/index.d.ts
|
|
12
|
-
declare namespace index_d_exports {
|
|
13
|
-
export { AIClient, AgentConfig, AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, ClaudeCodeAgent, CursorAgent, OpenAICodexAgent, SimpleAgent, getAIProvider, getRecommendedModels, index_d_exports$1 as prompts, validateProvider };
|
|
14
|
-
}
|
|
15
|
-
//#endregion
|
|
16
|
-
export { index_d_exports };
|
|
17
|
-
//# sourceMappingURL=index.d.ts.map
|
|
9
|
+
import { index_d_exports } from "./prompts/index.js";
|
package/dist/ai/index.js
CHANGED
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
import { __exportAll } from "../_virtual/rolldown_runtime.js";
|
|
2
1
|
import { getAIProvider, getRecommendedModels, validateProvider } from "./providers.js";
|
|
3
|
-
import { AIClient } from "./client.js";
|
|
4
2
|
import { SimpleAgent } from "./agents/simple-agent.js";
|
|
5
3
|
import { CursorAgent } from "./agents/cursor-agent.js";
|
|
6
4
|
import { ClaudeCodeAgent } from "./agents/claude-code-agent.js";
|
|
7
5
|
import { OpenAICodexAgent } from "./agents/openai-codex-agent.js";
|
|
8
6
|
import { AgentOrchestrator } from "./agents/orchestrator.js";
|
|
7
|
+
import { AIClient } from "./client.js";
|
|
9
8
|
import "./agents/index.js";
|
|
10
9
|
import { prompts_exports } from "./prompts/index.js";
|
|
11
|
-
|
|
12
|
-
//#region src/ai/index.ts
|
|
13
|
-
var ai_exports = /* @__PURE__ */ __exportAll({
|
|
14
|
-
AIClient: () => AIClient,
|
|
15
|
-
AgentOrchestrator: () => AgentOrchestrator,
|
|
16
|
-
ClaudeCodeAgent: () => ClaudeCodeAgent,
|
|
17
|
-
CursorAgent: () => CursorAgent,
|
|
18
|
-
OpenAICodexAgent: () => OpenAICodexAgent,
|
|
19
|
-
SimpleAgent: () => SimpleAgent,
|
|
20
|
-
getAIProvider: () => getAIProvider,
|
|
21
|
-
getRecommendedModels: () => getRecommendedModels,
|
|
22
|
-
prompts: () => prompts_exports,
|
|
23
|
-
validateProvider: () => validateProvider
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
//#endregion
|
|
27
|
-
export { ai_exports };
|
|
28
|
-
//# sourceMappingURL=index.js.map
|
package/dist/ai/prompts/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __exportAll } from "../../_virtual/rolldown_runtime.js";
|
|
2
|
-
import { spec_creation_exports } from "./spec-creation.js";
|
|
3
2
|
import { code_generation_exports } from "./code-generation.js";
|
|
3
|
+
import { spec_creation_exports } from "./spec-creation.js";
|
|
4
4
|
|
|
5
5
|
//#region src/ai/prompts/index.ts
|
|
6
6
|
var prompts_exports = /* @__PURE__ */ __exportAll({
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { __exportAll, __reExport } from "./_virtual/rolldown_runtime.js";
|
|
2
1
|
import { DiscoverOptions, FileStat, FsAdapter } from "./ports/fs.js";
|
|
3
2
|
import { GitAdapter, GitCleanOptions } from "./ports/git.js";
|
|
4
3
|
import { WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, Watcher, WatcherAdapter } from "./ports/watcher.js";
|
|
@@ -14,12 +13,15 @@ import { CreateAdaptersOptions, createNodeAdapters } from "./adapters/factory.js
|
|
|
14
13
|
import { MetaRepoInfo, PackageManager, RepositoryType, SubmoduleInfo, WorkspaceInfo, detectPackageManager, detectRepositoryType, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, getExecCommand, getInstallCommand, getMetaRepoInfo, getPackageName, getRunCommand, getWorkspaceInfo, getWorkspacePackages, isMonorepo, parseGitModules } from "./adapters/workspace.js";
|
|
15
14
|
import "./adapters/index.js";
|
|
16
15
|
import { AgentMode, AiProvider, Config } from "./types/config.js";
|
|
17
|
-
import { ValidateSpecOptions, ValidateSpecResult, validateSpec, validateSpecs } from "./services/validate.js";
|
|
18
|
-
import { ValidateImplementationOptions, ValidateImplementationResult, validateImplementationFiles } from "./services/validate-
|
|
16
|
+
import { ValidateSpecOptions, ValidateSpecResult, validateSpec, validateSpecs } from "./services/validate/spec-validator.js";
|
|
17
|
+
import { ValidateImplementationOptions, ValidateImplementationResult, validateImplementationFiles } from "./services/validate/implementation-validator.js";
|
|
18
|
+
import { BlueprintValidationResult, validateBlueprint } from "./services/validate/blueprint-validator.js";
|
|
19
|
+
import { TenantValidationContext, TenantValidationResult, validateTenantConfig } from "./services/validate/tenant-validator.js";
|
|
20
|
+
import { ImplementationValidationResult, ImplementationValidatorOptions, validateImplementationWithAgent } from "./services/validate/implementation-agent-validator.js";
|
|
19
21
|
import { CompareSpecsOptions, CompareSpecsResult, compareSpecs } from "./services/diff.js";
|
|
20
22
|
import { AnalyzeDepsOptions, AnalyzeDepsResult, analyzeDeps, exportGraphAsDot, getContractNode, getGraphStats } from "./services/deps.js";
|
|
21
23
|
import { ListSpecsOptions, groupSpecsByType, listSpecs } from "./services/list.js";
|
|
22
|
-
import { getApiKey, loadWorkspaceConfig
|
|
24
|
+
import { getApiKey, loadWorkspaceConfig } from "./services/config.js";
|
|
23
25
|
import { BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, buildSpec } from "./services/build.js";
|
|
24
26
|
import { OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult } from "./services/openapi/types.js";
|
|
25
27
|
import { importFromOpenApiService } from "./services/openapi/import-service.js";
|
|
@@ -30,11 +32,12 @@ import { RegistryClient, RegistryClientOptions, addToRegistry, listFromRegistry,
|
|
|
30
32
|
import { SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, syncSpecs } from "./services/sync.js";
|
|
31
33
|
import { WatchBuildFn, WatchSpecsOptions, WatchValidateFn, watchSpecs } from "./services/watch.js";
|
|
32
34
|
import { CleanOptions, CleanResult, cleanArtifacts } from "./services/clean.js";
|
|
33
|
-
import { RunTestsResult,
|
|
35
|
+
import { RunTestsResult, TestServiceOptions, TestServiceResult, runTestSpecs, runTests } from "./services/test/test-service.js";
|
|
34
36
|
import { CreateRegeneratorOptions, createRegeneratorService } from "./services/regenerator.js";
|
|
35
37
|
import { ExtendedWorkspaceInfo, MonorepoConfig, findAllConfigFiles, formatWorkspaceInfo, getExtendedWorkspaceInfo, mergeMonorepoConfigs } from "./services/workspace-info.js";
|
|
36
38
|
import { CoverageByType, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, SpecInventory, SpecLocation, analyzeIntegrity, filterIssuesBySeverity, filterIssuesByType, getAllSpecs } from "./services/integrity.js";
|
|
37
39
|
import { DiagramOptions, DiagramType, generateMermaidDiagram } from "./services/integrity-diagram.js";
|
|
40
|
+
import { LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, WorkspaceConfigInfo, createEmptyLayerInventory, discoverLayers, getAllLayerLocations } from "./services/layer-discovery.js";
|
|
38
41
|
import { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget } from "./services/setup/types.js";
|
|
39
42
|
import { runSetup } from "./services/setup/setup-service.js";
|
|
40
43
|
import { generateAgentsMd, generateClaudeMcpConfig, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateVscodeSettings, getClaudeDesktopConfigPath } from "./services/setup/config-generators.js";
|
|
@@ -49,6 +52,24 @@ import { ClaudeCodeAdapter, claudeCodeAdapter } from "./services/agent-guide/ada
|
|
|
49
52
|
import { CursorCLIAdapter, cursorCLIAdapter } from "./services/agent-guide/adapters/cursor-cli.js";
|
|
50
53
|
import { GenericMCPAdapter, genericMCPAdapter } from "./services/agent-guide/adapters/generic-mcp.js";
|
|
51
54
|
import { agentAdapters, getAgentAdapter, listAgentTypes } from "./services/agent-guide/adapters/index.js";
|
|
55
|
+
import { VerificationIssue, formatVerificationReport, verifyImplementationAgainstParsedSpec } from "./services/llm/verify-static.js";
|
|
56
|
+
import { exportSpecForLLM, generateCursorRulesFromParsedSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec } from "./services/llm/index.js";
|
|
57
|
+
import { AIGenerator } from "./services/create/ai-generator.js";
|
|
58
|
+
import { generateOperationSpec } from "./templates/operation.template.js";
|
|
59
|
+
import { generateEventSpec } from "./templates/event.template.js";
|
|
60
|
+
import { generatePresentationSpec } from "./templates/presentation.template.js";
|
|
61
|
+
import { generateWorkflowSpec } from "./templates/workflow.template.js";
|
|
62
|
+
import { generateMigrationSpec } from "./templates/migration.template.js";
|
|
63
|
+
import { generateTelemetrySpec } from "./templates/telemetry.template.js";
|
|
64
|
+
import { generateExperimentSpec } from "./templates/experiment.template.js";
|
|
65
|
+
import { generateAppBlueprintSpec } from "./templates/app-config.template.js";
|
|
66
|
+
import { generateDataViewSpec } from "./templates/data-view.template.js";
|
|
67
|
+
import { generateIntegrationSpec } from "./templates/integration.template.js";
|
|
68
|
+
import { generateKnowledgeSpaceSpec } from "./templates/knowledge.template.js";
|
|
69
|
+
import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "./templates/handler.template.js";
|
|
70
|
+
import { generateWorkflowRunnerTemplate } from "./templates/workflow-runner.template.js";
|
|
71
|
+
import { index_d_exports as index_d_exports$3 } from "./templates/index.js";
|
|
72
|
+
import { SpecCreatorService, createSpecCreator } from "./services/create/index.js";
|
|
52
73
|
import { AIReviewResult, BehaviorCheck, FieldMapping, FieldMatchType, IntentAlignment, SemanticVerificationResult, StructureCheck, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult } from "./services/verify/types.js";
|
|
53
74
|
import { VerifyService, createVerifyService, verifyService } from "./services/verify/verify-service.js";
|
|
54
75
|
import { verifyStructure } from "./services/verify/structure-verifier.js";
|
|
@@ -65,18 +86,20 @@ import { KeyValueStore, WorkspaceStateCacheStorage, createWorkspaceStateCacheSto
|
|
|
65
86
|
import { PackageInstallResult, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult } from "./services/quickstart/types.js";
|
|
66
87
|
import { FULL_DEPENDENCIES, MINIMAL_DEPENDENCIES, getDependencies, getDevDependencies, getProductionDependencies } from "./services/quickstart/dependencies.js";
|
|
67
88
|
import { formatQuickstartPreview, isContractSpecInstalled, runQuickstart } from "./services/quickstart/quickstart-service.js";
|
|
68
|
-
import {
|
|
89
|
+
import { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs } from "./services/docs/docs-service.js";
|
|
90
|
+
import { index_d_exports as index_d_exports$1 } from "./services/impact/index.js";
|
|
91
|
+
import { FormatterOptions, formatFiles } from "./services/formatter.js";
|
|
69
92
|
import "./services/index.js";
|
|
70
|
-
import { index_d_exports
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
import
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
93
|
+
import { index_d_exports } from "./formatters/index.js";
|
|
94
|
+
import { AIClient } from "./ai/client.js";
|
|
95
|
+
import { getAIProvider, getRecommendedModels, validateProvider } from "./ai/providers.js";
|
|
96
|
+
import { AgentConfig, AgentProvider, AgentResult, AgentTask } from "./ai/agents/types.js";
|
|
97
|
+
import { AgentOrchestrator } from "./ai/agents/orchestrator.js";
|
|
98
|
+
import { SimpleAgent } from "./ai/agents/simple-agent.js";
|
|
99
|
+
import { CursorAgent } from "./ai/agents/cursor-agent.js";
|
|
100
|
+
import { ClaudeCodeAgent } from "./ai/agents/claude-code-agent.js";
|
|
101
|
+
import { OpenAICodexAgent } from "./ai/agents/openai-codex-agent.js";
|
|
102
|
+
import { index_d_exports as index_d_exports$2 } from "./ai/prompts/index.js";
|
|
103
|
+
import "./ai/index.js";
|
|
104
|
+
import * as module from "@contractspec/module.workspace";
|
|
105
|
+
export { AIClient, AIGenerator, AIReviewResult, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentAdapter, AgentConfig, AgentGuideConfig, AgentGuideService, type AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, AiAdapter, AiGenerateOptions, AiGenerateResult, AiGenerateStructuredOptions, type AiProvider, AiValidationResult, AnalyzeDepsOptions, AnalyzeDepsResult, BehaviorCheck, BlueprintValidationResult, BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, CHECK_CATEGORY_LABELS, CICheckCategory, CICheckCategorySummary, CICheckOptions, CICheckResult, CIFormatOptions, CIIssue, CIIssueSeverity, CIOutputFormat, CI_CHECK_CATEGORY_LABELS, CacheEntryMeta, CacheKeyString, CacheLookupResult, CacheMissReason, CacheStats, CacheStorageAdapter, CheckCategory, CheckContext, CheckResult, CheckStatus, ClaudeCodeAdapter, ClaudeCodeAgent, CleanOptions, CleanResult, CompareSpecsOptions, CompareSpecsResult, type Config, CoverageByType, CreateAdaptersOptions, CreateRegeneratorOptions, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DiagramOptions, DiagramType, DiscoverOptions, DiscoveryOptions, DocsServiceOptions, DocsServiceResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult, ExtendedWorkspaceInfo, FULL_DEPENDENCIES, FieldMapping, FieldMatchType, FileStat, FileSystemCacheStorage, FixAction, FixResult, FormatOptions, FormatterOptions, FsAdapter, GenericMCPAdapter, GitAdapter, GitCleanOptions, GuideOptions, GuideResult, ImplementationSource, ImplementationStatus, ImplementationValidationResult, ImplementationValidatorOptions, InMemoryCacheStorage, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, IntentAlignment, KeyValueStore, LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, OpenApiExportOptions as LegacyOpenApiExportOptions, OpenApiExportResult as LegacyOpenApiExportResult, ListSpecsOptions, LogLevel, LoggerAdapter, MINIMAL_DEPENDENCIES, MetaRepoInfo, MonorepoConfig, OpenAICodexAgent, OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult, PackageInstallResult, PackageManager, ProgressReporter, ProgressUpdate, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult, RegistryClient, RegistryClientOptions, RepositoryType, ResolvedImplementation, ResolverOptions, RunTestsResult, SETUP_TARGET_LABELS, SemanticVerificationResult, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget, SimpleAgent, SpecCreatorService, SpecImplementationResult, SpecInventory, SpecLocation, SpecReferenceMatch, StructureCheck, SubmoduleInfo, SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, TenantValidationContext, TenantValidationResult, TestServiceOptions, TestServiceResult, ValidateImplementationOptions, ValidateImplementationResult, ValidateSpecOptions, ValidateSpecResult, VerificationCacheConfig, VerificationCacheEntry, VerificationCacheKey, VerificationCacheService, VerificationIssue, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult, VerifyService, WatchBuildFn, WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, WatchSpecsOptions, WatchValidateFn, Watcher, WatcherAdapter, WorkspaceAdapters, WorkspaceConfigInfo, WorkspaceInfo, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, index_d_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, index_d_exports$1 as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, index_d_exports$2 as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, index_d_exports$3 as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, watchSpecs };
|