@electric-agent/agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/agents/clarifier.d.ts +16 -0
  2. package/dist/agents/clarifier.d.ts.map +1 -0
  3. package/dist/agents/clarifier.js +158 -0
  4. package/dist/agents/clarifier.js.map +1 -0
  5. package/dist/agents/coder.d.ts +14 -0
  6. package/dist/agents/coder.d.ts.map +1 -0
  7. package/dist/agents/coder.js +126 -0
  8. package/dist/agents/coder.js.map +1 -0
  9. package/dist/agents/planner.d.ts +6 -0
  10. package/dist/agents/planner.d.ts.map +1 -0
  11. package/dist/agents/planner.js +69 -0
  12. package/dist/agents/planner.js.map +1 -0
  13. package/dist/agents/prompts.d.ts +9 -0
  14. package/dist/agents/prompts.d.ts.map +1 -0
  15. package/dist/agents/prompts.js +231 -0
  16. package/dist/agents/prompts.js.map +1 -0
  17. package/dist/cli/headless.d.ts +9 -0
  18. package/dist/cli/headless.d.ts.map +1 -0
  19. package/dist/cli/headless.js +506 -0
  20. package/dist/cli/headless.js.map +1 -0
  21. package/dist/cli/serve.d.ts +6 -0
  22. package/dist/cli/serve.d.ts.map +1 -0
  23. package/dist/cli/serve.js +113 -0
  24. package/dist/cli/serve.js.map +1 -0
  25. package/dist/engine/message-parser.d.ts +8 -0
  26. package/dist/engine/message-parser.d.ts.map +1 -0
  27. package/dist/engine/message-parser.js +106 -0
  28. package/dist/engine/message-parser.js.map +1 -0
  29. package/dist/engine/orchestrator.d.ts +50 -0
  30. package/dist/engine/orchestrator.d.ts.map +1 -0
  31. package/dist/engine/orchestrator.js +492 -0
  32. package/dist/engine/orchestrator.js.map +1 -0
  33. package/dist/engine/stdio-adapter.d.ts +24 -0
  34. package/dist/engine/stdio-adapter.d.ts.map +1 -0
  35. package/dist/engine/stdio-adapter.js +139 -0
  36. package/dist/engine/stdio-adapter.js.map +1 -0
  37. package/dist/engine/stream-adapter.d.ts +45 -0
  38. package/dist/engine/stream-adapter.d.ts.map +1 -0
  39. package/dist/engine/stream-adapter.js +154 -0
  40. package/dist/engine/stream-adapter.js.map +1 -0
  41. package/dist/find-env.d.ts +3 -0
  42. package/dist/find-env.d.ts.map +1 -0
  43. package/dist/find-env.js +16 -0
  44. package/dist/find-env.js.map +1 -0
  45. package/dist/git/index.d.ts +114 -0
  46. package/dist/git/index.d.ts.map +1 -0
  47. package/dist/git/index.js +434 -0
  48. package/dist/git/index.js.map +1 -0
  49. package/dist/hooks/block-bash.d.ts +7 -0
  50. package/dist/hooks/block-bash.d.ts.map +1 -0
  51. package/dist/hooks/block-bash.js +15 -0
  52. package/dist/hooks/block-bash.js.map +1 -0
  53. package/dist/hooks/dependency-guard.d.ts +7 -0
  54. package/dist/hooks/dependency-guard.d.ts.map +1 -0
  55. package/dist/hooks/dependency-guard.js +43 -0
  56. package/dist/hooks/dependency-guard.js.map +1 -0
  57. package/dist/hooks/guardrail-inject.d.ts +17 -0
  58. package/dist/hooks/guardrail-inject.d.ts.map +1 -0
  59. package/dist/hooks/guardrail-inject.js +69 -0
  60. package/dist/hooks/guardrail-inject.js.map +1 -0
  61. package/dist/hooks/import-validation.d.ts +7 -0
  62. package/dist/hooks/import-validation.d.ts.map +1 -0
  63. package/dist/hooks/import-validation.js +192 -0
  64. package/dist/hooks/import-validation.js.map +1 -0
  65. package/dist/hooks/index.d.ts +15 -0
  66. package/dist/hooks/index.d.ts.map +1 -0
  67. package/dist/hooks/index.js +42 -0
  68. package/dist/hooks/index.js.map +1 -0
  69. package/dist/hooks/migration-validation.d.ts +9 -0
  70. package/dist/hooks/migration-validation.d.ts.map +1 -0
  71. package/dist/hooks/migration-validation.js +62 -0
  72. package/dist/hooks/migration-validation.js.map +1 -0
  73. package/dist/hooks/schema-consistency.d.ts +12 -0
  74. package/dist/hooks/schema-consistency.d.ts.map +1 -0
  75. package/dist/hooks/schema-consistency.js +72 -0
  76. package/dist/hooks/schema-consistency.js.map +1 -0
  77. package/dist/hooks/write-protection.d.ts +7 -0
  78. package/dist/hooks/write-protection.d.ts.map +1 -0
  79. package/dist/hooks/write-protection.js +33 -0
  80. package/dist/hooks/write-protection.js.map +1 -0
  81. package/dist/index.d.ts +3 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +37 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/progress/reporter.d.ts +15 -0
  86. package/dist/progress/reporter.d.ts.map +1 -0
  87. package/dist/progress/reporter.js +133 -0
  88. package/dist/progress/reporter.js.map +1 -0
  89. package/dist/scaffold/index.d.ts +23 -0
  90. package/dist/scaffold/index.d.ts.map +1 -0
  91. package/dist/scaffold/index.js +315 -0
  92. package/dist/scaffold/index.js.map +1 -0
  93. package/dist/tools/build.d.ts +3 -0
  94. package/dist/tools/build.d.ts.map +1 -0
  95. package/dist/tools/build.js +84 -0
  96. package/dist/tools/build.js.map +1 -0
  97. package/dist/tools/playbook.d.ts +14 -0
  98. package/dist/tools/playbook.d.ts.map +1 -0
  99. package/dist/tools/playbook.js +239 -0
  100. package/dist/tools/playbook.js.map +1 -0
  101. package/dist/tools/server.d.ts +3 -0
  102. package/dist/tools/server.d.ts.map +1 -0
  103. package/dist/tools/server.js +13 -0
  104. package/dist/tools/server.js.map +1 -0
  105. package/dist/working-memory/errors.d.ts +14 -0
  106. package/dist/working-memory/errors.d.ts.map +1 -0
  107. package/dist/working-memory/errors.js +89 -0
  108. package/dist/working-memory/errors.js.map +1 -0
  109. package/dist/working-memory/session.d.ts +12 -0
  110. package/dist/working-memory/session.d.ts.map +1 -0
  111. package/dist/working-memory/session.js +71 -0
  112. package/dist/working-memory/session.js.map +1 -0
  113. package/package.json +50 -0
  114. package/playbooks/electric-app-guardrails/SKILL.md +255 -0
  115. package/template/.env.example +2 -0
  116. package/template/Caddyfile +11 -0
  117. package/template/docker-compose.yml +47 -0
  118. package/template/drizzle.config.ts +12 -0
  119. package/template/postgres.conf +4 -0
  120. package/template/src/components/ClientOnly.tsx +27 -0
  121. package/template/src/db/index.ts +7 -0
  122. package/template/src/db/schema.ts +14 -0
  123. package/template/src/db/utils.ts +31 -0
  124. package/template/src/db/zod-schemas.ts +14 -0
  125. package/template/src/lib/electric-proxy.ts +59 -0
  126. package/template/tests/helpers/schema-test-utils.ts +106 -0
  127. package/template/vitest.config.ts +7 -0
