@codeyam/codeyam-cli 0.1.0-staging.a890816 → 0.1.0-staging.ae0de75

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 (106) hide show
  1. package/analyzer-template/.build-info.json +6 -6
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +6 -6
  4. package/analyzer-template/packages/ai/package.json +1 -1
  5. package/analyzer-template/packages/aws/package.json +1 -1
  6. package/analyzer-template/packages/database/package.json +3 -3
  7. package/analyzer-template/packages/github/package.json +1 -1
  8. package/codeyam-cli/src/commands/editor.js +892 -90
  9. package/codeyam-cli/src/commands/editor.js.map +1 -1
  10. package/codeyam-cli/src/commands/init.js +6 -1
  11. package/codeyam-cli/src/commands/init.js.map +1 -1
  12. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +246 -0
  13. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  14. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +126 -0
  15. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  16. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +295 -0
  17. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  18. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  19. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  20. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +100 -0
  21. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  22. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +147 -0
  23. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  24. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +76 -0
  25. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  26. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  27. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  28. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  29. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  30. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  31. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  32. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  33. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  34. package/codeyam-cli/src/utils/editorAudit.js +82 -0
  35. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  36. package/codeyam-cli/src/utils/editorDevServer.js +98 -0
  37. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  38. package/codeyam-cli/src/utils/editorJournal.js +137 -0
  39. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  40. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  41. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  42. package/codeyam-cli/src/utils/editorPreloadHelpers.js +64 -0
  43. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  44. package/codeyam-cli/src/utils/editorPreview.js +66 -0
  45. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  46. package/codeyam-cli/src/utils/editorScenarios.js +56 -0
  47. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  48. package/codeyam-cli/src/utils/git.js +51 -0
  49. package/codeyam-cli/src/utils/git.js.map +1 -1
  50. package/codeyam-cli/src/utils/install-skills.js +28 -17
  51. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  52. package/codeyam-cli/src/utils/project.js +15 -5
  53. package/codeyam-cli/src/utils/project.js.map +1 -1
  54. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  55. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  56. package/codeyam-cli/src/utils/testRunner.js +1 -1
  57. package/codeyam-cli/src/utils/testRunner.js.map +1 -1
  58. package/codeyam-cli/src/webserver/build/client/assets/Terminal-wkqC0AQk.js +41 -0
  59. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  60. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  61. package/codeyam-cli/src/webserver/build/client/assets/editor-CdjF_fX6.js +8 -0
  62. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D8ILZMR0.js +6 -0
  63. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +1 -0
  64. package/codeyam-cli/src/webserver/build/client/assets/manifest-b8fd6b07.js +1 -0
  65. package/codeyam-cli/src/webserver/build/client/assets/{root-DiRdBreB.js → root-DUKqhFlb.js} +7 -7
  66. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  67. package/codeyam-cli/src/webserver/build/server/assets/{index-BzAbACSx.js → index-BLhjL9Xi.js} +1 -1
  68. package/codeyam-cli/src/webserver/build/server/assets/server-build-DyMuI5mU.js +363 -0
  69. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  70. package/codeyam-cli/src/webserver/build-info.json +5 -5
  71. package/codeyam-cli/src/webserver/editorProxy.js +182 -14
  72. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  73. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +175 -0
  74. package/codeyam-cli/src/webserver/server.js +61 -12
  75. package/codeyam-cli/src/webserver/server.js.map +1 -1
  76. package/codeyam-cli/src/webserver/terminalServer.js +29 -103
  77. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  78. package/codeyam-cli/templates/editor-step-hook.py +6 -4
  79. package/codeyam-cli/templates/{codeyam-dev-mode.md → skills/codeyam-dev-mode/SKILL.md} +1 -1
  80. package/codeyam-cli/templates/{codeyam-editor.md → skills/codeyam-editor/SKILL.md} +5 -4
  81. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  82. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  83. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +108 -0
  84. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +69 -0
  85. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  86. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  87. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +12 -0
  88. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +45 -0
  89. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +139 -0
  90. package/package.json +2 -2
  91. package/scripts/npm-post-install.cjs +12 -0
  92. package/codeyam-cli/src/webserver/build/client/assets/Terminal-CcG8YTLx.js +0 -41
  93. package/codeyam-cli/src/webserver/build/client/assets/editor-W_IGJ2Kd.js +0 -7
  94. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D6SEzMCu.js +0 -6
  95. package/codeyam-cli/src/webserver/build/client/assets/globals-BZB_H1w2.css +0 -1
  96. package/codeyam-cli/src/webserver/build/client/assets/manifest-8daa4147.js +0 -1
  97. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +0 -9
  98. package/codeyam-cli/src/webserver/build/server/assets/server-build-OdUocH6P.js +0 -362
  99. package/scripts/finalize-analyzer.cjs +0 -13
  100. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  101. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  102. /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
  103. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  104. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  105. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  106. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -1 +1 @@
