@ulysses-ai/create-workspace 0.16.0-beta.0 → 0.16.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulysses-ai/create-workspace",
3
- "version": "0.16.0-beta.0",
3
+ "version": "0.16.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",
@@ -15,6 +15,7 @@ If any of the three fails, prefer plain session work or a single skill invocatio
15
15
  ## File layout
16
16
 
17
17
  - One `goal-{topic}.md` artifact at the top of the active worktree, alongside `session.md`. One goal per worktree.
18
+ - The artifact's frontmatter holds machine state; its body holds the human-readable goal statement, per-phase intent, and a mandatory `## Start command` section (see "Kicking off the goal") with the literal `/goal "..."` invocation the user runs to start the loop.
18
19
  - Phase output artifacts live as siblings. `research-*.md` and `crossref-*.md` are goal-native (produced by `parallel-research` and `crossref` phase types). `design-*.md` and `plan-*.md` are pre-existing session-artifact patterns that `type: skill` phases reuse when the wrapped skill is `superpowers:brainstorming` or `superpowers:writing-plans`; they are not goal-specific.
19
20
  - The artifact is tracked on the session branch and lives there until `/complete-work` runs. It is removed from the branch before the final PR alongside other session artifacts.
20
21
 
@@ -192,9 +193,31 @@ All phases in goal-<topic>.md show status: complete. Phase artifacts exist at: <
192
193
 
193
194
  Fill in `<topic>`, paths, and `<N>` per goal. Anchor on artifacts and committed state, not on feelings.
194
195
 
196
+ ## Kicking off the goal
197
+
198
+ `/goal` is a Claude Code built-in that the **user** types — the agent cannot invoke it. So the moment the artifact is ready is the load-bearing hand-off, and the artifact itself carries the instruction rather than relying on an agent chat message that vanishes on the next compaction or resume.
199
+
200
+ Every `goal-{topic}.md` body MUST include a `## Start command` section containing the literal, copy-paste-ready invocation:
201
+
202
+ ````markdown
203
+ ## Start command
204
+
205
+ ```
206
+ /goal "All phases in goal-<topic>.md show status: complete. Phase artifacts exist at: <paths>. The /complete-work skill has produced release notes and opened the final PR; the PR URL appeared in the transcript. Or stop after <N> turns."
207
+ ```
208
+ ````
209
+
210
+ Rules for the `## Start command`:
211
+
212
+ - It is the `completion_condition` flattened to a **single line** and wrapped in `/goal "..."`. The frontmatter `completion_condition:` (a multi-line folded scalar) is the auditable source of truth; the start command is its runnable rendering. The two must express the same condition — if you edit one, re-derive the other.
213
+ - Flatten by collapsing the folded scalar's newlines to single spaces. Escape any embedded double quotes. Keep it within the 4000-character `/goal` limit.
214
+ - It lives in the body, not the frontmatter, because it is for a human to copy, not for machine parsing.
215
+
216
+ When the artifact is drafted and the user has reviewed it, the agent's hand-off is: point the user at the `## Start command` block and let them run it. Running it flips the goal from `status: pending` to `status: active` (the first `/goal` turn updates the frontmatter per the dispatch pattern). The agent never types `/goal` itself.
217
+
195
218
  ## Lifecycle integration
196
219
 
197
- - `/goal` runs inside an active work session. It does NOT replace `/start-work`. The session is created the normal way, the goal artifact is drafted at the worktree top, then `/goal "<condition>"` kicks off the loop.
220
+ - `/goal` runs inside an active work session. It does NOT replace `/start-work`. The session is created the normal way, the goal artifact is drafted at the worktree top (including its `## Start command` block), and the user runs that block's `/goal "..."` command to kick off the loop.
198
221
  - The goal artifact lives on the session branch and travels with `git push`. It survives across machines and `--resume`.
199
222
  - `session.md`'s `## Tasks` should mirror the phase list at coarse grain (one task per phase) so `TodoWrite` shows high-level progress. The main agent updates `## Tasks` at phase transitions via the helper specified by the `task-list-mirroring` rule, in addition to updating `goal-{topic}.md`.
200
223
  - `/pause-work` works without special handling. The goal-evaluator state resets on resume per the Claude Code docs; phase state is durable in the artifact.
@@ -218,9 +241,9 @@ When the goal artifact is itself the deliverable for a future session to execute
218
241
 
219
242
  ## Appendix: worked example
220
243
 
