@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.
Files changed (149) hide show
  1. package/README.md +5 -1
  2. package/dist/_virtual/rolldown_runtime.js +1 -19
  3. package/dist/ai/agents/cursor-agent.js +4 -4
  4. package/dist/ai/agents/cursor-agent.js.map +1 -1
  5. package/dist/ai/client.d.ts +14 -0
  6. package/dist/ai/client.d.ts.map +1 -1
  7. package/dist/ai/client.js +27 -1
  8. package/dist/ai/client.js.map +1 -1
  9. package/dist/ai/index.d.ts +1 -9
  10. package/dist/ai/index.js +1 -20
  11. package/dist/ai/prompts/index.js +1 -1
  12. package/dist/index.d.ts +42 -19
  13. package/dist/index.js +39 -150
  14. package/dist/services/agent-guide/agent-guide-service.js +3 -3
  15. package/dist/services/agent-guide/agent-guide-service.js.map +1 -1
  16. package/dist/services/ci-check/ci-check-service.d.ts.map +1 -1
  17. package/dist/services/ci-check/ci-check-service.js +69 -2
  18. package/dist/services/ci-check/ci-check-service.js.map +1 -1
  19. package/dist/services/ci-check/types.d.ts +1 -1
  20. package/dist/services/ci-check/types.d.ts.map +1 -1
  21. package/dist/services/ci-check/types.js +4 -2
  22. package/dist/services/ci-check/types.js.map +1 -1
  23. package/dist/services/config.d.ts +1 -11
  24. package/dist/services/config.d.ts.map +1 -1
  25. package/dist/services/config.js +2 -16
  26. package/dist/services/config.js.map +1 -1
  27. package/dist/services/create/ai-generator.d.ts +84 -0
  28. package/dist/services/create/ai-generator.d.ts.map +1 -0
  29. package/dist/services/create/ai-generator.js +178 -0
  30. package/dist/services/create/ai-generator.js.map +1 -0
  31. package/dist/services/create/index.d.ts +27 -0
  32. package/dist/services/create/index.d.ts.map +1 -0
  33. package/dist/services/create/index.js +36 -0
  34. package/dist/services/create/index.js.map +1 -0
  35. package/dist/services/create/templates.d.ts +21 -0
  36. package/dist/services/create/templates.d.ts.map +1 -0
  37. package/dist/services/create/templates.js +37 -0
  38. package/dist/services/create/templates.js.map +1 -0
  39. package/dist/services/docs/docs-service.d.ts +19 -0
  40. package/dist/services/docs/docs-service.d.ts.map +1 -0
  41. package/dist/services/docs/docs-service.js +41 -0
  42. package/dist/services/docs/docs-service.js.map +1 -0
  43. package/dist/services/docs/index.d.ts +1 -0
  44. package/dist/services/docs/index.js +1 -0
  45. package/dist/services/doctor/checks/cli.js +3 -3
  46. package/dist/services/doctor/checks/cli.js.map +1 -1
  47. package/dist/services/doctor/checks/index.js +1 -0
  48. package/dist/services/doctor/checks/layers.js +139 -0
  49. package/dist/services/doctor/checks/layers.js.map +1 -0
  50. package/dist/services/doctor/doctor-service.d.ts.map +1 -1
  51. package/dist/services/doctor/doctor-service.js +2 -0
  52. package/dist/services/doctor/doctor-service.js.map +1 -1
  53. package/dist/services/doctor/types.d.ts +1 -1
  54. package/dist/services/doctor/types.d.ts.map +1 -1
  55. package/dist/services/doctor/types.js +4 -2
  56. package/dist/services/doctor/types.js.map +1 -1
  57. package/dist/services/formatter.d.ts +15 -0
  58. package/dist/services/formatter.d.ts.map +1 -0
  59. package/dist/services/formatter.js +26 -0
  60. package/dist/services/formatter.js.map +1 -0
  61. package/dist/services/impact/formatters.d.ts +5 -5
  62. package/dist/services/impact/formatters.d.ts.map +1 -1
  63. package/dist/services/impact/formatters.js.map +1 -1
  64. package/dist/services/impact/impact-detection-service.js +6 -6
  65. package/dist/services/impact/impact-detection-service.js.map +1 -1
  66. package/dist/services/impact/types.d.ts +3 -3
  67. package/dist/services/implementation/resolver.js +1 -1
  68. package/dist/services/implementation/resolver.js.map +1 -1
  69. package/dist/services/implementation/types.d.ts +1 -1
  70. package/dist/services/index.d.ts +31 -5
  71. package/dist/services/index.js +30 -4
  72. package/dist/services/integrity-diagram.js +1 -1
  73. package/dist/services/integrity-diagram.js.map +1 -1
  74. package/dist/services/integrity.d.ts +1 -1
  75. package/dist/services/integrity.js.map +1 -1
  76. package/dist/services/layer-discovery.d.ts +77 -0
  77. package/dist/services/layer-discovery.d.ts.map +1 -0
  78. package/dist/services/layer-discovery.js +121 -0
  79. package/dist/services/layer-discovery.js.map +1 -0
  80. package/dist/services/llm/index.d.ts +28 -0
  81. package/dist/services/llm/index.d.ts.map +1 -0
  82. package/dist/services/llm/index.js +187 -0
  83. package/dist/services/llm/index.js.map +1 -0
  84. package/dist/services/llm/verify-static.d.ts +26 -0
  85. package/dist/services/llm/verify-static.d.ts.map +1 -0
  86. package/dist/services/llm/verify-static.js +82 -0
  87. package/dist/services/llm/verify-static.js.map +1 -0
  88. package/dist/services/openapi/import-service.d.ts.map +1 -1
  89. package/dist/services/openapi/import-service.js +98 -4
  90. package/dist/services/openapi/import-service.js.map +1 -1
  91. package/dist/services/openapi/sync-service.js +1 -1
  92. package/dist/services/setup/config-generators.js +1 -1
  93. package/dist/services/setup/config-generators.js.map +1 -1
  94. package/dist/services/sync.d.ts +2 -1
  95. package/dist/services/sync.d.ts.map +1 -1
  96. package/dist/services/sync.js +2 -1
  97. package/dist/services/sync.js.map +1 -1
  98. package/dist/services/test/index.d.ts +1 -0
  99. package/dist/services/test/index.js +1 -0
  100. package/dist/services/test/test-service.d.ts +22 -0
  101. package/dist/services/test/test-service.d.ts.map +1 -0
  102. package/dist/services/test/test-service.js +81 -0
  103. package/dist/services/test/test-service.js.map +1 -0
  104. package/dist/services/validate/blueprint-validator.d.ts +23 -0
  105. package/dist/services/validate/blueprint-validator.d.ts.map +1 -0
  106. package/dist/services/validate/blueprint-validator.js +50 -0
  107. package/dist/services/validate/blueprint-validator.js.map +1 -0
  108. package/dist/services/validate/implementation-agent-validator.d.ts +20 -0
  109. package/dist/services/validate/implementation-agent-validator.d.ts.map +1 -0
  110. package/dist/services/validate/implementation-agent-validator.js +42 -0
  111. package/dist/services/validate/implementation-agent-validator.js.map +1 -0
  112. package/dist/services/{validate-implementation.d.ts → validate/implementation-validator.d.ts} +3 -3
  113. package/dist/services/validate/implementation-validator.d.ts.map +1 -0
  114. package/dist/services/{validate-implementation.js → validate/implementation-validator.js} +2 -2
  115. package/dist/services/validate/implementation-validator.js.map +1 -0
  116. package/dist/services/validate/index.d.ts +5 -0
  117. package/dist/services/validate/index.js +5 -0
  118. package/dist/services/{validate.d.ts → validate/spec-validator.d.ts} +5 -4
  119. package/dist/services/validate/spec-validator.d.ts.map +1 -0
  120. package/dist/services/{validate.js → validate/spec-validator.js} +6 -4
  121. package/dist/services/validate/spec-validator.js.map +1 -0
  122. package/dist/services/validate/tenant-validator.d.ts +21 -0
  123. package/dist/services/validate/tenant-validator.d.ts.map +1 -0
  124. package/dist/services/validate/tenant-validator.js +165 -0
  125. package/dist/services/validate/tenant-validator.js.map +1 -0
  126. package/dist/services/watch.js +2 -1
  127. package/dist/services/watch.js.map +1 -1
  128. package/dist/templates/data-view.template.js +3 -3
  129. package/dist/templates/data-view.template.js.map +1 -1
  130. package/dist/templates/event.template.js +3 -1
  131. package/dist/templates/event.template.js.map +1 -1
  132. package/dist/templates/operation.template.js +3 -1
  133. package/dist/templates/operation.template.js.map +1 -1
  134. package/dist/types.d.ts +1 -1
  135. package/dist/utils/module-loader.js +41 -0
  136. package/dist/utils/module-loader.js.map +1 -0
  137. package/package.json +9 -9
  138. package/dist/ai/index.d.ts.map +0 -1
  139. package/dist/ai/index.js.map +0 -1
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/services/test.d.ts +0 -15
  143. package/dist/services/test.d.ts.map +0 -1
  144. package/dist/services/test.js +0 -30
  145. package/dist/services/test.js.map +0 -1
  146. package/dist/services/validate-implementation.d.ts.map +0 -1
  147. package/dist/services/validate-implementation.js.map +0 -1
  148. package/dist/services/validate.d.ts.map +0 -1
  149. 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, mergeWorkspaceConfig };
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;AA0CA;;iBA1CgB,oBAAA,SACN;;;;;;IAQP;;;;iBAiCa,SAAA,WACJ"}
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"}
@@ -19,7 +19,7 @@ const ConfigSchema = z.object({
19
19
  "claude-code",
20
20
  "openai-codex"
21
21
  ]).default("simple"),
