@contractspec/bundle.workspace 1.44.1 → 1.45.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/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
|
@@ -7,20 +7,10 @@ import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
|
7
7
|
* Load workspace configuration from .contractsrc.json.
|
|
8
8
|
*/
|
|
9
9
|
declare function loadWorkspaceConfig(fs: FsAdapter, cwd?: string): Promise<WorkspaceConfig>;
|
|
10
|
-
/**
|
|
11
|
-
* Merge config with CLI options and environment variables.
|
|
12
|
-
*/
|
|
13
|
-
declare function mergeWorkspaceConfig(config: WorkspaceConfig, options: {
|
|
14
|
-
provider?: string;
|
|
15
|
-
model?: string;
|
|
16
|
-
agentMode?: string;
|
|
17
|
-
endpoint?: string;
|
|
18
|
-
outputDir?: string;
|
|
19
|
-
}): WorkspaceConfig;
|
|
20
10
|
/**
|
|
21
11
|
* Get API key for the configured provider.
|
|
22
12
|
*/
|
|
23
13
|
declare function getApiKey(provider: WorkspaceConfig['aiProvider']): string | undefined;
|
|
24
14
|
//#endregion
|
|
25
|
-
export { getApiKey, loadWorkspaceConfig
|
|
15
|
+
export { getApiKey, loadWorkspaceConfig };
|
|
26
16
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAoCU,iBAHY,mBAAA,CAGZ,EAAA,EAFJ,SAEI,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAP,OAAO,CAAC,eAAD,CAAA;AAoBV
|
|
1
|
+
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAoCU,iBAHY,mBAAA,CAGZ,EAAA,EAFJ,SAEI,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAP,OAAO,CAAC,eAAD,CAAA;AAoBV;;;iBAAgB,SAAA,WACJ"}
|
package/dist/services/config.js
CHANGED
|
@@ -19,7 +19,7 @@ const ConfigSchema = z.object({
|
|
|
19
19
|
"claude-code",
|
|
20
20
|
"openai-codex"
|
|
21
21
|
]).default("simple"),
|
|
22
|
-
customEndpoint: z.
|
|
22
|
+
customEndpoint: z.url().nullable().optional(),
|
|
23
23
|
customApiKey: z.string().nullable().optional(),
|
|
24
24
|
outputDir: z.string().default("./src"),
|
|
25
25
|
conventions: z.object({
|
|
@@ -46,20 +46,6 @@ async function loadWorkspaceConfig(fs, cwd) {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* Merge config with CLI options and environment variables.
|
|
50
|
-
*/
|
|
51
|
-
function mergeWorkspaceConfig(config, options) {
|
|
52
|
-
return {
|
|
53
|
-
...config,
|
|
54
|
-
aiProvider: options.provider ?? process.env["CONTRACTSPEC_AI_PROVIDER"] ?? config.aiProvider,
|
|
55
|
-
aiModel: options.model ?? process.env["CONTRACTSPEC_AI_MODEL"] ?? config.aiModel,
|
|
56
|
-
agentMode: options.agentMode ?? process.env["CONTRACTSPEC_AGENT_MODE"] ?? config.agentMode,
|
|
57
|
-
customEndpoint: options.endpoint ?? process.env["CONTRACTSPEC_LLM_ENDPOINT"] ?? config.customEndpoint ?? void 0,
|
|
58
|
-
customApiKey: process.env["CONTRACTSPEC_LLM_API_KEY"] ?? config.customApiKey ?? void 0,
|
|
59
|
-
outputDir: options.outputDir ?? config.outputDir
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
49
|
* Get API key for the configured provider.
|
|
64
50
|
*/
|
|
65
51
|
function getApiKey(provider) {
|
|
@@ -73,5 +59,5 @@ function getApiKey(provider) {
|
|
|
73
59
|
}
|
|
74
60
|
|
|
75
61
|
//#endregion
|
|
76
|
-
export { getApiKey, loadWorkspaceConfig
|
|
62
|
+
export { getApiKey, loadWorkspaceConfig };
|
|
77
63
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":["/**\n * Workspace configuration service.\n */\n\nimport * as z from 'zod';\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { DEFAULT_WORKSPACE_CONFIG } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\n\nconst ConfigSchema = z.object({\n aiProvider: z\n .enum(['claude', 'openai', 'ollama', 'custom'])\n .default('claude'),\n aiModel: z.string().optional(),\n agentMode: z\n .enum(['simple', 'cursor', 'claude-code', 'openai-codex'])\n .default('simple'),\n customEndpoint: z.
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":["/**\n * Workspace configuration service.\n */\n\nimport * as z from 'zod';\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { DEFAULT_WORKSPACE_CONFIG } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\n\nconst ConfigSchema = z.object({\n aiProvider: z\n .enum(['claude', 'openai', 'ollama', 'custom'])\n .default('claude'),\n aiModel: z.string().optional(),\n agentMode: z\n .enum(['simple', 'cursor', 'claude-code', 'openai-codex'])\n .default('simple'),\n customEndpoint: z.url().nullable().optional(),\n customApiKey: z.string().nullable().optional(),\n outputDir: z.string().default('./src'),\n conventions: z.object({\n operations: z.string().default('interactions/commands|queries'),\n events: z.string().default('events'),\n presentations: z.string().default('presentations'),\n forms: z.string().default('forms'),\n }),\n defaultOwners: z.array(z.string()).default([]),\n defaultTags: z.array(z.string()).default([]),\n});\n\n/**\n * Load workspace configuration from .contractsrc.json.\n */\nexport async function loadWorkspaceConfig(\n fs: FsAdapter,\n cwd?: string\n): Promise<WorkspaceConfig> {\n const configPath = fs.join(cwd ?? '.', '.contractsrc.json');\n\n const exists = await fs.exists(configPath);\n if (!exists) {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n\n try {\n const content = await fs.readFile(configPath);\n const parsed = JSON.parse(content);\n return ConfigSchema.parse(parsed) as WorkspaceConfig;\n } catch {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n}\n\n/**\n * Get API key for the configured provider.\n */\nexport function getApiKey(\n provider: WorkspaceConfig['aiProvider']\n): string | undefined {\n switch (provider) {\n case 'claude':\n return process.env['ANTHROPIC_API_KEY'];\n case 'openai':\n return process.env['OPENAI_API_KEY'];\n case 'custom':\n return process.env['CONTRACTSPEC_LLM_API_KEY'];\n case 'ollama':\n return undefined; // Ollama doesn't need API key for local\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;;;;AASA,MAAM,eAAe,EAAE,OAAO;CAC5B,YAAY,EACT,KAAK;EAAC;EAAU;EAAU;EAAU;EAAS,CAAC,CAC9C,QAAQ,SAAS;CACpB,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,WAAW,EACR,KAAK;EAAC;EAAU;EAAU;EAAe;EAAe,CAAC,CACzD,QAAQ,SAAS;CACpB,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU;CAC7C,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC9C,WAAW,EAAE,QAAQ,CAAC,QAAQ,QAAQ;CACtC,aAAa,EAAE,OAAO;EACpB,YAAY,EAAE,QAAQ,CAAC,QAAQ,gCAAgC;EAC/D,QAAQ,EAAE,QAAQ,CAAC,QAAQ,SAAS;EACpC,eAAe,EAAE,QAAQ,CAAC,QAAQ,gBAAgB;EAClD,OAAO,EAAE,QAAQ,CAAC,QAAQ,QAAQ;EACnC,CAAC;CACF,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9C,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC7C,CAAC;;;;AAKF,eAAsB,oBACpB,IACA,KAC0B;CAC1B,MAAM,aAAa,GAAG,KAAK,OAAO,KAAK,oBAAoB;AAG3D,KAAI,CADW,MAAM,GAAG,OAAO,WAAW,CAExC,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,WAAW;EAC7C,MAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,SAAO,aAAa,MAAM,OAAO;SAC3B;AACN,SAAO;;;;;;AAOX,SAAgB,UACd,UACoB;AACpB,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH;EACF,QACE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { PresentationKind, WorkspaceConfig } from "@contractspec/module.workspace";
|
|
2
|
+
import { OpKind } from "@contractspec/lib.contracts";
|
|
3
|
+
|
|
4
|
+
//#region src/services/create/ai-generator.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* AI Generator Service
|
|
8
|
+
*/
|
|
9
|
+
declare class AIGenerator {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: WorkspaceConfig);
|
|
12
|
+
private getModel;
|
|
13
|
+
/**
|
|
14
|
+
* Generate operation spec from natural language description
|
|
15
|
+
*/
|
|
16
|
+
generateOperationSpec(description: string, kind: OpKind): Promise<{
|
|
17
|
+
name: string;
|
|
18
|
+
version: number;
|
|
19
|
+
description: string;
|
|
20
|
+
goal: string;
|
|
21
|
+
context: string;
|
|
22
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
23
|
+
owners: string[];
|
|
24
|
+
tags: string[];
|
|
25
|
+
auth: "anonymous" | "user" | "admin";
|
|
26
|
+
inputShape: string;
|
|
27
|
+
outputShape: string;
|
|
28
|
+
flags: string[];
|
|
29
|
+
possibleEvents: string[];
|
|
30
|
+
analytics: string[];
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Generate event spec from description
|
|
34
|
+
*/
|
|
35
|
+
generateEventSpec(description: string): Promise<{
|
|
36
|
+
name: string;
|
|
37
|
+
version: number;
|
|
38
|
+
description: string;
|
|
39
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
40
|
+
owners: string[];
|
|
41
|
+
tags: string[];
|
|
42
|
+
payloadShape: string;
|
|
43
|
+
piiFields: string[];
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Generate presentation spec from description
|
|
47
|
+
*/
|
|
48
|
+
generatePresentationSpec(description: string, kind: PresentationKind): Promise<{
|
|
49
|
+
name: string;
|
|
50
|
+
version: number;
|
|
51
|
+
description: string;
|
|
52
|
+
stability: "experimental" | "beta" | "stable" | "deprecated";
|
|
53
|
+
owners: string[];
|
|
54
|
+
tags: string[];
|
|
55
|
+
componentKey?: string | undefined;
|
|
56
|
+
propsShape?: string | undefined;
|
|
57
|
+
content?: string | undefined;
|
|
58
|
+
mimeType?: string | undefined;
|
|
59
|
+
dataShape?: string | undefined;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Generate handler implementation from spec
|
|
63
|
+
*/
|
|
64
|
+
generateHandler(specCode: string): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Generate React component from presentation spec
|
|
67
|
+
*/
|
|
68
|
+
generateComponent(specCode: string): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Generate form component from form spec
|
|
71
|
+
*/
|
|
72
|
+
generateForm(specCode: string): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Generate tests for implementation
|
|
75
|
+
*/
|
|
76
|
+
generateTests(specCode: string, implementationCode: string, testType: 'handler' | 'component'): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Stream code generation for better UX
|
|
79
|
+
*/
|
|
80
|
+
streamCodeGeneration(prompt: string, onChunk: (text: string) => void): Promise<string>;
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { AIGenerator };
|
|
84
|
+
//# sourceMappingURL=ai-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-generator.d.ts","names":[],"sources":["../../../src/services/create/ai-generator.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAsI4E,cApG/D,WAAA,CAoG+D;EAkCjC,QAAA,MAAA;EAeE,WAAA,CAAA,MAAA,EApJf,eAoJe;EAeL,QAAA,QAAA;EAmBnC;;;mDA/JoD,SAAM;;;;;;;;;;;;;;;;;;;0CA6ClB;;;;;;;;;;;;;sDA+Be,mBAAgB;;;;;;;;;;;;;;;;qCAkCjC;;;;uCAeE;;;;kCAeL;;;;kGAmBnC;;;;yEAkBA"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { getApiKey } from "../config.js";
|
|
2
|
+
import { buildComponentPrompt, buildEventSpecPrompt, buildFormPrompt, buildHandlerPrompt, buildOperationSpecPrompt, buildPresentationSpecPrompt, buildTestPrompt, getCodeGenSystemPrompt, getSystemPrompt } from "@contractspec/module.workspace";
|
|
3
|
+
import { generateObject, generateText, streamText } from "ai";
|
|
4
|
+
import { createProvider } from "@contractspec/lib.ai-providers";
|
|
5
|
+
import * as z from "zod";
|
|
6
|
+
|
|
7
|
+
//#region src/services/create/ai-generator.ts
|
|
8
|
+
/**
|
|
9
|
+
* AI Generator Service
|
|
10
|
+
*
|
|
11
|
+
* Generates specs and code using AI models.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* AI Generator Service
|
|
15
|
+
*/
|
|
16
|
+
var AIGenerator = class {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
getModel() {
|
|
21
|
+
const providerName = this.config.aiProvider;
|
|
22
|
+
const apiKey = this.config.customApiKey || getApiKey(this.config.aiProvider);
|
|
23
|
+
return createProvider({
|
|
24
|
+
provider: providerName === "custom" ? "openai" : providerName,
|
|
25
|
+
model: this.config.aiModel,
|
|
26
|
+
apiKey,
|
|
27
|
+
baseUrl: this.config.customEndpoint || void 0
|
|
28
|
+
}).getModel();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate operation spec from natural language description
|
|
32
|
+
*/
|
|
33
|
+
async generateOperationSpec(description, kind) {
|
|
34
|
+
return (await generateObject({
|
|
35
|
+
model: this.getModel(),
|
|
36
|
+
schema: z.object({
|
|
37
|
+
name: z.string().describe("Dot notation name like \"domain.operation\""),
|
|
38
|
+
version: z.number().int().positive().default(1),
|
|
39
|
+
description: z.string().describe("Clear, concise summary"),
|
|
40
|
+
goal: z.string().describe("Business purpose"),
|
|
41
|
+
context: z.string().describe("Background and constraints"),
|
|
42
|
+
stability: z.enum([
|
|
43
|
+
"experimental",
|
|
44
|
+
"beta",
|
|
45
|
+
"stable",
|
|
46
|
+
"deprecated"
|
|
47
|
+
]).default("beta"),
|
|
48
|
+
owners: z.array(z.string()).describe("Team/person owners with @ prefix"),
|
|
49
|
+
tags: z.array(z.string()).describe("Categorization tags"),
|
|
50
|
+
auth: z.enum([
|
|
51
|
+
"anonymous",
|
|
52
|
+
"user",
|
|
53
|
+
"admin"
|
|
54
|
+
]).describe("Required auth level"),
|
|
55
|
+
inputShape: z.string().describe("Description of input structure"),
|
|
56
|
+
outputShape: z.string().describe("Description of output structure"),
|
|
57
|
+
flags: z.array(z.string()).describe("Feature flags").default([]),
|
|
58
|
+
possibleEvents: z.array(z.string()).describe("Events this may emit").default([]),
|
|
59
|
+
analytics: z.array(z.string()).describe("Analytics events to track").default([])
|
|
60
|
+
}),
|
|
61
|
+
prompt: buildOperationSpecPrompt(description, kind),
|
|
62
|
+
system: getSystemPrompt()
|
|
63
|
+
})).object;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate event spec from description
|
|
67
|
+
*/
|
|
68
|
+
async generateEventSpec(description) {
|
|
69
|
+
return (await generateObject({
|
|
70
|
+
model: this.getModel(),
|
|
71
|
+
schema: z.object({
|
|
72
|
+
name: z.string().describe("Dot notation name like \"domain.event_name\""),
|
|
73
|
+
version: z.number().int().positive().default(1),
|
|
74
|
+
description: z.string().describe("When this event is emitted"),
|
|
75
|
+
stability: z.enum([
|
|
76
|
+
"experimental",
|
|
77
|
+
"beta",
|
|
78
|
+
"stable",
|
|
79
|
+
"deprecated"
|
|
80
|
+
]).default("beta"),
|
|
81
|
+
owners: z.array(z.string()).default([]),
|
|
82
|
+
tags: z.array(z.string()).default([]),
|
|
83
|
+
payloadShape: z.string().describe("Description of event payload"),
|
|
84
|
+
piiFields: z.array(z.string()).describe("PII field paths").default([])
|
|
85
|
+
}),
|
|
86
|
+
prompt: buildEventSpecPrompt(description),
|
|
87
|
+
system: getSystemPrompt()
|
|
88
|
+
})).object;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate presentation spec from description
|
|
92
|
+
*/
|
|
93
|
+
async generatePresentationSpec(description, kind) {
|
|
94
|
+
return (await generateObject({
|
|
95
|
+
model: this.getModel(),
|
|
96
|
+
schema: z.object({
|
|
97
|
+
name: z.string(),
|
|
98
|
+
version: z.number().int().positive().default(1),
|
|
99
|
+
description: z.string(),
|
|
100
|
+
stability: z.enum([
|
|
101
|
+
"experimental",
|
|
102
|
+
"beta",
|
|
103
|
+
"stable",
|
|
104
|
+
"deprecated"
|
|
105
|
+
]).default("beta"),
|
|
106
|
+
owners: z.array(z.string()).default([]),
|
|
107
|
+
tags: z.array(z.string()).default([]),
|
|
108
|
+
componentKey: z.string().optional(),
|
|
109
|
+
propsShape: z.string().optional(),
|
|
110
|
+
content: z.string().optional(),
|
|
111
|
+
mimeType: z.string().optional(),
|
|
112
|
+
dataShape: z.string().optional()
|
|
113
|
+
}),
|
|
114
|
+
prompt: buildPresentationSpecPrompt(description, kind),
|
|
115
|
+
system: getSystemPrompt()
|
|
116
|
+
})).object;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate handler implementation from spec
|
|
120
|
+
*/
|
|
121
|
+
async generateHandler(specCode) {
|
|
122
|
+
return (await generateText({
|
|
123
|
+
model: this.getModel(),
|
|
124
|
+
prompt: buildHandlerPrompt(specCode),
|
|
125
|
+
system: getCodeGenSystemPrompt()
|
|
126
|
+
})).text;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate React component from presentation spec
|
|
130
|
+
*/
|
|
131
|
+
async generateComponent(specCode) {
|
|
132
|
+
return (await generateText({
|
|
133
|
+
model: this.getModel(),
|
|
134
|
+
prompt: buildComponentPrompt(specCode),
|
|
135
|
+
system: getCodeGenSystemPrompt()
|
|
136
|
+
})).text;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate form component from form spec
|
|
140
|
+
*/
|
|
141
|
+
async generateForm(specCode) {
|
|
142
|
+
return (await generateText({
|
|
143
|
+
model: this.getModel(),
|
|
144
|
+
prompt: buildFormPrompt(specCode),
|
|
145
|
+
system: getCodeGenSystemPrompt()
|
|
146
|
+
})).text;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Generate tests for implementation
|
|
150
|
+
*/
|
|
151
|
+
async generateTests(specCode, implementationCode, testType) {
|
|
152
|
+
return (await generateText({
|
|
153
|
+
model: this.getModel(),
|
|
154
|
+
prompt: buildTestPrompt(specCode, implementationCode, testType),
|
|
155
|
+
system: getCodeGenSystemPrompt()
|
|
156
|
+
})).text;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Stream code generation for better UX
|
|
160
|
+
*/
|
|
161
|
+
async streamCodeGeneration(prompt, onChunk) {
|
|
162
|
+
const result = await streamText({
|
|
163
|
+
model: this.getModel(),
|
|
164
|
+
prompt,
|
|
165
|
+
system: getCodeGenSystemPrompt()
|
|
166
|
+
});
|
|
167
|
+
let fullText = "";
|
|
168
|
+
for await (const chunk of result.textStream) {
|
|
169
|
+
fullText += chunk;
|
|
170
|
+
onChunk(chunk);
|
|
171
|
+
}
|
|
172
|
+
return fullText;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
//#endregion
|
|
177
|
+
export { AIGenerator };
|
|
178
|
+
//# sourceMappingURL=ai-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-generator.js","names":["config: WorkspaceConfig"],"sources":["../../../src/services/create/ai-generator.ts"],"sourcesContent":["/**\n * AI Generator Service\n *\n * Generates specs and code using AI models.\n */\n\nimport { generateObject, generateText, streamText } from 'ai';\nimport * as z from 'zod';\nimport {\n createProvider,\n type ProviderConfig,\n type ProviderName,\n} from '@contractspec/lib.ai-providers';\nimport {\n type WorkspaceConfig,\n type PresentationKind,\n} from '@contractspec/module.workspace';\nimport type { OpKind } from '@contractspec/lib.contracts';\nimport {\n buildOperationSpecPrompt,\n buildEventSpecPrompt,\n buildPresentationSpecPrompt,\n getSystemPrompt,\n buildHandlerPrompt,\n buildComponentPrompt,\n buildFormPrompt,\n buildTestPrompt,\n getCodeGenSystemPrompt,\n} from '@contractspec/module.workspace';\nimport { getApiKey } from '../config';\n\n/**\n * AI Generator Service\n */\nexport class AIGenerator {\n constructor(private config: WorkspaceConfig) {}\n\n private getModel() {\n const providerName = this.config.aiProvider as ProviderName;\n const apiKey =\n this.config.customApiKey || getApiKey(this.config.aiProvider);\n\n // Map WorkspaceConfig to ProviderConfig\n const providerConfig: ProviderConfig = {\n provider: (providerName as string) === 'custom' ? 'openai' : providerName, // Fallback custom to openai compatible\n\n model: this.config.aiModel,\n apiKey: apiKey,\n baseUrl: this.config.customEndpoint || undefined,\n };\n\n const provider = createProvider(providerConfig);\n return provider.getModel();\n }\n\n /**\n * Generate operation spec from natural language description\n */\n async generateOperationSpec(description: string, kind: OpKind) {\n const model = this.getModel();\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 = this.getModel();\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 = this.getModel();\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 = this.getModel();\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 = this.getModel();\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 = this.getModel();\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 = this.getModel();\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 = this.getModel();\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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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AIGenerator } from "./ai-generator.js";
|
|
2
|
+
import { generateOperationSpec } from "../../templates/operation.template.js";
|
|
3
|
+
import { generateEventSpec } from "../../templates/event.template.js";
|
|
4
|
+
import { generatePresentationSpec } from "../../templates/presentation.template.js";
|
|
5
|
+
import { generateWorkflowSpec } from "../../templates/workflow.template.js";
|
|
6
|
+
import { generateMigrationSpec } from "../../templates/migration.template.js";
|
|
7
|
+
import { generateTelemetrySpec } from "../../templates/telemetry.template.js";
|
|
8
|
+
import { generateExperimentSpec } from "../../templates/experiment.template.js";
|
|
9
|
+
import { generateAppBlueprintSpec } from "../../templates/app-config.template.js";
|
|
10
|
+
import { generateDataViewSpec } from "../../templates/data-view.template.js";
|
|
11
|
+
import { generateIntegrationSpec } from "../../templates/integration.template.js";
|
|
12
|
+
import { generateKnowledgeSpaceSpec } from "../../templates/knowledge.template.js";
|
|
13
|
+
import { generateComponentTemplate as generateComponentTemplate$1, generateHandlerTemplate as generateHandlerTemplate$1, generateTestTemplate as generateTestTemplate$1 } from "../../templates/handler.template.js";
|
|
14
|
+
import { generateWorkflowRunnerTemplate } from "../../templates/workflow-runner.template.js";
|
|
15
|
+
import { templates_d_exports } from "./templates.js";
|
|
16
|
+
import { WorkspaceConfig } from "@contractspec/module.workspace";
|
|
17
|
+
|
|
18
|
+
//#region src/services/create/index.d.ts
|
|
19
|
+
declare class SpecCreatorService {
|
|
20
|
+
readonly ai: AIGenerator;
|
|
21
|
+
readonly templates: typeof templates_d_exports;
|
|
22
|
+
constructor(config: WorkspaceConfig);
|
|
23
|
+
}
|
|
24
|
+
declare function createSpecCreator(config: WorkspaceConfig): SpecCreatorService;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { SpecCreatorService, createSpecCreator };
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/services/create/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;cAUa,kBAAA;eACS;6BACK;sBAEL;;iBAQN,iBAAA,SAA0B,kBAAkB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AIGenerator } from "./ai-generator.js";
|
|
2
|
+
import { generateOperationSpec } from "../../templates/operation.template.js";
|
|
3
|
+
import { generateEventSpec } from "../../templates/event.template.js";
|
|
4
|
+
import { generatePresentationSpec } from "../../templates/presentation.template.js";
|
|
5
|
+
import { generateWorkflowSpec } from "../../templates/workflow.template.js";
|
|
6
|
+
import { generateMigrationSpec } from "../../templates/migration.template.js";
|
|
7
|
+
import { generateTelemetrySpec } from "../../templates/telemetry.template.js";
|
|
8
|
+
import { generateExperimentSpec } from "../../templates/experiment.template.js";
|
|
9
|
+
import { generateAppBlueprintSpec } from "../../templates/app-config.template.js";
|
|
10
|
+
import { generateDataViewSpec } from "../../templates/data-view.template.js";
|
|
11
|
+
import { generateIntegrationSpec } from "../../templates/integration.template.js";
|
|
12
|
+
import { generateKnowledgeSpaceSpec } from "../../templates/knowledge.template.js";
|
|
13
|
+
import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "../../templates/handler.template.js";
|
|
14
|
+
import { generateWorkflowRunnerTemplate } from "../../templates/workflow-runner.template.js";
|
|
15
|
+
import { templates_exports } from "./templates.js";
|
|
16
|
+
|
|
17
|
+
//#region src/services/create/index.ts
|
|
18
|
+
/**
|
|
19
|
+
* Spec Creation Service
|
|
20
|
+
*
|
|
21
|
+
* Unifies manual and AI-assisted spec creation.
|
|
22
|
+
*/
|
|
23
|
+
var SpecCreatorService = class {
|
|
24
|
+
ai;
|
|
25
|
+
templates = templates_exports;
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.ai = new AIGenerator(config);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function createSpecCreator(config) {
|
|
31
|
+
return new SpecCreatorService(config);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { SpecCreatorService, createSpecCreator };
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["templates"],"sources":["../../../src/services/create/index.ts"],"sourcesContent":["/**\n * Spec Creation Service\n *\n * Unifies manual and AI-assisted spec creation.\n */\n\nimport { AIGenerator } from './ai-generator';\nimport * as templates from './templates';\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\n\nexport class SpecCreatorService {\n public readonly ai: AIGenerator;\n public readonly templates = templates;\n\n constructor(config: WorkspaceConfig) {\n this.ai = new AIGenerator(config);\n }\n}\n\nexport * from './ai-generator';\nexport * from './templates';\n\nexport function createSpecCreator(config: WorkspaceConfig): SpecCreatorService {\n return new SpecCreatorService(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAUA,IAAa,qBAAb,MAAgC;CAC9B,AAAgB;CAChB,AAAgB,YAAYA;CAE5B,YAAY,QAAyB;AACnC,OAAK,KAAK,IAAI,YAAY,OAAO;;;AAOrC,SAAgB,kBAAkB,QAA6C;AAC7E,QAAO,IAAI,mBAAmB,OAAO"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { generateOperationSpec } from "../../templates/operation.template.js";
|
|
2
|
+
import { generateEventSpec } from "../../templates/event.template.js";
|
|
3
|
+
import { generatePresentationSpec } from "../../templates/presentation.template.js";
|
|
4
|
+
import { generateWorkflowSpec } from "../../templates/workflow.template.js";
|
|
5
|
+
import { generateMigrationSpec } from "../../templates/migration.template.js";
|
|
6
|
+
import { generateTelemetrySpec } from "../../templates/telemetry.template.js";
|
|
7
|
+
import { generateExperimentSpec } from "../../templates/experiment.template.js";
|
|
8
|
+
import { generateAppBlueprintSpec } from "../../templates/app-config.template.js";
|
|
9
|
+
import { generateDataViewSpec } from "../../templates/data-view.template.js";
|
|
10
|
+
import { generateIntegrationSpec } from "../../templates/integration.template.js";
|
|
11
|
+
import { generateKnowledgeSpaceSpec } from "../../templates/knowledge.template.js";
|
|
12
|
+
import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "../../templates/handler.template.js";
|
|
13
|
+
import { generateWorkflowRunnerTemplate } from "../../templates/workflow-runner.template.js";
|
|
14
|
+
|
|
15
|
+
//#region src/services/create/templates.d.ts
|
|
16
|
+
declare namespace templates_d_exports {
|
|
17
|
+
export { generateAppBlueprintSpec, generateComponentTemplate, generateDataViewSpec, generateEventSpec, generateExperimentSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateWorkflowRunnerTemplate, generateWorkflowSpec };
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { templates_d_exports };
|
|
21
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","names":[],"sources":["../../../src/services/create/templates.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { generateOperationSpec } from "../../templates/operation.template.js";
|
|
3
|
+
import { generateEventSpec } from "../../templates/event.template.js";
|
|
4
|
+
import { generatePresentationSpec } from "../../templates/presentation.template.js";
|
|
5
|
+
import { generateWorkflowSpec } from "../../templates/workflow.template.js";
|
|
6
|
+
import { generateMigrationSpec } from "../../templates/migration.template.js";
|
|
7
|
+
import { generateTelemetrySpec } from "../../templates/telemetry.template.js";
|
|
8
|
+
import { generateExperimentSpec } from "../../templates/experiment.template.js";
|
|
9
|
+
import { generateAppBlueprintSpec } from "../../templates/app-config.template.js";
|
|
10
|
+
import { generateDataViewSpec } from "../../templates/data-view.template.js";
|
|
11
|
+
import { generateIntegrationSpec } from "../../templates/integration.template.js";
|
|
12
|
+
import { generateKnowledgeSpaceSpec } from "../../templates/knowledge.template.js";
|
|
13
|
+
import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "../../templates/handler.template.js";
|
|
14
|
+
import { generateWorkflowRunnerTemplate } from "../../templates/workflow-runner.template.js";
|
|
15
|
+
|
|
16
|
+
//#region src/services/create/templates.ts
|
|
17
|
+
var templates_exports = /* @__PURE__ */ __exportAll({
|
|
18
|
+
generateAppBlueprintSpec: () => generateAppBlueprintSpec,
|
|
19
|
+
generateComponentTemplate: () => generateComponentTemplate,
|
|
20
|
+
generateDataViewSpec: () => generateDataViewSpec,
|
|
21
|
+
generateEventSpec: () => generateEventSpec,
|
|
22
|
+
generateExperimentSpec: () => generateExperimentSpec,
|
|
23
|
+
generateHandlerTemplate: () => generateHandlerTemplate,
|
|
24
|
+
generateIntegrationSpec: () => generateIntegrationSpec,
|
|
25
|
+
generateKnowledgeSpaceSpec: () => generateKnowledgeSpaceSpec,
|
|
26
|
+
generateMigrationSpec: () => generateMigrationSpec,
|
|
27
|
+
generateOperationSpec: () => generateOperationSpec,
|
|
28
|
+
generatePresentationSpec: () => generatePresentationSpec,
|
|
29
|
+
generateTelemetrySpec: () => generateTelemetrySpec,
|
|
30
|
+
generateTestTemplate: () => generateTestTemplate,
|
|
31
|
+
generateWorkflowRunnerTemplate: () => generateWorkflowRunnerTemplate,
|
|
32
|
+
generateWorkflowSpec: () => generateWorkflowSpec
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { templates_exports };
|
|
37
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","names":[],"sources":["../../../src/services/create/templates.ts"],"sourcesContent":["/**\n * Template Service\n *\n * Provides various spec templates.\n */\n\n// Re-export templates from the templates directory in bundle\n// Currently they are just exported functions\nexport * from '../../templates';\n"],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WorkspaceAdapters } from "../../ports/logger.js";
|
|
2
|
+
import { DocBlock } from "@contractspec/lib.contracts/docs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/docs/docs-service.d.ts
|
|
5
|
+
interface DocsServiceOptions {
|
|
6
|
+
outputDir?: string;
|
|
7
|
+
format?: 'markdown' | 'html' | 'json';
|
|
8
|
+
}
|
|
9
|
+
interface DocsServiceResult {
|
|
10
|
+
blocks: DocBlock[];
|
|
11
|
+
count: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate documentation from spec files.
|
|
15
|
+
*/
|
|
16
|
+
declare function generateDocsFromSpecs(specFiles: string[], options: DocsServiceOptions, adapters: WorkspaceAdapters): Promise<DocsServiceResult>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs };
|
|
19
|
+
//# sourceMappingURL=docs-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-service.d.ts","names":[],"sources":["../../../src/services/docs/docs-service.ts"],"sourcesContent":[],"mappings":";;;;UAUiB,kBAAA;;EAAA,MAAA,CAAA,EAAA,UAAA,GAAkB,MAAA,GAAA,MAAA;AAKnC;AAQsB,UARL,iBAAA,CAQ0B;EAEhC,MAAA,EATD,QASC,EAAA;EACC,KAAA,EAAA,MAAA;;;;;iBAHU,qBAAA,+BAEX,8BACC,oBACT,QAAQ"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { convertSpecToDocBlock, loadSpecFromSource } from "@contractspec/module.workspace";
|
|
2
|
+
import { defaultDocRegistry } from "@contractspec/lib.contracts/docs";
|
|
3
|
+
|
|
4
|
+
//#region src/services/docs/docs-service.ts
|
|
5
|
+
/**
|
|
6
|
+
* Generate documentation from spec files.
|
|
7
|
+
*/
|
|
8
|
+
async function generateDocsFromSpecs(specFiles, options, adapters) {
|
|
9
|
+
const { fs, logger } = adapters;
|
|
10
|
+
const blocks = [];
|
|
11
|
+
logger.info(`Generating docs for ${specFiles.length} files...`);
|
|
12
|
+
for (const file of specFiles) try {
|
|
13
|
+
const parsedList = await loadSpecFromSource(await fs.readFile(file));
|
|
14
|
+
if (parsedList && parsedList.length > 0) for (const parsed of parsedList) {
|
|
15
|
+
const block = convertSpecToDocBlock(parsed);
|
|
16
|
+
defaultDocRegistry.register(block);
|
|
17
|
+
blocks.push(block);
|
|
18
|
+
logger.debug(`Generated doc for ${block.id}`);
|
|
19
|
+
}
|
|
20
|
+
else logger.warn(`Could not parse spec from ${file}`);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
logger.error(`Error processing ${file}: ${error instanceof Error ? error.message : String(error)}`);
|
|
23
|
+
}
|
|
24
|
+
if (options.outputDir) {
|
|
25
|
+
await fs.mkdir(options.outputDir);
|
|
26
|
+
for (const block of blocks) {
|
|
27
|
+
const filename = `${block.id}.md`;
|
|
28
|
+
const path = adapters.fs.join(options.outputDir, filename);
|
|
29
|
+
await fs.writeFile(path, block.body);
|
|
30
|
+
}
|
|
31
|
+
logger.info(`Wrote ${blocks.length} doc files to ${options.outputDir}`);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
blocks,
|
|
35
|
+
count: blocks.length
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//#endregion
|
|
40
|
+
export { generateDocsFromSpecs };
|
|
41
|
+
//# sourceMappingURL=docs-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-service.js","names":["blocks: DocBlock[]"],"sources":["../../../src/services/docs/docs-service.ts"],"sourcesContent":["import {\n type DocBlock,\n defaultDocRegistry,\n} from '@contractspec/lib.contracts/docs';\nimport {\n loadSpecFromSource,\n convertSpecToDocBlock,\n} from '@contractspec/module.workspace';\nimport type { WorkspaceAdapters } from '../../ports/logger';\n\nexport interface DocsServiceOptions {\n outputDir?: string;\n format?: 'markdown' | 'html' | 'json';\n}\n\nexport interface DocsServiceResult {\n blocks: DocBlock[];\n count: number;\n}\n\n/**\n * Generate documentation from spec files.\n */\nexport async function generateDocsFromSpecs(\n specFiles: string[],\n options: DocsServiceOptions,\n adapters: WorkspaceAdapters\n): Promise<DocsServiceResult> {\n const { fs, logger } = adapters;\n const blocks: DocBlock[] = [];\n\n logger.info(`Generating docs for ${specFiles.length} files...`);\n\n for (const file of specFiles) {\n try {\n const content = await fs.readFile(file);\n const parsedList = await loadSpecFromSource(content);\n\n if (parsedList && parsedList.length > 0) {\n for (const parsed of parsedList) {\n const block = convertSpecToDocBlock(parsed);\n // Register globally? Or locally?\n // DocRegistry instance\n defaultDocRegistry.register(block);\n blocks.push(block);\n logger.debug(`Generated doc for ${block.id}`);\n }\n } else {\n logger.warn(`Could not parse spec from ${file}`);\n }\n } catch (error) {\n logger.error(\n `Error processing ${file}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (options.outputDir) {\n // Simple output for now: write each block as MD file\n await fs.mkdir(options.outputDir);\n for (const block of blocks) {\n const filename = `${block.id}.md`; // Or sanitize\n const path = adapters.fs.join(options.outputDir, filename);\n await fs.writeFile(path, block.body);\n }\n logger.info(`Wrote ${blocks.length} doc files to ${options.outputDir}`);\n }\n\n return { blocks, count: blocks.length };\n}\n"],"mappings":";;;;;;;AAuBA,eAAsB,sBACpB,WACA,SACA,UAC4B;CAC5B,MAAM,EAAE,IAAI,WAAW;CACvB,MAAMA,SAAqB,EAAE;AAE7B,QAAO,KAAK,uBAAuB,UAAU,OAAO,WAAW;AAE/D,MAAK,MAAM,QAAQ,UACjB,KAAI;EAEF,MAAM,aAAa,MAAM,mBADT,MAAM,GAAG,SAAS,KAAK,CACa;AAEpD,MAAI,cAAc,WAAW,SAAS,EACpC,MAAK,MAAM,UAAU,YAAY;GAC/B,MAAM,QAAQ,sBAAsB,OAAO;AAG3C,sBAAmB,SAAS,MAAM;AAClC,UAAO,KAAK,MAAM;AAClB,UAAO,MAAM,qBAAqB,MAAM,KAAK;;MAG/C,QAAO,KAAK,6BAA6B,OAAO;UAE3C,OAAO;AACd,SAAO,MACL,oBAAoB,KAAK,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACpF;;AAIL,KAAI,QAAQ,WAAW;AAErB,QAAM,GAAG,MAAM,QAAQ,UAAU;AACjC,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,WAAW,GAAG,MAAM,GAAG;GAC7B,MAAM,OAAO,SAAS,GAAG,KAAK,QAAQ,WAAW,SAAS;AAC1D,SAAM,GAAG,UAAU,MAAM,MAAM,KAAK;;AAEtC,SAAO,KAAK,SAAS,OAAO,OAAO,gBAAgB,QAAQ,YAAY;;AAGzE,QAAO;EAAE;EAAQ,OAAO,OAAO;EAAQ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs } from "./docs-service.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { generateDocsFromSpecs } from "./docs-service.js";
|
|
@@ -21,7 +21,7 @@ async function runCliChecks(fs, ctx) {
|
|
|
21
21
|
*/
|
|
22
22
|
async function checkCliAccessible(ctx) {
|
|
23
23
|
try {
|
|
24
|
-
await execAsync("
|
|
24
|
+
await execAsync("bunx contractspec --version", {
|
|
25
25
|
cwd: ctx.workspaceRoot,
|
|
26
26
|
timeout: 1e4
|
|
27
27
|
});
|
|
@@ -37,7 +37,7 @@ async function checkCliAccessible(ctx) {
|
|
|
37
37
|
name: "CLI Accessible",
|
|
38
38
|
status: "fail",
|
|
39
39
|
message: "ContractSpec CLI is not accessible",
|
|
40
|
-
details: "Could not run \"
|
|
40
|
+
details: "Could not run \"bunx contractspec --version\"",
|
|
41
41
|
fix: {
|
|
42
42
|
description: "Install ContractSpec CLI globally",
|
|
43
43
|
apply: async () => {
|
|
@@ -66,7 +66,7 @@ async function checkCliAccessible(ctx) {
|
|
|
66
66
|
*/
|
|
67
67
|
async function checkCliVersion(ctx) {
|
|
68
68
|
try {
|
|
69
|
-
const { stdout } = await execAsync("
|
|
69
|
+
const { stdout } = await execAsync("bunx contractspec --version", {
|
|
70
70
|
cwd: ctx.workspaceRoot,
|
|
71
71
|
timeout: 1e4
|
|
72
72
|
});
|