gsd-pi 2.28.0 → 2.29.0-dev.7612840

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 (1179) hide show
  1. package/README.md +23 -0
  2. package/dist/cli.js +20 -21
  3. package/dist/extension-discovery.d.ts +16 -0
  4. package/dist/extension-discovery.js +66 -0
  5. package/dist/headless-answers.d.ts +51 -0
  6. package/dist/headless-answers.js +224 -0
  7. package/dist/headless-context.d.ts +18 -0
  8. package/dist/headless-context.js +44 -0
  9. package/dist/headless-events.d.ts +28 -0
  10. package/dist/headless-events.js +59 -0
  11. package/dist/headless-query.d.ts +4 -0
  12. package/dist/headless-query.js +22 -4
  13. package/dist/headless-ui.d.ts +23 -0
  14. package/dist/headless-ui.js +103 -0
  15. package/dist/headless.d.ts +2 -0
  16. package/dist/headless.js +61 -183
  17. package/dist/help-text.js +4 -0
  18. package/dist/loader.js +18 -59
  19. package/dist/onboarding.js +8 -7
  20. package/dist/remote-questions-config.js +8 -3
  21. package/dist/resource-loader.d.ts +1 -6
  22. package/dist/resource-loader.js +125 -96
  23. package/dist/resources/extensions/ask-user-questions.ts +3 -2
  24. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
  25. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
  26. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
  27. package/dist/resources/extensions/bg-shell/index.ts +17 -1561
  28. package/dist/resources/extensions/bg-shell/overlay.ts +4 -0
  29. package/dist/resources/extensions/bg-shell/utilities.ts +4 -16
  30. package/dist/resources/extensions/browser-tools/capture.ts +34 -2
  31. package/dist/resources/extensions/browser-tools/lifecycle.ts +5 -5
  32. package/dist/resources/extensions/browser-tools/settle.ts +1 -1
  33. package/dist/resources/extensions/browser-tools/state.ts +5 -5
  34. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
  35. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
  36. package/dist/resources/extensions/browser-tools/tools/assertions.ts +1 -1
  37. package/dist/resources/extensions/browser-tools/tools/device.ts +1 -1
  38. package/dist/resources/extensions/browser-tools/tools/extract.ts +1 -1
  39. package/dist/resources/extensions/browser-tools/tools/navigation.ts +6 -6
  40. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
  41. package/dist/resources/extensions/browser-tools/tools/pages.ts +1 -1
  42. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
  43. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
  44. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
  45. package/dist/resources/extensions/browser-tools/utils.ts +5 -5
  46. package/dist/resources/extensions/get-secrets-from-user.ts +1 -1
  47. package/dist/resources/extensions/google-search/index.ts +21 -8
  48. package/dist/resources/extensions/gsd/activity-log.ts +2 -1
  49. package/dist/resources/extensions/gsd/atomic-write.ts +35 -0
  50. package/dist/resources/extensions/gsd/auto/session.ts +12 -0
  51. package/dist/resources/extensions/gsd/auto-dashboard.ts +84 -3
  52. package/dist/resources/extensions/gsd/auto-idempotency.ts +150 -0
  53. package/dist/resources/extensions/gsd/auto-post-unit.ts +591 -0
  54. package/dist/resources/extensions/gsd/auto-prompts.ts +116 -22
  55. package/dist/resources/extensions/gsd/auto-recovery.ts +21 -10
  56. package/dist/resources/extensions/gsd/auto-start.ts +500 -0
  57. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
  58. package/dist/resources/extensions/gsd/auto-timers.ts +223 -0
  59. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
  60. package/dist/resources/extensions/gsd/auto-verification.ts +229 -0
  61. package/dist/resources/extensions/gsd/auto-worktree-sync.ts +22 -31
  62. package/dist/resources/extensions/gsd/auto-worktree.ts +83 -67
  63. package/dist/resources/extensions/gsd/auto.ts +375 -1890
  64. package/dist/resources/extensions/gsd/commands-config.ts +102 -0
  65. package/dist/resources/extensions/gsd/commands-handlers.ts +375 -0
  66. package/dist/resources/extensions/gsd/commands-inspect.ts +90 -0
  67. package/dist/resources/extensions/gsd/commands-logs.ts +537 -0
  68. package/dist/resources/extensions/gsd/commands-maintenance.ts +206 -0
  69. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +760 -0
  70. package/dist/resources/extensions/gsd/commands.ts +367 -1477
  71. package/dist/resources/extensions/gsd/constants.ts +21 -0
  72. package/dist/resources/extensions/gsd/context-budget.ts +25 -2
  73. package/dist/resources/extensions/gsd/crash-recovery.ts +3 -4
  74. package/dist/resources/extensions/gsd/dashboard-overlay.ts +15 -5
  75. package/dist/resources/extensions/gsd/db-writer.ts +21 -2
  76. package/dist/resources/extensions/gsd/detection.ts +469 -0
  77. package/dist/resources/extensions/gsd/diff-context.ts +2 -1
  78. package/dist/resources/extensions/gsd/dispatch-guard.ts +4 -0
  79. package/dist/resources/extensions/gsd/doctor-checks.ts +564 -0
  80. package/dist/resources/extensions/gsd/doctor-format.ts +78 -0
  81. package/dist/resources/extensions/gsd/doctor-types.ts +72 -0
  82. package/dist/resources/extensions/gsd/doctor.ts +64 -701
  83. package/dist/resources/extensions/gsd/errors.ts +0 -2
  84. package/dist/resources/extensions/gsd/export-html.ts +367 -11
  85. package/dist/resources/extensions/gsd/export.ts +31 -5
  86. package/dist/resources/extensions/gsd/files.ts +8 -126
  87. package/dist/resources/extensions/gsd/forensics.ts +2 -12
  88. package/dist/resources/extensions/gsd/git-constants.ts +11 -0
  89. package/dist/resources/extensions/gsd/git-service.ts +13 -9
  90. package/dist/resources/extensions/gsd/gsd-db.ts +26 -6
  91. package/dist/resources/extensions/gsd/guided-flow-queue.ts +451 -0
  92. package/dist/resources/extensions/gsd/guided-flow.ts +231 -514
  93. package/dist/resources/extensions/gsd/history.ts +2 -20
  94. package/dist/resources/extensions/gsd/index.ts +208 -46
  95. package/dist/resources/extensions/gsd/init-wizard.ts +615 -0
  96. package/dist/resources/extensions/gsd/json-persistence.ts +52 -0
  97. package/dist/resources/extensions/gsd/jsonl-utils.ts +21 -0
  98. package/dist/resources/extensions/gsd/key-manager.ts +995 -0
  99. package/dist/resources/extensions/gsd/metrics.ts +49 -36
  100. package/dist/resources/extensions/gsd/migrate/command.ts +1 -1
  101. package/dist/resources/extensions/gsd/migrate/parsers.ts +10 -95
  102. package/dist/resources/extensions/gsd/milestone-actions.ts +126 -0
  103. package/dist/resources/extensions/gsd/milestone-ids.ts +95 -0
  104. package/dist/resources/extensions/gsd/native-git-bridge.ts +5 -10
  105. package/dist/resources/extensions/gsd/parallel-eligibility.ts +3 -3
  106. package/dist/resources/extensions/gsd/paths.ts +1 -11
  107. package/dist/resources/extensions/gsd/plugin-importer.ts +3 -2
  108. package/dist/resources/extensions/gsd/preferences-models.ts +323 -0
  109. package/dist/resources/extensions/gsd/preferences-skills.ts +169 -0
  110. package/dist/resources/extensions/gsd/preferences-types.ts +223 -0
  111. package/dist/resources/extensions/gsd/preferences-validation.ts +597 -0
  112. package/dist/resources/extensions/gsd/preferences.ts +219 -1305
  113. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
  114. package/dist/resources/extensions/gsd/prompt-compressor.ts +508 -0
  115. package/dist/resources/extensions/gsd/prompt-loader.ts +4 -2
  116. package/dist/resources/extensions/gsd/prompt-ordering.ts +200 -0
  117. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  119. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
  120. package/dist/resources/extensions/gsd/prompts/discuss.md +13 -5
  121. package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -1
  122. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
  124. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
  125. package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -1
  126. package/dist/resources/extensions/gsd/prompts/queue.md +30 -0
  127. package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -6
  128. package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -1
  129. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
  130. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  131. package/dist/resources/extensions/gsd/provider-error-pause.ts +59 -10
  132. package/dist/resources/extensions/gsd/queue-order.ts +1 -1
  133. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
  134. package/dist/resources/extensions/gsd/quick.ts +18 -15
  135. package/dist/resources/extensions/gsd/reports.ts +1 -7
  136. package/dist/resources/extensions/gsd/routing-history.ts +13 -17
  137. package/dist/resources/extensions/gsd/safe-fs.ts +47 -0
  138. package/dist/resources/extensions/gsd/semantic-chunker.ts +336 -0
  139. package/dist/resources/extensions/gsd/session-forensics.ts +8 -23
  140. package/dist/resources/extensions/gsd/session-lock.ts +284 -0
  141. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
  142. package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
  143. package/dist/resources/extensions/gsd/state.ts +54 -2
  144. package/dist/resources/extensions/gsd/structured-data-formatter.ts +144 -0
  145. package/dist/resources/extensions/gsd/summary-distiller.ts +258 -0
  146. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
  147. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
  148. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
  149. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  150. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
  151. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
  152. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
  153. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  154. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
  155. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
  156. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
  157. package/dist/resources/extensions/gsd/tests/detection.test.ts +398 -0
  158. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
  159. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
  160. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
  161. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
  162. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
  163. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
  164. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
  165. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +122 -0
  166. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
  167. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
  168. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
  169. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
  170. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
  171. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
  172. package/dist/resources/extensions/gsd/tests/metrics.test.ts +173 -305
  173. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
  174. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
  175. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
  176. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
  177. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
  178. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  179. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
  180. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
  181. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
  182. package/dist/resources/extensions/gsd/tests/preferences.test.ts +284 -0
  183. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
  184. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
  185. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
  186. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
  187. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
  188. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
  189. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
  190. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
  191. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
  192. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
  193. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
  194. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
  195. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
  196. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
  197. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
  198. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
  199. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
  200. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  201. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
  202. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
  203. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
  204. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
  205. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
  206. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
  207. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
  208. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
  209. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
  210. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
  211. package/dist/resources/extensions/gsd/token-counter.ts +20 -0
  212. package/dist/resources/extensions/gsd/triage-ui.ts +1 -1
  213. package/dist/resources/extensions/gsd/types.ts +5 -1
  214. package/dist/resources/extensions/gsd/unit-runtime.ts +16 -13
  215. package/dist/resources/extensions/gsd/validate-directory.ts +164 -0
  216. package/dist/resources/extensions/gsd/verification-evidence.ts +9 -4
  217. package/dist/resources/extensions/gsd/verification-gate.ts +83 -7
  218. package/dist/resources/extensions/gsd/visualizer-data.ts +1 -1
  219. package/dist/resources/extensions/gsd/visualizer-overlay.ts +5 -2
  220. package/dist/resources/extensions/gsd/visualizer-views.ts +2 -3
  221. package/dist/resources/extensions/gsd/worktree-command.ts +4 -51
  222. package/dist/resources/extensions/gsd/worktree-manager.ts +7 -9
  223. package/dist/resources/extensions/gsd/worktree.ts +41 -1
  224. package/dist/resources/extensions/mcporter/index.ts +27 -14
  225. package/dist/resources/extensions/remote-questions/discord-adapter.ts +9 -20
  226. package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
  227. package/dist/resources/extensions/remote-questions/manager.ts +6 -24
  228. package/dist/resources/extensions/remote-questions/mod.ts +16 -0
  229. package/dist/resources/extensions/remote-questions/notify.ts +90 -0
  230. package/dist/resources/extensions/remote-questions/remote-command.ts +1 -1
  231. package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -18
  232. package/dist/resources/extensions/remote-questions/store.ts +5 -1
  233. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
  234. package/dist/resources/extensions/remote-questions/types.ts +29 -3
  235. package/dist/resources/extensions/search-the-web/native-search.ts +7 -0
  236. package/dist/resources/extensions/search-the-web/provider.ts +15 -3
  237. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
  238. package/dist/resources/extensions/search-the-web/tool-search.ts +1 -13
  239. package/dist/resources/extensions/shared/format-utils.ts +53 -0
  240. package/dist/resources/extensions/shared/frontmatter.ts +117 -0
  241. package/dist/resources/extensions/shared/mod.ts +33 -0
  242. package/dist/resources/extensions/shared/sanitize.ts +19 -0
  243. package/dist/resources/extensions/slash-commands/create-extension.ts +1 -1
  244. package/dist/resources/extensions/slash-commands/create-slash-command.ts +1 -1
  245. package/dist/resources/extensions/subagent/index.ts +1 -2
  246. package/dist/resources/extensions/ttsr/index.ts +5 -0
  247. package/dist/resources/extensions/ttsr/rule-loader.ts +4 -51
  248. package/dist/resources/extensions/universal-config/discovery.ts +37 -15
  249. package/dist/resources/extensions/voice/index.ts +1 -1
  250. package/dist/resources/skills/accessibility/SKILL.md +522 -0
  251. package/dist/resources/skills/accessibility/references/WCAG.md +162 -0
  252. package/dist/resources/skills/agent-browser/SKILL.md +517 -0
  253. package/dist/resources/skills/agent-browser/references/authentication.md +202 -0
  254. package/dist/resources/skills/agent-browser/references/commands.md +263 -0
  255. package/dist/resources/skills/agent-browser/references/profiling.md +120 -0
  256. package/dist/resources/skills/agent-browser/references/proxy-support.md +194 -0
  257. package/dist/resources/skills/agent-browser/references/session-management.md +193 -0
  258. package/dist/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
  259. package/dist/resources/skills/agent-browser/references/video-recording.md +173 -0
  260. package/dist/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
  261. package/dist/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
  262. package/dist/resources/skills/agent-browser/templates/form-automation.sh +62 -0
  263. package/dist/resources/skills/best-practices/SKILL.md +583 -0
  264. package/dist/resources/skills/code-optimizer/SKILL.md +160 -0
  265. package/dist/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
  266. package/dist/resources/skills/code-optimizer/references/build-compilation.md +90 -0
  267. package/dist/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
  268. package/dist/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
  269. package/dist/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
  270. package/dist/resources/skills/code-optimizer/references/config-infra.md +71 -0
  271. package/dist/resources/skills/code-optimizer/references/data-structures.md +80 -0
  272. package/dist/resources/skills/code-optimizer/references/database-queries.md +76 -0
  273. package/dist/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
  274. package/dist/resources/skills/code-optimizer/references/error-resilience.md +80 -0
  275. package/dist/resources/skills/code-optimizer/references/io-network.md +89 -0
  276. package/dist/resources/skills/code-optimizer/references/logging-observability.md +64 -0
  277. package/dist/resources/skills/code-optimizer/references/memory-resources.md +66 -0
  278. package/dist/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
  279. package/dist/resources/skills/code-optimizer/references/security-performance.md +68 -0
  280. package/dist/resources/skills/core-web-vitals/SKILL.md +441 -0
  281. package/dist/resources/skills/core-web-vitals/references/LCP.md +208 -0
  282. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
  283. package/dist/resources/skills/make-interfaces-feel-better/animations.md +379 -0
  284. package/dist/resources/skills/make-interfaces-feel-better/performance.md +88 -0
  285. package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
  286. package/dist/resources/skills/make-interfaces-feel-better/typography.md +123 -0
  287. package/dist/resources/skills/react-best-practices/README.md +123 -0
  288. package/dist/resources/skills/react-best-practices/SKILL.md +136 -0
  289. package/dist/resources/skills/react-best-practices/metadata.json +15 -0
  290. package/dist/resources/skills/react-best-practices/rules/_sections.md +46 -0
  291. package/dist/resources/skills/react-best-practices/rules/_template.md +28 -0
  292. package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  293. package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  294. package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  295. package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
  296. package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
  297. package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
  298. package/dist/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
  299. package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  300. package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  301. package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  302. package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  303. package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  304. package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
  305. package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  306. package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  307. package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  308. package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  309. package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
  310. package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  311. package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  312. package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  313. package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  314. package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
  315. package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  316. package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
  317. package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  318. package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  319. package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  320. package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  321. package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
  322. package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  323. package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  324. package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  325. package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  326. package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  327. package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  328. package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  329. package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  330. package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  331. package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  332. package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  333. package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  334. package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  335. package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  336. package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  337. package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
  338. package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  339. package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  340. package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  341. package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  342. package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  343. package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
  344. package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  345. package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
  346. package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
  347. package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  348. package/dist/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
  349. package/dist/resources/skills/userinterface-wiki/SKILL.md +253 -0
  350. package/dist/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
  351. package/dist/resources/skills/userinterface-wiki/rules/_template.md +24 -0
  352. package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  353. package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  354. package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  355. package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  356. package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  357. package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  358. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  359. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  360. package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  361. package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  362. package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  363. package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  364. package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  365. package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  366. package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  367. package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  368. package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  369. package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  370. package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  371. package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  372. package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  373. package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  374. package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  375. package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  376. package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  377. package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  378. package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  379. package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  380. package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  381. package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  382. package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  383. package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  384. package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  385. package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  386. package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  387. package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  388. package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  389. package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  390. package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  391. package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  392. package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  393. package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  394. package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  395. package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  396. package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  397. package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  398. package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  399. package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  400. package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  401. package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  402. package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  403. package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  404. package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  405. package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  406. package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  407. package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  408. package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  409. package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  410. package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  411. package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  412. package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  413. package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  414. package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  415. package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  416. package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  417. package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  418. package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  419. package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  420. package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  421. package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  422. package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  423. package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  424. package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  425. package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  426. package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  427. package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  428. package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  429. package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  430. package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  431. package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  432. package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  433. package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  434. package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  435. package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  436. package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  437. package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  438. package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  439. package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  440. package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  441. package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  442. package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  443. package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  444. package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  445. package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  446. package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  447. package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  448. package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  449. package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  450. package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  451. package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  452. package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  453. package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  454. package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  455. package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  456. package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  457. package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  458. package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  459. package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  460. package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  461. package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  462. package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  463. package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  464. package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  465. package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  466. package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  467. package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  468. package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  469. package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  470. package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  471. package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  472. package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  473. package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  474. package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  475. package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  476. package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  477. package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  478. package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  479. package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  480. package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  481. package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  482. package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  483. package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  484. package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  485. package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  486. package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  487. package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  488. package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  489. package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  490. package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  491. package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  492. package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  493. package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  494. package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  495. package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  496. package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  497. package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  498. package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  499. package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  500. package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  501. package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  502. package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  503. package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  504. package/dist/resources/skills/web-design-guidelines/SKILL.md +39 -0
  505. package/dist/resources/skills/web-quality-audit/SKILL.md +170 -0
  506. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
  507. package/package.json +22 -8
  508. package/packages/native/package.json +28 -0
  509. package/packages/pi-agent-core/package.json +6 -0
  510. package/packages/pi-ai/dist/models.generated.d.ts +43 -11
  511. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  512. package/packages/pi-ai/dist/models.generated.js +34 -26
  513. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  514. package/packages/pi-ai/dist/providers/anthropic.js +3 -2
  515. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  516. package/packages/pi-ai/dist/providers/openai-codex-responses.js +14 -4
  517. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  518. package/packages/pi-ai/oauth.d.ts +1 -0
  519. package/packages/pi-ai/oauth.js +1 -0
  520. package/packages/pi-ai/package.json +2 -2
  521. package/packages/pi-ai/src/models.generated.ts +42 -34
  522. package/packages/pi-ai/src/providers/anthropic.ts +3 -2
  523. package/packages/pi-ai/src/providers/openai-codex-responses.ts +15 -4
  524. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  525. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  526. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  527. package/packages/pi-coding-agent/dist/core/auth-storage.js +2 -1
  528. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +2 -1
  531. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  533. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +3 -2
  534. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  535. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  536. package/packages/pi-coding-agent/dist/core/compaction/utils.js +2 -2
  537. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  538. package/packages/pi-coding-agent/dist/core/constants.d.ts +29 -0
  539. package/packages/pi-coding-agent/dist/core/constants.d.ts.map +1 -0
  540. package/packages/pi-coding-agent/dist/core/constants.js +44 -0
  541. package/packages/pi-coding-agent/dist/core/constants.js.map +1 -0
  542. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  543. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  545. package/packages/pi-coding-agent/dist/core/lsp/index.js +30 -4
  546. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  547. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  548. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +13 -5
  549. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  550. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  551. package/packages/pi-coding-agent/dist/core/model-resolver.js +14 -0
  552. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  553. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  554. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +12 -4
  555. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  556. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +49 -0
  557. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  558. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  559. package/packages/pi-coding-agent/dist/core/session-manager.js +25 -2
  560. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  561. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
  562. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  563. package/packages/pi-coding-agent/dist/core/settings-manager.js +22 -5
  564. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  565. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  566. package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
  567. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  568. package/packages/pi-coding-agent/dist/core/tools/edit-diff.js +2 -2
  569. package/packages/pi-coding-agent/dist/core/tools/edit-diff.js.map +1 -1
  570. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  571. package/packages/pi-coding-agent/dist/core/tools/find.js +2 -1
  572. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  573. package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js +4 -4
  574. package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js.map +1 -1
  575. package/packages/pi-coding-agent/dist/core/tools/hashline.d.ts +1 -1
  576. package/packages/pi-coding-agent/dist/core/tools/hashline.js +1 -1
  577. package/packages/pi-coding-agent/dist/core/tools/hashline.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/core/tools/hashline.test.js +8 -8
  579. package/packages/pi-coding-agent/dist/core/tools/hashline.test.js.map +1 -1
  580. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +1 -1
  581. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -1
  582. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  583. package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts +1 -0
  584. package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
  585. package/packages/pi-coding-agent/dist/core/tools/path-utils.js +1 -1
  586. package/packages/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
  587. package/packages/pi-coding-agent/dist/core/tools/truncate.d.ts.map +1 -1
  588. package/packages/pi-coding-agent/dist/core/tools/truncate.js +2 -1
  589. package/packages/pi-coding-agent/dist/core/tools/truncate.js.map +1 -1
  590. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts +9 -0
  591. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +47 -5
  593. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
  596. package/packages/pi-coding-agent/dist/modes/interactive/components/index.js +1 -1
  597. package/packages/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +4 -4
  599. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  600. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  601. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  603. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  604. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  605. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  607. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +12 -2
  609. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  610. package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.d.ts.map +1 -1
  611. package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js +25 -3
  612. package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js.map +1 -1
  613. package/packages/pi-coding-agent/package.json +1 -5
  614. package/packages/pi-coding-agent/scripts/copy-assets.cjs +39 -8
  615. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  616. package/packages/pi-coding-agent/src/core/auth-storage.ts +2 -1
  617. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -1
  618. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -2
  619. package/packages/pi-coding-agent/src/core/compaction/utils.ts +2 -2
  620. package/packages/pi-coding-agent/src/core/constants.ts +59 -0
  621. package/packages/pi-coding-agent/src/core/extensions/loader.ts +1 -1
  622. package/packages/pi-coding-agent/src/core/lsp/index.ts +31 -5
  623. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +13 -5
  624. package/packages/pi-coding-agent/src/core/model-resolver.ts +14 -0
  625. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +58 -0
  626. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +14 -4
  627. package/packages/pi-coding-agent/src/core/session-manager.ts +29 -6
  628. package/packages/pi-coding-agent/src/core/settings-manager.ts +33 -5
  629. package/packages/pi-coding-agent/src/core/system-prompt.ts +11 -0
  630. package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +2 -2
  631. package/packages/pi-coding-agent/src/core/tools/find.ts +2 -1
  632. package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +4 -4
  633. package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +8 -8
  634. package/packages/pi-coding-agent/src/core/tools/hashline.ts +1 -1
  635. package/packages/pi-coding-agent/src/core/tools/index.ts +1 -1
  636. package/packages/pi-coding-agent/src/core/tools/path-utils.ts +1 -1
  637. package/packages/pi-coding-agent/src/core/tools/truncate.ts +3 -1
  638. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +49 -5
  639. package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +1 -1
  640. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +4 -4
  641. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  642. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +26 -0
  643. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +11 -2
  644. package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +23 -3
  645. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
  646. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
  647. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +149 -0
  648. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
  649. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
  650. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
  651. package/packages/pi-tui/dist/__tests__/fuzzy.test.js +94 -0
  652. package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
  653. package/packages/pi-tui/dist/autocomplete.d.ts +8 -1
  654. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  655. package/packages/pi-tui/dist/autocomplete.js +20 -2
  656. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  657. package/packages/pi-tui/package.json +8 -2
  658. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +186 -0
  659. package/packages/pi-tui/src/__tests__/fuzzy.test.ts +112 -0
  660. package/packages/pi-tui/src/autocomplete.ts +26 -1
  661. package/pkg/package.json +1 -1
  662. package/src/resources/extensions/ask-user-questions.ts +3 -2
  663. package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
  664. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
  665. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
  666. package/src/resources/extensions/bg-shell/index.ts +17 -1561
  667. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  668. package/src/resources/extensions/bg-shell/utilities.ts +4 -16
  669. package/src/resources/extensions/browser-tools/capture.ts +34 -2
  670. package/src/resources/extensions/browser-tools/lifecycle.ts +5 -5
  671. package/src/resources/extensions/browser-tools/settle.ts +1 -1
  672. package/src/resources/extensions/browser-tools/state.ts +5 -5
  673. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
  674. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
  675. package/src/resources/extensions/browser-tools/tools/assertions.ts +1 -1
  676. package/src/resources/extensions/browser-tools/tools/device.ts +1 -1
  677. package/src/resources/extensions/browser-tools/tools/extract.ts +1 -1
  678. package/src/resources/extensions/browser-tools/tools/navigation.ts +6 -6
  679. package/src/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
  680. package/src/resources/extensions/browser-tools/tools/pages.ts +1 -1
  681. package/src/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
  682. package/src/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
  683. package/src/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
  684. package/src/resources/extensions/browser-tools/utils.ts +5 -5
  685. package/src/resources/extensions/get-secrets-from-user.ts +1 -1
  686. package/src/resources/extensions/google-search/index.ts +21 -8
  687. package/src/resources/extensions/gsd/activity-log.ts +2 -1
  688. package/src/resources/extensions/gsd/atomic-write.ts +35 -0
  689. package/src/resources/extensions/gsd/auto/session.ts +12 -0
  690. package/src/resources/extensions/gsd/auto-dashboard.ts +84 -3
  691. package/src/resources/extensions/gsd/auto-idempotency.ts +150 -0
  692. package/src/resources/extensions/gsd/auto-post-unit.ts +591 -0
  693. package/src/resources/extensions/gsd/auto-prompts.ts +116 -22
  694. package/src/resources/extensions/gsd/auto-recovery.ts +21 -10
  695. package/src/resources/extensions/gsd/auto-start.ts +500 -0
  696. package/src/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
  697. package/src/resources/extensions/gsd/auto-timers.ts +223 -0
  698. package/src/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
  699. package/src/resources/extensions/gsd/auto-verification.ts +229 -0
  700. package/src/resources/extensions/gsd/auto-worktree-sync.ts +22 -31
  701. package/src/resources/extensions/gsd/auto-worktree.ts +83 -67
  702. package/src/resources/extensions/gsd/auto.ts +375 -1890
  703. package/src/resources/extensions/gsd/commands-config.ts +102 -0
  704. package/src/resources/extensions/gsd/commands-handlers.ts +375 -0
  705. package/src/resources/extensions/gsd/commands-inspect.ts +90 -0
  706. package/src/resources/extensions/gsd/commands-logs.ts +537 -0
  707. package/src/resources/extensions/gsd/commands-maintenance.ts +206 -0
  708. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +760 -0
  709. package/src/resources/extensions/gsd/commands.ts +367 -1477
  710. package/src/resources/extensions/gsd/constants.ts +21 -0
  711. package/src/resources/extensions/gsd/context-budget.ts +25 -2
  712. package/src/resources/extensions/gsd/crash-recovery.ts +3 -4
  713. package/src/resources/extensions/gsd/dashboard-overlay.ts +15 -5
  714. package/src/resources/extensions/gsd/db-writer.ts +21 -2
  715. package/src/resources/extensions/gsd/detection.ts +469 -0
  716. package/src/resources/extensions/gsd/diff-context.ts +2 -1
  717. package/src/resources/extensions/gsd/dispatch-guard.ts +4 -0
  718. package/src/resources/extensions/gsd/doctor-checks.ts +564 -0
  719. package/src/resources/extensions/gsd/doctor-format.ts +78 -0
  720. package/src/resources/extensions/gsd/doctor-types.ts +72 -0
  721. package/src/resources/extensions/gsd/doctor.ts +64 -701
  722. package/src/resources/extensions/gsd/errors.ts +0 -2
  723. package/src/resources/extensions/gsd/export-html.ts +367 -11
  724. package/src/resources/extensions/gsd/export.ts +31 -5
  725. package/src/resources/extensions/gsd/files.ts +8 -126
  726. package/src/resources/extensions/gsd/forensics.ts +2 -12
  727. package/src/resources/extensions/gsd/git-constants.ts +11 -0
  728. package/src/resources/extensions/gsd/git-service.ts +13 -9
  729. package/src/resources/extensions/gsd/gsd-db.ts +26 -6
  730. package/src/resources/extensions/gsd/guided-flow-queue.ts +451 -0
  731. package/src/resources/extensions/gsd/guided-flow.ts +231 -514
  732. package/src/resources/extensions/gsd/history.ts +2 -20
  733. package/src/resources/extensions/gsd/index.ts +208 -46
  734. package/src/resources/extensions/gsd/init-wizard.ts +615 -0
  735. package/src/resources/extensions/gsd/json-persistence.ts +52 -0
  736. package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
  737. package/src/resources/extensions/gsd/key-manager.ts +995 -0
  738. package/src/resources/extensions/gsd/metrics.ts +49 -36
  739. package/src/resources/extensions/gsd/migrate/command.ts +1 -1
  740. package/src/resources/extensions/gsd/migrate/parsers.ts +10 -95
  741. package/src/resources/extensions/gsd/milestone-actions.ts +126 -0
  742. package/src/resources/extensions/gsd/milestone-ids.ts +95 -0
  743. package/src/resources/extensions/gsd/native-git-bridge.ts +5 -10
  744. package/src/resources/extensions/gsd/parallel-eligibility.ts +3 -3
  745. package/src/resources/extensions/gsd/paths.ts +1 -11
  746. package/src/resources/extensions/gsd/plugin-importer.ts +3 -2
  747. package/src/resources/extensions/gsd/preferences-models.ts +323 -0
  748. package/src/resources/extensions/gsd/preferences-skills.ts +169 -0
  749. package/src/resources/extensions/gsd/preferences-types.ts +223 -0
  750. package/src/resources/extensions/gsd/preferences-validation.ts +597 -0
  751. package/src/resources/extensions/gsd/preferences.ts +219 -1305
  752. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
  753. package/src/resources/extensions/gsd/prompt-compressor.ts +508 -0
  754. package/src/resources/extensions/gsd/prompt-loader.ts +4 -2
  755. package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
  756. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
  757. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  758. package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
  759. package/src/resources/extensions/gsd/prompts/discuss.md +13 -5
  760. package/src/resources/extensions/gsd/prompts/execute-task.md +0 -1
  761. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  762. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
  763. package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
  764. package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -1
  765. package/src/resources/extensions/gsd/prompts/queue.md +30 -0
  766. package/src/resources/extensions/gsd/prompts/quick-task.md +0 -6
  767. package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -1
  768. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
  769. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  770. package/src/resources/extensions/gsd/provider-error-pause.ts +59 -10
  771. package/src/resources/extensions/gsd/queue-order.ts +1 -1
  772. package/src/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
  773. package/src/resources/extensions/gsd/quick.ts +18 -15
  774. package/src/resources/extensions/gsd/reports.ts +1 -7
  775. package/src/resources/extensions/gsd/routing-history.ts +13 -17
  776. package/src/resources/extensions/gsd/safe-fs.ts +47 -0
  777. package/src/resources/extensions/gsd/semantic-chunker.ts +336 -0
  778. package/src/resources/extensions/gsd/session-forensics.ts +8 -23
  779. package/src/resources/extensions/gsd/session-lock.ts +284 -0
  780. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
  781. package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
  782. package/src/resources/extensions/gsd/state.ts +54 -2
  783. package/src/resources/extensions/gsd/structured-data-formatter.ts +144 -0
  784. package/src/resources/extensions/gsd/summary-distiller.ts +258 -0
  785. package/src/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
  786. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
  787. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
  788. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  789. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
  790. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
  791. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
  792. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
  793. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
  794. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
  795. package/src/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
  796. package/src/resources/extensions/gsd/tests/detection.test.ts +398 -0
  797. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
  798. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
  799. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
  800. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
  801. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
  802. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
  803. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
  804. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +122 -0
  805. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
  806. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
  807. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
  808. package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
  809. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
  810. package/src/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
  811. package/src/resources/extensions/gsd/tests/metrics.test.ts +173 -305
  812. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
  813. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
  814. package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
  815. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
  816. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
  817. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
  818. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
  819. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
  820. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
  821. package/src/resources/extensions/gsd/tests/preferences.test.ts +284 -0
  822. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
  823. package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
  824. package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
  825. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
  826. package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
  827. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
  828. package/src/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
  829. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
  830. package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
  831. package/src/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
  832. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
  833. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
  834. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
  835. package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
  836. package/src/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
  837. package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
  838. package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
  839. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  840. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
  841. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
  842. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
  843. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
  844. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
  845. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
  846. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
  847. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
  848. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
  849. package/src/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
  850. package/src/resources/extensions/gsd/token-counter.ts +20 -0
  851. package/src/resources/extensions/gsd/triage-ui.ts +1 -1
  852. package/src/resources/extensions/gsd/types.ts +5 -1
  853. package/src/resources/extensions/gsd/unit-runtime.ts +16 -13
  854. package/src/resources/extensions/gsd/validate-directory.ts +164 -0
  855. package/src/resources/extensions/gsd/verification-evidence.ts +9 -4
  856. package/src/resources/extensions/gsd/verification-gate.ts +83 -7
  857. package/src/resources/extensions/gsd/visualizer-data.ts +1 -1
  858. package/src/resources/extensions/gsd/visualizer-overlay.ts +5 -2
  859. package/src/resources/extensions/gsd/visualizer-views.ts +2 -3
  860. package/src/resources/extensions/gsd/worktree-command.ts +4 -51
  861. package/src/resources/extensions/gsd/worktree-manager.ts +7 -9
  862. package/src/resources/extensions/gsd/worktree.ts +41 -1
  863. package/src/resources/extensions/mcporter/index.ts +27 -14
  864. package/src/resources/extensions/remote-questions/discord-adapter.ts +9 -20
  865. package/src/resources/extensions/remote-questions/http-client.ts +76 -0
  866. package/src/resources/extensions/remote-questions/manager.ts +6 -24
  867. package/src/resources/extensions/remote-questions/mod.ts +16 -0
  868. package/src/resources/extensions/remote-questions/notify.ts +90 -0
  869. package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
  870. package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -18
  871. package/src/resources/extensions/remote-questions/store.ts +5 -1
  872. package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
  873. package/src/resources/extensions/remote-questions/types.ts +29 -3
  874. package/src/resources/extensions/search-the-web/native-search.ts +7 -0
  875. package/src/resources/extensions/search-the-web/provider.ts +15 -3
  876. package/src/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
  877. package/src/resources/extensions/search-the-web/tool-search.ts +1 -13
  878. package/src/resources/extensions/shared/format-utils.ts +53 -0
  879. package/src/resources/extensions/shared/frontmatter.ts +117 -0
  880. package/src/resources/extensions/shared/mod.ts +33 -0
  881. package/src/resources/extensions/shared/sanitize.ts +19 -0
  882. package/src/resources/extensions/slash-commands/create-extension.ts +1 -1
  883. package/src/resources/extensions/slash-commands/create-slash-command.ts +1 -1
  884. package/src/resources/extensions/subagent/index.ts +1 -2
  885. package/src/resources/extensions/ttsr/index.ts +5 -0
  886. package/src/resources/extensions/ttsr/rule-loader.ts +4 -51
  887. package/src/resources/extensions/universal-config/discovery.ts +37 -15
  888. package/src/resources/extensions/voice/index.ts +1 -1
  889. package/src/resources/skills/accessibility/SKILL.md +522 -0
  890. package/src/resources/skills/accessibility/references/WCAG.md +162 -0
  891. package/src/resources/skills/agent-browser/SKILL.md +517 -0
  892. package/src/resources/skills/agent-browser/references/authentication.md +202 -0
  893. package/src/resources/skills/agent-browser/references/commands.md +263 -0
  894. package/src/resources/skills/agent-browser/references/profiling.md +120 -0
  895. package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
  896. package/src/resources/skills/agent-browser/references/session-management.md +193 -0
  897. package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
  898. package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
  899. package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
  900. package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
  901. package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
  902. package/src/resources/skills/best-practices/SKILL.md +583 -0
  903. package/src/resources/skills/code-optimizer/SKILL.md +160 -0
  904. package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
  905. package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
  906. package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
  907. package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
  908. package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
  909. package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
  910. package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
  911. package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
  912. package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
  913. package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
  914. package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
  915. package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
  916. package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
  917. package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
  918. package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
  919. package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
  920. package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
  921. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
  922. package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
  923. package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
  924. package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
  925. package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
  926. package/src/resources/skills/react-best-practices/README.md +123 -0
  927. package/src/resources/skills/react-best-practices/SKILL.md +136 -0
  928. package/src/resources/skills/react-best-practices/metadata.json +15 -0
  929. package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
  930. package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
  931. package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  932. package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  933. package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  934. package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
  935. package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
  936. package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
  937. package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
  938. package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  939. package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  940. package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  941. package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  942. package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  943. package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
  944. package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  945. package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  946. package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  947. package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  948. package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
  949. package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  950. package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  951. package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  952. package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  953. package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
  954. package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  955. package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
  956. package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  957. package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  958. package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  959. package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  960. package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
  961. package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  962. package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  963. package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  964. package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  965. package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  966. package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  967. package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  968. package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  969. package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  970. package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  971. package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  972. package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  973. package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  974. package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  975. package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  976. package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
  977. package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  978. package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  979. package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  980. package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  981. package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  982. package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
  983. package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  984. package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
  985. package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
  986. package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  987. package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
  988. package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
  989. package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
  990. package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
  991. package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  992. package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  993. package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  994. package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  995. package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  996. package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  997. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  998. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  999. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  1000. package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  1001. package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  1002. package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  1003. package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  1004. package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  1005. package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  1006. package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  1007. package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  1008. package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  1009. package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  1010. package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  1011. package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  1012. package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  1013. package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  1014. package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  1015. package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  1016. package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  1017. package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  1018. package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  1019. package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  1020. package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  1021. package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  1022. package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  1023. package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  1024. package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  1025. package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  1026. package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  1027. package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  1028. package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  1029. package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  1030. package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  1031. package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  1032. package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  1033. package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  1034. package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  1035. package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  1036. package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  1037. package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  1038. package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  1039. package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  1040. package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  1041. package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  1042. package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  1043. package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  1044. package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  1045. package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  1046. package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  1047. package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  1048. package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  1049. package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  1050. package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  1051. package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  1052. package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  1053. package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  1054. package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  1055. package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  1056. package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  1057. package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  1058. package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  1059. package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  1060. package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  1061. package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  1062. package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  1063. package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  1064. package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  1065. package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  1066. package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  1067. package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  1068. package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  1069. package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  1070. package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  1071. package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  1072. package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  1073. package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  1074. package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  1075. package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  1076. package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  1077. package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  1078. package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  1079. package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  1080. package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  1081. package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  1082. package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  1083. package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  1084. package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  1085. package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  1086. package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  1087. package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  1088. package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  1089. package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  1090. package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  1091. package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  1092. package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  1093. package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  1094. package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  1095. package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  1096. package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  1097. package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  1098. package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  1099. package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  1100. package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  1101. package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  1102. package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  1103. package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  1104. package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  1105. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  1106. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  1107. package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  1108. package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  1109. package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  1110. package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  1111. package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  1112. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  1113. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  1114. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  1115. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  1116. package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  1117. package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  1118. package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  1119. package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  1120. package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  1121. package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  1122. package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  1123. package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  1124. package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  1125. package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  1126. package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  1127. package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  1128. package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  1129. package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  1130. package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  1131. package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  1132. package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  1133. package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  1134. package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  1135. package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  1136. package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  1137. package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  1138. package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  1139. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  1140. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  1141. package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  1142. package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  1143. package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
  1144. package/src/resources/skills/web-quality-audit/SKILL.md +170 -0
  1145. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
  1146. package/dist/resources/extensions/gsd/complexity.ts +0 -237
  1147. package/dist/resources/extensions/gsd/github-client.ts +0 -235
  1148. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
  1149. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
  1150. package/dist/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
  1151. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
  1152. package/dist/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
  1153. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
  1154. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
  1155. package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
  1156. package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
  1157. package/dist/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
  1158. package/dist/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
  1159. package/dist/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
  1160. package/dist/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
  1161. package/dist/resources/extensions/shared/progress-widget.ts +0 -282
  1162. package/dist/resources/extensions/shared/thinking-widget.ts +0 -107
  1163. package/src/resources/extensions/gsd/complexity.ts +0 -237
  1164. package/src/resources/extensions/gsd/github-client.ts +0 -235
  1165. package/src/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
  1166. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
  1167. package/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
  1168. package/src/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
  1169. package/src/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
  1170. package/src/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
  1171. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
  1172. package/src/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
  1173. package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
  1174. package/src/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
  1175. package/src/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
  1176. package/src/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
  1177. package/src/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
  1178. package/src/resources/extensions/shared/progress-widget.ts +0 -282
  1179. package/src/resources/extensions/shared/thinking-widget.ts +0 -107
