@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.
- package/README.md +122 -0
- package/dist/analyzer.d.ts +24 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +79 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/deployer.d.ts +27 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +64 -0
- package/dist/deployer.js.map +1 -0
- package/dist/generator.d.ts +8 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +40 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +10 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +2 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/docker.d.ts +11 -0
- package/dist/providers/docker.d.ts.map +1 -0
- package/dist/providers/docker.js +78 -0
- package/dist/providers/docker.js.map +1 -0
- package/dist/providers/fly.d.ts +11 -0
- package/dist/providers/fly.d.ts.map +1 -0
- package/dist/providers/fly.js +117 -0
- package/dist/providers/fly.js.map +1 -0
- package/dist/templates/docker-compose.d.ts +3 -0
- package/dist/templates/docker-compose.d.ts.map +1 -0
- package/dist/templates/docker-compose.js +66 -0
- package/dist/templates/docker-compose.js.map +1 -0
- package/dist/templates/dockerfile.d.ts +8 -0
- package/dist/templates/dockerfile.d.ts.map +1 -0
- package/dist/templates/dockerfile.js +31 -0
- package/dist/templates/dockerfile.js.map +1 -0
- package/dist/templates/fly-toml.d.ts +3 -0
- package/dist/templates/fly-toml.d.ts.map +1 -0
- package/dist/templates/fly-toml.js +33 -0
- package/dist/templates/fly-toml.js.map +1 -0
- package/dist/utils/exec.d.ts +9 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +24 -0
- package/dist/utils/exec.js.map +1 -0
- 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"}
|
package/dist/analyzer.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/deployer.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|