nightshift-mcp 1.0.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 (74) hide show
  1. package/README.md +670 -0
  2. package/dist/agent-spawner.d.ts +55 -0
  3. package/dist/agent-spawner.d.ts.map +1 -0
  4. package/dist/agent-spawner.js +468 -0
  5. package/dist/agent-spawner.js.map +1 -0
  6. package/dist/chat-manager.d.ts +72 -0
  7. package/dist/chat-manager.d.ts.map +1 -0
  8. package/dist/chat-manager.js +331 -0
  9. package/dist/chat-manager.js.map +1 -0
  10. package/dist/daemon.d.ts +65 -0
  11. package/dist/daemon.d.ts.map +1 -0
  12. package/dist/daemon.js +563 -0
  13. package/dist/daemon.js.map +1 -0
  14. package/dist/file-lock.d.ts +41 -0
  15. package/dist/file-lock.d.ts.map +1 -0
  16. package/dist/file-lock.js +157 -0
  17. package/dist/file-lock.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +2433 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/ralph-manager.d.ts +148 -0
  23. package/dist/ralph-manager.d.ts.map +1 -0
  24. package/dist/ralph-manager.js +399 -0
  25. package/dist/ralph-manager.js.map +1 -0
  26. package/dist/tool-registry.d.ts +130 -0
  27. package/dist/tool-registry.d.ts.map +1 -0
  28. package/dist/tool-registry.js +280 -0
  29. package/dist/tool-registry.js.map +1 -0
  30. package/dist/tools/agents.d.ts +7 -0
  31. package/dist/tools/agents.d.ts.map +1 -0
  32. package/dist/tools/agents.js +366 -0
  33. package/dist/tools/agents.js.map +1 -0
  34. package/dist/tools/bugs.d.ts +6 -0
  35. package/dist/tools/bugs.d.ts.map +1 -0
  36. package/dist/tools/bugs.js +184 -0
  37. package/dist/tools/bugs.js.map +1 -0
  38. package/dist/tools/chat.d.ts +10 -0
  39. package/dist/tools/chat.d.ts.map +1 -0
  40. package/dist/tools/chat.js +287 -0
  41. package/dist/tools/chat.js.map +1 -0
  42. package/dist/tools/index.d.ts +33 -0
  43. package/dist/tools/index.d.ts.map +1 -0
  44. package/dist/tools/index.js +51 -0
  45. package/dist/tools/index.js.map +1 -0
  46. package/dist/tools/prd.d.ts +8 -0
  47. package/dist/tools/prd.d.ts.map +1 -0
  48. package/dist/tools/prd.js +275 -0
  49. package/dist/tools/prd.js.map +1 -0
  50. package/dist/tools/progress.d.ts +5 -0
  51. package/dist/tools/progress.d.ts.map +1 -0
  52. package/dist/tools/progress.js +81 -0
  53. package/dist/tools/progress.js.map +1 -0
  54. package/dist/tools/savepoints.d.ts +5 -0
  55. package/dist/tools/savepoints.d.ts.map +1 -0
  56. package/dist/tools/savepoints.js +100 -0
  57. package/dist/tools/savepoints.js.map +1 -0
  58. package/dist/tools/utility.d.ts +4 -0
  59. package/dist/tools/utility.d.ts.map +1 -0
  60. package/dist/tools/utility.js +375 -0
  61. package/dist/tools/utility.js.map +1 -0
  62. package/dist/tools/workflow.d.ts +10 -0
  63. package/dist/tools/workflow.d.ts.map +1 -0
  64. package/dist/tools/workflow.js +321 -0
  65. package/dist/tools/workflow.js.map +1 -0
  66. package/dist/types.d.ts +105 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/workflow-manager.d.ts +154 -0
  71. package/dist/workflow-manager.d.ts.map +1 -0
  72. package/dist/workflow-manager.js +356 -0
  73. package/dist/workflow-manager.js.map +1 -0
  74. package/package.json +48 -0