@@ -0,0 +1,133 @@
1
+ const PREFIXES = {
2
+ plan: "\x1b[36m[plan]\x1b[0m",
3
+ approve: "\x1b[33m[approve]\x1b[0m",
4
+ task: "\x1b[34m[task]\x1b[0m",
5
+ build: "\x1b[35m[build]\x1b[0m",
6
+ fix: "\x1b[33m[fix]\x1b[0m",
7
+ done: "\x1b[32m[done]\x1b[0m",
8
+ error: "\x1b[31m[error]\x1b[0m",
9
+ verbose: "\x1b[2m[verbose]\x1b[0m",
10
+ };
11
+ export function createProgressReporter(opts) {
12
+ const verboseMode = opts?.verbose ?? false;
13
+ return {
14
+ verboseMode,
15
+ log(level, message) {
16
+ if (level === "verbose" && !verboseMode)
17
+ return;
18
+ console.log(`${PREFIXES[level]} ${message}`);
19
+ },
20
+ logToolUse(toolName, summary) {
21
+ const prefix = "\x1b[2m";
22
+ const reset = "\x1b[0m";
23
+ console.log(`${prefix} ↳ ${toolName}: ${summary}${reset}`);
24
+ },
25
+ };
26
+ }
27
+ /**
28
+ * Process SDK messages and route them to the progress reporter.
29
+ */
30
+ export function processAgentMessage(message, reporter) {
31
+ if (message.type === "assistant" && message.message?.content) {
32
+ const content = message.message.content;
33
+ for (const block of content) {
34
+ if ("text" in block && block.text) {
35
+ const text = block.text;
36
+ if (reporter.verboseMode) {
37
+ reporter.log("verbose", text);
38
+ }
39
+ else if (text.length > 10) {
40
+ reporter.log("task", text);
41
+ }
42
+ }
43
+ else if ("thinking" in block && block.thinking && reporter.verboseMode) {
44
+ const thinking = block.thinking;
45
+ reporter.log("verbose", `[thinking] ${thinking.slice(0, 500)}`);
46
+ }
47
+ else if ("name" in block) {
48
+ const name = block.name;
49
+ const input = (block.input || {});
50
+ if (name === "Write" || name === "Edit") {
51
+ reporter.logToolUse(name, (input.file_path || "unknown file"));
52
+ }
53
+ else if (name === "Bash") {
54
+ const cmd = (input.command || "");
55
+ reporter.logToolUse("Bash", cmd.slice(0, 80));
56
+ }
57
+ else if (name.includes("build")) {
58
+ reporter.log("build", "Running build...");
59
+ }
60
+ else if (name.includes("playbook")) {
61
+ reporter.logToolUse("Playbook", (input.name || "read"));
62
+ }
63
+ }
64
+ }
65
+ }
66
+ else if (message.type === "user" && message.message?.content) {
67
+ // SDK sends tool results as user messages with tool_result content blocks
68
+ const msgContent = message.message.content;
69
+ if (Array.isArray(msgContent)) {
70
+ for (const block of msgContent) {
71
+ if (typeof block === "object" &&
72
+ block &&
73
+ block.type === "tool_result") {
74
+ const b = block;
75
+ const content = b.content;
76
+ const texts = [];
77
+ if (typeof content === "string") {
78
+ texts.push(content);
79
+ }
80
+ else if (Array.isArray(content)) {
81
+ for (const inner of content) {
82
+ if (typeof inner === "object" && inner && "text" in inner) {
83
+ texts.push(inner.text);
84
+ }
85
+ }
86
+ }
87
+ for (const text of texts) {
88
+ // Always surface build tool results (even without --verbose)
89
+ if (text.includes("=== pnpm run build ===")) {
90
+ try {
91
+ const result = JSON.parse(text);
92
+ const output = result.output || "";
93
+ const lines = output.split("\n").filter((l) => l.trim());
94
+ const tail = lines.slice(-8).join("\n");
95
+ if (!result.success) {
96
+ reporter.log("build", `FAILED (${result.errors})`);
97
+ reporter.log("build", tail);
98
+ }
99
+ else {
100
+ reporter.log("build", "Build passed");
101
+ }
102
+ }
103
+ catch {
104
+ // Not JSON — show raw tail
105
+ const lines = text.split("\n").filter((l) => l.trim());
106
+ reporter.log("build", lines.slice(-5).join("\n"));
107
+ }
108
+ continue;
109
+ }
110
+ if (reporter.verboseMode) {
111
+ reporter.log("verbose", `[tool_result] ${text.slice(0, 1000)}`);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ else if (message.type === "result") {
119
+ const sub = String(message.subtype);
120
+ const cost = message.total_cost_usd;
121
+ const costStr = `(cost: $${cost?.toFixed(4) || "?"})`;
122
+ if (sub === "success") {
123
+ reporter.log("done", `Agent completed ${costStr}`);
124
+ }
125
+ else if (sub.includes("max_turns")) {
126
+ reporter.log("task", `Agent reached turn limit ${costStr}`);
127
+ }
128
+ else {
129
+ reporter.log("error", `Agent stopped: ${sub} ${costStr}`);
130
+ }
131
+ }
132
+ }
133
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/progress/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ProgressReporter } from "../progress/reporter.js";
2
+ export interface ScaffoldResult {
3
+ projectDir: string;
4
+ skippedInstall: boolean;
5
+ errors: string[];
6
+ }
7
+ /**
8
+ * Scaffold a new Electric + TanStack DB project from the KPB template.
9
+ *
10
+ * 1. Clone KPB via `npx gitpick KyleAMathews/kpb`
11
+ * 2. Copy Electric + Drizzle infrastructure files
12
+ * 3. Merge dependencies into package.json
13
+ * 4. Patch vite.config.ts, root route, .gitignore
14
+ * 5. Set up .env and _agent/ directory
15
+ * 6. Run pnpm install
16
+ */
17
+ export declare function scaffold(projectDir: string, opts?: {
18
+ skipInstall?: boolean;
19
+ skipGit?: boolean;
20
+ projectName?: string;
21
+ reporter?: ProgressReporter;
22
+ }): Promise<ScaffoldResult>;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAK/D,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B,GACC,OAAO,CAAC,cAAc,CAAC,CAkJzB"}
@@ -0,0 +1,315 @@
1
+ import { execSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { gitInit } from "../git/index.js";
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const templateDir = path.resolve(__dirname, "../../template");
8
+ /**
9
+ * Scaffold a new Electric + TanStack DB project from the KPB template.
10
+ *
11
+ * 1. Clone KPB via `npx gitpick KyleAMathews/kpb`
12
+ * 2. Copy Electric + Drizzle infrastructure files
13
+ * 3. Merge dependencies into package.json
14
+ * 4. Patch vite.config.ts, root route, .gitignore
15
+ * 5. Set up .env and _agent/ directory
16
+ * 6. Run pnpm install
17
+ */
18
+ export async function scaffold(projectDir, opts) {
19
+ const errors = [];
20
+ const reporter = opts?.reporter;
21
+ let skippedInstall = opts?.skipInstall ?? false;
22
+ // Step 1: Clone KPB template
23
+ if (!fs.existsSync(projectDir)) {
24
+ fs.mkdirSync(projectDir, { recursive: true });
25
+ }
26
+ try {
27
+ reporter?.log("verbose", "Cloning KPB template via gitpick...");
28
+ execSync(`npx gitpick KyleAMathews/kpb ${projectDir} -o`, {
29
+ stdio: "pipe",
30
+ timeout: 120_000,
31
+ });
32
+ reporter?.log("verbose", "KPB template cloned");
33
+ }
34
+ catch (e) {
35
+ const msg = e instanceof Error ? e.message : "gitpick failed";
36
+ throw new Error(`Failed to clone KPB template: ${msg}`);
37
+ }
38
+ // Validate that gitpick actually produced a usable project
39
+ const pkgJsonPath = path.join(projectDir, "package.json");
40
+ if (!fs.existsSync(pkgJsonPath)) {
41
+ throw new Error(`Scaffold failed: package.json not found in ${projectDir} after cloning KPB template. ` +
42
+ "The template clone may have been incomplete.");
43
+ }
44
+ // Step 2: Copy template overlay files
45
+ reporter?.log("verbose", `Copying template overlay files from ${templateDir}...`);
46
+ if (!fs.existsSync(templateDir)) {
47
+ reporter?.log("error", `Template directory not found at ${templateDir} — template overlay files (drizzle.config.ts, etc.) will be missing`);
48
+ }
49
+ copyTemplateFiles(templateDir, projectDir);
50
+ reporter?.log("verbose", "Template overlay complete");
51
+ // Step 3: Merge dependencies and rename project
52
+ reporter?.log("verbose", "Merging dependencies into package.json...");
53
+ mergeDependencies(projectDir, opts?.projectName);
54
+ // Step 4: Delete stale lockfile (we changed deps, lockfile is now invalid)
55
+ const lockPath = path.join(projectDir, "pnpm-lock.yaml");
56
+ if (fs.existsSync(lockPath)) {
57
+ fs.unlinkSync(lockPath);
58
+ reporter?.log("verbose", "Removed stale pnpm-lock.yaml");
59
+ }
60
+ // Step 5: Patch vite.config.ts
61
+ reporter?.log("verbose", "Patching vite.config.ts...");
62
+ patchViteConfig(projectDir);
63
+ // Step 6: Patch root route for shellComponent
64
+ patchRootRoute(projectDir);
65
+ // Step 6b: Fix public-dir CSS imports that break Rollup production builds
66
+ reporter?.log("verbose", "Patching public CSS imports...");
67
+ patchPublicCssImports(projectDir);
68
+ // Step 7: Copy .env.example -> .env and ensure VITE_PORT is set
69
+ const envExample = path.join(projectDir, ".env.example");
70
+ const envFile = path.join(projectDir, ".env");
71
+ if (fs.existsSync(envExample) && !fs.existsSync(envFile)) {
72
+ fs.copyFileSync(envExample, envFile);
73
+ reporter?.log("verbose", "Copied .env.example to .env");
74
+ }
75
+ // Ensure VITE_PORT is in .env (default 5174 for local Caddy mode)
76
+ if (fs.existsSync(envFile)) {
77
+ const envContent = fs.readFileSync(envFile, "utf-8");
78
+ if (!envContent.includes("VITE_PORT")) {
79
+ fs.appendFileSync(envFile, "\nVITE_PORT=5174\n");
80
+ }
81
+ }
82
+ // Step 8: Create _agent/ working memory directory
83
+ const agentDir = path.join(projectDir, "_agent");
84
+ fs.mkdirSync(agentDir, { recursive: true });
85
+ fs.writeFileSync(path.join(agentDir, "errors.md"), "# Error Log\n\n", "utf-8");
86
+ fs.writeFileSync(path.join(agentDir, "session.md"), "# Session State\n\n", "utf-8");
87
+ reporter?.log("verbose", "Created _agent/ working memory directory");
88
+ // Step 9: Patch .gitignore
89
+ patchGitignore(projectDir);
90
+ // Step 10: Install dependencies
91
+ // Use --ignore-workspace to ensure packages install into the project's own
92
+ // node_modules, not a parent workspace. Generated apps are standalone.
93
+ if (!skippedInstall) {
94
+ try {
95
+ const installer = detectPackageManager(projectDir);
96
+ const ignoreWs = installer === "pnpm" ? " --ignore-workspace" : "";
97
+ reporter?.log("verbose", `Running ${installer} install...`);
98
+ execSync(`${installer} install${ignoreWs}`, {
99
+ cwd: projectDir,
100
+ stdio: "pipe",
101
+ timeout: 180_000,
102
+ });
103
+ reporter?.log("verbose", "Dependencies installed successfully");
104
+ }
105
+ catch (e) {
106
+ const stdout = e?.stdout?.toString() || "";
107
+ const stderr = e?.stderr?.toString() || "";
108
+ const combined = `${stdout}\n${stderr}`.trim();
109
+ if (reporter?.verboseMode) {
110
+ errors.push(`Package install failed:\n${combined}`);
111
+ }
112
+ else {
113
+ errors.push(`Package install failed: ${combined.slice(0, 500)}`);
114
+ }
115
+ skippedInstall = true;
116
+ }
117
+ }
118
+ // Step 11: Initialize git repo with initial commit (unless skipped)
119
+ if (!opts?.skipGit) {
120
+ reporter?.log("build", "Initializing git repository...");
121
+ try {
122
+ const commitOutput = gitInit(projectDir, opts?.projectName);
123
+ reporter?.log("done", `Git initialized: ${commitOutput}`);
124
+ }
125
+ catch (e) {
126
+ const msg = `Git init failed: ${e instanceof Error ? e.message : "unknown"}`;
127
+ reporter?.log("error", msg);
128
+ errors.push(msg);
129
+ // Attempt bare git init as recovery — at minimum create the .git directory
130
+ // so later git operations don't fail with "not a git repository"
131
+ try {
132
+ execSync("git init -b main", { cwd: projectDir, stdio: "pipe" });
133
+ execSync('git config user.email "electric-agent@local"', {
134
+ cwd: projectDir,
135
+ stdio: "pipe",
136
+ });
137
+ execSync('git config user.name "Electric Agent"', {
138
+ cwd: projectDir,
139
+ stdio: "pipe",
140
+ });
141
+ reporter?.log("verbose", "Recovery: bare git init succeeded");
142
+ }
143
+ catch {
144
+ errors.push("Recovery git init also failed — git operations will not work");
145
+ }
146
+ }
147
+ }
148
+ return { projectDir, skippedInstall, errors };
149
+ }
150
+ function detectPackageManager(projectDir) {
151
+ if (fs.existsSync(path.join(projectDir, "pnpm-lock.yaml")))
152
+ return "pnpm";
153
+ if (fs.existsSync(path.join(projectDir, "yarn.lock")))
154
+ return "yarn";
155
+ // Check if pnpm is available
156
+ try {
157
+ execSync("pnpm --version", { stdio: "pipe" });
158
+ return "pnpm";
159
+ }
160
+ catch {
161
+ return "npm";
162
+ }
163
+ }
164
+ function copyTemplateFiles(srcDir, destDir) {
165
+ if (!fs.existsSync(srcDir))
166
+ return;
167
+ for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
168
+ const srcPath = path.join(srcDir, entry.name);
169
+ const destPath = path.join(destDir, entry.name);
170
+ if (entry.isDirectory()) {
171
+ fs.mkdirSync(destPath, { recursive: true });
172
+ copyTemplateFiles(srcPath, destPath);
173
+ }
174
+ else {
175
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
176
+ fs.copyFileSync(srcPath, destPath);
177
+ }
178
+ }
179
+ }
180
+ const ADDED_DEPENDENCIES = {
181
+ "@tanstack/db": "0.5.25",
182
+ "@tanstack/react-db": "0.1.69",
183
+ "@tanstack/electric-db-collection": "0.2.31",
184
+ "@electric-sql/client": "1.5.1",
185
+ "drizzle-orm": "0.45.1",
186
+ "drizzle-zod": "^0.8.3",
187
+ postgres: "^3.4",
188
+ zod: "^3.24",
189
+ };
190
+ const ADDED_DEV_DEPENDENCIES = {
191
+ "drizzle-kit": "0.31.9",
192
+ vitest: "^3.0.0",
193
+ // Playbook packages (@electric-sql/playbook, @tanstack/db-playbook,
194
+ // @durable-streams/playbook) come from the KPB template — don't duplicate here.
195
+ };
196
+ const ADDED_SCRIPTS = {
197
+ generate: "drizzle-kit generate",
198
+ migrate: "drizzle-kit migrate",
199
+ "db:push": "drizzle-kit push",
200
+ "dev:start": "nohup pnpm dev > /tmp/dev-server.log 2>&1 & echo $! > /tmp/dev-server.pid",
201
+ "dev:stop": "kill $(cat /tmp/dev-server.pid 2>/dev/null) 2>/dev/null; rm -f /tmp/dev-server.pid",
202
+ "dev:restart": "pnpm dev:stop && pnpm dev:start",
203
+ test: "vitest run",
204
+ "test:watch": "vitest",
205
+ "test:integration": "vitest run tests/integration",
206
+ };
207
+ function mergeDependencies(projectDir, projectName) {
208
+ const pkgPath = path.join(projectDir, "package.json");
209
+ if (!fs.existsSync(pkgPath))
210
+ return;
211
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
212
+ // Rename project
213
+ if (projectName) {
214
+ pkg.name = projectName;
215
+ }
216
+ pkg.dependencies = { ...(pkg.dependencies || {}), ...ADDED_DEPENDENCIES };
217
+ pkg.devDependencies = { ...(pkg.devDependencies || {}), ...ADDED_DEV_DEPENDENCIES };
218
+ pkg.scripts = { ...(pkg.scripts || {}), ...ADDED_SCRIPTS };
219
+ fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
220
+ }
221
+ function patchViteConfig(projectDir) {
222
+ const vitePath = path.join(projectDir, "vite.config.ts");
223
+ if (!fs.existsSync(vitePath))
224
+ return;
225
+ let content = fs.readFileSync(vitePath, "utf-8");
226
+ // Make port configurable via VITE_PORT env var (default 5174 for Caddy local mode,
227
+ // sandbox sets VITE_PORT=5173 so the Docker port binding works)
228
+ content = content.replace(/port:\s*5173/, "port: parseInt(process.env.VITE_PORT || '5174')");
229
+ // Bind to all interfaces so Caddy/Docker/Sprites can reach the dev server.
230
+ // Insert host + allowedHosts + proxy together after port to keep them grouped.
231
+ if (!content.includes("host:")) {
232
+ content = content.replace(/port:\s*parseInt\(process\.env\.VITE_PORT \|\| '5174'\),?/, "port: parseInt(process.env.VITE_PORT || '5174'),\n\t\thost: true,");
233
+ }
234
+ // Ensure allowedHosts is always present — Vite blocks requests from
235
+ // Sprites hostnames (*.sprites.app) without it.
236
+ // Must be boolean `true`, NOT the string "all" — Vite only accepts
237
+ // `string[] | true` (see https://vite.dev/config/server-options).
238
+ if (!content.includes("allowedHosts")) {
239
+ if (content.match(/host:\s*/)) {
240
+ content = content.replace(/(host:\s*[^,\n]+,?)/, "$1\n\t\tallowedHosts: true,");
241
+ }
242
+ else if (content.match(/server:\s*\{/)) {
243
+ content = content.replace(/(server:\s*\{)/, "$1\n\t\tallowedHosts: true,");
244
+ }
245
+ }
246
+ // Add proxy for Electric shape API — works with both Caddy (external) and
247
+ // sandbox (no Caddy, Electric on localhost:3000) setups
248
+ if (!content.includes("proxy:")) {
249
+ const proxyBlock = [
250
+ "\t\tproxy: {",
251
+ "\t\t\t'/v1/shape': {",
252
+ "\t\t\t\ttarget: process.env.ELECTRIC_URL || 'http://localhost:3000',",
253
+ "\t\t\t\tchangeOrigin: true,",
254
+ "\t\t\t},",
255
+ "\t\t},",
256
+ ].join("\n");
257
+ // Insert proxy after allowedHosts or host line
258
+ if (content.includes("allowedHosts")) {
259
+ content = content.replace(/(allowedHosts:\s*true,?)/, `$1\n${proxyBlock}`);
260
+ }
261
+ else {
262
+ content = content.replace(/(host:\s*true,?)/, `$1\n${proxyBlock}`);
263
+ }
264
+ }
265
+ fs.writeFileSync(vitePath, content, "utf-8");
266
+ }
267
+ // NOTE: patchRootRoute intentionally does NOT add ssr: false to the root
268
+ // route. The root renders the HTML shell (<html>, <head>, <Scripts>).
269
+ // Disabling SSR there prevents the document from rendering — blank page.
270
+ // The coder agent adds ssr: false to individual leaf routes instead.
271
+ function patchRootRoute(_projectDir) {
272
+ // no-op — root route must always SSR
273
+ }
274
+ function patchPublicCssImports(projectDir) {
275
+ const rootPath = path.join(projectDir, "src/routes/__root.tsx");
276
+ if (!fs.existsSync(rootPath))
277
+ return;
278
+ let content = fs.readFileSync(rootPath, "utf-8");
279
+ // KPB imports typography.css from the public dir via a module import:
280
+ // import typographyCss from '/typography.css?url'
281
+ // Rollup can't resolve absolute public-dir paths during production builds.
282
+ // The capsizeRadixPlugin generates this file into public/ only when Vite
283
+ // runs, so it may not exist yet at scaffold time.
284
+ //
285
+ // Fix: remove the module import and inline the public path as a string
286
+ // literal. Vite serves public/ files at the root, so "/typography.css"
287
+ // works in both dev and production.
288
+ const hasTypographyImport = content.includes(`'/typography.css?url'`) || content.includes(`"/typography.css?url"`);
289
+ if (hasTypographyImport) {
290
+ // Remove the import statement
291
+ content = content.replace(/import\s+typographyCss\s+from\s+['"]\/typography\.css\?url['"];?\s*\n/, "");
292
+ // Replace the variable reference with a string literal
293
+ content = content.replace(/href:\s*typographyCss/g, 'href: "/typography.css"');
294
+ fs.writeFileSync(rootPath, content, "utf-8");
295
+ }
296
+ }
297
+ function patchGitignore(projectDir) {
298
+ const gitignorePath = path.join(projectDir, ".gitignore");
299
+ let content = "";
300
+ if (fs.existsSync(gitignorePath)) {
301
+ content = fs.readFileSync(gitignorePath, "utf-8");
302
+ }
303
+ const additions = [];
304
+ if (!content.includes("_agent/"))
305
+ additions.push("_agent/");
306
+ if (!content.includes("drizzle/meta/"))
307
+ additions.push("drizzle/meta/");
308
+ if (!content.includes(".env"))
309
+ additions.push(".env");
310
+ if (additions.length > 0) {
311
+ content += `\n# Electric Agent\n${additions.join("\n")}\n`;
312
+ fs.writeFileSync(gitignorePath, content, "utf-8");
313
+ }
314
+ }
315
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProgressReporter } from "../progress/reporter.js";
2
+ export declare function createBuildTool(projectDir: string, reporter?: ProgressReporter): import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{}>;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,qEAsF9E"}
@@ -0,0 +1,84 @@
1
+ import { execSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { tool } from "@anthropic-ai/claude-agent-sdk";
5
+ export function createBuildTool(projectDir, reporter) {
6
+ return tool("build", "Run pnpm build and pnpm check (Biome lint) in the project. Returns build output including any TypeScript or lint errors.", {}, async () => {
7
+ let buildOutput = "";
8
+ let checkOutput = "";
9
+ let success = true;
10
+ const errors = [];
11
+ try {
12
+ buildOutput = execSync("pnpm run build 2>&1", {
13
+ encoding: "utf-8",
14
+ timeout: 120_000,
15
+ cwd: projectDir,
16
+ });
17
+ }
18
+ catch (e) {
19
+ success = false;
20
+ buildOutput =
21
+ e?.stdout || (e instanceof Error ? e.message : "Build failed");
22
+ errors.push("build");
23
+ }
24
+ try {
25
+ checkOutput = execSync("pnpm run check 2>&1", {
26
+ encoding: "utf-8",
27
+ timeout: 60_000,
28
+ cwd: projectDir,
29
+ });
30
+ }
31
+ catch (e) {
32
+ success = false;
33
+ checkOutput =
34
+ e?.stdout || (e instanceof Error ? e.message : "Check failed");
35
+ errors.push("check");
36
+ }
37
+ // Run smoke tests if tests/ directory exists
38
+ let testOutput = "";
39
+ const testsDir = path.join(projectDir, "tests");
40
+ if (fs.existsSync(testsDir)) {
41
+ try {
42
+ testOutput = execSync("pnpm test 2>&1", {
43
+ encoding: "utf-8",
44
+ timeout: 120_000,
45
+ cwd: projectDir,
46
+ });
47
+ }
48
+ catch (e) {
49
+ success = false;
50
+ testOutput =
51
+ e?.stdout ||
52
+ (e instanceof Error ? e.message : "Tests failed");
53
+ errors.push("test");
54
+ }
55
+ }
56
+ const outputParts = [
57
+ "=== pnpm run build ===",
58
+ buildOutput.trim(),
59
+ "",
60
+ "=== pnpm run check ===",
61
+ checkOutput.trim(),
62
+ ];
63
+ if (testOutput) {
64
+ outputParts.push("", "=== pnpm test ===", testOutput.trim());
65
+ }
66
+ const output = outputParts.join("\n");
67
+ if (reporter?.verboseMode) {
68
+ reporter.log("verbose", `[build output]\n${output}`);
69
+ }
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: JSON.stringify({
75
+ success,
76
+ output: output.slice(0, 10_000),
77
+ errors: errors.join(", ") || "none",
78
+ }),
79
+ },
80
+ ],
81
+ };
82
+ });
83
+ }
84
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Validate that all required playbook skills are installed in the project.
4
+ * Throws if any are missing so generation fails fast.
5
+ */
6
+ export declare function validatePlaybooks(projectDir: string): void;
7
+ export declare function createPlaybookTools(projectDir: string): {
8
+ readPlaybookTool: import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{
9
+ name: z.ZodString;
10
+ include_references: z.ZodOptional<z.ZodBoolean>;
11
+ }>;
12
+ listPlaybooksTool: import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{}>;
13
+ };
14
+ //# sourceMappingURL=playbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook.d.ts","sourceRoot":"","sources":["../../src/tools/playbook.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAwGvB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA2B1D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM;;;;;;EAsJrD"}