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.
- package/README.md +36 -4
- package/dist/agent/animate.js +76 -0
- package/dist/agent/animate.js.map +1 -0
- package/dist/agent/box.js +89 -0
- package/dist/agent/box.js.map +1 -0
- package/dist/agent/dock-renderer.js +173 -0
- package/dist/agent/dock-renderer.js.map +1 -0
- package/dist/agent/logo.js +21 -0
- package/dist/agent/logo.js.map +1 -0
- package/dist/agent/loop.js +130 -18
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/prompts.js +2 -1
- package/dist/agent/prompts.js.map +1 -1
- package/dist/agent/providers/claude-code.js +85 -116
- package/dist/agent/providers/claude-code.js.map +1 -1
- package/dist/agent/providers/cursor.js +317 -0
- package/dist/agent/providers/cursor.js.map +1 -0
- package/dist/agent/providers/tool-protocol.js +205 -0
- package/dist/agent/providers/tool-protocol.js.map +1 -0
- package/dist/agent/recovery.js +148 -0
- package/dist/agent/recovery.js.map +1 -0
- package/dist/agent/render.js +44 -12
- package/dist/agent/render.js.map +1 -1
- package/dist/agent/response-cache.js +81 -0
- package/dist/agent/response-cache.js.map +1 -0
- package/dist/agent/runmeta.js +4 -5
- package/dist/agent/runmeta.js.map +1 -1
- package/dist/agent/theme.js +84 -0
- package/dist/agent/theme.js.map +1 -0
- package/dist/agent/tools.js +61 -4
- package/dist/agent/tools.js.map +1 -1
- package/dist/agent/transcript.js.map +1 -1
- package/dist/cli.js +134 -13
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.js +482 -38
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/demo.js +146 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/doctor.js +240 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/repl-inspect.js +342 -0
- package/dist/commands/repl-inspect.js.map +1 -0
- package/dist/commands/repl.js +618 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/config.js +24 -2
- package/dist/config.js.map +1 -1
- package/dist/kicad/bootstrap.js +166 -0
- package/dist/kicad/bootstrap.js.map +1 -0
- package/dist/kicad/cli.js +126 -6
- package/dist/kicad/cli.js.map +1 -1
- package/dist/kicad/spice.js +306 -0
- package/dist/kicad/spice.js.map +1 -0
- package/dist/kicad/symlib.js +228 -0
- package/dist/kicad/symlib.js.map +1 -0
- package/dist/memory/bom-table.js +193 -22
- package/dist/memory/bom-table.js.map +1 -1
- package/dist/memory/drift.js +33 -11
- package/dist/memory/drift.js.map +1 -1
- package/dist/util/cli-args.js +35 -0
- package/dist/util/cli-args.js.map +1 -0
- package/dist/util/dock.js +155 -0
- package/dist/util/dock.js.map +1 -0
- package/dist/util/git.js +165 -4
- package/dist/util/git.js.map +1 -1
- package/dist/util/live-prompt.js +542 -0
- package/dist/util/live-prompt.js.map +1 -0
- package/dist/util/paths.js +9 -0
- package/dist/util/paths.js.map +1 -1
- package/dist/util/preflight.js +37 -0
- package/dist/util/preflight.js.map +1 -1
- package/dist/util/retry.js +23 -0
- package/dist/util/retry.js.map +1 -1
- package/dist/util/select.js +172 -0
- package/dist/util/select.js.map +1 -0
- package/dist/util/tmp.js +119 -0
- package/dist/util/tmp.js.map +1 -0
- package/package.json +3 -2
- package/src/agent/animate.ts +90 -0
- package/src/agent/box.ts +99 -0
- package/src/agent/dock-renderer.ts +181 -0
- package/src/agent/logo.ts +23 -0
- package/src/agent/loop.ts +148 -18
- package/src/agent/prompts.ts +2 -1
- package/src/agent/providers/claude-code.ts +91 -122
- package/src/agent/providers/cursor.ts +364 -0
- package/src/agent/providers/tool-protocol.ts +212 -0
- package/src/agent/recovery.ts +162 -0
- package/src/agent/render.ts +56 -12
- package/src/agent/response-cache.ts +80 -0
- package/src/agent/runmeta.ts +6 -7
- package/src/agent/theme.ts +91 -0
- package/src/agent/tools.ts +62 -4
- package/src/agent/transcript.ts +1 -0
- package/src/agent/types.ts +17 -0
- package/src/cli.ts +139 -15
- package/src/commands/create.ts +581 -40
- package/src/commands/demo.ts +184 -0
- package/src/commands/doctor.ts +289 -0
- package/src/commands/repl-inspect.ts +353 -0
- package/src/commands/repl.ts +685 -0
- package/src/config.ts +40 -3
- package/src/kicad/bootstrap.ts +181 -0
- package/src/kicad/cli.ts +132 -7
- package/src/kicad/spice.ts +399 -0
- package/src/kicad/symlib.ts +248 -0
- package/src/layout/claude-ui-layout.md +72 -0
- package/src/layout/repl-ui-layout.md +139 -0
- package/src/memory/bom-table.ts +191 -20
- package/src/memory/drift.ts +42 -11
- package/src/util/cli-args.ts +42 -0
- package/src/util/dock.ts +161 -0
- package/src/util/git.ts +176 -4
- package/src/util/live-prompt.ts +595 -0
- package/src/util/paths.ts +10 -0
- package/src/util/preflight.ts +44 -0
- package/src/util/retry.ts +29 -0
- package/src/util/select.ts +192 -0
- 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);
|
|
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
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
package/dist/kicad/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/kicad/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IACtD;QACE,KAAK,CACH,6BAA6B,EAC7B,mHAAmH,EACnH;YACE,oDAAoD;YACpD,4FAA4F;YAC5F,8CAA8C;SAC/C,CACF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/kicad/cli.ts"],"names":[],"mappings":"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"}
|