copperhead 0.6.0 → 0.8.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 (118) hide show
  1. package/README.md +36 -4
  2. package/dist/agent/animate.js +76 -0
  3. package/dist/agent/animate.js.map +1 -0
  4. package/dist/agent/box.js +89 -0
  5. package/dist/agent/box.js.map +1 -0
  6. package/dist/agent/dock-renderer.js +173 -0
  7. package/dist/agent/dock-renderer.js.map +1 -0
  8. package/dist/agent/logo.js +21 -0
  9. package/dist/agent/logo.js.map +1 -0
  10. package/dist/agent/loop.js +130 -18
  11. package/dist/agent/loop.js.map +1 -1
  12. package/dist/agent/prompts.js +2 -1
  13. package/dist/agent/prompts.js.map +1 -1
  14. package/dist/agent/providers/claude-code.js +85 -116
  15. package/dist/agent/providers/claude-code.js.map +1 -1
  16. package/dist/agent/providers/cursor.js +317 -0
  17. package/dist/agent/providers/cursor.js.map +1 -0
  18. package/dist/agent/providers/tool-protocol.js +205 -0
  19. package/dist/agent/providers/tool-protocol.js.map +1 -0
  20. package/dist/agent/recovery.js +148 -0
  21. package/dist/agent/recovery.js.map +1 -0
  22. package/dist/agent/render.js +44 -12
  23. package/dist/agent/render.js.map +1 -1
  24. package/dist/agent/response-cache.js +81 -0
  25. package/dist/agent/response-cache.js.map +1 -0
  26. package/dist/agent/runmeta.js +4 -5
  27. package/dist/agent/runmeta.js.map +1 -1
  28. package/dist/agent/theme.js +84 -0
  29. package/dist/agent/theme.js.map +1 -0
  30. package/dist/agent/tools.js +61 -4
  31. package/dist/agent/tools.js.map +1 -1
  32. package/dist/agent/transcript.js.map +1 -1
  33. package/dist/cli.js +134 -13
  34. package/dist/cli.js.map +1 -1
  35. package/dist/commands/create.js +482 -38
  36. package/dist/commands/create.js.map +1 -1
  37. package/dist/commands/demo.js +146 -0
  38. package/dist/commands/demo.js.map +1 -0
  39. package/dist/commands/doctor.js +240 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/repl-inspect.js +342 -0
  42. package/dist/commands/repl-inspect.js.map +1 -0
  43. package/dist/commands/repl.js +618 -0
  44. package/dist/commands/repl.js.map +1 -0
  45. package/dist/config.js +24 -2
  46. package/dist/config.js.map +1 -1
  47. package/dist/kicad/bootstrap.js +166 -0
  48. package/dist/kicad/bootstrap.js.map +1 -0
  49. package/dist/kicad/cli.js +126 -6
  50. package/dist/kicad/cli.js.map +1 -1
  51. package/dist/kicad/spice.js +306 -0
  52. package/dist/kicad/spice.js.map +1 -0
  53. package/dist/kicad/symlib.js +228 -0
  54. package/dist/kicad/symlib.js.map +1 -0
  55. package/dist/memory/bom-table.js +193 -22
  56. package/dist/memory/bom-table.js.map +1 -1
  57. package/dist/memory/drift.js +33 -11
  58. package/dist/memory/drift.js.map +1 -1
  59. package/dist/util/cli-args.js +35 -0
  60. package/dist/util/cli-args.js.map +1 -0
  61. package/dist/util/dock.js +155 -0
  62. package/dist/util/dock.js.map +1 -0
  63. package/dist/util/git.js +165 -4
  64. package/dist/util/git.js.map +1 -1
  65. package/dist/util/live-prompt.js +542 -0
  66. package/dist/util/live-prompt.js.map +1 -0
  67. package/dist/util/paths.js +9 -0
  68. package/dist/util/paths.js.map +1 -1
  69. package/dist/util/preflight.js +37 -0
  70. package/dist/util/preflight.js.map +1 -1
  71. package/dist/util/retry.js +23 -0
  72. package/dist/util/retry.js.map +1 -1
  73. package/dist/util/select.js +172 -0
  74. package/dist/util/select.js.map +1 -0
  75. package/dist/util/tmp.js +119 -0
  76. package/dist/util/tmp.js.map +1 -0
  77. package/package.json +3 -2
  78. package/src/agent/animate.ts +90 -0
  79. package/src/agent/box.ts +99 -0
  80. package/src/agent/dock-renderer.ts +181 -0
  81. package/src/agent/logo.ts +23 -0
  82. package/src/agent/loop.ts +148 -18
  83. package/src/agent/prompts.ts +2 -1
  84. package/src/agent/providers/claude-code.ts +91 -122
  85. package/src/agent/providers/cursor.ts +364 -0
  86. package/src/agent/providers/tool-protocol.ts +212 -0
  87. package/src/agent/recovery.ts +162 -0
  88. package/src/agent/render.ts +56 -12
  89. package/src/agent/response-cache.ts +80 -0
  90. package/src/agent/runmeta.ts +6 -7
  91. package/src/agent/theme.ts +91 -0
  92. package/src/agent/tools.ts +62 -4
  93. package/src/agent/transcript.ts +1 -0
  94. package/src/agent/types.ts +17 -0
  95. package/src/cli.ts +139 -15
  96. package/src/commands/create.ts +581 -40
  97. package/src/commands/demo.ts +184 -0
  98. package/src/commands/doctor.ts +289 -0
  99. package/src/commands/repl-inspect.ts +353 -0
  100. package/src/commands/repl.ts +685 -0
  101. package/src/config.ts +40 -3
  102. package/src/kicad/bootstrap.ts +181 -0
  103. package/src/kicad/cli.ts +132 -7
  104. package/src/kicad/spice.ts +399 -0
  105. package/src/kicad/symlib.ts +248 -0
  106. package/src/layout/claude-ui-layout.md +72 -0
  107. package/src/layout/repl-ui-layout.md +139 -0
  108. package/src/memory/bom-table.ts +191 -20
  109. package/src/memory/drift.ts +42 -11
  110. package/src/util/cli-args.ts +42 -0
  111. package/src/util/dock.ts +161 -0
  112. package/src/util/git.ts +176 -4
  113. package/src/util/live-prompt.ts +595 -0
  114. package/src/util/paths.ts +10 -0
  115. package/src/util/preflight.ts +44 -0
  116. package/src/util/retry.ts +29 -0
  117. package/src/util/select.ts +192 -0
  118. package/src/util/tmp.ts +113 -0
