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,157 @@
|
|
|
1
|
+
import * as lockfile from "proper-lockfile";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
const DEFAULT_LOCK_OPTIONS = {
|
|
5
|
+
retries: 5,
|
|
6
|
+
stale: 10000, // 10 seconds
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Execute a function with exclusive file lock
|
|
10
|
+
*/
|
|
11
|
+
export async function withFileLock(filePath, fn, options = {}) {
|
|
12
|
+
const opts = { ...DEFAULT_LOCK_OPTIONS, ...options };
|
|
13
|
+
// Ensure the file exists before locking
|
|
14
|
+
if (!fs.existsSync(filePath)) {
|
|
15
|
+
const dir = path.dirname(filePath);
|
|
16
|
+
if (!fs.existsSync(dir)) {
|
|
17
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
fs.writeFileSync(filePath, "", "utf-8");
|
|
20
|
+
}
|
|
21
|
+
let release;
|
|
22
|
+
try {
|
|
23
|
+
release = await lockfile.lock(filePath, {
|
|
24
|
+
retries: {
|
|
25
|
+
retries: opts.retries,
|
|
26
|
+
minTimeout: 50,
|
|
27
|
+
maxTimeout: 200,
|
|
28
|
+
randomize: true,
|
|
29
|
+
},
|
|
30
|
+
stale: opts.stale,
|
|
31
|
+
});
|
|
32
|
+
return await fn();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
if (release) {
|
|
36
|
+
await release();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read a file with locking
|
|
42
|
+
*/
|
|
43
|
+
export async function readFileWithLock(filePath, options = {}) {
|
|
44
|
+
return withFileLock(filePath, () => {
|
|
45
|
+
if (!fs.existsSync(filePath)) {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
49
|
+
}, options);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Write a file with locking
|
|
53
|
+
*/
|
|
54
|
+
export async function writeFileWithLock(filePath, content, options = {}) {
|
|
55
|
+
return withFileLock(filePath, () => {
|
|
56
|
+
const dir = path.dirname(filePath);
|
|
57
|
+
if (!fs.existsSync(dir)) {
|
|
58
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
61
|
+
}, options);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Append to a file with locking
|
|
65
|
+
*/
|
|
66
|
+
export async function appendFileWithLock(filePath, content, options = {}) {
|
|
67
|
+
return withFileLock(filePath, () => {
|
|
68
|
+
const dir = path.dirname(filePath);
|
|
69
|
+
if (!fs.existsSync(dir)) {
|
|
70
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
fs.appendFileSync(filePath, content, "utf-8");
|
|
73
|
+
}, options);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read and parse JSON with locking, with safe fallback on parse error
|
|
77
|
+
*/
|
|
78
|
+
export async function readJsonWithLock(filePath, defaultValue, options = {}) {
|
|
79
|
+
return withFileLock(filePath, () => {
|
|
80
|
+
if (!fs.existsSync(filePath)) {
|
|
81
|
+
return defaultValue;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
85
|
+
if (!content.trim()) {
|
|
86
|
+
return defaultValue;
|
|
87
|
+
}
|
|
88
|
+
return JSON.parse(content);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Log the error but return default value to prevent cascading failures
|
|
92
|
+
console.error(`Failed to parse JSON from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
return defaultValue;
|
|
94
|
+
}
|
|
95
|
+
}, options);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Write JSON with locking
|
|
99
|
+
*/
|
|
100
|
+
export async function writeJsonWithLock(filePath, data, options = {}) {
|
|
101
|
+
return withFileLock(filePath, () => {
|
|
102
|
+
const dir = path.dirname(filePath);
|
|
103
|
+
if (!fs.existsSync(dir)) {
|
|
104
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
107
|
+
}, options);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Atomic read-modify-write operation with locking
|
|
111
|
+
*/
|
|
112
|
+
export async function modifyJsonWithLock(filePath, modifier, options = {}) {
|
|
113
|
+
return withFileLock(filePath, () => {
|
|
114
|
+
let current = null;
|
|
115
|
+
if (fs.existsSync(filePath)) {
|
|
116
|
+
try {
|
|
117
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
118
|
+
if (content.trim()) {
|
|
119
|
+
current = JSON.parse(content);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error(`Failed to parse JSON for modification: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const updated = modifier(current);
|
|
127
|
+
const dir = path.dirname(filePath);
|
|
128
|
+
if (!fs.existsSync(dir)) {
|
|
129
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
130
|
+
}
|
|
131
|
+
fs.writeFileSync(filePath, JSON.stringify(updated, null, 2), "utf-8");
|
|
132
|
+
return updated;
|
|
133
|
+
}, options);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Escape shell string to prevent command injection
|
|
137
|
+
* Escapes single quotes, backticks, and $() constructs
|
|
138
|
+
*/
|
|
139
|
+
export function escapeShellString(str) {
|
|
140
|
+
// Replace problematic characters:
|
|
141
|
+
// - \ -> \\
|
|
142
|
+
// - ' -> '\''
|
|
143
|
+
// - ` -> \`
|
|
144
|
+
// - $ -> \$
|
|
145
|
+
// - " -> \"
|
|
146
|
+
// - ! -> \! (for bash history expansion)
|
|
147
|
+
// - newlines -> \n
|
|
148
|
+
return str
|
|
149
|
+
.replace(/\\/g, "\\\\")
|
|
150
|
+
.replace(/'/g, "'\\''")
|
|
151
|
+
.replace(/`/g, "\\`")
|
|
152
|
+
.replace(/\$/g, "\\$")
|
|
153
|
+
.replace(/"/g, '\\"')
|
|
154
|
+
.replace(/!/g, "\\!")
|
|
155
|
+
.replace(/\n/g, "\\n");
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=file-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|