@electric-agent/studio 1.7.0 → 1.12.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 (119) hide show
  1. package/dist/active-sessions.d.ts +2 -0
  2. package/dist/active-sessions.d.ts.map +1 -1
  3. package/dist/active-sessions.js +4 -0
  4. package/dist/active-sessions.js.map +1 -1
  5. package/dist/api-schemas.d.ts +225 -0
  6. package/dist/api-schemas.d.ts.map +1 -0
  7. package/dist/api-schemas.js +95 -0
  8. package/dist/api-schemas.js.map +1 -0
  9. package/dist/bridge/claude-code-base.d.ts +121 -0
  10. package/dist/bridge/claude-code-base.d.ts.map +1 -0
  11. package/dist/bridge/claude-code-base.js +263 -0
  12. package/dist/bridge/claude-code-base.js.map +1 -0
  13. package/dist/bridge/claude-code-docker.d.ts +13 -73
  14. package/dist/bridge/claude-code-docker.d.ts.map +1 -1
  15. package/dist/bridge/claude-code-docker.js +91 -302
  16. package/dist/bridge/claude-code-docker.js.map +1 -1
  17. package/dist/bridge/claude-code-sprites.d.ts +12 -59
  18. package/dist/bridge/claude-code-sprites.d.ts.map +1 -1
  19. package/dist/bridge/claude-code-sprites.js +88 -281
  20. package/dist/bridge/claude-code-sprites.js.map +1 -1
  21. package/dist/bridge/claude-md-generator.d.ts +15 -3
  22. package/dist/bridge/claude-md-generator.d.ts.map +1 -1
  23. package/dist/bridge/claude-md-generator.js +79 -98
  24. package/dist/bridge/claude-md-generator.js.map +1 -1
  25. package/dist/bridge/codex-docker.d.ts +56 -51
  26. package/dist/bridge/codex-docker.js +222 -230
  27. package/dist/bridge/codex-json-parser.d.ts +11 -11
  28. package/dist/bridge/codex-json-parser.js +231 -238
  29. package/dist/bridge/codex-md-generator.d.ts +3 -3
  30. package/dist/bridge/codex-md-generator.js +42 -32
  31. package/dist/bridge/codex-sprites.d.ts +50 -45
  32. package/dist/bridge/codex-sprites.js +212 -222
  33. package/dist/bridge/daytona.d.ts +25 -25
  34. package/dist/bridge/daytona.js +131 -136
  35. package/dist/bridge/docker-stdio.d.ts +21 -21
  36. package/dist/bridge/docker-stdio.js +126 -132
  37. package/dist/bridge/hosted.d.ts +3 -2
  38. package/dist/bridge/hosted.d.ts.map +1 -1
  39. package/dist/bridge/hosted.js +4 -0
  40. package/dist/bridge/hosted.js.map +1 -1
  41. package/dist/bridge/message-parser.d.ts +24 -0
  42. package/dist/bridge/message-parser.d.ts.map +1 -0
  43. package/dist/bridge/message-parser.js +39 -0
  44. package/dist/bridge/message-parser.js.map +1 -0
  45. package/dist/bridge/role-skills.d.ts +25 -0
  46. package/dist/bridge/role-skills.d.ts.map +1 -0
  47. package/dist/bridge/role-skills.js +120 -0
  48. package/dist/bridge/role-skills.js.map +1 -0
  49. package/dist/bridge/room-messaging-skill.d.ts +11 -0
  50. package/dist/bridge/room-messaging-skill.d.ts.map +1 -0
  51. package/dist/bridge/room-messaging-skill.js +41 -0
  52. package/dist/bridge/room-messaging-skill.js.map +1 -0
  53. package/dist/bridge/sprites.d.ts +22 -22
  54. package/dist/bridge/sprites.js +123 -128
  55. package/dist/bridge/types.d.ts +4 -10
  56. package/dist/bridge/types.d.ts.map +1 -1
  57. package/dist/client/assets/index-BfvQSMwH.css +1 -0
  58. package/dist/client/assets/index-CtOOaA2Q.js +235 -0
  59. package/dist/client/index.html +2 -2
  60. package/dist/github-app.d.ts +14 -0
  61. package/dist/github-app.d.ts.map +1 -0
  62. package/dist/github-app.js +62 -0
  63. package/dist/github-app.js.map +1 -0
  64. package/dist/github-app.test.d.ts +2 -0
  65. package/dist/github-app.test.d.ts.map +1 -0
  66. package/dist/github-app.test.js +62 -0
  67. package/dist/github-app.test.js.map +1 -0
  68. package/dist/index.d.ts +4 -3
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +3 -3
  71. package/dist/index.js.map +1 -1
  72. package/dist/invite-code.d.ts +5 -0
  73. package/dist/invite-code.d.ts.map +1 -0
  74. package/dist/invite-code.js +14 -0
  75. package/dist/invite-code.js.map +1 -0
  76. package/dist/project-utils.d.ts.map +1 -1
  77. package/dist/project-utils.js.map +1 -1
  78. package/dist/registry.d.ts +11 -4
  79. package/dist/registry.d.ts.map +1 -1
  80. package/dist/registry.js +1 -1
  81. package/dist/registry.js.map +1 -1
  82. package/dist/room-router.d.ts +73 -0
  83. package/dist/room-router.d.ts.map +1 -0
  84. package/dist/room-router.js +345 -0
  85. package/dist/room-router.js.map +1 -0
  86. package/dist/sandbox/docker.d.ts +1 -0
  87. package/dist/sandbox/docker.d.ts.map +1 -1
  88. package/dist/sandbox/docker.js +56 -6
  89. package/dist/sandbox/docker.js.map +1 -1
  90. package/dist/sandbox/index.d.ts +0 -1
  91. package/dist/sandbox/index.d.ts.map +1 -1
  92. package/dist/sandbox/index.js +0 -1
  93. package/dist/sandbox/index.js.map +1 -1
  94. package/dist/sandbox/sprites.d.ts +1 -0
  95. package/dist/sandbox/sprites.d.ts.map +1 -1
  96. package/dist/sandbox/sprites.js +91 -10
  97. package/dist/sandbox/sprites.js.map +1 -1
  98. package/dist/sandbox/types.d.ts +9 -2
  99. package/dist/sandbox/types.d.ts.map +1 -1
  100. package/dist/server.d.ts +12 -0
  101. package/dist/server.d.ts.map +1 -1
  102. package/dist/server.js +906 -445
  103. package/dist/server.js.map +1 -1
  104. package/dist/session-auth.d.ts +9 -0
  105. package/dist/session-auth.d.ts.map +1 -1
  106. package/dist/session-auth.js +30 -0
  107. package/dist/session-auth.js.map +1 -1
  108. package/dist/sessions.d.ts +1 -1
  109. package/dist/streams.d.ts +2 -6
  110. package/dist/streams.d.ts.map +1 -1
  111. package/dist/streams.js +6 -17
  112. package/dist/streams.js.map +1 -1
  113. package/dist/validate.d.ts +10 -0
  114. package/dist/validate.d.ts.map +1 -0
  115. package/dist/validate.js +24 -0
  116. package/dist/validate.js.map +1 -0
  117. package/package.json +6 -9
  118. package/dist/client/assets/index-D5-jqAV-.js +0 -234
  119. package/dist/client/assets/index-YyyiO26y.css +0 -1
