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
@@ -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 readPlanModeSettings(): { reasoningModel?: string; reviewModel?: string; codingModel?: string } {
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 "worker" and model="${codingModel}" to implement the plan end-to-end.`
287
- : `Invoke the subagent tool with agent "worker" to implement the plan end-to-end.`;
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("After subagent completion, summarize the result and any remaining follow-ups.");
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
- await pi.sendUserMessage(buildExecutionKickoffMessage({ permissionMode, executeWithSubagent }), { deliverAs: "followUp" });
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 buildApprovalDialogInstructions(): string {
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
- "Present approval options now using ask_user_questions with exactly two single-select questions.",
352
- `First question id: \"${PLAN_APPROVAL_ACTION_QUESTION_ID}\". Ask what to do next with the plan.`,
353
- "Use exactly these 3 options for the first question:",
354
- `1. ${APPROVE_LABEL} (Recommended)`,
355
- `2. ${REVIEW_LABEL}`,
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
- const details = [
510
+ return [
371
511
  `Plan artifact saved at ${planPath}.`,
372
- "Do not restate the plan in a normal assistant response.",
373
- "Ask for approval now via ask_user_questions.",
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
- buildApprovalDialogInstructions(),
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 (!isPlanModeActive()) return;
499
- return {
500
- systemPrompt: buildPlanModeSystemPrompt(),
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
- enablePlanMode(pi, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
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
- if (actionValues.length === 0 && permissionValues.length === 0) return;
594
-
595
- if (selectionRequestsCancel([...actionValues, ...permissionValues])) {
596
- await cancelPlan(pi, ctx, true);
597
- return;
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
- const actionSelection = actionValues[0];
601
- if (!actionSelection) return;
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
- enablePlanMode(pi, ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined, {
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
- : "Plan mode enabled. Investigation is allowed; source changes stay blocked until you exit plan mode.",
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: "Toggle lazy tool-search mode",
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 minimal Switch to the minimal core tool profile",
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 (["minimal", "core"].includes(input)) {
220
- settings.setToolProfile("minimal");
221
- const nextActive = getCoreToolNames(currentActive);
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: `Minimal tool profile active: ${pi.getActiveTools().join(", ")}`,
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 on, /tools off, /tools balanced, or /tools minimal.`,
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
  },