@ulysses-ai/create-workspace 0.13.0-beta.0 → 0.13.0-beta.1

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 CHANGED
@@ -8,20 +8,24 @@
8
8
 
9
9
  > Rules, skills, and hooks that steer Claude Code through real work. Sessions you can pause and resume, multi-repo with versioning, shared context that survives chat boundaries.
10
10
 
11
+ > **Beta.** Currently shipping as `0.13.0-beta.x` under the `@beta` dist-tag. Conventions and CLI flags are stable; the `latest` tag will appear when `0.13.0` cuts. Beta testers welcome — please [open an issue](https://github.com/ukt-solutions/create-ulysses-workspace/issues) if anything's confusing.
12
+
13
+ Requires Node 20.9 or later.
14
+
11
15
  ## Quick start
12
16
 
13
17
  ```bash
14
18
  # npm
15
- npm create @ulysses-ai/workspace@latest
19
+ npm create @ulysses-ai/workspace@beta
16
20
 
17
21
  # yarn
18
- yarn create @ulysses-ai/workspace
22
+ yarn create @ulysses-ai/workspace@beta
19
23
 
20
24
  # pnpm
21
- pnpm create @ulysses-ai/workspace
25
+ pnpm create @ulysses-ai/workspace@beta
22
26
 
23
27
  # bun
24
- bun create @ulysses-ai/workspace
28
+ bun create @ulysses-ai/workspace@beta
25
29
  ```
26
30
 
27
31
  Then:
@@ -33,6 +37,30 @@ claude
33
37
  /start-work
34
38
  ```
35
39
 
40
+ ## Migrate an existing project
41
+
42
+ Already have a project directory? Run `--init` from inside it with no target argument:
43
+
44
+ ```bash
45
+ cd my-existing-project
46
+ npx @ulysses-ai/create-workspace@beta --init
47
+ ```
48
+
49
+ The scaffolder treats the current directory as the workspace root. If a `CLAUDE.md` already exists, it's backed up to `CLAUDE.md.bak` and replaced with the workspace template — your old content is preserved for `/workspace-init` to extract from.
50
+
51
+ Then run `claude` and `/workspace-init`. The skill discovers any repos already present, asks which to register in `workspace.json`, prompts for any additional repos to add, extracts documentation from existing sources, and formalizes any in-progress git worktrees as work sessions. Then `/start-work` to begin.
52
+
53
+ ## Upgrade an existing workspace
54
+
55
+ When a new template version ships, upgrade in place:
56
+
57
+ ```bash
58
+ cd my-workspace
59
+ npx @ulysses-ai/create-workspace@beta --upgrade
60
+ ```
61
+
62
+ This stages the new template payload to `.workspace-update/` without changing anything yet. Open Claude Code and run `/workspace-update` — the skill applies each change interactively (asks how to resolve any file you've customized) and runs a maintenance audit before and after.
63
+
36
64
  ## Why "Ulysses"?
37
65
 
38
66
  Ulysses lashed himself to the mast so he could hear the Sirens without being steered into the rocks. A workspace does the same for Claude — freedom to do the work, constraints that keep it on course.
@@ -69,9 +97,9 @@ A scaffolded workspace with:
69
97
 
70
98
  | Command | What it does |
71
99
  | --- | --- |
72
- | `npm create @ulysses-ai/workspace@latest` | Interactive scaffolder (recommended) |
73
- | `npx @ulysses-ai/create-workspace --init [dir]` | Non-interactive fresh install (pass dir directly) |
74
- | `npx @ulysses-ai/create-workspace --upgrade [dir]` | Apply template updates to an existing workspace |
100
+ | `npm create @ulysses-ai/workspace@beta` | Interactive scaffolder (recommended) |
101
+ | `npx @ulysses-ai/create-workspace@beta --init [dir]` | Non-interactive fresh install (pass dir directly) |
102
+ | `npx @ulysses-ai/create-workspace@beta --upgrade [dir]` | Apply template updates to an existing workspace |
75
103
 
76
104
  > **Why two forms?** `npm create <pkg>` resolves to `npx create-<pkg>`, but it consumes the `--init` flag for itself (npm's own subcommand alias). Use the bare `npm create` form for interactive scaffolding; use `npx` directly when you want to pass `--init <dir>` non-interactively.
77
105
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulysses-ai/create-workspace",
3
- "version": "0.13.0-beta.0",
3
+ "version": "0.13.0-beta.1",
4
4
  "description": "A workspace convention for Claude Code: sessions, handoffs, and shared context as files in git",
5
5
  "keywords": [
6
6
  "claude",
@@ -1,3 +1,4 @@
1
+ import '../lib/require-node.mjs';
1
2
  import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync, unlinkSync, statSync, rmSync } from 'fs';
2
3
  import { resolve, dirname, join } from 'path';
3
4
  import { fileURLToPath } from 'url';
@@ -0,0 +1,17 @@
1
+ // Hard Node version requirement for the workspace runtime.
2
+ // Imported by hook utilities and every script entry point so a workspace
3
+ // running on too-old Node fails fast with a clear message instead of
4
+ // later, deeper, with cryptic syntax/feature errors.
5
+
6
+ const REQUIRED_MAJOR = 20;
7
+ const REQUIRED_MINOR = 9;
8
+
9
+ const [major, minor] = process.versions.node.split('.').map(Number);
10
+
11
+ if (major < REQUIRED_MAJOR || (major === REQUIRED_MAJOR && minor < REQUIRED_MINOR)) {
12
+ console.error(`This workspace requires Node.js ${REQUIRED_MAJOR}.${REQUIRED_MINOR} or later.`);
13
+ console.error(` You have: ${process.versions.node}`);
14
+ console.error(` Required: >=${REQUIRED_MAJOR}.${REQUIRED_MINOR}.0`);
15
+ console.error(` Install a newer Node via nvm, fnm, or https://nodejs.org`);
16
+ process.exit(1);
17
+ }
@@ -2,6 +2,7 @@
2
2
  // Add a project repo to an existing work session mid-flight. Creates a
