diff --git a/.cursor/rules/no-dynamic-import.mdc b/.cursor/rules/no-dynamic-import.mdc new file mode 100644 index 0000000..5378994 --- /dev/null +++ b/.cursor/rules/no-dynamic-import.mdc @@ -0,0 +1,34 @@ +--- +description: Ban dynamic import() in production code — use static imports instead +globs: packages/*/src/**/*.ts +alwaysApply: true +--- + +# No Dynamic Import in Production Code + +## Rule + +Do NOT use `await import()` or dynamic `import()` expressions in production source code. +Always use static top-level `import` statements. + +## Why + +- Static imports enable tree-shaking and bundler optimizations +- They make dependencies explicit and discoverable at a glance +- Dynamic imports of Node built-ins or project modules add unnecessary async overhead + +## Exceptions (must include a comment explaining why) + +1. **`sense-runtime.ts`** — loads user-authored sense modules whose paths are only known at runtime +2. **`workflow-worker.ts`** — loads user-authored workflow modules whose paths are only known at runtime + +When suppressing, add a comment directly above: + +```ts +// Dynamic import required: user module path resolved at runtime +const mod = await import(senseIndexPath); +``` + +## Test Files + +Test files (`__tests__/**`) are exempt — dynamic import after `vi.mock()` is standard vitest practice. diff --git a/packages/daemon/src/sense-runtime.ts b/packages/daemon/src/sense-runtime.ts index 0b7021c..2baf01a 100644 --- a/packages/daemon/src/sense-runtime.ts +++ b/packages/daemon/src/sense-runtime.ts @@ -173,6 +173,7 @@ export async function loadComputeFn(senseIndexPath: string): Promise