@@ -7,10 +7,11 @@
7
7
  */
8
8
 
9
9
  import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@gsd/pi-coding-agent";
10
- import { showNextAction } from "../shared/next-action-ui.js";
10
+ import { showNextAction } from "../shared/mod.js";
11
11
  import { loadFile, parseRoadmap } from "./files.js";
12
12
  import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
13
- import { deriveState, invalidateStateCache } from "./state.js";
13
+ import { deriveState } from "./state.js";
14
+ import { invalidateAllCaches } from "./cache.js";
14
15
  import { startAuto } from "./auto.js";
15
16
  import { readCrashLock, clearLock, formatCrashInfo } from "./crash-recovery.js";
16
17
  import { listUnitRuntimeRecords, clearUnitRuntimeRecord } from "./unit-runtime.js";
@@ -18,16 +19,31 @@ import { resolveExpectedArtifactPath } from "./auto.js";
18
19
  import {
19
20
  gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath,
20
21
  resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
21
- relMilestoneFile, relSliceFile, relSlicePath,
22
+ relMilestoneFile, relSliceFile,
22
23
  } from "./paths.js";
23
- import { randomInt } from "node:crypto";
24
24
  import { join } from "node:path";
25
- import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, rmSync, unlinkSync } from "node:fs";
26
- import { nativeIsRepo, nativeInit, nativeAddPaths, nativeCommit } from "./native-git-bridge.js";
25
+ import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync, unlinkSync } from "node:fs";
26
+ import { nativeIsRepo, nativeInit } from "./native-git-bridge.js";
27
27
  import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
