@renseiai/create-agentfactory-app 0.8.7 → 0.8.8

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=templates.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/templates.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ import { describe, it, expect, afterAll } from 'vitest';
2
+ import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { getTemplates } from '../templates/index.js';
6
+ // ── Helpers ────────────────────────────────────────────────────────
7
+ function opts(overrides = {}) {
8
+ return {
9
+ projectName: 'integration-test-project',
10
+ teamKey: 'TEST',
11
+ includeDashboard: false,
12
+ includeCli: false,
13
+ useRedis: false,
14
+ ...overrides,
15
+ };
16
+ }
17
+ function writeProject(files, dir) {
18
+ for (const [filePath, content] of Object.entries(files)) {
19
+ const fullPath = join(dir, filePath);
20
+ mkdirSync(join(fullPath, '..'), { recursive: true });
21
+ writeFileSync(fullPath, content, 'utf-8');
22
+ }
23
+ }
24
+ // ── Integration test configs ───────────────────────────────────────
25
+ const configs = [
26
+ {
27
+ name: 'full default (dashboard + cli + redis)',
28
+ options: opts({ includeDashboard: true, includeCli: true, useRedis: true }),
29
+ },
30
+ {
31
+ name: 'minimal (no dashboard, no cli, no redis)',
32
+ options: opts({ includeDashboard: false, includeCli: false, useRedis: false }),
33
+ },
34
+ ];
35
+ // Track temp dirs for cleanup
36
+ const tempDirs = [];
37
+ afterAll(() => {
38
+ for (const dir of tempDirs) {
39
+ rmSync(dir, { recursive: true, force: true });
40
+ }
41
+ });
42
+ describe.each(configs)('integration — $name', ({ options }) => {
43
+ const files = getTemplates(options);
44
+ const dir = mkdtempSync(join(tmpdir(), 'create-app-integration-'));
45
+ tempDirs.push(dir);
46
+ writeProject(files, dir);
47
+ it('writes all files to disk', () => {
48
+ const { readdirSync, statSync } = require('node:fs');
49
+ function collect(base, prefix = '') {
50
+ const entries = [];
51
+ for (const entry of readdirSync(base, { withFileTypes: true })) {
52
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
53
+ if (entry.isDirectory()) {
54
+ entries.push(...collect(join(base, entry.name), rel));
55
+ }
56
+ else {
57
+ entries.push(rel);
58
+ }
59
+ }
60
+ return entries;
61
+ }
62
+ const written = collect(dir);
63
+ expect(written.sort()).toEqual(Object.keys(files).sort());
64
+ });
65
+ it('generates valid JSON in package.json', () => {
66
+ const { readFileSync } = require('node:fs');
67
+ const content = readFileSync(join(dir, 'package.json'), 'utf-8');
68
+ const pkg = JSON.parse(content);
69
+ expect(pkg.name).toBe(options.projectName);
70
+ expect(pkg.version).toBe('0.1.0');
71
+ expect(pkg.scripts).toBeDefined();
72
+ expect(pkg.dependencies).toBeDefined();
73
+ expect(pkg.devDependencies).toBeDefined();
74
+ });
75
+ it('generates valid JSON in tsconfig.json', () => {
76
+ const { readFileSync } = require('node:fs');
77
+ const content = readFileSync(join(dir, 'tsconfig.json'), 'utf-8');
78
+ const tsconfig = JSON.parse(content);
79
+ expect(tsconfig.compilerOptions).toBeDefined();
80
+ expect(tsconfig.compilerOptions.target).toBe('ES2017');
81
+ expect(tsconfig.compilerOptions.strict).toBe(true);
82
+ expect(tsconfig.compilerOptions.jsx).toBe('react-jsx');
83
+ expect(tsconfig.compilerOptions.module).toBe('esnext');
84
+ expect(tsconfig.compilerOptions.moduleResolution).toBe('bundler');
85
+ expect(tsconfig.compilerOptions.paths).toEqual({ '@/*': ['./src/*'] });
86
+ expect(tsconfig.include).toContain('**/*.ts');
87
+ expect(tsconfig.include).toContain('**/*.tsx');
88
+ expect(tsconfig.exclude).toContain('node_modules');
89
+ });
90
+ it('generates valid next.config.ts', () => {
91
+ const { readFileSync } = require('node:fs');
92
+ const content = readFileSync(join(dir, 'next.config.ts'), 'utf-8');
93
+ expect(content).toContain("import type { NextConfig } from 'next'");
94
+ expect(content).toContain('export default nextConfig');
95
+ if (options.includeDashboard) {
96
+ expect(content).toContain('transpilePackages');
97
+ expect(content).toContain('@renseiai/agentfactory-dashboard');
98
+ }
99
+ });
100
+ it('generates a .gitignore with standard entries', () => {
101
+ const { readFileSync } = require('node:fs');
102
+ const content = readFileSync(join(dir, '.gitignore'), 'utf-8');
103
+ expect(content).toContain('node_modules/');
104
+ expect(content).toContain('.next/');
105
+ expect(content).toContain('dist/');
106
+ });
107
+ it('route re-exports have valid import structure', () => {
108
+ const { readFileSync } = require('node:fs');
109
+ const routeFiles = Object.keys(files).filter(f => f.includes('/route.ts'));
110
+ for (const routeFile of routeFiles) {
111
+ const content = readFileSync(join(dir, routeFile), 'utf-8');
112
+ expect(content, `${routeFile} missing config import`).toContain("import { routes } from '@/lib/config'");
113
+ // Each route must export at least one HTTP method
114
+ const hasExport = content.includes('export const POST') ||
115
+ content.includes('export const GET') ||
116
+ content.includes('export const DELETE');
117
+ expect(hasExport, `${routeFile} missing HTTP method export`).toBe(true);
118
+ }
119
+ });
120
+ if (options.includeDashboard) {
121
+ it('dashboard pages use client directive and DashboardShell', () => {
122
+ const { readFileSync } = require('node:fs');
123
+ const dashboardPages = [
124
+ 'src/app/pipeline/page.tsx',
125
+ 'src/app/sessions/page.tsx',
126
+ 'src/app/sessions/[id]/page.tsx',
127
+ 'src/app/settings/page.tsx',
128
+ ];
129
+ for (const page of dashboardPages) {
130
+ const content = readFileSync(join(dir, page), 'utf-8');
131
+ expect(content, `${page} missing 'use client'`).toContain("'use client'");
132
+ expect(content, `${page} missing DashboardShell`).toContain('DashboardShell');
133
+ }
134
+ });
135
+ }
136
+ if (options.includeCli) {
137
+ it('CLI scripts have shebang and required imports', () => {
138
+ const { readFileSync } = require('node:fs');
139
+ const cliFiles = [
140
+ 'cli/worker.ts',
141
+ 'cli/orchestrator.ts',
142
+ 'cli/worker-fleet.ts',
143
+ 'cli/cleanup.ts',
144
+ ];
145
+ for (const cliFile of cliFiles) {
146
+ const content = readFileSync(join(dir, cliFile), 'utf-8');
147
+ expect(content, `${cliFile} missing shebang`).toContain('#!/usr/bin/env tsx');
148
+ expect(content, `${cliFile} missing @renseiai import`).toContain('@renseiai/agentfactory-cli');
149
+ }
150
+ });
151
+ }
152
+ });
153
+ //# sourceMappingURL=templates.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/templates.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=templates.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/templates.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getTemplates } from '../templates/index.js';
3
+ // ── Helpers ────────────────────────────────────────────────────────
4
+ function opts(overrides = {}) {
5
+ return {
6
+ projectName: 'test-project',
7
+ teamKey: 'TEST',
8
+ includeDashboard: false,
9
+ includeCli: false,
10
+ useRedis: false,
11
+ ...overrides,
12
+ };
13
+ }
14
+ // ── Core files present in every configuration ──────────────────────
15
+ const ALWAYS_PRESENT_FILES = [
16
+ 'package.json',
17
+ 'tsconfig.json',
18
+ 'next.config.ts',
19
+ '.env.example',
20
+ '.gitignore',
21
+ 'src/lib/config.ts',
22
+ 'src/middleware.ts',
23
+ // Route re-exports
24
+ 'src/app/webhook/route.ts',
25
+ 'src/app/callback/route.ts',
26
+ 'src/app/api/workers/register/route.ts',
27
+ 'src/app/api/workers/route.ts',
28
+ 'src/app/api/workers/[id]/route.ts',
29
+ 'src/app/api/workers/[id]/heartbeat/route.ts',
30
+ 'src/app/api/workers/[id]/poll/route.ts',
31
+ 'src/app/api/sessions/route.ts',
32
+ 'src/app/api/sessions/[id]/route.ts',
33
+ 'src/app/api/sessions/[id]/claim/route.ts',
34
+ 'src/app/api/sessions/[id]/status/route.ts',
35
+ 'src/app/api/sessions/[id]/lock-refresh/route.ts',
36
+ 'src/app/api/sessions/[id]/prompts/route.ts',
37
+ 'src/app/api/sessions/[id]/transfer-ownership/route.ts',
38
+ 'src/app/api/sessions/[id]/activity/route.ts',
39
+ 'src/app/api/sessions/[id]/completion/route.ts',
40
+ 'src/app/api/sessions/[id]/external-urls/route.ts',
41
+ 'src/app/api/sessions/[id]/progress/route.ts',
42
+ 'src/app/api/sessions/[id]/tool-error/route.ts',
43
+ 'src/app/api/public/stats/route.ts',
44
+ 'src/app/api/public/sessions/route.ts',
45
+ 'src/app/api/public/sessions/[id]/route.ts',
46
+ 'src/app/api/config/route.ts',
47
+ 'src/app/api/cleanup/route.ts',
48
+ 'src/app/api/issue-tracker-proxy/route.ts',
49
+ // Layout/page/css always present (dashboard or minimal variant)
50
+ 'src/app/layout.tsx',
51
+ 'src/app/page.tsx',
52
+ 'src/app/globals.css',
53
+ // Agent definitions
54
+ '.claude/CLAUDE.md',
55
+ 'AGENTS.md',
56
+ '.claude/agents/developer.md',
57
+ ];
58
+ const DASHBOARD_ONLY_FILES = [
59
+ 'src/app/pipeline/page.tsx',
60
+ 'src/app/sessions/page.tsx',
61
+ 'src/app/sessions/[id]/page.tsx',
62
+ 'src/app/settings/page.tsx',
63
+ 'postcss.config.mjs',
64
+ ];
65
+ const CLI_ONLY_FILES = [
66
+ 'cli/worker.ts',
67
+ 'cli/orchestrator.ts',
68
+ 'cli/worker-fleet.ts',
69
+ 'cli/cleanup.ts',
70
+ ];
71
+ // ── Test matrix: all 8 boolean combinations ────────────────────────
72
+ const COMBOS = [
73
+ { name: 'all flags on', dashboard: true, cli: true, redis: true },
74
+ { name: 'all flags off', dashboard: false, cli: false, redis: false },
75
+ { name: 'dashboard only', dashboard: true, cli: false, redis: false },
76
+ { name: 'cli only', dashboard: false, cli: true, redis: false },
77
+ { name: 'dashboard + cli', dashboard: true, cli: true, redis: false },
78
+ { name: 'redis only', dashboard: false, cli: false, redis: true },
79
+ { name: 'dashboard + redis', dashboard: true, cli: false, redis: true },
80
+ { name: 'cli + redis', dashboard: false, cli: true, redis: true },
81
+ ];
82
+ // ── Smoke test ─────────────────────────────────────────────────────
83
+ describe('getTemplates', () => {
84
+ it('returns a non-empty Record<string, string> for the default config', () => {
85
+ const result = getTemplates(opts({ includeDashboard: true, includeCli: true, useRedis: true }));
86
+ expect(Object.keys(result).length).toBeGreaterThan(0);
87
+ for (const [key, value] of Object.entries(result)) {
88
+ expect(typeof key).toBe('string');
89
+ expect(typeof value).toBe('string');
90
+ expect(key.length).toBeGreaterThan(0);
91
+ expect(value.length).toBeGreaterThan(0);
92
+ }
93
+ });
94
+ });
95
+ // ── File manifest assertions ───────────────────────────────────────
96
+ describe.each(COMBOS)('file manifest — $name (dashboard=$dashboard, cli=$cli, redis=$redis)', ({ dashboard, cli, redis }) => {
97
+ const files = getTemplates(opts({ includeDashboard: dashboard, includeCli: cli, useRedis: redis }));
98
+ const filePaths = Object.keys(files);
99
+ it('includes all always-present files', () => {
100
+ for (const f of ALWAYS_PRESENT_FILES) {
101
+ expect(filePaths, `missing: ${f}`).toContain(f);
102
+ }
103
+ });
104
+ it(`${dashboard ? 'includes' : 'excludes'} dashboard-specific files`, () => {
105
+ for (const f of DASHBOARD_ONLY_FILES) {
106
+ if (dashboard) {
107
+ expect(filePaths, `expected dashboard file: ${f}`).toContain(f);
108
+ }
109
+ else {
110
+ expect(filePaths, `unexpected dashboard file: ${f}`).not.toContain(f);
111
+ }
112
+ }
113
+ });
114
+ it(`${cli ? 'includes' : 'excludes'} CLI-specific files`, () => {
115
+ for (const f of CLI_ONLY_FILES) {
116
+ if (cli) {
117
+ expect(filePaths, `expected CLI file: ${f}`).toContain(f);
118
+ }
119
+ else {
120
+ expect(filePaths, `unexpected CLI file: ${f}`).not.toContain(f);
121
+ }
122
+ }
123
+ });
124
+ it('contains no unexpected files', () => {
125
+ const expected = new Set([
126
+ ...ALWAYS_PRESENT_FILES,
127
+ ...(dashboard ? DASHBOARD_ONLY_FILES : []),
128
+ ...(cli ? CLI_ONLY_FILES : []),
129
+ ]);
130
+ for (const f of filePaths) {
131
+ expect(expected, `unexpected file in output: ${f}`).toContain(f);
132
+ }
133
+ });
134
+ });
135
+ // ── Dependency version assertions ──────────────────────────────────
136
+ describe.each(COMBOS)('generated package.json — $name (dashboard=$dashboard, cli=$cli, redis=$redis)', ({ dashboard, cli, redis }) => {
137
+ const files = getTemplates(opts({ includeDashboard: dashboard, includeCli: cli, useRedis: redis }));
138
+ const pkg = JSON.parse(files['package.json']);
139
+ it('has non-stale @renseiai/* dependency versions', () => {
140
+ const renseiDeps = Object.entries(pkg.dependencies)
141
+ .filter(([name]) => name.startsWith('@renseiai/'));
142
+ expect(renseiDeps.length).toBeGreaterThan(0);
143
+ for (const [name, version] of renseiDeps) {
144
+ // Versions must not be the old ^0.7.6
145
+ expect(version, `${name} has stale version ${version}`).not.toBe('^0.7.6');
146
+ }
147
+ });
148
+ it(`${dashboard ? 'includes' : 'excludes'} @renseiai/agentfactory-dashboard`, () => {
149
+ if (dashboard) {
150
+ expect(pkg.dependencies).toHaveProperty('@renseiai/agentfactory-dashboard');
151
+ }
152
+ else {
153
+ expect(pkg.dependencies).not.toHaveProperty('@renseiai/agentfactory-dashboard');
154
+ }
155
+ });
156
+ it('dashboard dependency version matches other @renseiai/* versions', () => {
157
+ if (!dashboard)
158
+ return;
159
+ const coreVersion = pkg.dependencies['@renseiai/agentfactory'];
160
+ const dashVersion = pkg.dependencies['@renseiai/agentfactory-dashboard'];
161
+ expect(dashVersion).toBe(coreVersion);
162
+ });
163
+ it(`${dashboard ? 'includes' : 'excludes'} tailwind devDependencies`, () => {
164
+ if (dashboard) {
165
+ expect(pkg.devDependencies).toHaveProperty('@tailwindcss/postcss');
166
+ expect(pkg.devDependencies).toHaveProperty('tailwindcss');
167
+ }
168
+ else {
169
+ expect(pkg.devDependencies).not.toHaveProperty('@tailwindcss/postcss');
170
+ expect(pkg.devDependencies).not.toHaveProperty('tailwindcss');
171
+ }
172
+ });
173
+ it(`${cli ? 'includes' : 'excludes'} CLI devDependencies (tsx, dotenv)`, () => {
174
+ if (cli) {
175
+ expect(pkg.devDependencies).toHaveProperty('tsx');
176
+ expect(pkg.devDependencies).toHaveProperty('dotenv');
177
+ }
178
+ else {
179
+ expect(pkg.devDependencies).not.toHaveProperty('tsx');
180
+ expect(pkg.devDependencies).not.toHaveProperty('dotenv');
181
+ }
182
+ });
183
+ it(`${cli ? 'includes' : 'excludes'} CLI scripts`, () => {
184
+ const cliScripts = ['worker', 'orchestrator', 'worker-fleet', 'cleanup'];
185
+ for (const s of cliScripts) {
186
+ if (cli) {
187
+ expect(pkg.scripts, `missing script: ${s}`).toHaveProperty(s);
188
+ }
189
+ else {
190
+ expect(pkg.scripts, `unexpected script: ${s}`).not.toHaveProperty(s);
191
+ }
192
+ }
193
+ });
194
+ });
195
+ // ── Redis .env.example assertions ──────────────────────────────────
196
+ describe.each(COMBOS)('.env.example — $name (dashboard=$dashboard, cli=$cli, redis=$redis)', ({ dashboard: _d, cli: _c, redis }) => {
197
+ const files = getTemplates(opts({ includeDashboard: _d, includeCli: _c, useRedis: redis }));
198
+ const envContent = files['.env.example'];
199
+ it(`${redis ? 'contains' : 'does not contain'} REDIS_URL`, () => {
200
+ if (redis) {
201
+ expect(envContent).toContain('REDIS_URL');
202
+ }
203
+ else {
204
+ expect(envContent).not.toContain('REDIS_URL');
205
+ }
206
+ });
207
+ });
208
+ //# sourceMappingURL=templates.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../src/__tests__/templates.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renseiai/create-agentfactory-app",
3
- "version": "0.8.7",
3
+ "version": "0.8.8",
4
4
  "type": "module",
5
5
  "description": "Create an AgentFactory app — multi-agent fleet management for coding agents",
6
6
  "author": "Rensei AI (https://rensei.ai)",
@@ -52,11 +52,14 @@
52
52
  "dependencies": {},
53
53
  "devDependencies": {
54
54
  "@types/node": "^22.5.4",
55
- "typescript": "^5.7.3"
55
+ "typescript": "^5.7.3",
56
+ "vitest": "^3.2.3"
56
57
  },
57
58
  "scripts": {
58
59
  "build": "tsc",
59
60
  "typecheck": "tsc --noEmit",
60
- "clean": "rm -rf dist"
61
+ "clean": "rm -rf dist",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest"
61
64
  }
62
65
  }