@lbruton/specflow 3.2.1 → 3.4.0

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.
Files changed (80) hide show
  1. package/README.md +93 -4
  2. package/dist/core/__tests__/project-registry.test.js +140 -9
  3. package/dist/core/__tests__/project-registry.test.js.map +1 -1
  4. package/dist/core/project-registry.d.ts +7 -0
  5. package/dist/core/project-registry.d.ts.map +1 -1
  6. package/dist/core/project-registry.js +128 -12
  7. package/dist/core/project-registry.js.map +1 -1
  8. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +1 -1
  9. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -1
  10. package/dist/dashboard/job-scheduler.js +1 -1
  11. package/dist/dashboard/job-scheduler.js.map +1 -1
  12. package/dist/dashboard/multi-server.d.ts.map +1 -1
  13. package/dist/dashboard/multi-server.js +12 -7
  14. package/dist/dashboard/multi-server.js.map +1 -1
  15. package/dist/dashboard/project-manager.d.ts +7 -3
  16. package/dist/dashboard/project-manager.d.ts.map +1 -1
  17. package/dist/dashboard/project-manager.js +45 -9
  18. package/dist/dashboard/project-manager.js.map +1 -1
  19. package/dist/dashboard/public/assets/{arc-CtYZ6WTd.js → arc-C9RdYoet.js} +1 -1
  20. package/dist/dashboard/public/assets/{blockDiagram-c4efeb88-CzEvDZI5.js → blockDiagram-c4efeb88-CpoCoyo1.js} +1 -1
  21. package/dist/dashboard/public/assets/{c4Diagram-c83219d4-CuPd1dkK.js → c4Diagram-c83219d4-0BnJk81H.js} +1 -1
  22. package/dist/dashboard/public/assets/channel-CQ3V6rNf.js +1 -0
  23. package/dist/dashboard/public/assets/{classDiagram-beda092f-CDTLUu9K.js → classDiagram-beda092f-B_Mv_RGJ.js} +1 -1
  24. package/dist/dashboard/public/assets/{classDiagram-v2-2358418a-BlHqrcgN.js → classDiagram-v2-2358418a-CNQTOVv2.js} +1 -1
  25. package/dist/dashboard/public/assets/clone-ay24TBsM.js +1 -0
  26. package/dist/dashboard/public/assets/{createText-1719965b-B3cTooQ1.js → createText-1719965b-BAYwMYMR.js} +1 -1
  27. package/dist/dashboard/public/assets/{edges-96097737-CbHatH6o.js → edges-96097737-DMbnMq72.js} +1 -1
  28. package/dist/dashboard/public/assets/{erDiagram-0228fc6a-MYCicRH6.js → erDiagram-0228fc6a-CBj1U4Ey.js} +1 -1
  29. package/dist/dashboard/public/assets/{flowDb-c6c81e3f-DDm9aBGx.js → flowDb-c6c81e3f-O7efyy2s.js} +1 -1
  30. package/dist/dashboard/public/assets/{flowDiagram-50d868cf-zb-JtJG0.js → flowDiagram-50d868cf-D-DJB71h.js} +1 -1
  31. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-CuVsPqca.js +1 -0
  32. package/dist/dashboard/public/assets/{flowchart-elk-definition-6af322e1-D5TGPnG-.js → flowchart-elk-definition-6af322e1-oiuUb60e.js} +1 -1
  33. package/dist/dashboard/public/assets/{ganttDiagram-a2739b55-Cqst4HhR.js → ganttDiagram-a2739b55-BDxOT_6-.js} +1 -1
  34. package/dist/dashboard/public/assets/{gitGraphDiagram-82fe8481-C8JWqtTx.js → gitGraphDiagram-82fe8481-Bgr9ZQnS.js} +1 -1
  35. package/dist/dashboard/public/assets/{graph-Lpyd8dqZ.js → graph-Da4wGOG7.js} +1 -1
  36. package/dist/dashboard/public/assets/{index-5325376f-Ngqm3jj1.js → index-5325376f-gLZiKKHO.js} +1 -1
  37. package/dist/dashboard/public/assets/{index-m5SRqxVX.js → index-Bbj8XNub.js} +1 -1
  38. package/dist/dashboard/public/assets/{index-D9fDAa7f.js → index-BhPgRGlY.js} +1 -1
  39. package/dist/dashboard/public/assets/{index-DQ2Aap_e.js → index-BrB3V_Yj.js} +1 -1
  40. package/dist/dashboard/public/assets/{index-RZXsuDxo.js → index-BwWpWr-J.js} +1 -1
  41. package/dist/dashboard/public/assets/{index-B2wloU4M.js → index-ByiB-KGa.js} +1 -1
  42. package/dist/dashboard/public/assets/{index-Bqk8CAAy.js → index-C00b444y.js} +1 -1
  43. package/dist/dashboard/public/assets/{index-DFN4bEYo.js → index-C7ghgKx5.js} +1 -1
  44. package/dist/dashboard/public/assets/{index--_-9KDkB.js → index-CT-NcNte.js} +1 -1
  45. package/dist/dashboard/public/assets/{index-BWvyG2sq.js → index-CWCaPZqn.js} +1 -1
  46. package/dist/dashboard/public/assets/{index-7POr4IQt.js → index-CeJ0Ezor.js} +1 -1
  47. package/dist/dashboard/public/assets/{index-D4J257wx.js → index-Csg_kK7R.js} +1 -1
  48. package/dist/dashboard/public/assets/{index-Cqbzr5qD.js → index-CsxlnuTb.js} +1 -1
  49. package/dist/dashboard/public/assets/index-D82buXO8.css +1 -0
  50. package/dist/dashboard/public/assets/{index-BhwV70vC.js → index-DIz7RO__.js} +1 -1
  51. package/dist/dashboard/public/assets/{index-Djo38KZb.js → index-DLddfutl.js} +1 -1
  52. package/dist/dashboard/public/assets/{index-BHCmvfMN.js → index-DlRhzvrs.js} +1 -1
  53. package/dist/dashboard/public/assets/{index-BB9i8dPx.js → index-EYEWEFY7.js} +5 -5
  54. package/dist/dashboard/public/assets/{index-CUP35nar.js → index-fof6rzAA.js} +1 -1
  55. package/dist/dashboard/public/assets/{index-CYy3mVaI.js → index-zaP8v6hc.js} +1 -1
  56. package/dist/dashboard/public/assets/{infoDiagram-8eee0895-DYMb32US.js → infoDiagram-8eee0895-DTASKDfo.js} +1 -1
  57. package/dist/dashboard/public/assets/{journeyDiagram-c64418c1-BgL0JuAb.js → journeyDiagram-c64418c1-C3NgZB3A.js} +1 -1
  58. package/dist/dashboard/public/assets/{layout-DP9fJAz2.js → layout-CuHOkMT0.js} +1 -1
  59. package/dist/dashboard/public/assets/{line-N_NGiB5u.js → line-BV-xs20C.js} +1 -1
  60. package/dist/dashboard/public/assets/{linear-B1Bl-FQE.js → linear-0VNwbj1D.js} +1 -1
  61. package/dist/dashboard/public/assets/{mindmap-definition-8da855dc-DuejFf1j.js → mindmap-definition-8da855dc-C0OsREXf.js} +1 -1
  62. package/dist/dashboard/public/assets/{pieDiagram-a8764435-fJ2uKW1i.js → pieDiagram-a8764435-CSlM7Bmg.js} +1 -1
  63. package/dist/dashboard/public/assets/{quadrantDiagram-1e28029f-Dowa1iq5.js → quadrantDiagram-1e28029f-CxPjmNev.js} +1 -1
  64. package/dist/dashboard/public/assets/{requirementDiagram-08caed73-1PKeJnUu.js → requirementDiagram-08caed73-DqXwJ9uQ.js} +1 -1
  65. package/dist/dashboard/public/assets/{sankeyDiagram-a04cb91d-C3Nu91E8.js → sankeyDiagram-a04cb91d-BqQwMG6-.js} +1 -1
  66. package/dist/dashboard/public/assets/{sequenceDiagram-c5b8d532-BbyYeaFb.js → sequenceDiagram-c5b8d532-D9idFb_z.js} +1 -1
  67. package/dist/dashboard/public/assets/{stateDiagram-1ecb1508-BVkb4gIE.js → stateDiagram-1ecb1508-dFxRX4Ju.js} +1 -1
  68. package/dist/dashboard/public/assets/{stateDiagram-v2-c2b004d7-Bm7qug6Q.js → stateDiagram-v2-c2b004d7-C8Oh1UhQ.js} +1 -1
  69. package/dist/dashboard/public/assets/{styles-b4e223ce-BuqydlKk.js → styles-b4e223ce-BkQuF_2c.js} +1 -1
  70. package/dist/dashboard/public/assets/{styles-ca3715f6-C8L7peEM.js → styles-ca3715f6-C-_LDsG9.js} +1 -1
  71. package/dist/dashboard/public/assets/{styles-d45a18b0-BbrCCPkQ.js → styles-d45a18b0-Cq8VV6WX.js} +1 -1
  72. package/dist/dashboard/public/assets/{svgDrawCommon-b86b1483-DQZAHvSt.js → svgDrawCommon-b86b1483-BFrB_wfF.js} +1 -1
  73. package/dist/dashboard/public/assets/{timeline-definition-faaaa080-YPoIuE--.js → timeline-definition-faaaa080-BSFjNcUT.js} +1 -1
  74. package/dist/dashboard/public/assets/{xychartDiagram-f5964ef8-BnI4pVWV.js → xychartDiagram-f5964ef8-Dr-pXGBx.js} +1 -1
  75. package/dist/dashboard/public/index.html +2 -2
  76. package/package.json +5 -5
  77. package/dist/dashboard/public/assets/channel-kGGkJUti.js +0 -1
  78. package/dist/dashboard/public/assets/clone-CHdfA33T.js +0 -1
  79. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-DRD7GAtr.js +0 -1
  80. package/dist/dashboard/public/assets/index-Cv_FT1Rp.css +0 -1