@@ -0,0 +1,356 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { modifyJsonWithLock, readJsonWithLock } from "./file-lock.js";
4
+ /**
5
+ * Manages workflow state for multi-agent coordination
6
+ */
7
+ export class WorkflowManager {
8
+ projectPath;
9
+ workflowFile;
10
+ constructor(projectPath) {
11
+ this.projectPath = projectPath;
12
+ // Store in .robot-chat directory alongside chat.txt
13
+ const robotChatDir = path.join(projectPath, ".robot-chat");
14
+ if (!fs.existsSync(robotChatDir)) {
15
+ fs.mkdirSync(robotChatDir, { recursive: true });
16
+ }
17
+ this.workflowFile = path.join(robotChatDir, "workflow.json");
18
+ }
19
+ /**
20
+ * Check if workflow file exists
21
+ */
22
+ hasWorkflow() {
23
+ return fs.existsSync(this.workflowFile);
24
+ }
25
+ /**
26
+ * Initialize a new workflow
27
+ */
28
+ async initWorkflow(projectGoal, phases) {
29
+ const defaultPhases = phases || [
30
+ "research",
31
+ "decisions",
32
+ "planning",
33
+ "build",
34
+ "test",
35
+ "report",
36
+ ];
37
+ const state = {
38
+ projectGoal,
39
+ currentPhase: defaultPhases[0],
40
+ phases: defaultPhases.map((name, index) => ({
41
+ name,
42
+ status: index === 0 ? "in_progress" : "pending",
43
+ startedAt: index === 0 ? new Date().toISOString() : undefined,
44
+ })),
45
+ assignments: {},
46
+ decisions: [],
47
+ lastUpdated: new Date().toISOString(),
48
+ };
49
+ await this.writeWorkflow(state);
50
+ return state;
51
+ }
52
+ /**
53
+ * Read workflow state (async with locking)
54
+ */
55
+ async readWorkflowAsync() {
56
+ if (!this.hasWorkflow()) {
57
+ return null;
58
+ }
59
+ return readJsonWithLock(this.workflowFile, null);
60
+ }
61
+ /**
62
+ * Read workflow state (sync - use for non-critical reads)
63
+ */
64
+ readWorkflow() {
65
+ if (!this.hasWorkflow()) {
66
+ return null;
67
+ }
68
+ try {
69
+ const content = fs.readFileSync(this.workflowFile, "utf-8");
70
+ return JSON.parse(content);
71
+ }
72
+ catch (error) {
73
+ console.error(`Failed to parse workflow: ${error instanceof Error ? error.message : String(error)}`);
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * Write workflow state (async with locking)
79
+ */
80
+ async writeWorkflow(state) {
81
+ state.lastUpdated = new Date().toISOString();
82
+ const dir = path.dirname(this.workflowFile);
83
+ if (!fs.existsSync(dir)) {
84
+ fs.mkdirSync(dir, { recursive: true });
85
+ }
86
+ fs.writeFileSync(this.workflowFile, JSON.stringify(state, null, 2), "utf-8");
87
+ }
88
+ /**
89
+ * Get current phase
90
+ */
91
+ getCurrentPhase() {
92
+ const state = this.readWorkflow();
93
+ return state?.currentPhase || null;
94
+ }
95
+ /**
96
+ * Advance to next phase (async with atomic operation)
97
+ */
98
+ async advancePhase() {
99
+ if (!this.hasWorkflow()) {
100
+ return null;
101
+ }
102
+ let result = null;
103
+ await modifyJsonWithLock(this.workflowFile, (state) => {
104
+ if (!state) {
105
+ return state;
106
+ }
107
+ const currentIndex = state.phases.findIndex((p) => p.name === state.currentPhase);
108
+ if (currentIndex === -1 || currentIndex >= state.phases.length - 1) {
109
+ // Already at last phase or phase not found
110
+ return state;
111
+ }
112
+ const previousPhase = state.currentPhase;
113
+ // Mark current phase as completed
114
+ state.phases[currentIndex].status = "completed";
115
+ state.phases[currentIndex].completedAt = new Date().toISOString();
116
+ // Move to next phase
117
+ const nextPhase = state.phases[currentIndex + 1];
118
+ nextPhase.status = "in_progress";
119
+ nextPhase.startedAt = new Date().toISOString();
120
+ state.currentPhase = nextPhase.name;
121
+ result = { previousPhase, newPhase: nextPhase.name };
122
+ return state;
123
+ });
124
+ return result;
125
+ }
126
+ /**
127
+ * Set phase directly (for manual control) - async with atomic operation
128
+ */
129
+ async setPhase(phase) {
130
+ if (!this.hasWorkflow()) {
131
+ return false;
132
+ }
133
+ let success = false;
134
+ await modifyJsonWithLock(this.workflowFile, (state) => {
135
+ if (!state) {
136
+ return state;
137
+ }
138
+ const phaseIndex = state.phases.findIndex((p) => p.name === phase);
139
+ if (phaseIndex === -1) {
140
+ return state;
141
+ }
142
+ // Mark all previous phases as completed
143
+ for (let i = 0; i < phaseIndex; i++) {
144
+ if (state.phases[i].status !== "completed") {
145
+ state.phases[i].status = "completed";
146
+ state.phases[i].completedAt = new Date().toISOString();
147
+ }
148
+ }
149
+ // Set target phase as in_progress
150
+ state.phases[phaseIndex].status = "in_progress";
151
+ state.phases[phaseIndex].startedAt =
152
+ state.phases[phaseIndex].startedAt || new Date().toISOString();
153
+ state.currentPhase = phase;
154
+ // Mark subsequent phases as pending
155
+ for (let i = phaseIndex + 1; i < state.phases.length; i++) {
156
+ state.phases[i].status = "pending";
157
+ state.phases[i].startedAt = undefined;
158
+ state.phases[i].completedAt = undefined;
159
+ }
160
+ success = true;
161
+ return state;
162
+ });
163
+ return success;
164
+ }
165
+ /**
166
+ * Check if a story is currently assigned
167
+ */
168
+ isStoryAssigned(storyId) {
169
+ const state = this.readWorkflow();
170
+ if (!state)
171
+ return null;
172
+ const assignment = state.assignments[storyId];
173
+ if (assignment && assignment.status === "in_progress") {
174
+ return assignment;
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Assign a story to an agent - atomic operation to prevent race conditions
180
+ * NO AUTO-INITIALIZATION: Workflow must be initialized first with init_workflow
181
+ */
182
+ async assignStory(storyId, agent) {
183
+ if (!this.hasWorkflow()) {
184
+ return {
185
+ success: false,
186
+ error: "No workflow initialized. Use init_workflow first.",
187
+ };
188
+ }
189
+ let result = { success: false };
190
+ await modifyJsonWithLock(this.workflowFile, (state) => {
191
+ if (!state) {
192
+ result = {
193
+ success: false,
194
+ error: "Workflow state is empty or corrupted.",
195
+ };
196
+ return state;
197
+ }
198
+ // Check if already assigned to someone else
199
+ const existing = state.assignments[storyId];
200
+ if (existing &&
201
+ existing.status === "in_progress" &&
202
+ existing.agent !== agent) {
203
+ result = {
204
+ success: false,
205
+ error: `Story already assigned to ${existing.agent}`,
206
+ existingAgent: existing.agent,
207
+ };
208
+ return state; // Don't modify
209
+ }
210
+ // Assign the story
211
+ state.assignments[storyId] = {
212
+ agent,
213
+ status: "in_progress",
214
+ claimedAt: new Date().toISOString(),
215
+ };
216
+ result = { success: true };
217
+ return state;
218
+ });
219
+ return result;
220
+ }
221
+ /**
222
+ * Mark a story assignment as completed (async with atomic operation)
223
+ */
224
+ async completeAssignment(storyId) {
225
+ if (!this.hasWorkflow()) {
226
+ return false;
227
+ }
228
+ let success = false;
229
+ await modifyJsonWithLock(this.workflowFile, (state) => {
230
+ if (!state) {
231
+ return state;
232
+ }
233
+ const assignment = state.assignments[storyId];
234
+ if (!assignment) {
235
+ return state;
236
+ }
237
+ assignment.status = "completed";
238
+ assignment.completedAt = new Date().toISOString();
239
+ success = true;
240
+ return state;
241
+ });
242
+ return success;
243
+ }
244
+ /**
245
+ * Clear a story assignment (for abandonment/failover) - async with atomic operation
246
+ */
247
+ async clearAssignment(storyId) {
248
+ if (!this.hasWorkflow()) {
249
+ return false;
250
+ }
251
+ let success = false;
252
+ await modifyJsonWithLock(this.workflowFile, (state) => {
253
+ if (!state) {
254
+ return state;
255
+ }
256
+ if (state.assignments[storyId]) {
257
+ delete state.assignments[storyId];
258
+ success = true;
259
+ }
260
+ return state;
261
+ });
262
+ return success;
263
+ }
264
+ /**
265
+ * Get all active assignments
266
+ */
267
+ getActiveAssignments() {
268
+ const state = this.readWorkflow();
269
+ if (!state)
270
+ return {};
271
+ const active = {};
272
+ for (const [storyId, assignment] of Object.entries(state.assignments)) {
273
+ if (assignment.status === "in_progress") {
274
+ active[storyId] = assignment;
275
+ }
276
+ }
277
+ return active;
278
+ }
279
+ /**
280
+ * Record a decision - async with atomic operation
281
+ * NO AUTO-INITIALIZATION: Workflow must be initialized first with init_workflow
282
+ */
283
+ async recordDecision(topic, options, chosen, rationale, decidedBy) {
284
+ if (!this.hasWorkflow()) {
285
+ return null;
286
+ }
287
+ let decision = null;
288
+ await modifyJsonWithLock(this.workflowFile, (state) => {
289
+ if (!state) {
290
+ return state;
291
+ }
292
+ decision = {
293
+ id: `D-${String(state.decisions.length + 1).padStart(3, "0")}`,
294
+ topic,
295
+ options,
296
+ chosen,
297
+ rationale,
298
+ decidedBy,
299
+ decidedAt: new Date().toISOString(),
300
+ };
301
+ state.decisions.push(decision);
302
+ return state;
303
+ });
304
+ return decision;
305
+ }
306
+ /**
307
+ * Get all decisions
308
+ */
309
+ getDecisions() {
310
+ const state = this.readWorkflow();
311
+ return state?.decisions || [];
312
+ }
313
+ /**
314
+ * Get decisions by topic
315
+ */
316
+ getDecisionsByTopic(topic) {
317
+ const decisions = this.getDecisions();
318
+ return decisions.filter((d) => d.topic.toLowerCase().includes(topic.toLowerCase()));
319
+ }
320
+ /**
321
+ * Get workflow summary
322
+ */
323
+ getWorkflowSummary() {
324
+ const state = this.readWorkflow();
325
+ if (!state)
326
+ return null;
327
+ const completedPhases = state.phases.filter((p) => p.status === "completed").length;
328
+ const totalPhases = state.phases.length;
329
+ return {
330
+ projectGoal: state.projectGoal,
331
+ currentPhase: state.currentPhase,
332
+ phaseProgress: `${completedPhases}/${totalPhases} phases completed`,
333
+ activeAssignments: Object.values(state.assignments).filter((a) => a.status === "in_progress").length,
334
+ totalDecisions: state.decisions.length,
335
+ };
336
+ }
337
+ /**
338
+ * Get file path
339
+ */
340
+ getWorkflowPath() {
341
+ return this.workflowFile;
342
+ }
343
+ /**
344
+ * Check if a specific agent owns a story assignment
345
+ */
346
+ isAgentOwner(storyId, agent) {
347
+ const state = this.readWorkflow();
348
+ if (!state)
349
+ return false;
350
+ const assignment = state.assignments[storyId];
351
+ return (assignment !== undefined &&
352
+ assignment.status === "in_progress" &&
353
+ assignment.agent === agent);
354
+ }
355
+ }
356
+ //# sourceMappingURL=workflow-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.js","sourceRoot":"","sources":["../src/workflow-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "nightshift-mcp",
3
+ "version": "1.0.0",
4
+ "description": "The responsible kind of multi-agent chaos. Explicit delegation, review, and handoffs between AI models.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "nightshift-mcp": "./dist/index.js",
9
+ "nightshift-daemon": "./dist/daemon.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "prepare": "npm run build",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "ai-agents",
28
+ "multi-agent",
29
+ "claude",
30
+ "codex",
31
+ "gemini",
32
+ "vibe",
33
+ "orchestration",
34
+ "nightshift"
35
+ ],
36
+ "license": "MIT",
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.0.0",
39
+ "proper-lockfile": "^4.1.2",
40
+ "zod": "^3.25.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.0.0",
44
+ "@types/proper-lockfile": "^4.1.4",
45
+ "typescript": "^5.0.0",
46
+ "vitest": "^1.0.0"
47
+ }
48
+ }