proteum 2.5.5 → 2.5.6

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.
@@ -1,4 +1,5 @@
1
1
  const assert = require('node:assert/strict');
2
+ const { spawnSync } = require('node:child_process');
2
3
  const fs = require('node:fs');
3
4
  const os = require('node:os');
4
5
  const path = require('node:path');
@@ -11,6 +12,8 @@ require('ts-node/register/transpile-only');
11
12
  const {
12
13
  createWorktreeBootstrapDiagnostics,
13
14
  getWorktreeBootstrapStatus,
15
+ runMonorepoWorktreeBootstrapCreate,
16
+ runMonorepoWorktreeBootstrapInit,
14
17
  runWorktreeBootstrapInit,
15
18
  worktreeBootstrapMarkerRelativePath,
16
19
  } = require('../cli/runtime/worktreeBootstrap.ts');
@@ -20,6 +23,12 @@ const writeFile = (filepath, content) => {
20
23
  fs.writeFileSync(filepath, content);
21
24
  };
22
25
 
26
+ const runGit = (cwd, args) => {
27
+ const result = spawnSync('git', args, { cwd, encoding: 'utf8' });
28
+
29
+ assert.equal(result.status, 0, `${result.stderr}\n${result.stdout}`);
30
+ };
31
+
23
32
  const createCodexAppRoot = () => {
24
33
  const root = fs.mkdtempSync(path.join(os.tmpdir(), 'proteum-worktree-bootstrap-'));
25
34
  const appRoot = path.join(root, '.codex', 'worktrees', 'fixture-app');
@@ -38,6 +47,19 @@ const writeBootstrapFixture = (appRoot, { env = true, manifest = true, nodeModul
38
47
  if (nodeModules) fs.mkdirSync(path.join(appRoot, 'node_modules'), { recursive: true });
39
48
  };
40
49
 
50
+ const writeProteumAppRootFixture = (appRoot, { env = true } = {}) => {
51
+ writeFile(path.join(appRoot, 'package.json'), '{"name":"fixture"}\n');
52
+ writeFile(path.join(appRoot, 'identity.config.ts'), 'export default {};\n');
53
+ writeFile(path.join(appRoot, 'proteum.config.ts'), 'export default {};\n');
54
+ writeFile(path.join(appRoot, 'AGENTS.md'), '# Agents\n');
55
+ if (env) writeFile(path.join(appRoot, '.env'), 'PORT=3020\n');
56
+ writeFile(path.join(appRoot, '.proteum', 'manifest.json'), '{"version":10}\n');
57
+ fs.mkdirSync(path.join(appRoot, 'client'), { recursive: true });
58
+ fs.mkdirSync(path.join(appRoot, 'server'), { recursive: true });
59
+ writeFile(path.join(appRoot, 'client', '.keep'), '');
60
+ writeFile(path.join(appRoot, 'server', '.keep'), '');
61
+ };
62
+
41
63
  const noOpRefresh = async () => ({ stdout: '', stderr: '', summary: 'refresh ok' });
42
64
  const noOpRuntime = async () => ({ stdout: '', stderr: '', summary: 'runtime ok' });
43
65
  const noOpDeps = async () => {};
@@ -228,6 +250,82 @@ test('worktree bootstrap falls back to source app env for missing workspace root
228
250
  assert.equal(result.status.blocking, false);
229
251
  });
230
252
 
253
+ test('monorepo worktree bootstrap initializes every app and dedupes shared dependency install', async () => {
254
+ const targetRepoRoot = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'proteum-worktree-monorepo-all-')), '.codex', 'worktrees', 'fixture-repo');
255
+ const sourceRepoRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'proteum-worktree-monorepo-source-'));
256
+ const targetProductRoot = path.join(targetRepoRoot, 'apps', 'product');
257
+ const targetWebsiteRoot = path.join(targetRepoRoot, 'apps', 'website');
258
+
259
+ writeFile(path.join(targetRepoRoot, 'package.json'), '{"workspaces":["apps/*"]}\n');
260
+ writeFile(path.join(targetRepoRoot, 'package-lock.json'), '{"lockfileVersion":3}\n');
261
+ writeProteumAppRootFixture(targetProductRoot, { env: false });
262
+ writeProteumAppRootFixture(targetWebsiteRoot, { env: false });
263
+
264
+ writeFile(path.join(sourceRepoRoot, 'package.json'), '{"workspaces":["apps/*"]}\n');
265
+ writeFile(path.join(sourceRepoRoot, 'package-lock.json'), '{"lockfileVersion":3}\n');
266
+ writeProteumAppRootFixture(path.join(sourceRepoRoot, 'apps', 'product'));
267
+ writeProteumAppRootFixture(path.join(sourceRepoRoot, 'apps', 'website'));
268
+
269
+ const installRoots = [];
270
+ const result = await runMonorepoWorktreeBootstrapInit({
271
+ coreRoot,
272
+ monorepoRoot: targetRepoRoot,
273
+ proteumVersion: 'test',
274
+ runDependencies: async (installRoot) => {
275
+ installRoots.push(installRoot);
276
+ fs.mkdirSync(path.join(installRoot, 'node_modules'), { recursive: true });
277
+ },
278
+ runRefresh: noOpRefresh,
279
+ runRuntimeStatus: noOpRuntime,
280
+ source: sourceRepoRoot,
281
+ });
282
+
283
+ assert.equal(result.ok, true);
284
+ assert.equal(result.apps.length, 2);
285
+ assert.deepEqual(installRoots, [fs.realpathSync(targetRepoRoot)]);
286
+ assert.equal(fs.existsSync(path.join(targetProductRoot, worktreeBootstrapMarkerRelativePath)), true);
287
+ assert.equal(fs.existsSync(path.join(targetWebsiteRoot, worktreeBootstrapMarkerRelativePath)), true);
288
+ assert.equal(fs.readFileSync(path.join(targetProductRoot, '.env'), 'utf8'), 'PORT=3020\n');
289
+ assert.equal(fs.readFileSync(path.join(targetWebsiteRoot, '.env'), 'utf8'), 'PORT=3020\n');
290
+ });
291
+
292
+ test('monorepo worktree create adds one git worktree and bootstraps target apps', async () => {
293
+ const sourceRepoRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'proteum-worktree-create-source-'));
294
+ const targetRepoRoot = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'proteum-worktree-create-target-')), 'repo-worktree');
295
+
296
+ writeFile(path.join(sourceRepoRoot, 'package.json'), '{"workspaces":["apps/*"]}\n');
297
+ writeFile(path.join(sourceRepoRoot, 'package-lock.json'), '{"lockfileVersion":3}\n');
298
+ writeProteumAppRootFixture(path.join(sourceRepoRoot, 'apps', 'product'));
299
+ writeProteumAppRootFixture(path.join(sourceRepoRoot, 'apps', 'website'));
300
+ runGit(sourceRepoRoot, ['init']);
301
+ runGit(sourceRepoRoot, ['config', 'user.email', 'test@example.com']);
302
+ runGit(sourceRepoRoot, ['config', 'user.name', 'Test']);
303
+ runGit(sourceRepoRoot, ['add', '.']);
304
+ runGit(sourceRepoRoot, ['commit', '-m', 'init']);
305
+
306
+ const installRoots = [];
307
+ const result = await runMonorepoWorktreeBootstrapCreate({
308
+ branch: 'test/monorepo-create',
309
+ coreRoot,
310
+ monorepoRoot: sourceRepoRoot,
311
+ proteumVersion: 'test',
312
+ runDependencies: async (installRoot) => {
313
+ installRoots.push(installRoot);
314
+ fs.mkdirSync(path.join(installRoot, 'node_modules'), { recursive: true });
315
+ },
316
+ runRefresh: noOpRefresh,
317
+ runRuntimeStatus: noOpRuntime,
318
+ targetRepoRoot,
319
+ });
320
+
321
+ assert.equal(result.targetRepoRoot, targetRepoRoot);
322
+ assert.equal(result.worktreeBootstrap.ok, true);
323
+ assert.equal(result.worktreeBootstrap.apps.length, 2);
324
+ assert.deepEqual(installRoots, [fs.realpathSync(targetRepoRoot)]);
325
+ assert.equal(fs.existsSync(path.join(targetRepoRoot, 'apps', 'product', worktreeBootstrapMarkerRelativePath)), true);
326
+ assert.equal(fs.existsSync(path.join(targetRepoRoot, 'apps', 'website', worktreeBootstrapMarkerRelativePath)), true);
327
+ });
328
+
231
329
  test('worktree bootstrap detects missing env manifest node_modules and version changes', async () => {
232
330
  const appRoot = createCodexAppRoot();
233
331
  writeBootstrapFixture(appRoot);