copperhead 0.9.0 → 0.11.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 (142) hide show
  1. package/NOTICE +1 -1
  2. package/README.md +47 -8
  3. package/dist/agent/context.js +2 -0
  4. package/dist/agent/context.js.map +1 -0
  5. package/dist/agent/dock-renderer.js +2 -2
  6. package/dist/agent/dock-renderer.js.map +1 -1
  7. package/dist/agent/envelope.js +105 -0
  8. package/dist/agent/envelope.js.map +1 -0
  9. package/dist/agent/filetools.js +24 -1
  10. package/dist/agent/filetools.js.map +1 -1
  11. package/dist/agent/ledger.js +24 -0
  12. package/dist/agent/ledger.js.map +1 -1
  13. package/dist/agent/loop.js +63 -72
  14. package/dist/agent/loop.js.map +1 -1
  15. package/dist/agent/prompts.js +4 -3
  16. package/dist/agent/prompts.js.map +1 -1
  17. package/dist/agent/providers/claude-code.js +17 -1
  18. package/dist/agent/providers/claude-code.js.map +1 -1
  19. package/dist/agent/providers/codex.js +84 -39
  20. package/dist/agent/providers/codex.js.map +1 -1
  21. package/dist/agent/providers/tool-protocol.js +21 -0
  22. package/dist/agent/providers/tool-protocol.js.map +1 -1
  23. package/dist/agent/recovery.js +186 -15
  24. package/dist/agent/recovery.js.map +1 -1
  25. package/dist/agent/registry.js +49 -0
  26. package/dist/agent/registry.js.map +1 -0
  27. package/dist/agent/render.js +2 -2
  28. package/dist/agent/render.js.map +1 -1
  29. package/dist/agent/theme.js +10 -5
  30. package/dist/agent/theme.js.map +1 -1
  31. package/dist/agent/tools.js +100 -586
  32. package/dist/agent/tools.js.map +1 -1
  33. package/dist/agent/transcript.js +2 -0
  34. package/dist/agent/transcript.js.map +1 -1
  35. package/dist/capabilities/define.js +35 -0
  36. package/dist/capabilities/define.js.map +1 -0
  37. package/dist/capabilities/handlers.js +744 -0
  38. package/dist/capabilities/handlers.js.map +1 -0
  39. package/dist/capabilities/helpers.js +39 -0
  40. package/dist/capabilities/helpers.js.map +1 -0
  41. package/dist/capabilities/index.js +50 -0
  42. package/dist/capabilities/index.js.map +1 -0
  43. package/dist/capabilities/skills/generate-report.js +23 -0
  44. package/dist/capabilities/skills/generate-report.js.map +1 -0
  45. package/dist/cli.js +158 -0
  46. package/dist/cli.js.map +1 -1
  47. package/dist/commands/check.js +33 -1
  48. package/dist/commands/check.js.map +1 -1
  49. package/dist/commands/create.js +181 -26
  50. package/dist/commands/create.js.map +1 -1
  51. package/dist/commands/doctor.js +83 -6
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/skill.js +109 -0
  54. package/dist/commands/skill.js.map +1 -0
  55. package/dist/commands/sync.js +3 -1
  56. package/dist/commands/sync.js.map +1 -1
  57. package/dist/config.js +19 -6
  58. package/dist/config.js.map +1 -1
  59. package/dist/kicad/bootstrap.js +24 -3
  60. package/dist/kicad/bootstrap.js.map +1 -1
  61. package/dist/kicad/cli.js +106 -18
  62. package/dist/kicad/cli.js.map +1 -1
  63. package/dist/kicad/dossier.js +207 -0
  64. package/dist/kicad/dossier.js.map +1 -0
  65. package/dist/kicad/draft/draft.js +135 -0
  66. package/dist/kicad/draft/draft.js.map +1 -0
  67. package/dist/kicad/draft/engine.js +5310 -0
  68. package/dist/kicad/draft/engine.js.map +1 -0
  69. package/dist/kicad/draft/ir.js +368 -0
  70. package/dist/kicad/draft/ir.js.map +1 -0
  71. package/dist/kicad/draft/symsource.js +504 -0
  72. package/dist/kicad/draft/symsource.js.map +1 -0
  73. package/dist/kicad/emit.js +220 -0
  74. package/dist/kicad/emit.js.map +1 -0
  75. package/dist/kicad/fab.js +13 -0
  76. package/dist/kicad/fab.js.map +1 -1
  77. package/dist/kicad/legibility.js +608 -0
  78. package/dist/kicad/legibility.js.map +1 -0
  79. package/dist/kicad/score.js +431 -0
  80. package/dist/kicad/score.js.map +1 -0
  81. package/dist/kicad/sexp.js +265 -6
  82. package/dist/kicad/sexp.js.map +1 -1
  83. package/dist/kicad/symlib.js +346 -16
  84. package/dist/kicad/symlib.js.map +1 -1
  85. package/dist/mcp/server.js +485 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/memory/bom-table.js +75 -39
  88. package/dist/memory/bom-table.js.map +1 -1
  89. package/dist/memory/scaffold.js +14 -1
  90. package/dist/memory/scaffold.js.map +1 -1
  91. package/dist/util/redact.js +6 -0
  92. package/dist/util/redact.js.map +1 -1
  93. package/package.json +13 -8
  94. package/src/agent/context.ts +35 -0
  95. package/src/agent/dock-renderer.ts +3 -2
  96. package/src/agent/envelope.ts +124 -0
  97. package/src/agent/filetools.ts +26 -1
  98. package/src/agent/ledger.ts +24 -0
  99. package/src/agent/loop.ts +73 -78
  100. package/src/agent/prompts.ts +4 -3
  101. package/src/agent/providers/claude-code.ts +22 -1
  102. package/src/agent/providers/codex.ts +91 -42
  103. package/src/agent/providers/tool-protocol.ts +22 -0
  104. package/src/agent/recovery.ts +183 -13
  105. package/src/agent/registry.ts +58 -0
  106. package/src/agent/render.ts +4 -3
  107. package/src/agent/theme.ts +15 -5
  108. package/src/agent/tools.ts +124 -628
  109. package/src/agent/transcript.ts +6 -0
  110. package/src/agent/types.ts +10 -5
  111. package/src/capabilities/define.ts +88 -0
  112. package/src/capabilities/handlers.ts +769 -0
  113. package/src/capabilities/helpers.ts +37 -0
  114. package/src/capabilities/index.ts +53 -0
  115. package/src/capabilities/skills/generate-report.ts +25 -0
  116. package/src/cli.ts +154 -0
  117. package/src/commands/check.ts +51 -1
  118. package/src/commands/create.ts +183 -21
  119. package/src/commands/doctor.ts +85 -6
  120. package/src/commands/skill.ts +127 -0
  121. package/src/commands/sync.ts +5 -3
  122. package/src/config.ts +56 -8
  123. package/src/kicad/bootstrap.ts +24 -3
  124. package/src/kicad/cli.ts +129 -18
  125. package/src/kicad/dossier.ts +217 -0
  126. package/src/kicad/draft/draft.ts +173 -0
  127. package/src/kicad/draft/engine.ts +5274 -0
  128. package/src/kicad/draft/ir.ts +416 -0
  129. package/src/kicad/draft/symsource.ts +549 -0
  130. package/src/kicad/emit.ts +300 -0
  131. package/src/kicad/fab.ts +15 -0
  132. package/src/kicad/legibility.ts +695 -0
  133. package/src/kicad/score.ts +502 -0
  134. package/src/kicad/sexp.ts +346 -6
  135. package/src/kicad/symlib.ts +364 -18
  136. package/src/mcp/server.ts +560 -0
  137. package/src/memory/bom-table.ts +85 -38
  138. package/src/memory/scaffold.ts +14 -1
  139. package/src/util/redact.ts +6 -0
  140. package/dist/memory/synap.js +0 -152
  141. package/dist/memory/synap.js.map +0 -1
  142. package/src/memory/synap.ts +0 -217
