diff --git a/.claude/hooks/session-start.sh b/.claude/hooks/session-start.sh new file mode 100755 index 0000000..9f13dec --- /dev/null +++ b/.claude/hooks/session-start.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -euo pipefail + +if [ "${CLAUDE_CODE_REMOTE:-}" != "true" ]; then + exit 0 +fi + +cd "${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel)}" + +npm install diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..e06b033 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,14 @@ +{ + "hooks": { + "SessionStart": [ + { + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.sh" + } + ] + } + ] + } +} diff --git a/.gitignore b/.gitignore index 8fd8eeb..49227b7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,8 +23,8 @@ tsconfig.tsbuildinfo *.sln *.sw? -# Claude Code -.claude/ +# Claude Code - local settings excluded, hooks tracked +.claude/settings.local.json # Optics simulation template optics-template/ diff --git a/src/common/model/blockers/LineBlocker.ts b/src/common/model/blockers/LineBlocker.ts index bd7d451..8607ffe 100644 --- a/src/common/model/blockers/LineBlocker.ts +++ b/src/common/model/blockers/LineBlocker.ts @@ -5,7 +5,7 @@ */ import { BaseSegmentElement } from "../optics/BaseSegmentElement.js"; -import { type Point } from "../optics/Geometry.js"; +import type { Point } from "../optics/Geometry.js"; import type { ElementCategory, IntersectionResult, diff --git a/src/common/model/light-sources/ArcLightSource.ts b/src/common/model/light-sources/ArcLightSource.ts index c06f4de..cd7654d 100644 --- a/src/common/model/light-sources/ArcLightSource.ts +++ b/src/common/model/light-sources/ArcLightSource.ts @@ -10,11 +10,7 @@ import type { Point } from "../optics/Geometry.js"; import { normalize, point } from "../optics/Geometry.js"; -import { - BRIGHTNESS_CONTINUOUS_THRESHOLD, - POLARIZATION_SPLIT, - RAY_DENSITY_SCALE, -} from "../optics/OpticsConstants.js"; +import { BRIGHTNESS_CONTINUOUS_THRESHOLD, POLARIZATION_SPLIT, RAY_DENSITY_SCALE } from "../optics/OpticsConstants.js"; import type { SimulationRay, ViewMode } from "../optics/OpticsTypes.js"; import { BaseLightSource } from "./BaseLightSource.js"; import { GREEN_WAVELENGTH } from "./LightSourceConstants.js"; diff --git a/src/common/model/light-sources/BaseLightSource.ts b/src/common/model/light-sources/BaseLightSource.ts index d45d5c2..30751a5 100644 --- a/src/common/model/light-sources/BaseLightSource.ts +++ b/src/common/model/light-sources/BaseLightSource.ts @@ -8,10 +8,7 @@ */ import { BaseElement } from "../optics/BaseElement.js"; -import { - BRIGHTNESS_CONTINUOUS_THRESHOLD, - BRIGHTNESS_NORMALIZE, -} from "../optics/OpticsConstants.js"; +import { BRIGHTNESS_CONTINUOUS_THRESHOLD, BRIGHTNESS_NORMALIZE } from "../optics/OpticsConstants.js"; import type { ElementCategory } from "../optics/OpticsTypes.js"; import { GREEN_WAVELENGTH } from "./LightSourceConstants.js"; diff --git a/src/common/model/light-sources/PointSourceElement.ts b/src/common/model/light-sources/PointSourceElement.ts index 2cf0732..fb0fb0d 100644 --- a/src/common/model/light-sources/PointSourceElement.ts +++ b/src/common/model/light-sources/PointSourceElement.ts @@ -7,11 +7,7 @@ import type { Point } from "../optics/Geometry.js"; import { point } from "../optics/Geometry.js"; -import { - BRIGHTNESS_CONTINUOUS_THRESHOLD, - POLARIZATION_SPLIT, - RAY_DENSITY_SCALE, -} from "../optics/OpticsConstants.js"; +import { BRIGHTNESS_CONTINUOUS_THRESHOLD, POLARIZATION_SPLIT, RAY_DENSITY_SCALE } from "../optics/OpticsConstants.js"; import type { SimulationRay, ViewMode } from "../optics/OpticsTypes.js"; import { BaseLightSource } from "./BaseLightSource.js"; import { GREEN_WAVELENGTH } from "./LightSourceConstants.js"; diff --git a/src/common/view/EditContainerNode.ts b/src/common/view/EditContainerNode.ts index f8a7d25..10165f0 100644 --- a/src/common/view/EditContainerNode.ts +++ b/src/common/view/EditContainerNode.ts @@ -13,8 +13,8 @@ * SimScreenView can supply the callback after selection is triggered. */ -import { type Property, type TReadOnlyProperty } from "scenerystack/axon"; -import { type Bounds2 } from "scenerystack/dot"; +import type { Property, TReadOnlyProperty } from "scenerystack/axon"; +import type { Bounds2 } from "scenerystack/dot"; import { HBox, Node, Text, VBox } from "scenerystack/scenery"; import { TrashButton } from "scenerystack/scenery-phet"; import { FlatAppearanceStrategy, Panel } from "scenerystack/sun"; @@ -210,7 +210,6 @@ export class EditContainerNode extends Node { this._currentPanel.centerX = visibleBounds.centerX; this._currentPanel.bottom = visibleBounds.maxY - PANEL_BOTTOM_MARGIN; } - } opticsLab.register("EditContainerNode", EditContainerNode); diff --git a/src/common/view/EditControlFactory.ts b/src/common/view/EditControlFactory.ts index 881588c..ac82183 100644 --- a/src/common/view/EditControlFactory.ts +++ b/src/common/view/EditControlFactory.ts @@ -12,7 +12,7 @@ import { NumberProperty, type ReadOnlyProperty } from "scenerystack/axon"; import { Dimension2, Range } from "scenerystack/dot"; -import { Node } from "scenerystack/scenery"; +import type { Node } from "scenerystack/scenery"; import { NumberControl, WavelengthNumberControl } from "scenerystack/scenery-phet"; import { Tandem } from "scenerystack/tandem"; import { StringManager } from "../../i18n/StringManager.js"; diff --git a/src/common/view/glass/GlassView.ts b/src/common/view/glass/GlassView.ts index 49617dd..2997863 100644 --- a/src/common/view/glass/GlassView.ts +++ b/src/common/view/glass/GlassView.ts @@ -14,7 +14,6 @@ import { Shape } from "scenerystack/kite"; import type { ModelViewTransform2 } from "scenerystack/phetcommon"; import { Circle, Node, Path, type RichDragListener } from "scenerystack/scenery"; -import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import OpticsLabColors from "../../../OpticsLabColors.js"; import { GLASS_STROKE_WIDTH, @@ -32,6 +31,7 @@ import { point, segment, } from "../../model/optics/Geometry.js"; +import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import { attachEndpointDrag, attachTranslationDrag, createHandle } from "../ViewHelpers.js"; export class GlassView extends BaseOpticalElementView { diff --git a/src/common/view/glass/SphericalLensView.ts b/src/common/view/glass/SphericalLensView.ts index 049ac50..565982e 100644 --- a/src/common/view/glass/SphericalLensView.ts +++ b/src/common/view/glass/SphericalLensView.ts @@ -49,7 +49,6 @@ const CORNER_BOTTOM_LEFT = 3; // path[4] const ROTATION_CORNER = CORNER_TOP_RIGHT; export class SphericalLensView extends GlassView { - private readonly focalFront: Path; private readonly focalBack: Path; diff --git a/src/common/view/mirrors/ArcMirrorView.ts b/src/common/view/mirrors/ArcMirrorView.ts index 5d81c35..9fea4cb 100644 --- a/src/common/view/mirrors/ArcMirrorView.ts +++ b/src/common/view/mirrors/ArcMirrorView.ts @@ -18,8 +18,8 @@ import { } from "../../../OpticsLabConstants.js"; import opticsLab from "../../../OpticsLabNamespace.js"; import type { ArcMirror } from "../../model/mirrors/ArcMirror.js"; -import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import { circumcenter, type Point, sampleArcPoints } from "../../model/optics/Geometry.js"; +import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import { attachCurvatureHandleDrag, attachEndpointDrag, diff --git a/src/common/view/mirrors/ParabolicMirrorView.ts b/src/common/view/mirrors/ParabolicMirrorView.ts index afa399a..7435439 100644 --- a/src/common/view/mirrors/ParabolicMirrorView.ts +++ b/src/common/view/mirrors/ParabolicMirrorView.ts @@ -18,8 +18,8 @@ import { } from "../../../OpticsLabConstants.js"; import opticsLab from "../../../OpticsLabNamespace.js"; import type { ParabolicMirror } from "../../model/mirrors/ParabolicMirror.js"; -import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import type { Point } from "../../model/optics/Geometry.js"; +import { BaseOpticalElementView } from "../BaseOpticalElementView.js"; import { attachCurvatureHandleDrag, attachEndpointDrag,