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
@@ -17,9 +17,36 @@
17
17
  * matter most. When the exact name is absent, we surface close candidates
18
18
  * instead of guessing.
19
19
  */
20
- import { readFile, access } from 'node:fs/promises';
20
+ import { readFile, readdir, access, stat } from 'node:fs/promises';
21
21
  import path from 'node:path';
22
22
  import { parseSexp, children, child, isList } from './sexp.js';
23
+ /** Numeric-aware, case-insensitive pin-number ordering ("2" < "10", "a1" ~ "A1")
24
+ * shared by every pin-table renderer so orderings never diverge. */
25
+ const pinNumberCollator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' });
26
+ export const comparePinNumbers = (a, b) => pinNumberCollator.compare(a, b);
27
+ /**
28
+ * Symbol-name index of a `.kicad_sym`, cached by mtime. The stock set is ~220
29
+ * files that never change within a run, but discovery-heavy callers (the
30
+ * dossier's per-part search, the recovery probe loop) would otherwise re-read
31
+ * and re-scrape all of them per query. Returns null when the file is
32
+ * unreadable, so callers skip it the same way a failed readFile did.
33
+ */
34
+ const symbolNameCache = new Map();
35
+ async function libSymbolNames(file) {
36
+ try {
37
+ const { mtimeMs } = await stat(file);
38
+ const hit = symbolNameCache.get(file);
39
+ if (hit && hit.mtimeMs === mtimeMs)
40
+ return hit.names;
41
+ const text = await readFile(file, 'utf8');
42
+ const names = [...text.matchAll(/^\s*\(symbol\s+"([^"]+)"/gm)].map((m) => m[1]);
43
+ symbolNameCache.set(file, { mtimeMs, names });
44
+ return names;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
23
50
  const tag = (n) => (isList(n) && typeof n[0] === 'string' ? n[0] : null);
24
51
  const atomAt = (node, idx) => {
25
52
  const v = node?.[idx];
@@ -33,8 +60,13 @@ const normPinName = (n) => (n === '~' ? '' : n);
33
60
  * Candidate directories holding KiCad's stock `.kicad_sym` libraries, most
34
61
  * specific first. Env overrides win (KiCad exports these), then the standard
35
62
  * install locations for Linux/macOS/Windows. Only existing dirs are returned.
63
+ *
64
+ * @param winRoot test seam for the Windows `C:\Program Files\KiCad` root;
65
+ * defaults to the real path. Without this, the Windows version-directory
66
+ * discovery below can only be exercised on an actual Windows machine with
67
+ * KiCad installed at the default location.
36
68
  */
37
- export async function symbolSearchDirs(env = process.env) {
69
+ export async function symbolSearchDirs(env = process.env, winRoot = 'C:/Program Files/KiCad') {
38
70
  const fromEnv = [
39
71
  env.KICAD_SYMBOL_DIR,
40
72
  env.KICAD10_SYMBOL_DIR,
@@ -45,10 +77,15 @@ export async function symbolSearchDirs(env = process.env) {
45
77
  '/usr/share/kicad/symbols',
46
78
  '/usr/local/share/kicad/symbols',
47
79
  '/Applications/KiCad/KiCad.app/Contents/SharedSupport/symbols',
48
- 'C:/Program Files/KiCad/share/kicad/symbols',
80
+ // Windows installs under a version-numbered directory
81
+ // (C:\Program Files\KiCad\10.0\...), unlike Linux/macOS, so there is no
82
+ // single fixed path here. Discovered below instead.
49
83
  ];
50
84
  const out = [];
51
- for (const dir of [...fromEnv, ...defaults]) {
85
+ // An env override is exclusive: a caller pinning KICAD_SYMBOL_DIR at an
86
+ // isolated directory (tests, a pinned library set) must get only that
87
+ // directory back, not the machine's stock install appended after it.
88
+ for (const dir of fromEnv.length ? fromEnv : defaults) {
52
89
  try {
53
90
  await access(dir);
54
91
  if (!out.includes(dir))
@@ -58,10 +95,57 @@ export async function symbolSearchDirs(env = process.env) {
58
95
  // not present on this machine; skip
59
96
  }
60
97
  }
98
+ // Windows: KiCad's own installer picks the version directory
99
+ // (`10.0`, `9.0`, `8.0`, ...), so no fixed path is ever correct. List
100
+ // `C:\Program Files\KiCad` and check each version folder instead. Sorted
101
+ // descending so a machine with more than one version prefers the newest.
102
+ // Skipped entirely when an env override is set: "env overrides win" means
103
+ // exactly that, not "env overrides win, plus whatever else this discovers"
104
+ // — a caller pointing KICAD_SYMBOL_DIR at an isolated directory (tests, a
105
+ // pinned library set) must get only that directory back.
106
+ const kicadRoot = winRoot;
107
+ if (fromEnv.length === 0) {
108
+ try {
109
+ const entries = await readdir(kicadRoot, { withFileTypes: true });
110
+ const versions = entries
111
+ .filter((e) => e.isDirectory())
112
+ .map((e) => e.name)
113
+ .sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
114
+ for (const version of versions) {
115
+ const dir = `${kicadRoot}/${version}/share/kicad/symbols`;
116
+ try {
117
+ await access(dir);
118
+ if (!out.includes(dir))
119
+ out.push(dir);
120
+ }
121
+ catch {
122
+ // this version folder has no symbols dir; skip
123
+ }
124
+ }
125
+ // Some installs put share/ directly under the KiCad root with no
126
+ // version directory; probe that layout after the versioned ones.
127
+ const flat = `${kicadRoot}/share/kicad/symbols`;
128
+ try {
129
+ await access(flat);
130
+ if (!out.includes(flat))
131
+ out.push(flat);
132
+ }
133
+ catch {
134
+ // no non-versioned layout either; skip
135
+ }
136
+ }
137
+ catch {
138
+ // C:\Program Files\KiCad doesn't exist on this machine (not Windows, or KiCad not installed here); skip
139
+ }
140
+ }
61
141
  return out;
62
142
  }
63
- /** Path to `<lib>.kicad_sym` in the first search dir that has it, or null. */
143
+ /** Path to `<lib>.kicad_sym` in the first search dir that has it, or null.
144
+ * The nickname is model-supplied text: a separator or `..` in it would escape
145
+ * the search directories, so such a nickname resolves to nothing. */
64
146
  export async function findLibraryFile(lib, dirs) {
147
+ if (lib.includes('/') || lib.includes('\\') || lib.includes('..'))
148
+ return null;
65
149
  for (const dir of dirs) {
66
150
  const p = path.join(dir, `${lib}.kicad_sym`);
67
151
  try {
@@ -74,6 +158,216 @@ export async function findLibraryFile(lib, dirs) {
74
158
  }
75
159
  return null;
76
160
  }
161
+ /**
162
+ * Rank a library's symbol names against a queried name that failed to resolve.
163
+ * Comparison is case-insensitive with separators (`_`, `-`, `.`) stripped, so
164
+ * `Rotary_Encoder` finds `RotaryEncoder_Switch` and `microSD_Card` finds
165
+ * `Micro_SD_Card` — KiCad's own naming is inconsistent on exactly this axis.
166
+ * Sub-unit children (`Name_<unit>_<style>`) are internal structure, not
167
+ * placeable symbols, and never candidates. The name-inside-query direction
168
+ * requires at least 3 significant characters: a stock library is full of
169
+ * single-letter generics (`R`, `C`, `D`) that would otherwise "match" nearly
170
+ * any part number and crowd out the real near-miss.
171
+ */
172
+ const canonSymName = (s) => s.toLowerCase().replace(/[_\-.]/g, '');
173
+ /** Names must be this long before a single edit is distinctive enough to match. */
174
+ const MIN_EDIT_MATCH_LEN = 5;
175
+ /**
176
+ * The shared one-edit rule for "same part family, variant spelling": within one
177
+ * edit (SHT40 vs SHT4x, STM32F103C8T6 vs STM32F103C8Tx), except a
178
+ * digit-for-digit substitution, which names a *different real part*
179
+ * (TPS22860 vs TPS22810) rather than a family wildcard. Used by both resolvers
180
+ * so search and cross-library discovery can never disagree about what counts
181
+ * as a near-miss.
182
+ */
183
+ function oneEditFamilyVariant(a, b) {
184
+ if (a.length < MIN_EDIT_MATCH_LEN || b.length < MIN_EDIT_MATCH_LEN)
185
+ return false;
186
+ if (editDistanceWithin(a, b, 1) > 1)
187
+ return false;
188
+ if (a.length === b.length) {
189
+ for (let i = 0; i < a.length; i++) {
190
+ if (a[i] !== b[i]) {
191
+ return !(/[0-9]/.test(a[i]) && /[0-9]/.test(b[i]));
192
+ }
193
+ }
194
+ }
195
+ return true;
196
+ }
197
+ /** `closestSymbolNames` with the match rank retained, so a caller merging
198
+ * candidates from several libraries can order them by how well they match
199
+ * rather than by which library happened to be scanned first. */
200
+ export function rankSymbolNames(names, query, cap = 8) {
201
+ const canon = canonSymName;
202
+ const q = canon(query);
203
+ if (q.length < 2)
204
+ return [];
205
+ const ranked = [];
206
+ const seen = new Set();
207
+ for (const name of names) {
208
+ if (seen.has(name) || /_\d+_\d+$/.test(name))
209
+ continue;
210
+ seen.add(name);
211
+ const c = canon(name);
212
+ let rank;
213
+ if (c === q)
214
+ rank = 0;
215
+ else if (c.startsWith(q))
216
+ rank = 1;
217
+ else if (c.includes(q))
218
+ rank = 2;
219
+ else if (c.length >= 3 && q.includes(c))
220
+ rank = 3;
221
+ // Without this tier, search declared family-variant stock symbols absent
222
+ // (STM32F103C8T6 vs the installed STM32F103C8Tx) while
223
+ // findSymbolAcrossLibraries found them, and the "machine-verified" dossier
224
+ // rendered a search miss as a false absence claim.
225
+ else if (oneEditFamilyVariant(q, c))
226
+ rank = 4;
227
+ else
228
+ continue;
229
+ ranked.push({ name, rank });
230
+ }
231
+ ranked.sort((a, b) => a.rank - b.rank || a.name.length - b.name.length || (a.name < b.name ? -1 : 1));
232
+ return ranked.slice(0, cap);
233
+ }
234
+ export function closestSymbolNames(names, query, cap = 8) {
235
+ return rankSymbolNames(names, query, cap).map((r) => r.name);
236
+ }
237
+ /** Every installed `<lib>.kicad_sym`, keyed by library nickname; the first
238
+ * search dir claims a nickname, matching `findLibraryFile`'s precedence. */
239
+ export async function listInstalledLibraries(dirs) {
240
+ const map = new Map();
241
+ for (const dir of dirs) {
242
+ let entries;
243
+ try {
244
+ entries = await readdir(dir);
245
+ }
246
+ catch {
247
+ continue;
248
+ }
249
+ for (const e of entries) {
250
+ if (!e.endsWith('.kicad_sym'))
251
+ continue;
252
+ const lib = e.slice(0, -'.kicad_sym'.length);
253
+ if (!map.has(lib))
254
+ map.set(lib, path.join(dir, e));
255
+ }
256
+ }
257
+ return map;
258
+ }
259
+ /** Levenshtein edit distance, capped: returns `cap + 1` once the true distance
260
+ * would exceed `cap`, so a caller doing a cheap "is this close enough" check
261
+ * never pays for the full O(n·m) table on two names that are obviously
262
+ * unrelated. */
263
+ function editDistanceWithin(a, b, cap) {
264
+ if (Math.abs(a.length - b.length) > cap)
265
+ return cap + 1;
266
+ let prev = Array.from({ length: b.length + 1 }, (_, j) => j);
267
+ for (let i = 1; i <= a.length; i++) {
268
+ const cur = [i];
269
+ let rowMin = i;
270
+ for (let j = 1; j <= b.length; j++) {
271
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
272
+ const v = Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + cost);
273
+ cur.push(v);
274
+ if (v < rowMin)
275
+ rowMin = v;
276
+ }
277
+ if (rowMin > cap)
278
+ return cap + 1; // whole row exceeded cap: no cell can recover
279
+ prev = cur;
280
+ }
281
+ return prev[b.length];
282
+ }
283
+ /**
284
+ * A part is unresolvable at its guessed `lib_id`, but the guess itself is often
285
+ * right about the *part*, just wrong about which stock file it lives in (a
286
+ * chip's library nickname is not derivable from its part number). Rather than
287
+ * fail outright, check every other discovered `.kicad_sym` for a symbol with
288
+ * this exact name; when none matches exactly, fall back to the same
289
+ * closest-candidate substring heuristic `resolveLibrarySymbol` already uses
290
+ * within one file, just applied across all of them.
291
+ *
292
+ * Returns matches sorted exact-first; the caller decides what "found" means
293
+ * (one exact hit resolves unambiguously, several means the agent must pick).
294
+ */
295
+ export async function findSymbolAcrossLibraries(name, dirs, excludeLib) {
296
+ const q = name.toLowerCase();
297
+ const exact = [];
298
+ const fuzzy = [];
299
+ for (const [lib, file] of await listInstalledLibraries(dirs)) {
300
+ // `excludeLib` is only known not to hold this *exact* name; it can still
301
+ // hold the near-miss the caller actually wants (SHT40 guessed in
302
+ // Sensor_Humidity, where the real symbol is SHT4x). Skip its exact check,
303
+ // never its fuzzy one.
304
+ const skipExact = lib === excludeLib;
305
+ const names = await libSymbolNames(file);
306
+ if (!names)
307
+ continue;
308
+ if (!skipExact && names.includes(name)) {
309
+ exact.push({ lib, name, exact: true });
310
+ continue;
311
+ }
312
+ // The "does the query contain the library name" direction is only
313
+ // meaningful for a reasonably specific name (>= 3 chars): a stock library
314
+ // is full of single-letter generics ("R", "C", "L", "D", "U", "Q"), and
315
+ // "does <any part number> contain the letter R" is true for nearly
316
+ // everything, which would fuzzy-match almost any query against them.
317
+ const MIN_SHORT_NAME_LEN = 3;
318
+ // Substring alone misses the most common real near-miss: a datasheet part
319
+ // number against a library's family name, differing mid-string rather than
320
+ // at either end (SHT40 vs SHT4x). Neither contains the other; the shared
321
+ // one-edit family-variant rule catches it while refusing digit-for-digit
322
+ // swaps (TPS22860 vs TPS22810 are different real parts).
323
+ // The matched candidate string, not just whether one exists: a fuzzy hit
324
+ // must report the real symbol name (`n`) so the caller can build a lib_id
325
+ // that actually resolves. Suggesting `${lib}:${query}` back would name a
326
+ // part that was never found in that library — the exact regression this
327
+ // fuzzy path exists to avoid repeating.
328
+ const fuzzyHit = names.find((n) => {
329
+ const lower = n.toLowerCase();
330
+ if (lower.includes(q))
331
+ return true;
332
+ if (lower.length >= MIN_SHORT_NAME_LEN && q.includes(lower))
333
+ return true;
334
+ return oneEditFamilyVariant(q, lower);
335
+ });
336
+ if (fuzzyHit) {
337
+ fuzzy.push({ lib, name: fuzzyHit, exact: false });
338
+ }
339
+ }
340
+ return [...exact, ...fuzzy];
341
+ }
342
+ /**
343
+ * Search every installed library for symbols matching a part name, returning
344
+ * ranked `Lib:Name` lib_ids with exact (separator-insensitive) matches first.
345
+ * This is the discovery primitive a bare lib_id probe cannot provide: a wrong
346
+ * library-nickname guess is otherwise indistinguishable from a missing part,
347
+ * and KiCad's nicknames rarely follow from the part number (TPS61165DBV lives
348
+ * in Driver_LED, AudioJack3 in Connector_Audio, INA226 in Sensor_Energy).
349
+ */
350
+ export async function searchInstalledSymbols(query, dirs, cap = 24) {
351
+ if (canonSymName(query).length < 2)
352
+ return [];
353
+ // Rank globally, not per library: a library scanned early contributes only
354
+ // weak matches, and capping in scan order would drop a later library's
355
+ // stronger candidate — the exact case this tool exists to surface, since a
356
+ // caller reaching for it has already guessed the nickname wrong.
357
+ const hits = [];
358
+ for (const [lib, file] of await listInstalledLibraries(dirs)) {
359
+ const names = await libSymbolNames(file);
360
+ if (!names)
361
+ continue;
362
+ for (const { name, rank } of rankSymbolNames(names, query, 4)) {
363
+ hits.push({ libId: `${lib}:${name}`, rank, name });
364
+ }
365
+ }
366
+ hits.sort((a, b) => a.rank - b.rank ||
367
+ a.name.length - b.name.length ||
368
+ (a.libId < b.libId ? -1 : a.libId > b.libId ? 1 : 0));
369
+ return hits.slice(0, cap).map((h) => h.libId);
370
+ }
77
371
  /** Collect pins (number, name, electrical type) from a `(symbol …)` node,
78
372
  * including its nested unit sub-symbols. Same walk `libPinDefs` uses, plus the
79
373
  * electrical-type atom that pin-position parsing does not need. */
@@ -98,6 +392,19 @@ export function pinsOfSymbolNode(sym) {
98
392
  walk(sym);
99
393
  return pins;
100
394
  }
395
+ /** Highest unit index among a symbol's `Name_<unit>_<style>` children: 1 for a
396
+ * single-unit part. Unit 0 holds common graphics, so it never raises the count.
397
+ * The drafting engine refuses symbols with units >= 2 (they share symbol-space
398
+ * pin coordinates), which makes this the drawability half of availability. */
399
+ function maxUnitIndex(sym) {
400
+ let max = 1;
401
+ for (const c of children(sym, 'symbol')) {
402
+ const m = atomAt(c, 1)?.match(/_(\d+)_\d+$/);
403
+ if (m)
404
+ max = Math.max(max, Number(m[1]));
405
+ }
406
+ return max;
407
+ }
101
408
  /** The top-level `(symbol "name" …)` entries of a parsed `.kicad_sym` root. */
102
409
  function librarySymbols(root) {
103
410
  const map = new Map();
@@ -117,8 +424,12 @@ function librarySymbols(root) {
117
424
  export async function resolveLibrarySymbol(libId, dirs) {
118
425
  const [lib, name] = libId.includes(':') ? [libId.slice(0, libId.indexOf(':')), libId.slice(libId.indexOf(':') + 1)] : ['', libId];
119
426
  const file = await findLibraryFile(lib, dirs);
120
- if (!file)
427
+ if (!file) {
428
+ const elsewhere = await findSymbolAcrossLibraries(name, dirs, lib);
429
+ if (elsewhere.length)
430
+ return { status: 'found-elsewhere', libIds: elsewhere.map((m) => `${m.lib}:${m.name}`) };
121
431
  return { status: 'no-library' };
432
+ }
122
433
  const root = parseSexp(await readFile(file, 'utf8'))[0];
123
434
  if (root === undefined || !isList(root))
124
435
  return { status: 'no-library' };
@@ -132,21 +443,23 @@ export async function resolveLibrarySymbol(libId, dirs) {
132
443
  break;
133
444
  const pins = pinsOfSymbolNode(sym);
134
445
  if (pins.length)
135
- return { status: 'ok', pins };
446
+ return { status: 'ok', pins, units: maxUnitIndex(sym) };
136
447
  // no pins of its own → follow an `extends` base if present
137
448
  const base = atomAt(child(sym, 'extends'), 1);
138
449
  if (!base)
139
- return { status: 'ok', pins }; // genuinely pinless (e.g. a graphic)
450
+ return { status: 'ok', pins, units: maxUnitIndex(sym) }; // genuinely pinless (e.g. a graphic)
140
451
  current = base;
141
452
  }
142
- // exact name not found: offer near matches (case-insensitive substring both ways)
143
- const q = name.toLowerCase();
144
- const candidates = [...symbols.keys()]
145
- .filter((k) => {
146
- const lk = k.toLowerCase();
147
- return lk.includes(q) || q.includes(lk);
148
- })
149
- .slice(0, 8);
453
+ // The guessed library exists and simply lacks this name, so its own ranked
454
+ // near-matches are the most useful answer and come first: the caller named
455
+ // the right file and mistyped the part. Only when that file offers nothing
456
+ // is a different library worth suggesting (mirrors SymbolSource.resolve).
457
+ const candidates = closestSymbolNames(symbols.keys(), name);
458
+ if (candidates.length)
459
+ return { status: 'no-symbol', candidates };
460
+ const elsewhere = await findSymbolAcrossLibraries(name, dirs, lib);
461
+ if (elsewhere.length)
462
+ return { status: 'found-elsewhere', libIds: elsewhere.map((m) => `${m.lib}:${m.name}`) };
150
463
  return { status: 'no-symbol', candidates };
151
464
  }
152
465
  /** A schematic lib_symbols entry: its lib_id and the pins as authored. */
@@ -197,6 +510,23 @@ export async function verifySchematicSymbols(schPath, env = process.env) {
197
510
  });
198
511
  continue;
199
512
  }
513
+ if (resolved.status === 'found-elsewhere') {
514
+ // A distinct kind from 'no-library': the part IS verifiable, just filed
515
+ // under another name — callers counting real issues must include it,
516
+ // while 'no-library' stays "could not check". When every suggestion
517
+ // shares the queried nickname the library was right and only the symbol
518
+ // name is a variant; saying "wrong library" there contradicts the fix.
519
+ const nick = entry.libId.includes(':') ? entry.libId.slice(0, entry.libId.indexOf(':')) : '';
520
+ const sameLib = nick !== '' && resolved.libIds.every((id) => id.startsWith(`${nick}:`));
521
+ findings.push({
522
+ libId: entry.libId,
523
+ kind: 'wrong-library',
524
+ detail: sameLib
525
+ ? `"${entry.libId}" does not exist in that library — closest real name: ${resolved.libIds.join(' or ')}. The library was right; use the real symbol name.`
526
+ : `"${entry.libId}" names the wrong library, not the wrong part: use ${resolved.libIds.join(' or ')} instead.`,
527
+ });
528
+ continue;
529
+ }
200
530
  checked++;
201
531
  const real = resolved.pins;
202
532
  const authored = entry.pins;
@@ -1 +1 @@
1
- {"version":3,"file":"symlib.js","sourceRoot":"","sources":["../../src/kicad/symlib.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"symlib.js","sourceRoot":"","sources":["../../src/kicad/symlib.ts"],"names":[],"mappings":"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"}