@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 +35 -7
- package/package.json +1 -1
- package/template/.claude/hooks/_utils.mjs +1 -0
- package/template/.claude/lib/require-node.mjs +17 -0
- package/template/.claude/scripts/add-repo-to-session.mjs +1 -0
- package/template/.claude/scripts/cleanup-work-session.mjs +1 -0
- package/template/.claude/scripts/create-work-session.mjs +1 -0
- package/template/.claude/scripts/migrate-open-work.mjs +1 -0
- package/template/.claude/scripts/migrate-session-layout.mjs +1 -0
- package/template/.claude/scripts/trackers/github-issues.mjs +1 -0
- package/template/.claude/scripts/trackers/interface.mjs +1 -0
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@
|
|
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@
|
|
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
|
@@ -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';
|
|
@@ -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 {
|