1
- import{Z as K,_ as L,N as $,O as rr,X as tr,Q as or,T as ir,U as pr,W as mr,V as sr,Y as ar,R as er}from"./assets/server-build-OdUocH6P.js";import"react/jsx-runtime";import"node:stream";import"@react-router/node";import"react-router";import"isbot";import"react-dom/server";import"react";import"lucide-react";import"fetch-retry";import"better-sqlite3";import"pg";import"fs";import"path";import"kysely";import"kysely/helpers/sqlite";import"kysely/helpers/postgres";import"typescript";import"fs/promises";import"os";import"prompts";import"chalk";import"crypto";import"child_process";import"url";import"util";import"dotenv";import"events";import"uuid";import"http";import"net";import"ws";import"node-pty";import"openai";import"p-queue";import"p-retry";import"@aws-sdk/client-dynamodb";import"lru-cache";import"pluralize";import"piscina";import"json5";import"@aws-sdk/util-dynamodb";import"v8";import"react-syntax-highlighter";import"react-syntax-highlighter/dist/cjs/styles/prism/index.js";import"node:crypto";import"minimatch";import"react-markdown";import"remark-gfm";import"react-diff-viewer-continued";export{K as allowedActionOrigins,L as assets,$ as assetsBuildDirectory,rr as basename,tr as entry,or as future,ir as isSpaMode,pr as prerender,mr as publicPath,sr as routeDiscovery,ar as routes,er as ssr};
1
+ import{Z as K,_ as L,N as $,O as rr,X as tr,Q as or,T as ir,U as pr,W as mr,V as sr,Y as ar,R as er}from"./assets/server-build-DyMuI5mU.js";import"react/jsx-runtime";import"node:stream";import"@react-router/node";import"react-router";import"isbot";import"react-dom/server";import"react";import"lucide-react";import"fetch-retry";import"better-sqlite3";import"pg";import"fs";import"path";import"kysely";import"kysely/helpers/sqlite";import"kysely/helpers/postgres";import"typescript";import"fs/promises";import"os";import"prompts";import"chalk";import"crypto";import"child_process";import"url";import"util";import"dotenv";import"events";import"uuid";import"http";import"net";import"ws";import"node-pty";import"openai";import"p-queue";import"p-retry";import"@aws-sdk/client-dynamodb";import"lru-cache";import"pluralize";import"piscina";import"json5";import"@aws-sdk/util-dynamodb";import"v8";import"react-syntax-highlighter";import"react-syntax-highlighter/dist/cjs/styles/prism/index.js";import"node:crypto";import"minimatch";import"react-markdown";import"remark-gfm";import"react-diff-viewer-continued";export{K as allowedActionOrigins,L as assets,$ as assetsBuildDirectory,rr as basename,tr as entry,or as future,ir as isSpaMode,pr as prerender,mr as publicPath,sr as routeDiscovery,ar as routes,er as ssr};
@@ -1,7 +1,7 @@
1
1
  {
2
- "buildTimestamp": "2026-03-02T01:13:38.736Z",
3
- "buildTime": 1772414018736,
4
- "buildNumber": 831,
5
- "semanticVersion": "0.1.831",
6
- "version": "0.1.831 (2026-03-02T01:13)"
2
+ "buildTimestamp": "2026-03-03T15:39:17.097Z",
3
+ "buildTime": 1772552357097,
4
+ "buildNumber": 846,
5
+ "semanticVersion": "0.1.846",
6
+ "version": "0.1.846 (2026-03-03T15:39)"
7
7
  }
