openkitt 0.1.2

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 (234) hide show
  1. package/README.md +236 -0
  2. package/dist/ast/engine.d.ts +26 -0
  3. package/dist/ast/engine.js +130 -0
  4. package/dist/ast/engine.js.map +1 -0
  5. package/dist/ast/operations.d.ts +13 -0
  6. package/dist/ast/operations.js +329 -0
  7. package/dist/ast/operations.js.map +1 -0
  8. package/dist/ast/validator.d.ts +19 -0
  9. package/dist/ast/validator.js +281 -0
  10. package/dist/ast/validator.js.map +1 -0
  11. package/dist/audit/logger.d.ts +14 -0
  12. package/dist/audit/logger.js +102 -0
  13. package/dist/audit/logger.js.map +1 -0
  14. package/dist/cli.d.ts +4 -0
  15. package/dist/cli.js +401 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/commands/create-confirm.d.ts +13 -0
  18. package/dist/commands/create-confirm.js +38 -0
  19. package/dist/commands/create-confirm.js.map +1 -0
  20. package/dist/commands/create-infra.d.ts +20 -0
  21. package/dist/commands/create-infra.js +63 -0
  22. package/dist/commands/create-infra.js.map +1 -0
  23. package/dist/commands/create-manifest.d.ts +10 -0
  24. package/dist/commands/create-manifest.js +21 -0
  25. package/dist/commands/create-manifest.js.map +1 -0
  26. package/dist/commands/create-packages.d.ts +17 -0
  27. package/dist/commands/create-packages.js +69 -0
  28. package/dist/commands/create-packages.js.map +1 -0
  29. package/dist/commands/create-pipeline.d.ts +15 -0
  30. package/dist/commands/create-pipeline.js +57 -0
  31. package/dist/commands/create-pipeline.js.map +1 -0
  32. package/dist/commands/create-scaffolding.d.ts +12 -0
  33. package/dist/commands/create-scaffolding.js +137 -0
  34. package/dist/commands/create-scaffolding.js.map +1 -0
  35. package/dist/commands/create-staging.d.ts +13 -0
  36. package/dist/commands/create-staging.js +17 -0
  37. package/dist/commands/create-staging.js.map +1 -0
  38. package/dist/commands/create-transforms.d.ts +10 -0
  39. package/dist/commands/create-transforms.js +33 -0
  40. package/dist/commands/create-transforms.js.map +1 -0
  41. package/dist/commands/create.d.ts +2 -0
  42. package/dist/commands/create.js +155 -0
  43. package/dist/commands/create.js.map +1 -0
  44. package/dist/commands/delete.d.ts +2 -0
  45. package/dist/commands/delete.js +83 -0
  46. package/dist/commands/delete.js.map +1 -0
  47. package/dist/commands/deploy.d.ts +5 -0
  48. package/dist/commands/deploy.js +371 -0
  49. package/dist/commands/deploy.js.map +1 -0
  50. package/dist/commands/domain.d.ts +2 -0
  51. package/dist/commands/domain.js +90 -0
  52. package/dist/commands/domain.js.map +1 -0
  53. package/dist/commands/env.d.ts +2 -0
  54. package/dist/commands/env.js +153 -0
  55. package/dist/commands/env.js.map +1 -0
  56. package/dist/commands/help.d.ts +3 -0
  57. package/dist/commands/help.js +107 -0
  58. package/dist/commands/help.js.map +1 -0
  59. package/dist/commands/init.d.ts +2 -0
  60. package/dist/commands/init.js +217 -0
  61. package/dist/commands/init.js.map +1 -0
  62. package/dist/commands/list.d.ts +2 -0
  63. package/dist/commands/list.js +142 -0
  64. package/dist/commands/list.js.map +1 -0
  65. package/dist/commands/login.d.ts +2 -0
  66. package/dist/commands/login.js +235 -0
  67. package/dist/commands/login.js.map +1 -0
  68. package/dist/commands/logs.d.ts +2 -0
  69. package/dist/commands/logs.js +90 -0
  70. package/dist/commands/logs.js.map +1 -0
  71. package/dist/commands/publish.d.ts +2 -0
  72. package/dist/commands/publish.js +113 -0
  73. package/dist/commands/publish.js.map +1 -0
  74. package/dist/commands/run.d.ts +14 -0
  75. package/dist/commands/run.js +196 -0
  76. package/dist/commands/run.js.map +1 -0
  77. package/dist/commands/settings.d.ts +3 -0
  78. package/dist/commands/settings.js +278 -0
  79. package/dist/commands/settings.js.map +1 -0
  80. package/dist/commands/status.d.ts +2 -0
  81. package/dist/commands/status.js +88 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/versions.d.ts +2 -0
  84. package/dist/commands/versions.js +242 -0
  85. package/dist/commands/versions.js.map +1 -0
  86. package/dist/credentials/config.d.ts +12 -0
  87. package/dist/credentials/config.js +196 -0
  88. package/dist/credentials/config.js.map +1 -0
  89. package/dist/credentials/encryption.d.ts +9 -0
  90. package/dist/credentials/encryption.js +100 -0
  91. package/dist/credentials/encryption.js.map +1 -0
  92. package/dist/credentials/keychain.d.ts +8 -0
  93. package/dist/credentials/keychain.js +236 -0
  94. package/dist/credentials/keychain.js.map +1 -0
  95. package/dist/credentials/railway.d.ts +9 -0
  96. package/dist/credentials/railway.js +69 -0
  97. package/dist/credentials/railway.js.map +1 -0
  98. package/dist/llm/client.d.ts +59 -0
  99. package/dist/llm/client.js +530 -0
  100. package/dist/llm/client.js.map +1 -0
  101. package/dist/llm/operations.d.ts +39 -0
  102. package/dist/llm/operations.js +131 -0
  103. package/dist/llm/operations.js.map +1 -0
  104. package/dist/llm/rate-limiter.d.ts +20 -0
  105. package/dist/llm/rate-limiter.js +57 -0
  106. package/dist/llm/rate-limiter.js.map +1 -0
  107. package/dist/llm/scaffolding.d.ts +51 -0
  108. package/dist/llm/scaffolding.js +118 -0
  109. package/dist/llm/scaffolding.js.map +1 -0
  110. package/dist/manifest/drift.d.ts +6 -0
  111. package/dist/manifest/drift.js +45 -0
  112. package/dist/manifest/drift.js.map +1 -0
  113. package/dist/manifest/reader.d.ts +12 -0
  114. package/dist/manifest/reader.js +99 -0
  115. package/dist/manifest/reader.js.map +1 -0
  116. package/dist/manifest/types.d.ts +31 -0
  117. package/dist/manifest/types.js +2 -0
  118. package/dist/manifest/types.js.map +1 -0
  119. package/dist/manifest/writer.d.ts +9 -0
  120. package/dist/manifest/writer.js +142 -0
  121. package/dist/manifest/writer.js.map +1 -0
  122. package/dist/mcp/client.d.ts +21 -0
  123. package/dist/mcp/client.js +213 -0
  124. package/dist/mcp/client.js.map +1 -0
  125. package/dist/mcp/lifecycle.d.ts +12 -0
  126. package/dist/mcp/lifecycle.js +149 -0
  127. package/dist/mcp/lifecycle.js.map +1 -0
  128. package/dist/mcp/project-guard.d.ts +14 -0
  129. package/dist/mcp/project-guard.js +27 -0
  130. package/dist/mcp/project-guard.js.map +1 -0
  131. package/dist/prompts/operations.d.ts +1 -0
  132. package/dist/prompts/operations.js +160 -0
  133. package/dist/prompts/operations.js.map +1 -0
  134. package/dist/prompts/scaffolding.d.ts +1 -0
  135. package/dist/prompts/scaffolding.js +331 -0
  136. package/dist/prompts/scaffolding.js.map +1 -0
  137. package/dist/prompts/version.d.ts +2 -0
  138. package/dist/prompts/version.js +3 -0
  139. package/dist/prompts/version.js.map +1 -0
  140. package/dist/sandbox/command-allowlist.d.ts +6 -0
  141. package/dist/sandbox/command-allowlist.js +103 -0
  142. package/dist/sandbox/command-allowlist.js.map +1 -0
  143. package/dist/sandbox/package-allowlist.d.ts +6 -0
  144. package/dist/sandbox/package-allowlist.js +49 -0
  145. package/dist/sandbox/package-allowlist.js.map +1 -0
  146. package/dist/sandbox/scanner.d.ts +25 -0
  147. package/dist/sandbox/scanner.js +196 -0
  148. package/dist/sandbox/scanner.js.map +1 -0
  149. package/dist/sandbox/staging.d.ts +12 -0
  150. package/dist/sandbox/staging.js +107 -0
  151. package/dist/sandbox/staging.js.map +1 -0
  152. package/dist/scaffold/frameworks/express.d.ts +3 -0
  153. package/dist/scaffold/frameworks/express.js +242 -0
  154. package/dist/scaffold/frameworks/express.js.map +1 -0
  155. package/dist/scaffold/frameworks/hono.d.ts +3 -0
  156. package/dist/scaffold/frameworks/hono.js +238 -0
  157. package/dist/scaffold/frameworks/hono.js.map +1 -0
  158. package/dist/scaffold/frameworks/nextjs.d.ts +3 -0
  159. package/dist/scaffold/frameworks/nextjs.js +447 -0
  160. package/dist/scaffold/frameworks/nextjs.js.map +1 -0
  161. package/dist/scaffold/frameworks/tanstack-start.d.ts +3 -0
  162. package/dist/scaffold/frameworks/tanstack-start.js +280 -0
  163. package/dist/scaffold/frameworks/tanstack-start.js.map +1 -0
  164. package/dist/scaffold/index.d.ts +4 -0
  165. package/dist/scaffold/index.js +138 -0
  166. package/dist/scaffold/index.js.map +1 -0
  167. package/dist/scaffold/integrations/backend.d.ts +3 -0
  168. package/dist/scaffold/integrations/backend.js +403 -0
  169. package/dist/scaffold/integrations/backend.js.map +1 -0
  170. package/dist/scaffold/integrations/posthog.d.ts +2 -0
  171. package/dist/scaffold/integrations/posthog.js +21 -0
  172. package/dist/scaffold/integrations/posthog.js.map +1 -0
  173. package/dist/scaffold/integrations/sentry.d.ts +2 -0
  174. package/dist/scaffold/integrations/sentry.js +16 -0
  175. package/dist/scaffold/integrations/sentry.js.map +1 -0
  176. package/dist/scaffold/integrations/storybook.d.ts +2 -0
  177. package/dist/scaffold/integrations/storybook.js +79 -0
  178. package/dist/scaffold/integrations/storybook.js.map +1 -0
  179. package/dist/scaffold/integrations/vitest.d.ts +2 -0
  180. package/dist/scaffold/integrations/vitest.js +37 -0
  181. package/dist/scaffold/integrations/vitest.js.map +1 -0
  182. package/dist/scaffold/package-builder.d.ts +3 -0
  183. package/dist/scaffold/package-builder.js +136 -0
  184. package/dist/scaffold/package-builder.js.map +1 -0
  185. package/dist/scaffold/packages.d.ts +4 -0
  186. package/dist/scaffold/packages.js +144 -0
  187. package/dist/scaffold/packages.js.map +1 -0
  188. package/dist/scaffold/types.d.ts +20 -0
  189. package/dist/scaffold/types.js +2 -0
  190. package/dist/scaffold/types.js.map +1 -0
  191. package/dist/types.d.ts +11 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils/auth-guard.d.ts +5 -0
  195. package/dist/utils/auth-guard.js +52 -0
  196. package/dist/utils/auth-guard.js.map +1 -0
  197. package/dist/utils/cleanup.d.ts +2 -0
  198. package/dist/utils/cleanup.js +37 -0
  199. package/dist/utils/cleanup.js.map +1 -0
  200. package/dist/utils/constraints.d.ts +11 -0
  201. package/dist/utils/constraints.js +162 -0
  202. package/dist/utils/constraints.js.map +1 -0
  203. package/dist/utils/display.d.ts +32 -0
  204. package/dist/utils/display.js +103 -0
  205. package/dist/utils/display.js.map +1 -0
  206. package/dist/utils/global-config.d.ts +8 -0
  207. package/dist/utils/global-config.js +39 -0
  208. package/dist/utils/global-config.js.map +1 -0
  209. package/dist/utils/pm.d.ts +4 -0
  210. package/dist/utils/pm.js +40 -0
  211. package/dist/utils/pm.js.map +1 -0
  212. package/dist/utils/prerequisites.d.ts +9 -0
  213. package/dist/utils/prerequisites.js +96 -0
  214. package/dist/utils/prerequisites.js.map +1 -0
  215. package/dist/utils/prompts.d.ts +25 -0
  216. package/dist/utils/prompts.js +148 -0
  217. package/dist/utils/prompts.js.map +1 -0
  218. package/dist/utils/validation.d.ts +9 -0
  219. package/dist/utils/validation.js +38 -0
  220. package/dist/utils/validation.js.map +1 -0
  221. package/dist/versions/compat.d.ts +13 -0
  222. package/dist/versions/compat.js +127 -0
  223. package/dist/versions/compat.js.map +1 -0
  224. package/dist/versions/integrity.d.ts +9 -0
  225. package/dist/versions/integrity.js +60 -0
  226. package/dist/versions/integrity.js.map +1 -0
  227. package/dist/versions/parser.d.ts +13 -0
  228. package/dist/versions/parser.js +106 -0
  229. package/dist/versions/parser.js.map +1 -0
  230. package/dist/versions/registry.d.ts +30 -0
  231. package/dist/versions/registry.js +165 -0
  232. package/dist/versions/registry.js.map +1 -0
  233. package/package.json +58 -0
  234. package/scripts/publish.sh +254 -0