28
28
  import { loadEffectiveGSDPreferences } from "./preferences.js";
29
- import { showConfirm } from "../shared/confirm-ui.js";
30
- import { loadQueueOrder, sortByQueueOrder, saveQueueOrder } from "./queue-order.js";
29
+ import { detectProjectState } from "./detection.js";
30
+ import { showProjectInit, offerMigration } from "./init-wizard.js";
31
+ import { validateDirectory } from "./validate-directory.js";
32
+ import { showConfirm } from "../shared/mod.js";
33
+ import { debugLog } from "./debug-logger.js";
34
+ import { findMilestoneIds, nextMilestoneId } from "./milestone-ids.js";
35
+ import { parkMilestone, discardMilestone } from "./milestone-actions.js";
36
+
37
+ // ─── Re-exports (preserve public API for existing importers) ────────────────
38
+ export {
39
+ MILESTONE_ID_RE, generateMilestoneSuffix, nextMilestoneId,
40
+ extractMilestoneSeq, parseMilestoneId, milestoneIdSort,
41
+ maxMilestoneNum, findMilestoneIds,
42
+ } from "./milestone-ids.js";
43
+ export {
44
+ showQueue, handleQueueReorder, showQueueAdd,
45
+ buildExistingMilestonesContext,
46
+ } from "./guided-flow-queue.js";
31
47
 
