@mrpatronz/nexusflow 2.10.2 → 2.12.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 (211) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +151 -12
  3. package/dist/analyzers/detect-deps.js +1 -1
  4. package/dist/analyzers/detect-deps.js.map +1 -1
  5. package/dist/commands/commit.d.ts.map +1 -1
  6. package/dist/commands/commit.js +15 -0
  7. package/dist/commands/commit.js.map +1 -1
  8. package/dist/commands/create.d.ts +10 -1
  9. package/dist/commands/create.d.ts.map +1 -1
  10. package/dist/commands/create.js +44 -23
  11. package/dist/commands/create.js.map +1 -1
  12. package/dist/commands/finish.d.ts.map +1 -1
  13. package/dist/commands/finish.js +15 -0
  14. package/dist/commands/finish.js.map +1 -1
  15. package/dist/commands/flow.d.ts +13 -0
  16. package/dist/commands/flow.d.ts.map +1 -0
  17. package/dist/commands/flow.js +91 -0
  18. package/dist/commands/flow.js.map +1 -0
  19. package/dist/commands/handoff.d.ts.map +1 -1
  20. package/dist/commands/handoff.js +5 -14
  21. package/dist/commands/handoff.js.map +1 -1
  22. package/dist/commands/knowledge.d.ts.map +1 -1
  23. package/dist/commands/knowledge.js +3 -0
  24. package/dist/commands/knowledge.js.map +1 -1
  25. package/dist/commands/skill.d.ts +28 -0
  26. package/dist/commands/skill.d.ts.map +1 -0
  27. package/dist/commands/skill.js +250 -0
  28. package/dist/commands/skill.js.map +1 -0
  29. package/dist/commands/status.d.ts.map +1 -1
  30. package/dist/commands/status.js +17 -0
  31. package/dist/commands/status.js.map +1 -1
  32. package/dist/commands/tag.d.ts +13 -0
  33. package/dist/commands/tag.d.ts.map +1 -0
  34. package/dist/commands/tag.js +179 -0
  35. package/dist/commands/tag.js.map +1 -0
  36. package/dist/commands/verify.d.ts +16 -0
  37. package/dist/commands/verify.d.ts.map +1 -0
  38. package/dist/commands/verify.js +91 -0
  39. package/dist/commands/verify.js.map +1 -0
  40. package/dist/core/adapters/local-storage.d.ts.map +1 -1
  41. package/dist/core/adapters/local-storage.js +2 -2
  42. package/dist/core/adapters/local-storage.js.map +1 -1
  43. package/dist/core/commit.d.ts +2 -0
  44. package/dist/core/commit.d.ts.map +1 -1
  45. package/dist/core/commit.js +15 -0
  46. package/dist/core/commit.js.map +1 -1
  47. package/dist/core/doctor.d.ts.map +1 -1
  48. package/dist/core/doctor.js +14 -4
  49. package/dist/core/doctor.js.map +1 -1
  50. package/dist/core/domain-catalog.d.ts +9 -0
  51. package/dist/core/domain-catalog.d.ts.map +1 -0
  52. package/dist/core/domain-catalog.js +47 -0
  53. package/dist/core/domain-catalog.js.map +1 -0
  54. package/dist/core/domain-packs.d.ts +81 -0
  55. package/dist/core/domain-packs.d.ts.map +1 -0
  56. package/dist/core/domain-packs.js +443 -0
  57. package/dist/core/domain-packs.js.map +1 -0
  58. package/dist/core/generation-lock.d.ts.map +1 -1
  59. package/dist/core/generation-lock.js +1 -3
  60. package/dist/core/generation-lock.js.map +1 -1
  61. package/dist/core/lifecycle.d.ts +28 -0
  62. package/dist/core/lifecycle.d.ts.map +1 -0
  63. package/dist/core/lifecycle.js +411 -0
  64. package/dist/core/lifecycle.js.map +1 -0
  65. package/dist/core/status.d.ts +17 -0
  66. package/dist/core/status.d.ts.map +1 -1
  67. package/dist/core/status.js +80 -1
  68. package/dist/core/status.js.map +1 -1
  69. package/dist/core/verify.d.ts +39 -0
  70. package/dist/core/verify.d.ts.map +1 -0
  71. package/dist/core/verify.js +397 -0
  72. package/dist/core/verify.js.map +1 -0
  73. package/dist/core/work-guidance.d.ts +201 -0
  74. package/dist/core/work-guidance.d.ts.map +1 -0
  75. package/dist/core/work-guidance.js +225 -0
  76. package/dist/core/work-guidance.js.map +1 -0
  77. package/dist/core/workspace-state.d.ts +24 -3
  78. package/dist/core/workspace-state.d.ts.map +1 -1
  79. package/dist/core/workspace-state.js +93 -31
  80. package/dist/core/workspace-state.js.map +1 -1
  81. package/dist/core/workspace.d.ts.map +1 -1
  82. package/dist/core/workspace.js +7 -0
  83. package/dist/core/workspace.js.map +1 -1
  84. package/dist/generators/base.d.ts.map +1 -1
  85. package/dist/generators/base.js +45 -7
  86. package/dist/generators/base.js.map +1 -1
  87. package/dist/generators/index.d.ts.map +1 -1
  88. package/dist/generators/index.js +11 -2
  89. package/dist/generators/index.js.map +1 -1
  90. package/dist/generators/plan-generator.d.ts.map +1 -1
  91. package/dist/generators/plan-generator.js +9 -4
  92. package/dist/generators/plan-generator.js.map +1 -1
  93. package/dist/generators/skills-generator.d.ts.map +1 -1
  94. package/dist/generators/skills-generator.js +36 -3
  95. package/dist/generators/skills-generator.js.map +1 -1
  96. package/dist/gui/assets/AgentsPage-GCFiyNSm.js +3 -0
  97. package/dist/gui/assets/DashboardPage-51JHl4Hg.js +1 -0
  98. package/dist/gui/assets/{GettingStartedPage-1MOTng3B.js → GettingStartedPage-DH-zXYgU.js} +1 -1
  99. package/dist/gui/assets/ProjectsPage-DUv2fhI8.js +1 -0
  100. package/dist/gui/assets/ScaffoldRepoInline-Asao9IqG.js +1 -0
  101. package/dist/gui/assets/SettingsPage--pnZKpmm.js +1 -0
  102. package/dist/gui/assets/SkillsPage-BPq8arO5.js +7 -0
  103. package/dist/gui/assets/StartWorkPage-CypGEQZ0.js +1 -0
  104. package/dist/gui/assets/{StrategiesPage-CdCbbIu-.js → StrategiesPage-BHAzXMnc.js} +2 -2
  105. package/dist/gui/assets/WorkroomsPage-BYC8c-rP.js +4 -0
  106. package/dist/gui/assets/WorkspacesPage-DRASo1aL.js +13 -0
  107. package/dist/gui/assets/{alert-dialog-u7qgb9Hq.js → alert-dialog-BD3wT0w3.js} +1 -1
  108. package/dist/gui/assets/badge-DTBzXOWn.js +1 -0
  109. package/dist/gui/assets/index-er-mkc2S.css +2 -0
  110. package/dist/gui/assets/index-jcGHcXQ1.js +57 -0
  111. package/dist/gui/assets/square-check-big-Bj8Rf_dH.js +1 -0
  112. package/dist/gui/assets/tabs-DfbdubLX.js +1 -0
  113. package/dist/gui/assets/{useAriaLabelledBy-C4zV-1Ra.js → useAriaLabelledBy-BmJErI5a.js} +1 -1
  114. package/dist/gui/assets/vsc-Dn-smJni.js +1 -0
  115. package/dist/gui/index.html +3 -5
  116. package/dist/http/work-guidance-routes.d.ts +4 -0
  117. package/dist/http/work-guidance-routes.d.ts.map +1 -0
  118. package/dist/http/work-guidance-routes.js +44 -0
  119. package/dist/http/work-guidance-routes.js.map +1 -0
  120. package/dist/index.js +169 -1
  121. package/dist/index.js.map +1 -1
  122. package/dist/mcp/tools.d.ts.map +1 -1
  123. package/dist/mcp/tools.js +184 -1
  124. package/dist/mcp/tools.js.map +1 -1
  125. package/dist/resources/contracts.d.ts.map +1 -1
  126. package/dist/resources/contracts.js +2 -1
  127. package/dist/resources/contracts.js.map +1 -1
  128. package/dist/resources/fs-safety.d.ts.map +1 -1
  129. package/dist/resources/fs-safety.js +2 -1
  130. package/dist/resources/fs-safety.js.map +1 -1
  131. package/dist/resources/materializer.d.ts +3 -0
  132. package/dist/resources/materializer.d.ts.map +1 -1
  133. package/dist/resources/materializer.js +45 -19
  134. package/dist/resources/materializer.js.map +1 -1
  135. package/dist/server.d.ts.map +1 -1
  136. package/dist/server.js +327 -4
  137. package/dist/server.js.map +1 -1
  138. package/dist/static-resources/skills/contextspace-verify-release/SKILL.md +51 -0
  139. package/dist/static-resources/skills/contextspace-verify-release/references/evidence.md +21 -0
  140. package/dist/static-resources/skills/nexusflow-dev/SKILL.md +49 -0
  141. package/dist/static-resources/skills/nexusflow-dev/references/cli-conventions.md +15 -0
  142. package/dist/static-resources/skills/nexusflow-dev/references/verification-checklist.md +28 -0
  143. package/dist/static-resources/skills/nexusflow-lifecycle/SKILL.md +62 -0
  144. package/dist/static-resources/skills/nexusflow-lifecycle/references/epic-deliverables.md +22 -0
  145. package/dist/static-resources/skills/nexusflow-lifecycle/references/flow-selection-matrix.md +21 -0
  146. package/dist/static-resources/skills/nexusflow-lifecycle/references/stage-outcomes.md +23 -0
  147. package/dist/static-resources/workflows/epic-multi-slice.md +21 -0
  148. package/dist/static-resources/workflows/plan-implement-review.md +17 -6
  149. package/dist/static-resources/workflows/research-verify.md +15 -4
  150. package/dist/static-resources/workflows/solo-developer.md +11 -2
  151. package/dist/test-setup.d.ts +2 -0
  152. package/dist/test-setup.d.ts.map +1 -0
  153. package/dist/test-setup.js +8 -0
  154. package/dist/test-setup.js.map +1 -0
  155. package/dist/types.d.ts +175 -0
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/utils/resolve-workspace.d.ts.map +1 -1
  158. package/dist/utils/resolve-workspace.js +15 -8
  159. package/dist/utils/resolve-workspace.js.map +1 -1
  160. package/dist/utils/skills-catalog.d.ts +13 -9
  161. package/dist/utils/skills-catalog.d.ts.map +1 -1
  162. package/dist/utils/skills-catalog.js +241 -341
  163. package/dist/utils/skills-catalog.js.map +1 -1
  164. package/dist/utils/test-command.d.ts +7 -1
  165. package/dist/utils/test-command.d.ts.map +1 -1
  166. package/dist/utils/test-command.js +35 -11
  167. package/dist/utils/test-command.js.map +1 -1
  168. package/dist/utils/workflow-advisor.d.ts +1 -1
  169. package/dist/utils/workflow-advisor.d.ts.map +1 -1
  170. package/dist/utils/workflow-advisor.js +16 -4
  171. package/dist/utils/workflow-advisor.js.map +1 -1
  172. package/dist/utils/workflows.d.ts.map +1 -1
  173. package/dist/utils/workflows.js +5 -2
  174. package/dist/utils/workflows.js.map +1 -1
  175. package/dist/workrooms/contracts.d.ts +3 -3
  176. package/dist/workrooms/local-resources.d.ts +4 -1
  177. package/dist/workrooms/local-resources.d.ts.map +1 -1
  178. package/dist/workrooms/manager.d.ts +5 -2
  179. package/dist/workrooms/manager.d.ts.map +1 -1
  180. package/dist/workrooms/store.d.ts +2 -2
  181. package/package.json +3 -2
  182. package/resources/skills/contextspace-verify-release/SKILL.md +51 -0
  183. package/resources/skills/contextspace-verify-release/references/evidence.md +21 -0
  184. package/resources/skills/nexusflow-dev/SKILL.md +49 -0
  185. package/resources/skills/nexusflow-dev/references/cli-conventions.md +15 -0
  186. package/resources/skills/nexusflow-dev/references/verification-checklist.md +28 -0
  187. package/resources/skills/nexusflow-lifecycle/SKILL.md +62 -0
  188. package/resources/skills/nexusflow-lifecycle/references/epic-deliverables.md +22 -0
  189. package/resources/skills/nexusflow-lifecycle/references/flow-selection-matrix.md +21 -0
  190. package/resources/skills/nexusflow-lifecycle/references/stage-outcomes.md +23 -0
  191. package/resources/workflows/epic-multi-slice.md +21 -0
  192. package/resources/workflows/plan-implement-review.md +17 -6
  193. package/resources/workflows/research-verify.md +15 -4
  194. package/resources/workflows/solo-developer.md +11 -2
  195. package/dist/gui/assets/AgentsPage-DbivhmK0.js +0 -3
  196. package/dist/gui/assets/DashboardPage-D50Qrm3e.js +0 -1
  197. package/dist/gui/assets/NullStore-tdPen1kp.js +0 -1
  198. package/dist/gui/assets/ProjectsPage-srKgf7VN.js +0 -1
  199. package/dist/gui/assets/ScaffoldRepoInline-CP0yn5mw.js +0 -1
  200. package/dist/gui/assets/SettingsPage-DWmrLV8o.js +0 -1
  201. package/dist/gui/assets/SkillsPage-CKjTXdrd.js +0 -6
  202. package/dist/gui/assets/StartWorkPage-BCUnJ9k8.js +0 -1
  203. package/dist/gui/assets/WorkroomsPage-BcT-mGtT.js +0 -4
  204. package/dist/gui/assets/WorkspacesPage-CYFCm-7_.js +0 -2
  205. package/dist/gui/assets/badge-DwXvB44H.js +0 -1
  206. package/dist/gui/assets/chunk-BV7QT456-DfUBKG-z.js +0 -3
  207. package/dist/gui/assets/index-3tD_IeyQ.js +0 -55
  208. package/dist/gui/assets/index-CK5YRfPV.css +0 -2
  209. package/dist/gui/assets/square-check-big-BSIiYXPI.js +0 -1
  210. package/dist/gui/assets/tabs-BrHKp5bD.js +0 -1
  211. package/dist/gui/assets/vsc-D80c4gBT.js +0 -1
