copperhead 0.5.0 → 0.6.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 +34 -1
- package/dist/agent/loop.js +13 -0
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/providers/claude-code.js +286 -0
- package/dist/agent/providers/claude-code.js.map +1 -0
- package/dist/agent/providers/openai.js +30 -10
- package/dist/agent/providers/openai.js.map +1 -1
- package/dist/cli.js +47 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.js +16 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/export.js +90 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/config.js +14 -6
- package/dist/config.js.map +1 -1
- package/dist/kicad/bom-export.js +240 -0
- package/dist/kicad/bom-export.js.map +1 -0
- package/dist/kicad/fab.js +94 -0
- package/dist/kicad/fab.js.map +1 -0
- package/dist/memory/bom-table.js +61 -0
- package/dist/memory/bom-table.js.map +1 -0
- package/dist/memory/drift.js +1 -17
- package/dist/memory/drift.js.map +1 -1
- package/package.json +6 -2
- package/src/agent/loop.ts +13 -0
- package/src/agent/providers/claude-code.ts +367 -0
- package/src/agent/providers/openai.ts +33 -16
- package/src/agent/types.ts +1 -0
- package/src/cli.ts +52 -2
- package/src/commands/create.ts +15 -0
- package/src/commands/export.ts +117 -0
- package/src/config.ts +20 -6
- package/src/kicad/bom-export.ts +321 -0
- package/src/kicad/fab.ts +121 -0
- package/src/memory/bom-table.ts +78 -0
- package/src/memory/drift.ts +1 -22
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -8,6 +8,7 @@ import { checkDrift } from '../memory/drift.js';
|
|
|
8
8
|
import { runAgentLoop } from '../agent/loop.js';
|
|
9
9
|
import { openspecInit } from '../openspec/cli.js';
|
|
10
10
|
import { runCheck } from './check.js';
|
|
11
|
+
import { emitCreateJlcpcbBom } from './export.js';
|
|
11
12
|
const docExists = (repoRoot, rel) => existsSync(path.join(repoRoot, rel));
|
|
12
13
|
async function docHasContent(repoRoot, rel, marker) {
|
|
13
14
|
const p = path.join(repoRoot, rel);
|
|
@@ -88,6 +89,19 @@ export const STAGES = [
|
|
|
88
89
|
prompt: () => 'Stage 8: DEVPLAN.md. Write docs/DEVPLAN.md: bring-up steps in order, test points and what to meter first, risk list, and the prototype order plan.',
|
|
89
90
|
},
|
|
90
91
|
];
|
|
92
|
+
/**
|
|
93
|
+
* Stage 6 emits the JLCPCB assembly BOM deterministically alongside the agent's
|
|
94
|
+
* outputs package (create-pipeline delta). Called whenever the outputs stage is
|
|
95
|
+
* confirmed complete — on the pass that finishes it and on any later resume — so
|
|
96
|
+
* the file tracks the current BOM.md.
|
|
97
|
+
*/
|
|
98
|
+
async function emitJlcpcbAfterOutputs(stageName, opts) {
|
|
99
|
+
if (stageName !== 'outputs')
|
|
100
|
+
return;
|
|
101
|
+
const out = await emitCreateJlcpcbBom(opts.repoRoot);
|
|
102
|
+
if (out)
|
|
103
|
+
opts.log(`stage outputs: emitted ${out} (JLCPCB assembly BOM)`);
|
|
104
|
+
}
|
|
91
105
|
export async function runCreate(opts) {
|
|
92
106
|
const brief = await readFile(path.resolve(opts.briefPath), 'utf8');
|
|
93
107
|
// Hashed from the content already in hand: a brief edited mid-pipeline shows
|
|
@@ -100,6 +114,7 @@ export async function runCreate(opts) {
|
|
|
100
114
|
if (await stage.isComplete(opts.repoRoot, config.docs)) {
|
|
101
115
|
opts.log(`stage ${stage.name}: already complete (resuming past it)`);
|
|
102
116
|
completed.push(stage.name);
|
|
117
|
+
await emitJlcpcbAfterOutputs(stage.name, opts);
|
|
103
118
|
continue;
|
|
104
119
|
}
|
|
105
120
|
opts.log(`stage ${stage.name}: running`);
|
|
@@ -137,6 +152,7 @@ export async function runCreate(opts) {
|
|
|
137
152
|
return { ok: false, completed };
|
|
138
153
|
}
|
|
139
154
|
completed.push(stage.name);
|
|
155
|
+
await emitJlcpcbAfterOutputs(stage.name, opts);
|
|
140
156
|
}
|
|
141
157
|
const check = await runCheck(opts.repoRoot, opts.log);
|
|
142
158
|
opts.log(check.ok ? 'create pipeline complete; all checks green' : 'create pipeline complete with check failures');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAA6B,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
4
|
+
import { loadConfig } from '../config.js';
|
|
5
|
+
import { checkDrift } from '../memory/drift.js';
|
|
6
|
+
import { buildExport, parseBom, SUPPLIERS, isSupplier } from '../kicad/bom-export.js';
|
|
7
|
+
/**
|
|
8
|
+
* `copperhead export bom` (capability supplier-bom-export): deterministic,
|
|
9
|
+
* LLM-free, network-free — safe anywhere `check` is safe. This module must never
|
|
10
|
+
* import a provider.
|
|
11
|
+
*/
|
|
12
|
+
export class ExportError extends Error {
|
|
13
|
+
}
|
|
14
|
+
const OUT_DIR = 'outputs';
|
|
15
|
+
export function outFileFor(supplier) {
|
|
16
|
+
return path.join(OUT_DIR, `${supplier}-bom.csv`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read BOM.md, refuse on drift, and write the supplier CSV to
|
|
20
|
+
* outputs/<supplier>-bom.csv. Throws ExportError with an actionable message for
|
|
21
|
+
* the caller to print and exit non-zero.
|
|
22
|
+
*/
|
|
23
|
+
export async function runExportBom(opts) {
|
|
24
|
+
const config = await loadConfig(opts.repoRoot);
|
|
25
|
+
const bomPath = path.join(opts.repoRoot, config.docs, 'BOM.md');
|
|
26
|
+
if (!existsSync(bomPath)) {
|
|
27
|
+
throw new ExportError(`no ${path.join(config.docs, 'BOM.md')} to export — run copperhead init on an existing project, or copperhead create`);
|
|
28
|
+
}
|
|
29
|
+
// BOM.md is the sole input, but it must agree with the schematic before it can
|
|
30
|
+
// be trusted as an ordering source (requirement "BOM.md is the sole input").
|
|
31
|
+
// Refuse loudly here rather than let a drifted BOM become a wrong order.
|
|
32
|
+
if (config.schematic && existsSync(path.join(opts.repoRoot, config.schematic))) {
|
|
33
|
+
const drift = await checkDrift(opts.repoRoot, config.docs, config.schematic);
|
|
34
|
+
if (drift.length) {
|
|
35
|
+
const lines = drift.map((m) => ` - ${m.doc} claims "${m.claim}" but actual is "${m.actual}"`).join('\n');
|
|
36
|
+
throw new ExportError(`BOM.md drifts from the schematic; run \`copperhead check\` and resolve drift before ordering:\n${lines}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const rows = parseBom(await readFile(bomPath, 'utf8'));
|
|
40
|
+
const result = buildExport(rows, opts.supplier, {
|
|
41
|
+
boards: opts.boards,
|
|
42
|
+
spares: opts.spares,
|
|
43
|
+
includeUnverified: opts.includeUnverified,
|
|
44
|
+
});
|
|
45
|
+
const outPath = outFileFor(opts.supplier);
|
|
46
|
+
await mkdir(path.join(opts.repoRoot, OUT_DIR), { recursive: true });
|
|
47
|
+
await writeFile(path.join(opts.repoRoot, outPath), result.csv, 'utf8');
|
|
48
|
+
return { ...result, supplier: opts.supplier, outPath };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Deterministically emit the JLCPCB assembly BOM alongside the create stage-6
|
|
52
|
+
* outputs (create-pipeline delta). No-op when there is no BOM.md yet; never
|
|
53
|
+
* throws on drift here — the pipeline's own gates own that.
|
|
54
|
+
*/
|
|
55
|
+
export async function emitCreateJlcpcbBom(repoRoot) {
|
|
56
|
+
const config = await loadConfig(repoRoot);
|
|
57
|
+
const bomPath = path.join(repoRoot, config.docs, 'BOM.md');
|
|
58
|
+
if (!existsSync(bomPath))
|
|
59
|
+
return null;
|
|
60
|
+
const rows = parseBom(await readFile(bomPath, 'utf8'));
|
|
61
|
+
const { csv } = buildExport(rows, 'jlcpcb', { boards: 1, spares: 10, includeUnverified: false });
|
|
62
|
+
const outPath = outFileFor('jlcpcb');
|
|
63
|
+
await mkdir(path.join(repoRoot, OUT_DIR), { recursive: true });
|
|
64
|
+
await writeFile(path.join(repoRoot, outPath), csv, 'utf8');
|
|
65
|
+
return outPath;
|
|
66
|
+
}
|
|
67
|
+
/** Validate `--supplier`; throws ExportError listing the supported values. */
|
|
68
|
+
export function parseSupplier(value) {
|
|
69
|
+
if (!isSupplier(value)) {
|
|
70
|
+
throw new ExportError(`unknown supplier "${value}"; supported: ${SUPPLIERS.join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
/** Validate `--boards`: a positive integer. */
|
|
75
|
+
export function parseBoards(value) {
|
|
76
|
+
const n = Number(value);
|
|
77
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
78
|
+
throw new ExportError(`--boards must be a positive integer, got "${value}"`);
|
|
79
|
+
}
|
|
80
|
+
return n;
|
|
81
|
+
}
|
|
82
|
+
/** Validate `--spares`: a non-negative percentage. */
|
|
83
|
+
export function parseSpares(value) {
|
|
84
|
+
const n = Number(value);
|
|
85
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
86
|
+
throw new ExportError(`--spares must be a non-negative number, got "${value}"`);
|
|
87
|
+
}
|
|
88
|
+
return n;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -31,6 +31,7 @@ export async function loadConfig(repoRoot) {
|
|
|
31
31
|
maxRepairCycles: raw.maxRepairCycles ?? DEFAULTS.maxRepairCycles,
|
|
32
32
|
budgets: raw.budgets ?? {},
|
|
33
33
|
...(raw.generatedHashes ? { generatedHashes: raw.generatedHashes } : {}),
|
|
34
|
+
...(raw.origin === 'create' || raw.origin === 'init' ? { origin: raw.origin } : {}),
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
@@ -41,8 +42,12 @@ export async function loadConfig(repoRoot) {
|
|
|
41
42
|
* Accepted values (same set for `--model`, COPPERHEAD_MODEL, and `model` in
|
|
42
43
|
* .copperhead/config.json):
|
|
43
44
|
*
|
|
44
|
-
* - `claude`
|
|
45
|
-
*
|
|
45
|
+
* - `claude-code` : the Claude Code saved-login provider on its default
|
|
46
|
+
* model. Needs NO API key — it reuses the logged-in Claude
|
|
47
|
+
* Code CLI / CLAUDE_CODE_OAUTH_TOKEN via the Agent SDK.
|
|
48
|
+
* - `claude-code:<id>`: the same provider on a specific model id.
|
|
49
|
+
* - `claude` : the Anthropic API provider on its default model.
|
|
50
|
+
* - `claude-*`: any Anthropic API model id, passed through verbatim, e.g.
|
|
46
51
|
* `claude-opus-4-5`. Anything starting with `claude` routes here.
|
|
47
52
|
* - `codex` : the locally installed Codex CLI using its saved ChatGPT login.
|
|
48
53
|
* - `codex:*` : Codex CLI with an explicit model id, e.g. `codex:gpt-5.6`.
|
|
@@ -51,10 +56,13 @@ export async function loadConfig(repoRoot) {
|
|
|
51
56
|
* `gpt-5-mini` or `o3`.
|
|
52
57
|
*
|
|
53
58
|
* Routing is prefix-based, not a fixed list (see makeProvider in agent/loop.ts),
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
59
|
+
* matched top to bottom: `claude-code`/`claude-code:<id>` is checked BEFORE the
|
|
60
|
+
* `claude*` prefix, so it is never captured by the Anthropic API route. A model
|
|
61
|
+
* released after this build still works without a code change. The cost is that
|
|
62
|
+
* a typo like `claud-sonnet-5` silently routes to OpenAI and fails there.
|
|
63
|
+
* Anthropic and direct OpenAI providers require their API keys; `codex` requires
|
|
64
|
+
* 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.
|
|
58
66
|
*/
|
|
59
67
|
export function resolveModel(flag, config, env = process.env) {
|
|
60
68
|
if (flag)
|
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,240 @@
|
|
|
1
|
+
import { parseMarkdownTables } from '../memory/bom-table.js';
|
|
2
|
+
export const SUPPLIERS = ['jlcpcb', 'digikey', 'mouser'];
|
|
3
|
+
/** CLI defaults for the quantity flags, shared so the "ignored for jlcpcb"
|
|
4
|
+
* note fires only when the user actually set a non-default value. */
|
|
5
|
+
export const DEFAULT_BOARDS = 1;
|
|
6
|
+
export const DEFAULT_SPARES = 10;
|
|
7
|
+
export function isSupplier(s) {
|
|
8
|
+
return SUPPLIERS.includes(s);
|
|
9
|
+
}
|
|
10
|
+
// Header aliases → canonical field. Matched after normalizing a header cell to
|
|
11
|
+
// lowercase alphanumerics, so "LCSC Part #" and "lcsc_part" both hit `lcsc`.
|
|
12
|
+
const HEADER_ALIASES = {
|
|
13
|
+
refdes: 'refdes',
|
|
14
|
+
ref: 'refdes',
|
|
15
|
+
designator: 'refdes',
|
|
16
|
+
reference: 'refdes',
|
|
17
|
+
value: 'value',
|
|
18
|
+
comment: 'value',
|
|
19
|
+
val: 'value',
|
|
20
|
+
footprint: 'footprint',
|
|
21
|
+
package: 'footprint',
|
|
22
|
+
mpn: 'mpn',
|
|
23
|
+
manufacturerpartnumber: 'mpn',
|
|
24
|
+
mfrpartnumber: 'mpn',
|
|
25
|
+
mfrpart: 'mpn',
|
|
26
|
+
partnumber: 'mpn',
|
|
27
|
+
manufacturer: 'manufacturer',
|
|
28
|
+
mfr: 'manufacturer',
|
|
29
|
+
lcsc: 'lcsc',
|
|
30
|
+
lcscpart: 'lcsc',
|
|
31
|
+
lcscpartnumber: 'lcsc',
|
|
32
|
+
};
|
|
33
|
+
const norm = (s) => s.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
34
|
+
// MPN cells that mean "no orderable part number yet". `UNVERIFIED` is the
|
|
35
|
+
// init/scaffold placeholder (src/memory/scaffold.ts writes it into the MPN
|
|
36
|
+
// column for every extracted symbol); the rest are common human shorthand.
|
|
37
|
+
const MPN_PLACEHOLDERS = new Set(['', 'unverified', 'tbd', 'todo', 'tbc', 'na', 'none', '-', '—', '?']);
|
|
38
|
+
const isMpnPlaceholder = (mpn) => MPN_PLACEHOLDERS.has(mpn.trim().toLowerCase());
|
|
39
|
+
const UNVERIFIED_RE = /\bUNVERIFIED\b/i;
|
|
40
|
+
/**
|
|
41
|
+
* Parse BOM.md into rows by column header, tolerating extra/reordered columns.
|
|
42
|
+
* Only the header row and data rows of the first parts table are used; a table
|
|
43
|
+
* without a recognizable Refdes header yields no rows.
|
|
44
|
+
*
|
|
45
|
+
* NOTE: the drift gate this exporter runs behind (checkDrift in
|
|
46
|
+
* ../memory/drift.ts) reads Refdes|Value|Footprint *by position*, not by header.
|
|
47
|
+
* So while this parser tolerates reordering those base columns, reordering them
|
|
48
|
+
* makes checkDrift compare the wrong cells and the export refuses with a bogus
|
|
49
|
+
* drift message. Keep the base three columns first and in order; only append.
|
|
50
|
+
*/
|
|
51
|
+
export function parseBom(md) {
|
|
52
|
+
const tableRows = parseMarkdownTables(md);
|
|
53
|
+
const headerIdx = tableRows.findIndex((r) => r.cells.some((c) => HEADER_ALIASES[norm(c)] === 'refdes'));
|
|
54
|
+
const header = headerIdx === -1 ? undefined : tableRows[headerIdx];
|
|
55
|
+
if (!header)
|
|
56
|
+
return [];
|
|
57
|
+
const col = {};
|
|
58
|
+
header.cells.forEach((c, i) => {
|
|
59
|
+
const field = HEADER_ALIASES[norm(c)];
|
|
60
|
+
// First occurrence wins, so a stray later column never shadows the real one.
|
|
61
|
+
if (field && col[field] === undefined)
|
|
62
|
+
col[field] = i;
|
|
63
|
+
});
|
|
64
|
+
const at = (row, field) => {
|
|
65
|
+
const i = col[field];
|
|
66
|
+
return i === undefined ? '' : (row.cells[i] ?? '').trim();
|
|
67
|
+
};
|
|
68
|
+
const rows = [];
|
|
69
|
+
for (const row of tableRows.slice(headerIdx + 1)) {
|
|
70
|
+
const refdes = at(row, 'refdes');
|
|
71
|
+
if (!refdes)
|
|
72
|
+
continue; // blank line / stray row
|
|
73
|
+
const mpn = at(row, 'mpn');
|
|
74
|
+
rows.push({
|
|
75
|
+
refdes,
|
|
76
|
+
value: at(row, 'value'),
|
|
77
|
+
footprint: at(row, 'footprint'),
|
|
78
|
+
mpn,
|
|
79
|
+
manufacturer: at(row, 'manufacturer'),
|
|
80
|
+
lcsc: at(row, 'lcsc'),
|
|
81
|
+
unverified: row.cells.some((c) => UNVERIFIED_RE.test(c)),
|
|
82
|
+
hasMpn: !isMpnPlaceholder(mpn),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return rows;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Passive footprint classifier (design D4): the library item after the `:` in a
|
|
89
|
+
* KiCad footprint id starts with `R_`, `C_`, or `L_` for the passive classes
|
|
90
|
+
* that lose parts to handling. Bare footprint names (no library) are matched
|
|
91
|
+
* too, so `R_0603` and `Resistor_SMD:R_0603_1608Metric` both classify.
|
|
92
|
+
*/
|
|
93
|
+
export function isPassiveFootprint(footprint) {
|
|
94
|
+
const item = footprint.includes(':') ? footprint.slice(footprint.lastIndexOf(':') + 1) : footprint;
|
|
95
|
+
return /^[RCL]_/.test(item.trim());
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Order quantity for one BOM line (requirement "Quantity arithmetic"):
|
|
99
|
+
* `ceil(perBoardCount × boards × (1 + spares/100))`, raised to
|
|
100
|
+
* `perBoardCount × boards + 2` for passive lines when the percentage yields
|
|
101
|
+
* less — losing two 0402s to tweezers is the norm and percentage-only spares
|
|
102
|
+
* under-order low-count passive lines (design D4).
|
|
103
|
+
*/
|
|
104
|
+
export function orderQuantity(perBoardCount, boards, sparesPercent, isPassive) {
|
|
105
|
+
const base = perBoardCount * boards;
|
|
106
|
+
// `base * (100 + spares) / 100` keeps the multiply in whole units before the
|
|
107
|
+
// divide, and the epsilon absorbs IEEE-754 dust so an exact result like 110
|
|
108
|
+
// does not ceil to 111 (100 × 1.1 is 110.00000000000001 in float). The dust is
|
|
109
|
+
// ~1e-13; 1e-9 is far below any real fractional quantity, so genuine fractions
|
|
110
|
+
// (44.5 → 45) are unaffected.
|
|
111
|
+
const withSpares = Math.ceil((base * (100 + sparesPercent)) / 100 - 1e-9);
|
|
112
|
+
return isPassive ? Math.max(withSpares, base + 2) : withSpares;
|
|
113
|
+
}
|
|
114
|
+
/** Natural refdes ordering: R2 before R10, and R* before U*. */
|
|
115
|
+
function naturalCompare(a, b) {
|
|
116
|
+
const pa = a.match(/^([A-Za-z]*)(\d*)/);
|
|
117
|
+
const pb = b.match(/^([A-Za-z]*)(\d*)/);
|
|
118
|
+
const alpha = (pa?.[1] ?? '').localeCompare(pb?.[1] ?? '');
|
|
119
|
+
if (alpha !== 0)
|
|
120
|
+
return alpha;
|
|
121
|
+
const na = pa?.[2] ? parseInt(pa[2], 10) : 0;
|
|
122
|
+
const nb = pb?.[2] ? parseInt(pb[2], 10) : 0;
|
|
123
|
+
if (na !== nb)
|
|
124
|
+
return na - nb;
|
|
125
|
+
return a.localeCompare(b);
|
|
126
|
+
}
|
|
127
|
+
/** RFC-4180 field quoting: quote when the field holds a comma, quote, or newline. */
|
|
128
|
+
function csvField(value) {
|
|
129
|
+
return /[",\n\r]/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
|
|
130
|
+
}
|
|
131
|
+
const csvRow = (fields) => fields.map(csvField).join(',');
|
|
132
|
+
/**
|
|
133
|
+
* Split rows into included/excluded by the ordering rules (requirement
|
|
134
|
+
* "Unorderable rows are excluded and reported"): MPN-less rows are always
|
|
135
|
+
* excluded; UNVERIFIED rows are excluded unless `includeUnverified`, and even
|
|
136
|
+
* then only when they carry a real MPN.
|
|
137
|
+
*/
|
|
138
|
+
function partition(rows, includeUnverified) {
|
|
139
|
+
const included = [];
|
|
140
|
+
const excluded = [];
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
if (!row.hasMpn) {
|
|
143
|
+
excluded.push({ row, reason: 'no MPN' });
|
|
144
|
+
}
|
|
145
|
+
else if (row.unverified && !includeUnverified) {
|
|
146
|
+
excluded.push({ row, reason: 'UNVERIFIED' });
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
included.push(row);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { included, excluded };
|
|
153
|
+
}
|
|
154
|
+
function groupBy(rows, key) {
|
|
155
|
+
const map = new Map();
|
|
156
|
+
for (const r of rows) {
|
|
157
|
+
const k = key(r);
|
|
158
|
+
const arr = map.get(k);
|
|
159
|
+
if (arr)
|
|
160
|
+
arr.push(r);
|
|
161
|
+
else
|
|
162
|
+
map.set(k, [r]);
|
|
163
|
+
}
|
|
164
|
+
const lines = [];
|
|
165
|
+
for (const groupRows of map.values()) {
|
|
166
|
+
const sorted = [...groupRows].sort((a, b) => naturalCompare(a.refdes, b.refdes));
|
|
167
|
+
// Groups are never empty (a key exists because a row produced it).
|
|
168
|
+
lines.push({ rows: sorted, head: sorted[0], designators: sorted.map((r) => r.refdes) });
|
|
169
|
+
}
|
|
170
|
+
// Deterministic line order: by the first designator of each line.
|
|
171
|
+
return lines.sort((a, b) => naturalCompare(a.designators[0], b.designators[0]));
|
|
172
|
+
}
|
|
173
|
+
function buildWarnings(supplier, included, excluded, opts) {
|
|
174
|
+
const { includeUnverified } = opts;
|
|
175
|
+
const warnings = [];
|
|
176
|
+
for (const { row, reason } of excluded) {
|
|
177
|
+
const hint = reason === 'no MPN'
|
|
178
|
+
? 'add an MPN in BOM.md — unorderable without one'
|
|
179
|
+
: 'verify against the datasheet or re-run with --include-unverified';
|
|
180
|
+
warnings.push(`EXCLUDED (${reason}): ${row.refdes} (${row.value || 'no value'}) — ${hint}`);
|
|
181
|
+
}
|
|
182
|
+
if (includeUnverified) {
|
|
183
|
+
for (const row of included) {
|
|
184
|
+
if (row.unverified) {
|
|
185
|
+
warnings.push(`INCLUDED but UNVERIFIED (--include-unverified): ${row.refdes} (${row.mpn}) — confirm before ordering`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (supplier === 'jlcpcb') {
|
|
190
|
+
// The JLCPCB assembly format has no quantity column — quantity is set from
|
|
191
|
+
// the board count entered at upload — so --boards/--spares never reach this
|
|
192
|
+
// file. Say so when the user supplied a non-default value, or they may order
|
|
193
|
+
// the wrong count expecting the flags to have taken effect.
|
|
194
|
+
if (opts.boards !== DEFAULT_BOARDS || opts.spares !== DEFAULT_SPARES) {
|
|
195
|
+
warnings.push('NOTE: --boards/--spares are ignored for jlcpcb — quantity is set from the board count you enter at JLCPCB upload');
|
|
196
|
+
}
|
|
197
|
+
const blank = included.filter((r) => !r.lcsc).map((r) => r.refdes);
|
|
198
|
+
if (blank.length) {
|
|
199
|
+
warnings.push(`NOTE: no LCSC part # for ${blank.join(', ')} — JLCPCB accepts the upload but needs manual matching for these`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return warnings;
|
|
203
|
+
}
|
|
204
|
+
function emitJlcpcb(lines) {
|
|
205
|
+
// JLCPCB assembly-service BOM: one line per Comment+Footprint+LCSC, designators
|
|
206
|
+
// grouped. Quantity is derived by JLCPCB from the designator count × the board
|
|
207
|
+
// count entered at upload, so there is no quantity column here (design/proposal).
|
|
208
|
+
const header = 'Comment,Designator,Footprint,LCSC Part #';
|
|
209
|
+
const body = lines.map((l) => csvRow([l.head.value, l.designators.join(','), l.head.footprint, l.head.lcsc]));
|
|
210
|
+
return [header, ...body].join('\n') + '\n';
|
|
211
|
+
}
|
|
212
|
+
function emitCart(lines, opts, mpnHeader) {
|
|
213
|
+
// DigiKey / Mouser cart upload: one line per MPN with a computed order
|
|
214
|
+
// quantity and the designators as the customer reference.
|
|
215
|
+
const header = `${mpnHeader},Manufacturer,Quantity,Customer Reference`;
|
|
216
|
+
const body = lines.map((l) => {
|
|
217
|
+
const qty = orderQuantity(l.designators.length, opts.boards, opts.spares, isPassiveFootprint(l.head.footprint));
|
|
218
|
+
return csvRow([l.head.mpn, l.head.manufacturer, String(qty), l.designators.join(',')]);
|
|
219
|
+
});
|
|
220
|
+
return [header, ...body].join('\n') + '\n';
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Build the supplier CSV plus its warnings from parsed BOM rows. Pure: no I/O,
|
|
224
|
+
* so the emitters are golden-file testable in isolation (design D5).
|
|
225
|
+
*/
|
|
226
|
+
export function buildExport(rows, supplier, opts) {
|
|
227
|
+
const { included, excluded } = partition(rows, opts.includeUnverified);
|
|
228
|
+
const lines = supplier === 'jlcpcb'
|
|
229
|
+
? groupBy(included, (r) => `${r.value}${r.footprint}${r.lcsc}`)
|
|
230
|
+
: groupBy(included, (r) => r.mpn);
|
|
231
|
+
let csv;
|
|
232
|
+
if (supplier === 'jlcpcb')
|
|
233
|
+
csv = emitJlcpcb(lines);
|
|
234
|
+
else if (supplier === 'digikey')
|
|
235
|
+
csv = emitCart(lines, opts, 'Manufacturer Part Number');
|
|
236
|
+
else
|
|
237
|
+
csv = emitCart(lines, opts, 'Mfr. Part Number');
|
|
238
|
+
return { csv, included, excluded, warnings: buildWarnings(supplier, included, excluded, opts) };
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=bom-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bom-export.js","sourceRoot":"","sources":["../../src/kicad/bom-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fab release gate checks (OpenSpec: add-fab-release-gate).
|
|
3
|
+
* Documentation presence is pure over file contents: LLM-free, network-free.
|
|
4
|
+
*/
|
|
5
|
+
export const DRAFT_QUALITY_HEADING = '## Draft quality';
|
|
6
|
+
/** Config marker: repos produced by `copperhead create` set `origin` to `"create"`. */
|
|
7
|
+
export const CREATE_ORIGIN = 'create';
|
|
8
|
+
/**
|
|
9
|
+
* True when `.copperhead/config.json` marks the repo as create-produced.
|
|
10
|
+
* Accepts the raw parsed object (or a loaded config that retained `origin`).
|
|
11
|
+
*/
|
|
12
|
+
export function isCreateProducedRepo(config) {
|
|
13
|
+
if (config === null || typeof config !== 'object')
|
|
14
|
+
return false;
|
|
15
|
+
return config.origin === CREATE_ORIGIN;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Body of `## Draft quality` through the next `##` heading, or `null` if the
|
|
19
|
+
* heading is absent. HTML comments and whitespace alone do not count as filled
|
|
20
|
+
* (init scaffolds the empty heading + a placeholder comment).
|
|
21
|
+
*/
|
|
22
|
+
export function draftQualitySection(layoutMd) {
|
|
23
|
+
const lines = layoutMd.split(/\r?\n/);
|
|
24
|
+
let start = -1;
|
|
25
|
+
for (let i = 0; i < lines.length; i++) {
|
|
26
|
+
if (lines[i].trim() === DRAFT_QUALITY_HEADING) {
|
|
27
|
+
start = i + 1;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (start < 0)
|
|
32
|
+
return null;
|
|
33
|
+
const body = [];
|
|
34
|
+
for (let i = start; i < lines.length; i++) {
|
|
35
|
+
const line = lines[i];
|
|
36
|
+
if (/^##\s/.test(line.trim()))
|
|
37
|
+
break;
|
|
38
|
+
body.push(line);
|
|
39
|
+
}
|
|
40
|
+
return body.join('\n');
|
|
41
|
+
}
|
|
42
|
+
export function isFilledDraftQuality(sectionBody) {
|
|
43
|
+
const withoutComments = sectionBody.replace(/<!--[\s\S]*?-->/g, '');
|
|
44
|
+
return withoutComments.trim().length > 0;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Documentation-presence check for `check --fab` (task 1.5):
|
|
48
|
+
* - LAYOUT.md must have a filled `## Draft quality` section
|
|
49
|
+
* - create-produced repos must also have DEVPLAN.md
|
|
50
|
+
*
|
|
51
|
+
* Failures use the drift-report voice: file as location, claim `"release-ready"`.
|
|
52
|
+
*/
|
|
53
|
+
export function checkDocumentationPresence(input) {
|
|
54
|
+
const docs = (input.docsDir ?? 'docs').replace(/[/\\]+$/, '');
|
|
55
|
+
const violations = [];
|
|
56
|
+
const layoutLoc = `${docs}/LAYOUT.md`;
|
|
57
|
+
const claim = 'release-ready';
|
|
58
|
+
if (input.layoutMd === null) {
|
|
59
|
+
violations.push({
|
|
60
|
+
claim,
|
|
61
|
+
actual: 'LAYOUT.md missing',
|
|
62
|
+
location: layoutLoc,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const section = draftQualitySection(input.layoutMd);
|
|
67
|
+
if (section === null) {
|
|
68
|
+
violations.push({
|
|
69
|
+
claim,
|
|
70
|
+
actual: `missing ${DRAFT_QUALITY_HEADING} section`,
|
|
71
|
+
location: layoutLoc,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (!isFilledDraftQuality(section)) {
|
|
75
|
+
violations.push({
|
|
76
|
+
claim,
|
|
77
|
+
actual: `${DRAFT_QUALITY_HEADING} section is empty`,
|
|
78
|
+
location: layoutLoc,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (input.isCreateRepo && !input.devplanExists) {
|
|
83
|
+
violations.push({
|
|
84
|
+
claim,
|
|
85
|
+
actual: 'missing',
|
|
86
|
+
location: `${docs}/DEVPLAN.md`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
status: violations.length === 0 ? 'pass' : 'fail',
|
|
91
|
+
violations,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=fab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fab.js","sourceRoot":"","sources":["../../src/kicad/fab.ts"],"names":[],"mappings":"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"}
|