@@ -3,16 +3,29 @@ import net from 'net';
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
5
  import { getProjectRoot } from "../state.js";
6
+ import { createMockStateManager, } from "../utils/editorMockState.js";
6
7
  // Global key so the proxy survives HMR
7
8
  const GLOBAL_KEY = '__codeyam_editor_proxy__';
8
9
  const CACHE_TTL_MS = 500;
9
10
  let scenarioCache = { data: null, timestamp: 0 };
11
+ // Max body size to buffer for mock matching (10MB)
12
+ const MAX_BODY_SIZE = 10 * 1024 * 1024;
10
13
  function getProxyState() {
11
14
  return globalThis[GLOBAL_KEY] ?? null;
12
15
  }
13
16
  function setProxyState(state) {
14
17
  globalThis[GLOBAL_KEY] = state;
15
18
  }
19
+ /**
20
+ * Get or create the mock state manager (survives HMR via globalThis).
21
+ */
22
+ function getMockStateManager() {
23
+ const key = '__codeyam_mock_state__';
24
+ if (!globalThis[key]) {
25
+ globalThis[key] = createMockStateManager();
26
+ }
27
+ return globalThis[key];
28
+ }
16
29
  /**
17
30
  * Get the proxy URL if the proxy is running.
18
31
  */
@@ -24,6 +37,7 @@ export function getProxyUrl() {
24
37
  }
25
38
  /**
26
39
  * Read the active scenario's mock data from disk, with brief caching.
40
+ * Feeds the data into the MockStateManager.
27
41
  */
28
42
  function readScenarioData() {
29
43
  const now = Date.now();
@@ -52,6 +66,8 @@ function readScenarioData() {
52
66
  }
53
67
  const data = JSON.parse(fs.readFileSync(dataFilePath, 'utf-8'));
54
68
  scenarioCache = { data, timestamp: now };
69
+ // Feed into mock state manager (smart reload handles dedup)
70
+ getMockStateManager().loadScenario(data);
55
71
  return data;
56
72
  }