@@ -11,264 +11,257 @@
11
11
  *
12
12
  * This parser converts each line into zero or more EngineEvent objects.
13
13
  */
14
- import { ts } from "@electric-agent/protocol";
14
+ import { ts } from "@electric-agent/protocol"
15
15
  /**
16
16
  * Create a new stateful parser. The returned `parse` function converts
17
17
  * a single raw JSON line from Codex into zero or more EngineEvents.
18
18
  */
19
19
  export function createCodexJsonParser() {
20
- const state = {
21
- toolNames: new Map(),
22
- totalCost: 0,
23
- threadId: null,
24
- };
25
- return {
26
- state,
27
- parse(line) {
28
- return parseLine(line, state);
29
- },
30
- };
20
+ const state = {
21
+ toolNames: new Map(),
22
+ totalCost: 0,
23
+ threadId: null,
24
+ }
25
+ return {
26
+ state,
27
+ parse(line) {
28
+ return parseLine(line, state)
29
+ },
30
+ }
31
31
  }
32
32
  function parseLine(line, state) {
33
- const trimmed = line.trim();
34
- if (!trimmed)
35
- return [];
36
- let msg;
37
- try {
38
- msg = JSON.parse(trimmed);
39
- }
40
- catch {
41
- return [];
42
- }
43
- if (!msg.type)
44
- return [];
45
- switch (msg.type) {
46
- case "thread.started":
47
- return handleThreadStarted(msg, state);
48
- case "item.started":
49
- return handleItemStarted(msg, state);
50
- case "item.completed":
51
- return handleItemCompleted(msg, state);
52
- case "turn.completed":
53
- return handleTurnCompleted(msg, state);
54
- case "turn.failed":
55
- return handleTurnFailed(msg);
56
- default:
57
- return [];
58
- }
33
+ const trimmed = line.trim()
34
+ if (!trimmed) return []
35
+ let msg
36
+ try {
37
+ msg = JSON.parse(trimmed)
38
+ } catch {
39
+ return []
40
+ }
41
+ if (!msg.type) return []
42
+ switch (msg.type) {
43
+ case "thread.started":
44
+ return handleThreadStarted(msg, state)
45
+ case "item.started":
46
+ return handleItemStarted(msg, state)
47
+ case "item.completed":
48
+ return handleItemCompleted(msg, state)
49
+ case "turn.completed":
50
+ return handleTurnCompleted(msg, state)
51
+ case "turn.failed":
52
+ return handleTurnFailed(msg)
53
+ default:
54
+ return []
55
+ }
59
56
  }