32
48
  // ─── Commit Instruction Helpers ──────────────────────────────────────────────
33
49
 
@@ -36,7 +52,7 @@ function buildDocsCommitInstruction(message: string): string {
36
52
  const prefs = loadEffectiveGSDPreferences();
37
53
  const commitDocsEnabled = prefs?.preferences?.git?.commit_docs !== false;
38
54
  return commitDocsEnabled
39
- ? `Commit: \`${message}\``
55
+ ? `Commit: \`${message}\`. Stage only the .gsd/milestones/, .gsd/PROJECT.md, .gsd/REQUIREMENTS.md, .gsd/DECISIONS.md, and .gitignore files you changed — do not stage .gsd/STATE.md or other runtime files.`
40
56
  : "Do not commit — planning docs are not tracked in git for this project.";
41
57
  }
42
58
 
@@ -146,8 +162,9 @@ export function checkAutoStartAfterDiscuss(): boolean {
146
162
 
147
163
  pendingAutoStart = null;
148
164
  startAuto(ctx, pi, basePath, false, { step }).catch((err) => {
149
- ctx.ui.notify(`Auto-start failed: ${err instanceof Error ? err.message : String(err)}`, "warning");
165
+ ctx.ui.notify(`Auto-start failed: ${err instanceof Error ? err.message : String(err)}`, "error");
150
166
  if (process.env.GSD_DEBUG) console.error('[gsd] auto start error:', err);
167
+ debugLog("auto-start-failed", { error: err instanceof Error ? err.message : String(err) });
151
168
  });
152
169
  return true;
153
170
  }
