nomoreide 0.1.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.
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>NoMoreIDE</title>
7
+ <script type="module" crossorigin src="/assets/index-Dy5kcoI8.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CvX1Rx-e.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,15 @@
1
+ export interface WebServerOptions {
2
+ configPath?: string;
3
+ cwd?: string;
4
+ logDir?: string;
5
+ port?: number;
6
+ }
7
+ export interface RunningWebServer {
8
+ url: string;
9
+ port: number;
10
+ stop(): Promise<void>;
11
+ }
12
+ export interface WebServerApp {
13
+ start(): Promise<RunningWebServer>;
14
+ }
15
+ export declare function createWebServer(options?: WebServerOptions): WebServerApp;
@@ -0,0 +1,321 @@
1
+ import http from "node:http";
2
+ import { readFile } from "node:fs/promises";
3
+ import { dirname, extname, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { ConfigStore } from "../core/config-store.js";
6
+ import { GitManager } from "../core/git-manager.js";
7
+ import { LogStore } from "../core/log-store.js";
8
+ import { ProcessManager } from "../core/process-manager.js";
9
+ export function createWebServer(options = {}) {
10
+ const configStore = new ConfigStore(options.configPath ?? resolve(process.cwd(), "nomoreide.config.json"));
11
+ const logStore = new LogStore({
12
+ baseDir: options.logDir ?? resolve(process.cwd(), ".nomoreide/logs"),
13
+ });
14
+ const manager = new ProcessManager({ configStore, logStore });
15
+ const cwd = options.cwd ?? process.cwd();
16
+ return {
17
+ async start() {
18
+ const server = http.createServer((request, response) => {
19
+ void routeRequest({
20
+ request,
21
+ response,
22
+ configStore,
23
+ logStore,
24
+ manager,
25
+ cwd,
26
+ });
27
+ });
28
+ const port = options.port ?? 4317;
29
+ await new Promise((resolveListen, rejectListen) => {
30
+ server.once("error", rejectListen);
31
+ server.listen(port, "127.0.0.1", () => resolveListen());
32
+ });
33
+ const address = server.address();
34
+ const actualPort = typeof address === "object" && address ? address.port : port;
35
+ return {
36
+ port: actualPort,
37
+ url: `http://127.0.0.1:${actualPort}`,
38
+ async stop() {
39
+ await manager.stopAll();
40
+ await new Promise((resolveClose, rejectClose) => {
41
+ server.close((error) => {
42
+ if (error) {
43
+ rejectClose(error);
44
+ return;
45
+ }
46
+ resolveClose();
47
+ });
48
+ });
49
+ },
50
+ };
51
+ },
52
+ };
53
+ }
54
+ async function routeRequest(options) {
55
+ const { request, response, configStore, cwd, logStore, manager } = options;
56
+ const url = new URL(request.url ?? "/", "http://127.0.0.1");
57
+ try {
58
+ if (request.method === "HEAD" && (url.pathname === "/" || url.pathname === "/git")) {
59
+ sendHead(response, "text/html; charset=utf-8");
60
+ return;
61
+ }
62
+ if (request.method === "GET" && url.pathname === "/api/dashboard") {
63
+ sendJson(response, await buildDashboardPayload({ configStore, cwd, logStore, manager }));
64
+ return;
65
+ }
66
+ if (request.method === "GET" && url.pathname === "/api/git/diff") {
67
+ const config = await configStore.load();
68
+ const selectedGitRepository = getSelectedGitRepository(config);
69
+ const gitCwd = selectedGitRepository?.path ?? cwd;
70
+ const selectedFile = url.searchParams.get("file")?.trim();
71
+ if (!selectedFile) {
72
+ sendJson(response, { ok: false, error: "file is required" }, 400);
73
+ return;
74
+ }
75
+ const diff = await readGitDiff(gitCwd, selectedFile);
76
+ if (diff === undefined) {
77
+ sendJson(response, { ok: false, error: "No changes or file not found." }, 404);
78
+ return;
79
+ }
80
+ sendText(response, diff);
81
+ return;
82
+ }
83
+ if (request.method === "GET" && url.pathname === "/api/status") {
84
+ sendJson(response, { ok: true, status: manager.status() });
85
+ return;
86
+ }
87
+ if (request.method === "POST" && url.pathname === "/api/services") {
88
+ const form = await readForm(request);
89
+ const portValue = form.get("port")?.trim();
90
+ const config = await configStore.registerService({
91
+ name: requiredFormValue(form, "name"),
92
+ command: requiredFormValue(form, "command"),
93
+ cwd: requiredFormValue(form, "cwd"),
94
+ port: portValue ? Number(portValue) : undefined,
95
+ description: optionalFormValue(form, "description"),
96
+ });
97
+ sendJson(response, { ok: true, config });
98
+ return;
99
+ }
100
+ if (request.method === "POST" && url.pathname === "/api/bundles") {
101
+ const form = await readForm(request);
102
+ const services = requiredFormValue(form, "services")
103
+ .split(",")
104
+ .map((service) => service.trim())
105
+ .filter(Boolean);
106
+ const config = await configStore.registerBundle({
107
+ name: requiredFormValue(form, "name"),
108
+ services,
109
+ });
110
+ sendJson(response, { ok: true, config });
111
+ return;
112
+ }
113
+ if (request.method === "POST" && url.pathname === "/api/git/repositories") {
114
+ const form = await readForm(request);
115
+ const config = await configStore.registerGitRepository({
116
+ name: requiredFormValue(form, "name"),
117
+ path: requiredFormValue(form, "path"),
118
+ });
119
+ sendJson(response, { ok: true, config });
120
+ return;
121
+ }
122
+ if (request.method === "POST" && url.pathname === "/api/git/select") {
123
+ const form = await readForm(request);
124
+ const config = await configStore.selectGitRepository(requiredFormValue(form, "name"));
125
+ sendJson(response, { ok: true, config });
126
+ return;
127
+ }
128
+ const serviceMatch = url.pathname.match(/^\/api\/services\/([^/]+)\/(start|stop|restart|logs)$/);
129
+ if (serviceMatch) {
130
+ const [, encodedName, action] = serviceMatch;
131
+ const name = decodeURIComponent(encodedName);
132
+ if (request.method === "GET" && action === "logs") {
133
+ sendJson(response, { ok: true, logs: logStore.read(name, 200) });
134
+ return;
135
+ }
136
+ if (request.method !== "POST") {
137
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
138
+ return;
139
+ }
140
+ const status = action === "start"
141
+ ? await manager.startService(name)
142
+ : action === "stop"
143
+ ? await manager.stopService(name)
144
+ : await manager.restartService(name);
145
+ sendJson(response, { ok: true, status });
146
+ return;
147
+ }
148
+ const bundleMatch = url.pathname.match(/^\/api\/bundles\/([^/]+)\/(start|stop)$/);
149
+ if (bundleMatch) {
150
+ if (request.method !== "POST") {
151
+ sendJson(response, { ok: false, error: "Method not allowed" }, 405);
152
+ return;
153
+ }
154
+ const [, encodedName, action] = bundleMatch;
155
+ const name = decodeURIComponent(encodedName);
156
+ const statuses = action === "start"
157
+ ? await manager.startBundle(name)
158
+ : await manager.stopBundle(name);
159
+ sendJson(response, { ok: true, statuses });
160
+ return;
161
+ }
162
+ if (request.method === "GET" && url.pathname.startsWith("/assets/")) {
163
+ if (await sendStaticAsset(response, url.pathname)) {
164
+ return;
165
+ }
166
+ }
167
+ if (request.method === "GET" && (url.pathname === "/" || url.pathname === "/git")) {
168
+ sendHtml(response, await readWebAppShell());
169
+ return;
170
+ }
171
+ sendHtml(response, "Not found", 404);
172
+ }
173
+ catch (error) {
174
+ sendJson(response, { ok: false, error: error instanceof Error ? error.message : String(error) }, 500);
175
+ }
176
+ }
177
+ async function buildDashboardPayload(options) {
178
+ const config = await options.configStore.load();
179
+ const firstService = config.services[0]?.name;
180
+ const selectedGitRepository = getSelectedGitRepository(config);
181
+ const gitCwd = selectedGitRepository?.path ?? options.cwd;
182
+ const gitStatus = await readGitStatus(gitCwd);
183
+ return {
184
+ ok: true,
185
+ cwd: options.cwd,
186
+ config,
187
+ runtime: options.manager.status(),
188
+ logs: firstService ? options.logStore.read(firstService, 80) : [],
189
+ git: {
190
+ cwd: gitCwd,
191
+ selectedRepository: selectedGitRepository ?? null,
192
+ status: gitStatus ?? null,
193
+ error: gitStatus ? undefined : `Not a Git repository: ${gitCwd}`,
194
+ },
195
+ };
196
+ }
197
+ async function readWebAppShell() {
198
+ for (const path of webAppShellCandidates()) {
199
+ try {
200
+ return await readFile(path, "utf8");
201
+ }
202
+ catch {
203
+ // Try the next candidate; source index keeps tests and dev fallback readable.
204
+ }
205
+ }
206
+ throw new Error("React web app shell was not found. Run npm run build.");
207
+ }
208
+ async function sendStaticAsset(response, requestPath) {
209
+ const relativePath = requestPath.replace(/^\/+/, "");
210
+ for (const root of webAssetRoots()) {
211
+ const assetPath = resolve(root, relativePath);
212
+ if (!assetPath.startsWith(root)) {
213
+ continue;
214
+ }
215
+ try {
216
+ const asset = await readFile(assetPath);
217
+ response.writeHead(200, {
218
+ "content-type": contentTypeFor(assetPath),
219
+ });
220
+ response.end(asset);
221
+ return true;
222
+ }
223
+ catch {
224
+ // Try the next asset root.
225
+ }
226
+ }
227
+ return false;
228
+ }
229
+ function webAppShellCandidates() {
230
+ const here = dirname(fileURLToPath(import.meta.url));
231
+ return [
232
+ resolve(here, "../../dist/web/client/index.html"),
233
+ resolve(here, "client/index.html"),
234
+ resolve(here, "../../src/web/client/index.html"),
235
+ ];
236
+ }
237
+ function webAssetRoots() {
238
+ const here = dirname(fileURLToPath(import.meta.url));
239
+ return [
240
+ resolve(here, "client"),
241
+ resolve(here, "../../dist/web/client"),
242
+ ];
243
+ }
244
+ function contentTypeFor(path) {
245
+ switch (extname(path)) {
246
+ case ".css":
247
+ return "text/css; charset=utf-8";
248
+ case ".js":
249
+ return "text/javascript; charset=utf-8";
250
+ case ".svg":
251
+ return "image/svg+xml";
252
+ case ".png":
253
+ return "image/png";
254
+ case ".woff2":
255
+ return "font/woff2";
256
+ default:
257
+ return "application/octet-stream";
258
+ }
259
+ }
260
+ function getSelectedGitRepository(config) {
261
+ return (config.gitRepositories.find((repository) => repository.name === config.selectedGitRepository) ?? config.gitRepositories[0]);
262
+ }
263
+ async function readGitStatus(cwd) {
264
+ try {
265
+ return await new GitManager(cwd).status();
266
+ }
267
+ catch {
268
+ return undefined;
269
+ }
270
+ }
271
+ async function readGitDiff(cwd, path) {
272
+ try {
273
+ return await new GitManager(cwd).diff(path);
274
+ }
275
+ catch {
276
+ return undefined;
277
+ }
278
+ }
279
+ function sendHtml(response, html, status = 200) {
280
+ response.writeHead(status, {
281
+ "content-type": "text/html; charset=utf-8",
282
+ });
283
+ response.end(html);
284
+ }
285
+ function sendText(response, text, status = 200) {
286
+ response.writeHead(status, {
287
+ "content-type": "text/plain; charset=utf-8",
288
+ });
289
+ response.end(text);
290
+ }
291
+ function sendHead(response, contentType, status = 200) {
292
+ response.writeHead(status, {
293
+ "content-type": contentType,
294
+ });
295
+ response.end();
296
+ }
297
+ function sendJson(response, data, status = 200) {
298
+ response.writeHead(status, {
299
+ "content-type": "application/json; charset=utf-8",
300
+ });
301
+ response.end(JSON.stringify(data));
302
+ }
303
+ async function readForm(request) {
304
+ const chunks = [];
305
+ for await (const chunk of request) {
306
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
307
+ }
308
+ return new URLSearchParams(Buffer.concat(chunks).toString("utf8"));
309
+ }
310
+ function requiredFormValue(form, key) {
311
+ const value = form.get(key)?.trim();
312
+ if (!value) {
313
+ throw new Error(`${key} is required`);
314
+ }
315
+ return value;
316
+ }
317
+ function optionalFormValue(form, key) {
318
+ const value = form.get(key)?.trim();
319
+ return value || undefined;
320
+ }
321
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "nomoreide",
3
+ "version": "0.1.0",
4
+ "description": "An AI-native terminal workbench for services, Git review, logs, and MCP workflows.",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "ai",
8
+ "terminal",
9
+ "mcp",
10
+ "git",
11
+ "developer-tools"
12
+ ],
13
+ "type": "module",
14
+ "bin": {
15
+ "nomoreide": "dist/index.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "vite build && tsc -p tsconfig.json",
23
+ "dev": "tsx src/index.ts",
24
+ "dev:web": "vite --host 127.0.0.1",
25
+ "test": "vitest run"
26
+ },
27
+ "dependencies": {
28
+ "@tailwindcss/vite": "^4.3.0",
29
+ "@types/react": "^19.2.14",
30
+ "@types/react-dom": "^19.2.3",
31
+ "@vitejs/plugin-react": "^5.2.0",
32
+ "class-variance-authority": "^0.7.1",
33
+ "clsx": "^2.1.1",
34
+ "fastmcp": "^3.0.0",
35
+ "lucide-react": "^1.16.0",
36
+ "react": "^19.2.6",
37
+ "react-dom": "^19.2.6",
38
+ "tailwind-merge": "^3.6.0",
39
+ "tailwindcss": "^4.3.0",
40
+ "vite": "^7.3.3",
41
+ "zod": "^3.25.76"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^22.15.19",
45
+ "tsx": "^4.19.4",
46
+ "typescript": "^5.8.3",
47
+ "vitest": "^3.1.4"
48
+ },
49
+ "engines": {
50
+ "node": ">=20.0.0"
51
+ }
52
+ }