3
3
  // nested project worktree inside the workspace worktree's repos/ dir and
4
4
  // appends the new repo to the session tracker's `repos:` list.
5
+ import '../lib/require-node.mjs';
5
6
  import { execSync } from 'child_process';
6
7
  import { join } from 'path';
7
8
  import {
@@ -11,6 +11,7 @@
11
11
  // Workspace-first removal silently deletes the nested project worktrees'
12
12
  // .git files and leaves orphan worktree records in the project repos.
13
13
  // The safe order keeps both sides of the relationship in sync.
14
+ import '../lib/require-node.mjs';
14
15
  import { execSync } from 'child_process';
15
16
  import { existsSync } from 'fs';
16
17
  import { join } from 'path';
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // Create a work session: workspace worktree + nested project worktrees +
3
3
  // session.md tracker. Produces a self-contained work-sessions/{name}/ folder.
4
+ import '../lib/require-node.mjs';
4
5
  import { execSync } from 'child_process';
5
6
  import { existsSync, mkdirSync, copyFileSync } from 'fs';
6
7
  import { join, resolve } from 'path';
@@ -7,6 +7,7 @@
7
7
  // Usage:
8
8
  // node .claude/scripts/migrate-open-work.mjs <path-to-open-work.md> [workspace-json-path]
9
9
 
10
+ import '../lib/require-node.mjs';
10
11
  import { readFileSync } from 'node:fs';
11
12
  import { createTracker } from './trackers/interface.mjs';
12
13
 
@@ -13,6 +13,7 @@
13
13
  // node migrate-session-layout.mjs --main
14
14
  // node migrate-session-layout.mjs --all --main (runs all sessions then main)
15
15
  // Optional: --root PATH to override auto-detection
16
+ import '../lib/require-node.mjs';
16
17
  import { execSync } from 'child_process';
17
18
  import {
18
19
  readFileSync,
@@ -2,6 +2,7 @@
2
2
  // Issue IDs are opaque strings of the form "gh:N" — adapters outside this file
3
3
  // don't need to parse them; routing is handled by interface.mjs.
4
4
 
5
+ import '../../lib/require-node.mjs';
5
6
  import { spawnSync as nodeSpawnSync } from 'node:child_process';
6
7
  import { AlreadyAssignedError } from './interface.mjs';
7
8
 
@@ -1,6 +1,7 @@
1
1
  // Tracker adapter interface. Skills import only from this module.
2
2
  // See design-tracker-abstraction.md for the full Issue shape and method contracts.
3
3
 
4
+ import '../../lib/require-node.mjs';
4
5
  import { createGithubAdapter } from './github-issues.mjs';
5
6
 
6
7
  export class AlreadyAssignedError extends Error {