create-urateam 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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scaffold.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scaffold.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, existsSync, readFileSync } from "fs";
3
+ import { join } from "path";
4
+ import { tmpdir } from "os";
5
+ import { scaffold } from "../index.js";
6
+ describe("scaffold", () => {
7
+ let tempDir;
8
+ beforeEach(() => {
9
+ tempDir = mkdtempSync(join(tmpdir(), "create-urateam-test-"));
10
+ });
11
+ afterEach(() => {
12
+ rmSync(tempDir, { recursive: true, force: true });
13
+ });
14
+ it("creates project directory with all template files", () => {
15
+ const projectDir = join(tempDir, "my-project");
16
+ scaffold({
17
+ projectDir,
18
+ projectName: "my-project",
19
+ linearApiKey: "lin_api_test",
20
+ linearTeamId: "team-123",
21
+ repoUrl: "https://github.com/user/repo",
22
+ defaultBranch: "main",
23
+ });
24
+ expect(existsSync(join(projectDir, "package.json"))).toBe(true);
25
+ expect(existsSync(join(projectDir, ".env"))).toBe(true);
26
+ expect(existsSync(join(projectDir, ".env.example"))).toBe(true);
27
+ expect(existsSync(join(projectDir, "docker-compose.yml"))).toBe(true);
28
+ expect(existsSync(join(projectDir, "Dockerfile"))).toBe(true);
29
+ expect(existsSync(join(projectDir, ".gitignore"))).toBe(true);
30
+ expect(existsSync(join(projectDir, "README.md"))).toBe(true);
31
+ });
32
+ it("writes .env with provided values", () => {
33
+ const projectDir = join(tempDir, "my-project");
34
+ scaffold({
35
+ projectDir,
36
+ projectName: "my-project",
37
+ linearApiKey: "lin_api_test123",
38
+ linearTeamId: "team-abc",
39
+ repoUrl: "https://github.com/org/mobile-app",
40
+ defaultBranch: "develop",
41
+ });
42
+ const env = readFileSync(join(projectDir, ".env"), "utf-8");
43
+ expect(env).toContain("LINEAR_API_KEY=lin_api_test123");
44
+ expect(env).toContain("LINEAR_TEAM_ID=team-abc");
45
+ expect(env).toContain("REPO_URL=https://github.com/org/mobile-app");
46
+ expect(env).toContain("REPO_DEFAULT_BRANCH=develop");
47
+ expect(env).toContain("REPO_TEAM_ID=team-abc");
48
+ });
49
+ it("package.json uses project name and depends on @urateam/cli", () => {
50
+ const projectDir = join(tempDir, "cool-agent");
51
+ scaffold({
52
+ projectDir,
53
+ projectName: "cool-agent",
54
+ linearApiKey: "key",
55
+ linearTeamId: "team",
56
+ repoUrl: "https://github.com/x/y",
57
+ defaultBranch: "main",
58
+ });
59
+ const pkg = JSON.parse(readFileSync(join(projectDir, "package.json"), "utf-8"));
60
+ expect(pkg.name).toBe("cool-agent");
61
+ expect(pkg.dependencies["@urateam/cli"]).toBeDefined();
62
+ });
63
+ it("README.md includes project name", () => {
64
+ const projectDir = join(tempDir, "my-app");
65
+ scaffold({
66
+ projectDir,
67
+ projectName: "my-app",
68
+ linearApiKey: "key",
69
+ linearTeamId: "team",
70
+ repoUrl: "https://github.com/x/y",
71
+ defaultBranch: "main",
72
+ });
73
+ const readme = readFileSync(join(projectDir, "README.md"), "utf-8");
74
+ expect(readme).toContain("my-app");
75
+ expect(readme).not.toContain("{{PROJECT_NAME}}");
76
+ });
77
+ it("copies .github/workflows/ci.yml", () => {
78
+ const projectDir = join(tempDir, "ci-test");
79
+ scaffold({
80
+ projectDir,
81
+ projectName: "ci-test",
82
+ linearApiKey: "key",
83
+ linearTeamId: "team",
84
+ repoUrl: "https://github.com/x/y",
85
+ defaultBranch: "main",
86
+ });
87
+ expect(existsSync(join(projectDir, ".github", "workflows", "ci.yml"))).toBe(true);
88
+ });
89
+ });
90
+ //# sourceMappingURL=scaffold.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../../src/__tests__/scaffold.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ export interface ScaffoldOptions {
3
+ projectDir: string;
4
+ projectName: string;
5
+ linearApiKey: string;
6
+ linearTeamId: string;
7
+ repoUrl: string;
8
+ defaultBranch: string;
9
+ }
10
+ /**
11
+ * Scaffold a new urateam project from the template.
12
+ * Copies template files, generates .env and package.json, replaces placeholders.
13
+ */
14
+ export declare function scaffold(options: ScaffoldOptions): void;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAQA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAeD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CA6CvD"}
package/dist/index.js ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ import { mkdirSync, writeFileSync, copyFileSync, readFileSync, readdirSync, statSync } from "fs";
3
+ import { join, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ function copyDirRecursive(src, dest) {
8
+ mkdirSync(dest, { recursive: true });
9
+ for (const entry of readdirSync(src)) {
10
+ const srcPath = join(src, entry);
11
+ const destPath = join(dest, entry);
12
+ if (statSync(srcPath).isDirectory()) {
13
+ copyDirRecursive(srcPath, destPath);
14
+ }
15
+ else {
16
+ copyFileSync(srcPath, destPath);
17
+ }
18
+ }
19
+ }
20
+ /**
21
+ * Scaffold a new urateam project from the template.
22
+ * Copies template files, generates .env and package.json, replaces placeholders.
23
+ */
24
+ export function scaffold(options) {
25
+ const { projectDir, projectName, linearApiKey, linearTeamId, repoUrl, defaultBranch } = options;
26
+ // Copy template directory
27
+ // When running from dist/, template is at ../template/
28
+ // When running from src/ (tests), template is at ../../template/
29
+ let templateDir = join(__dirname, "..", "template");
30
+ if (!statSync(templateDir, { throwIfNoEntry: false })?.isDirectory()) {
31
+ templateDir = join(__dirname, "..", "..", "template");
32
+ }
33
+ copyDirRecursive(templateDir, projectDir);
34
+ // Write package.json
35
+ const pkg = {
36
+ name: projectName,
37
+ private: true,
38
+ type: "module",
39
+ scripts: {
40
+ dev: "ura dev",
41
+ start: "ura start",
42
+ },
43
+ dependencies: {
44
+ "@urateam/cli": "^0.1.0",
45
+ },
46
+ };
47
+ writeFileSync(join(projectDir, "package.json"), JSON.stringify(pkg, null, 2) + "\n");
48
+ // Write .env from provided values
49
+ const envContent = [
50
+ `LINEAR_API_KEY=${linearApiKey}`,
51
+ `LINEAR_WEBHOOK_SECRET=`,
52
+ `LINEAR_TEAM_ID=${linearTeamId}`,
53
+ `REPO_URL=${repoUrl}`,
54
+ `REPO_DEFAULT_BRANCH=${defaultBranch}`,
55
+ `REPO_TEAM_ID=${linearTeamId}`,
56
+ `DATABASE_URL=postgres://urateam:password@postgres:5432/urateam`,
57
+ `DASHBOARD_USER=admin`,
58
+ `DASHBOARD_PASSWORD=changeme`,
59
+ ].join("\n") + "\n";
60
+ writeFileSync(join(projectDir, ".env"), envContent);
61
+ // Replace {{PROJECT_NAME}} in README.md
62
+ const readmePath = join(projectDir, "README.md");
63
+ const readme = readFileSync(readmePath, "utf-8");
64
+ writeFileSync(readmePath, readme.replace(/\{\{PROJECT_NAME\}\}/g, projectName));
65
+ }
66
+ // CLI entrypoint — only runs when executed directly (not when imported for testing)
67
+ async function main() {
68
+ const projectName = process.argv[2];
69
+ if (!projectName) {
70
+ console.error("Usage: create-urateam <project-name>");
71
+ process.exit(1);
72
+ }
73
+ const prompts = (await import("prompts")).default;
74
+ const response = await prompts([
75
+ { type: "text", name: "linearApiKey", message: "Linear API key:" },
76
+ { type: "text", name: "linearTeamId", message: "Linear team ID:" },
77
+ { type: "text", name: "repoUrl", message: "Repo URL (GitHub/GitLab):" },
78
+ { type: "text", name: "defaultBranch", message: "Default branch:", initial: "main" },
79
+ ]);
80
+ if (!response.linearApiKey || !response.repoUrl) {
81
+ console.error("Cancelled.");
82
+ process.exit(1);
83
+ }
84
+ const projectDir = join(process.cwd(), projectName);
85
+ scaffold({
86
+ projectDir,
87
+ projectName,
88
+ linearApiKey: response.linearApiKey,
89
+ linearTeamId: response.linearTeamId,
90
+ repoUrl: response.repoUrl,
91
+ defaultBranch: response.defaultBranch || "main",
92
+ });
93
+ console.log(`\n Created ${projectName} in ${projectDir}\n`);
94
+ console.log(` Next steps:`);
95
+ console.log(` cd ${projectName}`);
96
+ console.log(` pnpm install`);
97
+ console.log(` ura dev\n`);
98
+ }
99
+ const isEntrypoint = process.argv[1]?.endsWith("create-urateam") ||
100
+ process.argv[1]?.endsWith("index.js");
101
+ if (isEntrypoint) {
102
+ main().catch((err) => {
103
+ console.error(err);
104
+ process.exit(1);
105
+ });
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "create-urateam",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "create-urateam": "dist/index.js"
7
+ },
8
+ "files": ["dist", "template"],
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/JonB32/urateam.git",
12
+ "directory": "packages/create-urateam"
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "test": "vitest run"
17
+ },
18
+ "dependencies": {
19
+ "prompts": "^2.4.2"
20
+ },
21
+ "devDependencies": {
22
+ "@types/prompts": "^2.4.9",
23
+ "@types/node": "^22.0.0",
24
+ "typescript": "^5.7.0",
25
+ "vitest": "^3.2.4"
26
+ }
27
+ }
@@ -0,0 +1,30 @@
1
+ # === Required ===
2
+ LINEAR_API_KEY=
3
+ LINEAR_WEBHOOK_SECRET=
4
+ LINEAR_TEAM_ID=
5
+
6
+ # Repository
7
+ REPO_URL=
8
+ REPO_DEFAULT_BRANCH=main
9
+ REPO_TEAM_ID=
10
+
11
+ # Database
12
+ DATABASE_URL=postgres://urateam:password@postgres:5432/urateam
13
+
14
+ # Dashboard auth (required)
15
+ DASHBOARD_USER=admin
16
+ DASHBOARD_PASSWORD=
17
+
18
+ # === Optional ===
19
+ # SLACK_WEBHOOK_URL=
20
+ # DISCORD_WEBHOOK_URL=
21
+ # GITHUB_WEBHOOK_SECRET=
22
+ # PM_AGENT_ENABLED=false
23
+ # PM_AGENT_TEAM_IDS=
24
+ # PM_AGENT_SLACK_CHANNEL_ID=
25
+ # PM_AGENT_DAILY_TOKEN_BUDGET=5000000
26
+ # PM_AGENT_MAX_IN_FLIGHT=3
27
+ # SLACK_BOT_TOKEN=
28
+ # LOG_LEVEL=info
29
+ # MAX_CONCURRENT_RUNS=3
30
+ # URATEAM_LICENSE_KEY=
@@ -0,0 +1,20 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: pnpm/action-setup@v4
14
+ - uses: actions/setup-node@v4
15
+ with:
16
+ node-version: "22"
17
+ cache: pnpm
18
+ - run: pnpm install --frozen-lockfile
19
+ - run: pnpm build
20
+ - run: pnpm test
@@ -0,0 +1,13 @@
1
+ FROM node:22-slim
2
+
3
+ RUN apt-get update && apt-get install -y git gh && rm -rf /var/lib/apt/lists/*
4
+ RUN corepack enable
5
+
6
+ WORKDIR /app
7
+ COPY package.json pnpm-lock.yaml* ./
8
+ RUN pnpm install --prod
9
+
10
+ COPY . .
11
+
12
+ EXPOSE 3000 3001
13
+ CMD ["pnpm", "start"]
@@ -0,0 +1,26 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ Powered by [urateam](https://github.com/JonB32/urateam).
4
+
5
+ ## Setup
6
+
7
+ 1. Copy `.env.example` to `.env` and fill in your values
8
+ 2. Start with Docker Compose:
9
+
10
+ ```bash
11
+ docker compose up -d
12
+ ```
13
+
14
+ Or run locally (uses SQLite):
15
+
16
+ ```bash
17
+ ura dev
18
+ ```
19
+
20
+ ## Dashboard
21
+
22
+ http://localhost:3001
23
+
24
+ ## Webhook URL
25
+
26
+ Configure in Linear: `https://your-domain.com/webhooks/linear`
@@ -0,0 +1,28 @@
1
+ services:
2
+ postgres:
3
+ image: postgres:16
4
+ environment:
5
+ POSTGRES_USER: urateam
6
+ POSTGRES_PASSWORD: password
7
+ POSTGRES_DB: urateam
8
+ volumes:
9
+ - pgdata:/var/lib/postgresql/data
10
+ ports:
11
+ - "5432:5432"
12
+
13
+ agent:
14
+ build: .
15
+ env_file: .env
16
+ depends_on:
17
+ - postgres
18
+ ports:
19
+ - "3000:3000"
20
+ - "3001:3001"
21
+ volumes:
22
+ - agent-runs:/var/agent-runs
23
+ - agent-repos:/var/agent-repos
24
+
25
+ volumes:
26
+ pgdata:
27
+ agent-runs:
28
+ agent-repos: