devglide 0.1.1

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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/bin/claude-md-template.js +94 -0
  4. package/bin/devglide.js +387 -0
  5. package/package.json +85 -0
  6. package/pnpm-workspace.yaml +3 -0
  7. package/src/apps/coder/.turbo/turbo-lint.log +5 -0
  8. package/src/apps/coder/package.json +16 -0
  9. package/src/apps/coder/public/favicon.svg +7 -0
  10. package/src/apps/coder/public/page.css +275 -0
  11. package/src/apps/coder/public/page.js +528 -0
  12. package/src/apps/coder/server.js +3 -0
  13. package/src/apps/documentation/public/page.css +597 -0
  14. package/src/apps/documentation/public/page.js +609 -0
  15. package/src/apps/kanban/.turbo/turbo-lint.log +97 -0
  16. package/src/apps/kanban/.turbo/turbo-typecheck.log +5 -0
  17. package/src/apps/kanban/package.json +32 -0
  18. package/src/apps/kanban/public/favicon.svg +7 -0
  19. package/src/apps/kanban/public/page.css +1010 -0
  20. package/src/apps/kanban/public/page.js +1730 -0
  21. package/src/apps/kanban/public/vendor/marked.min.js +6 -0
  22. package/src/apps/kanban/public/vendor/sortable.min.js +2 -0
  23. package/src/apps/kanban/src/db.ts +319 -0
  24. package/src/apps/kanban/src/index.ts +14 -0
  25. package/src/apps/kanban/src/mcp-helpers.test.ts +88 -0
  26. package/src/apps/kanban/src/mcp-helpers.ts +60 -0
  27. package/src/apps/kanban/src/mcp.ts +59 -0
  28. package/src/apps/kanban/src/routes/attachments.ts +161 -0
  29. package/src/apps/kanban/src/routes/features.ts +233 -0
  30. package/src/apps/kanban/src/routes/issues.ts +373 -0
  31. package/src/apps/kanban/src/tools/feature-tools.ts +164 -0
  32. package/src/apps/kanban/src/tools/item-tools.ts +307 -0
  33. package/src/apps/kanban/src/tools/versioned-entry-tools.ts +72 -0
  34. package/src/apps/kanban/tsconfig.check.json +9 -0
  35. package/src/apps/kanban/tsconfig.json +9 -0
  36. package/src/apps/keymap/.turbo/turbo-lint.log +5 -0
  37. package/src/apps/keymap/package.json +16 -0
  38. package/src/apps/keymap/public/page.css +275 -0
  39. package/src/apps/keymap/public/page.js +294 -0
  40. package/src/apps/keymap/server.js +25 -0
  41. package/src/apps/log/.turbo/turbo-build.log +5 -0
  42. package/src/apps/log/.turbo/turbo-lint.log +45 -0
  43. package/src/apps/log/.turbo/turbo-typecheck.log +5 -0
  44. package/src/apps/log/node_modules/.bin/tsc +21 -0
  45. package/src/apps/log/node_modules/.bin/tsserver +21 -0
  46. package/src/apps/log/node_modules/.bin/tsx +21 -0
  47. package/src/apps/log/package.json +36 -0
  48. package/src/apps/log/public/console-sniffer.js +221 -0
  49. package/src/apps/log/public/favicon.svg +7 -0
  50. package/src/apps/log/public/page.css +322 -0
  51. package/src/apps/log/public/page.js +463 -0
  52. package/src/apps/log/src/index.ts +9 -0
  53. package/src/apps/log/src/mcp.ts +122 -0
  54. package/src/apps/log/src/routes/log.ts +333 -0
  55. package/src/apps/log/src/routes/status.ts +25 -0
  56. package/src/apps/log/src/server-sniffer.ts +118 -0
  57. package/src/apps/log/src/services/file-patterns.ts +39 -0
  58. package/src/apps/log/src/services/file-tailer.ts +228 -0
  59. package/src/apps/log/src/services/line-parser.ts +94 -0
  60. package/src/apps/log/src/services/log-writer.ts +39 -0
  61. package/src/apps/log/tsconfig.json +8 -0
  62. package/src/apps/prompts/.turbo/turbo-build.log +5 -0
  63. package/src/apps/prompts/.turbo/turbo-lint.log +24 -0
  64. package/src/apps/prompts/.turbo/turbo-typecheck.log +5 -0
  65. package/src/apps/prompts/mcp.ts +175 -0
  66. package/src/apps/prompts/node_modules/.bin/tsc +21 -0
  67. package/src/apps/prompts/node_modules/.bin/tsserver +21 -0
  68. package/src/apps/prompts/node_modules/.bin/tsx +21 -0
  69. package/src/apps/prompts/package.json +25 -0
  70. package/src/apps/prompts/public/page.css +315 -0
  71. package/src/apps/prompts/public/page.js +541 -0
  72. package/src/apps/prompts/services/prompt-store.ts +212 -0
  73. package/src/apps/prompts/src/index.ts +9 -0
  74. package/src/apps/prompts/tsconfig.json +8 -0
  75. package/src/apps/prompts/types.ts +27 -0
  76. package/src/apps/shell/.turbo/turbo-build.log +5 -0
  77. package/src/apps/shell/.turbo/turbo-lint.log +34 -0
  78. package/src/apps/shell/.turbo/turbo-typecheck.log +5 -0
  79. package/src/apps/shell/package.json +35 -0
  80. package/src/apps/shell/public/favicon.svg +7 -0
  81. package/src/apps/shell/public/page.css +407 -0
  82. package/src/apps/shell/public/page.js +1577 -0
  83. package/src/apps/shell/src/index.ts +150 -0
  84. package/src/apps/shell/src/mcp.ts +398 -0
  85. package/src/apps/shell/src/shell-types.ts +41 -0
  86. package/src/apps/shell/tsconfig.json +8 -0
  87. package/src/apps/test/.turbo/turbo-build.log +5 -0
  88. package/src/apps/test/.turbo/turbo-lint.log +27 -0
  89. package/src/apps/test/.turbo/turbo-typecheck.log +5 -0
  90. package/src/apps/test/node_modules/.bin/tsc +21 -0
  91. package/src/apps/test/node_modules/.bin/tsserver +21 -0
  92. package/src/apps/test/node_modules/.bin/tsx +21 -0
  93. package/src/apps/test/node_modules/.bin/uuid +21 -0
  94. package/src/apps/test/package.json +35 -0
  95. package/src/apps/test/public/favicon.svg +7 -0
  96. package/src/apps/test/public/page.css +499 -0
  97. package/src/apps/test/public/page.js +417 -0
  98. package/src/apps/test/public/scenario-runner.js +450 -0
  99. package/src/apps/test/src/index.ts +9 -0
  100. package/src/apps/test/src/mcp.ts +192 -0
  101. package/src/apps/test/src/routes/trigger.ts +285 -0
  102. package/src/apps/test/src/services/scenario-broadcaster.ts +60 -0
  103. package/src/apps/test/src/services/scenario-manager.ts +361 -0
  104. package/src/apps/test/src/services/scenario-store.ts +145 -0
  105. package/src/apps/test/tsconfig.json +8 -0
  106. package/src/apps/vocabulary/.turbo/turbo-build.log +5 -0
  107. package/src/apps/vocabulary/.turbo/turbo-lint.log +25 -0
  108. package/src/apps/vocabulary/.turbo/turbo-typecheck.log +5 -0
  109. package/src/apps/vocabulary/mcp.ts +173 -0
  110. package/src/apps/vocabulary/node_modules/.bin/tsc +21 -0
  111. package/src/apps/vocabulary/node_modules/.bin/tsserver +21 -0
  112. package/src/apps/vocabulary/node_modules/.bin/tsx +21 -0
  113. package/src/apps/vocabulary/package.json +25 -0
  114. package/src/apps/vocabulary/public/page.css +247 -0
  115. package/src/apps/vocabulary/public/page.js +444 -0
  116. package/src/apps/vocabulary/services/vocabulary-store.ts +179 -0
  117. package/src/apps/vocabulary/src/index.ts +10 -0
  118. package/src/apps/vocabulary/tsconfig.json +8 -0
  119. package/src/apps/vocabulary/types.ts +22 -0
  120. package/src/apps/voice/.turbo/turbo-build.log +5 -0
  121. package/src/apps/voice/.turbo/turbo-lint.log +43 -0
  122. package/src/apps/voice/.turbo/turbo-typecheck.log +5 -0
  123. package/src/apps/voice/node_modules/.bin/openai +21 -0
  124. package/src/apps/voice/node_modules/.bin/tsc +21 -0
  125. package/src/apps/voice/node_modules/.bin/tsserver +21 -0
  126. package/src/apps/voice/node_modules/.bin/tsx +21 -0
  127. package/src/apps/voice/package.json +35 -0
  128. package/src/apps/voice/public/favicon.svg +7 -0
  129. package/src/apps/voice/public/page.css +388 -0
  130. package/src/apps/voice/public/page.js +718 -0
  131. package/src/apps/voice/src/index.ts +10 -0
  132. package/src/apps/voice/src/mcp.ts +70 -0
  133. package/src/apps/voice/src/providers/index.ts +85 -0
  134. package/src/apps/voice/src/providers/openai-compatible.ts +94 -0
  135. package/src/apps/voice/src/providers/types.ts +27 -0
  136. package/src/apps/voice/src/routes/config.ts +118 -0
  137. package/src/apps/voice/src/routes/transcribe.ts +90 -0
  138. package/src/apps/voice/src/services/config-store.ts +129 -0
  139. package/src/apps/voice/src/services/stats.ts +108 -0
  140. package/src/apps/voice/src/transcribe.ts +11 -0
  141. package/src/apps/voice/src/utils/mime.ts +16 -0
  142. package/src/apps/voice/tsconfig.json +8 -0
  143. package/src/apps/workflow/.turbo/turbo-build.log +5 -0
  144. package/src/apps/workflow/.turbo/turbo-lint.log +96 -0
  145. package/src/apps/workflow/.turbo/turbo-typecheck.log +5 -0
  146. package/src/apps/workflow/engine/executors/decision-executor.ts +87 -0
  147. package/src/apps/workflow/engine/executors/file-executor.ts +90 -0
  148. package/src/apps/workflow/engine/executors/git-executor.ts +137 -0
  149. package/src/apps/workflow/engine/executors/http-executor.ts +65 -0
  150. package/src/apps/workflow/engine/executors/index.ts +28 -0
  151. package/src/apps/workflow/engine/executors/kanban-executor.ts +154 -0
  152. package/src/apps/workflow/engine/executors/llm-executor.ts +46 -0
  153. package/src/apps/workflow/engine/executors/log-executor.ts +62 -0
  154. package/src/apps/workflow/engine/executors/loop-executor.ts +14 -0
  155. package/src/apps/workflow/engine/executors/shell-executor.ts +107 -0
  156. package/src/apps/workflow/engine/executors/sub-workflow-executor.ts +61 -0
  157. package/src/apps/workflow/engine/executors/test-executor.ts +73 -0
  158. package/src/apps/workflow/engine/executors/trigger-executor.ts +39 -0
  159. package/src/apps/workflow/engine/expression-evaluator.ts +117 -0
  160. package/src/apps/workflow/engine/graph-runner.ts +438 -0
  161. package/src/apps/workflow/engine/node-executor.ts +104 -0
  162. package/src/apps/workflow/engine/node-registry.ts +15 -0
  163. package/src/apps/workflow/engine/variable-resolver.ts +109 -0
  164. package/src/apps/workflow/mcp.ts +223 -0
  165. package/src/apps/workflow/node_modules/.bin/tsc +21 -0
  166. package/src/apps/workflow/node_modules/.bin/tsserver +21 -0
  167. package/src/apps/workflow/node_modules/.bin/tsx +21 -0
  168. package/src/apps/workflow/package.json +25 -0
  169. package/src/apps/workflow/public/editor/canvas.js +366 -0
  170. package/src/apps/workflow/public/editor/drag-manager.js +326 -0
  171. package/src/apps/workflow/public/editor/edge-renderer.js +235 -0
  172. package/src/apps/workflow/public/editor/history-manager.js +147 -0
  173. package/src/apps/workflow/public/editor/layout-engine.js +159 -0
  174. package/src/apps/workflow/public/editor/node-renderer.js +199 -0
  175. package/src/apps/workflow/public/editor/selection-manager.js +193 -0
  176. package/src/apps/workflow/public/favicon.svg +7 -0
  177. package/src/apps/workflow/public/models/node-types.js +300 -0
  178. package/src/apps/workflow/public/models/workflow-model.js +257 -0
  179. package/src/apps/workflow/public/page.css +406 -0
  180. package/src/apps/workflow/public/page.js +658 -0
  181. package/src/apps/workflow/public/panels/inspector.js +360 -0
  182. package/src/apps/workflow/public/panels/palette.js +106 -0
  183. package/src/apps/workflow/public/panels/run-view.js +275 -0
  184. package/src/apps/workflow/public/panels/toolbar.js +232 -0
  185. package/src/apps/workflow/public/panels/workflow-list.js +237 -0
  186. package/src/apps/workflow/public/state/store.js +47 -0
  187. package/src/apps/workflow/services/custom-node-loader.ts +48 -0
  188. package/src/apps/workflow/services/legacy-converter.ts +72 -0
  189. package/src/apps/workflow/services/run-manager.ts +190 -0
  190. package/src/apps/workflow/services/workflow-store.ts +424 -0
  191. package/src/apps/workflow/services/workflow-validator.test.ts +103 -0
  192. package/src/apps/workflow/services/workflow-validator.ts +98 -0
  193. package/src/apps/workflow/src/index.ts +10 -0
  194. package/src/apps/workflow/templates/ci-pipeline.json +18 -0
  195. package/src/apps/workflow/templates/code-review.json +22 -0
  196. package/src/apps/workflow/templates/kanban-testing.json +24 -0
  197. package/src/apps/workflow/tsconfig.json +8 -0
  198. package/src/apps/workflow/types.ts +268 -0
  199. package/src/packages/auth-middleware.ts +14 -0
  200. package/src/packages/design-tokens/.turbo/turbo-build.log +10 -0
  201. package/src/packages/design-tokens/STYLEGUIDE.md +414 -0
  202. package/src/packages/design-tokens/build.js +413 -0
  203. package/src/packages/design-tokens/demo/index.html +1367 -0
  204. package/src/packages/design-tokens/demo/proposition-a.html +717 -0
  205. package/src/packages/design-tokens/demo/proposition-b.html +1239 -0
  206. package/src/packages/design-tokens/demo/proposition-c.html +1049 -0
  207. package/src/packages/design-tokens/dist/tailwind-preset.js +115 -0
  208. package/src/packages/design-tokens/dist/tokens.css +345 -0
  209. package/src/packages/design-tokens/dist/tokens.d.ts +229 -0
  210. package/src/packages/design-tokens/dist/tokens.js +386 -0
  211. package/src/packages/design-tokens/package.json +25 -0
  212. package/src/packages/design-tokens/tokens.json +228 -0
  213. package/src/packages/devtools-middleware.ts +22 -0
  214. package/src/packages/eslint-config/index.js +63 -0
  215. package/src/packages/eslint-config/node_modules/.bin/eslint +21 -0
  216. package/src/packages/eslint-config/package.json +18 -0
  217. package/src/packages/json-file-store.ts +232 -0
  218. package/src/packages/mcp-utils/.turbo/turbo-build.log +5 -0
  219. package/src/packages/mcp-utils/dist/index.d.ts +33 -0
  220. package/src/packages/mcp-utils/dist/index.d.ts.map +1 -0
  221. package/src/packages/mcp-utils/dist/index.js +126 -0
  222. package/src/packages/mcp-utils/dist/index.js.map +1 -0
  223. package/src/packages/mcp-utils/node_modules/.bin/tsc +21 -0
  224. package/src/packages/mcp-utils/node_modules/.bin/tsserver +21 -0
  225. package/src/packages/mcp-utils/package.json +32 -0
  226. package/src/packages/mcp-utils/src/index.ts +171 -0
  227. package/src/packages/mcp-utils/tsconfig.json +9 -0
  228. package/src/packages/paths.ts +18 -0
  229. package/src/packages/project-context/index.js +55 -0
  230. package/src/packages/project-context/package.json +13 -0
  231. package/src/packages/project-store.ts +127 -0
  232. package/src/packages/server-sniffer.ts +132 -0
  233. package/src/packages/shared-assets/favicon.svg +7 -0
  234. package/src/packages/shared-assets/keymap-registry.js +512 -0
  235. package/src/packages/shared-assets/logo.svg +6 -0
  236. package/src/packages/shared-assets/package.json +11 -0
  237. package/src/packages/shared-assets/ui-utils.js +48 -0
  238. package/src/packages/shared-assets/voice-widget.d.ts +37 -0
  239. package/src/packages/shared-assets/voice-widget.js +695 -0
  240. package/src/packages/shared-types/.turbo/turbo-build.log +5 -0
  241. package/src/packages/shared-types/dist/index.d.ts +39 -0
  242. package/src/packages/shared-types/dist/index.d.ts.map +1 -0
  243. package/src/packages/shared-types/node_modules/.bin/tsc +21 -0
  244. package/src/packages/shared-types/node_modules/.bin/tsserver +21 -0
  245. package/src/packages/shared-types/package.json +25 -0
  246. package/src/packages/shared-types/src/index.ts +41 -0
  247. package/src/packages/shared-types/tsconfig.json +11 -0
  248. package/src/packages/tsconfig/base.json +15 -0
  249. package/src/packages/tsconfig/next.json +14 -0
  250. package/src/packages/tsconfig/node.json +11 -0
  251. package/src/packages/tsconfig/package.json +10 -0
  252. package/turbo.json +25 -0
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn, execSync } from "child_process";
4
+ import { resolve, dirname } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { mkdirSync, writeFileSync, readFileSync, unlinkSync, existsSync, openSync, closeSync } from "fs";
7
+
8
+ import { homedir } from "os";
9
+
10
+ import { getClaudeMdContent, injectSection, removeSection } from "./claude-md-template.js";
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const root = resolve(__dirname, "..");
14
+ const stateDir = resolve(homedir(), ".devglide");
15
+ const pidDir = resolve(stateDir, "pids");
16
+ const logDir = resolve(stateDir, "logs");
17
+
18
+ mkdirSync(pidDir, { recursive: true });
19
+ mkdirSync(logDir, { recursive: true });
20
+
21
+ // Unified server (single process, all apps on one port)
22
+ const SERVER_PORT = 7000;
23
+
24
+ const [command, ...args] = process.argv.slice(2);
25
+
26
+ // --- PID helpers ---
27
+
28
+ function pidFile(name) {
29
+ return resolve(pidDir, `${name}.pid`);
30
+ }
31
+
32
+ function savePid(name, pid) {
33
+ writeFileSync(pidFile(name), String(pid));
34
+ }
35
+
36
+ function readPid(name) {
37
+ try {
38
+ return parseInt(readFileSync(pidFile(name), "utf8"), 10);
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+
44
+ function removePid(name) {
45
+ try { unlinkSync(pidFile(name)); } catch {}
46
+ }
47
+
48
+ function isRunning(pid) {
49
+ try {
50
+ process.kill(pid, 0);
51
+ return true;
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+
57
+ function getStatus(name) {
58
+ const pid = readPid(name);
59
+ if (pid && isRunning(pid)) return { running: true, pid };
60
+ if (pid) removePid(name); // stale pid
61
+ return { running: false, pid: null };
62
+ }
63
+
64
+ // --- Commands ---
65
+
66
+ function showStatus() {
67
+ console.log();
68
+ const { running, pid } = getStatus("server");
69
+ const state = running ? `\x1b[32mrunning\x1b[0m pid ${pid}` : `\x1b[90mstopped\x1b[0m`;
70
+ console.log(` server :${SERVER_PORT} ${state}`);
71
+ console.log();
72
+ }
73
+
74
+ function tailLogs(name) {
75
+ const logFile = resolve(logDir, `${name}.log`);
76
+ if (!existsSync(logFile)) {
77
+ console.error(`No logs for ${name}`);
78
+ process.exit(1);
79
+ }
80
+ const tail = spawn("tail", ["-f", "-n", "50", logFile], { stdio: "inherit" });
81
+ process.on("SIGINT", () => { tail.kill(); process.exit(0); });
82
+ }
83
+
84
+ // --- MCP launcher ---
85
+
86
+ const mcpServers = {
87
+ kanban: { cwd: "src/apps/kanban", entry: "src/index.ts", runtime: "tsx" },
88
+ voice: { cwd: "src/apps/voice", entry: "src/index.ts", runtime: "tsx" },
89
+ log: { cwd: "src/apps/log", entry: "src/index.ts", runtime: "tsx" },
90
+ test: { cwd: "src/apps/test", entry: "src/index.ts", runtime: "tsx" },
91
+ shell: { cwd: "src/apps/shell", entry: "src/index.ts", runtime: "tsx" },
92
+ workflow: { cwd: "src/apps/workflow", entry: "src/index.ts", runtime: "tsx" },
93
+ vocabulary: { cwd: "src/apps/vocabulary", entry: "src/index.ts", runtime: "tsx" },
94
+ prompts: { cwd: "src/apps/prompts", entry: "src/index.ts", runtime: "tsx" },
95
+ };
96
+
97
+ function runMcpServer(name) {
98
+ const server = mcpServers[name];
99
+ if (!server) {
100
+ console.error(`Unknown MCP server: ${name}`);
101
+ console.error(`Available: ${Object.keys(mcpServers).join(", ")}`);
102
+ process.exit(1);
103
+ }
104
+
105
+ const cwd = resolve(root, server.cwd);
106
+ const entry = resolve(cwd, server.entry);
107
+
108
+ if (server.runtime === "tsx") {
109
+ const tsxPaths = [
110
+ resolve(root, "node_modules/.bin/tsx"),
111
+ resolve(cwd, "node_modules/.bin/tsx"),
112
+ ];
113
+ const tsxBin = tsxPaths.find((p) => existsSync(p));
114
+
115
+ if (!tsxBin) {
116
+ console.error("tsx not found. Run 'pnpm install' first.");
117
+ process.exit(1);
118
+ }
119
+
120
+ const child = spawn(tsxBin, [entry, "--stdio"], {
121
+ cwd,
122
+ stdio: "inherit",
123
+ env: process.env,
124
+ shell: true,
125
+ });
126
+ child.on("exit", (code) => process.exit(code ?? 1));
127
+ } else {
128
+ const child = spawn(process.execPath, [entry, "--stdio"], {
129
+ cwd,
130
+ stdio: "inherit",
131
+ env: process.env,
132
+ });
133
+ child.on("exit", (code) => process.exit(code ?? 1));
134
+ }
135
+ }
136
+
137
+ // --- Unified server ---
138
+
139
+ function startServer(foreground = false) {
140
+ const { running, pid } = getStatus("server");
141
+ if (running) {
142
+ console.log(` server already running (pid ${pid})`);
143
+ return;
144
+ }
145
+
146
+ const tsxBin = resolve(root, "node_modules/.bin/tsx");
147
+ if (!existsSync(tsxBin)) {
148
+ console.error("tsx not found. Run 'pnpm install' first.");
149
+ process.exit(1);
150
+ }
151
+
152
+ if (foreground) {
153
+ const child = spawn(tsxBin, ["src/server.ts"], {
154
+ cwd: root,
155
+ stdio: "inherit",
156
+ env: { ...process.env, PORT: String(SERVER_PORT) },
157
+ shell: true,
158
+ });
159
+ child.on("exit", (code) => process.exit(code ?? 1));
160
+ return;
161
+ }
162
+
163
+ // Background daemon
164
+ const logFile = resolve(logDir, "server.log");
165
+ const out = openSync(logFile, "a");
166
+ const child = spawn(tsxBin, ["src/server.ts"], {
167
+ cwd: root,
168
+ stdio: ["ignore", out, out],
169
+ env: { ...process.env, PORT: String(SERVER_PORT) },
170
+ detached: true,
171
+ shell: true,
172
+ });
173
+ savePid("server", child.pid);
174
+ child.unref();
175
+ closeSync(out);
176
+ console.log(` server started on :${SERVER_PORT} (pid ${child.pid})`);
177
+ }
178
+
179
+ function killTree(pid, signal) {
180
+ try { process.kill(-pid, signal); } catch {
181
+ try { process.kill(pid, signal); } catch {}
182
+ }
183
+ }
184
+
185
+ function stopServer() {
186
+ const { running, pid } = getStatus("server");
187
+ if (!running) {
188
+ console.log(" server not running");
189
+ return;
190
+ }
191
+ killTree(pid, "SIGTERM");
192
+ setTimeout(() => {
193
+ if (isRunning(pid)) killTree(pid, "SIGKILL");
194
+ }, 5000).unref();
195
+ removePid("server");
196
+ console.log(` server stopped (was pid ${pid})`);
197
+ }
198
+
199
+ // --- Setup ---
200
+
201
+ function runSetup() {
202
+ console.log("\n Setting up DevGlide...\n");
203
+
204
+ const devglideBin = resolve(__dirname, "devglide.js");
205
+
206
+ console.log(" Registering MCP servers in Claude Code...\n");
207
+
208
+ let failed = false;
209
+ for (const name of Object.keys(mcpServers)) {
210
+ const mcpName = `devglide-${name}`;
211
+ try {
212
+ // Remove existing registration if any
213
+ try {
214
+ execSync(`claude mcp remove ${mcpName} --scope user`, { stdio: "pipe" });
215
+ } catch {
216
+ // Not registered yet — that's fine
217
+ }
218
+ execSync(
219
+ `claude mcp add --transport stdio ${mcpName} --scope user -- ${process.execPath} ${devglideBin} mcp ${name}`,
220
+ { stdio: "inherit" }
221
+ );
222
+ console.log(` ✓ ${mcpName} registered globally`);
223
+ } catch {
224
+ console.error(` ✗ ${mcpName} failed to register`);
225
+ failed = true;
226
+ }
227
+ }
228
+
229
+ if (failed) {
230
+ console.error("\n Some servers failed to register. Is Claude Code (CLI) installed?");
231
+ process.exit(1);
232
+ }
233
+
234
+ // Install managed CLAUDE.md section
235
+ const claudeDir = resolve(homedir(), ".claude");
236
+ const claudeMdPath = resolve(claudeDir, "CLAUDE.md");
237
+ mkdirSync(claudeDir, { recursive: true });
238
+
239
+ let existing = "";
240
+ try {
241
+ existing = readFileSync(claudeMdPath, "utf8");
242
+ } catch {
243
+ // File doesn't exist yet
244
+ }
245
+
246
+ const updated = injectSection(existing, getClaudeMdContent());
247
+ if (updated !== existing) {
248
+ writeFileSync(claudeMdPath, updated);
249
+ console.log(`\n ✓ DevGlide instructions installed in ${claudeMdPath}`);
250
+ } else {
251
+ console.log(`\n ✓ DevGlide instructions already up to date in ${claudeMdPath}`);
252
+ }
253
+
254
+ console.log("\n Setup complete!\n");
255
+ }
256
+
257
+ function runTeardown() {
258
+ console.log("\n Tearing down DevGlide...\n");
259
+
260
+ // Remove MCP server registrations
261
+ for (const name of Object.keys(mcpServers)) {
262
+ const mcpName = `devglide-${name}`;
263
+ try {
264
+ execSync(`claude mcp remove ${mcpName} --scope user`, { stdio: "pipe" });
265
+ console.log(` ✓ ${mcpName} removed`);
266
+ } catch {
267
+ console.log(` - ${mcpName} was not registered`);
268
+ }
269
+ }
270
+
271
+ // Remove managed CLAUDE.md section
272
+ const claudeMdPath = resolve(homedir(), ".claude", "CLAUDE.md");
273
+ try {
274
+ const existing = readFileSync(claudeMdPath, "utf8");
275
+ const updated = removeSection(existing);
276
+ if (updated !== existing) {
277
+ if (updated.trim().length === 0) {
278
+ unlinkSync(claudeMdPath);
279
+ console.log(`\n ✓ Removed ${claudeMdPath} (was empty)`);
280
+ } else {
281
+ writeFileSync(claudeMdPath, updated);
282
+ console.log(`\n ✓ DevGlide instructions removed from ${claudeMdPath}`);
283
+ }
284
+ } else {
285
+ console.log(`\n - No DevGlide instructions found in ${claudeMdPath}`);
286
+ }
287
+ } catch {
288
+ console.log(`\n - ${claudeMdPath} not found`);
289
+ }
290
+
291
+ console.log("\n Teardown complete!\n");
292
+ }
293
+
294
+ function usage() {
295
+ console.log(`
296
+ devglide — development workflow toolkit
297
+
298
+ Usage:
299
+ devglide start Start server as background daemon
300
+ devglide stop Stop server
301
+ devglide restart Restart server
302
+ devglide dev Run server in foreground (recommended for development)
303
+ devglide status Show running status
304
+ devglide logs Tail server logs
305
+ devglide mcp <server> Launch a single MCP server on stdio
306
+ devglide setup Register MCP servers + install CLAUDE.md instructions
307
+ devglide teardown Unregister MCP servers + remove CLAUDE.md instructions
308
+
309
+ Server:
310
+ All apps on :${SERVER_PORT} (single process)
311
+
312
+ MCP servers:
313
+ ${Object.keys(mcpServers).map((name) => ` ${name}`).join("\n")}
314
+
315
+ State: ~/.devglide/ (pids, logs)
316
+ `);
317
+ }
318
+
319
+ switch (command) {
320
+ case "dev":
321
+ startServer(true);
322
+ break;
323
+
324
+ case "start":
325
+ case "server":
326
+ if (args[0] === "stop") {
327
+ stopServer();
328
+ } else {
329
+ startServer(command === "dev");
330
+ }
331
+ break;
332
+
333
+ case "stop":
334
+ stopServer();
335
+ break;
336
+
337
+ case "restart":
338
+ stopServer();
339
+ // Brief wait for port to free
340
+ setTimeout(() => startServer(false), 1000);
341
+ break;
342
+
343
+ case "status":
344
+ showStatus();
345
+ break;
346
+
347
+ case "logs":
348
+ tailLogs("server");
349
+ break;
350
+
351
+ case "list":
352
+ console.log("\nMCP servers:\n");
353
+ for (const name of Object.keys(mcpServers)) {
354
+ console.log(` ${name}`);
355
+ }
356
+ console.log();
357
+ break;
358
+
359
+ case "mcp": {
360
+ if (!args[0]) {
361
+ console.error(`Usage: devglide mcp <server>\nAvailable: ${Object.keys(mcpServers).join(", ")}`);
362
+ process.exit(1);
363
+ }
364
+ runMcpServer(args[0]);
365
+ break;
366
+ }
367
+
368
+ case "setup":
369
+ runSetup();
370
+ break;
371
+
372
+ case "teardown":
373
+ runTeardown();
374
+ break;
375
+
376
+ case "help":
377
+ case "--help":
378
+ case "-h":
379
+ case undefined:
380
+ usage();
381
+ break;
382
+
383
+ default:
384
+ console.error(`Unknown command: ${command}`);
385
+ usage();
386
+ process.exit(1);
387
+ }
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "devglide",
3
+ "version": "0.1.1",
4
+ "description": "AI workflow toolkit with MCP servers for kanban, shell, testing, workflows, and more — built for Claude Code",
5
+ "license": "MIT",
6
+ "author": "Daniel Kutyla",
7
+ "type": "module",
8
+ "packageManager": "pnpm@10.30.3",
9
+ "engines": {
10
+ "node": ">=22"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/DannyNs/devglide.git"
15
+ },
16
+ "homepage": "https://github.com/DannyNs/devglide#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/DannyNs/devglide/issues"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "model-context-protocol",
23
+ "claude-code",
24
+ "developer-tools",
25
+ "ai-workflow",
26
+ "kanban",
27
+ "terminal",
28
+ "test-automation",
29
+ "cli"
30
+ ],
31
+ "bin": {
32
+ "devglide": "./bin/devglide.js"
33
+ },
34
+ "files": [
35
+ "bin/",
36
+ "src/apps/",
37
+ "src/packages/",
38
+ "turbo.json",
39
+ "pnpm-workspace.yaml"
40
+ ],
41
+ "scripts": {
42
+ "dev": "turbo dev --concurrency 20",
43
+ "dev:server": "tsx src/server.ts",
44
+ "build": "turbo build",
45
+ "lint": "turbo lint",
46
+ "typecheck": "turbo typecheck",
47
+ "test": "vitest run",
48
+ "clean": "turbo clean && rm -rf node_modules"
49
+ },
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "^1.12.1",
52
+ "@paralleldrive/cuid2": "^2.3.1",
53
+ "better-sqlite3": "^11.10.0",
54
+ "chokidar": "^4.0.3",
55
+ "cors": "^2.8.6",
56
+ "express": "^5.2.1",
57
+ "multer": "1.4.5-lts.2",
58
+ "node-pty": "^1.1.0",
59
+ "openai": "^4.104.0",
60
+ "socket.io": "^4.8.3",
61
+ "socket.io-client": "^4.8.3",
62
+ "uuid": "^11.1.0",
63
+ "zod": "^3.25.49"
64
+ },
65
+ "devDependencies": {
66
+ "@devglide/eslint-config": "workspace:*",
67
+ "@types/better-sqlite3": "^7.6.13",
68
+ "@types/cors": "^2.8.19",
69
+ "@types/express": "^5.0.0",
70
+ "@types/multer": "^1.4.13",
71
+ "@types/node": "^22.0.0",
72
+ "eslint": "^9.39.4",
73
+ "tsx": "^4.19.0",
74
+ "turbo": "^2.5.0",
75
+ "typescript": "^5.8.0",
76
+ "vitest": "^4.1.0"
77
+ },
78
+ "pnpm": {
79
+ "onlyBuiltDependencies": [
80
+ "esbuild",
81
+ "node-pty",
82
+ "better-sqlite3"
83
+ ]
84
+ }
85
+ }
@@ -0,0 +1,3 @@
1
+ packages:
2
+ - "src/apps/*"
3
+ - "src/packages/*"
@@ -0,0 +1,5 @@
1
+  WARN  Issue while reading "/home/runner/_work/devglide/devglide/.npmrc". Failed to replace env in config: ${NODE_AUTH_TOKEN}
2
+
3
+ > @devglide/coder@0.1.0 lint /home/runner/_work/devglide/devglide/src/apps/coder
4
+ > eslint .
5
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@devglide/coder",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "In-browser IDE for viewing and editing monorepo files",
6
+ "main": "server.js",
7
+ "scripts": {
8
+ "dev": "node --watch server.js",
9
+ "start": "node server.js",
10
+ "lint": "eslint ."
11
+ },
12
+ "private": true,
13
+ "dependencies": {
14
+ "express": "^5.2.1"
15
+ }
16
+ }
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <rect width="32" height="32" fill="#1c2128"/>
3
+ <rect width="32" height="32" fill="none" stroke="#7ee787" stroke-width="1.5"/>
4
+ <path d="M8 10h6a6 6 0 0 1 0 12H8V10z" fill="#7ee787"/>
5
+ <rect x="18" y="10" width="6" height="4" fill="#7ee787" opacity="0.6"/>
6
+ <rect x="18" y="18" width="6" height="4" fill="#7ee787" opacity="0.6"/>
7
+ </svg>