22
- customEndpoint: z.string().url().nullable().optional(),
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, mergeWorkspaceConfig };
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.string().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 * Merge config with CLI options and environment variables.\n */\nexport function mergeWorkspaceConfig(\n config: WorkspaceConfig,\n options: {\n provider?: string;\n model?: string;\n agentMode?: string;\n endpoint?: string;\n outputDir?: string;\n }\n): WorkspaceConfig {\n return {\n ...config,\n aiProvider:\n (options.provider as WorkspaceConfig['aiProvider']) ??\n (process.env[\n 'CONTRACTSPEC_AI_PROVIDER'\n ] as WorkspaceConfig['aiProvider']) ??\n config.aiProvider,\n aiModel:\n options.model ?? process.env['CONTRACTSPEC_AI_MODEL'] ?? config.aiModel,\n agentMode:\n (options.agentMode as WorkspaceConfig['agentMode']) ??\n (process.env[\n 'CONTRACTSPEC_AGENT_MODE'\n ] as WorkspaceConfig['agentMode']) ??\n config.agentMode,\n customEndpoint:\n options.endpoint ??\n process.env['CONTRACTSPEC_LLM_ENDPOINT'] ??\n config.customEndpoint ??\n undefined,\n customApiKey:\n process.env['CONTRACTSPEC_LLM_API_KEY'] ??\n config.customApiKey ??\n undefined,\n outputDir: options.outputDir ?? config.outputDir,\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,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;CACtD,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,qBACd,QACA,SAOiB;AACjB,QAAO;EACL,GAAG;EACH,YACG,QAAQ,YACR,QAAQ,IACP,+BAEF,OAAO;EACT,SACE,QAAQ,SAAS,QAAQ,IAAI,4BAA4B,OAAO;EAClE,WACG,QAAQ,aACR,QAAQ,IACP,8BAEF,OAAO;EACT,gBACE,QAAQ,YACR,QAAQ,IAAI,gCACZ,OAAO,kBACP;EACF,cACE,QAAQ,IAAI,+BACZ,OAAO,gBACP;EACF,WAAW,QAAQ,aAAa,OAAO;EACxC;;;;;AAMH,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"}
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("npx contractspec --version", {
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 \"npx contractspec --version\"",
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("npx contractspec --version", {
69
+ const { stdout } = await execAsync("bunx contractspec --version", {
70
70
  cwd: ctx.workspaceRoot,
71
71
  timeout: 1e4
72
72
  });