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
|
@@ -14,6 +14,7 @@ import { join } from "node:path";
|
|
|
14
14
|
const PLAN_ENTRY_TYPE = "plan-mode-state";
|
|
15
15
|
const PLAN_APPROVAL_ACTION_QUESTION_ID = "plan_mode_approval_action";
|
|
16
16
|
const PLAN_APPROVAL_PERMISSION_QUESTION_ID = "plan_mode_approval_permission";
|
|
17
|
+
const PLAN_SUGGEST_QUESTION_ID = "plan_mode_suggest_switch";
|
|
17
18
|
const PLAN_DIR_RE = /(^|[/\\])\.(?:lsd|gsd)[/\\]plan([/\\]|$)/;
|
|
18
19
|
const BASH_READ_ONLY_RE = /^\s*(cat|head|tail|less|more|wc|file|stat|du|df|which|type|echo|printf|ls|find|grep|rg|awk|sed\b(?!.*-i)|sort|uniq|diff|comm|tr|cut|tee\s+-a\s+\/dev\/null|git\s+(log|show|diff|status|branch|tag|remote|rev-parse|ls-files|blame|shortlog|describe|stash\s+list|config\s+--get|cat-file)|gh\s+(issue|pr|api|repo|release)\s+(view|list|diff|status|checks)|mkdir\s+-p\s+\.(?:lsd|gsd)(?:[\\/]+plan)?|rtk\s)/;
|
|
19
20
|
const SAFE_TOOLS = new Set([
|
|
@@ -73,10 +74,12 @@ const APPROVE_AUTO_LABEL = "Auto mode";
|
|
|
73
74
|
const APPROVE_BYPASS_LABEL = "Bypass mode";
|
|
74
75
|
const APPROVE_AUTO_SUBAGENT_LABEL = "Execute with subagent in auto mode";
|
|
75
76
|
const APPROVE_BYPASS_SUBAGENT_LABEL = "Execute with subagent in bypass mode";
|
|
77
|
+
const APPROVE_NEW_SESSION_LABEL = "New session with coding model"; // shown in second question when autoSwitchPlanModel is on
|
|
76
78
|
const REVIEW_LABEL = "Let other agent review";
|
|
77
79
|
const REVISE_LABEL = "Revise plan";
|
|
78
80
|
const CANCEL_LABEL = "Cancel";
|
|
79
81
|
const DEFAULT_PLAN_REVIEW_AGENT = "generic";
|
|
82
|
+
const DEFAULT_PLAN_CODING_AGENT = "worker";
|
|
80
83
|
|
|
81
84
|
type PlanApprovalStatus = "pending" | "approved" | "revising" | "cancelled";
|
|
82
85
|
type RestorablePermissionMode = Exclude<PermissionMode, "plan">;
|
|
@@ -109,6 +112,7 @@ const INITIAL_STATE: PlanModeState = {
|
|
|
109
112
|
|
|
110
113
|
let state: PlanModeState = { ...INITIAL_STATE };
|
|
111
114
|
let startedFromFlag = false;
|
|
115
|
+
let reasoningModelSwitchDone = false;
|
|
112
116
|
|
|
113
117
|
function isPlanModeActive(): boolean {
|
|
114
118
|
return getPermissionMode() === "plan";
|
|
@@ -125,7 +129,13 @@ function parseQualifiedModelRef(value: unknown): ModelRef | undefined {
|
|
|
125
129
|
return { provider, id };
|
|
126
130
|
}
|
|
127
131
|
|
|
128
|
-
function
|
|
132
|
+
function parseSubagentName(value: unknown): string | undefined {
|
|
133
|
+
if (typeof value !== "string") return undefined;
|
|
134
|
+
const trimmed = value.trim();
|
|
135
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function readPlanModeSettings(): { reasoningModel?: string; reviewModel?: string; codingModel?: string; codingSubagent?: string } {
|
|
129
139
|
try {
|
|
130
140
|
const settingsPath = join(getAgentDir(), "settings.json");
|
|
131
141
|
if (!existsSync(settingsPath)) return {};
|
|
@@ -134,14 +144,19 @@ function readPlanModeSettings(): { reasoningModel?: string; reviewModel?: string
|
|
|
134
144
|
planModeReasoningModel?: unknown;
|
|
135
145
|
planModeReviewModel?: unknown;
|
|
136
146
|
planModeCodingModel?: unknown;
|
|
147
|
+
planModeCodingSubagent?: unknown;
|
|
148
|
+
planModeCodingAgent?: unknown;
|
|
137
149
|
};
|
|
138
150
|
const reasoningModel = parseQualifiedModelRef(parsed.planModeReasoningModel);
|
|
139
151
|
const reviewModel = parseQualifiedModelRef(parsed.planModeReviewModel);
|
|
140
152
|
const codingModel = parseQualifiedModelRef(parsed.planModeCodingModel);
|
|
153
|
+
const codingSubagent = parseSubagentName(parsed.planModeCodingSubagent)
|
|
154
|
+
?? parseSubagentName(parsed.planModeCodingAgent);
|
|
141
155
|
return {
|
|
142
156
|
reasoningModel: reasoningModel ? `${reasoningModel.provider}/${reasoningModel.id}` : undefined,
|
|
143
157
|
reviewModel: reviewModel ? `${reviewModel.provider}/${reviewModel.id}` : undefined,
|
|
144
158
|
codingModel: codingModel ? `${codingModel.provider}/${codingModel.id}` : undefined,
|
|
159
|
+
codingSubagent,
|
|
145
160
|
};
|
|
146
161
|
} catch {
|
|
147
162
|
return {};
|
|
@@ -160,6 +175,42 @@ export function readPlanModeCodingModel(): string | undefined {
|
|
|
160
175
|
return readPlanModeSettings().codingModel;
|
|
161
176
|
}
|
|
162
177
|
|
|
178
|
+
export function readPlanModeCodingSubagent(): string | undefined {
|
|
179
|
+
return readPlanModeSettings().codingSubagent;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function readAutoSuggestPlanModeSetting(): boolean {
|
|
183
|
+
try {
|
|
184
|
+
const settingsPath = join(getAgentDir(), "settings.json");
|
|
185
|
+
if (!existsSync(settingsPath)) return false;
|
|
186
|
+
const raw = readFileSync(settingsPath, "utf-8");
|
|
187
|
+
const parsed = JSON.parse(raw) as { autoSuggestPlanMode?: unknown };
|
|
188
|
+
return parsed.autoSuggestPlanMode === true;
|
|
189
|
+
} catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function readAutoSwitchPlanModelSetting(): boolean {
|
|
195
|
+
try {
|
|
196
|
+
const settingsPath = join(getAgentDir(), "settings.json");
|
|
197
|
+
if (!existsSync(settingsPath)) return false;
|
|
198
|
+
const raw = readFileSync(settingsPath, "utf-8");
|
|
199
|
+
const parsed = JSON.parse(raw) as { autoSwitchPlanModel?: unknown };
|
|
200
|
+
return parsed.autoSwitchPlanModel === true;
|
|
201
|
+
} catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function buildAutoSuggestPlanModeSystemPrompt(): string {
|
|
207
|
+
return [
|
|
208
|
+
`Plan-mode suggestion: if the user's latest request describes a large, multi-step, or ambiguous task — e.g. a refactor, multi-file change, new feature, migration, or anything that benefits from upfront investigation — proactively ask whether to switch to plan mode before making any edits.`,
|
|
209
|
+
`How to suggest: call ask_user_questions with a single question. Set the question id to exactly "${PLAN_SUGGEST_QUESTION_ID}". Ask: "This looks like a complex task. Would you like to switch to plan mode first?". Provide exactly two options: "Yes, switch to plan mode" (recommended) and "No, proceed directly". Do NOT call /plan yourself — wait for the user answer and the system will handle switching automatically.`,
|
|
210
|
+
"Do not suggest plan mode for simple, single-file, or read-only tasks. Do not suggest it if the user is already in plan mode or in the middle of an implementation. Only suggest it once per distinct task.",
|
|
211
|
+
].join(" ");
|
|
212
|
+
}
|
|
213
|
+
|
|
163
214
|
function sameModel(left: ModelRef | undefined, right: ModelRef | undefined): boolean {
|
|
164
215
|
return !!left && !!right && left.provider === right.provider && left.id === right.id;
|
|
165
216
|
}
|
|
@@ -217,6 +268,24 @@ function restoreStateFromSession(ctx: ExtensionCommandContext | any): void {
|
|
|
217
268
|
}
|
|
218
269
|
}
|
|
219
270
|
|
|
271
|
+
async function enablePlanModeWithModelSwitch(
|
|
272
|
+
pi: ExtensionAPI,
|
|
273
|
+
ctx: any,
|
|
274
|
+
currentModel: ModelRef | undefined,
|
|
275
|
+
next: Partial<Pick<PlanModeState, "task" | "latestPlanPath" | "approvalStatus" | "previousMode" | "preplanModel" | "targetPermissionMode">> = {},
|
|
276
|
+
): Promise<void> {
|
|
277
|
+
enablePlanMode(pi, currentModel, next);
|
|
278
|
+
// Signal that before_agent_start should switch to the reasoning model on next turn
|
|
279
|
+
reasoningModelSwitchDone = false;
|
|
280
|
+
if (!readAutoSwitchPlanModelSetting()) return;
|
|
281
|
+
if (!readPlanModeReasoningModel()) {
|
|
282
|
+
ctx.ui?.notify?.(
|
|
283
|
+
"OpusPlan: set a Plan reasoning model in /settings to auto-switch on entry",
|
|
284
|
+
"info",
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
220
289
|
function enablePlanMode(
|
|
221
290
|
pi: ExtensionAPI,
|
|
222
291
|
currentModel: ModelRef | undefined,
|
|
@@ -246,6 +315,7 @@ function leavePlanMode(
|
|
|
246
315
|
nextPermissionMode: RestorablePermissionMode,
|
|
247
316
|
clearTask = false,
|
|
248
317
|
): RestorablePermissionMode {
|
|
318
|
+
reasoningModelSwitchDone = false;
|
|
249
319
|
setPermissionModeAndEnv(nextPermissionMode);
|
|
250
320
|
setState(pi, {
|
|
251
321
|
active: false,
|
|
@@ -282,9 +352,10 @@ function buildExecutionKickoffMessage(options: { permissionMode: RestorablePermi
|
|
|
282
352
|
}
|
|
283
353
|
|
|
284
354
|
const codingModel = readPlanModeCodingModel();
|
|
355
|
+
const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
|
|
285
356
|
const agentInvocationInstruction = codingModel
|
|
286
|
-
? `Invoke the subagent tool with agent "
|
|
287
|
-
: `Invoke the subagent tool with agent "
|
|
357
|
+
? `Invoke the subagent tool with exact parameters agent "${codingSubagent}" and model="${codingModel}" to implement the plan end-to-end.`
|
|
358
|
+
: `Invoke the subagent tool with exact parameter agent "${codingSubagent}" to implement the plan end-to-end.`;
|
|
288
359
|
|
|
289
360
|
const details: string[] = [
|
|
290
361
|
"Plan approved. Exit plan mode and execute the approved plan with a subagent now.",
|
|
@@ -293,10 +364,52 @@ function buildExecutionKickoffMessage(options: { permissionMode: RestorablePermi
|
|
|
293
364
|
];
|
|
294
365
|
if (task) details.push(`Original task: ${task}`);
|
|
295
366
|
if (state.latestPlanPath) details.push(`Primary plan artifact: ${state.latestPlanPath}`);
|
|
296
|
-
details.push(
|
|
367
|
+
details.push(
|
|
368
|
+
"Important: if the plan is large and you estimate it would exceed a single subagent's context window (~200k tokens), " +
|
|
369
|
+
"split execution across multiple sequential subagents instead of one. " +
|
|
370
|
+
"Use the subagent tool's chain mode: pass a \"chain\" array where each entry covers one self-contained phase or group of steps from the plan. " +
|
|
371
|
+
"Each chain entry should include the agent name, a focused task description for that phase, and may reference {previous} to receive the prior phase's output as handoff context. " +
|
|
372
|
+
"Only split when genuinely needed — prefer a single subagent for plans that fit comfortably.",
|
|
373
|
+
);
|
|
374
|
+
details.push(
|
|
375
|
+
"After all subagents complete: (1) do a quick review of the implementation — check that the plan steps were actually carried out, spot obvious issues or missed pieces, and verify the code compiles/passes lint if applicable. " +
|
|
376
|
+
"(2) Then summarize what was done, what (if anything) needs follow-up, and flag any concerns found during review.",
|
|
377
|
+
);
|
|
297
378
|
return details.join(" ");
|
|
298
379
|
}
|
|
299
380
|
|
|
381
|
+
// Pending new-session payload — set before triggering the internal command
|
|
382
|
+
interface PendingNewSession {
|
|
383
|
+
codingModelRef: ModelRef | undefined;
|
|
384
|
+
codingSubagent: string;
|
|
385
|
+
planPath: string | undefined;
|
|
386
|
+
planContent: string | undefined;
|
|
387
|
+
task: string;
|
|
388
|
+
}
|
|
389
|
+
let pendingNewSession: PendingNewSession | null = null;
|
|
390
|
+
|
|
391
|
+
function scheduleNewSession(pi: ExtensionAPI, ctx: any): void {
|
|
392
|
+
const codingModelRef = parseQualifiedModelRef(readPlanModeCodingModel());
|
|
393
|
+
const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
|
|
394
|
+
const planPath = state.latestPlanPath;
|
|
395
|
+
const planContent = planPath ? readPlanArtifact(planPath) : undefined;
|
|
396
|
+
|
|
397
|
+
pendingNewSession = {
|
|
398
|
+
codingModelRef,
|
|
399
|
+
codingSubagent,
|
|
400
|
+
planPath,
|
|
401
|
+
planContent,
|
|
402
|
+
task: state.task,
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
leavePlanMode(pi, "approved", "auto");
|
|
406
|
+
ctx.ui?.notify?.("Plan approved. Starting new session…", "info");
|
|
407
|
+
|
|
408
|
+
// Trigger the internal command which has ExtensionCommandContext (ctx.newSession available).
|
|
409
|
+
// Must use the /prefix so tryExecuteExtensionCommand parses the name correctly.
|
|
410
|
+
pi.executeSlashCommand("/plan-execute-new-session");
|
|
411
|
+
}
|
|
412
|
+
|
|
300
413
|
async function approvePlan(
|
|
301
414
|
pi: ExtensionAPI,
|
|
302
415
|
ctx: any,
|
|
@@ -313,7 +426,13 @@ async function approvePlan(
|
|
|
313
426
|
targetPermissionMode: permissionMode,
|
|
314
427
|
};
|
|
315
428
|
leavePlanMode(pi, "approved", permissionMode);
|
|
316
|
-
|
|
429
|
+
// Deliver the kickoff as a steering message so it is injected BEFORE the LLM
|
|
430
|
+
// produces its next assistant turn. Using "followUp" would defer delivery
|
|
431
|
+
// until the agent has no more tool calls, which lets the LLM call the
|
|
432
|
+
// subagent tool with the default session model BEFORE it ever sees the
|
|
433
|
+
// explicit model="<planModeCodingModel>" instruction. Steering ensures the
|
|
434
|
+
// configured plan-mode coding model reaches the subagent invocation.
|
|
435
|
+
await pi.sendUserMessage(buildExecutionKickoffMessage({ permissionMode, executeWithSubagent }), { deliverAs: "steer" });
|
|
317
436
|
}
|
|
318
437
|
|
|
319
438
|
async function cancelPlan(pi: ExtensionAPI, ctx: any, clearTask = true): Promise<RestorablePermissionMode> {
|
|
@@ -346,35 +465,52 @@ function readPlanArtifact(planPath: string): string | undefined {
|
|
|
346
465
|
}
|
|
347
466
|
}
|
|
348
467
|
|
|
349
|
-
function
|
|
468
|
+
function buildNewSessionOptionLabel(): string {
|
|
469
|
+
const codingModel = readPlanModeCodingModel();
|
|
470
|
+
const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
|
|
471
|
+
const modelSuffix = codingModel ? codingModel.split("/")[1] ?? codingModel : null;
|
|
472
|
+
// e.g. "Approve plan — new session (worker · claude-sonnet-4-6)"
|
|
473
|
+
// "Approve plan — new session (worker)"
|
|
474
|
+
const suffix = modelSuffix ? `${codingSubagent} · ${modelSuffix}` : codingSubagent;
|
|
475
|
+
return `${APPROVE_LABEL} — ${APPROVE_NEW_SESSION_LABEL} (${suffix})`;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
function buildApprovalActionInstructions(): string {
|
|
350
479
|
return [
|
|
351
|
-
"
|
|
352
|
-
`
|
|
353
|
-
|
|
354
|
-
`
|
|
355
|
-
|
|
356
|
-
`3. ${REVISE_LABEL}`,
|
|
357
|
-
`Second question id: \"${PLAN_APPROVAL_PERMISSION_QUESTION_ID}\". Ask which execution mode to use if the plan is approved.`,
|
|
358
|
-
"Use exactly these 4 options for the second question:",
|
|
359
|
-
`1. ${APPROVE_AUTO_LABEL} (Recommended)`,
|
|
360
|
-
`2. ${APPROVE_BYPASS_LABEL}`,
|
|
361
|
-
`3. ${APPROVE_AUTO_SUBAGENT_LABEL}`,
|
|
362
|
-
`4. ${APPROVE_BYPASS_SUBAGENT_LABEL}`,
|
|
363
|
-
`Do not include \"${CANCEL_LABEL}\" as an explicit option. If the user wants to cancel, they should choose \"None of the above\" on the first question and type \"${CANCEL_LABEL}\" in the free-text note.`,
|
|
364
|
-
`If the user selects \"${REVIEW_LABEL}\" or \"${REVISE_LABEL}\", ignore the second answer for now.`,
|
|
365
|
-
"If the dialog is dismissed or the user gives no answer, continue planning.",
|
|
480
|
+
"Ask for plan approval now using ask_user_questions.",
|
|
481
|
+
`One single-select question with id \"${PLAN_APPROVAL_ACTION_QUESTION_ID}\". Ask what to do next with the plan.`,
|
|
482
|
+
`Options: ${APPROVE_LABEL}, ${REVIEW_LABEL}, ${REVISE_LABEL}.`,
|
|
483
|
+
`Do not include \"${CANCEL_LABEL}\" as an explicit option — if the user wants to cancel they should choose \"None of the above\" and type \"${CANCEL_LABEL}\" in the note.`,
|
|
484
|
+
"Do not restate the plan. Just show the question.",
|
|
366
485
|
].join(" ");
|
|
367
486
|
}
|
|
368
487
|
|
|
488
|
+
function buildApprovalModeInstructions(): string {
|
|
489
|
+
const autoSwitchEnabled = readAutoSwitchPlanModelSetting();
|
|
490
|
+
const showNewSessionOption = autoSwitchEnabled;
|
|
491
|
+
const newSessionLabel = buildNewSessionOptionLabel();
|
|
492
|
+
|
|
493
|
+
const options = showNewSessionOption
|
|
494
|
+
? `${APPROVE_AUTO_LABEL}, ${APPROVE_BYPASS_LABEL}, ${APPROVE_AUTO_SUBAGENT_LABEL}, ${APPROVE_BYPASS_SUBAGENT_LABEL}, ${newSessionLabel}`
|
|
495
|
+
: `${APPROVE_AUTO_LABEL}, ${APPROVE_BYPASS_LABEL}, ${APPROVE_AUTO_SUBAGENT_LABEL}, ${APPROVE_BYPASS_SUBAGENT_LABEL}`;
|
|
496
|
+
|
|
497
|
+
return [
|
|
498
|
+
"Plan approved. Now ask which execution mode to use via ask_user_questions.",
|
|
499
|
+
`One single-select question with id \"${PLAN_APPROVAL_PERMISSION_QUESTION_ID}\".`,
|
|
500
|
+
`Options: ${options}.`,
|
|
501
|
+
].join(" ");
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// Keep for external callers that reference the combined form (headless path)
|
|
505
|
+
function buildApprovalDialogInstructions(): string {
|
|
506
|
+
return buildApprovalActionInstructions();
|
|
507
|
+
}
|
|
508
|
+
|
|
369
509
|
function buildApprovalSteeringMessage(planPath: string): string {
|
|
370
|
-
|
|
510
|
+
return [
|
|
371
511
|
`Plan artifact saved at ${planPath}.`,
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
buildApprovalDialogInstructions(),
|
|
375
|
-
];
|
|
376
|
-
|
|
377
|
-
return details.join("\n\n");
|
|
512
|
+
buildApprovalActionInstructions(),
|
|
513
|
+
].join("\n\n");
|
|
378
514
|
}
|
|
379
515
|
|
|
380
516
|
function buildPlanPreviewMessage(planPath: string, planMarkdown?: string): string {
|
|
@@ -420,7 +556,7 @@ function buildReviewSteeringMessage(planPath: string, planMarkdown?: string): st
|
|
|
420
556
|
|
|
421
557
|
details.push(
|
|
422
558
|
"After the subagent responds, summarize its feedback for the user, present the current plan again, and then ask for approval again.",
|
|
423
|
-
|
|
559
|
+
buildApprovalActionInstructions(),
|
|
424
560
|
);
|
|
425
561
|
|
|
426
562
|
return details.join("\n\n");
|
|
@@ -478,6 +614,9 @@ export const __testing = {
|
|
|
478
614
|
buildApprovalSteeringMessage,
|
|
479
615
|
buildPlanPreviewMessage,
|
|
480
616
|
buildReviewSteeringMessage,
|
|
617
|
+
buildAutoSuggestPlanModeSystemPrompt,
|
|
618
|
+
readAutoSuggestPlanModeSetting,
|
|
619
|
+
PLAN_SUGGEST_QUESTION_ID,
|
|
481
620
|
};
|
|
482
621
|
|
|
483
622
|
export default function planCommand(pi: ExtensionAPI) {
|
|
@@ -489,16 +628,28 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
489
628
|
pi.on("session_start", async (_event, ctx) => {
|
|
490
629
|
restoreStateFromSession(ctx);
|
|
491
630
|
startedFromFlag = false;
|
|
631
|
+
reasoningModelSwitchDone = false;
|
|
492
632
|
if (state.active) {
|
|
493
633
|
setPermissionModeAndEnv("plan");
|
|
494
634
|
}
|
|
495
635
|
});
|
|
496
636
|
|
|
497
|
-
pi.on("before_agent_start", async () => {
|
|
498
|
-
if (
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
637
|
+
pi.on("before_agent_start", async (_event, ctx) => {
|
|
638
|
+
if (isPlanModeActive()) {
|
|
639
|
+
// Switch to reasoning model once per plan mode activation
|
|
640
|
+
if (!reasoningModelSwitchDone && readAutoSwitchPlanModelSetting()) {
|
|
641
|
+
const reasoningModel = parseQualifiedModelRef(readPlanModeReasoningModel());
|
|
642
|
+
if (reasoningModel) {
|
|
643
|
+
reasoningModelSwitchDone = true;
|
|
644
|
+
await setModelIfNeeded(pi, ctx, reasoningModel);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
return { systemPrompt: buildPlanModeSystemPrompt() };
|
|
648
|
+
}
|
|
649
|
+
if (readAutoSuggestPlanModeSetting()) {
|
|
650
|
+
return { systemPrompt: buildAutoSuggestPlanModeSystemPrompt() };
|
|
651
|
+
}
|
|
652
|
+
return;
|
|
502
653
|
});
|
|
503
654
|
|
|
504
655
|
pi.on("input", async (event, ctx) => {
|
|
@@ -509,7 +660,7 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
509
660
|
|
|
510
661
|
startedFromFlag = true;
|
|
511
662
|
ensurePlanDir();
|
|
512
|
-
|
|
663
|
+
await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
|
|
513
664
|
task: event.text.trim(),
|
|
514
665
|
approvalStatus: "pending",
|
|
515
666
|
latestPlanPath: undefined,
|
|
@@ -577,6 +728,35 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
577
728
|
return;
|
|
578
729
|
}
|
|
579
730
|
|
|
731
|
+
if (event.toolName === "ask_user_questions" && !isPlanModeActive()) {
|
|
732
|
+
const details = event.details as {
|
|
733
|
+
cancelled?: boolean;
|
|
734
|
+
response?: { answers?: Record<string, AskUserAnswer> };
|
|
735
|
+
} | undefined;
|
|
736
|
+
if (!details?.cancelled && details?.response?.answers) {
|
|
737
|
+
const suggestAnswer = details.response.answers[PLAN_SUGGEST_QUESTION_ID];
|
|
738
|
+
if (suggestAnswer) {
|
|
739
|
+
const selected = Array.isArray(suggestAnswer.selected) ? suggestAnswer.selected[0] : suggestAnswer.selected;
|
|
740
|
+
if (typeof selected === "string" && selected.toLowerCase().includes("yes")) {
|
|
741
|
+
ensurePlanDir();
|
|
742
|
+
await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
|
|
743
|
+
task: state.task,
|
|
744
|
+
latestPlanPath: undefined,
|
|
745
|
+
approvalStatus: "pending",
|
|
746
|
+
targetPermissionMode: undefined,
|
|
747
|
+
});
|
|
748
|
+
ctx.ui?.notify?.("Plan mode enabled. Investigate and produce a plan before making changes.", "info");
|
|
749
|
+
pi.sendUserMessage(
|
|
750
|
+
"The user confirmed switching to plan mode. You are now in plan mode. Investigate the task and produce a persisted execution plan under .lsd/plan/ before making any source changes.",
|
|
751
|
+
{ deliverAs: "steer" },
|
|
752
|
+
);
|
|
753
|
+
}
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
|
|
580
760
|
if (!isPlanModeActive() || event.toolName !== "ask_user_questions") return;
|
|
581
761
|
|
|
582
762
|
const details = event.details as {
|
|
@@ -590,35 +770,48 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
590
770
|
const actionValues = getAnswerValues(actionAnswer);
|
|
591
771
|
const permissionValues = getAnswerValues(permissionAnswer);
|
|
592
772
|
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
773
|
+
// ── Second question answered (execution mode) ─────────────────────────
|
|
774
|
+
if (permissionValues.length > 0) {
|
|
775
|
+
if (selectionRequestsCancel(permissionValues)) {
|
|
776
|
+
await cancelPlan(pi, ctx, true);
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
599
779
|
|
|
600
|
-
|
|
601
|
-
|
|
780
|
+
if (permissionValues[0]?.includes(APPROVE_NEW_SESSION_LABEL)) {
|
|
781
|
+
scheduleNewSession(pi, ctx);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
602
784
|
|
|
603
|
-
if (actionSelection.includes(APPROVE_LABEL)) {
|
|
604
785
|
const executionMode = approvalSelectionToExecutionMode(permissionValues[0]) ?? {
|
|
605
786
|
permissionMode: DEFAULT_APPROVAL_PERMISSION_MODE,
|
|
606
787
|
executeWithSubagent: false,
|
|
607
788
|
};
|
|
608
|
-
state = {
|
|
609
|
-
...state,
|
|
610
|
-
targetPermissionMode: executionMode.permissionMode,
|
|
611
|
-
};
|
|
612
|
-
|
|
789
|
+
state = { ...state, targetPermissionMode: executionMode.permissionMode };
|
|
613
790
|
if (executionMode.executeWithSubagent) {
|
|
614
791
|
const modeLabel = executionMode.permissionMode === "danger-full-access" ? "bypass" : "auto";
|
|
615
792
|
ctx.ui?.notify?.(`Plan approved: subagent(${modeLabel})`, "info");
|
|
616
793
|
}
|
|
617
|
-
|
|
618
794
|
await approvePlan(pi, ctx, executionMode.permissionMode, executionMode.executeWithSubagent);
|
|
619
795
|
return;
|
|
620
796
|
}
|
|
621
797
|
|
|
798
|
+
// ── First question answered (action) ──────────────────────────────────
|
|
799
|
+
if (actionValues.length === 0) return;
|
|
800
|
+
|
|
801
|
+
if (selectionRequestsCancel(actionValues)) {
|
|
802
|
+
await cancelPlan(pi, ctx, true);
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
const actionSelection = actionValues[0];
|
|
807
|
+
if (!actionSelection) return;
|
|
808
|
+
|
|
809
|
+
if (actionSelection.includes(APPROVE_LABEL)) {
|
|
810
|
+
// Steer the second question — handle in the next tool_result cycle
|
|
811
|
+
pi.sendUserMessage(buildApprovalModeInstructions(), { deliverAs: "steer" });
|
|
812
|
+
return;
|
|
813
|
+
}
|
|
814
|
+
|
|
622
815
|
if (actionSelection.includes(REVIEW_LABEL)) {
|
|
623
816
|
setState(pi, {
|
|
624
817
|
...state,
|
|
@@ -660,16 +853,17 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
660
853
|
|
|
661
854
|
ensurePlanDir();
|
|
662
855
|
const task = args.trim();
|
|
663
|
-
|
|
856
|
+
await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
|
|
664
857
|
task,
|
|
665
858
|
latestPlanPath: undefined,
|
|
666
859
|
approvalStatus: "pending",
|
|
667
860
|
targetPermissionMode: undefined,
|
|
668
861
|
});
|
|
862
|
+
const reasoningModel = readAutoSwitchPlanModelSetting() ? readPlanModeReasoningModel() : undefined;
|
|
669
863
|
ctx.ui.notify(
|
|
670
864
|
task
|
|
671
|
-
? `Plan mode enabled. Current task: ${task}`
|
|
672
|
-
:
|
|
865
|
+
? `Plan mode enabled${reasoningModel ? ` · ${reasoningModel.split("/")[1] ?? reasoningModel}` : ""}. Current task: ${task}`
|
|
866
|
+
: `Plan mode enabled${reasoningModel ? ` · ${reasoningModel.split("/")[1] ?? reasoningModel}` : ""}. Investigation is allowed; source changes stay blocked until you exit plan mode.`,
|
|
673
867
|
"info",
|
|
674
868
|
);
|
|
675
869
|
},
|
|
@@ -698,4 +892,36 @@ export default function planCommand(pi: ExtensionAPI) {
|
|
|
698
892
|
ctx.ui.notify("Plan mode cancelled.", "info");
|
|
699
893
|
},
|
|
700
894
|
});
|
|
895
|
+
|
|
896
|
+
// Internal command — called by scheduleNewSession() via pi.executeSlashCommand().
|
|
897
|
+
// Runs in ExtensionCommandContext so ctx.newSession() is available.
|
|
898
|
+
pi.registerCommand("plan-execute-new-session", {
|
|
899
|
+
description: "Internal: execute approved plan in a new session with the coding model",
|
|
900
|
+
async handler(_args: string, ctx: ExtensionCommandContext) {
|
|
901
|
+
const payload = pendingNewSession;
|
|
902
|
+
pendingNewSession = null;
|
|
903
|
+
if (!payload) return;
|
|
904
|
+
|
|
905
|
+
// Switch to coding model first
|
|
906
|
+
if (payload.codingModelRef) {
|
|
907
|
+
await setModelIfNeeded(pi, ctx, payload.codingModelRef);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
const result = await ctx.newSession();
|
|
911
|
+
if (result.cancelled) return;
|
|
912
|
+
|
|
913
|
+
// Inject plan into the new session as a steer message
|
|
914
|
+
const parts: string[] = [
|
|
915
|
+
`Plan approved. You are acting as the ${payload.codingSubagent} agent. Implement the following plan now without re-investigating or re-planning.`,
|
|
916
|
+
];
|
|
917
|
+
if (payload.task) parts.push(`Original task: ${payload.task}`);
|
|
918
|
+
if (payload.planPath) parts.push(`Plan artifact: ${payload.planPath}`);
|
|
919
|
+
if (payload.planContent) {
|
|
920
|
+
parts.push(`Full plan:\n\`\`\`markdown\n${payload.planContent}\n\`\`\``);
|
|
921
|
+
} else if (payload.planPath) {
|
|
922
|
+
parts.push(`Read the plan from ${payload.planPath} before starting.`);
|
|
923
|
+
}
|
|
924
|
+
pi.sendUserMessage(parts.join("\n\n"), { deliverAs: "steer" });
|
|
925
|
+
},
|
|
926
|
+
});
|
|
701
927
|
}
|
|
@@ -16,12 +16,6 @@ function isHashlineMode(activeToolNames: string[]): boolean {
|
|
|
16
16
|
return activeToolNames.includes("hashline_read") || activeToolNames.includes("hashline_edit");
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
function getCoreToolNames(activeToolNames: string[]): string[] {
|
|
20
|
-
return isHashlineMode(activeToolNames)
|
|
21
|
-
? ["hashline_read", "bash", "lsp", "tool_search", "tool_enable"]
|
|
22
|
-
: ["read", "bash", "lsp", "tool_search", "tool_enable"];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
19
|
function getBalancedToolNames(activeToolNames: string[]): string[] {
|
|
26
20
|
return isHashlineMode(activeToolNames)
|
|
27
21
|
? [
|
|
@@ -36,6 +30,7 @@ function getBalancedToolNames(activeToolNames: string[]): string[] {
|
|
|
36
30
|
"Skill",
|
|
37
31
|
"subagent",
|
|
38
32
|
"await_subagent",
|
|
33
|
+
"ask_user_questions",
|
|
39
34
|
]
|
|
40
35
|
: [
|
|
41
36
|
"read",
|
|
@@ -49,9 +44,14 @@ function getBalancedToolNames(activeToolNames: string[]): string[] {
|
|
|
49
44
|
"Skill",
|
|
50
45
|
"subagent",
|
|
51
46
|
"await_subagent",
|
|
47
|
+
"ask_user_questions",
|
|
52
48
|
];
|
|
53
49
|
}
|
|
54
50
|
|
|
51
|
+
function getFullToolNames(pi: ExtensionAPI): string[] {
|
|
52
|
+
return pi.getAllTools().map((tool) => tool.name).filter((name): name is string => Boolean(name));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
55
|
function scoreTool(query: string, tool: { name?: string; description?: string }): number {
|
|
56
56
|
const name = (tool.name ?? "").toLowerCase();
|
|
57
57
|
const description = (tool.description ?? "").toLowerCase();
|
|
@@ -164,46 +164,32 @@ export default function toolSearchExtension(pi: ExtensionAPI) {
|
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
pi.registerCommand("tools", {
|
|
167
|
-
description: "
|
|
167
|
+
description: "Manage default tool profiles",
|
|
168
168
|
handler: async (args: string, _ctx: ExtensionCommandContext) => {
|
|
169
169
|
const input = args.trim();
|
|
170
170
|
const settings = getSettingsManager();
|
|
171
171
|
const currentActive = pi.getActiveTools();
|
|
172
172
|
const toolProfile = settings.getToolProfile();
|
|
173
|
-
const toolSearchEnabled = toolProfile === "minimal";
|
|
174
173
|
|
|
175
174
|
if (!input) {
|
|
176
175
|
pi.sendMessage({
|
|
177
176
|
customType: "tools:status",
|
|
178
177
|
content: [
|
|
179
178
|
`Tool profile: ${toolProfile}`,
|
|
180
|
-
`Tool search mode: ${toolSearchEnabled ? "on" : "off"}`,
|
|
181
179
|
`Active tools: ${currentActive.length}`,
|
|
182
180
|
currentActive.length > 0 ? currentActive.join(", ") : "(none)",
|
|
183
181
|
"",
|
|
184
182
|
"Usage:",
|
|
185
|
-
" /tools on Enable lazy tool-search mode and switch to a small core tool set",
|
|
186
|
-
" /tools off Disable lazy tool-search mode and restore the balanced tool profile",
|
|
187
183
|
" /tools balanced Switch to the balanced tool profile",
|
|
188
|
-
" /tools
|
|
184
|
+
" /tools full Switch to the full tool profile (all available tools)",
|
|
185
|
+
" /tools on Alias for /tools full",
|
|
186
|
+
" /tools off Alias for /tools balanced",
|
|
189
187
|
].join("\n"),
|
|
190
188
|
display: true,
|
|
191
189
|
});
|
|
192
190
|
return;
|
|
193
191
|
}
|
|
194
192
|
|
|
195
|
-
if (["on", "enable", "mode on"].includes(input)) {
|
|
196
|
-
settings.setToolProfile("minimal");
|
|
197
|
-
const nextActive = getCoreToolNames(currentActive);
|
|
198
|
-
pi.setActiveTools(nextActive);
|
|
199
|
-
pi.sendMessage({
|
|
200
|
-
customType: "tools:mode",
|
|
201
|
-
content: `Tool search mode enabled. Active tools reduced to: ${pi.getActiveTools().join(", ")}`,
|
|
202
|
-
display: true,
|
|
203
|
-
});
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
193
|
if (["off", "disable", "mode off", "balanced", "default"].includes(input)) {
|
|
208
194
|
settings.setToolProfile("balanced");
|
|
209
195
|
const nextActive = getBalancedToolNames(currentActive);
|
|
@@ -216,13 +202,13 @@ export default function toolSearchExtension(pi: ExtensionAPI) {
|
|
|
216
202
|
return;
|
|
217
203
|
}
|
|
218
204
|
|
|
219
|
-
if (["
|
|
220
|
-
settings.setToolProfile("
|
|
221
|
-
const nextActive =
|
|
205
|
+
if (["on", "enable", "mode on", "full", "all"].includes(input)) {
|
|
206
|
+
settings.setToolProfile("full");
|
|
207
|
+
const nextActive = getFullToolNames(pi);
|
|
222
208
|
pi.setActiveTools(nextActive);
|
|
223
209
|
pi.sendMessage({
|
|
224
210
|
customType: "tools:mode",
|
|
225
|
-
content: `
|
|
211
|
+
content: `Full tool profile active: ${pi.getActiveTools().join(", ")}`,
|
|
226
212
|
display: true,
|
|
227
213
|
});
|
|
228
214
|
return;
|
|
@@ -230,7 +216,7 @@ export default function toolSearchExtension(pi: ExtensionAPI) {
|
|
|
230
216
|
|
|
231
217
|
pi.sendMessage({
|
|
232
218
|
customType: "tools:help",
|
|
233
|
-
content: `Unknown /tools subcommand: ${input}\n\nTry /tools, /tools
|
|
219
|
+
content: `Unknown /tools subcommand: ${input}\n\nTry /tools, /tools balanced, /tools full, /tools on, or /tools off.`,
|
|
234
220
|
display: true,
|
|
235
221
|
});
|
|
236
222
|
},
|