@@ -0,0 +1,411 @@
1
+ /**
2
+ * @module core/lifecycle
3
+ * Active lifecycle state machine and multi-branch fleet radar for ContextSpace.
4
+ *
5
+ * Manages discrete development milestones/steps, dependency gating,
6
+ * non-destructive origin branch fleet tracking, and test gate transitions.
7
+ */
8
+ import { z } from 'zod';
9
+ import { execa } from 'execa';
10
+ import { loadFeatureConfig, resolveRepoInfos } from './workspace.js';
11
+ import { resolveFeatureRepoPath } from '../utils/feature.js';
12
+ import { getRepoBranch, getAheadBehind } from '../utils/multi-git.js';
13
+ import { loadWorkspaceState, mutateWorkspaceState } from './workspace-state.js';
14
+ import { verifyWorkspace } from './verify.js';
15
+ /**
16
+ * Non-destructively inspects local and remote tracking branches for repositories in the workspace.
17
+ */
18
+ export async function getBranchFleet(workspacePath) {
19
+ const feature = await loadFeatureConfig(workspacePath);
20
+ if (!feature)
21
+ return [];
22
+ const resolvedPaths = feature.repos.map((r) => resolveFeatureRepoPath(feature, workspacePath, r));
23
+ const repoInfos = await resolveRepoInfos(resolvedPaths);
24
+ const fleet = [];
25
+ for (const repo of repoInfos) {
26
+ const currentBranch = await getRepoBranch(repo.path);
27
+ const aheadBehind = await getAheadBehind(repo.path, currentBranch ?? repo.defaultBranch);
28
+ let currentSha = 'unknown';
29
+ let currentMessage = '';
30
+ let currentAuthor = '';
31
+ let currentDate = '';
32
+ try {
33
+ const { stdout } = await execa('git', ['log', '-1', '--format=%h%x1f%s%x1f%an%x1f%cr'], { cwd: repo.path });
34
+ const [sha, msg, author, date] = stdout.trim().split('\x1f');
35
+ currentSha = sha ?? 'unknown';
36
+ currentMessage = msg ?? '';
37
+ currentAuthor = author ?? '';
38
+ currentDate = date ?? '';
39
+ }
40
+ catch {
41
+ // Ignore
42
+ }
43
+ // 1. Add current active branch
44
+ fleet.push({
45
+ branch: currentBranch ?? 'detached',
46
+ repoName: repo.name,
47
+ isCurrent: true,
48
+ headSha: currentSha,
49
+ ahead: aheadBehind.ahead ?? 0,
50
+ behind: aheadBehind.behind ?? 0,
51
+ lastCommitMessage: currentMessage,
52
+ lastCommitAuthor: currentAuthor,
53
+ lastCommitDate: currentDate,
54
+ remoteTracked: aheadBehind.ahead !== null,
55
+ });
56
+ // 2. Inspect origin remote tracking branches (non-destructive)
57
+ try {
58
+ const { stdout: refOut } = await execa('git', [
59
+ 'for-each-ref',
60
+ '--sort=-committerdate',
61
+ '--count=6',
62
+ '--format=%(refname:short)\x1f%(objectname:short)\x1f%(subject)\x1f%(authorname)\x1f%(authordate:relative)\x1f%(symref)',
63
+ 'refs/remotes/origin/',
64
+ ], { cwd: repo.path });
65
+ const lines = refOut.split('\n').map((l) => l.trim()).filter(Boolean);
66
+ for (const line of lines) {
67
+ const [refShort, sha, subject, author, relDate, symref] = line.split('\x1f');
68
+ if (!refShort)
69
+ continue;
70
+ const branchName = refShort.replace(/^origin\//, '');
71
+ if (symref || refShort === 'origin' || refShort === 'origin/HEAD' || branchName === 'HEAD' || branchName === currentBranch)
72
+ continue;
73
+ fleet.push({
74
+ branch: refShort,
75
+ repoName: repo.name,
76
+ isCurrent: false,
77
+ headSha: sha,
78
+ ahead: 0,
79
+ behind: 0,
80
+ lastCommitMessage: subject,
81
+ lastCommitAuthor: author,
82
+ lastCommitDate: relDate,
83
+ remoteTracked: true,
84
+ });
85
+ }
86
+ }
87
+ catch {
88
+ // Ignore remote queries if remote not reachable
89
+ }
90
+ }
91
+ return fleet;
92
+ }
93
+ /**
94
+ * Creates a default structured lifecycle if none exists for the workspace.
95
+ */
96
+ export function createDefaultSteps(flowType, featureId, branchName) {
97
+ if (flowType === 'quick') {
98
+ return [
99
+ {
100
+ id: 'reproduce_and_fix',
101
+ title: 'Scope & Implement Focused Change',
102
+ description: 'Confirm the expected behavior or baseline, then make a focused change.',
103
+ branch: branchName,
104
+ owner: 'Developer',
105
+ status: 'in_progress',
106
+ },
107
+ {
108
+ id: 'verify_and_ship',
109
+ requiresVerification: true,
110
+ title: 'Mechanical Verification Gate & Ship',
111
+ description: 'Execute automated tests, anchor commit SHA proof, and publish PR.',
112
+ branch: branchName,
113
+ owner: 'Developer',
114
+ status: 'pending',
115
+ dependsOn: ['reproduce_and_fix'],
116
+ },
117
+ ];
118
+ }
119
+ if (flowType === 'epic') {
120
+ return [
121
+ {
122
+ id: 'epic_slice_1',
123
+ title: 'Define Outcomes & Constraints',
124
+ description: 'Agree the intended outcome, scope, constraints, and acceptance criteria.',
125
+ branch: branchName,
126
+ owner: 'Developer',
127
+ status: 'in_progress',
128
+ },
129
+ {
130
+ id: 'epic_slice_2',
131
+ title: 'Deliver First Increment',
132
+ description: 'Implement and test the first independently reviewable deliverable.',
133
+ branch: branchName,
134
+ owner: 'Developer',
135
+ status: 'pending',
136
+ dependsOn: ['epic_slice_1'],
137
+ },
138
+ {
139
+ id: 'epic_slice_3',
140
+ title: 'Deliver Follow-up Increments',
141
+ description: 'Add milestones for the remaining deliverables and their dependencies.',
142
+ branch: branchName,
143
+ owner: 'Developer',
144
+ status: 'pending',
145
+ dependsOn: ['epic_slice_2'],
146
+ },
147
+ {
148
+ id: 'epic_slice_4',
149
+ requiresVerification: true,
150
+ title: 'Cross-Repo Integration & E2E Gate',
151
+ description: 'End-to-end integration tests, mechanical verification, and milestone signoff.',
152
+ branch: branchName,
153
+ owner: 'Developer',
154
+ status: 'blocked',
155
+ dependsOn: ['epic_slice_2', 'epic_slice_3'],
156
+ },
157
+ ];
158
+ }
159
+ // Standard Feature flow
160
+ return [
161
+ {
162
+ id: 'step_discovery',
163
+ title: 'Explore Architecture & Design Test Skeleton',
164
+ description: 'Survey relevant modules, inspect interfaces, and create verification skeleton.',
165
+ branch: branchName,
166
+ owner: 'Developer',
167
+ status: 'in_progress',
168
+ },
169
+ {
170
+ id: 'step_implementation',
171
+ title: 'Core Implementation',
172
+ description: 'Implement feature changes across affected workspace repositories.',
173
+ branch: branchName,
174
+ owner: 'Developer',
175
+ status: 'pending',
176
+ dependsOn: ['step_discovery'],
177
+ },
178
+ {
179
+ id: 'step_verification',
180
+ requiresVerification: true,
181
+ title: 'Mechanical Verification Gate',
182
+ description: 'Run automated test suites and anchor clean commit SHA proof in state.',
183
+ branch: branchName,
184
+ owner: 'Developer',
185
+ status: 'pending',
186
+ dependsOn: ['step_implementation'],
187
+ },
188
+ {
189
+ id: 'step_ship',
190
+ title: 'Review, Create PR & Clean Workspace',
191
+ description: 'Surface compare links, create GitHub pull request, and conclude workspace loop.',
192
+ branch: branchName,
193
+ owner: 'Developer',
194
+ status: 'pending',
195
+ dependsOn: ['step_verification'],
196
+ },
197
+ ];
198
+ }
199
+ /**
200
+ * Loads or initializes the active lifecycle for a workspace.
201
+ */
202
+ export async function loadWorkspaceLifecycle(workspacePath) {
203
+ const state = await loadWorkspaceState(workspacePath);
204
+ const feature = await loadFeatureConfig(workspacePath);
205
+ if (state.lifecycle) {
206
+ // Refresh branch fleet asynchronously
207
+ try {
208
+ state.lifecycle.fleet = await getBranchFleet(workspacePath);
209
+ }
210
+ catch {
211
+ // Best-effort
212
+ }
213
+ return state.lifecycle;
214
+ }
215
+ // Determine flow type
216
+ let flowType = feature?.flowType ?? 'feature';
217
+ if (!feature?.flowType && (feature?.branchName.startsWith('fix/') || feature?.branchName.startsWith('quick/'))) {
218
+ flowType = 'quick';
219
+ }
220
+ else if (!feature?.flowType && ((feature?.repos.length ?? 0) > 2 ||
221
+ feature?.branchName.startsWith('epic/') ||
222
+ feature?.branchName.startsWith('flow/'))) {
223
+ flowType = 'epic';
224
+ }
225
+ let fleet = [];
226
+ try {
227
+ fleet = await getBranchFleet(workspacePath);
228
+ }
229
+ catch {
230
+ // Best-effort
231
+ }
232
+ const branches = [...new Set(fleet.filter((member) => member.isCurrent).map((member) => member.branch))];
233
+ const branch = branches.length === 1 && branches[0] !== 'detached'
234
+ ? branches[0]
235
+ : !branches.length && feature?.mode !== 'in-place' && !feature?.repoBranches
236
+ ? feature?.branchName
237
+ : undefined;
238
+ const steps = createDefaultSteps(flowType, feature?.id ?? 'workspace', branch);
239
+ const lifecycle = {
240
+ workspaceId: feature?.id ?? 'workspace',
241
+ flowType,
242
+ currentStepId: steps.find((s) => s.status === 'in_progress')?.id,
243
+ steps,
244
+ fleet,
245
+ updatedAt: new Date().toISOString(),
246
+ };
247
+ return mutateWorkspaceState(workspacePath, (current) => {
248
+ // Another reader may have initialized or advanced it while fleet data loaded.
249
+ current.lifecycle ??= lifecycle;
250
+ return current.lifecycle;
251
+ });
252
+ }
253
+ function dependenciesAreComplete(steps, candidate) {
254
+ return (candidate.dependsOn ?? []).every((id) => steps.some((step) => step.id === id && step.status === 'completed'));
255
+ }
256
+ /**
257
+ * Advances or transitions a step in the workspace lifecycle.
258
+ */
259
+ export async function advanceLifecycleStep(workspacePath, stepId, action) {
260
+ const lifecycle = await loadWorkspaceLifecycle(workspacePath);
261
+ const stepIndex = lifecycle.steps.findIndex((s) => s.id === stepId);
262
+ if (stepIndex < 0) {
263
+ throw new Error(`Step "${stepId}" not found in workspace lifecycle.`);
264
+ }
265
+ const step = structuredClone(lifecycle.steps[stepIndex]);
266
+ const originalStep = JSON.stringify(step);
267
+ if (!['start', 'verify', 'complete'].includes(action)) {
268
+ throw new Error(`Unknown lifecycle action "${action}".`);
269
+ }
270
+ if (!dependenciesAreComplete(lifecycle.steps, step)) {
271
+ throw new Error(`Complete dependencies before advancing step "${stepId}".`);
272
+ }
273
+ if (step.status === 'completed') {
274
+ throw new Error(`Step "${stepId}" is already completed.`);
275
+ }
276
+ if (action !== 'start' && step.status !== 'in_progress' && step.status !== 'verified') {
277
+ throw new Error(`Start step "${stepId}" before ${action}.`);
278
+ }
279
+ // Recognize gates in lifecycles saved before requiresVerification existed.
280
+ const requiresVerification = step.requiresVerification || Boolean(step.verificationCommand) || Boolean(step.lastVerificationStatus) ||
281
+ ['verify_and_ship', 'step_verification', 'epic_slice_4'].includes(step.id);
282
+ let gateFailed = false;
283
+ if (action === 'verify' || (action === 'complete' && requiresVerification)) {
284
+ const report = await verifyWorkspace(workspacePath, { command: step.verificationCommand });
285
+ step.lastVerificationStatus = report.overallStatus;
286
+ step.lastVerificationSha = report.repos[0]?.headSha;
287
+ gateFailed = !report.canProgress;
288
+ step.status = gateFailed ? 'in_progress' : 'verified';
289
+ }
290
+ const updated = await mutateWorkspaceState(workspacePath, (state) => {
291
+ const lifecycle = state.lifecycle;
292
+ const currentStep = lifecycle?.steps.find((candidate) => candidate.id === stepId);
293
+ if (!lifecycle || !currentStep || JSON.stringify(currentStep) !== originalStep) {
294
+ throw new Error(`Step "${stepId}" changed during this operation. Reload the flow and retry.`);
295
+ }
296
+ if (!dependenciesAreComplete(lifecycle.steps, step)) {
297
+ throw new Error(`Dependencies changed for step "${stepId}". Reload the flow and retry.`);
298
+ }
299
+ Object.assign(currentStep, step);
300
+ if (action === 'start') {
301
+ currentStep.status = 'in_progress';
302
+ lifecycle.currentStepId = step.id;
303
+ }
304
+ else if (action === 'complete' && !gateFailed) {
305
+ currentStep.status = 'completed';
306
+ currentStep.completedAt = new Date().toISOString();
307
+ for (const nextStep of lifecycle.steps) {
308
+ if (nextStep.status === 'blocked' && dependenciesAreComplete(lifecycle.steps, nextStep)) {
309
+ nextStep.status = 'pending';
310
+ }
311
+ }
312
+ const active = lifecycle.steps.find((s) => s.status === 'in_progress' || s.status === 'verified');
313
+ const next = active ?? lifecycle.steps.find((s) => s.status === 'pending' && dependenciesAreComplete(lifecycle.steps, s));
314
+ if (next && !active)
315
+ next.status = 'in_progress';
316
+ lifecycle.currentStepId = next?.id;
317
+ }
318
+ lifecycle.revision = (lifecycle.revision ?? 0) + 1;
319
+ lifecycle.updatedAt = new Date().toISOString();
320
+ return lifecycle;
321
+ });
322
+ if (gateFailed && action === 'complete') {
323
+ throw new Error(`Verification did not permit progress for step "${stepId}" (${step.lastVerificationStatus}).`);
324
+ }
325
+ return updated;
326
+ }
327
+ const planStepSchema = z.object({
328
+ id: z.string().regex(/^[a-zA-Z0-9_-]+$/).max(100),
329
+ title: z.string().trim().min(1).max(200), description: z.string().max(4000).optional(),
330
+ owner: z.string().max(200).optional(), branch: z.string().max(200).optional(),
331
+ dependsOn: z.array(z.string()).max(100).optional(),
332
+ requiresVerification: z.boolean().optional(), verificationCommand: z.string().max(2000).optional(),
333
+ });
334
+ /** Update definitions while retaining the authoritative milestone progress and proofs. */
335
+ export async function updateLifecyclePlan(workspacePath, input) {
336
+ const update = z.object({ revision: z.number().int().nonnegative(), steps: z.array(planStepSchema).min(1).max(100) }).parse(input);
337
+ await loadWorkspaceLifecycle(workspacePath);
338
+ return mutateWorkspaceState(workspacePath, (state) => {
339
+ const lifecycle = state.lifecycle;
340
+ if ((lifecycle.revision ?? 0) !== update.revision)
341
+ throw new Error('The plan changed in another session. Reload before saving.');
342
+ const definitions = update.steps.map((definition) => ({
343
+ ...lifecycle.steps.find((step) => step.id === definition.id), ...definition,
344
+ ...(definition.verificationCommand === '' ? { verificationCommand: undefined } : {}),
345
+ }));
346
+ const byId = new Map(definitions.map((step) => [step.id, step]));
347
+ if (byId.size !== definitions.length)
348
+ throw new Error('Milestone IDs must be unique.');
349
+ if (lifecycle.steps.some((step) => !byId.has(step.id)))
350
+ throw new Error('Existing milestones must be retained; edit their details or add a new milestone.');
351
+ // Validate the merged definitions: omitted optional fields retain their saved values.
352
+ const visiting = new Set();
353
+ const visited = new Set();
354
+ const visit = (id) => {
355
+ if (visiting.has(id))
356
+ throw new Error('Milestone dependencies contain a cycle.');
357
+ if (visited.has(id))
358
+ return;
359
+ const step = byId.get(id);
360
+ if (!step)
361
+ throw new Error(`Dependency "${id}" does not name a milestone.`);
362
+ visiting.add(id);
363
+ for (const dependency of step.dependsOn ?? [])
364
+ visit(dependency);
365
+ visiting.delete(id);
366
+ visited.add(id);
367
+ };
368
+ for (const step of definitions)
369
+ visit(step.id);
370
+ lifecycle.steps = definitions.map((definition) => {
371
+ const existing = lifecycle.steps.find((step) => step.id === definition.id);
372
+ if (!existing)
373
+ return { ...definition, status: 'pending' };
374
+ const gateChanged = Boolean(existing.requiresVerification) !== Boolean(definition.requiresVerification)
375
+ || existing.verificationCommand !== definition.verificationCommand;
376
+ const dependenciesChanged = JSON.stringify(existing.dependsOn ?? []) !== JSON.stringify(definition.dependsOn ?? []);
377
+ if (existing.status === 'completed' && (gateChanged || dependenciesChanged)) {
378
+ throw new Error(`Completed milestone "${existing.title}" cannot change its gate or dependencies.`);
379
+ }
380
+ if (['in_progress', 'verified'].includes(existing.status) &&
381
+ (definition.dependsOn ?? []).some((id) => lifecycle.steps.find((step) => step.id === id)?.status !== 'completed')) {
382
+ throw new Error(`Active milestone "${existing.title}" cannot depend on unfinished work.`);
383
+ }
384
+ return { ...existing, ...definition,
385
+ ...(gateChanged ? { lastVerificationSha: undefined, lastVerificationStatus: undefined,
386
+ status: existing.status === 'verified' ? 'in_progress' : existing.status } : {}),
387
+ };
388
+ });
389
+ lifecycle.revision = (lifecycle.revision ?? 0) + 1;
390
+ lifecycle.updatedAt = new Date().toISOString();
391
+ return lifecycle;
392
+ });
393
+ }
394
+ export function renderLifecyclePlan(lifecycle, live = true) {
395
+ const lines = ['<!-- CONTEXTSPACE:MILESTONES:START -->', '## Milestone plan', '',
396
+ live ? 'Current progress from the workspace lifecycle.' : 'Milestone definitions from the workspace lifecycle. Run `ctxspace flow` for current progress.', ''];
397
+ for (const [index, step] of lifecycle.steps.entries()) {
398
+ lines.push(`${index + 1}. **${step.title}**${live ? ` — ${step.status.replaceAll('_', ' ')}` : ''}`);
399
+ if (step.description)
400
+ lines.push(` ${step.description}`);
401
+ if (step.dependsOn?.length)
402
+ lines.push(` Depends on: ${step.dependsOn.map((id) => lifecycle.steps.find((item) => item.id === id)?.title ?? id).join(', ')}`);
403
+ if (step.branch)
404
+ lines.push(` Branch: ${step.branch}`);
405
+ if (step.requiresVerification || step.verificationCommand)
406
+ lines.push(' Requires verification before completion.');
407
+ }
408
+ lines.push('', '<!-- CONTEXTSPACE:MILESTONES:END -->');
409
+ return lines.join('\n');
410
+ }
411
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAM9B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB;IACxD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzF,IAAI,UAAU,GAAG,SAAS,CAAC;QAC3B,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAC5B,KAAK,EACL,CAAC,KAAK,EAAE,IAAI,EAAE,iCAAiC,CAAC,EAChD,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CACnB,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7D,UAAU,GAAG,GAAG,IAAI,SAAS,CAAC;YAC9B,cAAc,GAAG,GAAG,IAAI,EAAE,CAAC;YAC3B,aAAa,GAAG,MAAM,IAAI,EAAE,CAAC;YAC7B,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,+BAA+B;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,aAAa,IAAI,UAAU;YACnC,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC;YAC/B,iBAAiB,EAAE,cAAc;YACjC,gBAAgB,EAAE,aAAa;YAC/B,cAAc,EAAE,WAAW;YAC3B,aAAa,EAAE,WAAW,CAAC,KAAK,KAAK,IAAI;SAC1C,CAAC,CAAC;QAEH,+DAA+D;QAC/D,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CACpC,KAAK,EACL;gBACE,cAAc;gBACd,uBAAuB;gBACvB,WAAW;gBACX,wHAAwH;gBACxH,sBAAsB;aACvB,EACD,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CACnB,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7E,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,MAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,aAAa,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,aAAa;oBAAE,SAAS;gBAErI,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS,EAAE,KAAK;oBAChB,OAAO,EAAE,GAAG;oBACZ,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,iBAAiB,EAAE,OAAO;oBAC1B,gBAAgB,EAAE,MAAM;oBACxB,cAAc,EAAE,OAAO;oBACvB,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAsC,EACtC,SAAiB,EACjB,UAAmB;IAEnB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL;gBACE,EAAE,EAAE,mBAAmB;gBACvB,KAAK,EAAE,kCAAkC;gBACzC,WAAW,EAAE,wEAAwE;gBACrF,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,EAAE,EAAE,iBAAiB;gBACrB,oBAAoB,EAAE,IAAI;gBAC1B,KAAK,EAAE,qCAAqC;gBAC5C,WAAW,EAAE,mEAAmE;gBAChF,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,mBAAmB,CAAC;aACjC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL;gBACE,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,+BAA+B;gBACtC,WAAW,EAAE,0EAA0E;gBACvF,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,yBAAyB;gBAChC,WAAW,EAAE,oEAAoE;gBACjF,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,cAAc,CAAC;aAC5B;YACD;gBACE,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,8BAA8B;gBACrC,WAAW,EAAE,uEAAuE;gBACpF,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,cAAc,CAAC;aAC5B;YACD;gBACE,EAAE,EAAE,cAAc;gBAClB,oBAAoB,EAAE,IAAI;gBAC1B,KAAK,EAAE,mCAAmC;gBAC1C,WAAW,EAAE,+EAA+E;gBAC5F,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;aAC5C;SACF,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,OAAO;QACL;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,6CAA6C;YACpD,WAAW,EAAE,gFAAgF;YAC7F,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,aAAa;SACtB;QACD;YACE,EAAE,EAAE,qBAAqB;YACzB,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,mEAAmE;YAChF,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC,gBAAgB,CAAC;SAC9B;QACD;YACE,EAAE,EAAE,mBAAmB;YACvB,oBAAoB,EAAE,IAAI;YAC1B,KAAK,EAAE,8BAA8B;YACrC,WAAW,EAAE,uEAAuE;YACpF,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC,qBAAqB,CAAC;SACnC;QACD;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,qCAAqC;YAC5C,WAAW,EAAE,iFAAiF;YAC9F,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC,mBAAmB,CAAC;SACjC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,aAAqB;IAChE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAEvD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,sCAAsC;QACtC,IAAI,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,sBAAsB;IACtB,IAAI,QAAQ,GAAiC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAC5E,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC/G,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,CAC/B,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QACvC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CACxC,EAAE,CAAC;QACF,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,GAAwB,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,UAAU;QAChE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,YAAY;YAC1E,CAAC,CAAC,OAAO,EAAE,UAAU;YACrB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,CAAC,CAAC;IAE/E,MAAM,SAAS,GAAuB;QACpC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,WAAW;QACvC,QAAQ;QACR,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,EAAE,EAAE;QAChE,KAAK;QACL,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO,oBAAoB,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE;QACrD,8EAA8E;QAC9E,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;QAChC,OAAO,OAAO,CAAC,SAAS,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAsB,EAAE,SAAwB;IAC/E,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC;AACxH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,aAAqB,EACrB,MAAc,EACd,MAAuC;IAEvC,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAEpE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,qCAAqC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE1C,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,yBAAyB,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,YAAY,MAAM,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,2EAA2E;IAC3E,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACjI,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,oBAAoB,CAAC,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,aAAa,CAAC;QACnD,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACpD,UAAU,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAClE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,WAAW,GAAG,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,YAAY,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,6DAA6D,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,+BAA+B,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC;YACnC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;QACpC,CAAC;aAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC;YACjC,WAAW,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACxF,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAClG,MAAM,IAAI,GAAG,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1H,IAAI,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;YACjD,SAAS,CAAC,aAAa,GAAG,IAAI,EAAE,EAAE,CAAC;QACrC,CAAC;QAED,SAAS,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,IAAI,UAAU,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,MAAM,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC7E,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClD,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CACnG,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,aAAqB,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnI,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,oBAAoB,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAU,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACjI,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACpD,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU;YAC3E,GAAG,CAAC,UAAU,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrF,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACvF,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QAC5J,sFAAsF;QACtF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE;YAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACjF,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;YAC5E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE;gBAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;YACpE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC;mBAClG,QAAQ,CAAC,mBAAmB,KAAK,UAAU,CAAC,mBAAmB,CAAC;YACrE,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACpH,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,WAAW,IAAI,mBAAmB,CAAC,EAAE,CAAC;gBAC5E,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,KAAK,2CAA2C,CAAC,CAAC;YACrG,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvD,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;gBACpH,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,KAAK,qCAAqC,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU;gBACjC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,SAAS,EAAE,sBAAsB,EAAE,SAAS;oBACnF,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,aAAsB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5F,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAA6B,EAAE,IAAI,GAAG,IAAI;IAC5E,MAAM,KAAK,GAAG,CAAC,wCAAwC,EAAE,mBAAmB,EAAE,EAAE;QAC9E,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,+FAA+F,EAAE,EAAE,CAAC,CAAC;IACjK,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrG,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/J,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,mBAAmB;YAAE,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACvH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sCAAsC,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -5,6 +5,16 @@
5
5
  * status route. Throws only if the workspace manifest cannot be read.
6
6
  */
7
7
  import { type RepoStatusFile } from '../utils/multi-git.js';
8
+ /** A file collision or concurrent modification detected on disk. */
9
+ export interface FileCollision {
10
+ filePath: string;
11
+ code: string;
12
+ lastCommittedBy?: string;
13
+ lastCommitSha?: string;
14
+ lastCommitMessage?: string;
15
+ lastCommitDate?: string;
16
+ collisionHint?: string;
17
+ }
8
18
  /** Full status for a single repo in a workspace. */
9
19
  export interface RepoStatusReport {
10
20
  name: string;
@@ -24,6 +34,9 @@ export interface RepoStatusReport {
24
34
  behind: number | null;
25
35
  remoteUrl: string | null;
26
36
  defaultBranch: string;
37
+ /** Concurrent modifications or collisions detected for modified files. */
38
+ collisions?: FileCollision[];
39
+ collisionWarning?: string;
27
40
  }
28
41
  /** Aggregate workspace status. */
29
42
  export interface WorkspaceStatusReport {
@@ -34,6 +47,10 @@ export interface WorkspaceStatusReport {
34
47
  allClean: boolean;
35
48
  /** True when every repo is pushed (ahead === 0). A never-pushed branch counts as NOT pushed. */
36
49
  allPushed: boolean;
50
+ /** True when file collisions or concurrent modifications are detected. */
51
+ hasCollisions?: boolean;
52
+ /** Actionable warning advising coordination when concurrent changes occur. */
53
+ collisionWarning?: string;
37
54
  }
38
55
  /**
39
56
  * Gathers branch, dirtiness, ahead/behind, and remote info for every repo in
@@ -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;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"}
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,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,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;IACtB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;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;IACnB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAgIhC"}
@@ -26,6 +26,78 @@ export async function getWorkspaceStatusReport(workspacePath) {
26
26
  .then((result) => result.stdout.trim())
27
27
  .catch(() => null),
28
28
  ]);
29
+ const collisions = [];
30
+ const trackedDirtyFiles = status.files.filter((f) => f.code !== '??');
31
+ if (trackedDirtyFiles.length > 0) {
32
+ // 1. Identify merge/rebase conflict files immediately
33
+ const conflictFiles = trackedDirtyFiles.filter((f) => f.code.includes('U') || f.code === 'AA');
34
+ for (const cf of conflictFiles) {
35
+ collisions.push({
36
+ filePath: cf.path,
37
+ code: cf.code,
38
+ collisionHint: `File "${cf.path}" is in unresolved merge conflict state (${cf.code}). Coordinate with post_workroom_handoff or resolve conflict before continuing.`,
39
+ });
40
+ }
41
+ // 2. Identify collaborator commits landing on modified files
42
+ try {
43
+ const [userName, userEmail, recentCommitsOut] = await Promise.all([
44
+ execa('git', ['config', 'user.name'], { cwd: repo.path }).then((r) => r.stdout.trim()).catch(() => ''),
45
+ execa('git', ['config', 'user.email'], { cwd: repo.path }).then((r) => r.stdout.trim()).catch(() => ''),
46
+ execa('git', ['log', '-n', '10', '--format=%H|%an|%ae|%s|%cI'], { cwd: repo.path })
47
+ .then((r) => r.stdout.trim())
48
+ .catch(() => ''),
49
+ ]);
50
+ if (recentCommitsOut) {
51
+ const commits = recentCommitsOut.split('\n').filter(Boolean).map((line) => {
52
+ const [sha, authorName, authorEmail, subject, date] = line.split('|');
53
+ return {
54
+ sha: sha || '',
55
+ authorName: authorName || '',
56
+ authorEmail: authorEmail || '',
57
+ author: `${authorName || ''} <${authorEmail || ''}>`.trim(),
58
+ subject: subject || '',
59
+ date: date || '',
60
+ };
61
+ });
62
+ // Find commits authored by other collaborators
63
+ const collaboratorCommits = commits.filter((c) => {
64
+ if (userName && c.authorName && c.authorName !== userName)
65
+ return true;
66
+ if (userEmail && c.authorEmail && c.authorEmail !== userEmail)
67
+ return true;
68
+ return false;
69
+ });
70
+ if (collaboratorCommits.length > 0) {
71
+ const shas = collaboratorCommits.map((c) => c.sha);
72
+ const { stdout: touchedFilesOut } = await execa('git', ['diff-tree', '--no-commit-id', '--name-only', '-r', ...shas], { cwd: repo.path }).catch(() => ({ stdout: '' }));
73
+ const touchedSet = new Set(touchedFilesOut.split('\n').map((f) => f.trim()).filter(Boolean));
74
+ for (const file of trackedDirtyFiles) {
75
+ if (collisions.some((c) => c.filePath === file.path))
76
+ continue;
77
+ if (touchedSet.has(file.path)) {
78
+ const commit = collaboratorCommits.find((c) => c.sha);
79
+ collisions.push({
80
+ filePath: file.path,
81
+ code: file.code,
82
+ lastCommittedBy: commit?.author,
83
+ lastCommitSha: commit?.sha?.slice(0, 7),
84
+ lastCommitMessage: commit?.subject,
85
+ lastCommitDate: commit?.date,
86
+ collisionHint: `File "${file.path}" modified on disk was recently committed by collaborator ${commit?.author} ("${commit?.subject}"). Coordinate with post_workroom_handoff before editing.`,
87
+ });
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ catch {
94
+ // Graceful fallback if git queries fail
95
+ }
96
+ }
97
+ const authors = [...new Set(collisions.map((c) => c.lastCommittedBy).filter(Boolean))];
98
+ const collisionWarning = collisions.length > 0
99
+ ? `${collisions.length} modified file(s) collide with recent collaborator commits${authors.length > 0 ? ` (${authors.join(', ')})` : ''}. Use 'post_workroom_handoff' to coordinate before editing.`
100
+ : undefined;
29
101
  return {
30
102
  name: repo.name,
31
103
  path: repo.path,
@@ -39,12 +111,19 @@ export async function getWorkspaceStatusReport(workspacePath) {
39
111
  behind: aheadBehind.behind,
40
112
  remoteUrl,
41
113
  defaultBranch: repo.defaultBranch,
114
+ collisions: collisions.length > 0 ? collisions : undefined,
115
+ collisionWarning,
42
116
  };
43
117
  }));
44
118
  const branchName = repos[0]?.branchName ?? '';
45
119
  const allClean = reports.every((r) => !r.dirty);
46
120
  // `ahead === null` means the branch was never pushed, which is not "pushed".
47
121
  const allPushed = reports.every((r) => r.ahead === 0);
48
- return { workspacePath, branchName, repos: reports, allClean, allPushed };
122
+ const allCollisions = reports.flatMap((r) => r.collisions ?? []);
123
+ const hasCollisions = allCollisions.length > 0;
124
+ const collisionWarning = hasCollisions
125
+ ? `Concurrent file modifications detected on disk across ${reports.filter((r) => (r.collisions?.length ?? 0) > 0).length} repo(s). Use 'post_workroom_handoff' to coordinate before editing.`
126
+ : undefined;
127
+ return { workspacePath, branchName, repos: reports, allClean, allPushed, hasCollisions, collisionWarning };
49
128
  }
50
129
  //# sourceMappingURL=status.js.map
@@ -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;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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module core/verify
3
+ * Mechanical verification gate for repositories in a ContextSpace workspace.
4
+ *
5
+ * Runs detected or configured test commands, captures process exit codes,
6
+ * execution duration, stdout/stderr, and anchors validation proof to the Git
7
+ * HEAD commit SHA and working-tree clean status.
8
+ */
9
+ import type { RepoVerificationReport, WorkspaceVerificationReport } from '../types.js';
10
+ export interface VerifyCommandSpec {
11
+ command: string;
12
+ args: string[];
13
+ runner: string;
14
+ followingCommands?: VerifyCommandSpec[];
15
+ }
16
+ export interface VerifyRepoOptions {
17
+ filter?: string;
18
+ command?: string;
19
+ timeoutMs?: number;
20
+ env?: Record<string, string>;
21
+ allowDirty?: boolean;
22
+ }
23
+ export interface VerifyWorkspaceOptions extends VerifyRepoOptions {
24
+ repoName?: string;
25
+ tag?: string;
26
+ }
27
+ /**
28
+ * Detects the appropriate test command and runner for a repository path.
29
+ */
30
+ export declare function detectTestCommand(repoPath: string, preferredCommand?: string): Promise<VerifyCommandSpec | null>;
31
+ /**
32
+ * Runs mechanical verification for a single repository.
33
+ */
34
+ export declare function verifyRepo(repoPath: string, repoName: string, options?: VerifyRepoOptions): Promise<RepoVerificationReport>;
35
+ /**
36
+ * Runs mechanical verification for an entire workspace.
37
+ */
38
+ export declare function verifyWorkspace(workspacePath: string, options?: VerifyWorkspaceOptions): Promise<WorkspaceVerificationReport>;
39
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,sBAAsB,EAEtB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+DD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAwFnC;AAkDD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAoHjC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CAyEtC"}