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.
Files changed (545) hide show
  1. package/dist/onboarding.js +3 -3
  2. package/dist/resources/agents/scout.md +6 -0
  3. package/dist/resources/extensions/slash-commands/index.js +2 -0
  4. package/dist/resources/extensions/slash-commands/init.js +47 -0
  5. package/dist/resources/extensions/slash-commands/plan.js +238 -51
  6. package/dist/resources/extensions/slash-commands/tools.js +14 -27
  7. package/dist/resources/extensions/subagent/index.js +14 -11
  8. package/dist/resources/extensions/usage/index.js +87 -36
  9. package/package.json +1 -1
  10. package/packages/pi-ai/dist/models.generated.d.ts +222 -1
  11. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  12. package/packages/pi-ai/dist/models.generated.js +227 -6
  13. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  14. package/packages/pi-ai/dist/models.test.js +28 -0
  15. package/packages/pi-ai/dist/models.test.js.map +1 -1
  16. package/packages/pi-ai/scripts/generate-models.ts +10 -100
  17. package/packages/pi-ai/src/models.generated.ts +227 -6
  18. package/packages/pi-ai/src/models.test.ts +30 -0
  19. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  20. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  21. package/packages/pi-coding-agent/dist/core/agent-session.js +39 -5
  22. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  23. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -7
  24. package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -1
  25. package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -4
  26. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  27. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -1
  28. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  29. package/packages/pi-coding-agent/dist/core/sdk.js +18 -7
  30. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  31. package/packages/pi-coding-agent/dist/core/sdk.test.js +80 -0
  32. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  33. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +12 -5
  34. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  35. package/packages/pi-coding-agent/dist/core/settings-manager.js +23 -9
  36. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  37. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  38. package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
  39. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  40. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +8 -4
  41. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  42. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +32 -5
  43. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  44. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  45. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -0
  46. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  47. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  48. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +34 -25
  49. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  50. package/packages/pi-coding-agent/dist/tests/path-display.test.js +13 -0
  51. package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -1
  52. package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts +2 -0
  53. package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts.map +1 -0
  54. package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js +15 -0
  55. package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js.map +1 -0
  56. package/packages/pi-coding-agent/package.json +1 -1
  57. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -5
  58. package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -7
  59. package/packages/pi-coding-agent/src/core/resource-loader.ts +4 -4
  60. package/packages/pi-coding-agent/src/core/sdk.test.ts +100 -0
  61. package/packages/pi-coding-agent/src/core/sdk.ts +23 -8
  62. package/packages/pi-coding-agent/src/core/settings-manager.ts +36 -15
  63. package/packages/pi-coding-agent/src/core/system-prompt.ts +26 -0
  64. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +41 -10
  65. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +11 -0
  66. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +43 -27
  67. package/packages/pi-coding-agent/src/tests/path-display.test.ts +14 -0
  68. package/pkg/package.json +1 -1
  69. package/src/resources/agents/scout.md +6 -0
  70. package/src/resources/extensions/slash-commands/index.ts +2 -0
  71. package/src/resources/extensions/slash-commands/init.ts +55 -0
  72. package/src/resources/extensions/slash-commands/plan.ts +279 -53
  73. package/src/resources/extensions/slash-commands/tools.ts +15 -29
  74. package/src/resources/extensions/subagent/index.ts +14 -11
  75. package/src/resources/extensions/usage/index.ts +92 -38
  76. package/dist/resources/agents/javascript-pro.md +0 -280
  77. package/dist/resources/agents/researcher.md +0 -29
  78. package/dist/resources/agents/teams-builder.md +0 -74
  79. package/dist/resources/agents/teams-reviewer.md +0 -113
  80. package/dist/resources/agents/typescript-pro.md +0 -255
  81. package/dist/resources/skills/accessibility/SKILL.md +0 -522
  82. package/dist/resources/skills/accessibility/references/WCAG.md +0 -162
  83. package/dist/resources/skills/core-web-vitals/SKILL.md +0 -441
  84. package/dist/resources/skills/core-web-vitals/references/LCP.md +0 -208
  85. package/dist/resources/skills/frontend-design/SKILL.md +0 -45
  86. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
  87. package/dist/resources/skills/make-interfaces-feel-better/animations.md +0 -379
  88. package/dist/resources/skills/make-interfaces-feel-better/performance.md +0 -88
  89. package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
  90. package/dist/resources/skills/make-interfaces-feel-better/typography.md +0 -123
  91. package/dist/resources/skills/react-best-practices/README.md +0 -123
  92. package/dist/resources/skills/react-best-practices/SKILL.md +0 -136
  93. package/dist/resources/skills/react-best-practices/metadata.json +0 -15
  94. package/dist/resources/skills/react-best-practices/rules/_sections.md +0 -46
  95. package/dist/resources/skills/react-best-practices/rules/_template.md +0 -28
  96. package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  97. package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
  98. package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
  99. package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
  100. package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
  101. package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
  102. package/dist/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
  103. package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  104. package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  105. package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  106. package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  107. package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  108. package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
  109. package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  110. package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
  111. package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
  112. package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  113. package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
  114. package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  115. package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  116. package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  117. package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  118. package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
  119. package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  120. package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
  121. package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  122. package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  123. package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  124. package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  125. package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
  126. package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  127. package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  128. package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  129. package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  130. package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  131. package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  132. package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  133. package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  134. package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  135. package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  136. package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  137. package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  138. package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  139. package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  140. package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  141. package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
  142. package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  143. package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  144. package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  145. package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  146. package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  147. package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
  148. package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  149. package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
  150. package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
  151. package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
  152. package/dist/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
  153. package/dist/resources/skills/userinterface-wiki/SKILL.md +0 -253
  154. package/dist/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
  155. package/dist/resources/skills/userinterface-wiki/rules/_template.md +0 -24
  156. package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
  157. package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
  158. package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
  159. package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
  160. package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
  161. package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
  162. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
  163. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
  164. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
  165. package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
  166. package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
  167. package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
  168. package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
  169. package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
  170. package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
  171. package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
  172. package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
  173. package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
  174. package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
  175. package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
  176. package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
  177. package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
  178. package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
  179. package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
  180. package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
  181. package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
  182. package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
  183. package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
  184. package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
  185. package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
  186. package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
  187. package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
  188. package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
  189. package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
  190. package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
  191. package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
  192. package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
  193. package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
  194. package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
  195. package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
  196. package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
  197. package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
  198. package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
  199. package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
  200. package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
  201. package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
  202. package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
  203. package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
  204. package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
  205. package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
  206. package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
  207. package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
  208. package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
  209. package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
  210. package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
  211. package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
  212. package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
  213. package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
  214. package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
  215. package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
  216. package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
  217. package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
  218. package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
  219. package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
  220. package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
  221. package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
  222. package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
  223. package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
  224. package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
  225. package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
  226. package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
  227. package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
  228. package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
  229. package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
  230. package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
  231. package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
  232. package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
  233. package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
  234. package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
  235. package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
  236. package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
  237. package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
  238. package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
  239. package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
  240. package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
  241. package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
  242. package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
  243. package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
  244. package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
  245. package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
  246. package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
  247. package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
  248. package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
  249. package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
  250. package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
  251. package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
  252. package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
  253. package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
  254. package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
  255. package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
  256. package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
  257. package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
  258. package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
  259. package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
  260. package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
  261. package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
  262. package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
  263. package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
  264. package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
  265. package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
  266. package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
  267. package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
  268. package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
  269. package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
  270. package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
  271. package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
  272. package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
  273. package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
  274. package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
  275. package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
  276. package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
  277. package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
  278. package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
  279. package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
  280. package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
  281. package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
  282. package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
  283. package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
  284. package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
  285. package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
  286. package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
  287. package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
  288. package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
  289. package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
  290. package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
  291. package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
  292. package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
  293. package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
  294. package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
  295. package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
  296. package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
  297. package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
  298. package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
  299. package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
  300. package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
  301. package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
  302. package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
  303. package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
  304. package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
  305. package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
  306. package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
  307. package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
  308. package/dist/resources/skills/web-design-guidelines/SKILL.md +0 -39
  309. package/dist/resources/skills/web-quality-audit/SKILL.md +0 -168
  310. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
  311. package/src/resources/agents/javascript-pro.md +0 -280
  312. package/src/resources/agents/researcher.md +0 -29
  313. package/src/resources/agents/teams-builder.md +0 -74
  314. package/src/resources/agents/teams-reviewer.md +0 -113
  315. package/src/resources/agents/typescript-pro.md +0 -255
  316. package/src/resources/skills/accessibility/SKILL.md +0 -522
  317. package/src/resources/skills/accessibility/references/WCAG.md +0 -162
  318. package/src/resources/skills/core-web-vitals/SKILL.md +0 -441
  319. package/src/resources/skills/core-web-vitals/references/LCP.md +0 -208
  320. package/src/resources/skills/frontend-design/SKILL.md +0 -45
  321. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
  322. package/src/resources/skills/make-interfaces-feel-better/animations.md +0 -379
  323. package/src/resources/skills/make-interfaces-feel-better/performance.md +0 -88
  324. package/src/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
  325. package/src/resources/skills/make-interfaces-feel-better/typography.md +0 -123
  326. package/src/resources/skills/react-best-practices/README.md +0 -123
  327. package/src/resources/skills/react-best-practices/SKILL.md +0 -136
  328. package/src/resources/skills/react-best-practices/metadata.json +0 -15
  329. package/src/resources/skills/react-best-practices/rules/_sections.md +0 -46
  330. package/src/resources/skills/react-best-practices/rules/_template.md +0 -28
  331. package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  332. package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
  333. package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
  334. package/src/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
  335. package/src/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
  336. package/src/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
  337. package/src/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
  338. package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  339. package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  340. package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  341. package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  342. package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  343. package/src/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
  344. package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  345. package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
  346. package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
  347. package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  348. package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
  349. package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  350. package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  351. package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  352. package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  353. package/src/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
  354. package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  355. package/src/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
  356. package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  357. package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  358. package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  359. package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  360. package/src/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
  361. package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  362. package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  363. package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  364. package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  365. package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  366. package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  367. package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  368. package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  369. package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  370. package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  371. package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  372. package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  373. package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  374. package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  375. package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  376. package/src/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
  377. package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  378. package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  379. package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  380. package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  381. package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  382. package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
  383. package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  384. package/src/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
  385. package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
  386. package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
  387. package/src/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
  388. package/src/resources/skills/userinterface-wiki/SKILL.md +0 -253
  389. package/src/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
  390. package/src/resources/skills/userinterface-wiki/rules/_template.md +0 -24
  391. package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
  392. package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
  393. package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
  394. package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
  395. package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
  396. package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
  397. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
  398. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
  399. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
  400. package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
  401. package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
  402. package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
  403. package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
  404. package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
  405. package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
  406. package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
  407. package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
  408. package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
  409. package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
  410. package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
  411. package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
  412. package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
  413. package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
  414. package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
  415. package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
  416. package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
  417. package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
  418. package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
  419. package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
  420. package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
  421. package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
  422. package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
  423. package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
  424. package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
  425. package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
  426. package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
  427. package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
  428. package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
  429. package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
  430. package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
  431. package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
  432. package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
  433. package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
  434. package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
  435. package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
  436. package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
  437. package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
  438. package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
  439. package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
  440. package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
  441. package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
  442. package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
  443. package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
  444. package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
  445. package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
  446. package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
  447. package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
  448. package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
  449. package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
  450. package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
  451. package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
  452. package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
  453. package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
  454. package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
  455. package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
  456. package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
  457. package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
  458. package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
  459. package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
  460. package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
  461. package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
  462. package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
  463. package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
  464. package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
  465. package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
  466. package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
  467. package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
  468. package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
  469. package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
  470. package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
  471. package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
  472. package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
  473. package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
  474. package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
  475. package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
  476. package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
  477. package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
  478. package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
  479. package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
  480. package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
  481. package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
  482. package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
  483. package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
  484. package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
  485. package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
  486. package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
  487. package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
  488. package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
  489. package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
  490. package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
  491. package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
  492. package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
  493. package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
  494. package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
  495. package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
  496. package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
  497. package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
  498. package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
  499. package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
  500. package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
  501. package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
  502. package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
  503. package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
  504. package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
  505. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
  506. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
  507. package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
  508. package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
  509. package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
  510. package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
  511. package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
  512. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
  513. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
  514. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
  515. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
  516. package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
  517. package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
  518. package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
  519. package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
  520. package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
  521. package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
  522. package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
  523. package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
  524. package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
  525. package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
  526. package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
  527. package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
  528. package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
  529. package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
  530. package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
  531. package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
  532. package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
  533. package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
  534. package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
  535. package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
  536. package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
  537. package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
  538. package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
  539. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
  540. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
  541. package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
  542. package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
  543. package/src/resources/skills/web-design-guidelines/SKILL.md +0 -39
  544. package/src/resources/skills/web-quality-audit/SKILL.md +0 -168
  545. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