package/README.md CHANGED
@@ -117,20 +117,109 @@ Code Context is a [hardened fork](https://github.com/lbruton/claude-context) of
117
117
  | Self-hosted | Files | Files | Files | Files | Files | Node.js | **Milvus, Neo4j + cloud optional** |
118
118
  | Best for | Quick adoption | Enterprise teams | Solo context eng. | PRD pipelines | Per-repo memory | Structured workflow | **Multi-project governance** |
119
119
 
120
+ ## Multi-Agent Support
121
+
122
+ SpecFlow works as an MCP server, which means any agent that speaks the MCP protocol can use it. Verified with all three major coding agents:
123
+
124
+ | Agent | MCP Loading | Spec Lifecycle | Skills |
125
+ |-------|------------|----------------|--------|
126
+ | **Claude Code** | MCP via npm, plugin via git clone | Full | 60+ skills via SKILL.md |
127
+ | **Gemini CLI** | Manual MCP config | Full | Via GEMINI.md instructions |
128
+ | **Codex CLI** | Manual MCP config | Full | Via CODEX.md instructions |
129
+
130
+ All three agents share the same MCP tools, DocVault knowledge base, and spec workflow. Agent-specific instruction files (CLAUDE.md, GEMINI.md, CODEX.md) tailor behavior to each agent's capabilities.
131
+
132
+ ### Cross-Agent Spec Handoff
133
+
134
+ Spec state lives on disk in `.spec-workflow/specs/` — not in any agent's memory. This means you can start a spec in one agent and continue in another:
135
+
136
+ ```
137
+ Claude Code Codex CLI Gemini CLI
138
+ ──────────── ───────── ──────────
139
+ /issue create @spec resume @spec resume
140
+ → creates SWF-65 → reads spec from disk → reads spec from disk
141
+ /discover SWF-65 → runs Phase 3 (Tasks) → runs Phase 4 (Implement)
142
+ → discovery brief → generates task list → implements tasks
143
+ /spec SWF-65 → writes tasks.md → commits code
144
+ → Phase 1 (Requirements) → awaits approval → logs implementation
145
+ → Phase 2 (Design)
146
+ → awaits approval
147
+ ```
148
+
149
+ Each agent reads the current spec state, advances the workflow, and writes the result back to disk. The dashboard shows progress regardless of which agent is driving. Use whichever agent is best suited for each phase — Claude for discovery and design, Codex for implementation, Gemini for review.
150
+
120
151
  ## Quick Start
121
152
 
122
- ### As a Claude Code Plugin (recommended)
153
+ ### Claude Code
154
+
155
+ **Step 1 — Install the MCP server** (provides tools and prompts):
156
+
157
+ Add to your user-level settings (`~/.claude/settings.json`):
158
+
159
+ ```json
160
+ {
161
+ "mcpServers": {
162
+ "specflow": {
163
+ "command": "npx",
164
+ "args": ["-y", "@lbruton/specflow@latest", "."]
165
+ }
166
+ }
167
+ }
168
+ ```
169
+
170
+ **Step 2 — Install the plugin** (optional — provides skills and slash commands):
171
+
172
+ ```bash
173
+ git clone https://github.com/lbruton/specflow.git
174
+ cp -r specflow/plugin/ ~/.claude/plugins/marketplaces/specflow-marketplace/
175
+ ```
176
+
177
+ Skills like `/prime`, `/wrap`, `/spec` are available immediately after restarting Claude Code.
178
+
179
+ > **Note:** The plugin provides skills and commands only — it does not start the MCP server. The MCP server must be installed separately via Step 1.
180
+
181
+ ### Gemini CLI — Manual Install
123
182
 
124
183
  ```bash
125
184
  git clone https://github.com/lbruton/specflow.git
126
185
  cd specflow
127
186
  npm install && npm run build
187
+ ```
188
+
189
+ Add to your Gemini MCP config (`~/.gemini/settings.json` or project-level):
128
190
 
129
- # Symlink into Claude Code plugins
130
- ln -s "$(pwd)" ~/.claude/plugins/marketplaces/specflow-marketplace
191
+ ```json
192
+ {
193
+ "mcpServers": {
194
+ "spec-workflow": {
195
+ "command": "node",
196
+ "args": ["/path/to/specflow/dist/index.js", "/path/to/your/project"]
197
+ }
198
+ }
199
+ }
131
200
  ```
132
201
 
133
- ### As an MCP Server
202
+ Copy `GEMINI.md` from the specflow repo root into your project root for agent-specific instructions.
203
+
204
+ ### Codex CLI — Manual Install
205
+
206
+ ```bash
207
+ git clone https://github.com/lbruton/specflow.git
208
+ cd specflow
209
+ npm install && npm run build
210
+ ```
211
+
212
+ Add to your Codex MCP config (`.codex/config.toml` or user-level):
213
+
214
+ ```toml
215
+ [mcp.spec-workflow]
216
+ command = "node"
217
+ args = ["/path/to/specflow/dist/index.js", "/path/to/your/project"]
218
+ ```
219
+
220
+ Copy `CODEX.md` from the specflow repo root into your project root for agent-specific instructions.
221
+
222
+ ### Any MCP-Compatible Agent — Via npx
134
223
 
135
224
  ```json
136
225
  {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
2
  import { promises as fs } from 'fs';
3
- import { join } from 'path';
3
+ import { join, resolve } from 'path';
4
4
  import { tmpdir } from 'os';
5
5
  import { ProjectRegistry, generateProjectId } from '../project-registry.js';
6
6
  import { SPEC_WORKFLOW_HOME_ENV } from '../global-dir.js';
@@ -28,16 +28,16 @@ describe('ProjectRegistry worktree identity', () => {
28
28
  const projectId = await registry.registerProject(workspacePath, process.pid, { workflowRootPath });
29
29
  const entry = await registry.getProjectById(projectId);
30
30
  expect(entry).not.toBeNull();
31
- expect(entry?.projectPath).toBe(workspacePath);
32
- expect(entry?.workflowRootPath).toBe(workflowRootPath);
33
- expect(entry?.projectName).toBe('my-repo · feature-auth');
31
+ expect(entry?.projectPath).toBe(resolve(workflowRootPath));
32
+ expect(entry?.workflowRootPath).toBe(resolve(workflowRootPath));
33
+ expect(entry?.projectName).toBe('my-repo');
34
34
  });
35
- it('generates different project IDs for different worktrees of same repo', async () => {
35
+ it('generates same project ID for different worktrees of same repo', async () => {
36
36
  const registry = new ProjectRegistry();
37
37
  const workflowRootPath = '/tmp/my-repo';
38
38
  const projectIdA = await registry.registerProject('/tmp/worktrees/feature-a', process.pid, { workflowRootPath });
39
- const projectIdB = await registry.registerProject('/tmp/worktrees/feature-b', process.pid, { workflowRootPath });
40
- expect(projectIdA).not.toBe(projectIdB);
39
+ const projectIdB = await registry.registerProject('/tmp/worktrees/feature-b', process.pid + 1, { workflowRootPath });
40
+ expect(projectIdA).toBe(projectIdB);
41
41
  });
42
42
  it('normalizes legacy entries without workflowRootPath', async () => {
43
43
  const workspacePath = '/tmp/my-repo';
@@ -55,8 +55,139 @@ describe('ProjectRegistry worktree identity', () => {
55
55
  const registry = new ProjectRegistry();
56
56
  const projects = await registry.getAllProjects();
57
57
  expect(projects).toHaveLength(1);
58
- expect(projects[0].workflowRootPath).toBe(workspacePath);
59
- expect(projects[0].projectPath).toBe(workspacePath);
58
+ expect(projects[0].workflowRootPath).toBe(resolve(workspacePath));
59
+ expect(projects[0].projectPath).toBe(resolve(workspacePath));
60
+ });
61
+ it('worktree registration merges into parent entry', async () => {
62
+ const registry = new ProjectRegistry();
63
+ const workflowRootPath = '/tmp/my-repo';
64
+ const worktreePath = '/tmp/worktrees/feature-x';
65
+ // Register main repo first
66
+ const mainId = await registry.registerProject(workflowRootPath, process.pid, { workflowRootPath });
67
+ // Register a worktree with the same workflowRootPath
68
+ const wtId = await registry.registerProject(worktreePath, process.pid + 1, { workflowRootPath });
69
+ expect(mainId).toBe(wtId);
70
+ const projects = await registry.getAllProjects();
71
+ expect(projects).toHaveLength(1);
72
+ const entry = await registry.getProjectById(mainId);
73
+ expect(entry).not.toBeNull();
74
+ expect(entry.worktrees).toContain(resolve(worktreePath));
75
+ });
76
+ it('multiple worktrees share one entry', async () => {
77
+ const registry = new ProjectRegistry();
78
+ const workflowRootPath = '/tmp/my-repo';
79
+ const wt1 = '/tmp/worktrees/feat-a';
80
+ const wt2 = '/tmp/worktrees/feat-b';
81
+ const wt3 = '/tmp/worktrees/feat-c';
82
+ const id1 = await registry.registerProject(wt1, process.pid, { workflowRootPath });
83
+ const id2 = await registry.registerProject(wt2, process.pid + 1, { workflowRootPath });
84
+ const id3 = await registry.registerProject(wt3, process.pid + 2, { workflowRootPath });
85
+ expect(id1).toBe(id2);
86
+ expect(id2).toBe(id3);
87
+ const projects = await registry.getAllProjects();
88
+ expect(projects).toHaveLength(1);
89
+ const entry = projects[0];
90
+ expect(entry.worktrees).toContain(resolve(wt1));
91
+ expect(entry.worktrees).toContain(resolve(wt2));
92
+ expect(entry.worktrees).toContain(resolve(wt3));
93
+ });
94
+ it('migration deduplicates existing registry entries', async () => {
95
+ const registryPath = join(tempDir, 'activeProjects.json');
96
+ const workflowRootPath = '/tmp/my-repo';
97
+ const resolvedRoot = resolve(workflowRootPath);
98
+ // Two entries with DIFFERENT projectIds but the SAME workflowRootPath
99
+ // Simulates legacy registry where worktrees were keyed by their own path
100
+ const legacyId1 = generateProjectId('/tmp/worktrees/feat-a');
101
+ const legacyId2 = generateProjectId('/tmp/worktrees/feat-b');
102
+ const legacyData = {
103
+ [legacyId1]: {
104
+ projectId: legacyId1,
105
+ projectPath: '/tmp/worktrees/feat-a',
106
+ workflowRootPath,
107
+ projectName: 'my-repo · feat-a',
108
+ instances: [{ pid: 99990, registeredAt: new Date().toISOString() }],
109
+ worktrees: ['/tmp/worktrees/feat-a']
110
+ },
111
+ [legacyId2]: {
112
+ projectId: legacyId2,
113
+ projectPath: '/tmp/worktrees/feat-b',
114
+ workflowRootPath,
115
+ projectName: 'my-repo · feat-b',
116
+ instances: [{ pid: 99991, registeredAt: new Date().toISOString() }],
117
+ worktrees: ['/tmp/worktrees/feat-b']
118
+ }
119
+ };
120
+ await fs.writeFile(registryPath, JSON.stringify(legacyData, null, 2), 'utf-8');
121
+ const registry = new ProjectRegistry();
122
+ // cleanupStaleProjects triggers migrateDeduplicateEntries internally
123
+ await registry.cleanupStaleProjects();
124
+ const projects = await registry.getAllProjects();
125
+ expect(projects).toHaveLength(1);
126
+ const entry = projects[0];
127
+ expect(entry.projectId).toBe(generateProjectId(resolvedRoot));
128
+ expect(entry.workflowRootPath).toBe(resolvedRoot);
129
+ expect(entry.projectName).toBe('my-repo');
130
+ });
131
+ it('legacy entries without worktrees field default to empty array', async () => {
132
+ const registryPath = join(tempDir, 'activeProjects.json');
133
+ const workspacePath = '/tmp/my-repo';
134
+ const projectId = generateProjectId(workspacePath);
135
+ const legacyData = {
136
+ [projectId]: {
137
+ projectId,
138
+ projectPath: workspacePath,
139
+ workflowRootPath: workspacePath,
140
+ projectName: 'my-repo',
141
+ instances: [{ pid: process.pid, registeredAt: new Date().toISOString() }]
142
+ // No worktrees field
143
+ }
144
+ };
145
+ await fs.writeFile(registryPath, JSON.stringify(legacyData, null, 2), 'utf-8');
146
+ const registry = new ProjectRegistry();
147
+ const entry = await registry.getProjectById(projectId);
148
+ expect(entry).not.toBeNull();
149
+ expect(entry.worktrees).toEqual([]);
150
+ });
151
+ it('unregistering a worktree removes it from worktrees array', async () => {
152
+ const registry = new ProjectRegistry();
153
+ const workflowRootPath = '/tmp/my-repo';
154
+ const worktreePath = '/tmp/worktrees/feat-x';
155
+ const mainPid = process.pid;
156
+ const wtPid = process.pid + 1;
157
+ // Register main + worktree
158
+ await registry.registerProject(workflowRootPath, mainPid, { workflowRootPath });
159
+ await registry.registerProject(worktreePath, wtPid, { workflowRootPath });
160
+ // Verify worktree is tracked
161
+ let entry = await registry.getProject(workflowRootPath);
162
+ expect(entry.worktrees).toContain(resolve(worktreePath));
163
+ // Unregister the worktree by its path and PID
164
+ await registry.unregisterProject(worktreePath, wtPid);
165
+ // Project should still exist (main PID alive) but worktree path removed
166
+ entry = await registry.getProject(workflowRootPath);
167
+ expect(entry).not.toBeNull();
168
+ expect(entry.worktrees).not.toContain(resolve(worktreePath));
169
+ });
170
+ it('getProject finds project via worktree path', async () => {
171
+ const registry = new ProjectRegistry();
172
+ const workflowRootPath = '/tmp/my-repo';
173
+ const worktreePath = '/tmp/worktrees/feat-y';
174
+ await registry.registerProject(worktreePath, process.pid, { workflowRootPath });
175
+ // Look up by worktree path — should return the parent project
176
+ const entry = await registry.getProject(worktreePath);
177
+ expect(entry).not.toBeNull();
178
+ expect(entry.workflowRootPath).toBe(resolve(workflowRootPath));
179
+ expect(entry.worktrees).toContain(resolve(worktreePath));
180
+ });
181
+ it('isProjectRegistered returns true for worktree path', async () => {
182
+ const registry = new ProjectRegistry();
183
+ const workflowRootPath = '/tmp/my-repo';
184
+ const worktreePath = '/tmp/worktrees/feat-z';
185
+ await registry.registerProject(worktreePath, process.pid, { workflowRootPath });
186
+ // Both the root and the worktree path should be recognized
187
+ expect(await registry.isProjectRegistered(workflowRootPath)).toBe(true);
188
+ expect(await registry.isProjectRegistered(worktreePath)).toBe(true);
189
+ // An unrelated path should not
190
+ expect(await registry.isProjectRegistered('/tmp/other-repo')).toBe(false);
60
191
  });
61
192
  });
62
193
  //# sourceMappingURL=project-registry.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-registry.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/project-registry.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-registry.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/project-registry.test.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export interface ProjectRegistryEntry {
8
8
  workflowRootPath: string;
9
9
  projectName: string;
10
10
  instances: ProjectInstance[];
11
+ worktrees: string[];
11
12
  }
12
13
  export interface RegisterProjectOptions {
13
14
  workflowRootPath?: string;
@@ -82,6 +83,12 @@ export declare class ProjectRegistry {
82
83
  * Get a specific project by projectId
83
84
  */
84
85
  getProjectById(projectId: string): Promise<ProjectRegistryEntry | null>;
86
+ /**
87
+ * Migrate legacy registry entries that were created before worktree-aware keying.
88
+ * Groups entries by workflowRootPath and merges duplicates into a single canonical entry.
89
+ * Idempotent — returns false if no changes were made.
90
+ */
91
+ private migrateDeduplicateEntries;
85
92
  /**
86
93
  * Clean up stale instances (where the process is no longer running)
87
94
  * Projects with no live instances are removed entirely
@@ -1 +1 @@
1
- {"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/core/project-registry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CASlG;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAkB;;IAO7C;;OAEG;YACW,iBAAiB;IAkB/B;;;OAGG;YACW,YAAY;IA0D1B;;OAEG;YACW,aAAa;IAY3B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,MAAM,CAAC;IA8C9G;;;;OAIG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzE;;OAEG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAKvD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAO3E;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAK7E;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IA6B7C;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhE;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
1
+ {"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/core/project-registry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CASlG;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAkB;;IAO7C;;OAEG;YACW,iBAAiB;IAkB/B;;;OAGG;YACW,YAAY;IA2D1B;;OAEG;YACW,aAAa;IAY3B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,MAAM,CAAC;IAyD9G;;;;OAIG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCzE;;OAEG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAKvD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAmB3E;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAK7E;;;;OAIG;YACW,yBAAyB;IA4EvC;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkC7C;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBhE;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
@@ -83,7 +83,8 @@ export class ProjectRegistry {
83
83
  projectPath: normalizedProjectPath,
84
84
  workflowRootPath: normalizedWorkflowRootPath,
85
85
  projectName: entry.projectName || generateProjectDisplayName(normalizedProjectPath, normalizedWorkflowRootPath),
86
- instances: Array.isArray(entry.instances) ? entry.instances : []
86
+ instances: Array.isArray(entry.instances) ? entry.instances : [],
87
+ worktrees: Array.isArray(entry.worktrees) ? entry.worktrees : []
87
88
  });
88
89
  }
89
90
  return registry;
@@ -166,14 +167,14 @@ export class ProjectRegistry {
166
167
  */
167
168
  async registerProject(projectPath, pid, options = {}) {
168
169
  const workspacePath = resolve(projectPath);
170
+ const workflowRootPath = resolve(options.workflowRootPath || projectPath);
169
171
  // Skip registration for paths outside configured project root(s)
170
- if (!this.isUnderProjectRoot(workspacePath)) {
171
- return generateProjectId(workspacePath);
172
+ if (!this.isUnderProjectRoot(workflowRootPath)) {
173
+ return generateProjectId(workflowRootPath);
172
174
  }
173
175
  const registry = await this.readRegistry();
174
- const workflowRootPath = resolve(options.workflowRootPath || projectPath);
175
- const projectId = generateProjectId(workspacePath);
176
- const projectName = options.projectName || generateProjectDisplayName(workspacePath, workflowRootPath);
176
+ const projectId = generateProjectId(workflowRootPath);
177
+ const projectName = options.projectName || basename(workflowRootPath);
177
178
  const existing = registry.get(projectId);
178
179
  if (existing) {
179
180
  // Self-healing: Filter out dead PIDs
@@ -182,8 +183,12 @@ export class ProjectRegistry {
182
183
  if (!liveInstances.some(i => i.pid === pid)) {
183
184
  liveInstances.push({ pid, registeredAt: new Date().toISOString() });
184
185
  }
186
+ // Track worktree paths (deduped)
187
+ if (workspacePath !== workflowRootPath && !existing.worktrees.includes(workspacePath)) {
188
+ existing.worktrees.push(workspacePath);
189
+ }
185
190
  // Update with live instances (no limit on number of instances)
186
- existing.projectPath = workspacePath;
191
+ existing.projectPath = workflowRootPath;
187
192
  existing.workflowRootPath = workflowRootPath;
188
193
  existing.projectName = projectName;
189
194
  existing.instances = liveInstances;
@@ -191,11 +196,16 @@ export class ProjectRegistry {
191
196
  }
192
197
  else {
193
198
  // New project
199
+ const worktrees = [];
200
+ if (workspacePath !== workflowRootPath) {
201
+ worktrees.push(workspacePath);
202
+ }
194
203
  const entry = {
195
204
  projectId,
196
- projectPath: workspacePath,
205
+ projectPath: workflowRootPath,
197
206
  workflowRootPath,
198
207
  projectName,
208
+ worktrees,
199
209
  instances: [{ pid, registeredAt: new Date().toISOString() }]
200
210
  };
201
211
  registry.set(projectId, entry);
@@ -211,13 +221,26 @@ export class ProjectRegistry {
211
221
  async unregisterProject(projectPath, pid) {
212
222
  const registry = await this.readRegistry();
213
223
  const absolutePath = resolve(projectPath);
214
- const projectId = generateProjectId(absolutePath);
215
- const entry = registry.get(projectId);
224
+ // Try direct lookup first (path is the workflowRootPath)
225
+ let projectId = generateProjectId(absolutePath);
226
+ let entry = registry.get(projectId);
227
+ // If not found, the path might be a worktree — scan entries for a worktree match
228
+ if (!entry) {
229
+ for (const [id, e] of registry.entries()) {
230
+ if (e.worktrees.includes(absolutePath)) {
231
+ projectId = id;
232
+ entry = e;
233
+ break;
234
+ }
235
+ }
236
+ }
216
237
  if (!entry)
217
238
  return;
218
239
  if (pid !== undefined) {
219
240
  // Remove only this PID's instance
220
241
  entry.instances = entry.instances.filter(i => i.pid !== pid);
242
+ // Also remove the worktree path if present
243
+ entry.worktrees = entry.worktrees.filter(w => w !== absolutePath);
221
244
  if (entry.instances.length === 0) {
222
245
  registry.delete(projectId);
223
246
  }
@@ -252,8 +275,18 @@ export class ProjectRegistry {
252
275
  async getProject(projectPath) {
253
276
  const registry = await this.readRegistry();
254
277
  const absolutePath = resolve(projectPath);
278
+ // Try direct lookup (path is the workflowRootPath)
255
279
  const projectId = generateProjectId(absolutePath);
256
- return registry.get(projectId) || null;
280
+ const direct = registry.get(projectId);
281
+ if (direct)
282
+ return direct;
283
+ // Scan for worktree match
284
+ for (const entry of registry.values()) {
285
+ if (entry.worktrees.includes(absolutePath)) {
286
+ return entry;
287
+ }
288
+ }
289
+ return null;
257
290
  }
258
291
  /**
259
292
  * Get a specific project by projectId
@@ -262,6 +295,76 @@ export class ProjectRegistry {
262
295
  const registry = await this.readRegistry();
263
296
  return registry.get(projectId) || null;
264
297
  }
298
+ /**
299
+ * Migrate legacy registry entries that were created before worktree-aware keying.
300
+ * Groups entries by workflowRootPath and merges duplicates into a single canonical entry.
301
+ * Idempotent — returns false if no changes were made.
302
+ */
303
+ async migrateDeduplicateEntries(registry) {
304
+ // Group entries by workflowRootPath
305
+ const groups = new Map(); // workflowRootPath -> projectId[]
306
+ for (const [projectId, entry] of registry.entries()) {
307
+ const key = entry.workflowRootPath;
308
+ const existing = groups.get(key);
309
+ if (existing) {
310
+ existing.push(projectId);
311
+ }
312
+ else {
313
+ groups.set(key, [projectId]);
314
+ }
315
+ }
316
+ let merged = false;
317
+ for (const [workflowRootPath, projectIds] of groups.entries()) {
318
+ if (projectIds.length <= 1)
319
+ continue;
320
+ // Find the canonical entry — the one whose projectId matches the workflowRootPath hash
321
+ const canonicalId = generateProjectId(workflowRootPath);
322
+ let canonicalEntry = registry.get(canonicalId);
323
+ if (!canonicalEntry) {
324
+ // No correctly-keyed entry exists — create one from the first duplicate
325
+ const firstEntry = registry.get(projectIds[0]);
326
+ canonicalEntry = {
327
+ projectId: canonicalId,
328
+ projectPath: workflowRootPath,
329
+ workflowRootPath,
330
+ projectName: basename(workflowRootPath),
331
+ instances: [],
332
+ worktrees: []
333
+ };
334
+ registry.set(canonicalId, canonicalEntry);
335
+ }
336
+ // Merge all duplicate entries into the canonical one
337
+ const seenPids = new Set(canonicalEntry.instances.map(i => i.pid));
338
+ const seenWorktrees = new Set(canonicalEntry.worktrees);
339
+ for (const dupId of projectIds) {
340
+ if (dupId === canonicalId)
341
+ continue;
342
+ const dupEntry = registry.get(dupId);
343
+ // Merge instances (dedup by PID)
344
+ for (const instance of dupEntry.instances) {
345
+ if (!seenPids.has(instance.pid)) {
346
+ seenPids.add(instance.pid);
347
+ canonicalEntry.instances.push(instance);
348
+ }
349
+ }
350
+ // Merge worktrees (dedup)
351
+ for (const wt of dupEntry.worktrees) {
352
+ if (!seenWorktrees.has(wt)) {
353
+ seenWorktrees.add(wt);
354
+ canonicalEntry.worktrees.push(wt);
355
+ }
356
+ }
357
+ // Delete the non-canonical entry
358
+ registry.delete(dupId);
359
+ }
360
+ // Ensure canonical metadata is correct
361
+ canonicalEntry.projectPath = workflowRootPath;
362
+ canonicalEntry.projectName = basename(workflowRootPath);
363
+ console.error(`[ProjectRegistry] Migration: merged ${projectIds.length} entries for ${workflowRootPath}`);
364
+ merged = true;
365
+ }
366
+ return merged;
367
+ }
265
368
  /**
266
369
  * Clean up stale instances (where the process is no longer running)
267
370
  * Projects with no live instances are removed entirely
@@ -284,6 +387,10 @@ export class ProjectRegistry {
284
387
  registry.set(projectId, entry);
285
388
  }
286
389
  }
390
+ // Deduplicate legacy entries that were keyed by worktree path instead of workflowRootPath
391
+ if (await this.migrateDeduplicateEntries(registry)) {
392
+ needsWrite = true;
393
+ }
287
394
  if (needsWrite) {
288
395
  await this.writeRegistry(registry);
289
396
  this.needsInitialization = false; // Reset flag after successful write
@@ -296,8 +403,17 @@ export class ProjectRegistry {
296
403
  async isProjectRegistered(projectPath) {
297
404
  const registry = await this.readRegistry();
298
405
  const absolutePath = resolve(projectPath);
406
+ // Direct lookup
299
407
  const projectId = generateProjectId(absolutePath);
300
- return registry.has(projectId);
408
+ if (registry.has(projectId))
409
+ return true;
410
+ // Worktree scan
411
+ for (const entry of registry.values()) {
412
+ if (entry.worktrees.includes(absolutePath)) {
413
+ return true;
414
+ }
415
+ }
416
+ return false;
301
417
  }
302
418
  /**
303
419
  * Get the registry file path for watching
@@ -1 +1 @@
1
- {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/core/project-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/core/project-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAqBvE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACzE,2CAA2C;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,aAAqB,EAAE,gBAAwB;IACxF,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAE5C,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,GAAG,QAAQ,MAAM,aAAa,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,eAAe;IAClB,YAAY,CAAS;IACrB,WAAW,CAAS;IACpB,mBAAmB,GAAY,KAAK,CAAC;IAE7C;QACE,IAAI,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,sDAAsD;YACtD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,kDAAkD;YAClD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5E,MAAM,KAAK,CAAC;YACd,CAAC;YACD,wBAAwB;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC9D,wCAAwC;YACxC,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,YAAY,6CAA6C,CAAC,CAAC;gBAC5G,sCAAsC;gBACtC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,OAAO,IAAI,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAyC,CAAC;YAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;YAEzD,oDAAoD;YACpD,6BAA6B;YAC7B,oCAAoC;YACpC,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACzD,MAAM,0BAA0B,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;gBAExF,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;oBACtB,GAAG,KAAK;oBACR,WAAW,EAAE,qBAAqB;oBAClC,gBAAgB,EAAE,0BAA0B;oBAC5C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,0BAA0B,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;oBAC/G,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;oBAChE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;iBACjE,CAAC,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,2CAA2C;gBAC3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,OAAO,IAAI,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,oDAAoD;gBACpD,OAAO,CAAC,KAAK,CAAC,4CAA4C,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjG,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;gBAChG,6BAA6B;gBAC7B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBAClE,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;oBACjD,OAAO,CAAC,KAAK,CAAC,kDAAkD,UAAU,EAAE,CAAC,CAAC;gBAChF,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,uBAAuB;gBACzB,CAAC;gBACD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,OAAO,IAAI,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,QAA2C;QACrE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9C,kEAAkE;QAClE,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,YAAY,MAAM,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,GAAW;QAChC,4EAA4E;QAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;QACxE,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;YAClC,0DAA0D;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,8EAA8E;YAC9E,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,YAAoB;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QACvD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,GAAW,EAAE,UAAkC,EAAE;QAC1F,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;QAE1E,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC/C,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,QAAQ,EAAE,CAAC;YACb,qCAAqC;YACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEjF,6DAA6D;YAC7D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5C,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,iCAAiC;YACjC,IAAI,aAAa,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBACtF,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzC,CAAC;YAED,+DAA+D;YAC/D,QAAQ,CAAC,WAAW,GAAG,gBAAgB,CAAC;YACxC,QAAQ,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YAC7C,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;YACnC,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,cAAc;YACd,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;gBACvC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,KAAK,GAAyB;gBAClC,SAAS;gBACT,WAAW,EAAE,gBAAgB;gBAC7B,gBAAgB;gBAChB,WAAW;gBACX,SAAS;gBACT,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;aAC7D,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAmB,EAAE,GAAY;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAE1C,yDAAyD;QACzD,IAAI,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpC,iFAAiF;QACjF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACvC,SAAS,GAAG,EAAE,CAAC;oBACf,KAAK,GAAG,CAAC,CAAC;oBACV,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,kCAAkC;YAClC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAE7D,2CAA2C;YAC3C,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;YAElE,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAE1C,mDAAmD;QACnD,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,0BAA0B;QAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,yBAAyB,CAAC,QAA2C;QACjF,oCAAoC;QACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC,CAAC,kCAAkC;QAC9E,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,KAAK,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;gBAAE,SAAS;YAErC,uFAAuF;YACvF,MAAM,WAAW,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACxD,IAAI,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/C,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,wEAAwE;gBACxE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,CAAC;gBAChD,cAAc,GAAG;oBACf,SAAS,EAAE,WAAW;oBACtB,WAAW,EAAE,gBAAgB;oBAC7B,gBAAgB;oBAChB,WAAW,EAAE,QAAQ,CAAC,gBAAgB,CAAC;oBACvC,SAAS,EAAE,EAAE;oBACb,SAAS,EAAE,EAAE;iBACd,CAAC;gBACF,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC5C,CAAC;YAED,qDAAqD;YACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAExD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,IAAI,KAAK,KAAK,WAAW;oBAAE,SAAS;gBAEpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;gBAEtC,iCAAiC;gBACjC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAC3B,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;gBAED,0BAA0B;gBAC1B,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACpC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC3B,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACtB,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAED,iCAAiC;gBACjC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,uCAAuC;YACvC,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;YAC9C,cAAc,CAAC,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAExD,OAAO,CAAC,KAAK,CAAC,uCAAuC,UAAU,CAAC,MAAM,gBAAgB,gBAAgB,EAAE,CAAC,CAAC;YAC1G,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,oBAAoB;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,qCAAqC;QAEhF,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YAEhE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,oBAAoB,IAAI,SAAS,CAAC;gBAClC,UAAU,GAAG,IAAI,CAAC;gBAElB,mFAAmF;gBACnF,gFAAgF;gBAChF,yEAAyE;gBACzE,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,0FAA0F;QAC1F,IAAI,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,oCAAoC;QACxE,CAAC;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAE1C,gBAAgB;QAChB,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,gBAAgB;QAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -38,7 +38,7 @@ describe('MultiProjectDashboardServer approvals content resolution', () => {
38
38
  await fs.mkdir(workspacePath, { recursive: true });
39
39
  await fs.mkdir(workflowRootPath, { recursive: true });
40
40
  process.env[SPEC_WORKFLOW_HOME_ENV] = join(tempDir, '.global-state');
41
- projectId = generateProjectId(workspacePath);
41
+ projectId = generateProjectId(workflowRootPath);
42
42
  realFetch = globalThis.fetch;
43
43
  const registry = new ProjectRegistry();
44
44
  await registry.registerProject(workspacePath, process.pid, { workflowRootPath });