@@ -291,484 +308,6 @@ export async function showHeadlessMilestoneCreation(
291
308
  dispatchWorkflow(pi, prompt);
292
309
  }
293
310
 
294
- export function findMilestoneIds(basePath: string): string[] {
295
- const dir = milestonesDir(basePath);
296
- try {
297
- const ids = readdirSync(dir, { withFileTypes: true })
298
- .filter((d) => d.isDirectory())
299
- .map((d) => {
300
- const match = d.name.match(/^(M\d+(?:-[a-z0-9]{6})?)/);
301
- return match ? match[1] : d.name;
302
- });
303
-
304
- // Apply custom queue order if available, else fall back to numeric sort
305
- const customOrder = loadQueueOrder(basePath);
306
- return sortByQueueOrder(ids, customOrder);
307
- } catch (err) {
308
- // Log why milestone scanning failed — silent [] here causes infinite loops (#456)
309
- if (existsSync(dir)) {
310
- console.error(`[gsd] findMilestoneIds: .gsd/milestones/ exists but readdirSync failed — ${err instanceof Error ? err.message : String(err)}`);
311
- }
312
- return [];
313
- }
314
- }
315
-
316
- // ─── Milestone ID primitives ────────────────────────────────────────────────
317
-
318
- /** Matches both classic `M001` and unique `M001-abc123` formats (anchored). */
319
- export const MILESTONE_ID_RE = /^M\d{3}(?:-[a-z0-9]{6})?$/;
320
-
321
- /** Extract the trailing sequential number from a milestone ID. Returns 0 for non-matches. */
322
- export function extractMilestoneSeq(id: string): number {
323
- const m = id.match(/^M(\d{3})(?:-[a-z0-9]{6})?$/);
324
- return m ? parseInt(m[1], 10) : 0;
325
- }
326
-
327
- /** Structured parse of a milestone ID into optional suffix and sequence number. */
328
- export function parseMilestoneId(id: string): { suffix?: string; num: number } {
329
- const m = id.match(/^M(\d{3})(?:-([a-z0-9]{6}))?$/);
330
- if (!m) return { num: 0 };
331
- return {
332
- ...(m[2] ? { suffix: m[2] } : {}),
333
- num: parseInt(m[1], 10),
334
- };
335
- }
336
-
337
- /** Comparator for sorting milestone IDs by sequential number. */
338
- export function milestoneIdSort(a: string, b: string): number {
339
- return extractMilestoneSeq(a) - extractMilestoneSeq(b);
340
- }
341
-
342
- /** Generate a 6-char lowercase `[a-z0-9]` suffix using crypto.randomInt(). */
343
- export function generateMilestoneSuffix(): string {
344
- const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
345
- let result = "";
346
- for (let i = 0; i < 6; i++) {
347
- result += chars[randomInt(36)];
348
- }
349
- return result;
350
- }
351
-
352
- /** Return the highest numeric suffix among milestone IDs (0 when the list is empty or has no numeric IDs). */
353
- export function maxMilestoneNum(milestoneIds: string[]): number {
354
- return milestoneIds.reduce((max, id) => {
355
- const num = extractMilestoneSeq(id);
356
- return num > max ? num : max;
357
- }, 0);
358
- }
359
-
360
- /** Derive the next milestone ID from existing IDs using max-based approach to avoid collisions after deletions. */
361
- export function nextMilestoneId(milestoneIds: string[], uniqueEnabled?: boolean): string {
362
- const seq = String(maxMilestoneNum(milestoneIds) + 1).padStart(3, "0");
363
- if (uniqueEnabled) {
364
- return `M${seq}-${generateMilestoneSuffix()}`;
365
- }
366
- return `M${seq}`;
367
- }
368
-
369
- // ─── Queue ─────────────────────────────────────────────────────────────────────
370
-
371
- /**
372
- * Queue future milestones via conversational intake.
373
- *
374
- * Safe to run while auto-mode is executing — only writes to future milestone
375
- * directories (which auto-mode won't touch until it reaches them) and appends
376
- * to project.md / queue.md.
377
- *
378
- * The flow:
379
- * 1. Build context about all existing milestones (complete, active, pending)
380
- * 2. Dispatch the queue prompt — LLM discusses with the user, assesses scope
381
- * 3. LLM writes CONTEXT.md files for new milestones (no roadmaps — JIT)
382
- * 4. Auto-mode picks them up naturally when it advances past current work
383
- *
384
- * Root durable artifacts use uppercase names like PROJECT.md and QUEUE.md.
385
- */
386
- export async function showQueue(
387
- ctx: ExtensionCommandContext,
388
- pi: ExtensionAPI,
389
- basePath: string,
390
- ): Promise<void> {
391
- // ── Ensure .gsd/ exists ─────────────────────────────────────────────
392
- const gsd = gsdRoot(basePath);
393
- if (!existsSync(gsd)) {
394
- ctx.ui.notify("No GSD project found. Run /gsd to start one first.", "warning");
395
- return;
396
- }
397
-
398
- const state = await deriveState(basePath);
399
- const milestoneIds = findMilestoneIds(basePath);
400
-
401
- if (milestoneIds.length === 0) {
402
- ctx.ui.notify("No milestones exist yet. Run /gsd to create the first one.", "warning");
403
- return;
404
- }
405
-
406
- // ── Count pending milestones ────────────────────────────────────────
407
- const pendingMilestones = state.registry.filter(
408
- m => m.status === "pending" || m.status === "active",
409
- );
410
- const completeCount = state.registry.filter(m => m.status === "complete").length;
411
-
412
- // ── If multiple pending milestones, show queue management hub ──────
413
- if (pendingMilestones.length > 1) {
414
- const choice = await showNextAction(ctx, {
415
- title: "GSD — Queue Management",
416
- summary: [
417
- `${completeCount} complete, ${pendingMilestones.length} pending.`,
418
- ],
419
- actions: [
420
- {
421
- id: "reorder",
422
- label: "Reorder queue",
423
- description: `Change execution order of ${pendingMilestones.length} pending milestones.`,
424
- recommended: true,
425
- },
426
- {
427
- id: "add",
428
- label: "Add new work",
429
- description: "Queue new milestones via discussion.",
430
- },
431
- ],
432
- notYetMessage: "Run /gsd queue when ready.",
433
- });
434
-
435
- if (choice === "reorder") {
436
- await handleQueueReorder(ctx, basePath, state);
437
- return;
438
- }
439
- if (choice === "not_yet") return;
440
- // "add" falls through to existing queue-add logic below
441
- }
442
-
443
- // ── Existing queue-add flow ─────────────────────────────────────────
444
- await showQueueAdd(ctx, pi, basePath, state);
445
- }
446
-
447
- async function handleQueueReorder(
448
- ctx: ExtensionCommandContext,
449
- basePath: string,
450
- state: Awaited<ReturnType<typeof deriveState>>,
451
- ): Promise<void> {
452
- const { showQueueReorder: showReorderUI } = await import("./queue-reorder-ui.js");
453
- const { invalidateStateCache } = await import("./state.js");
454
-
455
- const completed = state.registry
456
- .filter(m => m.status === "complete")
457
- .map(m => ({ id: m.id, title: m.title, dependsOn: m.dependsOn }));
458
-
459
- const pending = state.registry
460
- .filter(m => m.status !== "complete")
461
- .map(m => ({ id: m.id, title: m.title, dependsOn: m.dependsOn }));
462
-
463
- const result = await showReorderUI(ctx, completed, pending);
464
- if (!result) {
465
- ctx.ui.notify("Queue reorder cancelled.", "info");
466
- return;
467
- }
468
-
469
- // Save the new order
470
- saveQueueOrder(basePath, result.order);
471
- invalidateStateCache();
472
-
473
- // Remove conflicting depends_on entries from CONTEXT.md files
474
- if (result.depsToRemove.length > 0) {
475
- removeDependsOnFromContextFiles(basePath, result.depsToRemove);
476
- }
477
-
478
- // Sync PROJECT.md milestone sequence table
479
- syncProjectMdSequence(basePath, state.registry, result.order);
480
-
481
- // Commit the change
482
- const filesToAdd = [".gsd/QUEUE-ORDER.json", ".gsd/PROJECT.md"];
483
- for (const r of result.depsToRemove) {
484
- filesToAdd.push(`.gsd/milestones/${r.milestone}/${r.milestone}-CONTEXT.md`);
485
- }
486
- try {
487
- nativeAddPaths(basePath, filesToAdd);
488
- nativeCommit(basePath, "docs: reorder queue");
489
- } catch {
490
- // Commit may fail if nothing changed or git hooks block — non-fatal
491
- }
492
-
493
- const depInfo = result.depsToRemove.length > 0
494
- ? ` (removed ${result.depsToRemove.length} depends_on)`
495
- : "";
496
- ctx.ui.notify(`Queue reordered: ${result.order.join(" → ")}${depInfo}`, "info");
497
- }
498
-
499
- /**
500
- * Remove specific depends_on entries from milestone CONTEXT.md frontmatter.
501
- */
502
- function removeDependsOnFromContextFiles(
503
- basePath: string,
504
- depsToRemove: Array<{ milestone: string; dep: string }>,
505
- ): void {
506
- // Group removals by milestone
507
- const byMilestone = new Map<string, string[]>();
508
- for (const { milestone, dep } of depsToRemove) {
509
- const existing = byMilestone.get(milestone) ?? [];
510
- existing.push(dep);
511
- byMilestone.set(milestone, existing);
512
- }
513
-
514
- for (const [mid, depsToRemoveForMid] of byMilestone) {
515
- const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
516
- if (!contextFile || !existsSync(contextFile)) continue;
517
-
518
- const content = readFileSync(contextFile, "utf-8");
519
-
520
- // Parse frontmatter
521
- const trimmed = content.trimStart();
522
- if (!trimmed.startsWith("---")) continue;
523
- const afterFirst = trimmed.indexOf("\n");
524
- if (afterFirst === -1) continue;
525
- const rest = trimmed.slice(afterFirst + 1);
526
- const endIdx = rest.indexOf("\n---");
527
- if (endIdx === -1) continue;
528
-
529
- const fmText = rest.slice(0, endIdx);
530
- const body = rest.slice(endIdx + 4);
531
-
532
- // Parse depends_on line(s)
533
- const fmLines = fmText.split("\n");
534
- const removeSet = new Set(depsToRemoveForMid.map(d => d.toUpperCase()));
535
-
536
- // Handle inline format: depends_on: [M009, M010]
537
- const inlineMatch = fmLines.findIndex(l => /^depends_on:\s*\[/.test(l));
538
- if (inlineMatch >= 0) {
539
- const line = fmLines[inlineMatch];
540
- const inner = line.match(/\[([^\]]*)\]/);
541
- if (inner) {
542
- const remaining = inner[1]
543
- .split(",")
544
- .map(s => s.trim())
545
- .filter(s => s && !removeSet.has(s.toUpperCase()));
546
- if (remaining.length === 0) {
547
- fmLines.splice(inlineMatch, 1);
548
- } else {
549
- fmLines[inlineMatch] = `depends_on: [${remaining.join(", ")}]`;
550
- }
551
- }
552
- } else {
553
- // Handle multi-line format
554
- const keyIdx = fmLines.findIndex(l => /^depends_on:\s*$/.test(l));
555
- if (keyIdx >= 0) {
556
- let end = keyIdx + 1;
557
- while (end < fmLines.length && /^\s+-\s/.test(fmLines[end])) {
558
- const val = fmLines[end].replace(/^\s+-\s*/, "").trim().toUpperCase();
559
- if (removeSet.has(val)) {
560
- fmLines.splice(end, 1);
561
- } else {
562
- end++;
563
- }
564
- }
565
- if (end === keyIdx + 1 || (end <= fmLines.length && !/^\s+-\s/.test(fmLines[keyIdx + 1] ?? ""))) {
566
- fmLines.splice(keyIdx, 1);
567
- }
568
- }
569
- }
570
-
571
- // Rebuild file
572
- const newFm = fmLines.filter(l => l !== undefined).join("\n");
573
- const newContent = newFm.trim()
574
- ? `---\n${newFm}\n---${body}`
575
- : body.replace(/^\n+/, "");
576
- writeFileSync(contextFile, newContent, "utf-8");
577
- }
578
- }
579
-
580
- function syncProjectMdSequence(
581
- basePath: string,
582
- registry: Array<{ id: string; title: string; status: string }>,
583
- newOrder: string[],
584
- ): void {
585
- const projectPath = resolveGsdRootFile(basePath, "PROJECT");
586
- if (!projectPath || !existsSync(projectPath)) return;
587
-
588
- const content = readFileSync(projectPath, "utf-8");
589
- const lines = content.split("\n");
590
-
591
- const headerIdx = lines.findIndex(l => /^##\s+Milestone Sequence/.test(l));
592
- if (headerIdx < 0) return;
593
-
594
- let tableStart = headerIdx + 1;
595
- while (tableStart < lines.length && !lines[tableStart].startsWith("|")) tableStart++;
596
- if (tableStart >= lines.length) return;
597
-
598
- let tableEnd = tableStart + 1;
599
- while (tableEnd < lines.length && lines[tableEnd].startsWith("|")) tableEnd++;
600
-
601
- const registryMap = new Map(registry.map(m => [m.id, m]));
602
- const completedSet = new Set(registry.filter(m => m.status === "complete").map(m => m.id));
603
-
604
- const newRows: string[] = [];
605
- for (const m of registry) {
606
- if (m.status === "complete") {
607
- newRows.push(`| ${m.id} | ${m.title} | ✅ Complete |`);
608
- }
609
- }
610
- let isFirst = true;
611
- for (const id of newOrder) {
612
- if (completedSet.has(id)) continue;
613
- const m = registryMap.get(id);
614
- if (!m) continue;
615
- const status = isFirst ? "📋 Next" : "📋 Queued";
616
- newRows.push(`| ${m.id} | ${m.title} | ${status} |`);
617
- isFirst = false;
618
- }
619
-
620
- const headerLine = lines[tableStart];
621
- const separatorLine = lines[tableStart + 1];
622
- const newTable = [headerLine, separatorLine, ...newRows];
623
- lines.splice(tableStart, tableEnd - tableStart, ...newTable);
624
- writeFileSync(projectPath, lines.join("\n"), "utf-8");
625
- }
626
-
627
- async function showQueueAdd(
628
- ctx: ExtensionCommandContext,
629
- pi: ExtensionAPI,
630
- basePath: string,
631
- state: Awaited<ReturnType<typeof deriveState>>,
632
- ): Promise<void> {
633
- const milestoneIds = findMilestoneIds(basePath);
634
-
635
- // ── Build existing milestones context for the prompt ────────────────
636
- const existingContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
637
-
638
- // ── Determine next milestone ID ─────────────────────────────────────
639
- // Note: the LLM will use the gsd_generate_milestone_id tool to get IDs
640
- // at creation time, but we still mention the next ID in the preamble
641
- // for context about where the sequence is.
642
- const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
643
- const nextId = nextMilestoneId(milestoneIds, uniqueEnabled);
644
-
645
- // ── Build preamble ──────────────────────────────────────────────────
646
- const activePart = state.activeMilestone
647
- ? `Currently executing: ${state.activeMilestone.id} — ${state.activeMilestone.title} (phase: ${state.phase}).`
648
- : "No milestone currently active.";
649
-
650
- const pendingCount = state.registry.filter(m => m.status === "pending").length;
651
- const completeCount = state.registry.filter(m => m.status === "complete").length;
652
-
653
- const preamble = [
654
- `Queuing new work onto an existing GSD project.`,
655
- activePart,
656
- `${completeCount} milestone(s) complete, ${pendingCount} pending.`,
657
- `Next available milestone ID: ${nextId}.`,
658
- ].join(" ");
659
-
660
- // ── Dispatch the queue prompt ───────────────────────────────────────
661
- const queueInlinedTemplates = inlineTemplate("context", "Context");
662
- const prompt = loadPrompt("queue", {
663
- preamble,
664
- existingMilestonesContext: existingContext,
665
- inlinedTemplates: queueInlinedTemplates,
666
- commitInstruction: buildDocsCommitInstruction("docs: queue <milestone list>"),
667
- });
668
-
669
- pi.sendMessage(
670
- {
671
- customType: "gsd-queue",
672
- content: prompt,
673
- display: false,
674
- },
675
- { triggerTurn: true },
676
- );
677
- }
678
-
679
- /**
680
- * Build a context block describing all existing milestones for the queue prompt.
681
- * Gives the LLM enough information to dedup, sequence, and dependency-check.
682
- */
683
- export async function buildExistingMilestonesContext(
684
- basePath: string,
685
- milestoneIds: string[],
686
- state: import("./types.js").GSDState,
687
- ): Promise<string> {
688
- const sections: string[] = [];
689
-
690
- // Include PROJECT.md if it exists — it has the milestone sequence and project description
691
- const projectPath = resolveGsdRootFile(basePath, "PROJECT");
692
- if (existsSync(projectPath)) {
693
- const projectContent = await loadFile(projectPath);
694
- if (projectContent) {
695
- sections.push(`### Project Overview\nSource: \`${relGsdRootFile("PROJECT")}\`\n\n${projectContent.trim()}`);
696
- }
697
- }
698
-
699
- // Include DECISIONS.md if it exists — architectural decisions inform new milestone scoping
700
- const decisionsPath = resolveGsdRootFile(basePath, "DECISIONS");
701
- if (existsSync(decisionsPath)) {
702
- const decisionsContent = await loadFile(decisionsPath);
703
- if (decisionsContent) {
704
- sections.push(`### Decisions Register\nSource: \`${relGsdRootFile("DECISIONS")}\`\n\n${decisionsContent.trim()}`);
705
- }
706
- }
707
-
708
- // For each milestone, include context and status
709
- for (const mid of milestoneIds) {
710
- const registryEntry = state.registry.find(m => m.id === mid);
711
- const status = registryEntry?.status ?? "unknown";
712
- const title = registryEntry?.title ?? mid;
713
-
714
- const parts: string[] = [];
715
- parts.push(`### ${mid}: ${title}\n**Status:** ${status}`);
716
-
717
- // Include context file — this is the primary content for understanding scope
718
- const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT");
719
- if (contextFile) {
720
- const content = await loadFile(contextFile);
721
- if (content) {
722
- parts.push(`\n**Context:**\n${content.trim()}`);
723
- }
724
- } else {
725
- // No full CONTEXT.md — check for CONTEXT-DRAFT.md (draft seed from prior discussion)
726
- const draftFile = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
727
- if (draftFile) {
728
- const draftContent = await loadFile(draftFile);
729
- if (draftContent) {
730
- parts.push(`\n**Draft context available:**\n${draftContent.trim()}`);
731
- }
732
- }
733
- }
734
-
735
- // For completed milestones, include the summary if it exists
736
- if (status === "complete") {
737
- const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
738
- if (summaryFile) {
739
- const content = await loadFile(summaryFile);
740
- if (content) {
741
- parts.push(`\n**Summary:**\n${content.trim()}`);
742
- }
743
- }
744
- }
745
-
746
- // For active/pending milestones, include the roadmap if it exists
747
- // (shows what's planned but not yet built)
748
- if (status === "active" || status === "pending") {
749
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
750
- if (roadmapFile) {
751
- const content = await loadFile(roadmapFile);
752
- if (content) {
753
- parts.push(`\n**Roadmap:**\n${content.trim()}`);
754
- }
755
- }
756
- }
757
-
758
- sections.push(parts.join("\n"));
759
- }
760
-
761
- // Include queue log if it exists — shows what's been queued before
762
- const queuePath = resolveGsdRootFile(basePath, "QUEUE");
763
- if (existsSync(queuePath)) {
764
- const queueContent = await loadFile(queuePath);
765
- if (queueContent) {
766
- sections.push(`### Previous Queue Entries\nSource: \`${relGsdRootFile("QUEUE")}\`\n\n${queueContent.trim()}`);
767
- }
768
- }
769
-
770
- return sections.join("\n\n---\n\n");
771
- }
772
311
 
773
312
  // ─── Discuss Flow ─────────────────────────────────────────────────────────────
774
313
 
@@ -783,6 +322,7 @@ async function buildDiscussSlicePrompt(
783
322
  sid: string,
784
323
  sTitle: string,
785
324
  base: string,
325
+ options?: { rediscuss?: boolean },
786
326
  ): Promise<string> {
787
327
  const inlined: string[] = [];
788
328
 
@@ -840,12 +380,17 @@ async function buildDiscussSlicePrompt(
840
380
  const sliceDirPath = `.gsd/milestones/${mid}/slices/${sid}`;
841
381
  const sliceContextPath = `${sliceDirPath}/${sid}-CONTEXT.md`;
842
382
 
383
+ // When re-discussing, inject a preamble so the agent treats this as an update interview
384
+ const rediscussPreamble = options?.rediscuss
385
+ ? `\n\n## Re-discuss Mode\n\nThis slice already has an existing context file (\`${sliceContextPath}\`) from a prior discussion. The user has chosen to re-discuss it. Read the existing context file, interview for any updates, changes, or new decisions, and rewrite the file with merged findings. Do NOT skip the interview — the user explicitly asked to revisit this slice.\n`
386
+ : "";
387
+
843
388
  const inlinedTemplates = inlineTemplate("slice-context", "Slice Context");
844
389
  return loadPrompt("guided-discuss-slice", {
845
390
  milestoneId: mid,
846
391
  sliceId: sid,
847
392
  sliceTitle: sTitle,
848
- inlinedContext,
393
+ inlinedContext: inlinedContext + rediscussPreamble,
849
394
  sliceDirPath,
850
395
  contextPath: sliceContextPath,
851
396
  projectRoot: base,
@@ -1009,12 +554,29 @@ export async function showDiscuss(
1009
554
  const chosen = pendingSlices.find(s => s.id === choice);
1010
555
  if (!chosen) return;
1011
556
 
1012
- const prompt = await buildDiscussSlicePrompt(mid, chosen.id, chosen.title, basePath);
557
+ // If the slice already has a CONTEXT file, confirm re-discuss intent
558
+ const isRediscuss = discussedMap.get(chosen.id) ?? false;
559
+ if (isRediscuss) {
560
+ const confirm = await showNextAction(ctx, {
561
+ title: `Re-discuss ${chosen.id}?`,
562
+ summary: [
563
+ `${chosen.id} already has a context file from a prior discussion.`,
564
+ "Re-discussing will interview for updates and rewrite the context file.",
565
+ ],
566
+ actions: [
567
+ { id: "rediscuss", label: "Re-discuss to update context", description: "Interview for changes and rewrite", recommended: true },
568
+ { id: "cancel", label: "Cancel", description: "Go back to slice picker" },
569
+ ],
570
+ });
571
+ if (confirm !== "rediscuss") continue;
572
+ }
573
+
574
+ const prompt = await buildDiscussSlicePrompt(mid, chosen.id, chosen.title, basePath, { rediscuss: isRediscuss });
1013
575
  dispatchWorkflow(pi, prompt, "gsd-discuss");
1014
576
 
1015
577
  // Wait for the discuss session to finish, then loop back to the picker
1016
578
  await ctx.waitForIdle();
1017
- invalidateStateCache();
579
+ invalidateAllCaches();
1018
580
  }
1019
581
  }
1020
582
 
@@ -1059,6 +621,110 @@ function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { clea
1059
621
  }
1060
622
  }
1061
623
 
624
+ // ─── Milestone Actions Submenu ──────────────────────────────────────────────
625
+
626
+ /**
627
+ * Shows a submenu with Park / Discard / Skip / Back options for the active milestone.
628
+ * Returns true if an action was taken (caller should re-enter showSmartEntry or
629
+ * dispatch a new workflow). Returns false if the user chose "Back".
630
+ */
631
+ async function handleMilestoneActions(
632
+ ctx: ExtensionCommandContext,
633
+ pi: ExtensionAPI,
634
+ basePath: string,
635
+ milestoneId: string,
636
+ milestoneTitle: string,
637
+ options?: { step?: boolean },
638
+ ): Promise<boolean> {
639
+ const stepMode = options?.step;
640
+ const choice = await showNextAction(ctx, {
641
+ title: `Milestone Actions — ${milestoneId}`,
642
+ summary: [`${milestoneId}: ${milestoneTitle}`],
643
+ actions: [
644
+ {
645
+ id: "park",
646
+ label: "Park milestone",
647
+ description: "Pause this milestone — it stays on disk but is skipped.",
648
+ },
649
+ {
650
+ id: "discard",
651
+ label: "Discard milestone",
652
+ description: "Permanently delete this milestone and all its contents.",
653
+ },
654
+ {
655
+ id: "skip",
656
+ label: "Skip — create new milestone",
657
+ description: "Leave this milestone and start a fresh one.",
658
+ },
659
+ {
660
+ id: "back",
661
+ label: "Back",
662
+ description: "Return to the previous menu.",
663
+ },
664
+ ],
665
+ notYetMessage: "Run /gsd when ready.",
666
+ });
667
+
668
+ if (choice === "park") {
669
+ const reason = await showNextAction(ctx, {
670
+ title: `Park ${milestoneId}`,
671
+ summary: ["Why is this milestone being parked?"],
672
+ actions: [
673
+ { id: "priority_shift", label: "Priority shift", description: "Other work is more important right now." },
674
+ { id: "blocked_external", label: "Blocked externally", description: "Waiting on an external dependency or decision." },
675
+ { id: "needs_rethink", label: "Needs rethinking", description: "The approach needs to be reconsidered." },
676
+ ],
677
+ notYetMessage: "Run /gsd when ready.",
678
+ });
679
+
680
+ // User pressed "Not yet" / Escape — cancel the park operation
681
+ if (!reason || reason === "not_yet") return false;
682
+
683
+ const reasonText = reason === "priority_shift" ? "Priority shift — other work is more important"
684
+ : reason === "blocked_external" ? "Blocked externally — waiting on external dependency"
685
+ : reason === "needs_rethink" ? "Needs rethinking — approach needs reconsideration"
686
+ : "Parked by user";
687
+
688
+ const success = parkMilestone(basePath, milestoneId, reasonText);
689
+ if (success) {
690
+ ctx.ui.notify(`Parked ${milestoneId}. Run /gsd unpark ${milestoneId} to reactivate.`, "info");
691
+ } else {
692
+ ctx.ui.notify(`Could not park ${milestoneId} — milestone not found or already parked.`, "warning");
693
+ }
694
+ return true;
695
+ }
696
+
697
+ if (choice === "discard") {
698
+ const confirmed = await showConfirm(ctx, {
699
+ title: "Discard milestone?",
700
+ message: `This will permanently delete ${milestoneId} and all its contents (roadmap, plans, task summaries).`,
701
+ confirmLabel: "Discard",
702
+ declineLabel: "Cancel",
703
+ });
704
+ if (confirmed) {
705
+ discardMilestone(basePath, milestoneId);
706
+ ctx.ui.notify(`Discarded ${milestoneId}.`, "info");
707
+ return true;
708
+ }
709
+ return false;
710
+ }
711
+
712
+ if (choice === "skip") {
713
+ const milestoneIds = findMilestoneIds(basePath);
714
+ const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
715
+ const nextId = nextMilestoneId(milestoneIds, uniqueMilestoneIds);
716
+ pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
717
+ dispatchWorkflow(pi, buildDiscussPrompt(nextId,
718
+ `New milestone ${nextId}.`,
719
+ basePath
720
+ ));
721
+ return true;
722
+ }
723
+
724
+ // "back" or null
725
+ return false;
726
+ }
727
+
1062
728
  export async function showSmartEntry(
1063
729
  ctx: ExtensionCommandContext,
1064
730
  pi: ExtensionAPI,
@@ -1067,6 +733,46 @@ export async function showSmartEntry(
1067
733
  ): Promise<void> {
1068
734
  const stepMode = options?.step;
1069
735
 
736
+ // ── Directory safety check — refuse to operate in system/home dirs ───
737
+ const dirCheck = validateDirectory(basePath);
738
+ if (dirCheck.severity === "blocked") {
739
+ ctx.ui.notify(dirCheck.reason!, "error");
740
+ return;
741
+ }
742
+ if (dirCheck.severity === "warning") {
743
+ const proceed = await showConfirm(ctx, {
744
+ title: "GSD — Unusual Directory",
745
+ message: dirCheck.reason!,
746
+ confirmLabel: "Continue anyway",
747
+ declineLabel: "Cancel",
748
+ });
749
+ if (!proceed) return;
750
+ }
751
+
752
+ // ── Detection preamble — run before any bootstrap ────────────────────
753
+ if (!existsSync(join(basePath, ".gsd"))) {
754
+ const detection = detectProjectState(basePath);
755
+
756
+ // v1 .planning/ detected — offer migration before anything else
757
+ if (detection.state === "v1-planning" && detection.v1) {
758
+ const migrationChoice = await offerMigration(ctx, detection.v1);
759
+ if (migrationChoice === "cancel") return;
760
+ if (migrationChoice === "migrate") {
761
+ const { handleMigrate } = await import("./migrate/command.js");
762
+ await handleMigrate("", ctx, pi);
763
+ return;
764
+ }
765
+ // "fresh" — fall through to init wizard
766
+ }
767
+
768
+ // No .gsd/ — run the project init wizard
769
+ const result = await showProjectInit(ctx, pi, basePath, detection);
770
+ if (!result.completed) return; // User cancelled
771
+
772
+ // Init wizard bootstrapped .gsd/ — fall through to the normal flow below
773
+ // which will detect "no milestones" and start the discuss prompt
774
+ }
775
+
1070
776
  // ── Ensure git repo exists — GSD needs it for worktree isolation ──────
1071
777
  if (!nativeIsRepo(basePath)) {
1072
778
  const mainBranch = loadEffectiveGSDPreferences()?.preferences?.git?.main_branch || "main";
@@ -1078,25 +784,6 @@ export async function showSmartEntry(
1078
784
  ensureGitignore(basePath, { commitDocs });
1079
785
  untrackRuntimeFiles(basePath);
1080
786
 
1081
- // ── No GSD project OR no milestone → Create first/next milestone ────
1082
- if (!existsSync(join(basePath, ".gsd"))) {
1083
- // Bootstrap .gsd/ silently — the user wants a milestone, not to "init"
1084
- const gsd = gsdRoot(basePath);
1085
- mkdirSync(join(gsd, "milestones"), { recursive: true });
1086
-
1087
- // ── Create PREFERENCES.md template ────────────────────────────────
1088
- ensurePreferences(basePath);
1089
- // Only commit .gsd/ init when commit_docs is not explicitly false
1090
- if (commitDocs !== false) {
1091
- try {
1092
- nativeAddPaths(basePath, [".gsd", ".gitignore"]);
1093
- nativeCommit(basePath, "chore: init gsd");
1094
- } catch {
1095
- // nothing to commit — that's fine
1096
- }
1097
- }
1098
- }
1099
-
1100
787
  // ── Self-heal stale runtime records from crashed auto-mode sessions ──
1101
788
  selfHealRuntimeRecords(basePath, ctx);
1102
789
 
@@ -1364,8 +1051,6 @@ export async function showSmartEntry(
1364
1051
  basePath
1365
1052
  ));
1366
1053
  } else if (choice === "discard_milestone") {
1367
- const mDir = resolveMilestonePath(basePath, milestoneId);
1368
- if (!mDir) return;
1369
1054
  const confirmed = await showConfirm(ctx, {
1370
1055
  title: "Discard milestone?",
1371
1056
  message: `This will permanently delete ${milestoneId} and all its contents.`,
@@ -1373,7 +1058,7 @@ export async function showSmartEntry(
1373
1058
  declineLabel: "Cancel",
1374
1059
  });
1375
1060
  if (confirmed) {
1376
- rmSync(mDir, { recursive: true, force: true });
1061
+ discardMilestone(basePath, milestoneId);
1377
1062
  return showSmartEntry(ctx, pi, basePath, options);
1378
1063
  }
1379
1064
  }
@@ -1391,6 +1076,11 @@ export async function showSmartEntry(
1391
1076
  label: "View status",
1392
1077
  description: "See milestone progress and blockers.",
1393
1078
  },
1079
+ {
1080
+ id: "milestone_actions",
1081
+ label: "Milestone actions",
1082
+ description: "Park, discard, or skip this milestone.",
1083
+ },
1394
1084
  ];
1395
1085
 
1396
1086
  const choice = await showNextAction(ctx, {
@@ -1405,6 +1095,9 @@ export async function showSmartEntry(
1405
1095
  } else if (choice === "status") {
1406
1096
  const { fireStatusViaCommand } = await import("./commands.js");
1407
1097
  await fireStatusViaCommand(ctx);
1098
+ } else if (choice === "milestone_actions") {
1099
+ const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
1100
+ if (acted) return showSmartEntry(ctx, pi, basePath, options);
1408
1101
  }
1409
1102
  }
1410
1103
  return;
@@ -1442,6 +1135,11 @@ export async function showSmartEntry(
1442
1135
  label: "View status",
1443
1136
  description: "See milestone progress.",
1444
1137
  },
1138
+ {
1139
+ id: "milestone_actions",
1140
+ label: "Milestone actions",
1141
+ description: "Park, discard, or skip this milestone.",
1142
+ },
1445
1143
  ];
1446
1144
 
1447
1145
  const summaryParts = [];
@@ -1467,7 +1165,7 @@ export async function showSmartEntry(
1467
1165
  milestoneId, sliceId, sliceTitle, inlinedTemplates: planSliceTemplates,
1468
1166
  }));
1469
1167
  } else if (choice === "discuss") {
1470
- dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath));
1168
+ dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext }));
1471
1169
  } else if (choice === "research") {
1472
1170
  const researchTemplates = inlineTemplate("research", "Research");
1473
1171
  dispatchWorkflow(pi, loadPrompt("guided-research-slice", {
@@ -1476,6 +1174,9 @@ export async function showSmartEntry(
1476
1174
  } else if (choice === "status") {
1477
1175
  const { fireStatusViaCommand } = await import("./commands.js");
1478
1176
  await fireStatusViaCommand(ctx);
1177
+ } else if (choice === "milestone_actions") {
1178
+ const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
1179
+ if (acted) return showSmartEntry(ctx, pi, basePath, options);
1479
1180
  }
1480
1181
  return;
1481
1182
  }
@@ -1497,6 +1198,11 @@ export async function showSmartEntry(
1497
1198
  label: "View status",
1498
1199
  description: "Review tasks before completing.",
1499
1200
  },
1201
+ {
1202
+ id: "milestone_actions",
1203
+ label: "Milestone actions",
1204
+ description: "Park, discard, or skip this milestone.",
1205
+ },
1500
1206
  ],
1501
1207
  notYetMessage: "Run /gsd when ready.",
1502
1208
  });