@@ -0,0 +1,63 @@
1
+ import { buildOperationsContext, executeOperations } from '../llm/operations.js';
2
+ import { info, success, warn } from '../utils/display.js';
3
+ function extractServiceId(operationsResult) {
4
+ const jsonServiceId = /"serviceId"\s*:\s*"([^"]+)"/i.exec(operationsResult);
5
+ if (jsonServiceId?.[1]) {
6
+ return jsonServiceId[1].trim();
7
+ }
8
+ const prefixedServiceId = /\bsvc_[A-Za-z0-9_-]+\b/.exec(operationsResult);
9
+ if (prefixedServiceId?.[0]) {
10
+ return prefixedServiceId[0];
11
+ }
12
+ const labeledServiceId = /service\s*id\s*[:=]\s*[`"']?([A-Za-z0-9_-]+)[`"']?/i.exec(operationsResult);
13
+ if (labeledServiceId?.[1]) {
14
+ return labeledServiceId[1];
15
+ }
16
+ return null;
17
+ }
18
+ export function getRequiredInfrastructure(resolvedIntegrations, selections) {
19
+ const required = new Set();
20
+ const integrations = new Set(resolvedIntegrations.map((integration) => integration.toLowerCase()));
21
+ if (integrations.has('postgresql') || selections.database === 'postgresql') {
22
+ required.add('postgresql');
23
+ }
24
+ if (integrations.has('mysql') || selections.database === 'mysql') {
25
+ required.add('mysql');
26
+ }
27
+ if (integrations.has('sqlite') || selections.database === 'sqlite') {
28
+ required.add('sqlite');
29
+ }
30
+ if (integrations.has('redis') || integrations.has('bullmq') || selections.jobsProvider === 'bullmq') {
31
+ required.add('redis');
32
+ }
33
+ return Array.from(required);
34
+ }
35
+ export async function provisionInfrastructure(options) {
36
+ const { llmClient, mcpClient, appName, selections, resolvedIntegrations, manifest } = options;
37
+ void appName;
38
+ const infrastructureNeeded = getRequiredInfrastructure(resolvedIntegrations, selections);
39
+ if (infrastructureNeeded.length === 0) {
40
+ return { success: true };
41
+ }
42
+ info('Provisioning infrastructure...');
43
+ try {
44
+ const context = buildOperationsContext('create', resolvedIntegrations, manifest);
45
+ const operationsResult = await executeOperations({
46
+ llmClient,
47
+ mcpClient,
48
+ context,
49
+ });
50
+ const serviceId = extractServiceId(operationsResult);
51
+ success('Infrastructure provisioned.');
52
+ if (serviceId) {
53
+ return { success: true, serviceId };
54
+ }
55
+ return { success: true };
56
+ }
57
+ catch (error) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ warn(`Infrastructure provisioning failed: ${message}`);
60
+ return { success: false, error: message };
61
+ }
62
+ }
63
+ //# sourceMappingURL=create-infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-infra.js","sourceRoot":"","sources":["../../src/commands/create-infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { WorkspaceManifest } from '../manifest/types.js';
2
+ import type { AppSelections } from '../utils/prompts.js';
3
+ export declare function recordAppInManifest(options: {
4
+ appName: string;
5
+ selections: AppSelections;
6
+ resolvedIntegrations: string[];
7
+ manifest: WorkspaceManifest;
8
+ workspaceDir: string;
9
+ serviceId?: string;
10
+ }): WorkspaceManifest;
@@ -0,0 +1,21 @@
1
+ import { addApp, writeManifest } from '../manifest/writer.js';
2
+ export function recordAppInManifest(options) {
3
+ const { appName, selections, resolvedIntegrations, manifest, workspaceDir, serviceId } = options;
4
+ const appEntry = {
5
+ type: selections.appType,
6
+ framework: selections.framework,
7
+ integrations: resolvedIntegrations,
8
+ createdAt: new Date().toISOString(),
9
+ ...(serviceId
10
+ ? {
11
+ railway: {
12
+ serviceId,
13
+ },
14
+ }
15
+ : {}),
16
+ };
17
+ const updatedManifest = addApp(manifest, appName, appEntry);
18
+ writeManifest(workspaceDir, updatedManifest);
19
+ return updatedManifest;
20
+ }
21
+ //# sourceMappingURL=create-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-manifest.js","sourceRoot":"","sources":["../../src/commands/create-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,UAAU,mBAAmB,CAAC,OAOnC;IACC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEjG,MAAM,QAAQ,GAAa;QACzB,IAAI,EAAE,UAAU,CAAC,OAAO;QACxB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,YAAY,EAAE,oBAAoB;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,OAAO,EAAE;oBACP,SAAS;iBACV;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D,aAAa,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7C,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { WorkspaceManifest } from '../manifest/types.js';
2
+ import type { AppSelections } from '../utils/prompts.js';
3
+ export interface PackageAction {
4
+ packageName: string;
5
+ action: 'created' | 'wired';
6
+ }
7
+ export declare function getRequiredPackages(selections: AppSelections, resolvedIntegrations: string[]): string[];
8
+ export declare function wireSharedPackages(options: {
9
+ appName: string;
10
+ selections: AppSelections;
11
+ resolvedIntegrations: string[];
12
+ manifest: WorkspaceManifest;
13
+ workspaceDir: string;
14
+ }): {
15
+ manifest: WorkspaceManifest;
16
+ actions: PackageAction[];
17
+ };
@@ -0,0 +1,69 @@
1
+ import { addConsumer, addPackage } from '../manifest/writer.js';
2
+ function hasIntegration(integrations, integration) {
3
+ return integrations.has(integration);
4
+ }
5
+ function getDbClient(selections) {
6
+ if (!selections.orm || !selections.database) {
7
+ return undefined;
8
+ }
9
+ return `${selections.orm}-${selections.database}`;
10
+ }
11
+ function createPackageEntry(packageName, selections) {
12
+ if (packageName === 'db') {
13
+ const dbClient = getDbClient(selections);
14
+ return {
15
+ active: true,
16
+ consumers: [],
17
+ clients: dbClient ? [dbClient] : [],
18
+ };
19
+ }
20
+ return {
21
+ active: true,
22
+ consumers: [],
23
+ };
24
+ }
25
+ export function getRequiredPackages(selections, resolvedIntegrations) {
26
+ const requiredPackages = new Set();
27
+ const integrations = new Set([...selections.integrations, ...resolvedIntegrations]);
28
+ if (hasIntegration(integrations, 'auth') || hasIntegration(integrations, 'better-auth')) {
29
+ requiredPackages.add('auth');
30
+ }
31
+ if (hasIntegration(integrations, 'database') || hasIntegration(integrations, 'drizzle') || hasIntegration(integrations, 'prisma')) {
32
+ requiredPackages.add('db');
33
+ }
34
+ if (hasIntegration(integrations, 'background-jobs') || hasIntegration(integrations, 'bullmq') || hasIntegration(integrations, 'trigger-dev')) {
35
+ requiredPackages.add('jobs');
36
+ }
37
+ if (selections.appType === 'frontend') {
38
+ requiredPackages.add('tailwind-config');
39
+ requiredPackages.add('ui');
40
+ requiredPackages.add('components');
41
+ if (selections.framework === 'tanstack-start') {
42
+ requiredPackages.add('tanstack-query');
43
+ }
44
+ }
45
+ return Array.from(requiredPackages);
46
+ }
47
+ export function wireSharedPackages(options) {
48
+ const { appName, manifest, resolvedIntegrations, selections, workspaceDir } = options;
49
+ void workspaceDir;
50
+ const requiredPackages = getRequiredPackages(selections, resolvedIntegrations);
51
+ const actions = [];
52
+ let nextManifest = manifest;
53
+ for (const packageName of requiredPackages) {
54
+ if (nextManifest.packages[packageName]) {
55
+ nextManifest = addConsumer(nextManifest, packageName, appName);
56
+ actions.push({ packageName, action: 'wired' });
57
+ continue;
58
+ }
59
+ const packageEntry = createPackageEntry(packageName, selections);
60
+ nextManifest = addPackage(nextManifest, packageName, packageEntry);
61
+ nextManifest = addConsumer(nextManifest, packageName, appName);
62
+ actions.push({ packageName, action: 'created' });
63
+ }
64
+ return {
65
+ manifest: nextManifest,
66
+ actions,
67
+ };
68
+ }
69
+ //# sourceMappingURL=create-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-packages.js","sourceRoot":"","sources":["../../src/commands/create-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAShE,SAAS,cAAc,CAAC,YAAyB,EAAE,WAAmB;IACpE,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,UAAyB;IAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,UAAyB;IACxE,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAyB,EAAE,oBAA8B;IAC3F,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,UAAU,CAAC,YAAY,EAAE,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAC5F,IAAI,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QACxF,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,cAAc,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QAC7I,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACtC,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,KAAK,gBAAgB,EAAE,CAAC;YAC9C,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAMlC;IACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACtF,KAAK,YAAY,CAAC;IAElB,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,IAAI,YAAY,GAAG,QAAQ,CAAC;IAE5B,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;QAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACjE,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QACnE,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PackageManager } from '../utils/pm.js';
2
+ export interface CommandResult {
3
+ command: string;
4
+ purpose: string;
5
+ status: 'executed' | 'blocked' | 'failed';
6
+ error?: string;
7
+ }
8
+ export declare function executeCommandPipeline(commands: Array<{
9
+ command: string;
10
+ purpose: string;
11
+ }>, options: {
12
+ workspaceDir: string;
13
+ packageManager: PackageManager;
14
+ dryRun?: boolean;
15
+ }): CommandResult[];
@@ -0,0 +1,57 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { join } from 'node:path';
3
+ import { createAuditLogger } from '../audit/logger.js';
4
+ import { validateCommand } from '../sandbox/command-allowlist.js';
5
+ import { error, info, warn } from '../utils/display.js';
6
+ export function executeCommandPipeline(commands, options) {
7
+ const auditLogger = createAuditLogger(options.workspaceDir);
8
+ const results = [];
9
+ for (const cmd of commands) {
10
+ info(`Running: ${cmd.purpose}`);
11
+ const cdMatch = /^cd ([A-Za-z0-9._/-]+) && (.+)$/.exec(cmd.command);
12
+ const cwd = cdMatch ? join(options.workspaceDir, cdMatch[1]) : options.workspaceDir;
13
+ const bare = cdMatch ? cdMatch[2] : cmd.command;
14
+ const validation = validateCommand(bare, options.packageManager);
15
+ if (!validation.allowed) {
16
+ const reason = validation.reason ?? 'Command failed security validation';
17
+ auditLogger.security('BLOCKED', `command: "${cmd.command}" (reason: ${reason})`);
18
+ warn(`Blocked: ${cmd.command} — ${reason}`);
19
+ results.push({
20
+ command: cmd.command,
21
+ purpose: cmd.purpose,
22
+ status: 'blocked',
23
+ error: reason,
24
+ });
25
+ continue;
26
+ }
27
+ if (options.dryRun) {
28
+ results.push({
29
+ command: cmd.command,
30
+ purpose: cmd.purpose,
31
+ status: 'executed',
32
+ });
33
+ continue;
34
+ }
35
+ try {
36
+ execSync(bare, { cwd, stdio: 'inherit' });
37
+ results.push({
38
+ command: cmd.command,
39
+ purpose: cmd.purpose,
40
+ status: 'executed',
41
+ });
42
+ }
43
+ catch (caughtError) {
44
+ const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
45
+ error(`Failed: ${cmd.command} — ${message}`);
46
+ results.push({
47
+ command: cmd.command,
48
+ purpose: cmd.purpose,
49
+ status: 'failed',
50
+ error: message,
51
+ });
52
+ break;
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ //# sourceMappingURL=create-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-pipeline.js","sourceRoot":"","sources":["../../src/commands/create-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type LlmClient } from '../llm/client.js';
2
+ import { type ScaffoldingResult } from '../llm/scaffolding.js';
3
+ import { type WorkspaceManifest } from '../manifest/types.js';
4
+ import { type AppSelections } from '../utils/prompts.js';
5
+ export declare function executeCreateScaffolding(options: {
6
+ llmClient: LlmClient;
7
+ selections: AppSelections;
8
+ resolvedIntegrations: string[];
9
+ manifest: WorkspaceManifest;
10
+ workspaceDir: string;
11
+ onChunk?: (chunkText: string, totalChars: number) => void;
12
+ }): Promise<ScaffoldingResult>;
@@ -0,0 +1,137 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildScaffoldingContext, executeScaffolding, } from '../llm/scaffolding.js';
4
+ import { generateVersionsMarkdown, parseVersionsTable } from '../versions/parser.js';
5
+ import { generateVersionsHash, writeVersionsLock } from '../versions/integrity.js';
6
+ import { warn } from '../utils/display.js';
7
+ import { checkCompatibility } from '../versions/compat.js';
8
+ import { fetchLatestVersion, fetchSecondaryVersions, INTEGRATION_NPM_MAP, verifyVersionsExist, } from '../versions/registry.js';
9
+ import { buildStaticScaffold, isStaticScaffoldSupported } from '../scaffold/index.js';
10
+ const FRAMEWORK_VERSION_KEY = {
11
+ 'tanstack-start': 'TanStack Start',
12
+ 'nextjs': 'Next.js',
13
+ 'express': 'Express.js',
14
+ 'hono': 'Hono',
15
+ };
16
+ const INTEGRATION_VERSION_KEY = {
17
+ 'tailwindcss': 'TailwindCSS',
18
+ 'shadcn': 'shadcn/ui',
19
+ 'drizzle': 'Drizzle ORM',
20
+ 'prisma': 'Prisma',
21
+ 'better-auth': 'Better Auth',
22
+ 'auth': 'Better Auth',
23
+ 'stripe': 'Stripe SDK',
24
+ 'payments': 'Stripe SDK',
25
+ 'polar': 'Polar SDK',
26
+ 'resend': 'Resend SDK',
27
+ 'email': 'Resend SDK',
28
+ 'bullmq': 'BullMQ',
29
+ 'trigger-dev': 'Trigger.dev SDK',
30
+ 'background-jobs': 'BullMQ',
31
+ 'posthog': 'PostHog JS',
32
+ 'sentry': 'Sentry JS',
33
+ 'vitest': 'Vitest',
34
+ 'playwright': 'Playwright',
35
+ 'storybook': 'Storybook',
36
+ };
37
+ function resolveNeededVersionKeys(selections, resolvedIntegrations) {
38
+ const needed = new Set();
39
+ const frameworkKey = FRAMEWORK_VERSION_KEY[selections.framework];
40
+ if (frameworkKey)
41
+ needed.add(frameworkKey);
42
+ for (const integration of resolvedIntegrations) {
43
+ const key = INTEGRATION_VERSION_KEY[integration];
44
+ if (key)
45
+ needed.add(key);
46
+ }
47
+ return [...needed].filter((k) => k in INTEGRATION_NPM_MAP);
48
+ }
49
+ function toVersionsRecord(content) {
50
+ const { entries } = parseVersionsTable(content);
51
+ return entries.reduce((versions, entry) => {
52
+ versions[entry.integration] = entry.version;
53
+ return versions;
54
+ }, {});
55
+ }
56
+ async function runPreflightAndAutoHeal(versions, neededKeys, workspaceDir) {
57
+ const preflight = await verifyVersionsExist(versions, neededKeys);
58
+ const missing = preflight.filter((r) => !r.exists);
59
+ if (missing.length === 0)
60
+ return versions;
61
+ const healed = { ...versions };
62
+ const healResults = await Promise.allSettled(missing.map(async (r) => {
63
+ const latest = await fetchLatestVersion(r.npmPackage);
64
+ return { integration: r.integration, npmPackage: r.npmPackage, latest };
65
+ }));
66
+ const healedEntries = [];
67
+ for (const r of healResults) {
68
+ if (r.status === 'fulfilled' && r.value.latest !== null) {
69
+ healed[r.value.integration] = r.value.latest;
70
+ healedEntries.push({ integration: r.value.integration, version: r.value.latest });
71
+ warn(`versions.md: ${r.value.integration} ${versions[r.value.integration] ?? '?'} not found on npm — auto-updated to ${r.value.latest}`);
72
+ }
73
+ else {
74
+ const info = r.status === 'fulfilled' ? r.value : { integration: 'unknown', npmPackage: 'unknown' };
75
+ warn(`versions.md: ${info.integration} (${info.npmPackage}) could not be resolved — using pinned value`);
76
+ }
77
+ }
78
+ if (healedEntries.length > 0) {
79
+ const versionsPath = join(workspaceDir, 'versions.md');
80
+ const { entries: existingEntries } = parseVersionsTable(readFileSync(versionsPath, 'utf8'));
81
+ const healMap = new Map(healedEntries.map((e) => [e.integration, e.version]));
82
+ const updatedEntries = existingEntries.map((e) => ({
83
+ integration: e.integration,
84
+ version: healMap.get(e.integration) ?? e.version,
85
+ }));
86
+ writeFileSync(versionsPath, generateVersionsMarkdown(updatedEntries), 'utf8');
87
+ writeVersionsLock(workspaceDir, generateVersionsHash(updatedEntries));
88
+ }
89
+ return healed;
90
+ }
91
+ export async function executeCreateScaffolding(options) {
92
+ const neededKeys = resolveNeededVersionKeys(options.selections, options.resolvedIntegrations);
93
+ const versionsPath = join(options.workspaceDir, 'versions.md');
94
+ const versionsContent = readFileSync(versionsPath, 'utf8');
95
+ const primaryVersions = toVersionsRecord(versionsContent);
96
+ const [secondaryVersions, healedPrimary] = await Promise.all([
97
+ fetchSecondaryVersions(),
98
+ runPreflightAndAutoHeal(primaryVersions, neededKeys, options.workspaceDir),
99
+ ]);
100
+ const mergedVersions = { ...healedPrimary, ...secondaryVersions };
101
+ const compat = await checkCompatibility(mergedVersions, options.resolvedIntegrations, options.selections.framework);
102
+ for (const issue of compat.warnings) {
103
+ warn(`Compatibility: ${issue.package} requires ${issue.peer} ${issue.required}, workspace has ${issue.installed}`);
104
+ }
105
+ for (const issue of compat.errors) {
106
+ warn(`Compatibility conflict: ${issue.package} requires ${issue.peer} ${issue.required}, workspace has ${issue.installed} — scaffolding may fail`);
107
+ }
108
+ const { framework, appName, appType } = options.selections;
109
+ if (isStaticScaffoldSupported(framework)) {
110
+ const staticResult = buildStaticScaffold({
111
+ appName,
112
+ appType,
113
+ framework,
114
+ integrations: options.resolvedIntegrations,
115
+ versions: mergedVersions,
116
+ workspaceName: options.manifest.workspace.name,
117
+ });
118
+ return {
119
+ scaffolding: {
120
+ commands: staticResult.commands,
121
+ newFiles: staticResult.files,
122
+ astTransforms: [],
123
+ },
124
+ debug: { durationMs: 0, inputTokens: 0, outputTokens: 0 },
125
+ };
126
+ }
127
+ const context = buildScaffoldingContext({
128
+ appName,
129
+ appType,
130
+ framework,
131
+ integrations: options.resolvedIntegrations,
132
+ versions: { ...healedPrimary, ...secondaryVersions },
133
+ manifest: options.manifest,
134
+ });
135
+ return executeScaffolding(options.llmClient, context, options.onChunk);
136
+ }
137
+ //# sourceMappingURL=create-scaffolding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-scaffolding.js","sourceRoot":"","sources":["../../src/commands/create-scaffolding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type StagedFile } from '../sandbox/staging.js';
2
+ import { type ScanResult } from '../sandbox/scanner.js';
3
+ export type { StagedFile } from '../sandbox/staging.js';
4
+ export type { ScanResult } from '../sandbox/scanner.js';
5
+ export interface StagingResult {
6
+ stagedFiles: StagedFile[];
7
+ scanResult: ScanResult;
8
+ diffSummary: string[];
9
+ }
10
+ export declare function stageNewFiles(newFiles: Array<{
11
+ path: string;
12
+ content: string;
13
+ }>, workspaceDir: string): StagingResult;
@@ -0,0 +1,17 @@
1
+ import { clearStaging, generateDiffSummary, listStagedFiles, writeToStaging, } from '../sandbox/staging.js';
2
+ import { scanStagedFiles } from '../sandbox/scanner.js';
3
+ export function stageNewFiles(newFiles, workspaceDir) {
4
+ clearStaging(workspaceDir);
5
+ for (const file of newFiles) {
6
+ writeToStaging(workspaceDir, file.path, file.content);
7
+ }
8
+ const stagedFiles = listStagedFiles(workspaceDir);
9
+ const scanResult = scanStagedFiles(workspaceDir);
10
+ const diffSummary = generateDiffSummary(workspaceDir, stagedFiles);
11
+ return {
12
+ stagedFiles,
13
+ scanResult,
14
+ diffSummary,
15
+ };
16
+ }
17
+ //# sourceMappingURL=create-staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-staging.js","sourceRoot":"","sources":["../../src/commands/create-staging.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,cAAc,GAEf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAmB,MAAM,uBAAuB,CAAC;AAWzE,MAAM,UAAU,aAAa,CAAC,QAAkD,EAAE,YAAoB;IACpG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAEnE,OAAO;QACL,WAAW;QACX,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type AstEngineResult } from '../ast/engine.js';
2
+ export type { AstEngineResult } from '../ast/engine.js';
3
+ export interface TransformPipelineResult {
4
+ engineResult: AstEngineResult;
5
+ validationErrors: string[];
6
+ }
7
+ export declare function executeTransformPipeline(transforms: Array<{
8
+ path: string;
9
+ operations: Array<Record<string, unknown>>;
10
+ }>, workspaceDir: string): TransformPipelineResult;
@@ -0,0 +1,33 @@
1
+ import { createAstEngine, } from '../ast/engine.js';
2
+ import { applyOperation } from '../ast/operations.js';
3
+ import { validateTransforms } from '../ast/validator.js';
4
+ function toAstTransforms(transforms) {
5
+ return transforms.map((transform) => ({
6
+ path: transform.path,
7
+ operations: transform.operations,
8
+ }));
9
+ }
10
+ const EMPTY_ENGINE_RESULT = {
11
+ success: false,
12
+ modifiedFiles: [],
13
+ errors: [],
14
+ };
15
+ export function executeTransformPipeline(transforms, workspaceDir) {
16
+ const typedTransforms = toAstTransforms(transforms);
17
+ const validation = validateTransforms(workspaceDir, typedTransforms);
18
+ if (!validation.valid) {
19
+ return {
20
+ engineResult: EMPTY_ENGINE_RESULT,
21
+ validationErrors: validation.errors.map((validationError) => validationError.filePath
22
+ ? `${validationError.filePath}: ${validationError.message}`
23
+ : validationError.message),
24
+ };
25
+ }
26
+ const engine = createAstEngine(workspaceDir);
27
+ const engineResult = engine.applyTransforms(typedTransforms, applyOperation);
28
+ return {
29
+ engineResult,
30
+ validationErrors: [],
31
+ };
32
+ }
33
+ //# sourceMappingURL=create-transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-transforms.js","sourceRoot":"","sources":["../../src/commands/create-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AASzD,SAAS,eAAe,CACtB,UAA+E;IAE/E,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,UAAU,EAAE,SAAS,CAAC,UAA4B;KACnD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,mBAAmB,GAAoB;IAC3C,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,UAA+E,EAC/E,YAAoB;IAEpB,MAAM,eAAe,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAErE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,YAAY,EAAE,mBAAmB;YACjC,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE,CAC1D,eAAe,CAAC,QAAQ;gBACtB,CAAC,CAAC,GAAG,eAAe,CAAC,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE;gBAC3D,CAAC,CAAC,eAAe,CAAC,OAAO,CAC5B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE7E,OAAO;QACL,YAAY;QACZ,gBAAgB,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { AppContext } from '../types.js';
2
+ export default function createCommand(context: AppContext, _args: string[]): Promise<void>;