@cogitator-ai/deploy 0.1.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.
Files changed (46) hide show
  1. package/README.md +122 -0
  2. package/dist/analyzer.d.ts +24 -0
  3. package/dist/analyzer.d.ts.map +1 -0
  4. package/dist/analyzer.js +79 -0
  5. package/dist/analyzer.js.map +1 -0
  6. package/dist/deployer.d.ts +27 -0
  7. package/dist/deployer.d.ts.map +1 -0
  8. package/dist/deployer.js +64 -0
  9. package/dist/deployer.js.map +1 -0
  10. package/dist/generator.d.ts +8 -0
  11. package/dist/generator.d.ts.map +1 -0
  12. package/dist/generator.js +40 -0
  13. package/dist/generator.js.map +1 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +6 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/providers/base.d.ts +10 -0
  19. package/dist/providers/base.d.ts.map +1 -0
  20. package/dist/providers/base.js +2 -0
  21. package/dist/providers/base.js.map +1 -0
  22. package/dist/providers/docker.d.ts +11 -0
  23. package/dist/providers/docker.d.ts.map +1 -0
  24. package/dist/providers/docker.js +78 -0
  25. package/dist/providers/docker.js.map +1 -0
  26. package/dist/providers/fly.d.ts +11 -0
  27. package/dist/providers/fly.d.ts.map +1 -0
  28. package/dist/providers/fly.js +117 -0
  29. package/dist/providers/fly.js.map +1 -0
  30. package/dist/templates/docker-compose.d.ts +3 -0
  31. package/dist/templates/docker-compose.d.ts.map +1 -0
  32. package/dist/templates/docker-compose.js +66 -0
  33. package/dist/templates/docker-compose.js.map +1 -0
  34. package/dist/templates/dockerfile.d.ts +8 -0
  35. package/dist/templates/dockerfile.d.ts.map +1 -0
  36. package/dist/templates/dockerfile.js +31 -0
  37. package/dist/templates/dockerfile.js.map +1 -0
  38. package/dist/templates/fly-toml.d.ts +3 -0
  39. package/dist/templates/fly-toml.d.ts.map +1 -0
  40. package/dist/templates/fly-toml.js +33 -0
  41. package/dist/templates/fly-toml.js.map +1 -0
  42. package/dist/utils/exec.d.ts +9 -0
  43. package/dist/utils/exec.d.ts.map +1 -0
  44. package/dist/utils/exec.js +24 -0
  45. package/dist/utils/exec.js.map +1 -0
  46. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # @cogitator-ai/deploy