221
- A complete `goal-evaluate-rate-limiting.md` illustrating all three phase types. The topic is intentionally generic — the example is reference material, not prescriptive.
244
+ A complete `goal-evaluate-rate-limiting.md` illustrating all three phase types. The topic is intentionally generic — the example is reference material, not prescriptive. (The appendix is fenced with four backticks so the example's own `## Start command` code block renders intact.)
222
245
 
223
- ```yaml
246
+ ````yaml
224
247
  ---
225
248
  type: goal
226
249
  topic: evaluate-rate-limiting
@@ -357,6 +380,14 @@ The api-gateway needs rate limiting before the next traffic step-up. This
357
380
  goal runs the full arc from candidate-algorithm research through implementation
358
381
  on the session branch.
359
382
 
383
+ ## Start command
384
+
385
+ ```
386
+ /goal "All 5 phases in goal-evaluate-rate-limiting.md show status: complete. Phase artifacts exist at: research-rate-limiting-strategies.md, crossref-existing-infrastructure.md, design-rate-limiting.md, plan-rate-limiting.md, and the implementation commits land on the session branch (visible in git log). The /complete-work skill has produced release notes and opened the final PR; the PR URL appeared in the transcript. Or stop after 60 turns."
387
+ ```
388
+
389
+ This is the frontmatter `completion_condition` flattened to one line. Run it after reviewing the artifact; it flips the goal to `status: active`.
390
+
360
391
  ## Per-phase intent
361
392
 
362
393
  1. **strategy-research** runs three researchers in parallel, one per
@@ -385,4 +416,4 @@ All phase agents and synthesizers run on Sonnet (the default for team work).
385
416
  The main agent reading and orchestrating this goal runs on Opus. Haiku is
386
417
  unused in this example; it would be appropriate for a phase whose sole job
387
418
  is, e.g., scanning a tree and returning a tagged file list.
388
- ```
419
+ ````
@@ -21,6 +21,7 @@ Determine paths:
21
21
  - Workspace worktree: `work-sessions/{session-name}/workspace/`
22
22
  - Project worktrees: `work-sessions/{session-name}/workspace/repos/{repo}/` for each repo in the tracker's `repos:` list
23
23
  - Read each repo's default branch from workspace.json (`repos.{repo}.branch`)
24
+ - **Release-notes base directory.** Read `workspace.releaseNotesDir` from `workspace.json` (default `workspace-context/release-notes` if the field is absent). Throughout this skill `{releaseNotesDir}` refers to that resolved value; every branch-note path is `{releaseNotesDir}/unreleased/{repo}/…`. Never use a bare `release-notes/`.
24
25
 
25
26
  ### Step 2: Rebase project repos
26
27
 
@@ -86,10 +87,10 @@ For each repo in the tracker's `repos:` list that has commits beyond the base br
86
87
  cd work-sessions/{session-name}/workspace/repos/{repo}
87
88
  COMMIT_ID=$(git rev-parse --short HEAD)
88
89
  cd ../.. # back to the workspace worktree
89
- mkdir -p release-notes/unreleased/{repo-name}
90
+ mkdir -p {releaseNotesDir}/unreleased/{repo-name}
90
91
  ```
91
92
 
92
- **File 1: `release-notes/unreleased/{repo-name}/branch-release-notes-{COMMIT_ID}.md`** (relative to the workspace worktree)
93
+ **File 1: `{releaseNotesDir}/unreleased/{repo-name}/branch-release-notes-{COMMIT_ID}.md`** (relative to the workspace worktree)
93
94
  ```markdown
94
95
  ---
95
96
  branch: {branch}
@@ -105,7 +106,7 @@ date: {YYYY-MM-DD}
105
106
  Written from scratch per coherent-revisions rule.}
106
107
  ```
107
108
 
108
- **File 2: `release-notes/unreleased/{repo-name}/branch-release-questions-{COMMIT_ID}.md`**
109
+ **File 2: `{releaseNotesDir}/unreleased/{repo-name}/branch-release-questions-{COMMIT_ID}.md`**
109
110
  ```markdown
110
111
  ---
111
112
  branch: {branch}
@@ -124,7 +125,7 @@ The `repo:` frontmatter field is what `/release` uses to know which project repo
124
125
  After all repos are processed, commit once on the workspace branch:
125
126
  ```bash
126
127
  cd work-sessions/{session-name}/workspace
127
- git add release-notes/unreleased/
128
+ git add {releaseNotesDir}/unreleased/
128
129
  git commit -m "docs: add release notes for {branch}"
129
130
  ```
130
131
 