60
57
  function handleThreadStarted(msg, state) {
61
- state.threadId = msg.thread_id ?? null;
62
- return [
63
- {
64
- type: "session_start",
65
- session_id: msg.thread_id ?? "",
66
- ts: ts(),
67
- },
68
- ];
58
+ state.threadId = msg.thread_id ?? null
59
+ return [
60
+ {
61
+ type: "session_start",
62
+ session_id: msg.thread_id ?? "",
63
+ ts: ts(),
64
+ },
65
+ ]
69
66
  }
70
67
  function handleItemStarted(msg, state) {
71
- const item = msg.item;
72
- if (!item?.type)
73
- return [];
74
- switch (item.type) {
75
- case "command_execution": {
76
- const ce = item;
77
- const toolUseId = ce.id ?? `codex_${Date.now()}`;
78
- state.toolNames.set(toolUseId, "Bash");
79
- return [
80
- {
81
- type: "pre_tool_use",
82
- tool_name: "Bash",
83
- tool_use_id: toolUseId,
84
- tool_input: { command: ce.command ?? "" },
85
- ts: ts(),
86
- },
87
- ];
88
- }
89
- case "file_change": {
90
- const fc = item;
91
- const toolUseId = fc.id ?? `codex_${Date.now()}`;
92
- const toolName = fc.action === "delete" ? "Delete" : "Write";
93
- state.toolNames.set(toolUseId, toolName);
94
- return [
95
- {
96
- type: "pre_tool_use",
97
- tool_name: toolName,
98
- tool_use_id: toolUseId,
99
- tool_input: { file_path: fc.file_path ?? "", action: fc.action ?? "write" },
100
- ts: ts(),
101
- },
102
- ];
103
- }
104
- case "mcp_tool_call": {
105
- const mc = item;
106
- const toolUseId = mc.id ?? `codex_${Date.now()}`;
107
- const toolName = mc.tool_name
108
- ? mc.server_name
109
- ? `mcp__${mc.server_name}__${mc.tool_name}`
110
- : mc.tool_name
111
- : "mcp_tool";
112
- state.toolNames.set(toolUseId, toolName);
113
- return [
114
- {
115
- type: "pre_tool_use",
116
- tool_name: toolName,
117
- tool_use_id: toolUseId,
118
- tool_input: mc.arguments ?? {},
119
- ts: ts(),
120
- },
121
- ];
122
- }
123
- case "reasoning": {
124
- const r = item;
125
- if (r.content) {
126
- return [
127
- {
128
- type: "assistant_thinking",
129
- text: r.content,
130
- ts: ts(),
131
- },
132
- ];
133
- }
134
- return [];
135
- }
136
- default:
137
- return [];
138
- }
68
+ const item = msg.item
69
+ if (!item?.type) return []
70
+ switch (item.type) {
71
+ case "command_execution": {
72
+ const ce = item
73
+ const toolUseId = ce.id ?? `codex_${Date.now()}`
74
+ state.toolNames.set(toolUseId, "Bash")
75
+ return [
76
+ {
77
+ type: "pre_tool_use",
78
+ tool_name: "Bash",
79
+ tool_use_id: toolUseId,
80
+ tool_input: { command: ce.command ?? "" },
81
+ ts: ts(),
82
+ },
83
+ ]
84
+ }
85
+ case "file_change": {
86
+ const fc = item
87
+ const toolUseId = fc.id ?? `codex_${Date.now()}`
88
+ const toolName = fc.action === "delete" ? "Delete" : "Write"
89
+ state.toolNames.set(toolUseId, toolName)
90
+ return [
91
+ {
92
+ type: "pre_tool_use",
93
+ tool_name: toolName,
94
+ tool_use_id: toolUseId,
95
+ tool_input: { file_path: fc.file_path ?? "", action: fc.action ?? "write" },
96
+ ts: ts(),
97
+ },
98
+ ]
99
+ }
100
+ case "mcp_tool_call": {
101
+ const mc = item
102
+ const toolUseId = mc.id ?? `codex_${Date.now()}`
103
+ const toolName = mc.tool_name
104
+ ? mc.server_name
105
+ ? `mcp__${mc.server_name}__${mc.tool_name}`
106
+ : mc.tool_name
107
+ : "mcp_tool"
108
+ state.toolNames.set(toolUseId, toolName)
109
+ return [
110
+ {
111
+ type: "pre_tool_use",
112
+ tool_name: toolName,
113
+ tool_use_id: toolUseId,
114
+ tool_input: mc.arguments ?? {},
115
+ ts: ts(),
116
+ },
117
+ ]
118
+ }
119
+ case "reasoning": {
120
+ const r = item
121
+ if (r.content) {
122
+ return [
123
+ {
124
+ type: "assistant_thinking",
125
+ text: r.content,
126
+ ts: ts(),
127
+ },
128
+ ]
129
+ }
130
+ return []
131
+ }
132
+ default:
133
+ return []
134
+ }
139
135
  }