@@ -296,7 +296,7 @@ export async function runOnboarding(authStorage, settingsManager) {
296
296
  summaryLines.push(`${pc.green('✓')} Budget subagent model: ${budgetModel}`);
297
297
  }
298
298
  else {
299
- summaryLines.push(`${pc.dim('↷')} Budget subagent model: app default/current model`);
299
+ summaryLines.push(`${pc.dim('↷')} Budget subagent model: app default/current model — set one to keep scout reconnaissance cheap`);
300
300
  }
301
301
  if (lspInstalled === null) {
302
302
  summaryLines.push(`${pc.dim('↷')} Language servers: skipped — run /setup to install later`);
@@ -345,9 +345,9 @@ async function runBudgetModelStep(p, pc, settingsManager) {
345
345
  if (existing) {
346
346
  options.push({ value: 'keep', label: `Keep current (${existing})`, hint: 'already configured' });
347
347
  }
348
- options.push({ value: 'default', label: 'Use current/default model', hint: 'scout falls back when no budget model is set' }, ...BUDGET_MODEL_OPTIONS, { value: 'skip', label: 'Skip for now', hint: 'change later in /settings' });
348
+ options.push({ value: 'default', label: 'Use current/default model', hint: 'works, but setting a cheap scout model keeps reconnaissance predictable' }, ...BUDGET_MODEL_OPTIONS, { value: 'skip', label: 'Skip for now', hint: 'change later in /settings' });
349
349
  const choice = await p.select({
350
- message: 'Choose a budget model for cheap subagents like scout',
350
+ message: 'Choose a budget model for cheap scout / recon subagents',
351
351
  options,
352
352
  });
353
353
  if (p.isCancel(choice) || choice === 'skip') {
@@ -9,6 +9,12 @@ You are a scout. Quickly investigate a codebase and return structured findings t
9
9
 
10
10
  Your output will be passed to an agent who has NOT seen the files you explored.
11
11
 
12
+ Scope boundary:
13
+ - Scout is for reconnaissance and mapping only.
14
+ - Do **not** perform full code review, security audit, bug triage, ranking of issues, or final recommendations as if you were the reviewer.
15
+ - If the task asks for review/audit findings, narrow your work to reconnaissance support: identify likely hotspots, relevant files, and questions/risks for a later reviewer.
16
+ - Do not present "top issues" as final judgments; present them as areas worth deeper review.
17
+
12
18
  Thoroughness (infer from task, default medium):
13
19
 
14
20
  - Quick: Targeted lookups, key files only
@@ -1,12 +1,14 @@
1
1
  import auditCommand from "./audit.js";
2
2
  import clearCommand from "./clear.js";
3
3
  import contextCommand from "./context.js";
4
+ import initCommand from "./init.js";
4
5
  import planCommand from "./plan.js";
5
6
  import toolSearchExtension from "./tools.js";
6
7
  export default function slashCommands(pi) {
7
8
  auditCommand(pi);
8
9
  clearCommand(pi);
9
10
  contextCommand(pi);
11
+ initCommand(pi);
10
12
  planCommand(pi);
11
13
  toolSearchExtension(pi);
12
14
  }
@@ -0,0 +1,47 @@
1
+ import { getAgentDir } from "@gsd/pi-coding-agent";
2
+ import { existsSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ const STARTER_CONTENT = `# Project Context
5
+
6
+ ## Overview
7
+ - Add a short description of this project and its purpose.
8
+
9
+ ## Commands
10
+ - Build:
11
+ - Test:
12
+ - Lint:
13
+
14
+ ## Conventions
15
+ - Add coding conventions, architecture notes, and review expectations.
16
+ `;
17
+ function ensureFile(filePath) {
18
+ if (existsSync(filePath)) {
19
+ return "exists";
20
+ }
21
+ writeFileSync(filePath, STARTER_CONTENT, "utf-8");
22
+ return "created";
23
+ }
24
+ export default function initCommand(pi) {
25
+ pi.registerCommand("init", {
26
+ description: "Initialize global and project LSD.md files if they do not exist",
27
+ async handler(_args, ctx) {
28
+ const globalPath = resolve(getAgentDir(), "..", "LSD.md");
29
+ const projectPath = join(ctx.cwd, "LSD.md");
30
+ const globalStatus = ensureFile(globalPath);
31
+ const projectStatus = ensureFile(projectPath);
32
+ await ctx.reload();
33
+ const lines = ["Initialized LSD.md files", ""];
34
+ lines.push(`Global: ${globalStatus === "created" ? "created" : "exists"} ${globalPath}`);
35
+ lines.push(`Project: ${projectStatus === "created" ? "created" : "exists"} ${projectPath}`);
36
+ if (globalStatus === "exists" && projectStatus === "exists") {
37
+ lines.push("");
38
+ lines.push("Nothing changed.");
39
+ }
40
+ pi.sendMessage({
41
+ customType: "init:report",
42
+ content: lines.join("\n"),
43
+ display: true,
44
+ });
45
+ },
46
+ });
47
+ }
@@ -4,6 +4,7 @@ import { join } from "node:path";
4
4
  const PLAN_ENTRY_TYPE = "plan-mode-state";
5
5
  const PLAN_APPROVAL_ACTION_QUESTION_ID = "plan_mode_approval_action";
6
6
  const PLAN_APPROVAL_PERMISSION_QUESTION_ID = "plan_mode_approval_permission";
7
+ const PLAN_SUGGEST_QUESTION_ID = "plan_mode_suggest_switch";
7
8
  const PLAN_DIR_RE = /(^|[/\\])\.(?:lsd|gsd)[/\\]plan([/\\]|$)/;
8
9
  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)/;
9
10
  const SAFE_TOOLS = new Set([
@@ -63,10 +64,12 @@ const APPROVE_AUTO_LABEL = "Auto mode";
63
64
  const APPROVE_BYPASS_LABEL = "Bypass mode";
64
65
  const APPROVE_AUTO_SUBAGENT_LABEL = "Execute with subagent in auto mode";
65
66
  const APPROVE_BYPASS_SUBAGENT_LABEL = "Execute with subagent in bypass mode";
67
+ const APPROVE_NEW_SESSION_LABEL = "New session with coding model"; // shown in second question when autoSwitchPlanModel is on
66
68
  const REVIEW_LABEL = "Let other agent review";
67
69
  const REVISE_LABEL = "Revise plan";
68
70
  const CANCEL_LABEL = "Cancel";
69
71
  const DEFAULT_PLAN_REVIEW_AGENT = "generic";
72
+ const DEFAULT_PLAN_CODING_AGENT = "worker";
70
73
  const INITIAL_STATE = {
71
74
  active: false,
72
75
  task: "",
@@ -78,6 +81,7 @@ const INITIAL_STATE = {
78
81
  };
79
82
  let state = { ...INITIAL_STATE };
80
83
  let startedFromFlag = false;
84
+ let reasoningModelSwitchDone = false;
81
85
  function isPlanModeActive() {
82
86
  return getPermissionMode() === "plan";
83
87
  }
@@ -95,6 +99,12 @@ function parseQualifiedModelRef(value) {
95
99
  return undefined;
96
100
  return { provider, id };
97
101
  }
102
+ function parseSubagentName(value) {
103
+ if (typeof value !== "string")
104
+ return undefined;
105
+ const trimmed = value.trim();
106
+ return trimmed.length > 0 ? trimmed : undefined;
107
+ }
98
108
  function readPlanModeSettings() {
99
109
  try {
100
110
  const settingsPath = join(getAgentDir(), "settings.json");
@@ -105,10 +115,13 @@ function readPlanModeSettings() {
105
115
  const reasoningModel = parseQualifiedModelRef(parsed.planModeReasoningModel);
106
116
  const reviewModel = parseQualifiedModelRef(parsed.planModeReviewModel);
107
117
  const codingModel = parseQualifiedModelRef(parsed.planModeCodingModel);
118
+ const codingSubagent = parseSubagentName(parsed.planModeCodingSubagent)
119
+ ?? parseSubagentName(parsed.planModeCodingAgent);
108
120
  return {
109
121
  reasoningModel: reasoningModel ? `${reasoningModel.provider}/${reasoningModel.id}` : undefined,
110
122
  reviewModel: reviewModel ? `${reviewModel.provider}/${reviewModel.id}` : undefined,
111
123
  codingModel: codingModel ? `${codingModel.provider}/${codingModel.id}` : undefined,
124
+ codingSubagent,
112
125
  };
113
126
  }
114
127
  catch {
@@ -124,6 +137,42 @@ export function readPlanModeReviewModel() {
124
137
  export function readPlanModeCodingModel() {
125
138
  return readPlanModeSettings().codingModel;
126
139
  }
140
+ export function readPlanModeCodingSubagent() {
141
+ return readPlanModeSettings().codingSubagent;
142
+ }
143
+ function readAutoSuggestPlanModeSetting() {
144
+ try {
145
+ const settingsPath = join(getAgentDir(), "settings.json");
146
+ if (!existsSync(settingsPath))
147
+ return false;
148
+ const raw = readFileSync(settingsPath, "utf-8");
149
+ const parsed = JSON.parse(raw);
150
+ return parsed.autoSuggestPlanMode === true;
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ }
156
+ function readAutoSwitchPlanModelSetting() {
157
+ try {
158
+ const settingsPath = join(getAgentDir(), "settings.json");
159
+ if (!existsSync(settingsPath))
160
+ return false;
161
+ const raw = readFileSync(settingsPath, "utf-8");
162
+ const parsed = JSON.parse(raw);
163
+ return parsed.autoSwitchPlanModel === true;
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ }
169
+ function buildAutoSuggestPlanModeSystemPrompt() {
170
+ return [
171
+ `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.`,
172
+ `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.`,
173
+ "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.",
174
+ ].join(" ");
175
+ }
127
176
  function sameModel(left, right) {
128
177
  return !!left && !!right && left.provider === right.provider && left.id === right.id;
129
178
  }
@@ -175,6 +224,16 @@ function restoreStateFromSession(ctx) {
175
224
  // Best-effort restore only.
176
225
  }
177
226
  }
227
+ async function enablePlanModeWithModelSwitch(pi, ctx, currentModel, next = {}) {
228
+ enablePlanMode(pi, currentModel, next);
229
+ // Signal that before_agent_start should switch to the reasoning model on next turn
230
+ reasoningModelSwitchDone = false;
231
+ if (!readAutoSwitchPlanModelSetting())
232
+ return;
233
+ if (!readPlanModeReasoningModel()) {
234
+ ctx.ui?.notify?.("OpusPlan: set a Plan reasoning model in /settings to auto-switch on entry", "info");
235
+ }
236
+ }
178
237
  function enablePlanMode(pi, currentModel, next = {}) {
179
238
  const currentMode = getPermissionMode();
180
239
  const enteringPlanMode = currentMode !== "plan";
@@ -193,6 +252,7 @@ function enablePlanMode(pi, currentModel, next = {}) {
193
252
  });
194
253
  }
195
254
  function leavePlanMode(pi, approvalStatus, nextPermissionMode, clearTask = false) {
255
+ reasoningModelSwitchDone = false;
196
256
  setPermissionModeAndEnv(nextPermissionMode);
197
257
  setState(pi, {
198
258
  active: false,
@@ -230,9 +290,10 @@ function buildExecutionKickoffMessage(options) {
230
290
  return details.join(" ");
231
291
  }
232
292
  const codingModel = readPlanModeCodingModel();
293
+ const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
233
294
  const agentInvocationInstruction = codingModel
234
- ? `Invoke the subagent tool with agent "worker" and model="${codingModel}" to implement the plan end-to-end.`
235
- : `Invoke the subagent tool with agent "worker" to implement the plan end-to-end.`;
295
+ ? `Invoke the subagent tool with exact parameters agent "${codingSubagent}" and model="${codingModel}" to implement the plan end-to-end.`
296
+ : `Invoke the subagent tool with exact parameter agent "${codingSubagent}" to implement the plan end-to-end.`;
236
297
  const details = [
237
298
  "Plan approved. Exit plan mode and execute the approved plan with a subagent now.",
238
299
  agentInvocationInstruction,
@@ -242,9 +303,34 @@ function buildExecutionKickoffMessage(options) {
242
303
  details.push(`Original task: ${task}`);
243
304
  if (state.latestPlanPath)
244
305
  details.push(`Primary plan artifact: ${state.latestPlanPath}`);
245
- details.push("After subagent completion, summarize the result and any remaining follow-ups.");
306
+ details.push("Important: if the plan is large and you estimate it would exceed a single subagent's context window (~200k tokens), " +
307
+ "split execution across multiple sequential subagents instead of one. " +
308
+ "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. " +
309
+ "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. " +
310
+ "Only split when genuinely needed — prefer a single subagent for plans that fit comfortably.");
311
+ details.push("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. " +
312
+ "(2) Then summarize what was done, what (if anything) needs follow-up, and flag any concerns found during review.");
246
313
  return details.join(" ");
247
314
  }
315
+ let pendingNewSession = null;
316
+ function scheduleNewSession(pi, ctx) {
317
+ const codingModelRef = parseQualifiedModelRef(readPlanModeCodingModel());
318
+ const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
319
+ const planPath = state.latestPlanPath;
320
+ const planContent = planPath ? readPlanArtifact(planPath) : undefined;
321
+ pendingNewSession = {
322
+ codingModelRef,
323
+ codingSubagent,
324
+ planPath,
325
+ planContent,
326
+ task: state.task,
327
+ };
328
+ leavePlanMode(pi, "approved", "auto");
329
+ ctx.ui?.notify?.("Plan approved. Starting new session…", "info");
330
+ // Trigger the internal command which has ExtensionCommandContext (ctx.newSession available).
331
+ // Must use the /prefix so tryExecuteExtensionCommand parses the name correctly.
332
+ pi.executeSlashCommand("/plan-execute-new-session");
333
+ }
248
334
  async function approvePlan(pi, ctx, permissionMode, executeWithSubagent = false) {
249
335
  const reasoningModel = parseQualifiedModelRef(readPlanModeReasoningModel());
250
336
  if (reasoningModel) {
@@ -255,7 +341,13 @@ async function approvePlan(pi, ctx, permissionMode, executeWithSubagent = false)
255
341
  targetPermissionMode: permissionMode,
256
342
  };
257
343
  leavePlanMode(pi, "approved", permissionMode);
258
- await pi.sendUserMessage(buildExecutionKickoffMessage({ permissionMode, executeWithSubagent }), { deliverAs: "followUp" });
344
+ // Deliver the kickoff as a steering message so it is injected BEFORE the LLM
345
+ // produces its next assistant turn. Using "followUp" would defer delivery
346
+ // until the agent has no more tool calls, which lets the LLM call the
347
+ // subagent tool with the default session model BEFORE it ever sees the
348
+ // explicit model="<planModeCodingModel>" instruction. Steering ensures the
349
+ // configured plan-mode coding model reaches the subagent invocation.
350
+ await pi.sendUserMessage(buildExecutionKickoffMessage({ permissionMode, executeWithSubagent }), { deliverAs: "steer" });
259
351
  }
260
352
  async function cancelPlan(pi, ctx, clearTask = true) {
261
353
  const restoreMode = state.previousMode ?? "accept-on-edit";
@@ -288,33 +380,46 @@ function readPlanArtifact(planPath) {
288
380
  return undefined;
289
381
  }
290
382
  }
291
- function buildApprovalDialogInstructions() {
383
+ function buildNewSessionOptionLabel() {
384
+ const codingModel = readPlanModeCodingModel();
385
+ const codingSubagent = readPlanModeCodingSubagent() ?? DEFAULT_PLAN_CODING_AGENT;
386
+ const modelSuffix = codingModel ? codingModel.split("/")[1] ?? codingModel : null;
387
+ // e.g. "Approve plan — new session (worker · claude-sonnet-4-6)"
388
+ // "Approve plan — new session (worker)"
389
+ const suffix = modelSuffix ? `${codingSubagent} · ${modelSuffix}` : codingSubagent;
390
+ return `${APPROVE_LABEL} — ${APPROVE_NEW_SESSION_LABEL} (${suffix})`;
391
+ }
392
+ function buildApprovalActionInstructions() {
292
393
  return [
293
- "Present approval options now using ask_user_questions with exactly two single-select questions.",
294
- `First question id: \"${PLAN_APPROVAL_ACTION_QUESTION_ID}\". Ask what to do next with the plan.`,
295
- "Use exactly these 3 options for the first question:",
296
- `1. ${APPROVE_LABEL} (Recommended)`,
297
- `2. ${REVIEW_LABEL}`,
298
- `3. ${REVISE_LABEL}`,
299
- `Second question id: \"${PLAN_APPROVAL_PERMISSION_QUESTION_ID}\". Ask which execution mode to use if the plan is approved.`,
300
- "Use exactly these 4 options for the second question:",
301
- `1. ${APPROVE_AUTO_LABEL} (Recommended)`,
302
- `2. ${APPROVE_BYPASS_LABEL}`,
303
- `3. ${APPROVE_AUTO_SUBAGENT_LABEL}`,
304
- `4. ${APPROVE_BYPASS_SUBAGENT_LABEL}`,
305
- `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.`,
306
- `If the user selects \"${REVIEW_LABEL}\" or \"${REVISE_LABEL}\", ignore the second answer for now.`,
307
- "If the dialog is dismissed or the user gives no answer, continue planning.",
394
+ "Ask for plan approval now using ask_user_questions.",
395
+ `One single-select question with id \"${PLAN_APPROVAL_ACTION_QUESTION_ID}\". Ask what to do next with the plan.`,
396
+ `Options: ${APPROVE_LABEL}, ${REVIEW_LABEL}, ${REVISE_LABEL}.`,
397
+ `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.`,
398
+ "Do not restate the plan. Just show the question.",
308
399
  ].join(" ");
309
400
  }
401
+ function buildApprovalModeInstructions() {
402
+ const autoSwitchEnabled = readAutoSwitchPlanModelSetting();
403
+ const showNewSessionOption = autoSwitchEnabled;
404
+ const newSessionLabel = buildNewSessionOptionLabel();
405
+ const options = showNewSessionOption
406
+ ? `${APPROVE_AUTO_LABEL}, ${APPROVE_BYPASS_LABEL}, ${APPROVE_AUTO_SUBAGENT_LABEL}, ${APPROVE_BYPASS_SUBAGENT_LABEL}, ${newSessionLabel}`
407
+ : `${APPROVE_AUTO_LABEL}, ${APPROVE_BYPASS_LABEL}, ${APPROVE_AUTO_SUBAGENT_LABEL}, ${APPROVE_BYPASS_SUBAGENT_LABEL}`;
408
+ return [
409
+ "Plan approved. Now ask which execution mode to use via ask_user_questions.",
410
+ `One single-select question with id \"${PLAN_APPROVAL_PERMISSION_QUESTION_ID}\".`,
411
+ `Options: ${options}.`,
412
+ ].join(" ");
413
+ }
414
+ // Keep for external callers that reference the combined form (headless path)
415
+ function buildApprovalDialogInstructions() {
416
+ return buildApprovalActionInstructions();
417
+ }
310
418
  function buildApprovalSteeringMessage(planPath) {
311
- const details = [
419
+ return [
312
420
  `Plan artifact saved at ${planPath}.`,
313
- "Do not restate the plan in a normal assistant response.",
314
- "Ask for approval now via ask_user_questions.",
315
- buildApprovalDialogInstructions(),
316
- ];
317
- return details.join("\n\n");
421
+ buildApprovalActionInstructions(),
422
+ ].join("\n\n");
318
423
  }
319
424
  function buildPlanPreviewMessage(planPath, planMarkdown) {
320
425
  const details = [
@@ -348,7 +453,7 @@ function buildReviewSteeringMessage(planPath, planMarkdown) {
348
453
  else {
349
454
  details.push(`Have the subagent read ${planPath} before reviewing it.`);
350
455
  }
351
- details.push("After the subagent responds, summarize its feedback for the user, present the current plan again, and then ask for approval again.", buildApprovalDialogInstructions());
456
+ details.push("After the subagent responds, summarize its feedback for the user, present the current plan again, and then ask for approval again.", buildApprovalActionInstructions());
352
457
  return details.join("\n\n");
353
458
  }
354
459
  function approvalSelectionToExecutionMode(selected) {
@@ -403,6 +508,9 @@ export const __testing = {
403
508
  buildApprovalSteeringMessage,
404
509
  buildPlanPreviewMessage,
405
510
  buildReviewSteeringMessage,
511
+ buildAutoSuggestPlanModeSystemPrompt,
512
+ readAutoSuggestPlanModeSetting,
513
+ PLAN_SUGGEST_QUESTION_ID,
406
514
  };
407
515
  export default function planCommand(pi) {
408
516
  pi.registerFlag("plan", {
@@ -412,16 +520,27 @@ export default function planCommand(pi) {
412
520
  pi.on("session_start", async (_event, ctx) => {
413
521
  restoreStateFromSession(ctx);
414
522
  startedFromFlag = false;
523
+ reasoningModelSwitchDone = false;
415
524
  if (state.active) {
416
525
  setPermissionModeAndEnv("plan");
417
526
  }
418
527
  });
419
- pi.on("before_agent_start", async () => {
420
- if (!isPlanModeActive())
421
- return;
422
- return {
423
- systemPrompt: buildPlanModeSystemPrompt(),
424
- };
528
+ pi.on("before_agent_start", async (_event, ctx) => {
529
+ if (isPlanModeActive()) {
530
+ // Switch to reasoning model once per plan mode activation
531
+ if (!reasoningModelSwitchDone && readAutoSwitchPlanModelSetting()) {
532
+ const reasoningModel = parseQualifiedModelRef(readPlanModeReasoningModel());
533
+ if (reasoningModel) {
534
+ reasoningModelSwitchDone = true;
535
+ await setModelIfNeeded(pi, ctx, reasoningModel);
536
+ }
537
+ }
538
+ return { systemPrompt: buildPlanModeSystemPrompt() };
539
+ }
540
+ if (readAutoSuggestPlanModeSetting()) {
541
+ return { systemPrompt: buildAutoSuggestPlanModeSystemPrompt() };
542
+ }
543
+ return;
425
544
  });
426
545
  pi.on("input", async (event, ctx) => {
427
546
  const planFlag = pi.getFlag("plan");
@@ -430,7 +549,7 @@ export default function planCommand(pi) {
430
549
  }
431
550
  startedFromFlag = true;
432
551
  ensurePlanDir();
433
- enablePlanMode(pi, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
552
+ await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
434
553
  task: event.text.trim(),
435
554
  approvalStatus: "pending",
436
555
  latestPlanPath: undefined,
@@ -492,6 +611,28 @@ export default function planCommand(pi) {
492
611
  }
493
612
  return;
494
613
  }
614
+ if (event.toolName === "ask_user_questions" && !isPlanModeActive()) {
615
+ const details = event.details;
616
+ if (!details?.cancelled && details?.response?.answers) {
617
+ const suggestAnswer = details.response.answers[PLAN_SUGGEST_QUESTION_ID];
618
+ if (suggestAnswer) {
619
+ const selected = Array.isArray(suggestAnswer.selected) ? suggestAnswer.selected[0] : suggestAnswer.selected;
620
+ if (typeof selected === "string" && selected.toLowerCase().includes("yes")) {
621
+ ensurePlanDir();
622
+ await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
623
+ task: state.task,
624
+ latestPlanPath: undefined,
625
+ approvalStatus: "pending",
626
+ targetPermissionMode: undefined,
627
+ });
628
+ ctx.ui?.notify?.("Plan mode enabled. Investigate and produce a plan before making changes.", "info");
629
+ pi.sendUserMessage("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.", { deliverAs: "steer" });
630
+ }
631
+ return;
632
+ }
633
+ }
634
+ return;
635
+ }
495
636
  if (!isPlanModeActive() || event.toolName !== "ask_user_questions")
496
637
  return;
497
638
  const details = event.details;
@@ -501,24 +642,21 @@ export default function planCommand(pi) {
501
642
  const permissionAnswer = details.response.answers[PLAN_APPROVAL_PERMISSION_QUESTION_ID];
502
643
  const actionValues = getAnswerValues(actionAnswer);
503
644
  const permissionValues = getAnswerValues(permissionAnswer);
504
- if (actionValues.length === 0 && permissionValues.length === 0)
505
- return;
506
- if (selectionRequestsCancel([...actionValues, ...permissionValues])) {
507
- await cancelPlan(pi, ctx, true);
508
- return;
509
- }
510
- const actionSelection = actionValues[0];
511
- if (!actionSelection)
512
- return;
513
- if (actionSelection.includes(APPROVE_LABEL)) {
645
+ // ── Second question answered (execution mode) ─────────────────────────
646
+ if (permissionValues.length > 0) {
647
+ if (selectionRequestsCancel(permissionValues)) {
648
+ await cancelPlan(pi, ctx, true);
649
+ return;
650
+ }
651
+ if (permissionValues[0]?.includes(APPROVE_NEW_SESSION_LABEL)) {
652
+ scheduleNewSession(pi, ctx);
653
+ return;
654
+ }
514
655
  const executionMode = approvalSelectionToExecutionMode(permissionValues[0]) ?? {
515
656
  permissionMode: DEFAULT_APPROVAL_PERMISSION_MODE,
516
657
  executeWithSubagent: false,
517
658
  };
518
- state = {
519
- ...state,
520
- targetPermissionMode: executionMode.permissionMode,
521
- };
659
+ state = { ...state, targetPermissionMode: executionMode.permissionMode };
522
660
  if (executionMode.executeWithSubagent) {
523
661
  const modeLabel = executionMode.permissionMode === "danger-full-access" ? "bypass" : "auto";
524
662
  ctx.ui?.notify?.(`Plan approved: subagent(${modeLabel})`, "info");
@@ -526,6 +664,21 @@ export default function planCommand(pi) {
526
664
  await approvePlan(pi, ctx, executionMode.permissionMode, executionMode.executeWithSubagent);
527
665
  return;
528
666
  }
667
+ // ── First question answered (action) ──────────────────────────────────
668
+ if (actionValues.length === 0)
669
+ return;
670
+ if (selectionRequestsCancel(actionValues)) {
671
+ await cancelPlan(pi, ctx, true);
672
+ return;
673
+ }
674
+ const actionSelection = actionValues[0];
675
+ if (!actionSelection)
676
+ return;
677
+ if (actionSelection.includes(APPROVE_LABEL)) {
678
+ // Steer the second question — handle in the next tool_result cycle
679
+ pi.sendUserMessage(buildApprovalModeInstructions(), { deliverAs: "steer" });
680
+ return;
681
+ }
529
682
  if (actionSelection.includes(REVIEW_LABEL)) {
530
683
  setState(pi, {
531
684
  ...state,
@@ -563,15 +716,16 @@ export default function planCommand(pi) {
563
716
  }
564
717
  ensurePlanDir();
565
718
  const task = args.trim();
566
- enablePlanMode(pi, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
719
+ await enablePlanModeWithModelSwitch(pi, ctx, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
567
720
  task,
568
721
  latestPlanPath: undefined,
569
722
  approvalStatus: "pending",
570
723
  targetPermissionMode: undefined,
571
724
  });
725
+ const reasoningModel = readAutoSwitchPlanModelSetting() ? readPlanModeReasoningModel() : undefined;
572
726
  ctx.ui.notify(task
573
- ? `Plan mode enabled. Current task: ${task}`
574
- : "Plan mode enabled. Investigation is allowed; source changes stay blocked until you exit plan mode.", "info");
727
+ ? `Plan mode enabled${reasoningModel ? ` · ${reasoningModel.split("/")[1] ?? reasoningModel}` : ""}. Current task: ${task}`
728
+ : `Plan mode enabled${reasoningModel ? ` · ${reasoningModel.split("/")[1] ?? reasoningModel}` : ""}. Investigation is allowed; source changes stay blocked until you exit plan mode.`, "info");
575
729
  },
576
730
  });
577
731
  pi.registerCommand("execute", {
@@ -597,4 +751,37 @@ export default function planCommand(pi) {
597
751
  ctx.ui.notify("Plan mode cancelled.", "info");
598
752
  },
599
753
  });
754
+ // Internal command — called by scheduleNewSession() via pi.executeSlashCommand().
755
+ // Runs in ExtensionCommandContext so ctx.newSession() is available.
756
+ pi.registerCommand("plan-execute-new-session", {
757
+ description: "Internal: execute approved plan in a new session with the coding model",
758
+ async handler(_args, ctx) {
759
+ const payload = pendingNewSession;
760
+ pendingNewSession = null;
761
+ if (!payload)
762
+ return;
763
+ // Switch to coding model first
764
+ if (payload.codingModelRef) {
765
+ await setModelIfNeeded(pi, ctx, payload.codingModelRef);
766
+ }
767
+ const result = await ctx.newSession();
768
+ if (result.cancelled)
769
+ return;
770
+ // Inject plan into the new session as a steer message
771
+ const parts = [
772
+ `Plan approved. You are acting as the ${payload.codingSubagent} agent. Implement the following plan now without re-investigating or re-planning.`,
773
+ ];
774
+ if (payload.task)
775
+ parts.push(`Original task: ${payload.task}`);
776
+ if (payload.planPath)
777
+ parts.push(`Plan artifact: ${payload.planPath}`);
778
+ if (payload.planContent) {
779
+ parts.push(`Full plan:\n\`\`\`markdown\n${payload.planContent}\n\`\`\``);
780
+ }
781
+ else if (payload.planPath) {
782
+ parts.push(`Read the plan from ${payload.planPath} before starting.`);
783
+ }
784
+ pi.sendUserMessage(parts.join("\n\n"), { deliverAs: "steer" });
785
+ },
786
+ });
600
787
  }