@@ -459,7 +460,7 @@ Ask: "These changes weren't part of a formal work session. What do you want to d
459
460
  - **Revert** — undo the changes (with confirmation)
460
461
 
461
462
  ## Notes
462
- - Branch release notes live in the WORKSPACE repo at `release-notes/unreleased/{repo-name}/` — never in project repos. Project repos only ever see code commits and (at release time) `CHANGELOG.md` entries written by `/release`.
463
+ - Branch release notes live in the WORKSPACE repo at `{releaseNotesDir}/unreleased/{repo-name}/` (resolved from `workspace.json` → `workspace.releaseNotesDir`, default `workspace-context/release-notes`) — never in project repos. Project repos only ever see code commits and (at release time) `CHANGELOG.md` entries written by `/release`.
463
464
  - The session tracker's body is the primary source for release note synthesis — it captures the full session history alongside specs and plans
464
465
  - All repos get PRed and merged together — one approval for all
465
466
  - Version bumps happen in `/release`, not `/complete-work` — this avoids version drift when multiple feature branches land between releases
@@ -27,10 +27,12 @@ Check `workspace.json` for `releaseMode`:
27
27
  - **workspace**: process all repos together
28
28
  - **ask**: "Process all repos together or individually?"
29
29
 
30
+ **Release-notes base directory.** Read `workspace.releaseNotesDir` from `workspace.json` (default `workspace-context/release-notes` if the field is absent). Throughout this skill `{releaseNotesDir}` refers to that resolved value; every branch-note path is `{releaseNotesDir}/unreleased/{repo}/…`. Never use a bare `release-notes/`.
31
+
30
32
  **Step 2: Read unreleased notes**
31
33
  Branch notes live in the **workspace** repo, written there by `/complete-work`. For each target repo, list the workspace's unreleased subdirectory for that project:
32
34
  ```bash
33
- ls release-notes/unreleased/{repo}/
35
+ ls {releaseNotesDir}/unreleased/{repo}/
34
36
  ```
35
37
  Read all `branch-release-notes-*.md` and `branch-release-questions-*.md` files.
36
38
 
@@ -71,9 +73,9 @@ The entry stays short. If a change needs more detail, reference the repo's docs
71
73
 
72
74
  **Step 6: Delete consumed branch notes from the workspace**
73
75
  ```bash
74
- rm release-notes/unreleased/{repo}/branch-release-*
76
+ rm {releaseNotesDir}/unreleased/{repo}/branch-release-*
75
77
  # If the directory is now empty, remove it too:
76
- rmdir release-notes/unreleased/{repo} 2>/dev/null || true
78
+ rmdir {releaseNotesDir}/unreleased/{repo} 2>/dev/null || true
77
79
  ```
78
80
  The branch notes were an intermediate capture; their content is now in the CHANGELOG entry and their raw form in git history. They do not survive into the project repo.
79
81
 
@@ -98,7 +100,7 @@ Skip this step if the repo has no package.json or no version field.
98
100
  **Step 7c: Commit the consumed-notes deletion in the workspace**
99
101
  ```bash
100
102
  # From the workspace root
101
- git add release-notes/unreleased/
103
+ git add {releaseNotesDir}/unreleased/
102
104
  git commit -m "release: consume {repo} branch notes for v{version}"
103
105
  ```
104
106
  Workspace and project repos have separate commits — they are separate git histories.
@@ -138,7 +140,7 @@ Process ephemeral workspace-context entries:
138
140
  ## Notes
139
141
 
140
142
  - Release entries live in `CHANGELOG.md` at the project repo root — one file, one concise entry per version. No `release-notes/v*.md`, no `release-notes/archive/`.
141
- - Branch notes live in the WORKSPACE at `release-notes/unreleased/{repo}/`. `/complete-work` writes them; `/release` consumes and deletes them. They never reach project repos.
143
+ - Branch notes live in the WORKSPACE at `{releaseNotesDir}/unreleased/{repo}/` (resolved from `workspace.json` → `workspace.releaseNotesDir`, default `workspace-context/release-notes`). `/complete-work` writes them; `/release` consumes and deletes them. They never reach project repos.
142
144
  - Versions are bumped here, not in `/complete-work`. This keeps the version semantics aligned with what actually shipped (accumulated changes since last release).
143
145
  - The public repo stays lean. Detailed per-branch retrospection exists in workspace git history (the consumed-notes commit) but is not surfaced as standalone files in either repo.
144
146
  - Context synthesis happens in the WORKSPACE repo — Step 7c (consumed-notes) and Step 9 (workspace-context synthesis) are separate workspace commits.