@@ -1512,6 +1218,9 @@ export async function showSmartEntry(
1512
1218
  } else if (choice === "status") {
1513
1219
  const { fireStatusViaCommand } = await import("./commands.js");
1514
1220
  await fireStatusViaCommand(ctx);
1221
+ } else if (choice === "milestone_actions") {
1222
+ const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
1223
+ if (acted) return showSmartEntry(ctx, pi, basePath, options);
1515
1224
  }
1516
1225
  return;
1517
1226
  }
@@ -1552,6 +1261,11 @@ export async function showSmartEntry(
1552
1261
  label: "View status",
1553
1262
  description: "See slice progress before starting.",
1554
1263
  },
1264
+ {
1265
+ id: "milestone_actions",
1266
+ label: "Milestone actions",
1267
+ description: "Park, discard, or skip this milestone.",
1268
+ },
1555
1269
  ],
1556
1270
  notYetMessage: "Run /gsd when ready.",
1557
1271
  });
@@ -1575,6 +1289,9 @@ export async function showSmartEntry(
1575
1289
  } else if (choice === "status") {
1576
1290
  const { fireStatusViaCommand } = await import("./commands.js");
1577
1291
  await fireStatusViaCommand(ctx);
1292
+ } else if (choice === "milestone_actions") {
1293
+ const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
1294
+ if (acted) return showSmartEntry(ctx, pi, basePath, options);
1578
1295
  }
1579
1296
  return;
1580
1297
  }