@typecad/cuttlefish 1.0.0-alpha.14 → 1.0.0-alpha.16

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 (315) hide show
  1. package/README.md +82 -79
  2. package/assets/editor-extensions/typecad-debug/README.md +25 -26
  3. package/dist/api/config.d.ts +22 -26
  4. package/dist/api/schema/types.d.ts +20 -3
  5. package/dist/api/shared/async-runtime-static.d.ts +1 -1
  6. package/dist/api/shared/async-runtime-static.js +5 -5
  7. package/dist/api/shared/async-types.d.ts +3 -2
  8. package/dist/api/shared/board-catalog.d.ts +2 -0
  9. package/dist/api/shared/board-catalog.js +6 -0
  10. package/dist/api/shared/board-resolver.d.ts +4 -7
  11. package/dist/api/shared/board-resolver.js +2 -1
  12. package/dist/api/shared/coop-scheduler.d.ts +1 -1
  13. package/dist/api/shared/coop-scheduler.js +1 -1
  14. package/dist/api/shared/cpp-type-ir.d.ts +1 -1
  15. package/dist/api/shared/cpp-type-ir.js +1 -1
  16. package/dist/api/shared/display-profile.d.ts +1 -1
  17. package/dist/api/shared/display-profile.js +3 -5
  18. package/dist/api/shared/framework-manifest-registry.d.ts +1 -1
  19. package/dist/api/shared/framework-manifest-registry.js +0 -1
  20. package/dist/api/shared/framework-manifest.d.ts +7 -6
  21. package/dist/api/shared/framework-manifest.js +6 -11
  22. package/dist/api/shared/hal-op-ir.d.ts +294 -685
  23. package/dist/api/shared/hal-op-ir.js +31 -65
  24. package/dist/api/shared/index.d.ts +0 -4
  25. package/dist/api/shared/index.js +1 -7
  26. package/dist/api/shared/ir-core.d.ts +6 -0
  27. package/dist/api/shared/ir-declarations.d.ts +4 -0
  28. package/dist/api/shared/ir.d.ts +1 -3
  29. package/dist/api/shared/platform-strategy.d.ts +14 -37
  30. package/dist/api/shared/polyfill-helper-registry.js +0 -5
  31. package/dist/api/shared/polyfill-types.js +0 -27
  32. package/dist/api/shared/promise-runtime.js +3 -3
  33. package/dist/api/shared/spdx-licenses.d.ts +12 -10
  34. package/dist/api/shared/spdx-licenses.js +1 -1
  35. package/dist/api/shared/toolchain-types.d.ts +1 -1
  36. package/dist/api/shared/toolchain-types.js +3 -3
  37. package/dist/api/shared/types.d.ts +0 -3
  38. package/dist/api/shared/validate-framework-manifest.js +13 -33
  39. package/dist/board-catalog/dts-reader.d.ts +220 -0
  40. package/dist/board-catalog/dts-reader.js +1052 -0
  41. package/dist/board-catalog/index.d.ts +11 -0
  42. package/dist/board-catalog/index.js +12 -0
  43. package/dist/board-catalog/pinconfig.d.ts +48 -0
  44. package/dist/board-catalog/pinconfig.js +263 -0
  45. package/dist/board-catalog/sdk.d.ts +82 -0
  46. package/dist/board-catalog/sdk.js +180 -0
  47. package/dist/board-catalog/store.d.ts +196 -0
  48. package/dist/board-catalog/store.js +363 -0
  49. package/dist/board-catalog/types.d.ts +233 -0
  50. package/dist/board-catalog/types.js +7 -0
  51. package/dist/board-catalog/walker.d.ts +112 -0
  52. package/dist/board-catalog/walker.js +1101 -0
  53. package/dist/cli-utils.d.ts +2 -2
  54. package/dist/cli-utils.js +5 -5
  55. package/dist/cli.js +219 -242
  56. package/dist/config-loader.d.ts +14 -19
  57. package/dist/config-loader.js +240 -78
  58. package/dist/config-schema.d.ts +3 -5
  59. package/dist/config-schema.js +8 -8
  60. package/dist/contract/board-generator.d.ts +4 -4
  61. package/dist/contract/board-generator.js +16 -5
  62. package/dist/contract/contract-parser.d.ts +27 -0
  63. package/dist/contract/contract-parser.js +76 -0
  64. package/dist/contract/index.d.ts +1 -1
  65. package/dist/contract/index.js +70 -21
  66. package/dist/create/active-board-catalog.d.ts +9 -0
  67. package/dist/create/active-board-catalog.js +94 -0
  68. package/dist/create/board-catalog.generated.d.ts +96 -0
  69. package/dist/create/board-catalog.generated.js +128737 -0
  70. package/dist/create/board-search.d.ts +23 -0
  71. package/dist/create/board-search.js +88 -0
  72. package/dist/create/editor-integration.d.ts +4 -2
  73. package/dist/create/editor-integration.js +41 -2
  74. package/dist/create/framework-catalog.d.ts +57 -9
  75. package/dist/create/framework-catalog.js +76 -57
  76. package/dist/create/index.d.ts +5 -11
  77. package/dist/create/index.js +3 -8
  78. package/dist/create/mcu-target.d.ts +39 -0
  79. package/dist/create/mcu-target.js +80 -0
  80. package/dist/create/pack-targets.d.ts +19 -0
  81. package/dist/create/pack-targets.js +56 -0
  82. package/dist/create/scaffold.d.ts +4 -7
  83. package/dist/create/scaffold.js +19 -109
  84. package/dist/create/templates.d.ts +32 -5
  85. package/dist/create/templates.js +130 -116
  86. package/dist/create/wizard.d.ts +12 -1
  87. package/dist/create/wizard.js +168 -38
  88. package/dist/debug/preprocessor.d.ts +5 -0
  89. package/dist/debug/preprocessor.js +31 -7
  90. package/dist/diagnostics/diagnostics-report.d.ts +1 -1
  91. package/dist/diagnostics/diagnostics-report.js +3 -11
  92. package/dist/diagnostics/json-schema.d.ts +1 -1
  93. package/dist/diagnostics/md-writer.js +2 -2
  94. package/dist/diagnostics/mermaid-builder.d.ts +1 -1
  95. package/dist/diagnostics/mermaid-builder.js +1 -1
  96. package/dist/emit/cpp-emitter.js +4 -1
  97. package/dist/emit/emitters/class-emitter.js +32 -4
  98. package/dist/emit/emitters/emitter-context.d.ts +11 -0
  99. package/dist/emit/emitters/entrypoint-synthesizer.js +1 -1
  100. package/dist/emit/emitters/function-emitter-impl.js +33 -17
  101. package/dist/emit/emitters/output-finalizer.d.ts +7 -0
  102. package/dist/emit/emitters/output-finalizer.js +31 -23
  103. package/dist/emit/emitters/setup.js +125 -63
  104. package/dist/emit/emitters/top-level-prep.js +1 -1
  105. package/dist/emit/emitters/type-decl-emitter.js +13 -8
  106. package/dist/emit/emitters/ui-emitter.js +1 -1
  107. package/dist/emit/expression-renderer.d.ts +3 -3
  108. package/dist/emit/expression-renderer.js +17 -7
  109. package/dist/emit/route-hal-op.js +17 -48
  110. package/dist/emit/snprintf-helpers.d.ts +1 -3
  111. package/dist/emit/snprintf-helpers.js +1 -39
  112. package/dist/emit/statement-renderer.d.ts +0 -4
  113. package/dist/emit/statement-renderer.js +54 -45
  114. package/dist/emit/utils/async-state-machine.d.ts +16 -9
  115. package/dist/emit/utils/async-state-machine.js +56 -54
  116. package/dist/emit/utils/comment-helpers.d.ts +0 -8
  117. package/dist/emit/utils/comment-helpers.js +1 -1
  118. package/dist/emit/utils/cpp-helpers.d.ts +2 -2
  119. package/dist/emit/utils/cpp-helpers.js +2 -2
  120. package/dist/emit/utils/hal-op-cpp-type.js +4 -6
  121. package/dist/emit/utils/index.d.ts +3 -3
  122. package/dist/emit/utils/index.js +3 -3
  123. package/dist/emit/utils/type-inference.d.ts +1 -29
  124. package/dist/emit/utils/type-inference.js +0 -75
  125. package/dist/framework-package.d.ts +3 -0
  126. package/dist/framework-package.js +23 -6
  127. package/dist/framework-registry.d.ts +5 -5
  128. package/dist/frameworks/native/graphics/terminal-preview.d.ts +5 -0
  129. package/dist/frameworks/native/graphics/terminal-preview.js +33 -0
  130. package/dist/frameworks/native/index.d.ts +3 -0
  131. package/dist/frameworks/native/index.js +15 -0
  132. package/dist/frameworks/native/native-compile.d.ts +17 -0
  133. package/dist/frameworks/native/native-compile.js +170 -0
  134. package/dist/frameworks/native/native-config.d.ts +41 -0
  135. package/dist/frameworks/native/native-config.js +7 -0
  136. package/dist/frameworks/native/strategy.d.ts +97 -0
  137. package/dist/frameworks/native/strategy.js +664 -0
  138. package/dist/ir/board-resolver.d.ts +18 -23
  139. package/dist/ir/board-resolver.js +43 -401
  140. package/dist/ir/build-ir-state.d.ts +3 -0
  141. package/dist/ir/build-ir-state.js +42 -0
  142. package/dist/ir/build-ir.d.ts +1 -1
  143. package/dist/ir/build-ir.js +40 -42
  144. package/dist/ir/declaration-builders.js +1 -0
  145. package/dist/ir/expression-to-ir.js +17 -10
  146. package/dist/ir/hal/hal-emitter.d.ts +0 -2
  147. package/dist/ir/hal/hal-emitter.js +92 -41
  148. package/dist/ir/hal/hal-parser.d.ts +5 -5
  149. package/dist/ir/hal/hal-parser.js +128 -36
  150. package/dist/ir/hal/hal-plugins.d.ts +0 -1
  151. package/dist/ir/hal/hal-plugins.js +425 -716
  152. package/dist/ir/heap-analysis.js +2 -41
  153. package/dist/ir/identifier-collector.js +32 -20
  154. package/dist/ir/network-validation.js +7 -11
  155. package/dist/ir/ownership-analysis.js +75 -13
  156. package/dist/ir/peripheral-usage.d.ts +8 -2
  157. package/dist/ir/peripheral-usage.js +78 -149
  158. package/dist/ir/peripheral-validation.js +23 -3
  159. package/dist/ir/pin-capability-validation.d.ts +12 -0
  160. package/dist/ir/pin-capability-validation.js +61 -97
  161. package/dist/ir/pin-mode-validation.js +5 -5
  162. package/dist/ir/program-analysis.d.ts +8 -15
  163. package/dist/ir/program-analysis.js +140 -323
  164. package/dist/ir/pulldown-validation.js +11 -4
  165. package/dist/ir/resource-analysis.js +15 -3
  166. package/dist/ir/statement-to-ir.js +0 -6
  167. package/dist/ir/timing-validation.js +1 -1
  168. package/dist/ir/transformers/array-methods.js +11 -5
  169. package/dist/ir/transformers/call-statement.js +20 -87
  170. package/dist/ir/transformers/callback-context-registry.d.ts +1 -1
  171. package/dist/ir/transformers/callback-context-registry.js +8 -16
  172. package/dist/ir/transformers/control-flow.js +0 -13
  173. package/dist/ir/transformers/expressions.js +10 -9
  174. package/dist/ir/transformers/hal-call-resolver.d.ts +2 -2
  175. package/dist/ir/transformers/hal-call-resolver.js +24 -10
  176. package/dist/ir/transformers/hal-emit-helpers.d.ts +2 -2
  177. package/dist/ir/transformers/hal-emit-helpers.js +2 -2
  178. package/dist/ir/transformers/namespace-methods.js +1 -1
  179. package/dist/ir/transformers/ui-callback-lowering.d.ts +0 -2
  180. package/dist/ir/transformers/ui-callback-lowering.js +0 -24
  181. package/dist/ir/transformers/variables.js +338 -42
  182. package/dist/ir/try-catch-validation.js +4 -3
  183. package/dist/ir/type-resolution.js +15 -4
  184. package/dist/ir/validation-orchestrator.js +0 -9
  185. package/dist/libdef/cpp-to-decl.d.ts +0 -9
  186. package/dist/libdef/cpp-to-decl.js +0 -72
  187. package/dist/libdef/registry.d.ts +0 -1
  188. package/dist/libdef/registry.js +1 -24
  189. package/dist/library/init.d.ts +1 -1
  190. package/dist/library/init.js +137 -137
  191. package/dist/library-packages.d.ts +1 -1
  192. package/dist/library-packages.js +1 -1
  193. package/dist/mapping/peripheral-names.js +9 -4
  194. package/dist/mapping/source-map.d.ts +3 -4
  195. package/dist/mapping/source-map.js +12 -18
  196. package/dist/orchestrator/graph-builder.d.ts +3 -3
  197. package/dist/orchestrator/graph-builder.js +13 -12
  198. package/dist/orchestrator/type-checker.d.ts +3 -3
  199. package/dist/orchestrator/type-checker.js +3 -3
  200. package/dist/platform/async-runtime.js +1 -1
  201. package/dist/platform/coop-scheduler-runtime.js +2 -2
  202. package/dist/platform/generic-debug-codegen.d.ts +36 -0
  203. package/dist/platform/generic-debug-codegen.js +185 -0
  204. package/dist/platform/generic-strategy.d.ts +3 -4
  205. package/dist/platform/generic-strategy.js +5 -80
  206. package/dist/platform/index.js +1 -1
  207. package/dist/platform/registry.d.ts +2 -2
  208. package/dist/platform/registry.js +2 -2
  209. package/dist/safety/asil-decorators.d.ts +32 -0
  210. package/dist/safety/asil-decorators.js +32 -0
  211. package/dist/safety/authoring.d.ts +85 -0
  212. package/dist/safety/authoring.js +61 -0
  213. package/dist/safety/engine.d.ts +3 -0
  214. package/dist/safety/engine.js +83 -0
  215. package/dist/safety/hal/ops.d.ts +48 -0
  216. package/dist/safety/hal/ops.js +46 -0
  217. package/dist/safety/iso26262/analyze.d.ts +13 -0
  218. package/dist/safety/iso26262/analyze.js +29 -0
  219. package/dist/safety/iso26262/asil.d.ts +10 -0
  220. package/dist/safety/iso26262/asil.js +22 -0
  221. package/dist/safety/iso26262/collect.d.ts +14 -0
  222. package/dist/safety/iso26262/collect.js +137 -0
  223. package/dist/safety/iso26262/goto-checker.d.ts +10 -0
  224. package/dist/safety/iso26262/goto-checker.js +72 -0
  225. package/dist/safety/iso26262/heap-checker.d.ts +7 -0
  226. package/dist/safety/iso26262/heap-checker.js +57 -0
  227. package/dist/safety/iso26262/init-checker.d.ts +13 -0
  228. package/dist/safety/iso26262/init-checker.js +127 -0
  229. package/dist/safety/iso26262/loop-checker.d.ts +7 -0
  230. package/dist/safety/iso26262/loop-checker.js +86 -0
  231. package/dist/safety/iso26262/recursion-checker.d.ts +9 -0
  232. package/dist/safety/iso26262/recursion-checker.js +134 -0
  233. package/dist/safety/iso26262/sidecar-writer.d.ts +25 -0
  234. package/dist/safety/iso26262/sidecar-writer.js +13 -0
  235. package/dist/safety/passes/pinMode-intercept.d.ts +3 -0
  236. package/dist/safety/passes/pinMode-intercept.js +60 -0
  237. package/dist/safety/runtime/mode-table.d.ts +5 -0
  238. package/dist/safety/runtime/mode-table.js +55 -0
  239. package/dist/safety/runtime/polyfills.d.ts +6 -0
  240. package/dist/safety/runtime/polyfills.js +12 -0
  241. package/dist/safety/runtime/result-struct.d.ts +11 -0
  242. package/dist/safety/runtime/result-struct.js +98 -0
  243. package/dist/safety/runtime/safe-int.d.ts +33 -0
  244. package/dist/safety/runtime/safe-int.js +170 -0
  245. package/dist/safety/runtime/safe-traits.d.ts +4 -0
  246. package/dist/safety/runtime/safe-traits.js +95 -0
  247. package/dist/safety/runtime/safe-variable.d.ts +39 -0
  248. package/dist/safety/runtime/safe-variable.js +226 -0
  249. package/dist/safety/runtime/vote.d.ts +8 -0
  250. package/dist/safety/runtime/vote.js +92 -0
  251. package/dist/safety/runtime/write-verify.d.ts +8 -0
  252. package/dist/safety/runtime/write-verify.js +71 -0
  253. package/dist/safety/safe-int-types.d.ts +45 -0
  254. package/dist/safety/safe-int-types.js +25 -0
  255. package/dist/safety/safe-variable-types.d.ts +29 -0
  256. package/dist/safety/safe-variable-types.js +19 -0
  257. package/dist/safety/safety-bridge.d.ts +5 -6
  258. package/dist/safety/safety-bridge.js +15 -28
  259. package/dist/safety/sidecar-bridge.d.ts +1 -3
  260. package/dist/safety/sidecar-bridge.js +3 -20
  261. package/dist/safety/specifiers.d.ts +6 -0
  262. package/dist/safety/specifiers.js +14 -0
  263. package/dist/safety-hook.d.ts +8 -7
  264. package/dist/safety-hook.js +12 -13
  265. package/dist/testing.d.ts +4 -5
  266. package/dist/testing.js +5 -5
  267. package/dist/transpile/resolution.d.ts +1 -1
  268. package/dist/transpile/resolution.js +18 -9
  269. package/dist/transpile/test-pins.d.ts +18 -0
  270. package/dist/transpile/test-pins.js +142 -0
  271. package/dist/transpile.d.ts +1 -2
  272. package/dist/transpile.js +36 -30
  273. package/dist/types.d.ts +26 -26
  274. package/dist/ui-hook.d.ts +1 -1
  275. package/dist/utils/cli.d.ts +2 -2
  276. package/dist/utils/cli.js +92 -154
  277. package/dist/utils/fs.d.ts +3 -4
  278. package/dist/utils/fs.js +4 -5
  279. package/dist/utils/strings.d.ts +0 -1
  280. package/dist/utils/strings.js +0 -8
  281. package/dist/utils/ui.d.ts +5 -2
  282. package/dist/utils/ui.js +13 -3
  283. package/package.json +158 -157
  284. package/dist/add-preset.d.ts +0 -4
  285. package/dist/add-preset.js +0 -74
  286. package/dist/api/shared/async-symbol-detector.d.ts +0 -11
  287. package/dist/api/shared/async-symbol-detector.js +0 -140
  288. package/dist/api/shared/native-display-op-resolver.d.ts +0 -10
  289. package/dist/api/shared/native-display-op-resolver.js +0 -64
  290. package/dist/create/board-checklist.d.ts +0 -2
  291. package/dist/create/board-checklist.js +0 -52
  292. package/dist/create/board-codegen.d.ts +0 -9
  293. package/dist/create/board-codegen.js +0 -238
  294. package/dist/create/board-generators.d.ts +0 -12
  295. package/dist/create/board-generators.js +0 -651
  296. package/dist/create/board-spec.d.ts +0 -181
  297. package/dist/create/board-spec.js +0 -214
  298. package/dist/install/framework-catalog.d.ts +0 -53
  299. package/dist/install/framework-catalog.js +0 -107
  300. package/dist/install/handle-install.d.ts +0 -35
  301. package/dist/install/handle-install.js +0 -177
  302. package/dist/install/index.d.ts +0 -4
  303. package/dist/install/index.js +0 -3
  304. package/dist/ir/pin-state-tracking.d.ts +0 -58
  305. package/dist/ir/pin-state-tracking.js +0 -182
  306. package/dist/ir/pwm-timer-sharing.d.ts +0 -4
  307. package/dist/ir/pwm-timer-sharing.js +0 -94
  308. package/dist/ir/timer0-pwm-timing-conflict.d.ts +0 -4
  309. package/dist/ir/timer0-pwm-timing-conflict.js +0 -72
  310. package/dist/libdef/component-decls.d.ts +0 -2
  311. package/dist/libdef/component-decls.js +0 -6
  312. package/dist/libdef/component-discovery.d.ts +0 -43
  313. package/dist/libdef/component-discovery.js +0 -83
  314. package/dist/theme-tokens.d.ts +0 -22
  315. package/dist/theme-tokens.js +0 -172
