lsd-pi 1.1.10 → 1.2.1
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/dist/onboarding.js +3 -3
- package/dist/resources/agents/scout.md +6 -0
- package/dist/resources/extensions/slash-commands/index.js +2 -0
- package/dist/resources/extensions/slash-commands/init.js +47 -0
- package/dist/resources/extensions/slash-commands/plan.js +238 -51
- package/dist/resources/extensions/slash-commands/tools.js +14 -27
- package/dist/resources/extensions/subagent/index.js +14 -11
- package/dist/resources/extensions/usage/index.js +87 -36
- package/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +222 -1
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +227 -6
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +28 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +10 -100
- package/packages/pi-ai/src/models.generated.ts +227 -6
- package/packages/pi-ai/src/models.test.ts +30 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +39 -5
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -7
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -4
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +18 -7
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +80 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +12 -5
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +23 -9
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +8 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +32 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +34 -25
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/path-display.test.js +13 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js +15 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +48 -5
- package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -7
- package/packages/pi-coding-agent/src/core/resource-loader.ts +4 -4
- package/packages/pi-coding-agent/src/core/sdk.test.ts +100 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +23 -8
- package/packages/pi-coding-agent/src/core/settings-manager.ts +36 -15
- package/packages/pi-coding-agent/src/core/system-prompt.ts +26 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +41 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +11 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +43 -27
- package/packages/pi-coding-agent/src/tests/path-display.test.ts +14 -0
- package/pkg/package.json +1 -1
- package/src/resources/agents/scout.md +6 -0
- package/src/resources/extensions/slash-commands/index.ts +2 -0
- package/src/resources/extensions/slash-commands/init.ts +55 -0
- package/src/resources/extensions/slash-commands/plan.ts +279 -53
- package/src/resources/extensions/slash-commands/tools.ts +15 -29
- package/src/resources/extensions/subagent/index.ts +14 -11
- package/src/resources/extensions/usage/index.ts +92 -38
- package/dist/resources/agents/javascript-pro.md +0 -280
- package/dist/resources/agents/researcher.md +0 -29
- package/dist/resources/agents/teams-builder.md +0 -74
- package/dist/resources/agents/teams-reviewer.md +0 -113
- package/dist/resources/agents/typescript-pro.md +0 -255
- package/dist/resources/skills/accessibility/SKILL.md +0 -522
- package/dist/resources/skills/accessibility/references/WCAG.md +0 -162
- package/dist/resources/skills/core-web-vitals/SKILL.md +0 -441
- package/dist/resources/skills/core-web-vitals/references/LCP.md +0 -208
- package/dist/resources/skills/frontend-design/SKILL.md +0 -45
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
- package/dist/resources/skills/make-interfaces-feel-better/animations.md +0 -379
- package/dist/resources/skills/make-interfaces-feel-better/performance.md +0 -88
- package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
- package/dist/resources/skills/make-interfaces-feel-better/typography.md +0 -123
- package/dist/resources/skills/react-best-practices/README.md +0 -123
- package/dist/resources/skills/react-best-practices/SKILL.md +0 -136
- package/dist/resources/skills/react-best-practices/metadata.json +0 -15
- package/dist/resources/skills/react-best-practices/rules/_sections.md +0 -46
- package/dist/resources/skills/react-best-practices/rules/_template.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
- package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
- package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
- package/dist/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
- package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
- package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
- package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/dist/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
- package/dist/resources/skills/userinterface-wiki/SKILL.md +0 -253
- package/dist/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
- package/dist/resources/skills/userinterface-wiki/rules/_template.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
- package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
- package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
- package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
- package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
- package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
- package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
- package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
- package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
- package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
- package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
- package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
- package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
- package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
- package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
- package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
- package/dist/resources/skills/web-design-guidelines/SKILL.md +0 -39
- package/dist/resources/skills/web-quality-audit/SKILL.md +0 -168
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
- package/src/resources/agents/javascript-pro.md +0 -280
- package/src/resources/agents/researcher.md +0 -29
- package/src/resources/agents/teams-builder.md +0 -74
- package/src/resources/agents/teams-reviewer.md +0 -113
- package/src/resources/agents/typescript-pro.md +0 -255
- package/src/resources/skills/accessibility/SKILL.md +0 -522
- package/src/resources/skills/accessibility/references/WCAG.md +0 -162
- package/src/resources/skills/core-web-vitals/SKILL.md +0 -441
- package/src/resources/skills/core-web-vitals/references/LCP.md +0 -208
- package/src/resources/skills/frontend-design/SKILL.md +0 -45
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
- package/src/resources/skills/make-interfaces-feel-better/animations.md +0 -379
- package/src/resources/skills/make-interfaces-feel-better/performance.md +0 -88
- package/src/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
- package/src/resources/skills/make-interfaces-feel-better/typography.md +0 -123
- package/src/resources/skills/react-best-practices/README.md +0 -123
- package/src/resources/skills/react-best-practices/SKILL.md +0 -136
- package/src/resources/skills/react-best-practices/metadata.json +0 -15
- package/src/resources/skills/react-best-practices/rules/_sections.md +0 -46
- package/src/resources/skills/react-best-practices/rules/_template.md +0 -28
- package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
- package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
- package/src/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/src/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/src/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
- package/src/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/src/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/src/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/src/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/src/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/src/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
- package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/src/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
- package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
- package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/src/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
- package/src/resources/skills/userinterface-wiki/SKILL.md +0 -253
- package/src/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
- package/src/resources/skills/userinterface-wiki/rules/_template.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
- package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
- package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
- package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
- package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
- package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
- package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
- package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
- package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
- package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
- package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
- package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
- package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
- package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
- package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
- package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
- package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
- package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
- package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
- package/src/resources/skills/web-design-guidelines/SKILL.md +0 -39
- package/src/resources/skills/web-quality-audit/SKILL.md +0 -168
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
|
@@ -41,6 +41,19 @@ test("buildSystemPrompt: Unix paths pass through unchanged", () => {
|
|
|
41
41
|
});
|
|
42
42
|
assert.ok(prompt.includes("/home/user/project"));
|
|
43
43
|
});
|
|
44
|
+
test("buildSystemPrompt: encourages scout-first reconnaissance when subagent is available", () => {
|
|
45
|
+
const prompt = buildSystemPrompt({
|
|
46
|
+
cwd: "/home/user/project",
|
|
47
|
+
selectedTools: ["read", "lsp", "subagent", "edit", "write"],
|
|
48
|
+
});
|
|
49
|
+
assert.match(prompt, /delegate reconnaissance to the scout subagent/i);
|
|
50
|
+
assert.match(prompt, /0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem/i);
|
|
51
|
+
assert.match(prompt, /For one scout use \{ agent, task \}/i);
|
|
52
|
+
assert.match(prompt, /Scout is for mapping and reconnaissance only/i);
|
|
53
|
+
assert.match(prompt, /multiple scout subagents in parallel/i);
|
|
54
|
+
assert.match(prompt, /broad review or audit requests, use scout only as a prep step/i);
|
|
55
|
+
assert.match(prompt, /Skip scout only when the task is clearly narrow/i);
|
|
56
|
+
});
|
|
44
57
|
// ─── Regression: no backslash paths in LLM-visible text ────────────────────
|
|
45
58
|
/**
|
|
46
59
|
* Pattern that matches Windows-style absolute paths with backslashes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-display.test.js","sourceRoot":"","sources":["../../src/tests/path-display.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,+EAA+E;AAE/E,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC7E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACvF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,KAAK,CACX,WAAW,CAAC,iDAAiD,CAAC,EAC9D,2CAA2C,CAC3C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,wCAAwC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EACrD,iDAAiD,CACjD,CAAC;IACF,MAAM,CAAC,EAAE,CACR,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,EAC1D,+CAA+C,CAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACpF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,6CAA6C;KAClD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,MAAM,EAAE,CAAC,EACpB,oDAAoD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Cross-platform path display tests.\n *\n * Verifies that toPosixPath correctly normalizes Windows paths and that\n * the system prompt builder produces forward-slash paths for LLM consumption.\n */\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport { buildSystemPrompt } from \"../core/system-prompt.js\";\n\n// ─── toPosixPath ────────────────────────────────────────────────────────────\n\ntest(\"toPosixPath: converts Windows backslash paths to forward slashes\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users\\\\name\\\\project\"), \"C:/Users/name/project\");\n});\n\ntest(\"toPosixPath: handles mixed separators\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users/name\\\\project/src\"), \"C:/Users/name/project/src\");\n});\n\ntest(\"toPosixPath: no-op for Unix paths\", () => {\n\tassert.equal(toPosixPath(\"/home/user/project\"), \"/home/user/project\");\n});\n\ntest(\"toPosixPath: handles empty string\", () => {\n\tassert.equal(toPosixPath(\"\"), \"\");\n});\n\ntest(\"toPosixPath: handles Windows UNC paths\", () => {\n\tassert.equal(toPosixPath(\"\\\\\\\\server\\\\share\\\\dir\"), \"//server/share/dir\");\n});\n\ntest(\"toPosixPath: handles .gsd/worktrees path on Windows\", () => {\n\tassert.equal(\n\t\ttoPosixPath(\"C:\\\\Users\\\\name\\\\project\\\\.gsd\\\\worktrees\\\\M001\"),\n\t\t\"C:/Users/name/project/.gsd/worktrees/M001\",\n\t);\n});\n\n// ─── System prompt path normalization ───────────────────────────────────────\n\ntest(\"buildSystemPrompt: cwd uses forward slashes even with Windows input\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"C:\\\\Users\\\\name\\\\development\\\\app-name\",\n\t});\n\tassert.ok(\n\t\tprompt.includes(\"C:/Users/name/development/app-name\"),\n\t\t\"System prompt should contain forward-slash path\",\n\t);\n\tassert.ok(\n\t\t!prompt.includes(\"C:\\\\Users\\\\name\\\\development\\\\app-name\"),\n\t\t\"System prompt must NOT contain backslash path\",\n\t);\n});\n\ntest(\"buildSystemPrompt: Unix paths pass through unchanged\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t});\n\tassert.ok(prompt.includes(\"/home/user/project\"));\n});\n\n// ─── Regression: no backslash paths in LLM-visible text ────────────────────\n\n/**\n * Pattern that matches Windows-style absolute paths with backslashes.\n * Catches: C:\\Users\\..., D:\\Projects\\..., \\\\server\\share\\...\n * Does not match: escaped chars in regex, JSON strings, etc.\n */\nconst WINDOWS_ABS_PATH_RE = /[A-Z]:\\\\[A-Za-z]/;\n\ntest(\"buildSystemPrompt: no Windows absolute paths with backslashes in output\", () => {\n\t// Simulate a Windows-like cwd\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"D:\\\\Projects\\\\my-app\\\\.gsd\\\\worktrees\\\\M002\",\n\t});\n\tconst lines = prompt.split(\"\\n\");\n\tconst violations = lines.filter(line => WINDOWS_ABS_PATH_RE.test(line));\n\tassert.equal(\n\t\tviolations.length, 0,\n\t\t`System prompt contains Windows backslash paths:\\n${violations.join(\"\\n\")}`,\n\t);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"path-display.test.js","sourceRoot":"","sources":["../../src/tests/path-display.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,+EAA+E;AAE/E,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC7E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACvF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,KAAK,CACX,WAAW,CAAC,iDAAiD,CAAC,EAC9D,2CAA2C,CAC3C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,wCAAwC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EACrD,iDAAiD,CACjD,CAAC;IACF,MAAM,CAAC,EAAE,CACR,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,EAC1D,+CAA+C,CAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,GAAG,EAAE;IAChG,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;QACzB,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gDAAgD,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kFAAkF,CAAC,CAAC;IACzG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gEAAgE,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACpF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,6CAA6C;KAClD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,MAAM,EAAE,CAAC,EACpB,oDAAoD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Cross-platform path display tests.\n *\n * Verifies that toPosixPath correctly normalizes Windows paths and that\n * the system prompt builder produces forward-slash paths for LLM consumption.\n */\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport { buildSystemPrompt } from \"../core/system-prompt.js\";\n\n// ─── toPosixPath ────────────────────────────────────────────────────────────\n\ntest(\"toPosixPath: converts Windows backslash paths to forward slashes\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users\\\\name\\\\project\"), \"C:/Users/name/project\");\n});\n\ntest(\"toPosixPath: handles mixed separators\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users/name\\\\project/src\"), \"C:/Users/name/project/src\");\n});\n\ntest(\"toPosixPath: no-op for Unix paths\", () => {\n\tassert.equal(toPosixPath(\"/home/user/project\"), \"/home/user/project\");\n});\n\ntest(\"toPosixPath: handles empty string\", () => {\n\tassert.equal(toPosixPath(\"\"), \"\");\n});\n\ntest(\"toPosixPath: handles Windows UNC paths\", () => {\n\tassert.equal(toPosixPath(\"\\\\\\\\server\\\\share\\\\dir\"), \"//server/share/dir\");\n});\n\ntest(\"toPosixPath: handles .gsd/worktrees path on Windows\", () => {\n\tassert.equal(\n\t\ttoPosixPath(\"C:\\\\Users\\\\name\\\\project\\\\.gsd\\\\worktrees\\\\M001\"),\n\t\t\"C:/Users/name/project/.gsd/worktrees/M001\",\n\t);\n});\n\n// ─── System prompt path normalization ───────────────────────────────────────\n\ntest(\"buildSystemPrompt: cwd uses forward slashes even with Windows input\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"C:\\\\Users\\\\name\\\\development\\\\app-name\",\n\t});\n\tassert.ok(\n\t\tprompt.includes(\"C:/Users/name/development/app-name\"),\n\t\t\"System prompt should contain forward-slash path\",\n\t);\n\tassert.ok(\n\t\t!prompt.includes(\"C:\\\\Users\\\\name\\\\development\\\\app-name\"),\n\t\t\"System prompt must NOT contain backslash path\",\n\t);\n});\n\ntest(\"buildSystemPrompt: Unix paths pass through unchanged\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t});\n\tassert.ok(prompt.includes(\"/home/user/project\"));\n});\n\ntest(\"buildSystemPrompt: encourages scout-first reconnaissance when subagent is available\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t\tselectedTools: [\"read\", \"lsp\", \"subagent\", \"edit\", \"write\"],\n\t});\n\tassert.match(prompt, /delegate reconnaissance to the scout subagent/i);\n\tassert.match(prompt, /0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem/i);\n\tassert.match(prompt, /For one scout use \\{ agent, task \\}/i);\n\tassert.match(prompt, /Scout is for mapping and reconnaissance only/i);\n\tassert.match(prompt, /multiple scout subagents in parallel/i);\n\tassert.match(prompt, /broad review or audit requests, use scout only as a prep step/i);\n\tassert.match(prompt, /Skip scout only when the task is clearly narrow/i);\n});\n\n// ─── Regression: no backslash paths in LLM-visible text ────────────────────\n\n/**\n * Pattern that matches Windows-style absolute paths with backslashes.\n * Catches: C:\\Users\\..., D:\\Projects\\..., \\\\server\\share\\...\n * Does not match: escaped chars in regex, JSON strings, etc.\n */\nconst WINDOWS_ABS_PATH_RE = /[A-Z]:\\\\[A-Za-z]/;\n\ntest(\"buildSystemPrompt: no Windows absolute paths with backslashes in output\", () => {\n\t// Simulate a Windows-like cwd\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"D:\\\\Projects\\\\my-app\\\\.gsd\\\\worktrees\\\\M002\",\n\t});\n\tconst lines = prompt.split(\"\\n\");\n\tconst violations = lines.filter(line => WINDOWS_ABS_PATH_RE.test(line));\n\tassert.equal(\n\t\tviolations.length, 0,\n\t\t`System prompt contains Windows backslash paths:\\n${violations.join(\"\\n\")}`,\n\t);\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-manager-scout-policy.test.d.ts","sourceRoot":"","sources":["../../src/tests/settings-manager-scout-policy.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { SettingsManager } from "../core/settings-manager.js";
|
|
4
|
+
test("SettingsManager defaults scoutUsagePolicy to recommend", () => {
|
|
5
|
+
const settings = SettingsManager.inMemory();
|
|
6
|
+
assert.equal(settings.getScoutUsagePolicy(), "recommend");
|
|
7
|
+
});
|
|
8
|
+
test("SettingsManager persists scoutUsagePolicy values", () => {
|
|
9
|
+
const settings = SettingsManager.inMemory();
|
|
10
|
+
settings.setScoutUsagePolicy("aggressive");
|
|
11
|
+
assert.equal(settings.getScoutUsagePolicy(), "aggressive");
|
|
12
|
+
settings.setScoutUsagePolicy("off");
|
|
13
|
+
assert.equal(settings.getScoutUsagePolicy(), "off");
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=settings-manager-scout-policy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-manager-scout-policy.test.js","sourceRoot":"","sources":["../../src/tests/settings-manager-scout-policy.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC7D,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAE5C,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;IAE3D,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC","sourcesContent":["import test from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport { SettingsManager } from \"../core/settings-manager.js\";\n\ntest(\"SettingsManager defaults scoutUsagePolicy to recommend\", () => {\n\tconst settings = SettingsManager.inMemory();\n\tassert.equal(settings.getScoutUsagePolicy(), \"recommend\");\n});\n\ntest(\"SettingsManager persists scoutUsagePolicy values\", () => {\n\tconst settings = SettingsManager.inMemory();\n\n\tsettings.setScoutUsagePolicy(\"aggressive\");\n\tassert.equal(settings.getScoutUsagePolicy(), \"aggressive\");\n\n\tsettings.setScoutUsagePolicy(\"off\");\n\tassert.equal(settings.getScoutUsagePolicy(), \"off\");\n});\n"]}
|
|
@@ -1039,10 +1039,45 @@ export class AgentSession {
|
|
|
1039
1039
|
return this._expandSkillByName(skillName, args);
|
|
1040
1040
|
}
|
|
1041
1041
|
|
|
1042
|
+
private _isPremiumReconModel(): boolean {
|
|
1043
|
+
const model = this.model;
|
|
1044
|
+
if (!model) return false;
|
|
1045
|
+
const provider = model.provider.toLowerCase();
|
|
1046
|
+
const id = model.id.toLowerCase();
|
|
1047
|
+
return (
|
|
1048
|
+
(provider === "anthropic" && (id.includes("opus") || id.includes("sonnet"))) ||
|
|
1049
|
+
(provider === "openai" && /^gpt-5(\.|-|$)/.test(id)) ||
|
|
1050
|
+
(provider === "google" && id.includes("gemini-2.5-pro"))
|
|
1051
|
+
);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
private _buildScoutPolicyGuidelines(toolNames: string[]): string[] {
|
|
1055
|
+
if (!toolNames.includes("subagent")) return [];
|
|
1056
|
+
|
|
1057
|
+
const guidelines = [
|
|
1058
|
+
"Recon planning policy: use 0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem, and 2-4 parallel scouts only when the work spans multiple loosely-coupled subsystems.",
|
|
1059
|
+
"Scout-first reconnaissance policy: when you need architecture context across multiple files or folders, do not map the subsystem by reading file-after-file yourself. Launch the scout subagent first, then continue with lsp and targeted reads.",
|
|
1060
|
+
"If your next step would be broad exploration rather than a targeted lookup, prefer scout before doing more read/find/grep sweeps yourself.",
|
|
1061
|
+
"When you choose scout, call subagent directly with valid parameters: { agent, task } for one scout, or { tasks: [{ agent, task }, ...] } for parallel scouts.",
|
|
1062
|
+
"Scout is reconnaissance-only. Do not use it as the reviewer, auditor, or final issue-ranker; use it to map files, ownership, and likely hotspots for later evaluation.",
|
|
1063
|
+
"If the work spans multiple loosely-coupled subsystems, prefer parallel scout subagents so each scout maps one area and the parent model reads the summaries instead of the raw files.",
|
|
1064
|
+
"For broad review or audit requests, use scout only as a prep step to map architecture and hotspots; the parent model or a reviewer should make the final judgments.",
|
|
1065
|
+
];
|
|
1066
|
+
|
|
1067
|
+
if (this._isPremiumReconModel()) {
|
|
1068
|
+
guidelines.push(
|
|
1069
|
+
"You are on a premium model. Spend tokens on synthesis, planning, and edits — not broad reconnaissance. Delegate exploratory reading to scout whenever the scope is not already narrow.",
|
|
1070
|
+
);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
return guidelines;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1042
1076
|
private _rebuildSystemPrompt(toolNames: string[]): string {
|
|
1043
1077
|
const validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));
|
|
1044
1078
|
const toolSnippets: Record<string, string> = {};
|
|
1045
1079
|
const promptGuidelines: string[] = [];
|
|
1080
|
+
promptGuidelines.push(...this._buildScoutPolicyGuidelines(validToolNames));
|
|
1046
1081
|
for (const name of validToolNames) {
|
|
1047
1082
|
const snippet = this._toolPromptSnippets.get(name);
|
|
1048
1083
|
if (snippet) {
|
|
@@ -1804,7 +1839,7 @@ export class AgentSession {
|
|
|
1804
1839
|
throw new Error(`No API key for ${model.provider}/${model.id}`);
|
|
1805
1840
|
}
|
|
1806
1841
|
|
|
1807
|
-
const thinkingLevel = this._getThinkingLevelForModelSwitch();
|
|
1842
|
+
const thinkingLevel = this._getThinkingLevelForModelSwitch(model);
|
|
1808
1843
|
await this._applyModelChange(model, thinkingLevel, "set", options);
|
|
1809
1844
|
}
|
|
1810
1845
|
|
|
@@ -1841,7 +1876,7 @@ export class AgentSession {
|
|
|
1841
1876
|
|
|
1842
1877
|
// Explicit scoped model thinking level overrides current session level;
|
|
1843
1878
|
// undefined scoped model thinking level inherits the current session preference.
|
|
1844
|
-
const thinkingLevel = this._getThinkingLevelForModelSwitch(next.thinkingLevel);
|
|
1879
|
+
const thinkingLevel = this._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);
|
|
1845
1880
|
await this._applyModelChange(next.model, thinkingLevel, "cycle", options);
|
|
1846
1881
|
|
|
1847
1882
|
return { model: next.model, thinkingLevel: this.thinkingLevel, isScoped: true };
|
|
@@ -1859,7 +1894,7 @@ export class AgentSession {
|
|
|
1859
1894
|
const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
|
|
1860
1895
|
const nextModel = availableModels[nextIndex];
|
|
1861
1896
|
|
|
1862
|
-
const thinkingLevel = this._getThinkingLevelForModelSwitch();
|
|
1897
|
+
const thinkingLevel = this._getThinkingLevelForModelSwitch(nextModel);
|
|
1863
1898
|
await this._applyModelChange(nextModel, thinkingLevel, "cycle", options);
|
|
1864
1899
|
|
|
1865
1900
|
return { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: false };
|
|
@@ -1942,11 +1977,19 @@ export class AgentSession {
|
|
|
1942
1977
|
return !!this.model?.reasoning;
|
|
1943
1978
|
}
|
|
1944
1979
|
|
|
1945
|
-
private _getThinkingLevelForModelSwitch(explicitLevel?: ThinkingLevel): ThinkingLevel {
|
|
1980
|
+
private _getThinkingLevelForModelSwitch(targetModel: Model<any>, explicitLevel?: ThinkingLevel): ThinkingLevel {
|
|
1946
1981
|
if (explicitLevel !== undefined) {
|
|
1947
1982
|
return explicitLevel;
|
|
1948
1983
|
}
|
|
1949
|
-
if (
|
|
1984
|
+
if (
|
|
1985
|
+
targetModel.provider === "anthropic" &&
|
|
1986
|
+
targetModel.reasoning === true &&
|
|
1987
|
+
this.settingsManager.getAnthropicAdaptiveByDefault() &&
|
|
1988
|
+
supportsAdaptiveThinking(targetModel.id)
|
|
1989
|
+
) {
|
|
1990
|
+
return "adaptive";
|
|
1991
|
+
}
|
|
1992
|
+
if (!targetModel.reasoning) {
|
|
1950
1993
|
return this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;
|
|
1951
1994
|
}
|
|
1952
1995
|
return this.thinkingLevel;
|
|
@@ -7,7 +7,7 @@ import test from "node:test";
|
|
|
7
7
|
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
8
8
|
import { SettingsManager } from "./settings-manager.js";
|
|
9
9
|
|
|
10
|
-
test("resource loader reads global
|
|
10
|
+
test("resource loader reads global LSD.md from the app root", async (t) => {
|
|
11
11
|
const tmp = mkdtempSync(join(tmpdir(), "resource-loader-lsd-md-"));
|
|
12
12
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
13
13
|
|
|
@@ -16,7 +16,7 @@ test("resource loader reads global lsd.md from the app root", async (t) => {
|
|
|
16
16
|
const cwd = join(tmp, "project");
|
|
17
17
|
mkdirSync(agentDir, { recursive: true });
|
|
18
18
|
mkdirSync(cwd, { recursive: true });
|
|
19
|
-
writeFileSync(join(appRoot, "
|
|
19
|
+
writeFileSync(join(appRoot, "LSD.md"), "# global lsd\n", "utf-8");
|
|
20
20
|
|
|
21
21
|
const loader = new DefaultResourceLoader({
|
|
22
22
|
cwd,
|
|
@@ -31,11 +31,11 @@ test("resource loader reads global lsd.md from the app root", async (t) => {
|
|
|
31
31
|
|
|
32
32
|
const contextFiles = loader.getAgentsFiles().agentsFiles;
|
|
33
33
|
assert.equal(contextFiles.length, 1);
|
|
34
|
-
assert.equal(contextFiles[0]?.path, join(appRoot, "
|
|
34
|
+
assert.equal(contextFiles[0]?.path, join(appRoot, "LSD.md"));
|
|
35
35
|
assert.equal(contextFiles[0]?.content, "# global lsd\n");
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
-
test("resource loader
|
|
38
|
+
test("resource loader uses project LSD.md before CLAUDE.md or AGENTS.md in the same directory", async (t) => {
|
|
39
39
|
const tmp = mkdtempSync(join(tmpdir(), "resource-loader-lsd-md-"));
|
|
40
40
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
41
41
|
|
|
@@ -44,9 +44,9 @@ test("resource loader reads ancestor .lsd/lsd.md before AGENTS.md in the same di
|
|
|
44
44
|
const projectRoot = join(tmp, "project");
|
|
45
45
|
const cwd = join(projectRoot, "src", "feature");
|
|
46
46
|
mkdirSync(agentDir, { recursive: true });
|
|
47
|
-
mkdirSync(join(projectRoot, ".lsd"), { recursive: true });
|
|
48
47
|
mkdirSync(cwd, { recursive: true });
|
|
49
|
-
writeFileSync(join(projectRoot, ".
|
|
48
|
+
writeFileSync(join(projectRoot, "LSD.md"), "# project lsd\n", "utf-8");
|
|
49
|
+
writeFileSync(join(projectRoot, "CLAUDE.md"), "# claude fallback\n", "utf-8");
|
|
50
50
|
writeFileSync(join(projectRoot, "AGENTS.md"), "# agents fallback\n", "utf-8");
|
|
51
51
|
|
|
52
52
|
const loader = new DefaultResourceLoader({
|
|
@@ -62,6 +62,66 @@ test("resource loader reads ancestor .lsd/lsd.md before AGENTS.md in the same di
|
|
|
62
62
|
|
|
63
63
|
const contextFiles = loader.getAgentsFiles().agentsFiles;
|
|
64
64
|
assert.equal(contextFiles.length, 1);
|
|
65
|
-
assert.equal(contextFiles[0]?.path, join(projectRoot, ".
|
|
65
|
+
assert.equal(contextFiles[0]?.path, join(projectRoot, "LSD.md"));
|
|
66
66
|
assert.equal(contextFiles[0]?.content, "# project lsd\n");
|
|
67
67
|
});
|
|
68
|
+
|
|
69
|
+
test("resource loader loads both global and project LSD.md files", async (t) => {
|
|
70
|
+
const tmp = mkdtempSync(join(tmpdir(), "resource-loader-lsd-md-"));
|
|
71
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
72
|
+
|
|
73
|
+
const appRoot = join(tmp, ".lsd");
|
|
74
|
+
const agentDir = join(appRoot, "agent");
|
|
75
|
+
const projectRoot = join(tmp, "project");
|
|
76
|
+
const cwd = join(projectRoot, "src", "feature");
|
|
77
|
+
mkdirSync(agentDir, { recursive: true });
|
|
78
|
+
mkdirSync(cwd, { recursive: true });
|
|
79
|
+
writeFileSync(join(appRoot, "LSD.md"), "# global lsd\n", "utf-8");
|
|
80
|
+
writeFileSync(join(projectRoot, "LSD.md"), "# project lsd\n", "utf-8");
|
|
81
|
+
|
|
82
|
+
const loader = new DefaultResourceLoader({
|
|
83
|
+
cwd,
|
|
84
|
+
agentDir,
|
|
85
|
+
settingsManager: SettingsManager.inMemory(),
|
|
86
|
+
noExtensions: true,
|
|
87
|
+
noSkills: true,
|
|
88
|
+
noPromptTemplates: true,
|
|
89
|
+
noThemes: true,
|
|
90
|
+
});
|
|
91
|
+
await loader.reload();
|
|
92
|
+
|
|
93
|
+
const contextFiles = loader.getAgentsFiles().agentsFiles;
|
|
94
|
+
assert.equal(contextFiles.length, 2);
|
|
95
|
+
assert.equal(contextFiles[0]?.path, join(appRoot, "LSD.md"));
|
|
96
|
+
assert.equal(contextFiles[1]?.path, join(projectRoot, "LSD.md"));
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("resource loader falls back to CLAUDE.md when no LSD.md exists", async (t) => {
|
|
100
|
+
const tmp = mkdtempSync(join(tmpdir(), "resource-loader-lsd-md-"));
|
|
101
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
102
|
+
|
|
103
|
+
const appRoot = join(tmp, ".lsd");
|
|
104
|
+
const agentDir = join(appRoot, "agent");
|
|
105
|
+
const projectRoot = join(tmp, "project");
|
|
106
|
+
const cwd = join(projectRoot, "src", "feature");
|
|
107
|
+
mkdirSync(agentDir, { recursive: true });
|
|
108
|
+
mkdirSync(cwd, { recursive: true });
|
|
109
|
+
writeFileSync(join(projectRoot, "CLAUDE.md"), "# claude fallback\n", "utf-8");
|
|
110
|
+
writeFileSync(join(projectRoot, "AGENTS.md"), "# agents fallback\n", "utf-8");
|
|
111
|
+
|
|
112
|
+
const loader = new DefaultResourceLoader({
|
|
113
|
+
cwd,
|
|
114
|
+
agentDir,
|
|
115
|
+
settingsManager: SettingsManager.inMemory(),
|
|
116
|
+
noExtensions: true,
|
|
117
|
+
noSkills: true,
|
|
118
|
+
noPromptTemplates: true,
|
|
119
|
+
noThemes: true,
|
|
120
|
+
});
|
|
121
|
+
await loader.reload();
|
|
122
|
+
|
|
123
|
+
const contextFiles = loader.getAgentsFiles().agentsFiles;
|
|
124
|
+
assert.equal(contextFiles.length, 1);
|
|
125
|
+
assert.equal(contextFiles[0]?.path, join(projectRoot, "CLAUDE.md"));
|
|
126
|
+
assert.equal(contextFiles[0]?.content, "# claude fallback\n");
|
|
127
|
+
});
|
|
@@ -71,14 +71,14 @@ function tryReadContextFile(filePath: string): { path: string; content: string }
|
|
|
71
71
|
|
|
72
72
|
function loadContextFileFromDir(dir: string): { path: string; content: string } | null {
|
|
73
73
|
const candidates = [
|
|
74
|
-
join(dir, "lsd.md"),
|
|
75
|
-
join(dir, ".lsd", "lsd.md"),
|
|
76
|
-
join(dir, CONFIG_DIR_NAME, "lsd.md"),
|
|
77
74
|
join(dir, "LSD.md"),
|
|
78
75
|
join(dir, ".lsd", "LSD.md"),
|
|
79
76
|
join(dir, CONFIG_DIR_NAME, "LSD.md"),
|
|
80
|
-
join(dir, "
|
|
77
|
+
join(dir, "lsd.md"),
|
|
78
|
+
join(dir, ".lsd", "lsd.md"),
|
|
79
|
+
join(dir, CONFIG_DIR_NAME, "lsd.md"),
|
|
81
80
|
join(dir, "CLAUDE.md"),
|
|
81
|
+
join(dir, "AGENTS.md"),
|
|
82
82
|
];
|
|
83
83
|
for (const filePath of new Set(candidates)) {
|
|
84
84
|
const loaded = tryReadContextFile(filePath);
|
|
@@ -80,3 +80,103 @@ test("createAgentSession restores last session model even when API key cannot be
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
});
|
|
83
|
+
|
|
84
|
+
test("createAgentSession defaults to adaptive for supported Anthropic models when enabled", async () => {
|
|
85
|
+
const tempDir = join(
|
|
86
|
+
process.cwd(),
|
|
87
|
+
".tmp-tests",
|
|
88
|
+
`sdk-anthropic-adaptive-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
89
|
+
);
|
|
90
|
+
mkdirSync(tempDir, { recursive: true });
|
|
91
|
+
tempDirs.push(tempDir);
|
|
92
|
+
|
|
93
|
+
const authStorage = AuthStorage.inMemory({
|
|
94
|
+
anthropic: { type: "api_key", key: "test-anthropic-key" },
|
|
95
|
+
});
|
|
96
|
+
const modelRegistry = new ModelRegistry(authStorage, join(tempDir, "models.json"));
|
|
97
|
+
const settingsManager = SettingsManager.inMemory();
|
|
98
|
+
settingsManager.setDefaultModelAndProvider("anthropic", "claude-sonnet-4-6");
|
|
99
|
+
settingsManager.setDefaultThinkingLevel("high");
|
|
100
|
+
settingsManager.setAnthropicAdaptiveByDefault(true);
|
|
101
|
+
const sessionManager = SessionManager.inMemory(tempDir);
|
|
102
|
+
const resourceLoader = new DefaultResourceLoader({
|
|
103
|
+
cwd: tempDir,
|
|
104
|
+
agentDir: tempDir,
|
|
105
|
+
settingsManager,
|
|
106
|
+
noExtensions: true,
|
|
107
|
+
noSkills: true,
|
|
108
|
+
noPromptTemplates: true,
|
|
109
|
+
noThemes: true,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const { session } = await createAgentSession({
|
|
113
|
+
cwd: tempDir,
|
|
114
|
+
agentDir: tempDir,
|
|
115
|
+
authStorage,
|
|
116
|
+
modelRegistry,
|
|
117
|
+
settingsManager,
|
|
118
|
+
sessionManager,
|
|
119
|
+
resourceLoader,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
assert.equal(session.model?.provider, "anthropic");
|
|
123
|
+
assert.equal(session.model?.id, "claude-sonnet-4-6");
|
|
124
|
+
assert.equal(session.thinkingLevel, "adaptive");
|
|
125
|
+
assert.equal(settingsManager.getDefaultThinkingLevel(), "high");
|
|
126
|
+
session.dispose();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("AgentSession switches supported Anthropic models to adaptive when the setting is enabled", async () => {
|
|
130
|
+
const tempDir = join(
|
|
131
|
+
process.cwd(),
|
|
132
|
+
".tmp-tests",
|
|
133
|
+
`sdk-anthropic-switch-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
134
|
+
);
|
|
135
|
+
mkdirSync(tempDir, { recursive: true });
|
|
136
|
+
tempDirs.push(tempDir);
|
|
137
|
+
|
|
138
|
+
const authStorage = AuthStorage.inMemory({
|
|
139
|
+
anthropic: { type: "api_key", key: "test-anthropic-key" },
|
|
140
|
+
openai: { type: "api_key", key: "test-openai-key" },
|
|
141
|
+
});
|
|
142
|
+
const modelRegistry = new ModelRegistry(authStorage, join(tempDir, "models.json"));
|
|
143
|
+
const settingsManager = SettingsManager.inMemory();
|
|
144
|
+
settingsManager.setDefaultModelAndProvider("openai", "gpt-5.4");
|
|
145
|
+
settingsManager.setDefaultThinkingLevel("high");
|
|
146
|
+
settingsManager.setAnthropicAdaptiveByDefault(true);
|
|
147
|
+
const sessionManager = SessionManager.inMemory(tempDir);
|
|
148
|
+
const resourceLoader = new DefaultResourceLoader({
|
|
149
|
+
cwd: tempDir,
|
|
150
|
+
agentDir: tempDir,
|
|
151
|
+
settingsManager,
|
|
152
|
+
noExtensions: true,
|
|
153
|
+
noSkills: true,
|
|
154
|
+
noPromptTemplates: true,
|
|
155
|
+
noThemes: true,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const { session } = await createAgentSession({
|
|
159
|
+
cwd: tempDir,
|
|
160
|
+
agentDir: tempDir,
|
|
161
|
+
authStorage,
|
|
162
|
+
modelRegistry,
|
|
163
|
+
settingsManager,
|
|
164
|
+
sessionManager,
|
|
165
|
+
resourceLoader,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
assert.equal(session.model?.provider, "openai");
|
|
169
|
+
assert.equal(session.thinkingLevel, "high");
|
|
170
|
+
|
|
171
|
+
const anthropicModel = modelRegistry.getAvailable().find((model) =>
|
|
172
|
+
model.provider === "anthropic" && model.id === "claude-sonnet-4-6"
|
|
173
|
+
);
|
|
174
|
+
if (!anthropicModel) throw new Error("expected claude-sonnet-4-6 to be available");
|
|
175
|
+
|
|
176
|
+
await session.setModel(anthropicModel);
|
|
177
|
+
|
|
178
|
+
assert.equal(session.model?.provider, "anthropic");
|
|
179
|
+
assert.equal(session.model?.id, "claude-sonnet-4-6");
|
|
180
|
+
assert.equal(session.thinkingLevel, "adaptive");
|
|
181
|
+
session.dispose();
|
|
182
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { Agent, type AgentMessage, type ThinkingLevel } from "@gsd/pi-agent-core";
|
|
3
|
-
import type
|
|
3
|
+
import { supportsAdaptiveThinking, type Message, type Model } from "@gsd/pi-ai";
|
|
4
4
|
import { getAgentDir, getDocsPath } from "../config.js";
|
|
5
5
|
import { AgentSession } from "./agent-session.js";
|
|
6
6
|
import { AuthStorage } from "./auth-storage.js";
|
|
@@ -140,6 +140,17 @@ function getDefaultAgentDir(): string {
|
|
|
140
140
|
return getAgentDir();
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
function shouldPreferAdaptiveThinkingByDefault(
|
|
144
|
+
model: Model<any> | undefined,
|
|
145
|
+
settingsManager: SettingsManager,
|
|
146
|
+
): boolean {
|
|
147
|
+
return !!model &&
|
|
148
|
+
model.provider === "anthropic" &&
|
|
149
|
+
model.reasoning === true &&
|
|
150
|
+
settingsManager.getAnthropicAdaptiveByDefault() &&
|
|
151
|
+
supportsAdaptiveThinking(model.id);
|
|
152
|
+
}
|
|
153
|
+
|
|
143
154
|
/**
|
|
144
155
|
* Create an AgentSession with the specified options.
|
|
145
156
|
*
|
|
@@ -252,6 +263,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
252
263
|
thinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;
|
|
253
264
|
}
|
|
254
265
|
|
|
266
|
+
const preferAdaptiveByDefault = shouldPreferAdaptiveThinkingByDefault(model, settingsManager);
|
|
267
|
+
if (preferAdaptiveByDefault) {
|
|
268
|
+
thinkingLevel = "adaptive";
|
|
269
|
+
}
|
|
270
|
+
|
|
255
271
|
// Clamp to model capabilities
|
|
256
272
|
if (!model || !model.reasoning) {
|
|
257
273
|
thinkingLevel = "off";
|
|
@@ -259,13 +275,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
259
275
|
|
|
260
276
|
const editMode = settingsManager.getEditMode();
|
|
261
277
|
const toolProfile = settingsManager.getToolProfile();
|
|
262
|
-
const
|
|
263
|
-
?
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
: ["read", "bash", "edit", "write", "lsp", "bg_shell", "tool_search", "tool_enable", "Skill", "subagent", "await_subagent"];
|
|
278
|
+
const balancedToolNames = editMode === "hashline"
|
|
279
|
+
? ["hashline_read", "bash", "hashline_edit", "write", "lsp", "bg_shell", "tool_search", "tool_enable", "Skill", "subagent", "await_subagent", "ask_user_questions"]
|
|
280
|
+
: ["read", "bash", "edit", "write", "lsp", "bg_shell", "tool_search", "tool_enable", "Skill", "subagent", "await_subagent", "ask_user_questions"];
|
|
281
|
+
const defaultActiveToolNames: string[] = toolProfile === "full"
|
|
282
|
+
? Object.keys(allTools)
|
|
283
|
+
: balancedToolNames;
|
|
269
284
|
const initialActiveToolNames: string[] = options.tools
|
|
270
285
|
? options.tools.map((t) => t.name).filter((n): n is string => typeof n === "string" && n in allTools)
|
|
271
286
|
: defaultActiveToolNames;
|
|
@@ -127,9 +127,12 @@ export interface Settings {
|
|
|
127
127
|
planModeReasoningModel?: string;
|
|
128
128
|
planModeReviewModel?: string;
|
|
129
129
|
planModeCodingModel?: string;
|
|
130
|
+
autoSuggestPlanMode?: boolean; // default: false — append a system-prompt instruction so the LLM proposes plan mode for large tasks
|
|
131
|
+
autoSwitchPlanModel?: boolean; // default: false — enable opusplan-style model switching (auto-switch to reasoning model on entry, new-session option on approval)
|
|
130
132
|
permissionMode?: "danger-full-access" | "accept-on-edit" | "auto" | "plan";
|
|
131
133
|
classifierModel?: string;
|
|
132
134
|
defaultThinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "adaptive";
|
|
135
|
+
anthropicAdaptiveByDefault?: boolean; // default: false — prefer adaptive thinking when using supported Anthropic models
|
|
133
136
|
transport?: TransportSetting; // default: "sse"
|
|
134
137
|
steeringMode?: "all" | "one-at-a-time";
|
|
135
138
|
followUpMode?: "all" | "one-at-a-time";
|
|
@@ -149,8 +152,8 @@ export interface Settings {
|
|
|
149
152
|
prompts?: string[]; // Array of local prompt template paths or directories
|
|
150
153
|
themes?: string[]; // Array of local theme file paths or directories
|
|
151
154
|
enableSkillCommands?: boolean; // default: true - register skills as /skill:name commands
|
|
152
|
-
toolSearch?: boolean; // legacy boolean toggle
|
|
153
|
-
toolProfile?: "
|
|
155
|
+
toolSearch?: boolean; // legacy boolean toggle from deprecated minimal profile; retained for migration only
|
|
156
|
+
toolProfile?: "balanced" | "full"; // default: "balanced"
|
|
154
157
|
terminal?: TerminalSettings;
|
|
155
158
|
images?: ImageSettings;
|
|
156
159
|
enabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)
|
|
@@ -806,6 +809,22 @@ export class SettingsManager {
|
|
|
806
809
|
this.setGlobalSetting("planModeCodingModel", modelRef.trim());
|
|
807
810
|
}
|
|
808
811
|
|
|
812
|
+
getAutoSuggestPlanMode(): boolean {
|
|
813
|
+
return this.settings.autoSuggestPlanMode ?? false;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
setAutoSuggestPlanMode(enabled: boolean): void {
|
|
817
|
+
this.setGlobalSetting("autoSuggestPlanMode", enabled);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
getAutoSwitchPlanModel(): boolean {
|
|
821
|
+
return this.settings.autoSwitchPlanModel ?? false;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
setAutoSwitchPlanModel(enabled: boolean): void {
|
|
825
|
+
this.setGlobalSetting("autoSwitchPlanModel", enabled);
|
|
826
|
+
}
|
|
827
|
+
|
|
809
828
|
setPermissionMode(mode: "danger-full-access" | "accept-on-edit" | "auto" | "plan"): void {
|
|
810
829
|
this.setGlobalSetting("permissionMode", mode);
|
|
811
830
|
}
|
|
@@ -882,6 +901,14 @@ export class SettingsManager {
|
|
|
882
901
|
this.setGlobalSetting("defaultThinkingLevel", level);
|
|
883
902
|
}
|
|
884
903
|
|
|
904
|
+
getAnthropicAdaptiveByDefault(): boolean {
|
|
905
|
+
return this.settings.anthropicAdaptiveByDefault ?? false;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
setAnthropicAdaptiveByDefault(enabled: boolean): void {
|
|
909
|
+
this.setGlobalSetting("anthropicAdaptiveByDefault", enabled);
|
|
910
|
+
}
|
|
911
|
+
|
|
885
912
|
getTransport(): TransportSetting {
|
|
886
913
|
return this.settings.transport ?? "sse";
|
|
887
914
|
}
|
|
@@ -1067,24 +1094,18 @@ export class SettingsManager {
|
|
|
1067
1094
|
this.setGlobalSetting("enableSkillCommands", enabled);
|
|
1068
1095
|
}
|
|
1069
1096
|
|
|
1070
|
-
getToolProfile(): "
|
|
1097
|
+
getToolProfile(): "balanced" | "full" {
|
|
1071
1098
|
const profile = this.settings.toolProfile;
|
|
1072
|
-
if (profile === "
|
|
1073
|
-
|
|
1099
|
+
if (profile === "balanced" || profile === "full") return profile;
|
|
1100
|
+
// Migrate legacy minimal/toolSearch settings to balanced.
|
|
1101
|
+
if (this.settings.toolSearch !== undefined) return "balanced";
|
|
1074
1102
|
return "balanced";
|
|
1075
1103
|
}
|
|
1076
1104
|
|
|
1077
|
-
setToolProfile(profile: "
|
|
1105
|
+
setToolProfile(profile: "balanced" | "full"): void {
|
|
1078
1106
|
this.setGlobalSetting("toolProfile", profile);
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
getToolSearch(): boolean {
|
|
1083
|
-
return this.getToolProfile() === "minimal";
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
setToolSearch(enabled: boolean): void {
|
|
1087
|
-
this.setToolProfile(enabled ? "minimal" : "balanced");
|
|
1107
|
+
// Keep legacy field in sync with deprecated minimal mode removal.
|
|
1108
|
+
this.setGlobalSetting("toolSearch", false);
|
|
1088
1109
|
}
|
|
1089
1110
|
|
|
1090
1111
|
getThinkingBudgets(): ThinkingBudgetsSettings | undefined {
|
|
@@ -152,6 +152,8 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
|
|
|
152
152
|
addGuideline("Be concise. Prefer short, direct answers over preamble.");
|
|
153
153
|
addGuideline("For conceptual, product, or UX questions, answer first; inspect code only if implementation detail is needed.");
|
|
154
154
|
|
|
155
|
+
const hasSubagent = tools.includes("subagent");
|
|
156
|
+
|
|
155
157
|
if (hasLsp) {
|
|
156
158
|
addGuideline(
|
|
157
159
|
"Code navigation in typed codebases: use lsp for symbols (definition, references, implementation, hover, diagnostics, rename, format). Use grep/find/ls for text patterns, filenames, and non-code files.",
|
|
@@ -160,6 +162,30 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
|
|
|
160
162
|
addGuideline("Use grep/find/ls for code search and file exploration (faster than bash, respects .gitignore)");
|
|
161
163
|
}
|
|
162
164
|
|
|
165
|
+
if (hasSubagent) {
|
|
166
|
+
addGuideline(
|
|
167
|
+
"Recon planning policy: use 0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem, and 2-4 parallel scouts only when the work spans multiple loosely-coupled subsystems.",
|
|
168
|
+
);
|
|
169
|
+
addGuideline(
|
|
170
|
+
"For broad or unfamiliar codebase exploration, delegate reconnaissance to the scout subagent before reading many files yourself. After scout returns, use lsp and targeted reads for the narrowed file set.",
|
|
171
|
+
);
|
|
172
|
+
addGuideline(
|
|
173
|
+
"Call the subagent tool directly. For one scout use { agent, task }. For several scouts use parallel mode with { tasks: [{ agent, task }, ...] }.",
|
|
174
|
+
);
|
|
175
|
+
addGuideline(
|
|
176
|
+
"Scout is for mapping and reconnaissance only — not for final review, audit, or ranked issue lists. Use it to identify relevant files, subsystems, and likely hotspots for later evaluation.",
|
|
177
|
+
);
|
|
178
|
+
addGuideline(
|
|
179
|
+
"If reconnaissance spans multiple loosely-coupled areas, prefer multiple scout subagents in parallel, each covering one subsystem, instead of one model exploring everything itself.",
|
|
180
|
+
);
|
|
181
|
+
addGuideline(
|
|
182
|
+
"For broad review or audit requests, use scout only as a prep step to map architecture and hotspots; the parent model or a reviewer should make the final judgments.",
|
|
183
|
+
);
|
|
184
|
+
addGuideline(
|
|
185
|
+
"Skip scout only when the task is clearly narrow, the relevant file is already known, or the user explicitly asked for direct inspection of a specific file.",
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
163
189
|
if (hasRead && hasEdit) {
|
|
164
190
|
addGuideline("Read files before editing them. Never use cat or sed to inspect or modify files.");
|
|
165
191
|
}
|