140
136
  function handleItemCompleted(msg, state) {
141
- const item = msg.item;
142
- if (!item?.type)
143
- return [];
144
- switch (item.type) {
145
- case "agent_message": {
146
- const am = item;
147
- const text = extractMessageText(am.content);
148
- if (text) {
149
- return [
150
- {
151
- type: "assistant_message",
152
- text,
153
- ts: ts(),
154
- },
155
- ];
156
- }
157
- return [];
158
- }
159
- case "command_execution": {
160
- const ce = item;
161
- const toolUseId = ce.id ?? "";
162
- const toolName = state.toolNames.get(toolUseId) ?? "Bash";
163
- const isError = ce.exit_code != null && ce.exit_code !== 0;
164
- const response = ce.output ?? "";
165
- if (isError) {
166
- return [
167
- {
168
- type: "post_tool_use",
169
- tool_use_id: toolUseId,
170
- tool_name: toolName,
171
- tool_response: response,
172
- error: response || `Exit code: ${ce.exit_code}`,
173
- ts: ts(),
174
- },
175
- ];
176
- }
177
- return [
178
- {
179
- type: "post_tool_use",
180
- tool_use_id: toolUseId,
181
- tool_name: toolName,
182
- tool_response: response,
183
- ts: ts(),
184
- },
185
- ];
186
- }
187
- case "file_change": {
188
- const fc = item;
189
- const toolUseId = fc.id ?? "";
190
- const toolName = state.toolNames.get(toolUseId) ?? "Write";
191
- return [
192
- {
193
- type: "post_tool_use",
194
- tool_use_id: toolUseId,
195
- tool_name: toolName,
196
- tool_response: fc.diff ?? fc.content ?? `File ${fc.action ?? "changed"}: ${fc.file_path ?? ""}`,
197
- ts: ts(),
198
- },
199
- ];
200
- }
201
- case "mcp_tool_call": {
202
- const mc = item;
203
- const toolUseId = mc.id ?? "";
204
- const toolName = state.toolNames.get(toolUseId) ?? "mcp_tool";
205
- return [
206
- {
207
- type: "post_tool_use",
208
- tool_use_id: toolUseId,
209
- tool_name: toolName,
210
- tool_response: mc.result ?? "",
211
- ts: ts(),
212
- },
213
- ];
214
- }
215
- case "reasoning": {
216
- const r = item;
217
- if (r.content) {
218
- return [
219
- {
220
- type: "assistant_thinking",
221
- text: r.content,
222
- ts: ts(),
223
- },
224
- ];
225
- }
226
- return [];
227
- }
228
- default:
229
- return [];
230
- }
137
+ const item = msg.item
138
+ if (!item?.type) return []
139
+ switch (item.type) {
140
+ case "agent_message": {
141
+ const am = item
142
+ const text = extractMessageText(am.content)
143
+ if (text) {
144
+ return [
145
+ {
146
+ type: "assistant_message",
147
+ text,
148
+ ts: ts(),
149
+ },
150
+ ]
151
+ }
152
+ return []
153
+ }
154
+ case "command_execution": {
155
+ const ce = item
156
+ const toolUseId = ce.id ?? ""
157
+ const toolName = state.toolNames.get(toolUseId) ?? "Bash"
158
+ const isError = ce.exit_code != null && ce.exit_code !== 0
159
+ const response = ce.output ?? ""
160
+ if (isError) {
161
+ return [
162
+ {
163
+ type: "post_tool_use",
164
+ tool_use_id: toolUseId,
165
+ tool_name: toolName,
166
+ tool_response: response,
167
+ error: response || `Exit code: ${ce.exit_code}`,
168
+ ts: ts(),
169
+ },
170
+ ]
171
+ }
172
+ return [
173
+ {
174
+ type: "post_tool_use",
175
+ tool_use_id: toolUseId,
176
+ tool_name: toolName,
177
+ tool_response: response,
178
+ ts: ts(),
179
+ },
180
+ ]
181
+ }
182
+ case "file_change": {
183
+ const fc = item
184
+ const toolUseId = fc.id ?? ""
185
+ const toolName = state.toolNames.get(toolUseId) ?? "Write"
186
+ return [
187
+ {
188
+ type: "post_tool_use",
189
+ tool_use_id: toolUseId,
190
+ tool_name: toolName,
191
+ tool_response:
192
+ fc.diff ?? fc.content ?? `File ${fc.action ?? "changed"}: ${fc.file_path ?? ""}`,
193
+ ts: ts(),
194
+ },
195
+ ]
196
+ }
197
+ case "mcp_tool_call": {
198
+ const mc = item
199
+ const toolUseId = mc.id ?? ""
200
+ const toolName = state.toolNames.get(toolUseId) ?? "mcp_tool"
201
+ return [
202
+ {
203
+ type: "post_tool_use",
204
+ tool_use_id: toolUseId,
205
+ tool_name: toolName,
206
+ tool_response: mc.result ?? "",
207
+ ts: ts(),
208
+ },
209
+ ]
210
+ }
211
+ case "reasoning": {
212
+ const r = item
213
+ if (r.content) {
214
+ return [
215
+ {
216
+ type: "assistant_thinking",
217
+ text: r.content,
218
+ ts: ts(),
219
+ },
220
+ ]
221
+ }
222
+ return []
223
+ }
224
+ default:
225
+ return []
226
+ }
231
227
  }