@@ -1,20 +1,22 @@
1
1
  import { LINT_RULES } from '../ir/feature-registry.js';
2
+ import { isBuiltinFramework } from './framework-catalog.js';
2
3
  export function generateProjectPackageJson(options) {
3
- const { projectName, frameworkPackage, boardPackage } = options;
4
+ const { projectName, frameworkPackage } = options;
4
5
  // @typecad/hal is needed by every build, not just embedded ones: the
5
6
  // transpiler unconditionally warms the HAL source modules (loadHALModules in
6
7
  // transpile.ts), and resolveHALSourceDir() throws "Could not resolve
7
8
  // @typecad/hal/src/" if the package is absent. Embedded targets pull it in
8
- // transitively (@typecad/framework-arduino + board packages depend on it),
9
- // but native targets have no board package and @typecad/framework-native does
10
- // not declare it, so HAL must be an explicit direct dependency here.
9
+ // transitively (framework + board packages depend on it),
10
+ // but native targets have no board package, so HAL must be an explicit
11
+ // direct dependency here.
11
12
  const deps = {
12
13
  "@typecad/cuttlefish": "^1.0.0-alpha.3",
13
14
  "@typecad/hal": "^1.0.0-alpha.3",
14
- [frameworkPackage]: "^1.0.0-alpha.3",
15
15
  };
16
- if (boardPackage) {
17
- deps[boardPackage] = "^1.0.0-alpha.3";
16
+ // Built-in frameworks (native) ship inside @typecad/cuttlefish — no
17
+ // separate dependency entry.
18
+ if (!isBuiltinFramework(frameworkPackage)) {
19
+ deps[frameworkPackage] = "^1.0.0-alpha.3";
18
20
  }
19
21
  const depsJson = Object.entries(deps)
20
22
  .map(([k, v]) => ` "${k}": "${v}"`)
@@ -28,19 +30,13 @@ export function generateProjectPackageJson(options) {
28
30
  ' "@typescript-eslint/parser": "^8.61.0"',
29
31
  ' "@typescript-eslint/eslint-plugin": "^8.61.0"',
30
32
  ];
31
- // Developer-utility scripts shared by every target (native + embedded).
32
- // None require hardware or extra dependencies:
33
- // dev — auto-retranspile on save (transpile-only; append --compile
34
- // to also compile on each change). The fast "does it
35
- // typecheck" feedback loop.
36
- // gen-decls — generate TypeScript .d.ts from C++ headers. File-argument:
37
- // `npm run gen-decls -- lib/foo.h` or `-- --all lib/`.
38
- // gen-libdefs — generate library-definition stubs from a TS file's imports.
39
- // File-argument: `npm run gen-libdefs -- src/main.ts`.
33
+ // Developer-utility script shared by every target (native + embedded).
34
+ // Requires no hardware or extra dependencies:
35
+ // dev — auto-retranspile on save (transpile-only; append --compile
36
+ // to also compile on each change). The fast "does it typecheck"
37
+ // feedback loop.
40
38
  const devScripts = [
41
39
  '"dev": "cuttlefish build --watch"',
42
- '"gen-decls": "cuttlefish gen-decls"',
43
- '"gen-libdefs": "cuttlefish gen-libdefs"',
44
40
  ];
45
41
  if (options.isNative) {
46
42
  const devDepsJson = baseDevDeps.join(',\n');
@@ -100,10 +96,15 @@ ${devDepsJson}
100
96
  `;
101
97
  }
102
98
  export function generateProjectTsconfig(options) {
103
- const paths = options.boardPackage
99
+ // The @typecad/board virtual import resolves for board AND MCU-only targets
100
+ // (the transpile writes .cuttlefish/board.ts re-exporting either). The
101
+ // @typecad/test-pins module is board data — MCU-only targets have none.
102
+ const hasBoard = !!options.board || !!options.soc;
103
+ const paths = (hasBoard || options.soc)
104
104
  ? `,
105
105
  "paths": {
106
- "@typecad/board": ["./.cuttlefish/board.ts"]
106
+ "@typecad/board": ["./.cuttlefish/board.ts"]${hasBoard ? `,
107
+ "@typecad/test-pins": ["./.cuttlefish/test-pins.ts"]` : ''}
107
108
  }`
108
109
  : '';
109
110
  return `{
@@ -156,26 +157,69 @@ const config = {
156
157
  export default config;
157
158
  `;
158
159
  }
160
+ // The build target rides `board:` for board projects; only board-less
161
+ // projects (bare silicon / contract, whose target is a generated custom
162
+ // board) need the explicit frameworkData entry.
159
163
  const buildTarget = options.buildTarget;
160
- const resolvedToolchain = options.toolchainType
161
- ?? 'arduino-cli';
162
164
  let frameworkDataBlock = '';
163
- if (buildTarget) {
164
- frameworkDataBlock = `\n // Framework data\n frameworkData: {\n buildTarget: '${buildTarget}',\n },`;
165
+ if (buildTarget && buildTarget !== options.board) {
166
+ frameworkDataBlock = `\n // Framework data — the generated custom board's name (no upstream board).\n frameworkData: {\n buildTarget: '${buildTarget}',\n },`;
165
167
  }
166
- const mcuLine = options.mcu
167
- ? `\n // MCU package — provides silicon-level pin definitions\n mcu: '${options.mcu.startsWith('@') ? options.mcu : `@typecad/mcu-${options.mcu}`}',\n`
168
+ const socLine = options.soc
169
+ ? `
170
+ // Zephyr SoC — bare silicon; the board module is generated from the
171
+ // curated soc descriptor (contract projects narrow it further).
172
+ soc: '${options.soc}',
173
+ `
168
174
  : '';
169
- const boardLine = options.boardPackage
170
- ? `\n // Board package — provides pin definitions and board constants\n board: '${options.boardPackage}',`
175
+ const boardLine = options.board
176
+ ? `
177
+ // Zephyr board target — the project-local board module is generated
178
+ // from the framework's board data pack on first build.
179
+ board: '${options.board}',`
171
180
  : '';
172
181
  const portHint = process.platform === 'win32' ? 'COM4' : '/dev/ttyACM0';
173
- const baudLine = options.baudRate ? `\n\n // Console polyfill configuration\n console: {\n baudRate: ${options.baudRate},\n // Serial port for upload/monitor. Override with --port on the CLI.\n port: '${portHint}',\n },` : '';
182
+ const portValue = options.port ?? portHint;
183
+ // zephyr.* section — probe (boards with a probe-method table) and/or
184
+ // customBoard (MCU-only targets: generate an out-of-tree board for the
185
+ // chip, named after frameworkData.buildTarget).
186
+ const zephyrFields = [];
187
+ if (options.zephyrCustomBoard) {
188
+ zephyrFields.push(` // Generate an out-of-tree Zephyr board for this MCU under
189
+ // boards/typecad/ (no board package exists for this hardware). The
190
+ // board's name comes from frameworkData.buildTarget above.
191
+ customBoard: true,`);
192
+ }
193
+ if (options.probeMethod) {
194
+ const probeIds = (options.probeMethods ?? []).map((m) => m.id).join(', ');
195
+ zephyrFields.push(` // How this board attaches a probe (picked at create time;
196
+ // the board also supports: ${probeIds || 'see the framework docs'}). Serves
197
+ // flashing AND debugging.
198
+ probe: '${options.probeMethod}',`);
199
+ }
200
+ if (options.probeRunnerArgs && options.probeRunnerArgs.length > 0) {
201
+ const quirks = options.probeRunnerArgs.map((a) => `'${a}'`).join(', ');
202
+ zephyrFields.push(` // Quirk: this board's openocd.cfg drives OpenOCD resets through the
203
+ // SRST pin. When the probe's NRST line isn't wired to the target (the
204
+ // BlackPill's SWD header has no NRST pin at all), \`reset init\` times out
205
+ // with "timed out while waiting for target halted". These args force
206
+ // pin-independent core resets instead — remove them if NRST is wired and
207
+ // pin resets are wanted.
208
+ runnerArgs: [${quirks}],`);
209
+ }
210
+ const zephyrProbeBlock = zephyrFields.length > 0
211
+ ? `
212
+
213
+ // Zephyr-specific configuration.
214
+ zephyr: {
215
+ ${zephyrFields.join('\n')}
216
+ },`
217
+ : '';
174
218
  // Hardware test runner configuration — used by \`npm run test:hw\` (cuttlefish-test,
175
- // provided by @typecad/expect). It transpiles each tests/**/*.test.ts file,
176
- // flashes it to the board, and evaluates the assertions over serial.
177
- const resolvedBaud = options.baudRate ?? 115200;
178
- const testLine = `\n\n // Hardware test runner (@typecad/expect / \`npm run test:hw\`)\n test: {\n // Serial port for the test board. Override with --port on the CLI or the\n // CUTTLEFISH_PORT env var (e.g. CUTTLEFISH_PORT=/dev/ttyUSB0 npm run test:hw).\n port: '${portHint}',\n baudRate: ${resolvedBaud},\n timeout: 30000,\n include: ['tests/**/*.test.ts'],\n },`;
219
+ // provided by @typecad/expect). Defaults: baudRate 115200, timeout 30000,
220
+ // include tests/**/*.test.ts.
221
+ const testBaud = options.baudRate && options.baudRate !== 115200 ? `\n baudRate: ${options.baudRate},` : '';
222
+ const testLine = `\n\n // Hardware test runner (@typecad/expect / \`npm run test:hw\`)\n test: {\n // Serial port for the test board. Override with --port on the CLI or the\n // CUTTLEFISH_PORT env var (e.g. CUTTLEFISH_PORT=/dev/ttyUSB0 npm run test:hw).\n port: '${portValue}',${testBaud}\n },`;
179
223
  return `// ---------------------------------------------------------------------------
180
224
  // cuttlefish.config.ts — Project configuration
181
225
  //
@@ -187,30 +231,23 @@ import type { CuttlefishConfig } from '@typecad/cuttlefish/api';
187
231
  const config: CuttlefishConfig = {
188
232
  // Entry point — the main TypeScript file to transpile
189
233
  entry: './src/main.ts',
190
-
191
- // Target architecture
192
- target: '${options.architecture}',${mcuLine}${boardLine}
193
-
234
+ ${socLine}${boardLine}
194
235
  // Framework package — controls code generation strategy
195
236
  framework: '${options.frameworkPackage}',${frameworkDataBlock}
196
237
 
197
- // Output / build options
238
+ // Transpiled output (the Zephyr app lands in src/out)
198
239
  output: {
199
- framework: '${options.framework}',
200
240
  outDir: './out',
201
- },
202
-
203
- // Toolchain configuration
204
- toolchain: {
205
- type: '${resolvedToolchain}',
206
- },${baudLine}${testLine}
241
+ },${zephyrProbeBlock}${testLine}
207
242
  };
208
243
 
209
244
  export default config;
210
245
  `;
211
246
  }
212
247
  export function generateProjectEnvDts(options) {
213
- if (!options.boardPackage) {
248
+ // The @typecad/board virtual module resolves for board AND MCU-only targets
249
+ // — the transpile's first build rewrites this placeholder either way.
250
+ if (!options.board && !options.soc) {
214
251
  return `// ---------------------------------------------------------------------------
215
252
  // cuttlefish-env.d.ts — Global type declarations
216
253
  //
@@ -248,34 +285,9 @@ declare global {
248
285
  type float = number;
249
286
  type double = number;
250
287
 
251
- // console — declared here (not pulled from lib.dom) so this project does not
252
- // need "dom" in tsconfig lib just to type console.log. Avoiding lib.dom also
253
- // keeps DOM global type names (Node, Element, Event, ...) out of scope, so a
254
- // user class named e.g. Node is not shadowed by the DOM global. The
255
- // transpiler regenerates this file on build and may merge extra members
256
- // (readLine/readCharacter) onto the Console interface.
257
- interface Console {
258
- log(...args: unknown[]): void;
259
- info(...args: unknown[]): void;
260
- debug(...args: unknown[]): void;
261
- warn(...args: unknown[]): void;
262
- error(...args: unknown[]): void;
263
- }
264
- const console: Console;
265
-
266
288
  // Convenience helper for volatile variables in TypeCAD programs.
267
289
  // The transpiler detects calls to volatile() and emits the C++ volatile qualifier.
268
290
  declare function volatile<T>(value: T): T;
269
-
270
- // JS-style timers (declared here so a project does not need "dom" in tsconfig
271
- // lib to type setInterval/setTimeout). The transpiler rewrites these to
272
- // __tc_setInterval/__tc_setTimeout and emits the timer_methods polyfill when
273
- // used. Note: Timing.setInterval/setTimeout (from @typecad/hal) is the
274
- // preferred single entry point and is typed via the @typecad/board import.
275
- declare function setInterval(handler: () => void, timeout?: number): number;
276
- declare function setTimeout(handler: () => void, timeout?: number): number;
277
- declare function clearInterval(id: number): void;
278
- declare function clearTimeout(id: number): void;
279
291
  }
280
292
 
281
293
  export {};
@@ -321,34 +333,9 @@ declare global {
321
333
  type float = number;
322
334
  type double = number;
323
335
 
324
- // console — declared here (not pulled from lib.dom) so this project does not
325
- // need "dom" in tsconfig lib just to type console.log. Avoiding lib.dom also
326
- // keeps DOM global type names (Node, Element, Event, ...) out of scope, so a
327
- // user class named e.g. Node is not shadowed by the DOM global. The
328
- // transpiler regenerates this file on build and may merge extra members
329
- // (readLine/readCharacter) onto the Console interface.
330
- interface Console {
331
- log(...args: unknown[]): void;
332
- info(...args: unknown[]): void;
333
- debug(...args: unknown[]): void;
334
- warn(...args: unknown[]): void;
335
- error(...args: unknown[]): void;
336
- }
337
- const console: Console;
338
-
339
336
  // Convenience helper for volatile variables in TypeCAD programs.
340
337
  // The transpiler detects calls to volatile() and emits the C++ volatile qualifier.
341
338
  declare function volatile<T>(value: T): T;
342
-
343
- // JS-style timers (declared here so a project does not need "dom" in tsconfig
344
- // lib to type setInterval/setTimeout). The transpiler rewrites these to
345
- // __tc_setInterval/__tc_setTimeout and emits the timer_methods polyfill when
346
- // used. Note: Timing.setInterval/setTimeout (from @typecad/hal) is the
347
- // preferred single entry point and is typed via the @typecad/board import.
348
- declare function setInterval(handler: () => void, timeout?: number): number;
349
- declare function setTimeout(handler: () => void, timeout?: number): number;
350
- declare function clearInterval(id: number): void;
351
- declare function clearTimeout(id: number): void;
352
339
  }
353
340
 
354
341
  declare module '@typecad/board' {
@@ -361,12 +348,13 @@ declare module '@typecad/board' {
361
348
  export {};
362
349
  `;
363
350
  }
364
- export function generateStarterSketch(options) {
351
+ export function generateStarterProgram(options) {
365
352
  if (options.isNative) {
366
353
  return `// ---------------------------------------------------------------------------
367
354
  // Hello World — Native desktop application
368
355
  //
369
- // Compiles to a native executable via g++/clang++.
356
+ // Compiles to a native executable via g++/clang++. There is no console.* here
357
+ // — results are observable through the debugger or your own channels.
370
358
  // ---------------------------------------------------------------------------
371
359
 
372
360
  function fibonacci(n: number): number {
@@ -374,24 +362,58 @@ function fibonacci(n: number): number {
374
362
  return fibonacci(n - 1) + fibonacci(n - 2);
375
363
  }
376
364
 
377
- console.log("Hello from Cuttlefish!");
378
- console.log("Fibonacci(10) =", fibonacci(10));
365
+ const fib10 = fibonacci(10);
379
366
  `;
380
367
  }
381
- return `// ---------------------------------------------------------------------------
368
+ // MCU-only target: bare silicon has no board-level LED alias — blink a
369
+ // port pin from the MCU datasheet instead.
370
+ if (!options.board && options.starterPin) {
371
+ return `// ---------------------------------------------------------------------------
382
372
  // Blink — The classic "Hello World" of embedded
383
373
  //
384
- // Toggles the onboard LED every second using the recommended GPIO pattern.
374
+ // MCU-only target (no board package): ${options.targetDisplayName}. Pins are
375
+ // addressed by their datasheet port names — see the MCU package for the full
376
+ // pinout and each pin's capabilities.
377
+ // ---------------------------------------------------------------------------
378
+
379
+ import { GPIO, Time } from '@typecad/hal';
380
+ import { ${options.starterPin} } from '@typecad/board';
381
+
382
+ const led = new GPIO(${options.starterPin}, GPIO.OUTPUT);
383
+
384
+ while (true) {
385
+ led.toggle();
386
+ Time.sleep(1000);
387
+ }
388
+ `;
389
+ }
390
+ return `// ---------------------------------------------------------------------------
391
+ // Starter — The skeleton every program grows from
392
+ //
393
+ // ${options.hasLed === false
394
+ ? `This board's devicetree declares no LED — wire up your board's I/O below.`
395
+ : `Toggles the onboard LED every second using the recommended GPIO pattern.`}
385
396
  // ---------------------------------------------------------------------------
386
397
 
387
- import { LED, delay } from '@typecad/board';
398
+ ${options.hasLed === false
399
+ ? `import { Time } from '@typecad/hal';
388
400
 
389
- const led = LED.asOutput(false);
401
+ // This board exports no LED alias — add a peripheral here (GPIO on a header
402
+ // pin, UART0/USB0 for serial output, ...) and drive it in the loop.
403
+ while (true) {
404
+ Time.sleep(1000);
405
+ }
406
+ `
407
+ : `import { GPIO, Time } from '@typecad/hal';
408
+ import { LED } from '@typecad/board';
409
+
410
+ const led = new GPIO(LED, GPIO.OUTPUT);
390
411
 
391
412
  while (true) {
392
413
  led.toggle();
393
- delay(1000);
414
+ Time.sleep(1000);
394
415
  }
416
+ `}
395
417
  `;
396
418
  }
397
419
  export function generateStarterTest(_options) {
@@ -451,7 +473,7 @@ export function generateStarterSim(options) {
451
473
  // Hardware simulation — Button + LED
452
474
  //
453
475
  // Runs entirely on your computer with \`npm run simulate\` (vitest + the
454
- // @typecad/simulator package). No board, serial port, or arduino-cli required.
476
+ // @typecad/simulator package). No board, serial port, or west build required.
455
477
  // The simulator mirrors the pins/peripherals of your ${options.targetDisplayName}
456
478
  // (${boardType}); you inject fake inputs and assert on the outputs in Node.
457
479
  //
@@ -536,14 +558,6 @@ describe("Button + LED (simulator)", () => {
536
558
  });
537
559
  `;
538
560
  }
539
- export function generateBoardForwardingFile(boardPackage) {
540
- return `// ---------------------------------------------------------------------------
541
- // .cuttlefish/board.ts — Dynamically generated forwarding board package
542
- // ---------------------------------------------------------------------------
543
-
544
- export * from '${boardPackage}';
545
- `;
546
- }
547
561
  export function generateGitignore(_options) {
548
562
  return `node_modules/
549
563
  out/
@@ -575,8 +589,8 @@ indent_size = 2
575
589
  export function generateEslintConfig(_options) {
576
590
  // `no-restricted-syntax` selectors are generated from LINT_RULES
577
591
  // (packages/cuttlefish/src/ir/feature-registry.ts), the single source of
578
- // truth shared with build-time prescan diagnostics. See SUPPORT_MATRIX for
579
- // the per-pattern ❌/🚫 rationale. Do not hand-edit the array below.
592
+ // truth shared with build-time prescan diagnostics. Do not hand-edit the
593
+ // array below.
580
594
  const transpilerRulesJson = JSON.stringify(LINT_RULES.map(({ selector, message }) => ({ selector, message })), null, 2).replace(/\n/g, "\n ");
581
595
  return `import tsparser from "@typescript-eslint/parser";
582
596
  import tseslint from "@typescript-eslint/eslint-plugin";
@@ -1,8 +1,19 @@
1
1
  import type { CreateProjectOptions } from "./templates.js";
2
+ /**
3
+ * Attached serial ports for the wizard's port question — dependency-free
4
+ * (the wizard runs before any project deps exist, and cuttlefish itself
5
+ * carries no native serialport binding). Windows asks the .NET SerialPort
6
+ * class via PowerShell; macOS/Linux scan /dev for USB CDC/bridge nodes.
7
+ * Returns [] when enumeration fails — the question then falls back to a
8
+ * free-text prompt with the platform hint as default.
9
+ */
10
+ export declare function detectSerialPorts(): string[];
2
11
  export declare function runCreateWizard(partialOptions?: {
12
+ probe?: string;
13
+ port?: string;
3
14
  projectName?: string;
4
15
  board?: string;
5
16
  framework?: string;
6
17
  baud?: number;
7
- noSketch?: boolean;
18
+ noStarter?: boolean;
8
19
  }): Promise<CreateProjectOptions | null>;