@tobisk/pcbs 1.0.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 (168) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +186 -0
  3. package/dist/src/cli/cli.d.ts +6 -0
  4. package/dist/src/cli/cli.js +87 -0
  5. package/dist/src/cli/cli.js.map +1 -0
  6. package/dist/src/cli/codegen.d.ts +25 -0
  7. package/dist/src/cli/codegen.js +170 -0
  8. package/dist/src/cli/codegen.js.map +1 -0
  9. package/dist/src/cli/commands/export.d.ts +13 -0
  10. package/dist/src/cli/commands/export.js +301 -0
  11. package/dist/src/cli/commands/export.js.map +1 -0
  12. package/dist/src/cli/commands/lib.d.ts +10 -0
  13. package/dist/src/cli/commands/lib.js +158 -0
  14. package/dist/src/cli/commands/lib.js.map +1 -0
  15. package/dist/src/cli/commands/parts.d.ts +4 -0
  16. package/dist/src/cli/commands/parts.js +104 -0
  17. package/dist/src/cli/commands/parts.js.map +1 -0
  18. package/dist/src/cli/commands/setup.d.ts +4 -0
  19. package/dist/src/cli/commands/setup.js +86 -0
  20. package/dist/src/cli/commands/setup.js.map +1 -0
  21. package/dist/src/cli/commands/synth.d.ts +4 -0
  22. package/dist/src/cli/commands/synth.js +75 -0
  23. package/dist/src/cli/commands/synth.js.map +1 -0
  24. package/dist/src/cli/commands/types.d.ts +1 -0
  25. package/dist/src/cli/commands/types.js +140 -0
  26. package/dist/src/cli/commands/types.js.map +1 -0
  27. package/dist/src/cli/commands/validate.d.ts +5 -0
  28. package/dist/src/cli/commands/validate.js +105 -0
  29. package/dist/src/cli/commands/validate.js.map +1 -0
  30. package/dist/src/cli/config.d.ts +9 -0
  31. package/dist/src/cli/config.js +80 -0
  32. package/dist/src/cli/config.js.map +1 -0
  33. package/dist/src/cli/env.d.ts +4 -0
  34. package/dist/src/cli/env.js +166 -0
  35. package/dist/src/cli/env.js.map +1 -0
  36. package/dist/src/cli/search-jlc.d.ts +0 -0
  37. package/dist/src/cli/search-jlc.js +23 -0
  38. package/dist/src/cli/search-jlc.js.map +1 -0
  39. package/dist/src/cli/synthesis.d.ts +11 -0
  40. package/dist/src/cli/synthesis.js +120 -0
  41. package/dist/src/cli/synthesis.js.map +1 -0
  42. package/dist/src/cli/utils/bom.d.ts +19 -0
  43. package/dist/src/cli/utils/bom.js +130 -0
  44. package/dist/src/cli/utils/bom.js.map +1 -0
  45. package/dist/src/cli/utils/cpl.d.ts +18 -0
  46. package/dist/src/cli/utils/cpl.js +101 -0
  47. package/dist/src/cli/utils/cpl.js.map +1 -0
  48. package/dist/src/cli/utils.d.ts +11 -0
  49. package/dist/src/cli/utils.js +136 -0
  50. package/dist/src/cli/utils.js.map +1 -0
  51. package/dist/src/generate-kicad-types.d.ts +1 -0
  52. package/dist/src/generate-kicad-types.js +137 -0
  53. package/dist/src/generate-kicad-types.js.map +1 -0
  54. package/dist/src/synth/3d/Kicad3DModel.d.ts +81 -0
  55. package/dist/src/synth/3d/Kicad3DModel.js +250 -0
  56. package/dist/src/synth/3d/Kicad3DModel.js.map +1 -0
  57. package/dist/src/synth/3d/booleans.d.ts +10 -0
  58. package/dist/src/synth/3d/booleans.js +30 -0
  59. package/dist/src/synth/3d/booleans.js.map +1 -0
  60. package/dist/src/synth/3d/fillet.d.ts +14 -0
  61. package/dist/src/synth/3d/fillet.js +47 -0
  62. package/dist/src/synth/3d/fillet.js.map +1 -0
  63. package/dist/src/synth/3d/index.d.ts +7 -0
  64. package/dist/src/synth/3d/index.js +14 -0
  65. package/dist/src/synth/3d/index.js.map +1 -0
  66. package/dist/src/synth/3d/occ-loader.d.ts +5 -0
  67. package/dist/src/synth/3d/occ-loader.js +77 -0
  68. package/dist/src/synth/3d/occ-loader.js.map +1 -0
  69. package/dist/src/synth/3d/occ.d.ts +3 -0
  70. package/dist/src/synth/3d/occ.js +31 -0
  71. package/dist/src/synth/3d/occ.js.map +1 -0
  72. package/dist/src/synth/3d/primitives.d.ts +38 -0
  73. package/dist/src/synth/3d/primitives.js +58 -0
  74. package/dist/src/synth/3d/primitives.js.map +1 -0
  75. package/dist/src/synth/3d/stepWriter.d.ts +7 -0
  76. package/dist/src/synth/3d/stepWriter.js +72 -0
  77. package/dist/src/synth/3d/stepWriter.js.map +1 -0
  78. package/dist/src/synth/3d/transforms.d.ts +18 -0
  79. package/dist/src/synth/3d/transforms.js +74 -0
  80. package/dist/src/synth/3d/transforms.js.map +1 -0
  81. package/dist/src/synth/3d/types.d.ts +54 -0
  82. package/dist/src/synth/3d/types.js +21 -0
  83. package/dist/src/synth/3d/types.js.map +1 -0
  84. package/dist/src/synth/3d/vrmlWriter.d.ts +5 -0
  85. package/dist/src/synth/3d/vrmlWriter.js +171 -0
  86. package/dist/src/synth/3d/vrmlWriter.js.map +1 -0
  87. package/dist/src/synth/Component.d.ts +67 -0
  88. package/dist/src/synth/Component.js +185 -0
  89. package/dist/src/synth/Component.js.map +1 -0
  90. package/dist/src/synth/Composable.d.ts +73 -0
  91. package/dist/src/synth/Composable.js +128 -0
  92. package/dist/src/synth/Composable.js.map +1 -0
  93. package/dist/src/synth/KicadFootprint.d.ts +97 -0
  94. package/dist/src/synth/KicadFootprint.js +312 -0
  95. package/dist/src/synth/KicadFootprint.js.map +1 -0
  96. package/dist/src/synth/KicadLibrary.d.ts +66 -0
  97. package/dist/src/synth/KicadLibrary.js +162 -0
  98. package/dist/src/synth/KicadLibrary.js.map +1 -0
  99. package/dist/src/synth/KicadSymbol.d.ts +71 -0
  100. package/dist/src/synth/KicadSymbol.js +190 -0
  101. package/dist/src/synth/KicadSymbol.js.map +1 -0
  102. package/dist/src/synth/Layout.d.ts +37 -0
  103. package/dist/src/synth/Layout.js +58 -0
  104. package/dist/src/synth/Layout.js.map +1 -0
  105. package/dist/src/synth/Markers.d.ts +35 -0
  106. package/dist/src/synth/Markers.js +48 -0
  107. package/dist/src/synth/Markers.js.map +1 -0
  108. package/dist/src/synth/Module.d.ts +56 -0
  109. package/dist/src/synth/Module.js +65 -0
  110. package/dist/src/synth/Module.js.map +1 -0
  111. package/dist/src/synth/Net.d.ts +23 -0
  112. package/dist/src/synth/Net.js +95 -0
  113. package/dist/src/synth/Net.js.map +1 -0
  114. package/dist/src/synth/Registry.d.ts +36 -0
  115. package/dist/src/synth/Registry.js +75 -0
  116. package/dist/src/synth/Registry.js.map +1 -0
  117. package/dist/src/synth/Schematic.d.ts +36 -0
  118. package/dist/src/synth/Schematic.js +51 -0
  119. package/dist/src/synth/Schematic.js.map +1 -0
  120. package/dist/src/synth/index.d.ts +21 -0
  121. package/dist/src/synth/index.js +46 -0
  122. package/dist/src/synth/index.js.map +1 -0
  123. package/dist/src/synth/kicad-types-placeholder.d.ts +6 -0
  124. package/dist/src/synth/kicad-types-placeholder.js +7 -0
  125. package/dist/src/synth/kicad-types-placeholder.js.map +1 -0
  126. package/dist/src/synth/types.d.ts +111 -0
  127. package/dist/src/synth/types.js +23 -0
  128. package/dist/src/synth/types.js.map +1 -0
  129. package/dist/src/tests/3d-model.test.d.ts +1 -0
  130. package/dist/src/tests/3d-model.test.js +282 -0
  131. package/dist/src/tests/3d-model.test.js.map +1 -0
  132. package/dist/src/tests/codegen.test.d.ts +1 -0
  133. package/dist/src/tests/codegen.test.js +80 -0
  134. package/dist/src/tests/codegen.test.js.map +1 -0
  135. package/dist/src/tests/dmx_node.test.d.ts +1 -0
  136. package/dist/src/tests/dmx_node.test.js +42 -0
  137. package/dist/src/tests/dmx_node.test.js.map +1 -0
  138. package/dist/src/tests/dnc.test.d.ts +1 -0
  139. package/dist/src/tests/dnc.test.js +100 -0
  140. package/dist/src/tests/dnc.test.js.map +1 -0
  141. package/dist/src/tests/kicad-lib.test.d.ts +1 -0
  142. package/dist/src/tests/kicad-lib.test.js +465 -0
  143. package/dist/src/tests/kicad-lib.test.js.map +1 -0
  144. package/dist/src/tests/layout.test.d.ts +1 -0
  145. package/dist/src/tests/layout.test.js +92 -0
  146. package/dist/src/tests/layout.test.js.map +1 -0
  147. package/dist/src/tests/migration.test.d.ts +1 -0
  148. package/dist/src/tests/migration.test.js +58 -0
  149. package/dist/src/tests/migration.test.js.map +1 -0
  150. package/dist/src/tests/net_merging.test.d.ts +1 -0
  151. package/dist/src/tests/net_merging.test.js +97 -0
  152. package/dist/src/tests/net_merging.test.js.map +1 -0
  153. package/dist/src/tests/occ-minimal.test.d.ts +1 -0
  154. package/dist/src/tests/occ-minimal.test.js +14 -0
  155. package/dist/src/tests/occ-minimal.test.js.map +1 -0
  156. package/dist/src/tests/placement.test.d.ts +1 -0
  157. package/dist/src/tests/placement.test.js +130 -0
  158. package/dist/src/tests/placement.test.js.map +1 -0
  159. package/dist/src/tests/synthesis.test.d.ts +1 -0
  160. package/dist/src/tests/synthesis.test.js +88 -0
  161. package/dist/src/tests/synthesis.test.js.map +1 -0
  162. package/dist/src/types/kicad-library.d.ts +6 -0
  163. package/dist/src/types/kicad-library.js +7 -0
  164. package/dist/src/types/kicad-library.js.map +1 -0
  165. package/dist/src/types/kicad-library.ts +61770 -0
  166. package/package.json +57 -0
  167. package/scripts/patch-opencascade.ts +18 -0
  168. package/scripts/wasm-stub.js +1 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.cmdSetup = cmdSetup;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const config_1 = require("../config");