57
73
  catch (err) {
@@ -66,6 +82,8 @@ function readScenarioData() {
66
82
  * Supports two formats:
67
83
  * - New route-keyed: { "routes": { "/api/drinks": { "body": [...] } } }
68
84
  * - Legacy key-based: { "drinks": [...] } → matches /api/drinks
85
+ *
86
+ * @deprecated Use MockStateManager.matchRequest() instead for method-aware matching.
69
87
  */
70
88
  export function findMatchingRoute(pathname, scenarioData) {
71
89
  // New format: check routes map
@@ -92,7 +110,71 @@ export function findMatchingRoute(pathname, scenarioData) {
92
110
  return null;
93
111
  }
94
112
  /**
95
- * Forward an HTTP request to the target dev server.
113
+ * Buffer the request body, up to MAX_BODY_SIZE.
114
+ * Returns null if the body exceeds the limit.
115
+ */
116
+ function bufferRequestBody(req) {
117
+ return new Promise((resolve) => {
118
+ const chunks = [];
119
+ let totalSize = 0;
120
+ req.on('data', (chunk) => {
121
+ totalSize += chunk.length;
122
+ if (totalSize > MAX_BODY_SIZE) {
123
+ resolve(null); // Too large — skip mock matching
124
+ req.resume(); // Drain remaining
125
+ }
126
+ else {
127
+ chunks.push(chunk);
128
+ }
129
+ });
130
+ req.on('end', () => {
131
+ if (totalSize > MAX_BODY_SIZE)
132
+ return; // Already resolved
133
+ resolve(Buffer.concat(chunks));
134
+ });
135
+ req.on('error', () => {
136
+ resolve(null);
137
+ });
138
+ });
139
+ }
140
+ /**
141
+ * Forward a buffered request to the target dev server.
142
+ * Unlike the streaming forwardRequest, this replays a buffered body.
143
+ */
144
+ function forwardBufferedRequest(req, res, targetUrl, bodyBuffer) {
145
+ const target = new URL(targetUrl);
146
+ const headers = { ...req.headers, host: `${target.hostname}:${target.port}` };
147
+ // Update content-length if we have the body buffer
148
+ if (bodyBuffer) {
149
+ headers['content-length'] = String(bodyBuffer.length);
150
+ }
151
+ const options = {
152
+ hostname: target.hostname,
153
+ port: target.port,
154
+ path: req.url,
155
+ method: req.method,
156
+ headers,
157
+ };
158
+ const proxyReq = http.request(options, (proxyRes) => {
159
+ res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
160
+ proxyRes.pipe(res, { end: true });
161
+ });
162
+ proxyReq.on('error', (err) => {
163
+ console.warn(`[editorProxy] Forward error for ${req.method} ${req.url}: ${err.message}`);
164
+ if (!res.headersSent) {
165
+ res.writeHead(502, { 'Content-Type': 'text/plain' });
166
+ res.end('Bad Gateway — dev server unreachable');
167
+ }
168
+ });
169
+ if (bodyBuffer && bodyBuffer.length > 0) {
170
+ proxyReq.end(bodyBuffer);
171
+ }
172
+ else {
173
+ proxyReq.end();
174
+ }
175
+ }
176
+ /**
177
+ * Forward an HTTP request to the target dev server (streaming, no body buffering).
96
178
  */
97
179
  function forwardRequest(req, res, targetUrl) {
98
180
  const target = new URL(targetUrl);
@@ -146,9 +228,43 @@ function handleUpgrade(req, socket, head, targetUrl) {
146
228
  proxySocket.destroy();
147
229
  });
148
230
  }
231
+ /**
232
+ * Write proxy-config.json so the preload module can discover the proxy.
233
+ */
234
+ function writeProxyConfig(proxyPort, targetUrl) {
235
+ const projectRoot = getProjectRoot() || process.env.CODEYAM_ROOT_PATH || process.cwd();
236
+ const configPath = path.join(projectRoot, '.codeyam', 'proxy-config.json');
237
+ try {
238
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
239
+ fs.writeFileSync(configPath, JSON.stringify({
240
+ proxyUrl: `http://localhost:${proxyPort}`,
241
+ devServerUrl: targetUrl,
242
+ }), 'utf-8');
243
+ console.log(`[editorProxy] Wrote proxy config to ${configPath}`);
244
+ }
245
+ catch (err) {
246
+ console.warn('[editorProxy] Failed to write proxy-config.json:', err);
247
+ }
248
+ }
249
+ /**
250
+ * Remove proxy-config.json on proxy stop.
251
+ */
252
+ function removeProxyConfig() {
253
+ const projectRoot = getProjectRoot() || process.env.CODEYAM_ROOT_PATH || process.cwd();
254
+ const configPath = path.join(projectRoot, '.codeyam', 'proxy-config.json');
255
+ try {
256
+ if (fs.existsSync(configPath)) {
257
+ fs.unlinkSync(configPath);
258
+ }
259
+ }
260
+ catch {
261
+ // Best effort
262
+ }
263
+ }
149
264
  /**
150
265
  * Start the editor proxy server.
151
- * Intercepts GET requests to API routes matching the active scenario, forwards everything else.
266
+ * Intercepts requests to API routes matching the active scenario, forwards everything else.
267
+ * Supports all HTTP methods (GET, POST, PUT, DELETE, PATCH) with body buffering.
152
268
  */
153
269
  export async function startEditorProxy(options) {
154
270
  // Stop existing proxy first
@@ -156,28 +272,77 @@ export async function startEditorProxy(options) {
156
272
  const { targetUrl } = options;
157
273
  let port = options.port;
158
274
  console.log(`[editorProxy] Starting proxy (requested port ${port}, target ${targetUrl})`);
275
+ const mockState = getMockStateManager();
159
276
  const server = http.createServer((req, res) => {
160
- const parsedUrl = new URL(req.url || '/', `http://localhost:${port}`);
161
- const pathname = parsedUrl.pathname;
162
- // Only intercept GET requests
163
- if (req.method === 'GET') {
164
- const scenarioData = readScenarioData();
165
- if (scenarioData) {
166
- const match = findMatchingRoute(pathname, scenarioData);
277
+ void (async () => {
278
+ const parsedUrl = new URL(req.url || '/', `http://localhost:${port}`);
279
+ const pathname = parsedUrl.pathname;
280
+ const method = req.method || 'GET';
281
+ // CORS preflight — permissive 204 for browser cross-origin requests
282
+ if (method === 'OPTIONS') {
283
+ res.writeHead(204, {
284
+ 'Access-Control-Allow-Origin': '*',
285
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
286
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Requested-With',
287
+ 'Access-Control-Max-Age': '86400',
288
+ });
289
+ res.end();
290
+ return;
291
+ }
292
+ // Load scenario data (also feeds MockStateManager)
293
+ readScenarioData();
294
+ // For methods that may carry a body, buffer it first
295
+ const needsBody = method === 'POST' ||
296
+ method === 'PUT' ||
297
+ method === 'DELETE' ||
298
+ method === 'PATCH';
299
+ if (needsBody) {
300
+ const bodyBuffer = await bufferRequestBody(req);
301
+ if (bodyBuffer === null) {
302
+ // Body too large — forward without mock matching
303
+ forwardBufferedRequest(req, res, targetUrl, null);
304
+ return;
305
+ }
306
+ // Try to parse body as JSON for mock matching
307
+ let parsedBody = undefined;
308
+ if (bodyBuffer.length > 0) {
309
+ try {
310
+ parsedBody = JSON.parse(bodyBuffer.toString('utf-8'));
311
+ }
312
+ catch {
313
+ // Not JSON — that's fine, still try mock matching without parsed body
314
+ }
315
+ }
316
+ const match = mockState.matchRequest(method, pathname, parsedBody);
167
317
  if (match) {
168
- console.log(`[editorProxy] Intercepted ${req.method} ${pathname} → scenario data (status ${match.status})`);
318
+ console.log(`[editorProxy] Intercepted ${method} ${pathname} → mock response (status ${match.status})`);
169
319
  res.writeHead(match.status, {
170
320
  'Content-Type': 'application/json',
171
321
  'Access-Control-Allow-Origin': '*',
172
322
  'X-CodeYam-Proxy': 'scenario-data',
173
323
  });
174
- res.end(JSON.stringify(match.body));
324
+ res.end(match.body != null ? JSON.stringify(match.body) : '');
175
325
  return;
176
326
  }
327
+ // No mock match — forward with buffered body
328
+ forwardBufferedRequest(req, res, targetUrl, bodyBuffer);
329
+ return;
177
330
  }
178
- }
179
- // Forward everything else to the dev server
180
- forwardRequest(req, res, targetUrl);
331
+ // GET, HEAD, etc. — try mock matching (no body)
332
+ const match = mockState.matchRequest(method, pathname);
333
+ if (match) {
334
+ console.log(`[editorProxy] Intercepted ${method} ${pathname} → mock response (status ${match.status})`);
335
+ res.writeHead(match.status, {
336
+ 'Content-Type': 'application/json',
337
+ 'Access-Control-Allow-Origin': '*',
338
+ 'X-CodeYam-Proxy': 'scenario-data',
339
+ });
340
+ res.end(match.body != null ? JSON.stringify(match.body) : '');
341
+ return;
342
+ }
343
+ // Forward everything else to the dev server
344
+ forwardRequest(req, res, targetUrl);
345
+ })();
181
346
  });
182
347
  // Handle WebSocket upgrades (for HMR)
183
348
  server.on('upgrade', (req, socket, head) => {
@@ -198,6 +363,8 @@ export async function startEditorProxy(options) {
198
363
  port = currentPort;
199
364
  const state = { server, port, targetUrl };
200
365
  setProxyState(state);
366
+ // Write proxy-config.json for the preload module
367
+ writeProxyConfig(port, targetUrl);
201
368
  console.log(`[editorProxy] Proxy started on port ${port}, forwarding to ${targetUrl}`);
202
369
  return { port };
203
370
  }
@@ -220,6 +387,7 @@ export async function stopEditorProxy() {
220
387
  if (!state)
221
388
  return;
222
389
  console.log(`[editorProxy] Stopping proxy on port ${state.port}`);
390
+ removeProxyConfig();
223
391
  return new Promise((resolve) => {
224
392
  state.server.close(() => {
225
393
  console.log('[editorProxy] Proxy stopped');
@@ -1 +1 @@
1
- {"version":3,"file":"editorProxy.js","sourceRoot":"","sources":["../../../../src/webserver/editorProxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editorProxy.js","sourceRoot":"","sources":["../../../../src/webserver/editorProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Node.js preload module for CodeYam editor proxy.
3
+ *
4
+ * Loaded via NODE_OPTIONS='--import /path/to/codeyam-preload.mjs' in the
5
+ * dev server process. Patches global fetch and http/https.request so that
6
+ * SSR fetches (Next.js server components, server actions, etc.) are routed
7
+ * through the CodeYam proxy instead of hitting the dev server directly.
8
+ *
9
+ * Must be .mjs (native ESM) because --import requires it.
10
+ * No TypeScript, no build step, no dependencies.
11
+ */
12
+
13
+ import http from 'node:http';
14
+ import https from 'node:https';
15
+ import fs from 'node:fs';
16
+ import path from 'node:path';
17
+
18
+ let proxyConfig = null;
19
+ let configLoaded = false;
20
+
21
+ /**
22
+ * Lazily load the proxy config from .codeyam/proxy-config.json.
23
+ * Returns null if the file doesn't exist yet (proxy still starting).
24
+ */
25
+ function getProxyConfig() {
26
+ if (configLoaded && proxyConfig) return proxyConfig;
27
+
28
+ // Try env var first (most reliable)
29
+ const proxyUrl = process.env.CODEYAM_PROXY_URL;
30
+ const devServerUrl = process.env.CODEYAM_DEV_SERVER_URL;
31
+ if (proxyUrl && devServerUrl) {
32
+ proxyConfig = { proxyUrl, devServerUrl };
33
+ configLoaded = true;
34
+ return proxyConfig;
35
+ }
36
+
37
+ // Fall back to config file
38
+ try {
39
+ const cwd = process.cwd();
40
+ const configPath = path.join(cwd, '.codeyam', 'proxy-config.json');
41
+ if (fs.existsSync(configPath)) {
42
+ const raw = fs.readFileSync(configPath, 'utf-8');
43
+ proxyConfig = JSON.parse(raw);
44
+ configLoaded = true;
45
+ return proxyConfig;
46
+ }
47
+ } catch {
48
+ // File doesn't exist yet or is invalid — that's fine
49
+ }
50
+
51
+ return null;
52
+ }
53
+
54
+ /**
55
+ * Check if a URL string targets the dev server and return the redirected URL.
56
+ */
57
+ function redirectUrl(urlStr, config) {
58
+ try {
59
+ const parsed = new URL(urlStr);
60
+ const dev = new URL(config.devServerUrl);
61
+ const proxy = new URL(config.proxyUrl);
62
+
63
+ if (parsed.hostname === dev.hostname && parsed.port === dev.port) {
64
+ parsed.hostname = proxy.hostname;
65
+ parsed.port = proxy.port;
66
+ parsed.protocol = proxy.protocol;
67
+ return parsed.toString();
68
+ }
69
+ } catch {
70
+ // Invalid URL — pass through
71
+ }
72
+ return urlStr;
73
+ }
74
+
75
+ /**
76
+ * Check if http.request options target the dev server and patch them.
77
+ */
78
+ function redirectOptions(options, config) {
79
+ const dev = new URL(config.devServerUrl);
80
+ const proxy = new URL(config.proxyUrl);
81
+ const devPort = parseInt(dev.port, 10);
82
+ const proxyPort = parseInt(proxy.port, 10);
83
+
84
+ if (options.hostname && parseInt(String(options.port), 10) === devPort && options.hostname === dev.hostname) {
85
+ return {
86
+ ...options,
87
+ hostname: proxy.hostname,
88
+ port: proxyPort,
89
+ headers: options.headers
90
+ ? { ...options.headers, host: `${proxy.hostname}:${proxyPort}` }
91
+ : options.headers,
92
+ };
93
+ }
94
+
95
+ if (options.host) {
96
+ const expectedHost = `${dev.hostname}:${devPort}`;
97
+ if (options.host === expectedHost) {
98
+ return {
99
+ ...options,
100
+ host: `${proxy.hostname}:${proxyPort}`,
101
+ };
102
+ }
103
+ }
104
+
105
+ return options;
106
+ }
107
+
108
+ // --- Patch global fetch ---
109
+
110
+ const originalFetch = globalThis.fetch;
111
+
112
+ if (originalFetch) {
113
+ globalThis.fetch = function patchedFetch(input, init) {
114
+ const config = getProxyConfig();
115
+ if (!config) return originalFetch.call(this, input, init);
116
+
117
+ if (typeof input === 'string') {
118
+ const redirected = redirectUrl(input, config);
119
+ if (redirected !== input) {
120
+ return originalFetch.call(this, redirected, init);
121
+ }
122
+ } else if (input instanceof URL) {
123
+ const redirected = redirectUrl(input.toString(), config);
124
+ if (redirected !== input.toString()) {
125
+ return originalFetch.call(this, redirected, init);
126
+ }
127
+ } else if (input instanceof Request) {
128
+ const redirected = redirectUrl(input.url, config);
129
+ if (redirected !== input.url) {
130
+ return originalFetch.call(this, new Request(redirected, input), init);
131
+ }
132
+ }
133
+
134
+ return originalFetch.call(this, input, init);
135
+ };
136
+ }
137
+
138
+ // --- Patch http.request and https.request ---
139
+
140
+ function patchModule(mod, protocol) {
141
+ const originalRequest = mod.request;
142
+ const originalGet = mod.get;
143
+
144
+ mod.request = function patchedRequest(urlOrOptions, optionsOrCallback, callback) {
145
+ const config = getProxyConfig();
146
+ if (!config) return originalRequest.call(this, urlOrOptions, optionsOrCallback, callback);
147
+
148
+ // http.request(url, options, callback)
149
+ if (typeof urlOrOptions === 'string' || urlOrOptions instanceof URL) {
150
+ const urlStr = typeof urlOrOptions === 'string' ? urlOrOptions : urlOrOptions.toString();
151
+ const redirected = redirectUrl(urlStr, config);
152
+ if (redirected !== urlStr) {
153
+ // Redirect to proxy — force http since proxy is always http
154
+ return http.request.call(http, redirected, optionsOrCallback, callback);
155
+ }
156
+ return originalRequest.call(this, urlOrOptions, optionsOrCallback, callback);
157
+ }
158
+
159
+ // http.request(options, callback)
160
+ const redirected = redirectOptions(urlOrOptions, config);
161
+ if (redirected !== urlOrOptions) {
162
+ return http.request.call(http, redirected, optionsOrCallback);
163
+ }
164
+ return originalRequest.call(this, urlOrOptions, optionsOrCallback, callback);
165
+ };
166
+
167
+ mod.get = function patchedGet(urlOrOptions, optionsOrCallback, callback) {
168
+ const req = mod.request(urlOrOptions, optionsOrCallback, callback);
169
+ req.end();
170
+ return req;
171
+ };
172
+ }
173
+
174
+ patchModule(http, 'http');
175
+ patchModule(https, 'https');
@@ -199,11 +199,13 @@ async function checkPreviewHealth(url) {
199
199
  };
200
200
  }
201
201
  }
202
- app.post('/api/dev-mode-refresh', async (_req, res) => {
202
+ // Unified preview control — refresh, navigate, switch scenario, or any combination.
203
+ // Handles log clearing, HMR settle, SSR health check, scenario switching, and navigation.
204
+ app.post('/api/dev-mode-preview', express.json(), async (req, res) => {
205
+ const { scenarioSlug, scenarioId, path: navPath } = req.body || {};
203
206
  let sessionsNotified = 0;
204
207
  let logCleared = false;
205
- let previewUrl = null;
206
- // Read config and resolve log path
208
+ // 1. Read config and resolve log path
207
209
  let logPath = null;
208
210
  try {
209
211
  const configPath = path.join(process.cwd(), '.codeyam', 'config.json');
@@ -215,19 +217,43 @@ app.post('/api/dev-mode-refresh', async (_req, res) => {
215
217
  catch {
216
218
  // Config not available — not critical
217
219
  }
218
- // Extract preview URL from log BEFORE clearing it
220
+ // 2. Extract preview URL from log BEFORE clearing it
221
+ let previewUrl = null;
219
222
  if (logPath && fs.existsSync(logPath)) {
220
223
  previewUrl = getPreviewUrl(logPath);
221
224
  }
222
- // Broadcast WebSocket refresh to browser (iframe starts reloading)
225
+ // Fall back to cached URL if log didn't have it
226
+ if (!previewUrl)
227
+ previewUrl = cachedPreviewUrl;
228
+ // 3. Switch scenario if provided
229
+ if (scenarioSlug) {
230
+ try {
231
+ const projectRoot = process.env.CODEYAM_ROOT_PATH || process.cwd();
232
+ const codeyamDir = path.join(projectRoot, '.codeyam');
233
+ const activeScenarioPath = path.join(codeyamDir, 'active-scenario.json');
234
+ fs.mkdirSync(codeyamDir, { recursive: true });
235
+ fs.writeFileSync(activeScenarioPath, JSON.stringify({
236
+ scenarioSlug,
237
+ scenarioId: scenarioId || null,
238
+ dataFile: scenarioId
239
+ ? `.codeyam/editor-scenarios/${scenarioId}.json`
240
+ : null,
241
+ switchedAt: new Date().toISOString(),
242
+ }, null, 2));
243
+ }
244
+ catch {
245
+ // Scenario switch failed — not critical, continue with refresh
246
+ }
247
+ }
248
+ // 4. Broadcast WebSocket refresh to browser (iframe starts reloading)
223
249
  try {
224
250
  const { broadcastPreviewRefresh } = await import('./terminalServer.js');
225
- sessionsNotified = broadcastPreviewRefresh();
251
+ sessionsNotified = broadcastPreviewRefresh(navPath || undefined);
226
252
  }
227
253
  catch {
228
254
  // Terminal server not loaded yet — ignore
229
255
  }
230
- // Clear the server log so post-refresh log reads only show fresh output
256
+ // 5. Clear the server log so post-refresh log reads only show fresh output
231
257
  if (logPath && fs.existsSync(logPath)) {
232
258
  try {
233
259
  fs.writeFileSync(logPath, '');
@@ -237,12 +263,23 @@ app.post('/api/dev-mode-refresh', async (_req, res) => {
237
263
  // Log file not writable — not critical
238
264
  }
239
265
  }
240
- // Wait for Vite HMR to settle and the page to re-render
266
+ // 6. Wait for HMR to settle and the page to re-render
241
267
  await new Promise((resolve) => setTimeout(resolve, 2000));
242
- // Fetch the preview URL to detect SSR errors
268
+ // 7. Compute the full URL (with navigation path if provided)
269
+ let fullUrl = previewUrl;
270
+ if (navPath && previewUrl) {
271
+ try {
272
+ fullUrl = new URL(navPath, previewUrl).href;
273
+ }
274
+ catch {
275
+ fullUrl = previewUrl;
276
+ }
277
+ }
278
+ // 8. Fetch the preview URL to detect SSR errors
243
279
  let preview = null;
244
- if (previewUrl) {
245
- preview = await checkPreviewHealth(previewUrl);
280
+ const healthCheckUrl = fullUrl || previewUrl;
281
+ if (healthCheckUrl) {
282
+ preview = await checkPreviewHealth(healthCheckUrl);
246
283
  // If unhealthy, write error to log so Claude can see it via tail
247
284
  if (!preview.healthy && preview.error && logPath) {
248
285
  try {
@@ -257,7 +294,19 @@ app.post('/api/dev-mode-refresh', async (_req, res) => {
257
294
  }
258
295
  }
259
296
  }
260
- res.json({ success: true, sessionsNotified, logCleared, preview });
297
+ res.json({
298
+ success: true,
299
+ sessionsNotified,
300
+ logCleared,
301
+ url: fullUrl || null,
302
+ preview,
303
+ });
304
+ });
305
+ // Show results panel in the editor Build tab — triggered by Claude at end of step 12.
306
+ app.post('/api/editor-show-results', async (_req, res) => {
307
+ const { broadcastShowResults } = await import('./terminalServer.js');
308
+ const sessionsNotified = broadcastShowResults();
309
+ res.json({ success: true, sessionsNotified });
261
310
  });
262
311
  // Handle Remix routes (API routes, page routes, etc.)
263
312
  if (process.env.NODE_ENV === 'development') {