232
228
  function handleTurnCompleted(msg, state) {
233
- const events = [];
234
- if (msg.cost_usd != null) {
235
- state.totalCost += msg.cost_usd;
236
- events.push({
237
- type: "cost_update",
238
- totalCostUsd: state.totalCost,
239
- ts: ts(),
240
- });
241
- }
242
- return events;
229
+ const events = []
230
+ if (msg.cost_usd != null) {
231
+ state.totalCost += msg.cost_usd
232
+ events.push({
233
+ type: "cost_update",
234
+ totalCostUsd: state.totalCost,
235
+ ts: ts(),
236
+ })
237
+ }
238
+ return events
243
239
  }
244
240
  function handleTurnFailed(msg) {
245
- return [
246
- {
247
- type: "log",
248
- level: "error",
249
- message: msg.error ?? "Turn failed",
250
- ts: ts(),
251
- },
252
- ];
241
+ return [
242
+ {
243
+ type: "log",
244
+ level: "error",
245
+ message: msg.error ?? "Turn failed",
246
+ ts: ts(),
247
+ },
248
+ ]
253
249
  }
254
250
  // ---------------------------------------------------------------------------
255
251
  // Helpers
256
252
  // ---------------------------------------------------------------------------
257
253
  function extractMessageText(content) {
258
- if (content == null)
259
- return "";
260
- if (typeof content === "string")
261
- return content;
262
- if (Array.isArray(content)) {
263
- return content
264
- .map((block) => {
265
- if (block.type === "text" && typeof block.text === "string")
266
- return block.text;
267
- return "";
268
- })
269
- .filter(Boolean)
270
- .join("\n");
271
- }
272
- return String(content);
254
+ if (content == null) return ""
255
+ if (typeof content === "string") return content
256
+ if (Array.isArray(content)) {
257
+ return content
258
+ .map((block) => {
259
+ if (block.type === "text" && typeof block.text === "string") return block.text
260
+ return ""
261
+ })
262
+ .filter(Boolean)
263
+ .join("\n")
264
+ }
265
+ return String(content)
273
266
  }
