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,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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}