@@ -0,0 +1,504 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { parseSexp, children, child, isList } from '../sexp.js';
5
+ import { symbolSearchDirs, findLibraryFile, findSymbolAcrossLibraries, closestSymbolNames } from '../symlib.js';
6
+ import { EMIT_VERSION, renameSymbolBlock } from '../emit.js';
7
+ /**
8
+ * Symbol resolution for the drafting engine, with hermetic vendoring (design
9
+ * D4): on first use a symbol's `(symbol …)` source block is copied verbatim
10
+ * from the installed `.kicad_sym` into a committed project cache, and every
11
+ * later draft reads the vendored copy. A KiCad library upgrade therefore
12
+ * cannot change drafted output until the cache is deliberately refreshed;
13
+ * `verify_symbols` keeps comparing against the installed libraries, so genuine
14
+ * library drift stays visible rather than silently frozen.
15
+ */
16
+ export const SYM_CACHE_DIR = 'sym-lib-cache';
17
+ /**
18
+ * How many `(extends …)` hops to follow before treating a library as malformed.
19
+ * Real libraries chain at most one or two deep (a part variant extending a
20
+ * generic); anything deeper is a cycle, and following it would blow the stack
21
+ * mid-draft with no attributable message.
22
+ */
23
+ const MAX_EXTENDS_DEPTH = 8;
24
+ const atomAt = (node, idx) => {
25
+ const v = node?.[idx];
26
+ return typeof v === 'string' ? v : undefined;
27
+ };
28
+ const tag = (n) => (isList(n) && typeof n[0] === 'string' ? n[0] : null);
29
+ const num = (n, idx, fb = 0) => {
30
+ const v = atomAt(n, idx);
31
+ return v === undefined ? fb : parseFloat(v);
32
+ };
33
+ /** Extract the top-level `(symbol "name" …)` block from library text, verbatim. */
34
+ export function extractSymbolBlock(libText, name) {
35
+ const needle = `(symbol "${name}"`;
36
+ let idx = -1;
37
+ // match only top-level entries: preceded by newline + whitespace, depth 1
38
+ for (let from = 0;;) {
39
+ idx = libText.indexOf(needle, from);
40
+ if (idx === -1)
41
+ return null;
42
+ const lineStart = libText.lastIndexOf('\n', idx) + 1;
43
+ if (libText.slice(lineStart, idx).trim() === '')
44
+ break;
45
+ from = idx + needle.length;
46
+ }
47
+ let depth = 0;
48
+ let inString = false;
49
+ for (let i = idx; i < libText.length; i++) {
50
+ const c = libText[i];
51
+ if (inString) {
52
+ if (c === '\\')
53
+ i++;
54
+ else if (c === '"')
55
+ inString = false;
56
+ }
57
+ else if (c === '"')
58
+ inString = true;
59
+ else if (c === '(')
60
+ depth++;
61
+ else if (c === ')') {
62
+ depth--;
63
+ if (depth === 0)
64
+ return libText.slice(idx, i + 1);
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ /** Highest unit number among a block's `Name_<unit>_<style>` children. */
70
+ function maxUnitOf(sym) {
71
+ let max = 0;
72
+ for (const c of children(sym, 'symbol')) {
73
+ const name = atomAt(c, 1);
74
+ const m = name ? /_(\d+)_(\d+)$/.exec(name) : null;
75
+ if (m)
76
+ max = Math.max(max, Number(m[1]));
77
+ }
78
+ return max;
79
+ }
80
+ const mergeBounds = (a, b) => {
81
+ if (!a)
82
+ return b ? { ...b } : null;
83
+ if (!b)
84
+ return { ...a };
85
+ return {
86
+ minX: Math.min(a.minX, b.minX),
87
+ minY: Math.min(a.minY, b.minY),
88
+ maxX: Math.max(a.maxX, b.maxX),
89
+ maxY: Math.max(a.maxY, b.maxY),
90
+ };
91
+ };
92
+ /**
93
+ * Per-unit views of a multi-unit block. Each unit's pins and body come from
94
+ * its own `_<unit>_<style>` children; the common `_0_*` graphics are merged
95
+ * into every unit's body because KiCad draws them on every unit. Only body
96
+ * styles 0 and 1 contribute — style ≥ 2 is the de Morgan alternate, which
97
+ * repeats the same pins at other coordinates and would double them.
98
+ */
99
+ function unitViewsOf(sym) {
100
+ const byUnit = new Map();
101
+ for (const c of children(sym, 'symbol')) {
102
+ const name = atomAt(c, 1);
103
+ const m = name ? /_(\d+)_(\d+)$/.exec(name) : null;
104
+ if (!m || Number(m[2]) >= 2)
105
+ continue;
106
+ const u = Number(m[1]);
107
+ byUnit.set(u, [...(byUnit.get(u) ?? []), c]);
108
+ }
109
+ const common = byUnit.get(0) ?? [];
110
+ const commonPins = common.flatMap((c) => pinsOf(c));
111
+ const commonUnitPins = commonPins.map((p) => p.number);
112
+ const commonBody = common.reduce((b, c) => mergeBounds(b, bodyOf(c)), null);
113
+ const units = [...byUnit.keys()]
114
+ .filter((u) => u >= 1)
115
+ .sort((a, b) => a - b)
116
+ .map((u) => ({
117
+ unit: u,
118
+ pins: [...byUnit.get(u).flatMap((n) => pinsOf(n)), ...commonPins],
119
+ body: byUnit.get(u).reduce((b, n) => mergeBounds(b, bodyOf(n)), commonBody),
120
+ }));
121
+ return { units, commonUnitPins };
122
+ }
123
+ function parseSymbolNode(block) {
124
+ const node = parseSexp(block)[0];
125
+ if (node === undefined || !isList(node))
126
+ throw new Error('unparseable symbol block');
127
+ return node;
128
+ }
129
+ function pinsOf(sym) {
130
+ const pins = [];
131
+ const walk = (n) => {
132
+ if (!isList(n))
133
+ return;
134
+ if (tag(n) === 'pin') {
135
+ const at = child(n, 'at');
136
+ const numAtom = atomAt(child(n, 'number'), 1);
137
+ if (at && numAtom !== undefined) {
138
+ pins.push({
139
+ number: numAtom,
140
+ name: atomAt(child(n, 'name'), 1) ?? '~',
141
+ etype: typeof n[1] === 'string' ? n[1] : 'passive',
142
+ x: num(at, 1),
143
+ y: num(at, 2),
144
+ angle: num(at, 3),
145
+ });
146
+ }
147
+ }
148
+ for (const c of n)
149
+ walk(c);
150
+ };
151
+ walk(sym);
152
+ return pins;
153
+ }
154
+ function bodyOf(sym) {
155
+ let b = null;
156
+ const extend = (x, y) => {
157
+ if (!b)
158
+ b = { minX: x, minY: y, maxX: x, maxY: y };
159
+ else {
160
+ b.minX = Math.min(b.minX, x);
161
+ b.minY = Math.min(b.minY, y);
162
+ b.maxX = Math.max(b.maxX, x);
163
+ b.maxY = Math.max(b.maxY, y);
164
+ }
165
+ };
166
+ const walk = (n) => {
167
+ if (!isList(n))
168
+ return;
169
+ const t = tag(n);
170
+ if (t === 'rectangle') {
171
+ const s = child(n, 'start');
172
+ const e = child(n, 'end');
173
+ extend(num(s, 1), num(s, 2));
174
+ extend(num(e, 1), num(e, 2));
175
+ }
176
+ else if (t === 'circle') {
177
+ const c = child(n, 'center');
178
+ const r = num(child(n, 'radius'), 1);
179
+ extend(num(c, 1) - r, num(c, 2) - r);
180
+ extend(num(c, 1) + r, num(c, 2) + r);
181
+ }
182
+ else if (t === 'arc') {
183
+ for (const part of ['start', 'mid', 'end']) {
184
+ const p = child(n, part);
185
+ if (p)
186
+ extend(num(p, 1), num(p, 2));
187
+ }
188
+ }
189
+ else if (t === 'polyline') {
190
+ for (const xy of children(child(n, 'pts') ?? [], 'xy'))
191
+ extend(num(xy, 1), num(xy, 2));
192
+ }
193
+ if (t !== 'pin' && t !== 'text')
194
+ for (const c of n)
195
+ walk(c);
196
+ };
197
+ walk(sym);
198
+ return b;
199
+ }
200
+ /** One vendored file per library nickname, so a project `sym-lib-table` can
201
+ * point KiCad (and ERC's lib_symbol_issues check) at the vendored sources. */
202
+ const vendorFileName = (lib) => `${lib.replace(/[^A-Za-z0-9_.+-]/g, '_')}.kicad_sym`;
203
+ const emptyVendorLib = () => `(kicad_symbol_lib\n\t(version ${EMIT_VERSION})\n\t(generator "copperhead-vendor")\n)\n`;
204
+ /** Insert a symbol block before the wrapper's closing paren. */
205
+ function appendToVendorLib(libText, block) {
206
+ const end = libText.lastIndexOf(')');
207
+ return libText.slice(0, end) + block + '\n' + libText.slice(end);
208
+ }
209
+ export class SymbolResolutionError extends Error {
210
+ libId;
211
+ reason;
212
+ candidates;
213
+ constructor(libId, reason, candidates = []) {
214
+ super(reason === 'no-library'
215
+ ? `library for "${libId}" is not installed and not vendored`
216
+ : reason === 'derived-unsupported'
217
+ ? `"${libId}" extends a symbol that cannot be followed (missing base name, or a cycle deeper than ${MAX_EXTENDS_DEPTH} hops); use the base symbol directly`
218
+ : reason === 'found-elsewhere'
219
+ ? candidates.length && candidates.every((c) => c.startsWith(`${libId.includes(':') ? libId.slice(0, libId.indexOf(':')) : ''}:`))
220
+ ? `"${libId}" does not exist in that library, closest real name: ${candidates.join(' or ')} — the library was right, use the real symbol name`
221
+ : `"${libId}" is wrong about the library, not the part: use ${candidates.join(' or ')} instead`
222
+ : `"${libId}" does not exist in the library${candidates.length ? ` — closest: ${candidates.join(', ')}` : ''}`);
223
+ this.libId = libId;
224
+ this.reason = reason;
225
+ this.candidates = candidates;
226
+ }
227
+ }
228
+ /**
229
+ * A part's library file is guessed wrong more often than the part itself is
230
+ * misspelled (a chip's stock library nickname is not derivable from its part
231
+ * number). The caller consults this only after the guessed file offered no
232
+ * candidates of its own — same-library near-misses are stronger evidence and
233
+ * come first. Across the other libraries, exact name hits are returned alone
234
+ * when any exist; fuzzy matches are the fallback, reported under the symbol
235
+ * name that actually matched. Returns corrected `lib_id`s or an empty array.
236
+ */
237
+ async function crossLibrarySuggestions(name, lib, dirs) {
238
+ const matches = await findSymbolAcrossLibraries(name, dirs, lib);
239
+ const exact = matches.filter((m) => m.exact).map((m) => `${m.lib}:${m.name}`);
240
+ if (exact.length)
241
+ return exact;
242
+ return matches.map((m) => `${m.lib}:${m.name}`);
243
+ }
244
+ export class SymbolSource {
245
+ repoRoot;
246
+ searchDirs;
247
+ vendor;
248
+ cache = new Map();
249
+ /**
250
+ * @param repoRoot project root; the vendored cache lives at `<root>/sym-lib-cache/`
251
+ * @param searchDirs override for the installed-library search path (tests)
252
+ * @param vendor when false, resolution never writes: symbols come from the
253
+ * vendored cache or the installed libraries verbatim, but nothing is copied
254
+ * into `sym-lib-cache/`. For read-shaped callers (`draftSchematicToText`, staleness
255
+ * probes) that must not mutate the working tree.
256
+ */
257
+ constructor(repoRoot, searchDirs, vendor = true) {
258
+ this.repoRoot = repoRoot;
259
+ this.searchDirs = searchDirs;
260
+ this.vendor = vendor;
261
+ }
262
+ cacheDir() {
263
+ return path.join(this.repoRoot, SYM_CACHE_DIR);
264
+ }
265
+ /** Library nicknames vendored (or generated) so far, for the sym-lib-table. */
266
+ libs = new Set();
267
+ vendoredLibs() {
268
+ return [...this.libs].sort();
269
+ }
270
+ /**
271
+ * Write an engine-generated symbol block into the vendored cache (power lib).
272
+ *
273
+ * A generated block is the engine's, not a vendor's: when the engine's
274
+ * drawing of a rail or ground changes, the cached copy must follow, or every
275
+ * embedded power symbol on the sheet raises a lib_symbol_mismatch warning
276
+ * against the stale library (the triangle-ground redraw hit 111 of them on
277
+ * esp32-amp). A block already cached byte-for-byte is left alone.
278
+ */
279
+ async vendorGenerated(libId, block) {
280
+ const lib = libId.slice(0, libId.indexOf(':'));
281
+ const name = libId.slice(libId.indexOf(':') + 1);
282
+ const file = path.join(this.cacheDir(), vendorFileName(lib));
283
+ await mkdir(this.cacheDir(), { recursive: true });
284
+ let text = existsSync(file) ? await readFile(file, 'utf8') : emptyVendorLib();
285
+ const cached = extractSymbolBlock(text, name);
286
+ if (cached !== block) {
287
+ if (cached)
288
+ text = text.replace(cached + '\n', '').replace(cached, '');
289
+ await writeFile(file, appendToVendorLib(text, block), 'utf8');
290
+ }
291
+ this.libs.add(lib);
292
+ }
293
+ /**
294
+ * A derived symbol (`(extends "Base")`) carries no geometry of its own: KiCad
295
+ * stores the pins and body once on the base and lets the derived entry
296
+ * override only properties (Value, Datasheet, description). Resolving one
297
+ * means inheriting the base's geometry under the derived name.
298
+ *
299
+ * Returns null for a symbol that does not extend anything, so the caller
300
+ * falls through to the ordinary path.
301
+ *
302
+ * `sourceText` is the BASE block verbatim. The emitter renames a vendored
303
+ * block to its lib_id on the way into `lib_symbols`
304
+ * (`emit.ts:renameSymbolBlock`), so the base geometry lands under the
305
+ * derived name with no rewriting here. The rename covers the unit children
306
+ * too (`Base_0_1` becomes `Derived_0_1`): KiCad's schematic loader requires
307
+ * the child prefix to match the parent name, and a derived block wrapping
308
+ * the base's children fails to load outright — found when the first
309
+ * reference board with real derived symbols (AMS1117-3.3, ATmega328P-A)
310
+ * refused to open.
311
+ *
312
+ * The derived entry's own property overrides are dropped. Nothing downstream
313
+ * reads them — the engine sets Reference, Value and Footprint from the IR —
314
+ * and keeping them would mean merging two property lists to no effect.
315
+ */
316
+ async inherit(libId, lib, node, depth) {
317
+ const ext = child(node, 'extends');
318
+ if (!ext)
319
+ return null;
320
+ const baseName = atomAt(ext, 1);
321
+ if (!baseName)
322
+ throw new SymbolResolutionError(libId, 'derived-unsupported');
323
+ // A chain is legal (a derived symbol may extend another), a cycle is not —
324
+ // and a malformed library that extends itself would otherwise recurse until
325
+ // the stack gives out, mid-draft, with no attributable message.
326
+ if (depth >= MAX_EXTENDS_DEPTH)
327
+ throw new SymbolResolutionError(libId, 'derived-unsupported');
328
+ const base = await this.resolve(`${lib}:${baseName}`, depth + 1);
329
+ return {
330
+ libId,
331
+ sourceText: base.sourceText,
332
+ pins: base.pins,
333
+ body: base.body,
334
+ isPower: base.isPower,
335
+ multiUnit: base.multiUnit,
336
+ units: base.units,
337
+ commonUnitPins: base.commonUnitPins,
338
+ };
339
+ }
340
+ /** Resolve a lib_id: vendored copy first, else installed library (then vendor it). */
341
+ async resolve(libId, depth = 0) {
342
+ const hit = this.cache.get(libId);
343
+ if (hit)
344
+ return hit;
345
+ const lib = libId.includes(':') ? libId.slice(0, libId.indexOf(':')) : '';
346
+ const name = libId.includes(':') ? libId.slice(libId.indexOf(':') + 1) : libId;
347
+ const vendored = path.join(this.cacheDir(), vendorFileName(lib));
348
+ let block = null;
349
+ let fromInstalled = false;
350
+ if (existsSync(vendored)) {
351
+ block = extractSymbolBlock(await readFile(vendored, 'utf8'), name);
352
+ if (block)
353
+ this.libs.add(lib);
354
+ }
355
+ if (!block) {
356
+ const dirs = this.searchDirs ?? (await symbolSearchDirs());
357
+ const file = await findLibraryFile(lib, dirs);
358
+ if (!file) {
359
+ const elsewhere = await crossLibrarySuggestions(name, lib, dirs);
360
+ if (elsewhere.length)
361
+ throw new SymbolResolutionError(libId, 'found-elsewhere', elsewhere);
362
+ throw new SymbolResolutionError(libId, 'no-library');
363
+ }
364
+ const libText = await readFile(file, 'utf8');
365
+ block = extractSymbolBlock(libText, name);
366
+ if (!block) {
367
+ // The guessed library exists and simply lacks this name, so its own
368
+ // near-matches are the most useful answer and come first: the caller
369
+ // named the right file and mistyped the part. The scrape matches every
370
+ // `(symbol …)` line including indented sub-unit children;
371
+ // closestSymbolNames filters those out and ranks what remains, so all
372
+ // 8 slots carry placeable symbols. Only when that file offers nothing
373
+ // is a different library worth suggesting — and only an exact hit
374
+ // there, since a cross-library *fuzzy* guess is weaker evidence than
375
+ // "you were close, in the right file".
376
+ const names = [...libText.matchAll(/^\s*\(symbol\s+"([^"]+)"/gm)].map((m) => m[1]);
377
+ const candidates = closestSymbolNames(names, name);
378
+ if (candidates.length)
379
+ throw new SymbolResolutionError(libId, 'no-symbol', candidates);
380
+ const elsewhere = await crossLibrarySuggestions(name, lib, dirs);
381
+ if (elsewhere.length)
382
+ throw new SymbolResolutionError(libId, 'found-elsewhere', elsewhere);
383
+ throw new SymbolResolutionError(libId, 'no-symbol', candidates);
384
+ }
385
+ fromInstalled = true;
386
+ this.libs.add(lib);
387
+ }
388
+ const node = parseSymbolNode(block);
389
+ const inherited = await this.inherit(libId, lib, node, depth);
390
+ if (fromInstalled && this.vendor) {
391
+ // Derived symbols vendor FLATTENED under their own name, never as the
392
+ // library's `extends` stub. A vendored stub makes the project
393
+ // sym-lib-table resolve the derived name to base-geometry-plus-derived-
394
+ // properties while the sheet embeds base-geometry-plus-base-properties,
395
+ // and ERC reports lib_symbol_mismatch on every derived part. The
396
+ // flattened copy is byte-for-byte what the emitter embeds (modulo the
397
+ // lib nickname), exactly like a non-derived vendored block.
398
+ const vendorBlock = inherited ? renameSymbolBlock(inherited.sourceText, name) : block;
399
+ await mkdir(this.cacheDir(), { recursive: true });
400
+ const existing = existsSync(vendored) ? await readFile(vendored, 'utf8') : emptyVendorLib();
401
+ if (!extractSymbolBlock(existing, name)) {
402
+ await writeFile(vendored, appendToVendorLib(existing, vendorBlock), 'utf8');
403
+ }
404
+ }
405
+ const multiUnit = maxUnitOf(node) >= 2;
406
+ const resolved = inherited ?? {
407
+ libId,
408
+ sourceText: block,
409
+ pins: pinsOf(node),
410
+ body: bodyOf(node),
411
+ isPower: child(node, 'power') !== undefined || libId.startsWith('power:'),
412
+ multiUnit,
413
+ ...(multiUnit ? unitViewsOf(node) : {}),
414
+ };
415
+ this.cache.set(libId, resolved);
416
+ return resolved;
417
+ }
418
+ }
419
+ /**
420
+ * The symbol-name token a power-class net's generated symbol lives under
421
+ * (`copperhead_power:<token>`), which is also what its vendored file is named
422
+ * from. Two nets that sanitize to one token would share one `lib_id` and one
423
+ * embedded pin name, quietly merging their rails in KiCad's netlist —
424
+ * `validateIntent` refuses that pair using this same function, so the collision
425
+ * dies as a numbered finding instead.
426
+ */
427
+ export const powerNetToken = (net) => net.replace(/[^A-Za-z0-9_+.-]/g, '_');
428
+ /** Escape a string for embedding inside a quoted s-expression atom. Defense in
429
+ * depth: `validateIntent` already refuses net names containing `"` or `\`, but
430
+ * this template must not be able to corrupt a schematic even if called raw. */
431
+ const sexpQuote = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
432
+ /**
433
+ * Engine-authored power-port and PWR_FLAG symbols (design D6a). Authored here,
434
+ * not copied from a library: the engine must be able to satisfy ERC's
435
+ * undriven-rail check on any machine without depending on the installed power
436
+ * library's naming. Pin at the origin; the body draws above (rail) or below
437
+ * (ground) it.
438
+ */
439
+ export function powerSymbolSource(rawNet, kind) {
440
+ const net = sexpQuote(rawNet);
441
+ const name = powerNetToken(rawNet);
442
+ const libId = `copperhead_power:${name}`;
443
+ // Symbol space is Y-up and the schematic transform flips it: negative-Y
444
+ // graphics here render BELOW the connection point on the sheet. A ground
445
+ // hangs below its pin (angle 270 = line toward -Y body) as a stem and an
446
+ // open triangle, the reference-ground glyph; a rail rises above (angle 90)
447
+ // as a stem and a filled arrowhead, the way KiCad's own +3V3 draws. Both
448
+ // reach 2.54 from the pin, inside the 2-unit box the engine reserves.
449
+ const body = kind === 'ground'
450
+ ? `\t(symbol "${name}_0_1"
451
+ \t\t(polyline (pts (xy 0 0) (xy 0 -1.27)) (stroke (width 0.254) (type default)) (fill (type none)))
452
+ \t\t(polyline (pts (xy -1.27 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27)) (stroke (width 0.254) (type default)) (fill (type none)))
453
+ \t)
454
+ \t(symbol "${name}_1_1"
455
+ \t\t(pin power_in line (at 0 0 270) (length 0) hide
456
+ \t\t\t(name "${net}" (effects (font (size 1.27 1.27))))
457
+ \t\t\t(number "1" (effects (font (size 1.27 1.27))))
458
+ \t\t)
459
+ \t)`
460
+ : `\t(symbol "${name}_0_1"
461
+ \t\t(polyline (pts (xy 0 0) (xy 0 1.27)) (stroke (width 0.254) (type default)) (fill (type none)))
462
+ \t\t(polyline (pts (xy -0.762 1.27) (xy 0 2.54) (xy 0.762 1.27) (xy -0.762 1.27)) (stroke (width 0.254) (type default)) (fill (type outline)))
463
+ \t)
464
+ \t(symbol "${name}_1_1"
465
+ \t\t(pin power_in line (at 0 0 90) (length 0) hide
466
+ \t\t\t(name "${net}" (effects (font (size 1.27 1.27))))
467
+ \t\t\t(number "1" (effects (font (size 1.27 1.27))))
468
+ \t\t)
469
+ \t)`;
470
+ const sourceText = `(symbol "${name}"
471
+ \t(power)
472
+ \t(pin_names (offset 0))
473
+ \t(exclude_from_sim yes)
474
+ \t(in_bom no)
475
+ \t(on_board no)
476
+ \t(property "Reference" "#PWR" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
477
+ \t(property "Value" "${net}" (at 0 ${kind === 'ground' ? '-3.556' : '3.556'} 0) (effects (font (size 1.27 1.27)) hide))
478
+ ${body}
479
+ )`;
480
+ return { libId, sourceText };
481
+ }
482
+ export function pwrFlagSource() {
483
+ const libId = 'copperhead_power:PWR_FLAG';
484
+ const sourceText = `(symbol "PWR_FLAG"
485
+ \t(power)
486
+ \t(pin_names (offset 0))
487
+ \t(exclude_from_sim yes)
488
+ \t(in_bom no)
489
+ \t(on_board no)
490
+ \t(property "Reference" "#FLG" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))
491
+ \t(property "Value" "PWR_FLAG" (at 0 -3.556 0) (effects (font (size 1.27 1.27)) hide))
492
+ \t(symbol "PWR_FLAG_0_1"
493
+ \t\t(polyline (pts (xy 0 1.27) (xy -1.016 1.905) (xy 0 2.54) (xy 1.016 1.905) (xy 0 1.27)) (stroke (width 0.254) (type default)) (fill (type none)))
494
+ \t)
495
+ \t(symbol "PWR_FLAG_1_1"
496
+ \t\t(pin power_out line (at 0 0 90) (length 0) hide
497
+ \t\t\t(name "pwr" (effects (font (size 1.27 1.27))))
498
+ \t\t\t(number "1" (effects (font (size 1.27 1.27))))
499
+ \t\t)
500
+ \t)
501
+ )`;
502
+ return { libId, sourceText };
503
+ }
504
+ //# sourceMappingURL=symsource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symsource.js","sourceRoot":"","sources":["../../../src/kicad/draft/symsource.ts"],"names":[],"mappings":"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"}