40
+ /**
41
+ * Commands to automate configuration of the project's environment.
42
+ */
43
+ async function cmdSetup(args) {
44
+ console.log("🚀 Setting up project environment...\n");
45
+ const { projectRoot } = (0, config_1.getConfig)();
46
+ const tsconfigPath = path.join(projectRoot, "tsconfig.json");
47
+ if (!fs.existsSync(tsconfigPath)) {
48
+ console.warn("⚠️ Could not find tsconfig.json in project root. Skipping path mapping setup.");
49
+ return;
50
+ }
51
+ try {
52
+ const tsconfigRaw = fs.readFileSync(tsconfigPath, "utf-8");
53
+ const tsconfig = JSON.parse(tsconfigRaw);
54
+ // Don't update tsconfig if we are in the framework repo itself
55
+ const packageJsonPath = path.join(projectRoot, "package.json");
56
+ if (fs.existsSync(packageJsonPath)) {
57
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
58
+ if (pkg.name === "@tobisk/pcbs") {
59
+ console.log(" ℹ️ Framework repository detected. Skipping tsconfig.json path mapping setup.");
60
+ return;
61
+ }
62
+ }
63
+ if (!tsconfig.compilerOptions) {
64
+ tsconfig.compilerOptions = {};
65
+ }
66
+ if (!tsconfig.compilerOptions.paths) {
67
+ tsconfig.compilerOptions.paths = {};
68
+ }
69
+ const virtualPath = "@tobisk/pcbs/kicad-types";
70
+ const localPath = ["./src/kicad-library.ts"];
71
+ // Check if mapping already exists and is correct
72
+ const currentMapping = tsconfig.compilerOptions.paths[virtualPath];
73
+ if (JSON.stringify(currentMapping) === JSON.stringify(localPath)) {
74
+ console.log(" ✅ tsconfig.json path mapping is already correct.");
75
+ }
76
+ else {
77
+ tsconfig.compilerOptions.paths[virtualPath] = localPath;
78
+ fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2), "utf-8");
79
+ console.log(` ✅ Added path mapping to tsconfig.json: ${virtualPath} → ${localPath}`);
80
+ }
81
+ }
82
+ catch (err) {
83
+ console.warn(` ⚠️ Failed to update tsconfig.json: ${err.message}`);
84
+ }
85
+ }
86
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4BAiDC;AAxDD,uCAAyB;AACzB,2CAA6B;AAC7B,sCAAsC;AAEtC;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,IAAc;IACzC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,kBAAS,GAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAE7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;QAC/F,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEzC,+DAA+D;QAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;gBAC/F,OAAO;YACX,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YAC5B,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAClC,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,0BAA0B,CAAC;QAC/C,MAAM,SAAS,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAE7C,iDAAiD;QACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;YACxD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,4CAA4C,WAAW,MAAM,SAAS,EAAE,CAAC,CAAC;QAC1F,CAAC;IAEL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * synth: Compile TypeScript schematic → circuit-synth Python → run synthesis
3
+ */
4
+ export declare function cmdSynth(args: string[]): Promise<void>;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.cmdSynth = cmdSynth;
37
+ const path = __importStar(require("path"));
38
+ const utils_1 = require("../utils");
39
+ /**
40
+ * synth: Compile TypeScript schematic → circuit-synth Python → run synthesis
41
+ */
42
+ async function cmdSynth(args) {
43
+ const entry = args[0];
44
+ const schematicPath = await (0, utils_1.resolveSchematic)(entry);
45
+ const schematicDir = path.dirname(schematicPath);
46
+ const schematicName = path.basename(schematicDir);
47
+ console.log(`\n🚀 Synthesizing: ${schematicName}\n`);
48
+ // Step 1: Load the TypeScript schematic
49
+ try {
50
+ const mod = require(schematicPath);
51
+ const schematic = mod.default;
52
+ if (!schematic || typeof schematic.generate !== "function") {
53
+ (0, utils_1.die)(`${schematicPath} must have a default export that is a Schematic instance with a generate() method.`);
54
+ }
55
+ console.log(` → Generating circuit: ${schematic.name}...`);
56
+ schematic.generate();
57
+ console.log(` ✅ Circuit generation complete.`);
58
+ console.log(` → Compiling to circuit-synth Python & executing...`);
59
+ const { generatePython } = require("../codegen");
60
+ const { runSynthesis } = require("../synthesis");
61
+ const snapshot = schematic._generateWithCapture();
62
+ const result = runSynthesis(snapshot, schematicDir);
63
+ if (result.success) {
64
+ console.log(` ✅ Synthesis successful!`);
65
+ console.log(` 📂 Output: ${schematicDir}`);
66
+ }
67
+ else {
68
+ (0, utils_1.die)(`Synthesis failed:\n\n${result.output}`);
69
+ }
70
+ }
71
+ catch (err) {
72
+ (0, utils_1.die)(`Synthesis failed: ${err.message}`);
73
+ }
74
+ }
75
+ //# sourceMappingURL=synth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth.js","sourceRoot":"","sources":["../../../../src/cli/commands/synth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,4BAsCC;AA5CD,2CAA6B;AAC7B,kDAA+D;AAE/D;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAgB,EAAC,KAAK,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,uBAAuB,aAAa,IAAI,CAAC,CAAC;IAEtD,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;QAE9B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC3D,IAAA,WAAG,EAAC,GAAG,aAAa,oFAAoF,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC;QAC5D,SAAS,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC/D,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG,SAAS,CAAC,oBAAoB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEpD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,IAAA,WAAG,EAAC,wBAAwB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;IAEH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAA,WAAG,EAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function cmdTypes(args: string[]): Promise<void>;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.cmdTypes = cmdTypes;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const config_1 = require("../config");
40
+ /**
41
+ * Script to generate TypeScript types for KiCad symbols and footprints.
42
+ * Scans standard KiCad library paths on macOS and project-local libraries.
43
+ */
44
+ const KICAD_PATH = "/Applications/KiCad/KiCad.app/Contents/SharedSupport";
45
+ const SYMBOLS_DIR = path.join(KICAD_PATH, "symbols");
46
+ const FOOTPRINTS_DIR = path.join(KICAD_PATH, "footprints");
47
+ function parseSymbolsInFile(filePath, libName) {
48
+ if (!fs.existsSync(filePath))
49
+ return [];
50
+ const content = fs.readFileSync(filePath, "utf-8");
51
+ const names = [];
52
+ // Quick regex to find all (symbol "NAME" ...) top-level patterns
53
+ const matches = content.matchAll(/\(symbol\s+"([^"]+)"/g);
54
+ for (const match of matches) {
55
+ const symName = match[1];
56
+ // Skip if it contains a colon already (might be an alias or complex name)
57
+ if (!symName.includes(":")) {
58
+ names.push(`${libName}:${symName}`);
59
+ }
60
+ else {
61
+ names.push(symName);
62
+ }
63
+ }
64
+ return names;
65
+ }
66
+ function getSymbolNames(projectLibDir) {
67
+ const names = [];
68
+ // System libraries
69
+ if (fs.existsSync(SYMBOLS_DIR)) {
70
+ const symbolFiles = fs.readdirSync(SYMBOLS_DIR).filter(f => f.endsWith(".kicad_sym"));
71
+ for (const file of symbolFiles) {
72
+ const libName = path.basename(file, ".kicad_sym");
73
+ names.push(...parseSymbolsInFile(path.join(SYMBOLS_DIR, file), libName));
74
+ }
75
+ }
76
+ // Project library
77
+ const projectSymLib = path.join(projectLibDir, "Project_Symbols.kicad_sym");
78
+ if (fs.existsSync(projectSymLib)) {
79
+ names.push(...parseSymbolsInFile(projectSymLib, "Project_Symbols"));
80
+ }
81
+ // Built-in markers
82
+ names.push("Device:DNC");
83
+ names.push("Connector:TestPoint");
84
+ return [...new Set(names)].sort();
85
+ }
86
+ function getFootprintNames(projectLibDir) {
87
+ const names = [];
88
+ // System libraries
89
+ if (fs.existsSync(FOOTPRINTS_DIR)) {
90
+ const prettyDirs = fs.readdirSync(FOOTPRINTS_DIR).filter(d => d.endsWith(".pretty"));
91
+ for (const dir of prettyDirs) {
92
+ const libName = path.basename(dir, ".pretty");
93
+ const modFiles = fs.readdirSync(path.join(FOOTPRINTS_DIR, dir)).filter(f => f.endsWith(".kicad_mod"));
94
+ for (const file of modFiles) {
95
+ const fpName = path.basename(file, ".kicad_mod");
96
+ names.push(`${libName}:${fpName}`);
97
+ }
98
+ }
99
+ }
100
+ // Project library
101
+ const projectFpLib = path.join(projectLibDir, "Project_Footprints.pretty");
102
+ if (fs.existsSync(projectFpLib)) {
103
+ const modFiles = fs.readdirSync(projectFpLib).filter(f => f.endsWith(".kicad_mod"));
104
+ for (const file of modFiles) {
105
+ const fpName = path.basename(file, ".kicad_mod");
106
+ names.push(`Project_Footprints:${fpName}`);
107
+ }
108
+ }
109
+ // Built-in markers
110
+ names.push("DNC");
111
+ names.push("TestPoint:TestPoint_Pad_D2.5mm");
112
+ return [...new Set(names)].sort();
113
+ }
114
+ async function cmdTypes(args) {
115
+ console.log("🚀 Syncing KiCad library types...\n");
116
+ const { projectRoot } = (0, config_1.getConfig)();
117
+ const projectLibDir = path.join(projectRoot, ".kicad");
118
+ // Output file should be in the user's project src folder
119
+ const outputFile = path.join(projectRoot, "src/kicad-library.ts");
120
+ if (!fs.existsSync(path.dirname(outputFile))) {
121
+ fs.mkdirSync(path.dirname(outputFile), { recursive: true });
122
+ }
123
+ const symbols = getSymbolNames(projectLibDir);
124
+ const footprints = getFootprintNames(projectLibDir);
125
+ const content = `/**
126
+ * AUTO-GENERATED FILE - DO NOT EDIT
127
+ * Generated by pcb types
128
+ */
129
+
130
+ export type KicadLibrarySymbol =
131
+ ${symbols.map(s => ` | "${s}"`).join("\n")};
132
+
133
+ export type KicadLibraryFootprint =
134
+ ${footprints.map(f => ` | "${f}"`).join("\n")};
135
+ `;
136
+ fs.writeFileSync(outputFile, content, "utf-8");
137
+ console.log(` ✅ Generated ${symbols.length} symbols and ${footprints.length} footprints.`);
138
+ console.log(` 📂 Output: ${outputFile}`);
139
+ }
140
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cli/commands/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * validate: Verify that the generated KiCad libraries are valid and parsable.
3
+ * Uses kicad-cli to attempt an export to SVG (hidden).
4
+ */
5
+ export declare function cmdValidate(args: string[]): Promise<void>;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.cmdValidate = cmdValidate;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ const child_process_1 = require("child_process");
40
+ const config_1 = require("../config");
41
+ const utils_1 = require("../utils");
42
+ /**
43
+ * validate: Verify that the generated KiCad libraries are valid and parsable.
44
+ * Uses kicad-cli to attempt an export to SVG (hidden).
45
+ */
46
+ async function cmdValidate(args) {
47
+ console.log(`\n🔍 Validating KiCad Libraries...`);
48
+ const { projectRoot, kicadCliPath } = (0, config_1.getConfig)();
49
+ const LIB_DIR = path.join(projectRoot, ".kicad");
50
+ const SYMBOLS_FILE = path.join(LIB_DIR, "Project_Symbols.kicad_sym");
51
+ const FOOTPRINTS_DIR = path.join(LIB_DIR, "Project_Footprints.pretty");
52
+ if (!fs.existsSync(kicadCliPath)) {
53
+ (0, utils_1.die)(`kicad-cli not found at ${kicadCliPath}. Please ensure KiCad is installed.`);
54
+ }
55
+ const tmpDir = path.join(projectRoot, "tmp", "validation");
56
+ if (!fs.existsSync(tmpDir)) {
57
+ fs.mkdirSync(tmpDir, { recursive: true });
58
+ }
59
+ let hasErrors = false;
60
+ // 1. Validate Symbols
61
+ if (fs.existsSync(SYMBOLS_FILE)) {
62
+ console.log(` → Validating Symbols: ${path.relative(projectRoot, SYMBOLS_FILE)}`);
63
+ try {
64
+ // We use 'sym export svg' as a parser check
65
+ (0, child_process_1.execSync)(`"${kicadCliPath}" sym export svg "${SYMBOLS_FILE}" --output "${tmpDir}"`, { stdio: "pipe" });
66
+ console.log(` ✅ Symbols are valid.`);
67
+ }
68
+ catch (err) {
69
+ console.error(` ❌ Symbol Validation Failed:\n${err.stderr.toString()}`);
70
+ hasErrors = true;
71
+ }
72
+ }
73
+ else {
74
+ console.log(` ⚠️ Symbols file not found, skipping.`);
75
+ }
76
+ // 2. Validate Footprints
77
+ if (fs.existsSync(FOOTPRINTS_DIR)) {
78
+ console.log(` → Validating Footprints: ${path.relative(projectRoot, FOOTPRINTS_DIR)}/`);
79
+ try {
80
+ // We use 'fp export svg' as a parser check
81
+ (0, child_process_1.execSync)(`"${kicadCliPath}" fp export svg "${FOOTPRINTS_DIR}" --output "${tmpDir}"`, { stdio: "pipe" });
82
+ console.log(` ✅ Footprints are valid.`);
83
+ }
84
+ catch (err) {
85
+ console.error(` ❌ Footprint Validation Failed:\n${err.stderr.toString()}`);
86
+ hasErrors = true;
87
+ }
88
+ }
89
+ else {
90
+ console.log(` ⚠️ Footprints directory not found, skipping.`);
91
+ }
92
+ // Cleanup
93
+ try {
94
+ fs.rmSync(tmpDir, { recursive: true, force: true });
95
+ }
96
+ catch (err) { }
97
+ if (hasErrors) {
98
+ console.log(`\n❌ Library validation failed.\n`);
99
+ process.exit(1);
100
+ }
101
+ else {
102
+ console.log(`\n✨ Library validation successful!\n`);
103
+ }
104
+ }
105
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface Config {
2
+ projectRoot: string;
3
+ sourceRoot: string;
4
+ schematicsDir: string;
5
+ scriptsDir: string;
6
+ pythonPath: string;
7
+ kicadCliPath: string;
8
+ }
9
+ export declare function getConfig(): Config;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getConfig = getConfig;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ let configCache = null;
40
+ function getConfig() {
41
+ if (configCache)
42
+ return configCache;
43
+ const cwd = process.env.INIT_CWD || process.cwd();
44
+ let sourceRoot = cwd;
45
+ // 1. Env var
46
+ if (process.env.SCHEMATICS_ROOT) {
47
+ sourceRoot = path.resolve(cwd, process.env.SCHEMATICS_ROOT);
48
+ }
49
+ // 2. Default: check if src exists in cwd
50
+ else if (fs.existsSync(path.join(cwd, "src"))) {
51
+ sourceRoot = path.join(cwd, "src");
52
+ }
53
+ // 3. Fallback: cwd is sourceRoot
54
+ // Determine project root (if sourceRoot ends with src, projectRoot is parent)
55
+ let projectRoot = sourceRoot;
56
+ if (path.basename(sourceRoot) === "src") {
57
+ projectRoot = path.dirname(sourceRoot);
58
+ }
59
+ // Schematics dir: look for "schematics" in sourceRoot
60
+ const schematicsDir = path.join(sourceRoot, "schematics");
61
+ // Scripts dir: stored in the library package
62
+ const scriptsDir = path.resolve(__dirname, "../../scripts");
63
+ // Python path: look in projectRoot/.venv
64
+ let pythonPath = path.join(projectRoot, ".venv", "bin", "python");
65
+ if (!fs.existsSync(pythonPath)) {
66
+ // If not found, try system python
67
+ pythonPath = "python3";
68
+ }
69
+ const kicadCliPath = "/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli";
70
+ configCache = {
71
+ projectRoot,
72
+ sourceRoot,
73
+ schematicsDir,
74
+ scriptsDir,
75
+ pythonPath,
76
+ kicadCliPath,
77
+ };
78
+ return configCache;
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,8BA+CC;AA7DD,2CAA6B;AAC7B,uCAAyB;AAWzB,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,SAAgB,SAAS;IACrB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,IAAI,UAAU,GAAG,GAAG,CAAC;IAErB,aAAa;IACb,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAC9B,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;IACD,yCAAyC;SACpC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QAC5C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,iCAAiC;IAEjC,8EAA8E;IAC9E,IAAI,WAAW,GAAG,UAAU,CAAC;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;QACtC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,sDAAsD;IACtD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAE1D,6CAA6C;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE5D,yCAAyC;IACzC,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,kCAAkC;QAClC,UAAU,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED,MAAM,YAAY,GAAG,wDAAwD,CAAC;IAE9E,WAAW,GAAG;QACV,WAAW;QACX,UAAU;QACV,aAAa;QACb,UAAU;QACV,UAAU;QACV,YAAY;KACf,CAAC;IAEF,OAAO,WAAW,CAAC;AACvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Ensures the Python virtual environment exists and required packages are installed.
3
+ */
4
+ export declare function ensurePythonEnv(): void;