@mrpatronz/nexusflow 2.8.0 → 2.9.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 (167) hide show
  1. package/README.md +15 -12
  2. package/dist/agent/orchestrator.d.ts.map +1 -1
  3. package/dist/agent/orchestrator.js +8 -0
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/commands/commands.test.js +3 -0
  6. package/dist/commands/commands.test.js.map +1 -1
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/doctor.js +2 -0
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/init.d.ts +3 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +9 -1
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/knowledge.d.ts +9 -0
  15. package/dist/commands/knowledge.d.ts.map +1 -1
  16. package/dist/commands/knowledge.js +59 -2
  17. package/dist/commands/knowledge.js.map +1 -1
  18. package/dist/commands/knowledge.test.js +14 -1
  19. package/dist/commands/knowledge.test.js.map +1 -1
  20. package/dist/commands/progress.d.ts +4 -0
  21. package/dist/commands/progress.d.ts.map +1 -0
  22. package/dist/commands/progress.js +33 -0
  23. package/dist/commands/progress.js.map +1 -0
  24. package/dist/commands/refresh.d.ts +1 -0
  25. package/dist/commands/refresh.d.ts.map +1 -1
  26. package/dist/commands/refresh.js +17 -2
  27. package/dist/commands/refresh.js.map +1 -1
  28. package/dist/commands/remote.d.ts +4 -0
  29. package/dist/commands/remote.d.ts.map +1 -0
  30. package/dist/commands/remote.js +28 -0
  31. package/dist/commands/remote.js.map +1 -0
  32. package/dist/commands/status.d.ts.map +1 -1
  33. package/dist/commands/status.js +14 -1
  34. package/dist/commands/status.js.map +1 -1
  35. package/dist/commands/status.test.d.ts +2 -0
  36. package/dist/commands/status.test.d.ts.map +1 -0
  37. package/dist/commands/status.test.js +31 -0
  38. package/dist/commands/status.test.js.map +1 -0
  39. package/dist/core/analysis-cache.d.ts +13 -3
  40. package/dist/core/analysis-cache.d.ts.map +1 -1
  41. package/dist/core/analysis-cache.js +41 -31
  42. package/dist/core/analysis-cache.js.map +1 -1
  43. package/dist/core/analysis-cache.test.js +50 -8
  44. package/dist/core/analysis-cache.test.js.map +1 -1
  45. package/dist/core/doctor.d.ts.map +1 -1
  46. package/dist/core/doctor.js +61 -0
  47. package/dist/core/doctor.js.map +1 -1
  48. package/dist/core/generation-lock.d.ts +58 -0
  49. package/dist/core/generation-lock.d.ts.map +1 -0
  50. package/dist/core/generation-lock.js +233 -0
  51. package/dist/core/generation-lock.js.map +1 -0
  52. package/dist/core/generation-lock.test.d.ts +2 -0
  53. package/dist/core/generation-lock.test.d.ts.map +1 -0
  54. package/dist/core/generation-lock.test.js +134 -0
  55. package/dist/core/generation-lock.test.js.map +1 -0
  56. package/dist/core/isolate.test.js +30 -0
  57. package/dist/core/isolate.test.js.map +1 -1
  58. package/dist/core/knowledge.d.ts +20 -0
  59. package/dist/core/knowledge.d.ts.map +1 -1
  60. package/dist/core/knowledge.js +184 -36
  61. package/dist/core/knowledge.js.map +1 -1
  62. package/dist/core/knowledge.test.js +93 -15
  63. package/dist/core/knowledge.test.js.map +1 -1
  64. package/dist/core/progress.d.ts +21 -0
  65. package/dist/core/progress.d.ts.map +1 -0
  66. package/dist/core/progress.js +40 -0
  67. package/dist/core/progress.js.map +1 -0
  68. package/dist/core/progress.test.d.ts +2 -0
  69. package/dist/core/progress.test.d.ts.map +1 -0
  70. package/dist/core/progress.test.js +52 -0
  71. package/dist/core/progress.test.js.map +1 -0
  72. package/dist/core/refresh.d.ts +5 -0
  73. package/dist/core/refresh.d.ts.map +1 -1
  74. package/dist/core/refresh.js +25 -0
  75. package/dist/core/refresh.js.map +1 -1
  76. package/dist/core/refresh.test.js +20 -0
  77. package/dist/core/refresh.test.js.map +1 -1
  78. package/dist/core/status.d.ts +2 -0
  79. package/dist/core/status.d.ts.map +1 -1
  80. package/dist/core/status.js +6 -1
  81. package/dist/core/status.js.map +1 -1
  82. package/dist/core/sync.d.ts.map +1 -1
  83. package/dist/core/sync.js +22 -1
  84. package/dist/core/sync.js.map +1 -1
  85. package/dist/core/sync.test.js +27 -0
  86. package/dist/core/sync.test.js.map +1 -1
  87. package/dist/core/workspace-git.d.ts +15 -0
  88. package/dist/core/workspace-git.d.ts.map +1 -0
  89. package/dist/core/workspace-git.js +131 -0
  90. package/dist/core/workspace-git.js.map +1 -0
  91. package/dist/core/workspace-git.test.d.ts +2 -0
  92. package/dist/core/workspace-git.test.d.ts.map +1 -0
  93. package/dist/core/workspace-git.test.js +52 -0
  94. package/dist/core/workspace-git.test.js.map +1 -0
  95. package/dist/core/workspace-skills-workflow.integration.test.js +15 -0
  96. package/dist/core/workspace-skills-workflow.integration.test.js.map +1 -1
  97. package/dist/core/workspace.create.test.js +5 -2
  98. package/dist/core/workspace.create.test.js.map +1 -1
  99. package/dist/core/workspace.d.ts.map +1 -1
  100. package/dist/core/workspace.js +11 -6
  101. package/dist/core/workspace.js.map +1 -1
  102. package/dist/generators/antigravity.d.ts.map +1 -1
  103. package/dist/generators/antigravity.js +2 -1
  104. package/dist/generators/antigravity.js.map +1 -1
  105. package/dist/generators/base.d.ts.map +1 -1
  106. package/dist/generators/base.js +5 -3
  107. package/dist/generators/base.js.map +1 -1
  108. package/dist/generators/claude.d.ts.map +1 -1
  109. package/dist/generators/claude.js +4 -1
  110. package/dist/generators/claude.js.map +1 -1
  111. package/dist/generators/codex.d.ts.map +1 -1
  112. package/dist/generators/codex.js +2 -1
  113. package/dist/generators/codex.js.map +1 -1
  114. package/dist/generators/copilot.d.ts.map +1 -1
  115. package/dist/generators/copilot.js +4 -3
  116. package/dist/generators/copilot.js.map +1 -1
  117. package/dist/generators/cursor.d.ts.map +1 -1
  118. package/dist/generators/cursor.js +6 -3
  119. package/dist/generators/cursor.js.map +1 -1
  120. package/dist/generators/index.d.ts +2 -0
  121. package/dist/generators/index.d.ts.map +1 -1
  122. package/dist/generators/index.js +79 -45
  123. package/dist/generators/index.js.map +1 -1
  124. package/dist/generators/knowledge-migration.test.d.ts +2 -0
  125. package/dist/generators/knowledge-migration.test.d.ts.map +1 -0
  126. package/dist/generators/knowledge-migration.test.js +22 -0
  127. package/dist/generators/knowledge-migration.test.js.map +1 -0
  128. package/dist/generators/plan-generator.d.ts.map +1 -1
  129. package/dist/generators/plan-generator.js +18 -9
  130. package/dist/generators/plan-generator.js.map +1 -1
  131. package/dist/generators/plan-generator.test.js +4 -1
  132. package/dist/generators/plan-generator.test.js.map +1 -1
  133. package/dist/gui/assets/{AgentsPage-Bfyu13gc.js → AgentsPage-B4fx43rd.js} +1 -1
  134. package/dist/gui/assets/{DashboardPage-O5wj99kn.js → DashboardPage-DH52G8IG.js} +1 -1
  135. package/dist/gui/assets/{GettingStartedPage-DDWBueC7.js → GettingStartedPage-BlTrQhvi.js} +1 -1
  136. package/dist/gui/assets/{ProjectsPage-NHkXrDM2.js → ProjectsPage-BPVSLPXv.js} +1 -1
  137. package/dist/gui/assets/{ScaffoldRepoInline-Cmqg_s94.js → ScaffoldRepoInline-ywcpq9PX.js} +1 -1
  138. package/dist/gui/assets/{SettingsPage-Cc77HBp7.js → SettingsPage-RQr8SalV.js} +1 -1
  139. package/dist/gui/assets/{SkillsPage-D4CVxwrI.js → SkillsPage-CYoSRrwx.js} +1 -1
  140. package/dist/gui/assets/StartWorkPage-DBKK4lFi.js +1 -0
  141. package/dist/gui/assets/{StrategiesPage-Dn66xfZN.js → StrategiesPage-C36TZgDX.js} +1 -1
  142. package/dist/gui/assets/{WorkspacesPage-BgdoM5Hs.js → WorkspacesPage-DxEONvSq.js} +1 -1
  143. package/dist/gui/assets/{alert-dialog-BYZ7cgWA.js → alert-dialog-CQAX2yRx.js} +1 -1
  144. package/dist/gui/assets/index-BF6pre6G.css +2 -0
  145. package/dist/gui/assets/{index-CoNaATPd.js → index-C_rwnBzF.js} +2 -2
  146. package/dist/gui/assets/{vsc-BTST_4ex.js → vsc-DFh0-53h.js} +1 -1
  147. package/dist/gui/index.html +2 -2
  148. package/dist/index.js +48 -4
  149. package/dist/index.js.map +1 -1
  150. package/dist/mcp/tools.d.ts.map +1 -1
  151. package/dist/mcp/tools.js +19 -8
  152. package/dist/mcp/tools.js.map +1 -1
  153. package/dist/mcp/tools.test.js +15 -0
  154. package/dist/mcp/tools.test.js.map +1 -1
  155. package/dist/resources/materializer.d.ts.map +1 -1
  156. package/dist/resources/materializer.js +11 -3
  157. package/dist/resources/materializer.js.map +1 -1
  158. package/dist/server.d.ts.map +1 -1
  159. package/dist/server.js +22 -3
  160. package/dist/server.js.map +1 -1
  161. package/dist/server.test.js +25 -0
  162. package/dist/server.test.js.map +1 -1
  163. package/dist/types.d.ts +17 -0
  164. package/dist/types.d.ts.map +1 -1
  165. package/package.json +1 -1
  166. package/dist/gui/assets/StartWorkPage-RPZTN3Ui.js +0 -1
  167. package/dist/gui/assets/index-BmH7a-Qy.css +0 -2
