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.
- package/README.md +670 -0
- package/dist/agent-spawner.d.ts +55 -0
- package/dist/agent-spawner.d.ts.map +1 -0
- package/dist/agent-spawner.js +468 -0
- package/dist/agent-spawner.js.map +1 -0
- package/dist/chat-manager.d.ts +72 -0
- package/dist/chat-manager.d.ts.map +1 -0
- package/dist/chat-manager.js +331 -0
- package/dist/chat-manager.js.map +1 -0
- package/dist/daemon.d.ts +65 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +563 -0
- package/dist/daemon.js.map +1 -0
- package/dist/file-lock.d.ts +41 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +157 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2433 -0
- package/dist/index.js.map +1 -0
- package/dist/ralph-manager.d.ts +148 -0
- package/dist/ralph-manager.d.ts.map +1 -0
- package/dist/ralph-manager.js +399 -0
- package/dist/ralph-manager.js.map +1 -0
- package/dist/tool-registry.d.ts +130 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +280 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/agents.d.ts +7 -0
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +366 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/bugs.d.ts +6 -0
- package/dist/tools/bugs.d.ts.map +1 -0
- package/dist/tools/bugs.js +184 -0
- package/dist/tools/bugs.js.map +1 -0
- package/dist/tools/chat.d.ts +10 -0
- package/dist/tools/chat.d.ts.map +1 -0
- package/dist/tools/chat.js +287 -0
- package/dist/tools/chat.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +51 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/prd.d.ts +8 -0
- package/dist/tools/prd.d.ts.map +1 -0
- package/dist/tools/prd.js +275 -0
- package/dist/tools/prd.js.map +1 -0
- package/dist/tools/progress.d.ts +5 -0
- package/dist/tools/progress.d.ts.map +1 -0
- package/dist/tools/progress.js +81 -0
- package/dist/tools/progress.js.map +1 -0
- package/dist/tools/savepoints.d.ts +5 -0
- package/dist/tools/savepoints.d.ts.map +1 -0
- package/dist/tools/savepoints.js +100 -0
- package/dist/tools/savepoints.js.map +1 -0
- package/dist/tools/utility.d.ts +4 -0
- package/dist/tools/utility.d.ts.map +1 -0
- package/dist/tools/utility.js +375 -0
- package/dist/tools/utility.js.map +1 -0
- package/dist/tools/workflow.d.ts +10 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +321 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/types.d.ts +105 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-manager.d.ts +154 -0
- package/dist/workflow-manager.d.ts.map +1 -0
- package/dist/workflow-manager.js +356 -0
- package/dist/workflow-manager.js.map +1 -0
- 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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAqEtE;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,CAAS;IACpB,YAAY,CAAS;IAEtC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,oDAAoD;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,WAAmB,EACnB,MAAwB;QAExB,MAAM,aAAa,GAAoB,MAAM,IAAI;YAC/C,UAAU;YACV,WAAW;YACX,UAAU;YACV,OAAO;YACP,MAAM;YACN,QAAQ;SACT,CAAC;QAEF,MAAM,KAAK,GAAkB;YAC3B,WAAW;YACX,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI;gBACJ,MAAM,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBAC/C,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;aAC9D,CAAC,CAAC;YACH,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,gBAAgB,CAAuB,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAoB;QACtC,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,eAAe;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAIhB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,GACR,IAAI,CAAC;QAEP,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,YAAY,CACrC,CAAC;YACF,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnE,2CAA2C;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC;YAEzC,kCAAkC;YAClC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC;YAChD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAElE,qBAAqB;YACrB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACjD,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC;YACjC,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC;YAEpC,MAAM,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACnE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,wCAAwC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC3C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC;oBACrC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC;YAChD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS;gBAChC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;YAE3B,oCAAoC;YACpC,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1D,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;gBACnC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC;gBACtC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC;YAC1C,CAAC;YAED,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,KAAa;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mDAAmD;aAC3D,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,GAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAElD,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,GAAG;oBACP,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,uCAAuC;iBAC/C,CAAC;gBACF,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5C,IACE,QAAQ;gBACR,QAAQ,CAAC,MAAM,KAAK,aAAa;gBACjC,QAAQ,CAAC,KAAK,KAAK,KAAK,EACxB,CAAC;gBACD,MAAM,GAAG;oBACP,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,6BAA6B,QAAQ,CAAC,KAAK,EAAE;oBACpD,aAAa,EAAE,QAAQ,CAAC,KAAK;iBAC9B,CAAC;gBACF,OAAO,KAAK,CAAC,CAAC,eAAe;YAC/B,CAAC;YAED,mBAAmB;YACnB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG;gBAC3B,KAAK;gBACL,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC;YAChC,UAAU,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAClD,OAAO,GAAG,IAAI,CAAC;YAEf,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAClC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAEtB,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACtE,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACxC,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,OAAiB,EACjB,MAAc,EACd,SAAiB,EACjB,SAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,GAAoB,IAAI,CAAC;QAErC,MAAM,kBAAkB,CACtB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAiC,CAAC;YAC3C,CAAC;YAED,QAAQ,GAAG;gBACT,EAAE,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAC9D,KAAK;gBACL,OAAO;gBACP,MAAM;gBACN,SAAS;gBACT,SAAS;gBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAa;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB;QAOhB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAChC,CAAC,MAAM,CAAC;QACT,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAExC,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,GAAG,eAAe,IAAI,WAAW,mBAAmB;YACnE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAClC,CAAC,MAAM;YACR,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe,EAAE,KAAa;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CACL,UAAU,KAAK,SAAS;YACxB,UAAU,CAAC,MAAM,KAAK,aAAa;YACnC,UAAU,CAAC,KAAK,KAAK,KAAK,CAC3B,CAAC;IACJ,CAAC;CACF"}
|
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
|
+
}
|