2
+
3
+ One-command deployment engine for Cogitator agents. Supports Docker and Fly.io targets with auto-detection of project configuration.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @cogitator-ai/deploy
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### Via CLI
14
+
15
+ ```bash
16
+ # Deploy to Docker (default)
17
+ cogitator deploy
18
+
19
+ # Deploy to Fly.io
20
+ cogitator deploy --target fly
21
+
22
+ # Dry run — see what would happen
23
+ cogitator deploy --dry-run
24
+
25
+ # Check status
26
+ cogitator deploy status
27
+
28
+ # Tear down
29
+ cogitator deploy destroy
30
+ ```
31
+
32
+ ### Programmatic API
33
+
34
+ ```typescript
35
+ import { Deployer } from '@cogitator-ai/deploy';
36
+
37
+ const deployer = new Deployer();
38
+
39
+ // Plan deployment
40
+ const plan = await deployer.plan({
41
+ projectDir: process.cwd(),
42
+ target: 'docker',
43
+ dryRun: false,
44
+ noPush: true,
45
+ });
46
+
47
+ // Execute deployment
48
+ const result = await deployer.deploy({
49
+ projectDir: process.cwd(),
50
+ target: 'fly',
51
+ });
52
+
53
+ console.log(result.url); // https://my-app.fly.dev
54
+ ```
55
+
56
+ ## Configuration
57
+
58
+ Add a `deploy` section to `cogitator.yml`:
59
+
60
+ ```yaml
61
+ deploy:
62
+ target: fly
63
+ port: 3000
64
+ region: iad
65
+ instances: 2
66
+ registry: ghcr.io/myorg/myapp
67
+ services:
68
+ redis: true
69
+ postgres: true
70
+ secrets:
71
+ - OPENAI_API_KEY
72
+ - DATABASE_URL
73
+ ```
74
+
75
+ ## Auto-Detection
76
+
77
+ The deploy engine automatically detects:
78
+
79
+ | What | Source | Example |
80
+ |------|--------|---------|
81
+ | Server adapter | `package.json` dependencies | `@cogitator-ai/express` → Express |
82
+ | Services | `cogitator.yml` memory config | `adapter: redis` → Redis service |
83
+ | Required secrets | LLM provider configs | `openai` → `OPENAI_API_KEY` |
84
+ | Ollama Cloud | Model suffix or API key | `:cloud` suffix → `OLLAMA_API_KEY` |
85
+
86
+ ## Deploy Targets
87
+
88
+ ### Docker
89
+
90
+ Generates a multi-stage `Dockerfile` and optional `docker-compose.prod.yml`:
91
+
92
+ ```bash
93
+ cogitator deploy --target docker # Build only
94
+ cogitator deploy --target docker --push # Build + push to registry
95
+ ```
96
+
97
+ ### Fly.io
98
+
99
+ Generates `fly.toml` and deploys via `flyctl`:
100
+
101
+ ```bash
102
+ cogitator deploy --target fly --region iad
103
+ ```
104
+
105
+ Requires `flyctl` installed and authenticated.
106
+
107
+ ## Architecture
108
+
109
+ ```
110
+ ProjectAnalyzer → ArtifactGenerator → DeployProvider → Result
111
+ (detect config) (Dockerfile, etc.) (docker/fly) (url, status)
112
+ ```
113
+
114
+ - **ProjectAnalyzer** — reads `package.json` and `cogitator.yml` to detect server, services, secrets
115
+ - **ArtifactGenerator** — generates Dockerfile, docker-compose, fly.toml from templates
116
+ - **DeployProvider** — executes preflight checks, builds, deploys (Docker or Fly.io)
117
+ - **Deployer** — orchestrator that ties it all together
118
+
119
+ ## See Also
120
+
121
+ - [Deployment Guide](../../docs/DEPLOY.md) — full documentation with CI/CD examples
122
+ - [CLI Reference](../cli/README.md) — all CLI commands
@@ -0,0 +1,24 @@
1
+ import type { DeployConfig, DeployServer, DeployServicesConfig, DeployTarget } from '@cogitator-ai/types';
2
+ import type { CogitatorConfigInput } from '@cogitator-ai/config';
3
+ interface PackageJson {
4
+ dependencies?: Record<string, string>;
5
+ devDependencies?: Record<string, string>;
6
+ }
7
+ export interface AnalyzerResult {
8
+ server?: DeployServer;
9
+ services: DeployServicesConfig;
10
+ secrets: string[];
11
+ warnings: string[];
12
+ hasTypeScript: boolean;
13
+ deployConfig: DeployConfig;
14
+ }
15
+ export declare class ProjectAnalyzer {
16
+ detectServer(pkg: PackageJson): DeployServer | undefined;
17
+ detectServices(config: CogitatorConfigInput): DeployServicesConfig;
18
+ detectSecrets(model: string): string[];
19
+ isOllamaCloud(model: string): boolean;
20
+ getDeployWarnings(model: string, target: DeployTarget): string[];
21
+ analyze(projectDir: string, configOverrides?: DeployConfig): AnalyzerResult;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAoBjE,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBAAa,eAAe;IAC1B,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS;IAQxD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAQlE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAetC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKrC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE;IAehE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,YAAY,GAAG,cAAc;CAoB5E"}
@@ -0,0 +1,79 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const SERVER_PACKAGES = {
4
+ '@cogitator-ai/express': 'express',
5
+ '@cogitator-ai/fastify': 'fastify',
6
+ '@cogitator-ai/hono': 'hono',
7
+ '@cogitator-ai/koa': 'koa',
8
+ };
9
+ const MODEL_SECRET_MAP = {
10
+ openai: 'OPENAI_API_KEY',
11
+ anthropic: 'ANTHROPIC_API_KEY',
12
+ google: 'GOOGLE_API_KEY',
13
+ azure: 'AZURE_OPENAI_API_KEY',
14
+ bedrock: 'AWS_ACCESS_KEY_ID',
15
+ ollama: 'OLLAMA_API_KEY',
16
+ };
17
+ export class ProjectAnalyzer {
18
+ detectServer(pkg) {
19
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
20
+ for (const [pkgName, server] of Object.entries(SERVER_PACKAGES)) {
21
+ if (pkgName in allDeps)
22
+ return server;
23
+ }
24
+ return undefined;
25
+ }
26
+ detectServices(config) {
27
+ const adapter = config.memory?.adapter;
28
+ return {
29
+ redis: adapter === 'redis',
30
+ postgres: adapter === 'postgres',
31
+ };
32
+ }
33
+ detectSecrets(model) {
34
+ const secrets = [];
35
+ const provider = model.split('/')[0];
36
+ if (provider && provider in MODEL_SECRET_MAP) {
37
+ if (provider === 'ollama' && this.isOllamaCloud(model)) {
38
+ secrets.push(MODEL_SECRET_MAP[provider]);
39
+ }
40
+ else if (provider !== 'ollama') {
41
+ secrets.push(MODEL_SECRET_MAP[provider]);
42
+ }
43
+ }
44
+ return secrets;
45
+ }
46
+ isOllamaCloud(model) {
47
+ const modelName = model.includes('/') ? model.split('/')[1] : model;
48
+ return modelName?.includes(':cloud') ?? false;
49
+ }
50
+ getDeployWarnings(model, target) {
51
+ const warnings = [];
52
+ const provider = model.split('/')[0];
53
+ if (provider === 'ollama' && !this.isOllamaCloud(model) && target !== 'docker') {
54
+ warnings.push(`Model "${model}" requires local Ollama server. Cloud targets don't include Ollama. ` +
55
+ 'Use a cloud model (e.g. qwen3.5:cloud with OLLAMA_API_KEY), switch to a cloud LLM provider, ' +
56
+ 'or set OLLAMA_HOST to an external Ollama URL.');
57
+ }
58
+ return warnings;
59
+ }
60
+ analyze(projectDir, configOverrides) {
61
+ const pkgPath = join(projectDir, 'package.json');
62
+ const pkg = existsSync(pkgPath) ? JSON.parse(readFileSync(pkgPath, 'utf-8')) : {};
63
+ const server = configOverrides?.server ?? this.detectServer(pkg);
64
+ const hasTypeScript = existsSync(join(projectDir, 'tsconfig.json'));
65
+ return {
66
+ server,
67
+ services: configOverrides?.services ?? { redis: false, postgres: false },
68
+ secrets: configOverrides?.secrets ?? [],
69
+ warnings: [],
70
+ hasTypeScript,
71
+ deployConfig: {
72
+ ...configOverrides,
73
+ server,
74
+ port: configOverrides?.port ?? 3000,
75
+ },
76
+ };
77
+ }
78
+ }
79
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,eAAe,GAAiC;IACpD,uBAAuB,EAAE,SAAS;IAClC,uBAAuB,EAAE,SAAS;IAClC,oBAAoB,EAAE,MAAM;IAC5B,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAEF,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,sBAAsB;IAC7B,OAAO,EAAE,mBAAmB;IAC5B,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAgBF,MAAM,OAAO,eAAe;IAC1B,YAAY,CAAC,GAAgB;QAC3B,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAChE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YAChE,IAAI,OAAO,IAAI,OAAO;gBAAE,OAAO,MAAM,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,MAA4B;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QACvC,OAAO;YACL,KAAK,EAAE,OAAO,KAAK,OAAO;YAC1B,QAAQ,EAAE,OAAO,KAAK,UAAU;SACjC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,QAAQ,IAAI,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YAC7C,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACpE,OAAO,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAChD,CAAC;IAED,iBAAiB,CAAC,KAAa,EAAE,MAAoB;QACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/E,QAAQ,CAAC,IAAI,CACX,UAAU,KAAK,sEAAsE;gBACnF,8FAA8F;gBAC9F,+CAA+C,CAClD,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,UAAkB,EAAE,eAA8B;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,GAAG,GAAgB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/F,MAAM,MAAM,GAAG,eAAe,EAAE,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QAEpE,OAAO;YACL,MAAM;YACN,QAAQ,EAAE,eAAe,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;YACxE,OAAO,EAAE,eAAe,EAAE,OAAO,IAAI,EAAE;YACvC,QAAQ,EAAE,EAAE;YACZ,aAAa;YACb,YAAY,EAAE;gBACZ,GAAG,eAAe;gBAClB,MAAM;gBACN,IAAI,EAAE,eAAe,EAAE,IAAI,IAAI,IAAI;aACpC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { DeployConfig, DeployResult, DeployStatus, DeployTarget, PreflightResult } from '@cogitator-ai/types';
2
+ import type { DeployProvider } from './providers/base.js';
3
+ export interface DeployOptions {
4
+ projectDir: string;
5
+ target: DeployTarget;
6
+ dryRun?: boolean;
7
+ noPush?: boolean;
8
+ configOverrides?: Partial<DeployConfig>;
9
+ }
10
+ export interface DeployPlan {
11
+ config: DeployConfig;
12
+ preflight: PreflightResult;
13
+ provider: DeployProvider;
14
+ }
15
+ export declare class Deployer {
16
+ private providers;
17
+ private analyzer;
18
+ private generator;
19
+ constructor();
20
+ registerProvider(provider: DeployProvider): void;
21
+ getProvider(target: DeployTarget): DeployProvider;
22
+ plan(options: DeployOptions): Promise<DeployPlan>;
23
+ deploy(options: DeployOptions): Promise<DeployResult>;
24
+ status(target: DeployTarget, config: DeployConfig, projectDir: string): Promise<DeployStatus>;
25
+ destroy(target: DeployTarget, config: DeployConfig, projectDir: string): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../src/deployer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAA2B;;IAO5C,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIhD,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc;IAU3C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBjD,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBrD,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAKlB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI7F"}
@@ -0,0 +1,64 @@
1
+ import { DockerProvider } from './providers/docker.js';
2
+ import { FlyProvider } from './providers/fly.js';
3
+ import { ProjectAnalyzer } from './analyzer.js';
4
+ import { ArtifactGenerator } from './generator.js';
5
+ export class Deployer {
6
+ providers = new Map();
7
+ analyzer = new ProjectAnalyzer();
8
+ generator = new ArtifactGenerator();
9
+ constructor() {
10
+ this.registerProvider(new DockerProvider());
11
+ this.registerProvider(new FlyProvider());
12
+ }
13
+ registerProvider(provider) {
14
+ this.providers.set(provider.name, provider);
15
+ }
16
+ getProvider(target) {
17
+ const provider = this.providers.get(target);
18
+ if (!provider) {
19
+ throw new Error(`Unknown deploy target: "${target}". Available: ${[...this.providers.keys()].join(', ')}`);
20
+ }
21
+ return provider;
22
+ }
23
+ async plan(options) {
24
+ const analysis = this.analyzer.analyze(options.projectDir, options.configOverrides);
25
+ const config = {
26
+ ...analysis.deployConfig,
27
+ ...options.configOverrides,
28
+ target: options.target,
29
+ };
30
+ if (options.noPush) {
31
+ delete config.registry;
32
+ }
33
+ const provider = this.getProvider(options.target);
34
+ const preflight = await provider.preflight(config, options.projectDir);
35
+ return { config, preflight, provider };
36
+ }
37
+ async deploy(options) {
38
+ const { config, preflight, provider } = await this.plan(options);
39
+ if (!preflight.passed) {
40
+ const failures = preflight.checks.filter((c) => !c.passed);
41
+ return {
42
+ success: false,
43
+ error: `Preflight failed:\n${failures.map((f) => ` - ${f.message}${f.fix ? ` (${f.fix})` : ''}`).join('\n')}`,
44
+ };
45
+ }
46
+ const analysis = this.analyzer.analyze(options.projectDir);
47
+ const artifacts = this.generator.generate(config, {
48
+ hasTypeScript: analysis.hasTypeScript,
49
+ });
50
+ if (options.dryRun) {
51
+ return { success: true, url: '(dry run)' };
52
+ }
53
+ return provider.deploy(config, artifacts, options.projectDir);
54
+ }
55
+ async status(target, config, projectDir) {
56
+ const provider = this.getProvider(target);
57
+ return provider.status(config, projectDir);
58
+ }
59
+ async destroy(target, config, projectDir) {
60
+ const provider = this.getProvider(target);
61
+ return provider.destroy(config, projectDir);
62
+ }
63
+ }
64
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../src/deployer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAgBnD,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,SAAS,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAE5C;QACE,IAAI,CAAC,gBAAgB,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,QAAwB;QACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,iBAAiB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAsB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CACpC,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,eAA+B,CACxC,CAAC;QAEF,MAAM,MAAM,GAAiB;YAC3B,GAAG,QAAQ,CAAC,YAAY;YACxB,GAAG,OAAO,CAAC,eAAe;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAEvE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC/G,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;YAChD,aAAa,EAAE,QAAQ,CAAC,aAAa;SACtC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;QAC7C,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAoB,EACpB,MAAoB,EACpB,UAAkB;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB,EAAE,MAAoB,EAAE,UAAkB;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { DeployConfig, GeneratedArtifacts } from '@cogitator-ai/types';
2
+ export interface GeneratorOptions {
3
+ hasTypeScript: boolean;
4
+ }
5
+ export declare class ArtifactGenerator {
6
+ generate(config: DeployConfig, options: GeneratorOptions): GeneratedArtifacts;
7
+ }
8
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK/F,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;CACxB;AAYD,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,GAAG,kBAAkB;CA8B9E"}
@@ -0,0 +1,40 @@
1
+ import { generateDockerfile } from './templates/dockerfile.js';
2
+ import { generateDockerCompose } from './templates/docker-compose.js';
3
+ import { generateFlyToml } from './templates/fly-toml.js';
4
+ const DOCKERIGNORE = `node_modules
5
+ dist
6
+ .git
7
+ .gitignore
8
+ .env
9
+ .env.*
10
+ *.md
11
+ .cogitator
12
+ `;
13
+ export class ArtifactGenerator {
14
+ generate(config, options) {
15
+ const files = [];
16
+ const target = config.target ?? 'docker';
17
+ files.push({
18
+ path: 'Dockerfile',
19
+ content: generateDockerfile({ config, hasTypeScript: options.hasTypeScript }),
20
+ });
21
+ files.push({
22
+ path: '.dockerignore',
23
+ content: DOCKERIGNORE,
24
+ });
25
+ if (target === 'docker') {
26
+ files.push({
27
+ path: 'docker-compose.prod.yml',
28
+ content: generateDockerCompose(config),
29
+ });
30
+ }
31
+ if (target === 'fly') {
32
+ files.push({
33
+ path: 'fly.toml',
34
+ content: generateFlyToml(config),
35
+ });
36
+ }
37
+ return { files, outputDir: '.cogitator' };
38
+ }
39
+ }
40
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM1D,MAAM,YAAY,GAAG;;;;;;;;CAQpB,CAAC;AAEF,MAAM,OAAO,iBAAiB;IAC5B,QAAQ,CAAC,MAAoB,EAAE,OAAyB;QACtD,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;QAEzC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;SAC9E,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { ProjectAnalyzer } from './analyzer.js';
2
+ export type { AnalyzerResult } from './analyzer.js';
3
+ export { ArtifactGenerator } from './generator.js';
4
+ export type { GeneratorOptions } from './generator.js';
5
+ export { Deployer } from './deployer.js';
6
+ export type { DeployOptions, DeployPlan } from './deployer.js';
7
+ export { DockerProvider } from './providers/docker.js';
8
+ export { FlyProvider } from './providers/fly.js';
9
+ export type { DeployProvider } from './providers/base.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { ProjectAnalyzer } from './analyzer.js';
2
+ export { ArtifactGenerator } from './generator.js';
3
+ export { Deployer } from './deployer.js';
4
+ export { DockerProvider } from './providers/docker.js';
5
+ export { FlyProvider } from './providers/fly.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DeployConfig, DeployResult, DeployStatus, PreflightResult, GeneratedArtifacts } from '@cogitator-ai/types';
2
+ export interface DeployProvider {
3
+ readonly name: string;
4
+ preflight(config: DeployConfig, projectDir: string): Promise<PreflightResult>;
5
+ generate(config: DeployConfig, projectDir: string): Promise<GeneratedArtifacts>;
6
+ deploy(config: DeployConfig, artifacts: GeneratedArtifacts, projectDir: string): Promise<DeployResult>;
7
+ status(config: DeployConfig, projectDir: string): Promise<DeployStatus>;
8
+ destroy(config: DeployConfig, projectDir: string): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9E,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChF,MAAM,CACJ,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { DeployConfig, DeployResult, DeployStatus, PreflightResult, GeneratedArtifacts } from '@cogitator-ai/types';
2
+ import type { DeployProvider } from './base.js';
3
+ export declare class DockerProvider implements DeployProvider {
4
+ readonly name = "docker";
5
+ preflight(config: DeployConfig, _projectDir: string): Promise<PreflightResult>;
6
+ generate(config: DeployConfig, _projectDir: string): Promise<GeneratedArtifacts>;
7
+ deploy(config: DeployConfig, artifacts: GeneratedArtifacts, projectDir: string): Promise<DeployResult>;
8
+ status(_config: DeployConfig, _projectDir: string): Promise<DeployStatus>;
9
+ destroy(_config: DeployConfig, _projectDir: string): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/providers/docker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EAEZ,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,IAAI,YAAY;IAEnB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuC9E,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMhF,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAsClB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIzE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CACzE"}
@@ -0,0 +1,78 @@
1
+ import { exec, isCommandAvailable } from '../utils/exec.js';
2
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export class DockerProvider {
5
+ name = 'docker';
6
+ async preflight(config, _projectDir) {
7
+ const checks = [];
8
+ const dockerAvailable = isCommandAvailable('docker');
9
+ checks.push({
10
+ name: 'Docker installed',
11
+ passed: dockerAvailable,
12
+ message: dockerAvailable ? 'Docker is available' : 'Docker is not installed',
13
+ fix: dockerAvailable ? undefined : 'Install Docker: https://docs.docker.com/get-docker/',
14
+ });
15
+ if (dockerAvailable) {
16
+ const daemonRunning = exec('docker info').success;
17
+ checks.push({
18
+ name: 'Docker daemon running',
19
+ passed: daemonRunning,
20
+ message: daemonRunning ? 'Docker daemon is running' : 'Docker daemon is not running',
21
+ fix: daemonRunning ? undefined : 'Start Docker Desktop or run: sudo systemctl start docker',
22
+ });
23
+ }
24
+ if (config.registry) {
25
+ const loginCheck = exec(`docker login ${config.registry} --get-login`);
26
+ checks.push({
27
+ name: 'Registry authentication',
28
+ passed: loginCheck.success,
29
+ message: loginCheck.success
30
+ ? `Authenticated with ${config.registry}`
31
+ : `Not authenticated with ${config.registry}`,
32
+ fix: loginCheck.success ? undefined : `Run: docker login ${config.registry}`,
33
+ });
34
+ }
35
+ return {
36
+ checks,
37
+ passed: checks.every((c) => c.passed),
38
+ };
39
+ }
40
+ async generate(config, _projectDir) {
41
+ const { ArtifactGenerator } = await import('../generator.js');
42
+ const generator = new ArtifactGenerator();
43
+ return generator.generate(config, { hasTypeScript: true });
44
+ }
45
+ async deploy(config, artifacts, projectDir) {
46
+ const outputDir = join(projectDir, artifacts.outputDir);
47
+ if (!existsSync(outputDir)) {
48
+ mkdirSync(outputDir, { recursive: true });
49
+ }
50
+ for (const file of artifacts.files) {
51
+ writeFileSync(join(outputDir, file.path), file.content);
52
+ }
53
+ const image = config.image ?? 'cogitator-app';
54
+ const tag = config.registry ? `${config.registry}/${image}:latest` : `${image}:latest`;
55
+ const buildResult = exec(`docker build -f ${join(outputDir, 'Dockerfile')} -t ${tag} ${projectDir}`, { cwd: projectDir });
56
+ if (!buildResult.success) {
57
+ return { success: false, error: `Docker build failed: ${buildResult.error}` };
58
+ }
59
+ if (config.registry) {
60
+ const pushResult = exec(`docker push ${tag}`);
61
+ if (!pushResult.success) {
62
+ return { success: false, error: `Docker push failed: ${pushResult.error}` };
63
+ }
64
+ }
65
+ return {
66
+ success: true,
67
+ endpoints: {
68
+ api: `http://localhost:${config.port ?? 3000}`,
69
+ health: `http://localhost:${config.port ?? 3000}/health`,
70
+ },
71
+ };
72
+ }
73
+ async status(_config, _projectDir) {
74
+ return { running: false };
75
+ }
76
+ async destroy(_config, _projectDir) { }
77
+ }
78
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/providers/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DeployConfig, DeployResult, DeployStatus, PreflightResult, GeneratedArtifacts } from '@cogitator-ai/types';
2
+ import type { DeployProvider } from './base.js';
3
+ export declare class FlyProvider implements DeployProvider {
4
+ readonly name = "fly";
5
+ preflight(config: DeployConfig, _projectDir: string): Promise<PreflightResult>;
6
+ generate(config: DeployConfig, _projectDir: string): Promise<GeneratedArtifacts>;
7
+ deploy(config: DeployConfig, artifacts: GeneratedArtifacts, projectDir: string): Promise<DeployResult>;
8
+ status(config: DeployConfig, projectDir: string): Promise<DeployStatus>;
9
+ destroy(config: DeployConfig, projectDir: string): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=fly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fly.d.ts","sourceRoot":"","sources":["../../src/providers/fly.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EAEZ,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,IAAI,SAAS;IAEhB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA8C9E,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMhF,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IA0DlB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAcvE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIvE"}
@@ -0,0 +1,117 @@
1
+ import { exec, isCommandAvailable } from '../utils/exec.js';
2
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export class FlyProvider {
5
+ name = 'fly';
6
+ async preflight(config, _projectDir) {
7
+ const checks = [];
8
+ const flyAvailable = isCommandAvailable('flyctl') || isCommandAvailable('fly');
9
+ checks.push({
10
+ name: 'flyctl installed',
11
+ passed: flyAvailable,
12
+ message: flyAvailable ? 'flyctl is available' : 'flyctl is not installed',
13
+ fix: flyAvailable ? undefined : 'Install flyctl: curl -L https://fly.io/install.sh | sh',
14
+ });
15
+ if (flyAvailable) {
16
+ const authResult = exec('flyctl auth whoami');
17
+ checks.push({
18
+ name: 'Fly.io authenticated',
19
+ passed: authResult.success,
20
+ message: authResult.success
21
+ ? `Logged in as ${authResult.output}`
22
+ : 'Not authenticated with Fly.io',
23
+ fix: authResult.success ? undefined : 'Run: flyctl auth login',
24
+ });
25
+ }
26
+ else {
27
+ checks.push({
28
+ name: 'Fly.io authenticated',
29
+ passed: false,
30
+ message: 'Cannot check auth — flyctl not installed',
31
+ fix: 'Install flyctl first',
32
+ });
33
+ }
34
+ for (const secret of config.secrets ?? []) {
35
+ const isSet = !!process.env[secret];
36
+ checks.push({
37
+ name: `Secret: ${secret}`,
38
+ passed: isSet,
39
+ message: isSet ? `${secret} is set` : `${secret} is not set`,
40
+ fix: isSet ? undefined : `Set environment variable: export ${secret}=<value>`,
41
+ });
42
+ }
43
+ return {
44
+ checks,
45
+ passed: checks.every((c) => c.passed),
46
+ };
47
+ }
48
+ async generate(config, _projectDir) {
49
+ const { ArtifactGenerator } = await import('../generator.js');
50
+ const generator = new ArtifactGenerator();
51
+ return generator.generate(config, { hasTypeScript: true });
52
+ }
53
+ async deploy(config, artifacts, projectDir) {
54
+ const outputDir = join(projectDir, artifacts.outputDir);
55
+ if (!existsSync(outputDir)) {
56
+ mkdirSync(outputDir, { recursive: true });
57
+ }
58
+ for (const file of artifacts.files) {
59
+ const filePath = file.path === 'fly.toml' ? join(projectDir, file.path) : join(outputDir, file.path);
60
+ writeFileSync(filePath, file.content);
61
+ }
62
+ const app = config.image ?? 'cogitator-app';
63
+ const launchCheck = exec('flyctl apps list --json', { cwd: projectDir });
64
+ let appExists = false;
65
+ if (launchCheck.success) {
66
+ try {
67
+ const apps = JSON.parse(launchCheck.output);
68
+ appExists = apps.some((a) => a.Name === app);
69
+ }
70
+ catch { }
71
+ }
72
+ if (!appExists) {
73
+ const createResult = exec(`flyctl apps create ${app} --json`, { cwd: projectDir });
74
+ if (!createResult.success) {
75
+ return { success: false, error: `Failed to create Fly app: ${createResult.error}` };
76
+ }
77
+ }
78
+ for (const secret of config.secrets ?? []) {
79
+ const value = process.env[secret];
80
+ if (value) {
81
+ exec(`flyctl secrets set ${secret}="${value}" --app ${app}`, { cwd: projectDir });
82
+ }
83
+ }
84
+ const deployResult = exec(`flyctl deploy --app ${app} --dockerfile ${join(outputDir, 'Dockerfile')} --now`, { cwd: projectDir });
85
+ if (!deployResult.success) {
86
+ return { success: false, error: `Fly deploy failed: ${deployResult.error}` };
87
+ }
88
+ const url = `https://${app}.fly.dev`;
89
+ return {
90
+ success: true,
91
+ url,
92
+ endpoints: {
93
+ api: url,
94
+ a2a: `${url}/.well-known/agent.json`,
95
+ health: `${url}/health`,
96
+ },
97
+ };
98
+ }
99
+ async status(config, projectDir) {
100
+ const app = config.image ?? 'cogitator-app';
101
+ const result = exec(`flyctl status --app ${app} --json`, { cwd: projectDir });
102
+ if (!result.success)
103
+ return { running: false };
104
+ try {
105
+ const status = JSON.parse(result.output);
106
+ return { running: status.Deployed, url: `https://${status.Hostname}` };
107
+ }
108
+ catch {
109
+ return { running: false };
110
+ }
111
+ }
112
+ async destroy(config, projectDir) {
113
+ const app = config.image ?? 'cogitator-app';
114
+ exec(`flyctl apps destroy ${app} --yes`, { cwd: projectDir });
115
+ }
116
+ }
117
+ //# sourceMappingURL=fly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fly.js","sourceRoot":"","sources":["../../src/providers/fly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DeployConfig } from '@cogitator-ai/types';
2
+ export declare function generateDockerCompose(config: DeployConfig): string;
3
+ //# sourceMappingURL=docker-compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.d.ts","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoElE"}
@@ -0,0 +1,66 @@
1
+ export function generateDockerCompose(config) {
2
+ const port = config.port ?? 3000;
3
+ const image = config.image ?? 'cogitator-app';
4
+ const lines = ['services:'];
5
+ const appEnv = [' environment:', ` - NODE_ENV=production`, ` - PORT=${port}`];
6
+ if (config.services?.redis)
7
+ appEnv.push(' - REDIS_URL=redis://redis:6379');
8
+ if (config.services?.postgres)
9
+ appEnv.push(' - DATABASE_URL=postgresql://cogitator:cogitator@postgres:5432/cogitator');
10
+ const dependsOn = [];
11
+ if (config.services?.redis)
12
+ dependsOn.push(' redis:', ' condition: service_healthy');
13
+ if (config.services?.postgres)
14
+ dependsOn.push(' postgres:', ' condition: service_healthy');
15
+ lines.push(' app:');
16
+ lines.push(' build: .');
17
+ lines.push(` image: ${config.registry ? `${config.registry}/${image}` : image}`);
18
+ lines.push(` ports:`);
19
+ lines.push(` - "${port}:${port}"`);
20
+ lines.push(...appEnv);
21
+ lines.push(' restart: unless-stopped');
22
+ if (dependsOn.length > 0) {
23
+ lines.push(' depends_on:');
24
+ lines.push(...dependsOn);
25
+ }
26
+ if (config.services?.redis) {
27
+ lines.push('');
28
+ lines.push(' redis:');
29
+ lines.push(' image: redis:7-alpine');
30
+ lines.push(' volumes:');
31
+ lines.push(' - redis-data:/data');
32
+ lines.push(' healthcheck:');
33
+ lines.push(' test: ["CMD", "redis-cli", "ping"]');
34
+ lines.push(' interval: 10s');
35
+ lines.push(' timeout: 3s');
36
+ lines.push(' retries: 3');
37
+ }
38
+ if (config.services?.postgres) {
39
+ lines.push('');
40
+ lines.push(' postgres:');
41
+ lines.push(' image: pgvector/pgvector:pg16');
42
+ lines.push(' environment:');
43
+ lines.push(' POSTGRES_USER: cogitator');
44
+ lines.push(' POSTGRES_PASSWORD: cogitator');
45
+ lines.push(' POSTGRES_DB: cogitator');
46
+ lines.push(' volumes:');
47
+ lines.push(' - postgres-data:/var/lib/postgresql/data');
48
+ lines.push(' healthcheck:');
49
+ lines.push(' test: ["CMD-SHELL", "pg_isready -U cogitator"]');
50
+ lines.push(' interval: 10s');
51
+ lines.push(' timeout: 3s');
52
+ lines.push(' retries: 3');
53
+ }
54
+ const volumes = [];
55
+ if (config.services?.redis)
56
+ volumes.push(' redis-data:');
57
+ if (config.services?.postgres)
58
+ volumes.push(' postgres-data:');
59
+ if (volumes.length > 0) {
60
+ lines.push('');
61
+ lines.push('volumes:');
62
+ lines.push(...volumes);
63
+ }
64
+ return lines.join('\n') + '\n';
65
+ }
66
+ //# sourceMappingURL=docker-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.js","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DeployConfig } from '@cogitator-ai/types';
2
+ interface DockerfileOptions {
3
+ config: DeployConfig;
4
+ hasTypeScript: boolean;
5
+ }
6
+ export declare function generateDockerfile({ config, hasTypeScript }: DockerfileOptions): string;
7
+ export {};
8
+ //# sourceMappingURL=dockerfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.d.ts","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,UAAU,iBAAiB;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,iBAAiB,GAAG,MAAM,CA+BvF"}
@@ -0,0 +1,31 @@
1
+ export function generateDockerfile({ config, hasTypeScript }) {
2
+ const port = config.port ?? 3000;
3
+ if (!hasTypeScript) {
4
+ return `FROM node:20-alpine
5
+ WORKDIR /app
6
+ COPY package.json pnpm-lock.yaml* ./
7
+ RUN corepack enable && pnpm install --frozen-lockfile --prod
8
+ COPY . .
9
+ EXPOSE ${port}
10
+ HEALTHCHECK --interval=30s --timeout=5s CMD wget -q --spider http://localhost:${port}/health || exit 1
11
+ CMD ["node", "src/server.js"]
12
+ `;
13
+ }
14
+ return `FROM node:20-alpine AS builder
15
+ WORKDIR /app
16
+ COPY package.json pnpm-lock.yaml* ./
17
+ RUN corepack enable && pnpm install --frozen-lockfile
18
+ COPY . .
19
+ RUN pnpm build
20
+
21
+ FROM node:20-alpine AS runtime
22
+ WORKDIR /app
23
+ COPY --from=builder /app/dist ./dist
24
+ COPY --from=builder /app/node_modules ./node_modules
25
+ COPY --from=builder /app/package.json ./
26
+ EXPOSE ${port}
27
+ HEALTHCHECK --interval=30s --timeout=5s CMD wget -q --spider http://localhost:${port}/health || exit 1
28
+ CMD ["node", "dist/server.js"]
29
+ `;
30
+ }
31
+ //# sourceMappingURL=dockerfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAqB;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAEjC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;;;;;SAKF,IAAI;gFACmE,IAAI;;CAEnF,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;;;SAYA,IAAI;gFACmE,IAAI;;CAEnF,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DeployConfig } from '@cogitator-ai/types';
2
+ export declare function generateFlyToml(config: DeployConfig): string;
3
+ //# sourceMappingURL=fly-toml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fly-toml.d.ts","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgC5D"}
@@ -0,0 +1,33 @@
1
+ export function generateFlyToml(config) {
2
+ const port = config.port ?? 3000;
3
+ const region = config.region ?? 'iad';
4
+ const app = config.image ?? 'cogitator-app';
5
+ const memory = config.resources?.memory ?? '256mb';
6
+ const memoryMb = parseInt(memory) || 256;
7
+ return `app = "${app}"
8
+ primary_region = "${region}"
9
+
10
+ [build]
11
+
12
+ [http_service]
13
+ internal_port = ${port}
14
+ force_https = true
15
+ auto_stop_machines = "stop"
16
+ auto_start_machines = true
17
+ min_machines_running = 0
18
+
19
+ [checks]
20
+ [checks.health]
21
+ port = ${port}
22
+ type = "http"
23
+ interval = "30s"
24
+ timeout = "5s"
25
+ path = "/health"
26
+
27
+ [[vm]]
28
+ memory = "${memoryMb}mb"
29
+ cpu_kind = "shared"
30
+ cpus = ${config.resources?.cpu ?? 1}
31
+ `;
32
+ }
33
+ //# sourceMappingURL=fly-toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fly-toml.js","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAEzC,OAAO,UAAU,GAAG;oBACF,MAAM;;;;;oBAKN,IAAI;;;;;;;;aAQX,IAAI;;;;;;;cAOH,QAAQ;;WAEX,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ExecSyncOptions } from 'node:child_process';
2
+ export interface ExecResult {
3
+ success: boolean;
4
+ output: string;
5
+ error?: string;
6
+ }
7
+ export declare function exec(command: string, options?: ExecSyncOptions): ExecResult;
8
+ export declare function isCommandAvailable(command: string): boolean;
9
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,CAgB3E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG3D"}
@@ -0,0 +1,24 @@
1
+ import { execSync } from 'node:child_process';
2
+ export function exec(command, options) {
3
+ try {
4
+ const output = execSync(command, {
5
+ stdio: 'pipe',
6
+ ...options,
7
+ encoding: 'utf-8',
8
+ });
9
+ return { success: true, output: output.trim() };
10
+ }
11
+ catch (err) {
12
+ const error = err;
13
+ return {
14
+ success: false,
15
+ output: '',
16
+ error: error.stderr?.trim() ?? error.message,
17
+ };
18
+ }
19
+ }
20
+ export function isCommandAvailable(command) {
21
+ const check = process.platform === 'win32' ? `where ${command}` : `which ${command}`;
22
+ return exec(check).success;
23
+ }
24
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AAQpE,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,OAAyB;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC/B,KAAK,EAAE,MAAM;YACb,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAkC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO;SAC7C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;IACrF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC7B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@cogitator-ai/deploy",
3
+ "version": "0.1.0",
4
+ "description": "One-command deployment for Cogitator agents",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "clean": "rm -rf dist",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest"
24
+ },
25
+ "dependencies": {
26
+ "@cogitator-ai/types": "workspace:*",
27
+ "@cogitator-ai/config": "workspace:*"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.0.0",
31
+ "typescript": "^5.3.0",
32
+ "vitest": "^4.0.18"
33
+ },
34
+ "engines": {
35
+ "node": ">=20.0.0"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/cogitator-ai/Cogitator-AI.git",
40
+ "directory": "packages/deploy"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://npm.pkg.github.com"
45
+ },
46
+ "license": "MIT"
47
+ }