@lbruton/specflow 3.3.0 → 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.
- package/README.md +93 -4
- package/dist/core/__tests__/project-registry.test.js +140 -9
- package/dist/core/__tests__/project-registry.test.js.map +1 -1
- package/dist/core/project-registry.d.ts +7 -0
- package/dist/core/project-registry.d.ts.map +1 -1
- package/dist/core/project-registry.js +128 -12
- package/dist/core/project-registry.js.map +1 -1
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +1 -1
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -1
- package/dist/dashboard/job-scheduler.js +1 -1
- package/dist/dashboard/job-scheduler.js.map +1 -1
- package/dist/dashboard/multi-server.d.ts.map +1 -1
- package/dist/dashboard/multi-server.js +9 -5
- package/dist/dashboard/multi-server.js.map +1 -1
- package/dist/dashboard/project-manager.d.ts +7 -3
- package/dist/dashboard/project-manager.d.ts.map +1 -1
- package/dist/dashboard/project-manager.js +45 -9
- package/dist/dashboard/project-manager.js.map +1 -1
- package/dist/dashboard/public/assets/{arc-CtYZ6WTd.js → arc-C9RdYoet.js} +1 -1
- package/dist/dashboard/public/assets/{blockDiagram-c4efeb88-CzEvDZI5.js → blockDiagram-c4efeb88-CpoCoyo1.js} +1 -1
- package/dist/dashboard/public/assets/{c4Diagram-c83219d4-CuPd1dkK.js → c4Diagram-c83219d4-0BnJk81H.js} +1 -1
- package/dist/dashboard/public/assets/channel-CQ3V6rNf.js +1 -0
- package/dist/dashboard/public/assets/{classDiagram-beda092f-CDTLUu9K.js → classDiagram-beda092f-B_Mv_RGJ.js} +1 -1
- package/dist/dashboard/public/assets/{classDiagram-v2-2358418a-BlHqrcgN.js → classDiagram-v2-2358418a-CNQTOVv2.js} +1 -1
- package/dist/dashboard/public/assets/clone-ay24TBsM.js +1 -0
- package/dist/dashboard/public/assets/{createText-1719965b-B3cTooQ1.js → createText-1719965b-BAYwMYMR.js} +1 -1
- package/dist/dashboard/public/assets/{edges-96097737-CbHatH6o.js → edges-96097737-DMbnMq72.js} +1 -1
- package/dist/dashboard/public/assets/{erDiagram-0228fc6a-MYCicRH6.js → erDiagram-0228fc6a-CBj1U4Ey.js} +1 -1
- package/dist/dashboard/public/assets/{flowDb-c6c81e3f-DDm9aBGx.js → flowDb-c6c81e3f-O7efyy2s.js} +1 -1
- package/dist/dashboard/public/assets/{flowDiagram-50d868cf-zb-JtJG0.js → flowDiagram-50d868cf-D-DJB71h.js} +1 -1
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-CuVsPqca.js +1 -0
- package/dist/dashboard/public/assets/{flowchart-elk-definition-6af322e1-D5TGPnG-.js → flowchart-elk-definition-6af322e1-oiuUb60e.js} +1 -1
- package/dist/dashboard/public/assets/{ganttDiagram-a2739b55-Cqst4HhR.js → ganttDiagram-a2739b55-BDxOT_6-.js} +1 -1
- package/dist/dashboard/public/assets/{gitGraphDiagram-82fe8481-C8JWqtTx.js → gitGraphDiagram-82fe8481-Bgr9ZQnS.js} +1 -1
- package/dist/dashboard/public/assets/{graph-Lpyd8dqZ.js → graph-Da4wGOG7.js} +1 -1
- package/dist/dashboard/public/assets/{index-5325376f-Ngqm3jj1.js → index-5325376f-gLZiKKHO.js} +1 -1
- package/dist/dashboard/public/assets/{index-m5SRqxVX.js → index-Bbj8XNub.js} +1 -1
- package/dist/dashboard/public/assets/{index-D9fDAa7f.js → index-BhPgRGlY.js} +1 -1
- package/dist/dashboard/public/assets/{index-DQ2Aap_e.js → index-BrB3V_Yj.js} +1 -1
- package/dist/dashboard/public/assets/{index-RZXsuDxo.js → index-BwWpWr-J.js} +1 -1
- package/dist/dashboard/public/assets/{index-B2wloU4M.js → index-ByiB-KGa.js} +1 -1
- package/dist/dashboard/public/assets/{index-Bqk8CAAy.js → index-C00b444y.js} +1 -1
- package/dist/dashboard/public/assets/{index-DFN4bEYo.js → index-C7ghgKx5.js} +1 -1
- package/dist/dashboard/public/assets/{index--_-9KDkB.js → index-CT-NcNte.js} +1 -1
- package/dist/dashboard/public/assets/{index-BWvyG2sq.js → index-CWCaPZqn.js} +1 -1
- package/dist/dashboard/public/assets/{index-7POr4IQt.js → index-CeJ0Ezor.js} +1 -1
- package/dist/dashboard/public/assets/{index-D4J257wx.js → index-Csg_kK7R.js} +1 -1
- package/dist/dashboard/public/assets/{index-Cqbzr5qD.js → index-CsxlnuTb.js} +1 -1
- package/dist/dashboard/public/assets/index-D82buXO8.css +1 -0
- package/dist/dashboard/public/assets/{index-BhwV70vC.js → index-DIz7RO__.js} +1 -1
- package/dist/dashboard/public/assets/{index-Djo38KZb.js → index-DLddfutl.js} +1 -1
- package/dist/dashboard/public/assets/{index-BHCmvfMN.js → index-DlRhzvrs.js} +1 -1
- package/dist/dashboard/public/assets/{index-BB9i8dPx.js → index-EYEWEFY7.js} +5 -5
- package/dist/dashboard/public/assets/{index-CUP35nar.js → index-fof6rzAA.js} +1 -1
- package/dist/dashboard/public/assets/{index-CYy3mVaI.js → index-zaP8v6hc.js} +1 -1
- package/dist/dashboard/public/assets/{infoDiagram-8eee0895-DYMb32US.js → infoDiagram-8eee0895-DTASKDfo.js} +1 -1
- package/dist/dashboard/public/assets/{journeyDiagram-c64418c1-BgL0JuAb.js → journeyDiagram-c64418c1-C3NgZB3A.js} +1 -1
- package/dist/dashboard/public/assets/{layout-DP9fJAz2.js → layout-CuHOkMT0.js} +1 -1
- package/dist/dashboard/public/assets/{line-N_NGiB5u.js → line-BV-xs20C.js} +1 -1
- package/dist/dashboard/public/assets/{linear-B1Bl-FQE.js → linear-0VNwbj1D.js} +1 -1
- package/dist/dashboard/public/assets/{mindmap-definition-8da855dc-DuejFf1j.js → mindmap-definition-8da855dc-C0OsREXf.js} +1 -1
- package/dist/dashboard/public/assets/{pieDiagram-a8764435-fJ2uKW1i.js → pieDiagram-a8764435-CSlM7Bmg.js} +1 -1
- package/dist/dashboard/public/assets/{quadrantDiagram-1e28029f-Dowa1iq5.js → quadrantDiagram-1e28029f-CxPjmNev.js} +1 -1
- package/dist/dashboard/public/assets/{requirementDiagram-08caed73-1PKeJnUu.js → requirementDiagram-08caed73-DqXwJ9uQ.js} +1 -1
- package/dist/dashboard/public/assets/{sankeyDiagram-a04cb91d-C3Nu91E8.js → sankeyDiagram-a04cb91d-BqQwMG6-.js} +1 -1
- package/dist/dashboard/public/assets/{sequenceDiagram-c5b8d532-BbyYeaFb.js → sequenceDiagram-c5b8d532-D9idFb_z.js} +1 -1
- package/dist/dashboard/public/assets/{stateDiagram-1ecb1508-BVkb4gIE.js → stateDiagram-1ecb1508-dFxRX4Ju.js} +1 -1
- package/dist/dashboard/public/assets/{stateDiagram-v2-c2b004d7-Bm7qug6Q.js → stateDiagram-v2-c2b004d7-C8Oh1UhQ.js} +1 -1
- package/dist/dashboard/public/assets/{styles-b4e223ce-BuqydlKk.js → styles-b4e223ce-BkQuF_2c.js} +1 -1
- package/dist/dashboard/public/assets/{styles-ca3715f6-C8L7peEM.js → styles-ca3715f6-C-_LDsG9.js} +1 -1
- package/dist/dashboard/public/assets/{styles-d45a18b0-BbrCCPkQ.js → styles-d45a18b0-Cq8VV6WX.js} +1 -1
- package/dist/dashboard/public/assets/{svgDrawCommon-b86b1483-DQZAHvSt.js → svgDrawCommon-b86b1483-BFrB_wfF.js} +1 -1
- package/dist/dashboard/public/assets/{timeline-definition-faaaa080-YPoIuE--.js → timeline-definition-faaaa080-BSFjNcUT.js} +1 -1
- package/dist/dashboard/public/assets/{xychartDiagram-f5964ef8-BnI4pVWV.js → xychartDiagram-f5964ef8-Dr-pXGBx.js} +1 -1
- package/dist/dashboard/public/index.html +2 -2
- package/package.json +1 -1
- package/dist/dashboard/public/assets/channel-kGGkJUti.js +0 -1
- package/dist/dashboard/public/assets/clone-CHdfA33T.js +0 -1
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-DRD7GAtr.js +0 -1
- 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
|
-
###
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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(
|
|
32
|
-
expect(entry?.workflowRootPath).toBe(workflowRootPath);
|
|
33
|
-
expect(entry?.projectName).toBe('my-repo
|
|
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
|
|
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).
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
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;
|
|
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(
|
|
171
|
-
return generateProjectId(
|
|
172
|
+
if (!this.isUnderProjectRoot(workflowRootPath)) {
|
|
173
|
+
return generateProjectId(workflowRootPath);
|
|
172
174
|
}
|
|
173
175
|
const registry = await this.readRegistry();
|
|
174
|
-
const
|
|
175
|
-
const
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
215
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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(
|
|
41
|
+
projectId = generateProjectId(workflowRootPath);
|
|
42
42
|
realFetch = globalThis.fetch;
|
|
43
43
|
const registry = new ProjectRegistry();
|
|
44
44
|
await registry.registerProject(workspacePath, process.pid, { workflowRootPath });
|