274
- //# sourceMappingURL=codex-json-parser.js.map
267
+ //# sourceMappingURL=codex-json-parser.js.map
@@ -5,10 +5,10 @@
5
5
  * since the instructions are framework-specific (Electric SQL + TanStack DB),
6
6
  * not agent-specific.
7
7
  */
8
- import type { ClaudeMdOptions } from "./claude-md-generator.js";
8
+ import type { ClaudeMdOptions } from "./claude-md-generator.js"
9
9
  /**
10
10
  * Generate an AGENTS.md file for Codex CLI mode.
11
11
  * Uses the same stack-specific content as Claude Code mode.
12
12
  */
13
- export declare function generateCodexMd(opts: ClaudeMdOptions): string;
14
- //# sourceMappingURL=codex-md-generator.d.ts.map
13
+ export declare function generateCodexMd(opts: ClaudeMdOptions): string
14
+ //# sourceMappingURL=codex-md-generator.d.ts.map
@@ -5,41 +5,51 @@
5
5
  * since the instructions are framework-specific (Electric SQL + TanStack DB),
6
6
  * not agent-specific.
7
7
  */
8
- import { DRIZZLE_WORKFLOW, devServerInstructions, GUARDRAILS, INFRASTRUCTURE, PLAYBOOK_INSTRUCTIONS, PROJECT_CONTEXT, SCAFFOLD_STRUCTURE, SSR_RULES, sandboxEnvironment, } from "./claude-md-generator.js";
8
+ import {
9
+ DRIZZLE_WORKFLOW,
10
+ devServerInstructions,
11
+ GUARDRAILS,
12
+ INFRASTRUCTURE,
13
+ PLAYBOOK_INSTRUCTIONS,
14
+ PROJECT_CONTEXT,
15
+ SCAFFOLD_STRUCTURE,
16
+ SSR_RULES,
17
+ sandboxEnvironment,
18
+ } from "./claude-md-generator.js"
9
19
  /**
10
20
  * Generate an AGENTS.md file for Codex CLI mode.
11
21
  * Uses the same stack-specific content as Claude Code mode.
12
22
  */
13
23
  export function generateCodexMd(opts) {
14
- const sections = [];
15
- sections.push(`# ${opts.projectName}`);
16
- sections.push("");
17
- sections.push(PROJECT_CONTEXT);
18
- sections.push("");
19
- const sandbox = sandboxEnvironment(opts.runtime);
20
- if (sandbox) {
21
- sections.push(sandbox);
22
- sections.push("");
23
- }
24
- if (!opts.isIteration) {
25
- sections.push("## Current Task");
26
- sections.push(opts.description);
27
- sections.push("");
28
- }
29
- sections.push(SCAFFOLD_STRUCTURE);
30
- sections.push("");
31
- sections.push(DRIZZLE_WORKFLOW);
32
- sections.push("");
33
- sections.push(GUARDRAILS);
34
- sections.push("");
35
- sections.push(PLAYBOOK_INSTRUCTIONS);
36
- sections.push("");
37
- sections.push(INFRASTRUCTURE);
38
- sections.push("");
39
- sections.push(devServerInstructions(opts.runtime));
40
- sections.push("");
41
- sections.push(SSR_RULES);
42
- sections.push("");
43
- return sections.join("\n");
24
+ const sections = []
25
+ sections.push(`# ${opts.projectName}`)
26
+ sections.push("")
27
+ sections.push(PROJECT_CONTEXT)
28
+ sections.push("")
29
+ const sandbox = sandboxEnvironment(opts.runtime)
30
+ if (sandbox) {
31
+ sections.push(sandbox)
32
+ sections.push("")
33
+ }
34
+ if (!opts.isIteration) {
35
+ sections.push("## Current Task")
36
+ sections.push(opts.description)
37
+ sections.push("")
38
+ }
39
+ sections.push(SCAFFOLD_STRUCTURE)
40
+ sections.push("")
41
+ sections.push(DRIZZLE_WORKFLOW)
42
+ sections.push("")
43
+ sections.push(GUARDRAILS)
44
+ sections.push("")
45
+ sections.push(PLAYBOOK_INSTRUCTIONS)
46
+ sections.push("")
47
+ sections.push(INFRASTRUCTURE)
48
+ sections.push("")
49
+ sections.push(devServerInstructions(opts.runtime))
50
+ sections.push("")
51
+ sections.push(SSR_RULES)
52
+ sections.push("")
53
+ return sections.join("\n")
44
54
  }
45
- //# sourceMappingURL=codex-md-generator.js.map
55
+ //# sourceMappingURL=codex-md-generator.js.map