@@ -3,9 +3,21 @@ import { insertUnderHeading, formatEntry, parseKnowledgeEntries, addWorkspaceKno
3
3
  import * as storage from './storage.js';
4
4
  import * as workspace from './workspace.js';
5
5
  import * as generators from '../generators/index.js';
6
+ import * as fs from 'node:fs/promises';
7
+ import * as workspaceGit from './workspace-git.js';
8
+ import * as locks from './locks.js';
6
9
  vi.mock('./storage.js');
7
10
  vi.mock('./workspace.js');
8
11
  vi.mock('../generators/index.js');
12
+ vi.mock('./workspace-git.js');
13
+ vi.mock('./locks.js');
14
+ vi.mock('node:fs/promises', async (importOriginal) => {
15
+ const actual = await importOriginal();
16
+ return { ...actual, access: vi.fn() };
17
+ });
18
+ function missingGitRepository() {
19
+ return Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
20
+ }
9
21
  // ─── Pure helpers ───────────────────────────────────────────────────────────
10
22
  describe('insertUnderHeading', () => {
11
23
  it('inserts under an existing heading and strips the placeholder', () => {
@@ -52,34 +64,35 @@ describe('formatEntry', () => {
52
64
  const ts = '2026-07-04T10:00:00.000Z';
53
65
  it('formats a decision with a title as a dated ### block', () => {
54
66
  const out = formatEntry({ type: 'decision', message: 'use worktrees', title: 'Worktrees', timestamp: ts }, 'workspace');
55
- expect(out).toBe('### 2026-07-04 — Worktrees\n**Decision:** use worktrees');
67
+ expect(out).toBe('### 2026-07-04 — worktrees\n**Decision:** use worktrees');
56
68
  });
57
69
  it('leads a gotcha with its title so the file stays skimmable', () => {
58
70
  // The file only grows, so a reader must be able to judge relevance from the
59
71
  // first few words instead of reading every entry.
60
72
  const out = formatEntry({ type: 'gotcha', title: 'EBUSY on Windows', message: 'fs.rm needs maxRetries', timestamp: ts }, 'workspace');
61
- expect(out).toBe('- **EBUSY on Windows** (2026-07-04) — fs.rm needs maxRetries');
73
+ expect(out).toBe('### 2026-07-04 — ebusy-on-windows\n**Gotcha:** fs.rm needs maxRetries');
62
74
  });
63
- it('leads with the date when a gotcha has no title, rather than repeating it', () => {
64
- // Deriving the label from the message printed its opening twice — once bold,
65
- // once in the body — in the one file this project is trying to keep small.
66
- const out = formatEntry({ type: 'gotcha', message: 'EBUSY on Windows', timestamp: ts }, 'workspace');
67
- expect(out).toBe('- **2026-07-04:** EBUSY on Windows');
75
+ it('rejects a missing title instead of deriving and truncating a heading', () => {
76
+ expect(() => formatEntry({ type: 'gotcha', message: 'EBUSY on Windows', timestamp: ts }, 'workspace'))
77
+ .toThrow(/title is required/);
68
78
  });
69
- it('formats progress as a checked item', () => {
70
- const out = formatEntry({ type: 'progress', message: 'shipped rollback', timestamp: ts }, 'workspace');
71
- expect(out).toBe('- [x] 2026-07-04 — shipped rollback');
79
+ it('does not format legacy progress without a searchable title', () => {
80
+ expect(() => formatEntry({ type: 'progress', message: 'shipped rollback', timestamp: ts }, 'workspace'))
81
+ .toThrow(/title is required/);
72
82
  });
73
83
  });
74
84
  describe('entry length cap', () => {
75
85
  beforeEach(() => {
76
86
  vi.clearAllMocks();
77
- vi.mocked(workspace.loadFeatureConfig).mockResolvedValue({ id: 'feat' });
87
+ vi.mocked(workspace.loadFeatureConfig).mockResolvedValue({ id: 'feat', repos: ['/repos/repo-a'] });
78
88
  vi.mocked(storage.workspaceFileExists).mockResolvedValue(false);
79
89
  vi.mocked(storage.baseFileExists).mockResolvedValue(false);
80
90
  vi.mocked(storage.writeWorkspaceFile).mockResolvedValue(undefined);
81
91
  vi.mocked(storage.writeBaseFile).mockResolvedValue(undefined);
82
92
  vi.mocked(generators.buildBaseKnowledgeContent).mockReturnValue('# Base\n');
93
+ vi.mocked(workspaceGit.commitExactWorkspaceArtifacts).mockResolvedValue({ committed: false });
94
+ vi.mocked(locks.acquireLock).mockResolvedValue(vi.fn().mockResolvedValue(undefined));
95
+ vi.mocked(fs.access).mockRejectedValue(missingGitRepository());
83
96
  });
84
97
  const tooLong = 'x'.repeat(MAX_ENTRY_CHARS + 1);
85
98
  // Enforced in core precisely because the MCP tool and the HTTP endpoint call
@@ -96,7 +109,7 @@ describe('entry length cap', () => {
96
109
  await expect(addWorkspaceKnowledge('/ws', { type: 'decision', message: tooLong })).rejects.toThrow(/separate entries/);
97
110
  });
98
111
  it('accepts an entry at the limit', async () => {
99
- await expect(addWorkspaceKnowledge('/ws', { type: 'decision', message: 'x'.repeat(MAX_ENTRY_CHARS) })).resolves.toBeTruthy();
112
+ await expect(addWorkspaceKnowledge('/ws', { type: 'decision', title: 'At limit', message: 'x'.repeat(MAX_ENTRY_CHARS) })).resolves.toBeTruthy();
100
113
  });
101
114
  it('stores the same collapsed string it measured', async () => {
102
115
  // Validating the trimmed form and storing the raw one let embedded newlines
@@ -108,12 +121,34 @@ describe('entry length cap', () => {
108
121
  timestamp: '2026-07-04T10:00:00.000Z',
109
122
  });
110
123
  const written = vi.mocked(storage.writeWorkspaceFile).mock.calls[0][3];
111
- expect(written).toContain('- **Spacing** (2026-07-04) — keep it on one line');
124
+ expect(written).toContain('### 2026-07-04 — spacing\n**Gotcha:** keep it on one line');
112
125
  expect(written).not.toMatch(/keep {2,}it/);
113
126
  });
114
127
  it('still rejects an empty message', async () => {
115
128
  await expect(addWorkspaceKnowledge('/ws', { type: 'decision', message: ' ' })).rejects.toThrow(/cannot be empty/);
116
129
  });
130
+ it('requires a title and rejects rather than truncating long titles', async () => {
131
+ await expect(addWorkspaceKnowledge('/ws', { type: 'gotcha', message: 'rule' }))
132
+ .rejects.toThrow(/title is required/);
133
+ await expect(addWorkspaceKnowledge('/ws', { type: 'gotcha', title: 'x'.repeat(61), message: 'rule' }))
134
+ .rejects.toThrow(/rejected rather than truncated/);
135
+ });
136
+ it('rejects authored progress and invalid scope traversal', async () => {
137
+ await expect(addWorkspaceKnowledge('/ws', { type: 'progress', title: 'Done', message: 'done' }))
138
+ .rejects.toThrow(/derived from live git state/);
139
+ await expect(addWorkspaceKnowledge('/ws', { type: 'gotcha', title: 'Scope', scope: 'path:../secret', message: 'rule' }))
140
+ .rejects.toThrow(/parent traversal/);
141
+ });
142
+ it('renders scope and evidence as searchable metadata', async () => {
143
+ await addWorkspaceKnowledge('/ws', {
144
+ type: 'gotcha', title: 'BFF error encoding', scope: 'seam:bff-spa', evidence: 'commit abc123', message: 'Decode once.',
145
+ timestamp: '2026-08-25T00:00:00.000Z',
146
+ });
147
+ const written = vi.mocked(storage.writeWorkspaceFile).mock.calls.at(-1)[3];
148
+ expect(written).toContain('### 2026-08-25 — bff-error-encoding');
149
+ expect(written).toContain('**Scope:** `seam:bff-spa`');
150
+ expect(written).toContain('**Evidence:** commit abc123');
151
+ });
117
152
  });
118
153
  describe('parseKnowledgeEntries', () => {
119
154
  it('parses bullet entries and decision blocks with their types', () => {
@@ -151,7 +186,10 @@ describe('knowledge I/O', () => {
151
186
  vi.clearAllMocks();
152
187
  ws.clear();
153
188
  base.clear();
154
- vi.mocked(workspace.loadFeatureConfig).mockResolvedValue({ id: 'feat' });
189
+ vi.mocked(workspaceGit.commitExactWorkspaceArtifacts).mockResolvedValue({ committed: false });
190
+ vi.mocked(locks.acquireLock).mockResolvedValue(vi.fn().mockResolvedValue(undefined));
191
+ vi.mocked(fs.access).mockRejectedValue(missingGitRepository());
192
+ vi.mocked(workspace.loadFeatureConfig).mockResolvedValue({ id: 'feat', repos: ['/repos/api'] });
155
193
  vi.mocked(generators.buildBaseKnowledgeContent).mockImplementation((repo) => `# Base Codebase Knowledge — ${repo}\n\n## Discovered Gotchas & Watch-outs\n- None recorded yet.\n\n## Architecture Decisions\n- None recorded yet.\n`);
156
194
  vi.mocked(storage.workspaceFileExists).mockImplementation(async (_w, fid, fn) => ws.has(`${fid}/${fn}`));
157
195
  vi.mocked(storage.readWorkspaceFile).mockImplementation(async (_w, fid, fn) => ws.get(`${fid}/${fn}`));
@@ -177,16 +215,56 @@ describe('knowledge I/O', () => {
177
215
  expect(content).toContain('## Architecture Decisions');
178
216
  expect(content).toContain('**Decision:** store knowledge via the adapter');
179
217
  });
218
+ it('treats an identical retry as success without appending a duplicate', async () => {
219
+ const entry = {
220
+ type: 'decision',
221
+ message: 'store knowledge once',
222
+ title: 'Idempotent remember',
223
+ timestamp: '2026-08-26T00:00:00.000Z',
224
+ };
225
+ await addWorkspaceKnowledge('/wsp', entry);
226
+ const retry = await addWorkspaceKnowledge('/wsp', entry);
227
+ expect(retry.duplicate).toBe(true);
228
+ expect(ws.get('feat/nexusflow-knowledge.md').match(/### 2026-08-26 — idempotent-remember/g)).toHaveLength(1);
229
+ });
230
+ it('rejects a same-day title collision with different content', async () => {
231
+ await addWorkspaceKnowledge('/wsp', {
232
+ type: 'decision', title: 'Stable identity', message: 'first rule', timestamp: '2026-08-26T00:00:00.000Z',
233
+ });
234
+ await expect(addWorkspaceKnowledge('/wsp', {
235
+ type: 'decision', title: 'Stable identity', message: 'different rule', timestamp: '2026-08-26T01:00:00.000Z',
236
+ })).rejects.toThrow(/already exists with different content/);
237
+ });
238
+ it('reports a Git commit failure without failing the completed knowledge write', async () => {
239
+ vi.mocked(fs.access).mockResolvedValue(undefined);
240
+ vi.mocked(workspaceGit.commitExactWorkspaceArtifacts).mockRejectedValue(new Error('index locked'));
241
+ const result = await addWorkspaceKnowledge('/wsp', {
242
+ type: 'gotcha', title: 'Commit recovery', message: 'Keep the durable adapter write.',
243
+ timestamp: '2026-08-26T00:00:00.000Z',
244
+ });
245
+ expect(result.commit).toEqual({ status: 'failed', message: 'index locked' });
246
+ expect(ws.get('feat/nexusflow-knowledge.md')).toContain('Keep the durable adapter write.');
247
+ });
180
248
  it('rejects an empty message', async () => {
181
249
  await expect(addWorkspaceKnowledge('/wsp', { type: 'gotcha', message: ' ' })).rejects.toThrow(/cannot be empty/i);
182
250
  });
183
251
  it('adds to a repo base file, bootstrapping it from the template', async () => {
184
- const result = await addBaseKnowledge('/wsp', 'api', { type: 'gotcha', message: 'flaky test on CI' });
252
+ const result = await addBaseKnowledge('/wsp', 'api', { type: 'gotcha', title: 'Flaky CI test', message: 'flaky test on CI' });
185
253
  expect(result.createdFile).toBe(true);
186
254
  const content = base.get('api/nexusflow-knowledge.md');
187
255
  expect(content).toContain('## Discovered Gotchas & Watch-outs');
188
256
  expect(content).toContain('flaky test on CI');
189
257
  });
258
+ it('rejects traversal and unknown repo names before touching base storage', async () => {
259
+ await expect(addBaseKnowledge('/wsp', '../outside', {
260
+ type: 'gotcha', title: 'Traversal', message: 'must stay contained',
261
+ })).rejects.toThrow(/Invalid repository name/);
262
+ await expect(addBaseKnowledge('/wsp', 'unknown', {
263
+ type: 'gotcha', title: 'Unknown', message: 'must be configured',
264
+ })).rejects.toThrow(/not in this workspace/);
265
+ expect(storage.baseFileExists).not.toHaveBeenCalled();
266
+ expect(storage.writeBaseFile).not.toHaveBeenCalled();
267
+ });
190
268
  it('promotes a gotcha to base knowledge (copy leaves the workspace entry)', async () => {
191
269
  ws.set('feat/nexusflow-knowledge.md', `# Workspace Knowledge — feat\n\n## Known Gotchas\n\n- **2026-07-04:** shared learning\n`);
192
270
  const entries = parseKnowledgeEntries((await readWorkspaceKnowledge('/wsp')));
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.test.js","sourceRoot":"","sources":["../../src/core/knowledge.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge.test.js","sourceRoot":"","sources":["../../src/core/knowledge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Live implementation progress derived from git and an optional GitHub CLI. */
2
+ export type PullRequestState = 'open' | 'merged' | 'closed';
3
+ export interface RepoProgress {
4
+ name: string;
5
+ branch: string | null;
6
+ expectedBranch: string;
7
+ branchExists: boolean;
8
+ onExpectedBranch: boolean;
9
+ clean: boolean;
10
+ pushed?: boolean;
11
+ pullRequest?: {
12
+ state: PullRequestState;
13
+ url?: string;
14
+ };
15
+ }
16
+ export interface WorkspaceProgress {
17
+ workspacePath: string;
18
+ repos: RepoProgress[];
19
+ }
20
+ export declare function getWorkspaceProgress(workspacePath: string): Promise<WorkspaceProgress>;
21
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/core/progress.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAOhF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2C5F"}
@@ -0,0 +1,40 @@
1
+ /** Live implementation progress derived from git and an optional GitHub CLI. */
2
+ import { execa } from 'execa';
3
+ import { getWorkspaceStatusReport } from './status.js';
4
+ import { detectGh, parseRemoteUrl } from '../utils/pr.js';
5
+ export async function getWorkspaceProgress(workspacePath) {
6
+ const status = await getWorkspaceStatusReport(workspacePath);
7
+ const gh = await detectGh();
8
+ const repos = await Promise.all(status.repos.map(async (repo) => {
9
+ const branchExists = repo.onExpectedBranch || (repo.expectedBranch !== 'HEAD' && await execa('git', ['show-ref', '--verify', '--quiet', `refs/heads/${repo.expectedBranch}`], { cwd: repo.path, reject: false }).then((result) => result.exitCode === 0).catch(() => false));
10
+ const progress = {
11
+ name: repo.name,
12
+ branch: repo.branch,
13
+ expectedBranch: repo.expectedBranch,
14
+ branchExists,
15
+ onExpectedBranch: repo.onExpectedBranch,
16
+ clean: !repo.dirty,
17
+ };
18
+ if (repo.onExpectedBranch && repo.remoteUrl && repo.ahead !== null)
19
+ progress.pushed = repo.ahead === 0;
20
+ const remote = repo.remoteUrl ? parseRemoteUrl(repo.remoteUrl) : null;
21
+ if (repo.onExpectedBranch && gh.authenticated && remote?.kind === 'github' && repo.branch) {
22
+ try {
23
+ const result = await execa('gh', ['pr', 'view', repo.branch, '--json', 'state,url'], { cwd: repo.path, reject: false });
24
+ if (result.exitCode === 0) {
25
+ const parsed = JSON.parse(result.stdout);
26
+ const state = parsed.state?.toLowerCase();
27
+ if (state === 'open' || state === 'merged' || state === 'closed') {
28
+ progress.pullRequest = { state, url: parsed.url };
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ // PR state is optional. Omit it rather than presenting an unchecked lie.
34
+ }
35
+ }
36
+ return progress;
37
+ }));
38
+ return { workspacePath, repos };
39
+ }
40
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/core/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=progress.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.test.d.ts","sourceRoot":"","sources":["../../src/core/progress.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { execa } from 'execa';
3
+ import { getWorkspaceProgress } from './progress.js';
4
+ import * as status from './status.js';
5
+ import * as pr from '../utils/pr.js';
6
+ vi.mock('./status.js');
7
+ vi.mock('../utils/pr.js');
8
+ vi.mock('execa');
9
+ describe('live workspace progress', () => {
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ vi.mocked(status.getWorkspaceStatusReport).mockResolvedValue({
13
+ workspacePath: '/ws', branchName: 'feat', allClean: true, allPushed: true,
14
+ repos: [{
15
+ name: 'api', path: '/ws/api', branch: 'feat', headSha: 'abc', expectedBranch: 'feat', onExpectedBranch: true,
16
+ dirty: false, changedFiles: [], ahead: 0, behind: 0, remoteUrl: 'https://github.com/acme/api.git', defaultBranch: 'main',
17
+ }],
18
+ });
19
+ vi.mocked(execa).mockResolvedValue({ exitCode: 0, stdout: '' });
20
+ });
21
+ it('derives branch, clean, and pushed state without inventing unavailable PR state', async () => {
22
+ vi.mocked(pr.detectGh).mockResolvedValue({ installed: false, authenticated: false });
23
+ const report = await getWorkspaceProgress('/ws');
24
+ expect(report.repos[0]).toMatchObject({ branchExists: true, onExpectedBranch: true, clean: true, pushed: true });
25
+ expect(report.repos[0]?.pullRequest).toBeUndefined();
26
+ });
27
+ it('includes PR state only when the authenticated forge adapter returns it', async () => {
28
+ vi.mocked(pr.detectGh).mockResolvedValue({ installed: true, authenticated: true });
29
+ vi.mocked(pr.parseRemoteUrl).mockReturnValue({ host: 'github.com', owner: 'acme', repo: 'api', kind: 'github' });
30
+ vi.mocked(execa).mockResolvedValue({ exitCode: 0, stdout: '{"state":"MERGED","url":"https://example.test/pr/1"}' });
31
+ const report = await getWorkspaceProgress('/ws');
32
+ expect(report.repos[0]?.pullRequest).toEqual({ state: 'merged', url: 'https://example.test/pr/1' });
33
+ });
34
+ it('does not claim pushed or PR progress while checked out on the wrong branch', async () => {
35
+ vi.mocked(status.getWorkspaceStatusReport).mockResolvedValue({
36
+ workspacePath: '/ws', branchName: 'feat', allClean: true, allPushed: false,
37
+ repos: [{
38
+ name: 'api', path: '/ws/api', branch: 'main', headSha: 'abc', expectedBranch: 'feat', onExpectedBranch: false,
39
+ dirty: false, changedFiles: [], ahead: 0, behind: 0, remoteUrl: 'https://github.com/acme/api.git', defaultBranch: 'main',
40
+ }],
41
+ });
42
+ vi.mocked(pr.detectGh).mockResolvedValue({ installed: true, authenticated: true });
43
+ vi.mocked(pr.parseRemoteUrl).mockReturnValue({ host: 'github.com', owner: 'acme', repo: 'api', kind: 'github' });
44
+ vi.mocked(execa).mockResolvedValue({ exitCode: 1, stdout: '' });
45
+ const report = await getWorkspaceProgress('/ws');
46
+ expect(report.repos[0]).toMatchObject({ branchExists: false, onExpectedBranch: false });
47
+ expect(report.repos[0]?.pushed).toBeUndefined();
48
+ expect(report.repos[0]?.pullRequest).toBeUndefined();
49
+ expect(execa).not.toHaveBeenCalledWith('gh', expect.anything(), expect.anything());
50
+ });
51
+ });
52
+ //# sourceMappingURL=progress.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.test.js","sourceRoot":"","sources":["../../src/core/progress.test.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,13 @@
7
7
  * Every generated file describes the whole workspace, so a refresh is all or
8
8
  * nothing; there is no per-repo or base-only subset to ask for.
9
9
  */
10
+ import { type GenerationCheck } from './generation-lock.js';
10
11
  /** Options for a headless refresh run. */
11
12
  export interface RefreshOptions {
12
13
  /** Ignore the analysis cache and re-analyze every repo. */
13
14
  force?: boolean;
15
+ /** Check provenance/output hashes without regenerating; stale docs receive a bounded warning banner. */
16
+ check?: boolean;
14
17
  }
15
18
  /** Outcome of a headless refresh run. */
16
19
  export interface RefreshReport {
@@ -22,6 +25,8 @@ export interface RefreshReport {
22
25
  reusedRepos: string[];
23
26
  /** Whether the handoff bundle was refreshed too. */
24
27
  refreshedHandoff: boolean;
28
+ /** Present for --check runs. */
29
+ check?: GenerationCheck;
25
30
  }
26
31
  /**
27
32
  * Refreshes a workspace's context files and plan. Throws if the workspace
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA4ExB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGjF,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wGAAwG;IACxG,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gCAAgC;IAChC,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAWxB"}
@@ -13,6 +13,8 @@ import { loadFeatureConfig, resolveRepoInfos } from './workspace.js';
13
13
  import { resolveFeatureRepoPath } from '../utils/feature.js';
14
14
  import { analyzeAllReposCached } from '../analyzers/index.js';
15
15
  import { generateContextFiles } from '../generators/index.js';
16
+ import { checkGenerationLock } from './generation-lock.js';
17
+ import { acquireLock } from './locks.js';
16
18
  /**
17
19
  * Refreshes a workspace's context files and plan. Throws if the workspace
18
20
  * configuration cannot be loaded.
@@ -27,10 +29,33 @@ import { generateContextFiles } from '../generators/index.js';
27
29
  * @returns A report of what was analyzed vs reused.
28
30
  */
29
31
  export async function refreshWorkspace(workspacePath, options = {}) {
32
+ const release = await acquireLock(path.join(workspacePath, '.nexusflow', 'generation.lock'), {
33
+ staleMs: 5 * 60_000,
34
+ timeoutMs: 30_000,
35
+ timeoutMessage: 'Another NexusFlow generation or refresh is already updating this workspace.',
36
+ });
37
+ try {
38
+ return await refreshWorkspaceUnlocked(workspacePath, options);
39
+ }
40
+ finally {
41
+ await release();
42
+ }
43
+ }
44
+ async function refreshWorkspaceUnlocked(workspacePath, options) {
30
45
  const feature = await loadFeatureConfig(workspacePath);
31
46
  if (!feature) {
32
47
  throw new Error(`Failed to load workspace configuration. Ensure nexusflow.json exists at ${workspacePath}.`);
33
48
  }
49
+ if (options.check) {
50
+ const check = await checkGenerationLock(workspacePath, { markDocuments: true });
51
+ return {
52
+ workspacePath,
53
+ analyzedRepos: [],
54
+ reusedRepos: [],
55
+ refreshedHandoff: false,
56
+ check,
57
+ };
58
+ }
34
59
  const resolvedPaths = feature.repos.map((r) => resolveFeatureRepoPath(feature, workspacePath, r));
35
60
  const allRepos = await resolveRepoInfos(resolvedPaths);
36
61
  const { analysis, analyzed, reused } = await analyzeAllReposCached(allRepos, workspacePath, { force: options.force });
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,15 @@ import * as workspace from './workspace.js';
5
5
  import * as analyzers from '../analyzers/index.js';
6
6
  import * as generators from '../generators/index.js';
7
7
  import * as handoff from '../commands/handoff.js';
8
+ import * as generationLock from './generation-lock.js';
9
+ import * as locks from './locks.js';
8
10
  vi.mock('node:fs/promises');
9
11
  vi.mock('./workspace.js');
10
12
  vi.mock('../analyzers/index.js');
11
13
  vi.mock('../generators/index.js');
12
14
  vi.mock('../commands/handoff.js');
15
+ vi.mock('./generation-lock.js');
16
+ vi.mock('./locks.js');
13
17
  const feature = {
14
18
  id: 'feat',
15
19
  branchName: 'feat',
@@ -30,6 +34,8 @@ describe('refreshWorkspace', () => {
30
34
  vi.mocked(analyzers.analyzeAllReposCached).mockResolvedValue({ analysis: new Map(), analyzed: ['a'], reused: ['b'] });
31
35
  vi.mocked(generators.generateContextFiles).mockResolvedValue(undefined);
32
36
  vi.mocked(handoff.handoffCommand).mockResolvedValue(undefined);
37
+ vi.mocked(generationLock.checkGenerationLock).mockResolvedValue({ fresh: true, lock: null, drift: [] });
38
+ vi.mocked(locks.acquireLock).mockResolvedValue(vi.fn().mockResolvedValue(undefined));
33
39
  // No handoff bundle by default.
34
40
  vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
35
41
  });
@@ -54,6 +60,20 @@ describe('refreshWorkspace', () => {
54
60
  await refreshWorkspace('/ws', { force: true });
55
61
  expect(analyzers.analyzeAllReposCached).toHaveBeenCalledWith(expect.any(Array), '/ws', { force: true });
56
62
  });
63
+ it('serializes refresh and generated-file mutation with a workspace lock', async () => {
64
+ const release = vi.fn().mockResolvedValue(undefined);
65
+ vi.mocked(locks.acquireLock).mockResolvedValue(release);
66
+ await refreshWorkspace('/ws');
67
+ expect(locks.acquireLock).toHaveBeenCalledWith(expect.stringMatching(/[\\/]\.nexusflow[\\/]generation\.lock$/), expect.objectContaining({ timeoutMs: 30_000 }));
68
+ expect(release).toHaveBeenCalledOnce();
69
+ });
70
+ it('checks provenance without analyzing or regenerating', async () => {
71
+ const report = await refreshWorkspace('/ws', { check: true });
72
+ expect(report.check?.fresh).toBe(true);
73
+ expect(generationLock.checkGenerationLock).toHaveBeenCalledWith('/ws', { markDocuments: true });
74
+ expect(analyzers.analyzeAllReposCached).not.toHaveBeenCalled();
75
+ expect(generators.generateContextFiles).not.toHaveBeenCalled();
76
+ });
57
77
  it('refreshes the handoff bundle when it exists', async () => {
58
78
  vi.mocked(fs.access).mockResolvedValue(undefined); // handoff file exists
59
79
  const report = await refreshWorkspace('/ws');
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../src/core/refresh.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../src/core/refresh.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAC5B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC1B,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACjC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAChC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAEtB,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,MAAM;IACV,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,aAAa,EAAE,KAAK;IACpB,SAAS,EAAE,sBAAsB;CAC3B,CAAC;AAET,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,iBAAiB,CAAC;YACtD,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE;YACnD,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE;SACpD,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAS,CAAC,CAAC;QAC7H,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACxE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/D,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACxG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QACrF,gCAAgC;QAChC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,4EAA4E;QAC5E,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,gBAAgB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAC1D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACrD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAExD,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,cAAc,CAAC,wCAAwC,CAAC,EAC/D,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAC/C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChG,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB;QAEzE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,iEAAiE;QACjE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EACjB,KAAK,CACN,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -11,6 +11,8 @@ export interface RepoStatusReport {
11
11
  path: string;
12
12
  /** Current branch, or `null` when the repo is in a detached-HEAD state. */
13
13
  branch: string | null;
14
+ /** Live HEAD commit identity. */
15
+ headSha?: string | null;
14
16
  /** The feature branch the workspace expects every repo to be on. */
15
17
  expectedBranch: string;
16
18
  onExpectedBranch: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,kCAAkC;AAClC,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,gGAAgG;IAChG,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAkChC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,kCAAkC;AAClC,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,gGAAgG;IAChG,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAsChC"}
@@ -5,6 +5,7 @@
5
5
  * status route. Throws only if the workspace manifest cannot be read.
6
6
  */
7
7
  import { getWorkspaceRepos, getRepoBranch, getRepoStatus, getAheadBehind, getRemoteUrl, } from '../utils/multi-git.js';
8
+ import { execa } from 'execa';
8
9
  /**
9
10
  * Gathers branch, dirtiness, ahead/behind, and remote info for every repo in
10
11
  * the workspace.
@@ -16,16 +17,20 @@ import { getWorkspaceRepos, getRepoBranch, getRepoStatus, getAheadBehind, getRem
16
17
  export async function getWorkspaceStatusReport(workspacePath) {
17
18
  const repos = await getWorkspaceRepos(workspacePath);
18
19
  const reports = await Promise.all(repos.map(async (repo) => {
19
- const [branch, status, remoteUrl, aheadBehind] = await Promise.all([
20
+ const [branch, status, remoteUrl, aheadBehind, headSha] = await Promise.all([
20
21
  getRepoBranch(repo.path),
21
22
  getRepoStatus(repo.path),
22
23
  getRemoteUrl(repo.path),
23
24
  getAheadBehind(repo.path, repo.branchName),
25
+ execa('git', ['rev-parse', 'HEAD'], { cwd: repo.path })
26
+ .then((result) => result.stdout.trim())
27
+ .catch(() => null),
24
28
  ]);
25
29
  return {
26
30
  name: repo.name,
27
31
  path: repo.path,
28
32
  branch,
33
+ headSha,
29
34
  expectedBranch: repo.branchName,
30
35
  onExpectedBranch: branch === repo.branchName,
31
36
  dirty: status.hasChanges,
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,GAEb,MAAM,uBAAuB,CAAC;AAgC/B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,aAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAErD,MAAM,OAAO,GAAuB,MAAM,OAAO,CAAC,GAAG,CACnD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAA6B,EAAE;QAClD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,cAAc,EAAE,IAAI,CAAC,UAAU;YAC/B,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC,UAAU;YAC5C,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,YAAY,EAAE,MAAM,CAAC,KAAK;YAC1B,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,6EAA6E;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,GAEb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAkC9B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,aAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAErD,MAAM,OAAO,GAAuB,MAAM,OAAO,CAAC,GAAG,CACnD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAA6B,EAAE;QAClD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;YAC1C,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;iBACpD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;iBACtC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SACrB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,OAAO;YACP,cAAc,EAAE,IAAI,CAAC,UAAU;YAC/B,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC,UAAU;YAC5C,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,YAAY,EAAE,MAAM,CAAC,KAAK;YAC1B,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,6EAA6E;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC5E,CAAC"}