package/dist/config.js CHANGED
@@ -8,6 +8,19 @@ export const DEFAULTS = {
8
8
  maxTurns: 40,
9
9
  maxRepairCycles: 5,
10
10
  budgets: {},
11
+ // 10 min. A single large capture turn (a full lib_symbols + instances edit,
12
+ // ~40k output tokens) on the claude-code provider legitimately runs several
13
+ // minutes; the old 5-min deadline killed those mid-flight and, because the
14
+ // watchdog budget is spent per stage, could fail a stage that was only slow,
15
+ // not hung. 10 min clears the largest observed turns while still catching a
16
+ // genuinely stuck subprocess.
17
+ turnTimeoutMs: 600000,
18
+ // 30s: within one interval an operator knows a turn is alive, and a full
19
+ // 10-min turn emits ~20 lines — enough to distinguish slow from hung without
20
+ // flooding the log. Quick turns (< 30s) emit nothing.
21
+ heartbeatMs: 30000,
22
+ maxStageRetries: 2,
23
+ llmCache: true,
11
24
  };
12
25
  export function configPath(repoRoot) {
13
26
  return path.join(repoRoot, CONFIG_DIR, 'config.json');
@@ -30,6 +43,12 @@ export async function loadConfig(repoRoot) {
30
43
  ...(Object.keys(stageMaxTurns).length ? { stageMaxTurns } : {}),
31
44
  maxRepairCycles: raw.maxRepairCycles ?? DEFAULTS.maxRepairCycles,
32
45
  budgets: raw.budgets ?? {},
46
+ turnTimeoutMs: typeof raw.turnTimeoutMs === 'number' ? raw.turnTimeoutMs : DEFAULTS.turnTimeoutMs,
47
+ heartbeatMs: typeof raw.heartbeatMs === 'number' ? raw.heartbeatMs : DEFAULTS.heartbeatMs,
48
+ maxStageRetries: Number.isInteger(raw.maxStageRetries) && raw.maxStageRetries >= 0
49
+ ? raw.maxStageRetries
50
+ : DEFAULTS.maxStageRetries,
51
+ llmCache: raw.llmCache !== false,
33
52
  ...(raw.generatedHashes ? { generatedHashes: raw.generatedHashes } : {}),
34
53
  ...(raw.origin === 'create' || raw.origin === 'init' ? { origin: raw.origin } : {}),
35
54
  };
@@ -42,6 +61,8 @@ export async function loadConfig(repoRoot) {
42
61
  * Accepted values (same set for `--model`, COPPERHEAD_MODEL, and `model` in
43
62
  * .copperhead/config.json):
44
63
  *
64
+ * - `cursor` : the Cursor Agent CLI using saved login (`agent login`).
65
+ * - `cursor:<id>` : the same provider on a specific model id.
45
66
  * - `claude-code` : the Claude Code saved-login provider on its default
46
67
  * model. Needs NO API key — it reuses the logged-in Claude
47
68
  * Code CLI / CLAUDE_CODE_OAUTH_TOKEN via the Agent SDK.
@@ -62,7 +83,8 @@ export async function loadConfig(repoRoot) {
62
83
  * a typo like `claud-sonnet-5` silently routes to OpenAI and fails there.
63
84
  * Anthropic and direct OpenAI providers require their API keys; `codex` requires
64
85
  * a locally installed and authenticated Codex CLI, and `claude-code` requires a
65
- * Claude Code login (CLAUDE_CODE_OAUTH_TOKEN); neither needs a model API key.
86
+ * Claude Code login (CLAUDE_CODE_OAUTH_TOKEN); `cursor` requires `agent login`.
87
+ * None of the saved-login providers need a model API key.
66
88
  */
67
89
  export function resolveModel(flag, config, env = process.env) {
68
90
  if (flag)
@@ -75,6 +97,6 @@ export function resolveModel(flag, config, env = process.env) {
75
97
  return { model: 'gpt-5', source: 'openai-key' };
76
98
  if (env.ANTHROPIC_API_KEY)
77
99
  return { model: 'claude', source: 'anthropic-key' };
78
- throw new Error('no model configured: pass --model codex (uses your local Codex login), set COPPERHEAD_MODEL, set model in .copperhead/config.json, or provide OPENAI_API_KEY/ANTHROPIC_API_KEY');
100
+ throw new Error('no model configured: pass --model, set COPPERHEAD_MODEL, or export an API key; see https://docs.copperhead.sh/reference/configuration/');
79
101
  }
80
102
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { createHash } from 'node:crypto';
4
+ import path from 'node:path';
5
+ import { configPath, loadConfig } from '../config.js';
6
+ /**
7
+ * The create pipeline starts from a brief with no KiCad files, but the agent
8
+ * cannot create them: `write_file` refuses KiCad files and `edit_file` only
9
+ * edits existing ones. Without a project on disk the schematic stage can never
10
+ * satisfy its contract (config.schematic stays null), so the pipeline stalls
11
+ * indefinitely. This module scaffolds a minimal, kicad-cli-loadable empty
12
+ * project (schematic ERC-clean, board DRC-clean with a default outline) and
13
+ * wires it into .copperhead/config.json, giving the agent a file to populate.
14
+ */
15
+ /** Slug for the project filename, taken from the brief's first H1 (a leading
16
+ * "Brief:" label is dropped). Falls back to "board". */
17
+ export function projectSlug(brief) {
18
+ const m = brief.match(/^#\s+(.+?)\s*$/m);
19
+ const title = (m?.[1] ?? 'board').replace(/^brief\s*:\s*/i, '');
20
+ const slug = title
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9]+/g, '-')
23
+ .replace(/^-+|-+$/g, '');
24
+ return slug || 'board';
25
+ }
26
+ /** A stable, valid-shaped v4 UUID derived from a seed, so a given project
27
+ * bootstraps to the same UUIDs on every run (no Date/random — runs stay
28
+ * reproducible). */
29
+ function uuidFrom(seed) {
30
+ const h = createHash('sha256').update(seed).digest('hex');
31
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-4${h.slice(13, 16)}-8${h.slice(17, 20)}-${h.slice(20, 32)}`;
32
+ }
33
+ function emptySchematic(rootUuid) {
34
+ return `(kicad_sch
35
+ (version 20231120)
36
+ (generator "eeschema")
37
+ (generator_version "8.0")
38
+ (uuid "${rootUuid}")
39
+ (paper "A4")
40
+ (lib_symbols)
41
+ (sheet_instances
42
+ (path "/" (page "1"))
43
+ )
44
+ )
45
+ `;
46
+ }
47
+ function emptyBoard(outlineUuid) {
48
+ // A default 30x20mm outline on Edge.Cuts so the blank board is DRC-clean out
49
+ // of the gate; the layout stage resizes/replaces it with the real outline.
50
+ return `(kicad_pcb
51
+ (version 20240108)
52
+ (generator "pcbnew")
53
+ (generator_version "8.0")
54
+ (general
55
+ (thickness 1.6)
56
+ (legacy_teardrops no)
57
+ )
58
+ (paper "A4")
59
+ (layers
60
+ (0 "F.Cu" signal)
61
+ (31 "B.Cu" signal)
62
+ (32 "B.Adhes" user "B.Adhesive")
63
+ (33 "F.Adhes" user "F.Adhesive")
64
+ (34 "B.Paste" user)
65
+ (35 "F.Paste" user)
66
+ (36 "B.SilkS" user "B.Silkscreen")
67
+ (37 "F.SilkS" user "F.Silkscreen")
68
+ (38 "B.Mask" user)
69
+ (39 "F.Mask" user)
70
+ (40 "Dwgs.User" user "User.Drawings")
71
+ (41 "Cmts.User" user "User.Comments")
72
+ (42 "Eco1.User" user "User.Eco1")
73
+ (43 "Eco2.User" user "User.Eco2")
74
+ (44 "Edge.Cuts" user)
75
+ (45 "Margin" user)
76
+ (46 "B.CrtYd" user "B.Courtyard")
77
+ (47 "F.CrtYd" user "F.Courtyard")
78
+ (48 "B.Fab" user)
79
+ (49 "F.Fab" user)
80
+ )
81
+ (setup
82
+ (pad_to_mask_clearance 0)
83
+ (allow_soldermask_bridges_in_footprints no)
84
+ )
85
+ (net 0 "")
86
+ (gr_rect (start 100 100) (end 130 120)
87
+ (stroke (width 0.1) (type default))
88
+ (layer "Edge.Cuts")
89
+ (uuid "${outlineUuid}")
90
+ )
91
+ )
92
+ `;
93
+ }
94
+ function projectFile(slug, rootUuid) {
95
+ return (JSON.stringify({
96
+ board: { design_settings: { defaults: {}, rules: {} } },
97
+ erc: {
98
+ erc_exclusions: [],
99
+ meta: { version: 0 },
100
+ rule_severities: { footprint_link_issues: 'ignore', lib_symbol_issues: 'ignore' },
101
+ },
102
+ meta: { filename: `${slug}.kicad_pro`, version: 1 },
103
+ net_settings: {
104
+ classes: [
105
+ {
106
+ bus_width: 12,
107
+ clearance: 0.2,
108
+ diff_pair_gap: 0.25,
109
+ diff_pair_via_gap: 0.25,
110
+ diff_pair_width: 0.2,
111
+ line_style: 0,
112
+ microvia_diameter: 0.3,
113
+ microvia_drill: 0.1,
114
+ name: 'Default',
115
+ pcb_color: 'rgba(0, 0, 0, 0.000)',
116
+ schematic_color: 'rgba(0, 0, 0, 0.000)',
117
+ track_width: 0.25,
118
+ via_diameter: 0.6,
119
+ via_drill: 0.3,
120
+ wire_width: 6,
121
+ },
122
+ ],
123
+ meta: { version: 3 },
124
+ },
125
+ schematic: {
126
+ annotate_start_num: 0,
127
+ drawing: { default_line_thickness: 6.0, default_text_size: 50.0 },
128
+ legacy_lib_dir: '',
129
+ legacy_lib_list: [],
130
+ meta: { version: 1 },
131
+ },
132
+ sheets: [[rootUuid, 'Root']],
133
+ text_variables: {},
134
+ }, null, 2) + '\n');
135
+ }
136
+ async function persist(repoRoot, config) {
137
+ await writeFile(configPath(repoRoot), JSON.stringify(config, null, 2) + '\n', 'utf8');
138
+ }
139
+ /**
140
+ * Ensure a KiCad project exists and is wired into config. No-op (returns null)
141
+ * when config already points at a schematic on disk. If project files exist but
142
+ * config doesn't reference them, just wires config. Otherwise scaffolds an empty
143
+ * project. Returns the schematic's repo-relative path when it created or wired
144
+ * one, else null.
145
+ */
146
+ export async function bootstrapKicadProject(repoRoot, brief) {
147
+ const config = await loadConfig(repoRoot);
148
+ if (config.schematic && existsSync(path.join(repoRoot, config.schematic)))
149
+ return null;
150
+ const slug = projectSlug(brief);
151
+ const schRel = `${slug}.kicad_sch`;
152
+ const pcbRel = `${slug}.kicad_pcb`;
153
+ const proRel = `${slug}.kicad_pro`;
154
+ const schAbs = path.join(repoRoot, schRel);
155
+ if (!existsSync(schAbs)) {
156
+ const rootUuid = uuidFrom(slug);
157
+ await writeFile(schAbs, emptySchematic(rootUuid), 'utf8');
158
+ await writeFile(path.join(repoRoot, pcbRel), emptyBoard(uuidFrom(`${slug}:edge`)), 'utf8');
159
+ await writeFile(path.join(repoRoot, proRel), projectFile(slug, rootUuid), 'utf8');
160
+ }
161
+ config.schematic = schRel;
162
+ config.board = existsSync(path.join(repoRoot, pcbRel)) ? pcbRel : null;
163
+ await persist(repoRoot, config);
164
+ return schRel;
165
+ }
166
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/kicad/bootstrap.ts"],"names":[],"mappings":"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"}
package/dist/kicad/cli.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { execa } from 'execa';
2
+ import { existsSync } from 'node:fs';
2
3
  import { mkdtemp, readFile, rm } from 'node:fs/promises';
3
4
  import { tmpdir } from 'node:os';
4
5
  import path from 'node:path';
@@ -9,19 +10,134 @@ export class KicadCliMissingError extends PreflightError {
9
10
  super('kicad-cli not found on PATH', 'copperhead verifies every mutation with kicad-cli ERC/DRC; without it no edit can be checked, so no run can start', [
10
11
  'install KiCad ≥ 8: https://www.kicad.org/download/',
11
12
  'ensure the kicad-cli binary is on PATH (on macOS it ships inside KiCad.app/Contents/MacOS)',
13
+ 'or set COPPERHEAD_KICAD_CLI=/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli',
12
14
  'confirm with "kicad-cli version", then rerun',
13
15
  ]);
14
16
  this.name = 'KicadCliMissingError';
15
17
  }
16
18
  }
19
+ /**
20
+ * `COPPERHEAD_KICAD_CLI` points somewhere that does not exist. Distinct from
21
+ * KicadCliMissingError because the advice is the opposite: the override was
22
+ * seen and rejected, so telling the user to set it would be nonsense.
23
+ */
24
+ export class KicadCliBadOverrideError extends PreflightError {
25
+ constructor(configured) {
26
+ super(`COPPERHEAD_KICAD_CLI points to a path that does not exist: ${configured}`, 'the override wins over PATH, so falling back silently would run a different binary than the one you named and make the failure impossible to diagnose', [
27
+ `check the path: ls -l "${configured}"`,
28
+ 'on macOS the binary lives at /Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli',
29
+ 'or unset COPPERHEAD_KICAD_CLI to fall back to PATH',
30
+ 'confirm with "$COPPERHEAD_KICAD_CLI version", then rerun',
31
+ ]);
32
+ this.name = 'KicadCliBadOverrideError';
33
+ }
34
+ }
35
+ /** Well-known install locations when `kicad-cli` is not on PATH (macOS app bundle). */
36
+ const FALLBACK_BINARIES = [
37
+ '/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli',
38
+ '/Applications/KiCad-10.0/KiCad.app/Contents/MacOS/kicad-cli',
39
+ '/Applications/KiCad-9.0/KiCad.app/Contents/MacOS/kicad-cli',
40
+ '/Applications/KiCad-8.0/KiCad.app/Contents/MacOS/kicad-cli',
41
+ ];
42
+ let fallbackBinaries = FALLBACK_BINARIES;
43
+ let cachedBinary;
44
+ /**
45
+ * Resolve the kicad-cli executable: `COPPERHEAD_KICAD_CLI` > PATH name
46
+ * (`kicad-cli`). On PATH miss, `runKicad` falls back to macOS KiCad.app paths.
47
+ */
48
+ export function resolveKicadCli() {
49
+ if (cachedBinary !== undefined) {
50
+ if (cachedBinary === null)
51
+ throw new KicadCliMissingError();
52
+ return cachedBinary;
53
+ }
54
+ const fromEnv = envOverride();
55
+ if (fromEnv) {
56
+ cachedBinary = fromEnv;
57
+ return fromEnv;
58
+ }
59
+ cachedBinary = 'kicad-cli';
60
+ return cachedBinary;
61
+ }
62
+ /**
63
+ * The `COPPERHEAD_KICAD_CLI` override, or null when unset. Set-but-missing is
64
+ * a hard error rather than a silent fallthrough to PATH: the user told us
65
+ * which binary to run, and quietly running a different one (or reporting
66
+ * "not found on PATH" with advice to set the variable they already set) is
67
+ * the worst possible answer.
68
+ */
69
+ function envOverride() {
70
+ const fromEnv = process.env.COPPERHEAD_KICAD_CLI?.trim();
71
+ if (!fromEnv)
72
+ return null;
73
+ if (!existsSync(fromEnv))
74
+ throw new KicadCliBadOverrideError(fromEnv);
75
+ return fromEnv;
76
+ }
77
+ /**
78
+ * After ENOENT on PATH, retry with a known macOS install path.
79
+ *
80
+ * Deliberately does not re-read `COPPERHEAD_KICAD_CLI`: this is reached only
81
+ * when resolveKicadCli() cached the bare PATH name, which in turn happens only
82
+ * when the override was unset (set-but-missing throws there instead), so an
83
+ * override re-check here could never fire.
84
+ */
85
+ function fallbackAfterMissing() {
86
+ for (const candidate of fallbackBinaries) {
87
+ if (existsSync(candidate)) {
88
+ cachedBinary = candidate;
89
+ return candidate;
90
+ }
91
+ }
92
+ cachedBinary = null;
93
+ throw new KicadCliMissingError();
94
+ }
95
+ async function runKicad(args, opts) {
96
+ let bin = resolveKicadCli();
97
+ let res = await execa(bin, args, { reject: false });
98
+ if (res.failed && res.code === 'ENOENT') {
99
+ if (bin === 'kicad-cli') {
100
+ bin = fallbackAfterMissing();
101
+ res = await execa(bin, args, { reject: false });
102
+ }
103
+ else {
104
+ throw new KicadCliMissingError();
105
+ }
106
+ }
107
+ if (opts?.reject === false)
108
+ return res;
109
+ if (res.failed && res.code === 'ENOENT') {
110
+ throw new KicadCliMissingError();
111
+ }
112
+ if (res.failed) {
113
+ throw Object.assign(new Error(res.stderr || res.stdout || `kicad-cli exited ${res.exitCode}`), res);
114
+ }
115
+ return res;
116
+ }
117
+ /** Test helper: clear the resolved-binary cache. */
118
+ export function resetKicadCliCache() {
119
+ cachedBinary = undefined;
120
+ }
121
+ /**
122
+ * Test helper: point the app-bundle probe at fixture paths, or call with no
123
+ * argument to restore the real list. Without this the fallback branch is only
124
+ * exercisable on a macOS host that happens to have KiCad installed, which
125
+ * makes the outcome depend on the developer's machine.
126
+ */
127
+ export function setKicadFallbackBinaries(paths) {
128
+ fallbackBinaries = paths ?? FALLBACK_BINARIES;
129
+ }
17
130
  export async function kicadCliVersion() {
18
131
  try {
19
- const { stdout } = await execa('kicad-cli', ['version']);
20
- return stdout.trim();
132
+ const res = await runKicad(['version']);
133
+ return String(res.stdout ?? '').trim();
21
134
  }
22
135
  catch (err) {
23
136
  if (err.code === 'ENOENT')
24
137
  throw new KicadCliMissingError();
138
+ // runKicad already maps PATH ENOENT → fallback → KicadCliMissingError
139
+ if (err instanceof KicadCliMissingError)
140
+ throw err;
25
141
  throw err;
26
142
  }
27
143
  }
@@ -30,7 +146,7 @@ async function runCheck(kind, filePath, extraArgs = []) {
30
146
  const out = path.join(dir, `${kind}.json`);
31
147
  const sub = kind === 'erc' ? ['sch', 'erc'] : ['pcb', 'drc'];
32
148
  try {
33
- const res = await execa('kicad-cli', [...sub, '--format', 'json', '--exit-code-violations', '--output', out, ...extraArgs, filePath], { reject: false });
149
+ const res = await runKicad([...sub, '--format', 'json', '--exit-code-violations', '--output', out, ...extraArgs, filePath], { reject: false });
34
150
  if (res.failed && res.code === 'ENOENT') {
35
151
  throw new KicadCliMissingError();
36
152
  }
@@ -79,7 +195,7 @@ export async function kicadLoadError(filePath) {
79
195
  ? ['sch', 'export', 'netlist', '--output', path.join(dir, 'probe.net'), filePath]
80
196
  : ['pcb', 'export', 'pos', '--output', path.join(dir, 'probe.pos'), filePath];
81
197
  try {
82
- const res = await execa('kicad-cli', args, { reject: false });
198
+ const res = await runKicad(args, { reject: false });
83
199
  if (res.failed && res.code === 'ENOENT')
84
200
  throw new KicadCliMissingError();
85
201
  if (res.exitCode === 0)
@@ -112,10 +228,12 @@ export async function exportFab(pcbPath, schPath, outDir) {
112
228
  }
113
229
  for (const job of jobs) {
114
230
  try {
115
- await execa('kicad-cli', job.args);
231
+ await runKicad(job.args);
116
232
  result.produced.push(job.artifact);
117
233
  }
118
234
  catch (err) {
235
+ if (err instanceof KicadCliMissingError)
236
+ throw err;
119
237
  if (err.code === 'ENOENT')
120
238
  throw new KicadCliMissingError();
121
239
  result.failed.push({ artifact: job.artifact, reason: String(err.stderr ?? err.message).slice(0, 200) });
@@ -129,9 +247,11 @@ export async function exportSvg(kind, filePath, outDir) {
129
247
  ? ['sch', 'export', 'svg', '--output', outDir, filePath]
130
248
  : ['pcb', 'export', 'svg', '--output', path.join(outDir, 'board.svg'), '--layers', 'F.Cu,B.Cu,Edge.Cuts', filePath];
131
249
  try {
132
- await execa('kicad-cli', args);
250
+ await runKicad(args);
133
251
  }
134
252
  catch (err) {
253
+ if (err instanceof KicadCliMissingError)
254
+ throw err;
135
255
  if (err.code === 'ENOENT')
136
256
  throw new KicadCliMissingError();
137
257
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/kicad/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/kicad/cli.ts"],"names":[],"mappings":"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"}